@scalar/agent-chat 0.9.8 → 0.9.10

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 (131) hide show
  1. package/dist/App.vue.d.ts +6 -6
  2. package/dist/api.d.ts +8 -8
  3. package/dist/client-tools/execute-request.d.ts +7 -7
  4. package/dist/components/ErrorMessage.vue.d.ts +1 -1
  5. package/dist/components/RequestPreview.vue.d.ts +1 -1
  6. package/dist/components/ResponseBody/ResponseBody.vue.d.ts +1 -1
  7. package/dist/components/ResponseBody/ResponseBodyPreview.vue.d.ts +1 -1
  8. package/dist/components/UploadSection.vue.d.ts +1 -1
  9. package/dist/entities/error/helpers.d.ts +1 -1
  10. package/dist/entities/index.d.ts +9 -9
  11. package/dist/entities/index.js +2 -23
  12. package/dist/entities/tools/execute-request.d.ts +1 -1
  13. package/dist/entities-NWeuOkBB.js +28 -0
  14. package/dist/entities-NWeuOkBB.js.map +1 -0
  15. package/dist/hooks/use-chat-approvals.d.ts +1 -1
  16. package/dist/hooks/use-search.d.ts +1 -1
  17. package/dist/index.d.ts +2 -2
  18. package/dist/index.js +2064 -3
  19. package/dist/index.js.map +1 -0
  20. package/dist/package.json +3 -5
  21. package/dist/registry/add-documents-to-store.d.ts +5 -5
  22. package/dist/state/state.d.ts +7 -7
  23. package/dist/style.css +2 -1
  24. package/dist/views/Chat/Messages/AskForAuthentication.vue.d.ts +2 -2
  25. package/dist/views/Chat/Messages/ExecuteRequestTool.vue.d.ts +2 -2
  26. package/dist/views/Chat/Messages/GetMiniOpenAPIDocTool.vue.d.ts +2 -2
  27. package/dist/views/Chat/Messages/GetOpenAPISpecsSummary.vue.d.ts +2 -2
  28. package/package.json +15 -17
  29. package/dist/App.vue.js +0 -43
  30. package/dist/App.vue2.js +0 -4
  31. package/dist/Chat.vue.js +0 -55
  32. package/dist/Chat.vue2.js +0 -4
  33. package/dist/_virtual/_plugin-vue_export-helper.js +0 -9
  34. package/dist/api.js +0 -99
  35. package/dist/client-tools/execute-request.js +0 -98
  36. package/dist/components/ActionsDropdown.vue.js +0 -7
  37. package/dist/components/ActionsDropdown.vue2.js +0 -50
  38. package/dist/components/ApprovalSection.vue.js +0 -7
  39. package/dist/components/ApprovalSection.vue2.js +0 -33
  40. package/dist/components/AuthenticationProvided.vue.js +0 -13
  41. package/dist/components/AuthenticationRequired.vue.js +0 -13
  42. package/dist/components/AutosendPaused.vue.js +0 -13
  43. package/dist/components/BuildingRequest.vue.js +0 -24
  44. package/dist/components/ContextItem.vue.js +0 -7
  45. package/dist/components/ContextItem.vue2.js +0 -19
  46. package/dist/components/ErrorMessage.vue.js +0 -7
  47. package/dist/components/ErrorMessage.vue2.js +0 -25
  48. package/dist/components/FreeMessagesInfoSection.vue.js +0 -7
  49. package/dist/components/FreeMessagesInfoSection.vue2.js +0 -51
  50. package/dist/components/LoadingMiniOpenAPIDoc.vue.js +0 -14
  51. package/dist/components/LoadingOpenAPISpecsSummary.vue.js +0 -14
  52. package/dist/components/Logo.vue.js +0 -23
  53. package/dist/components/PaymentSection.vue.js +0 -7
  54. package/dist/components/PaymentSection.vue2.js +0 -30
  55. package/dist/components/RequestApproved.vue.js +0 -13
  56. package/dist/components/RequestFailed.vue.js +0 -24
  57. package/dist/components/RequestPreview.vue.js +0 -7
  58. package/dist/components/RequestPreview.vue2.js +0 -129
  59. package/dist/components/RequestRejected.vue.js +0 -22
  60. package/dist/components/RequestSuccess.vue.js +0 -13
  61. package/dist/components/ResponseBody/ResponseBody.vue.js +0 -41
  62. package/dist/components/ResponseBody/ResponseBody.vue2.js +0 -4
  63. package/dist/components/ResponseBody/ResponseBodyInfo.vue.js +0 -14
  64. package/dist/components/ResponseBody/ResponseBodyPreview.vue.js +0 -7
  65. package/dist/components/ResponseBody/ResponseBodyPreview.vue2.js +0 -65
  66. package/dist/components/ResponseBody/ResponseBodyRaw.vue.js +0 -20
  67. package/dist/components/ResponseBody/ResponseBodyRaw.vue2.js +0 -4
  68. package/dist/components/ResponseBody/ResponseBodyToggle.vue.js +0 -26
  69. package/dist/components/ResponseBody/ResponseBodyToggle.vue2.js +0 -4
  70. package/dist/components/ResponseBody/helpers/media-types.js +0 -129
  71. package/dist/components/ResponseBody/helpers/process-response-body.js +0 -33
  72. package/dist/components/SearchPopover.vue.js +0 -7
  73. package/dist/components/SearchPopover.vue2.js +0 -67
  74. package/dist/components/Selector.vue.js +0 -67
  75. package/dist/components/Selector.vue2.js +0 -4
  76. package/dist/components/SendingRequest.vue.js +0 -24
  77. package/dist/components/ServerSelector.vue.js +0 -63
  78. package/dist/components/ServerSelector.vue2.js +0 -4
  79. package/dist/components/UploadSection.vue.js +0 -7
  80. package/dist/components/UploadSection.vue2.js +0 -61
  81. package/dist/consts/urls.js +0 -10
  82. package/dist/entities/error/constants.js +0 -6
  83. package/dist/entities/error/helpers.js +0 -9
  84. package/dist/entities/prompt/constants.js +0 -4
  85. package/dist/entities/registry/document.js +0 -12
  86. package/dist/entities/tools/ask-for-authentication.js +0 -8
  87. package/dist/entities/tools/constants.js +0 -4
  88. package/dist/entities/tools/execute-request.js +0 -12
  89. package/dist/entities/tools/get-mini-openapi-spec.js +0 -8
  90. package/dist/entities/tools/get-openapi-spec-summary.js +0 -4
  91. package/dist/helpers.js +0 -67
  92. package/dist/hooks/use-agent-key-documents.js +0 -21
  93. package/dist/hooks/use-chat-approvals.js +0 -35
  94. package/dist/hooks/use-chat-error.js +0 -23
  95. package/dist/hooks/use-chat-pending-client-tool-parts.js +0 -12
  96. package/dist/hooks/use-chat-scroll.js +0 -16
  97. package/dist/hooks/use-curated-documents.js +0 -12
  98. package/dist/hooks/use-search.js +0 -21
  99. package/dist/hooks/use-signup-link.js +0 -12
  100. package/dist/hooks/use-term-and-conditions.js +0 -15
  101. package/dist/hooks/use-upload-tmp-document.js +0 -94
  102. package/dist/plugins/persistance.js +0 -23
  103. package/dist/registry/add-documents-to-store.js +0 -44
  104. package/dist/registry/create-document-name.js +0 -6
  105. package/dist/state/state.js +0 -200
  106. package/dist/views/Catalog/Catalog.vue.js +0 -8
  107. package/dist/views/Catalog/Catalog.vue2.js +0 -70
  108. package/dist/views/Chat/Chat.vue.js +0 -7
  109. package/dist/views/Chat/Chat.vue2.js +0 -78
  110. package/dist/views/Chat/Messages/AskForAuthentication.vue.js +0 -7
  111. package/dist/views/Chat/Messages/AskForAuthentication.vue2.js +0 -91
  112. package/dist/views/Chat/Messages/ExecuteRequestTool.vue.js +0 -7
  113. package/dist/views/Chat/Messages/ExecuteRequestTool.vue2.js +0 -24
  114. package/dist/views/Chat/Messages/GetMiniOpenAPIDocTool.vue.js +0 -7
  115. package/dist/views/Chat/Messages/GetMiniOpenAPIDocTool.vue2.js +0 -56
  116. package/dist/views/Chat/Messages/GetOpenAPISpecsSummary.vue.js +0 -26
  117. package/dist/views/Chat/Messages/GetOpenAPISpecsSummary.vue2.js +0 -4
  118. package/dist/views/Chat/Messages/Text.vue.js +0 -16
  119. package/dist/views/Chat/Messages/Text.vue2.js +0 -4
  120. package/dist/views/Layout.vue.js +0 -7
  121. package/dist/views/Layout.vue2.js +0 -25
  122. package/dist/views/PromptForm.vue.js +0 -7
  123. package/dist/views/PromptForm.vue2.js +0 -254
  124. package/dist/views/Settings/Auth.vue.js +0 -67
  125. package/dist/views/Settings/Auth.vue2.js +0 -4
  126. package/dist/views/Settings/DocSettings.vue.js +0 -7
  127. package/dist/views/Settings/DocSettings.vue2.js +0 -49
  128. package/dist/views/Settings/Settings.vue.js +0 -8
  129. package/dist/views/Settings/Settings.vue2.js +0 -79
  130. package/dist/views/Start.vue.js +0 -7
  131. package/dist/views/Start.vue2.js +0 -43
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["$emit","$emit","$emit","$emit"],"sources":["../src/api.ts","../src/registry/create-document-name.ts","../src/client-tools/execute-request.ts","../src/consts/urls.ts","../src/helpers.ts","../src/hooks/use-term-and-conditions.ts","../src/hooks/use-upload-tmp-document.ts","../src/plugins/persistance.ts","../src/registry/add-documents-to-store.ts","../src/state/state.ts","../src/hooks/use-agent-key-documents.ts","../src/hooks/use-chat-scroll.ts","../src/hooks/use-curated-documents.ts","../src/components/AuthenticationProvided.vue","../src/components/AuthenticationRequired.vue","../src/views/Settings/Auth.vue","../src/views/Settings/Auth.vue","../src/views/Chat/Messages/AskForAuthentication.vue","../src/views/Chat/Messages/AskForAuthentication.vue","../src/components/AutosendPaused.vue","../src/components/BuildingRequest.vue","../src/components/RequestApproved.vue","../src/components/RequestFailed.vue","../src/components/RequestRejected.vue","../src/components/RequestSuccess.vue","../src/components/ResponseBody/helpers/media-types.ts","../src/components/ResponseBody/helpers/process-response-body.ts","../src/components/ResponseBody/ResponseBodyInfo.vue","../src/components/ResponseBody/ResponseBodyPreview.vue","../src/components/ResponseBody/ResponseBodyPreview.vue","../src/components/ResponseBody/ResponseBodyRaw.vue","../src/components/ResponseBody/ResponseBodyRaw.vue","../src/components/ResponseBody/ResponseBody.vue","../src/components/ResponseBody/ResponseBody.vue","../src/components/ResponseBody/ResponseBodyToggle.vue","../src/components/ResponseBody/ResponseBodyToggle.vue","../src/components/SendingRequest.vue","../src/components/RequestPreview.vue","../src/components/RequestPreview.vue","../src/hooks/use-chat-approvals.ts","../src/views/Chat/Messages/ExecuteRequestTool.vue","../src/views/Chat/Messages/ExecuteRequestTool.vue","../src/components/ContextItem.vue","../src/components/ContextItem.vue","../src/components/LoadingMiniOpenAPIDoc.vue","../src/views/Chat/Messages/GetMiniOpenAPIDocTool.vue","../src/views/Chat/Messages/GetMiniOpenAPIDocTool.vue","../src/components/LoadingOpenAPISpecsSummary.vue","../src/views/Chat/Messages/GetOpenAPISpecsSummary.vue","../src/views/Chat/Messages/GetOpenAPISpecsSummary.vue","../src/views/Chat/Messages/Text.vue","../src/views/Chat/Messages/Text.vue","../src/hooks/use-search.ts","../src/views/Catalog/Catalog.vue","../src/views/Catalog/Catalog.vue","../src/components/ActionsDropdown.vue","../src/components/ActionsDropdown.vue","../src/components/ApprovalSection.vue","../src/components/ApprovalSection.vue","../src/hooks/use-chat-error.ts","../src/components/ErrorMessage.vue","../src/components/ErrorMessage.vue","../src/hooks/use-signup-link.ts","../src/components/FreeMessagesInfoSection.vue","../src/components/FreeMessagesInfoSection.vue","../src/components/PaymentSection.vue","../src/components/PaymentSection.vue","../src/components/SearchPopover.vue","../src/components/SearchPopover.vue","../src/components/UploadSection.vue","../src/components/UploadSection.vue","../src/hooks/use-chat-pending-client-tool-parts.ts","../src/views/PromptForm.vue","../src/views/PromptForm.vue","../src/views/Chat/Chat.vue","../src/views/Chat/Chat.vue","../src/components/Logo.vue","../src/views/Start.vue","../src/views/Start.vue","../src/views/Layout.vue","../src/views/Layout.vue","../src/components/Selector.vue","../src/components/Selector.vue","../src/components/ServerSelector.vue","../src/components/ServerSelector.vue","../src/views/Settings/DocSettings.vue","../src/views/Settings/DocSettings.vue","../src/views/Settings/Settings.vue","../src/views/Settings/Settings.vue","../src/Chat.vue","../src/Chat.vue","../src/App.vue","../src/App.vue"],"sourcesContent":["import { redirectToProxy } from '@scalar/helpers/url/redirect-to-proxy'\nimport { n } from 'neverpanic'\nimport type { Ref } from 'vue'\nimport z from 'zod'\n\nimport { createError } from '@/entities/error/helpers'\nimport { registryApiMetadata } from '@/entities/registry/document'\n\nexport function createAuthorizationHeaders({\n getAccessToken,\n getAgentKey,\n}: {\n getAccessToken?: () => string\n getAgentKey?: () => string\n}) {\n const token = getAccessToken?.()\n const agentKey = getAgentKey?.()\n\n return {\n ...(token && {\n Authorization: `Bearer ${token}`,\n }),\n ...(agentKey && {\n 'x-scalar-agent-key': agentKey,\n }),\n }\n}\n\n/** Minimal set of API requests needed for agent chat */\nexport function createApi({\n baseUrl,\n proxyUrl,\n getAccessToken,\n getAgentKey,\n}: {\n baseUrl: string\n proxyUrl: Ref<string>\n getAccessToken?: () => string\n getAgentKey?: () => string\n}) {\n const request = n.safeFn(\n async <T extends z.ZodType>({\n path,\n method = 'get',\n query,\n body,\n responseSchema,\n }: {\n path: string\n method?: string\n query?: Record<string, string>\n body?: object\n responseSchema: T\n }) => {\n const url = `${baseUrl}${path}${query ? `?${new URLSearchParams(query)}` : ''}`\n\n const fetchResult = await n.fromUnsafe(\n async () =>\n fetch(redirectToProxy(proxyUrl.value, url), {\n method,\n ...(body && { body: JSON.stringify(body) }),\n headers: {\n ...createAuthorizationHeaders({ getAccessToken, getAgentKey }),\n },\n }),\n (originalError) => createError('FAILED_TO_FETCH', originalError),\n )\n\n if (!fetchResult.success) {\n return fetchResult\n }\n\n const fetchDataResult = await n.fromUnsafe(\n async () => fetchResult.data.json(),\n (originalError) => createError('FAILED_TO_FETCH_DATA', originalError),\n )\n\n if (!fetchDataResult.success) {\n return {\n success: false,\n error: createError('UNKNOWN_ERROR', 'Unknown error occurred. Please contact support.'),\n }\n }\n\n if (!fetchResult.data.ok) {\n const serviceError = z.object({ message: z.string(), code: z.string() }).safeParse(fetchDataResult.data)\n\n if (!serviceError.success) {\n return {\n success: false,\n error: createError('UNKNOWN_ERROR', 'Unknown error occurred. Please contact support.'),\n }\n }\n\n return {\n success: false,\n error: createError(serviceError.data.code, serviceError.data.message),\n }\n }\n\n const serviceData = responseSchema.safeParse(fetchDataResult.data)\n\n if (!serviceData.success) {\n return {\n success: false,\n error: createError('INVALID_RESPONSE', 'Invalid response. Please contact support'),\n }\n }\n\n return { success: true, data: serviceData.data }\n },\n )\n\n const search = async (query: string) =>\n request({\n path: '/vector/registry/search',\n query: { query },\n responseSchema: z.object({\n results: registryApiMetadata.array(),\n }),\n })\n\n const getDocument = async (params: { namespace: string; slug: string }) =>\n request({\n path: `/vector/registry/document/${params.namespace}/${params.slug}`,\n responseSchema: registryApiMetadata,\n })\n\n const getKeyDocuments = async () =>\n request({\n path: '/vector/registry/documents',\n responseSchema: z.object({ documents: registryApiMetadata.array() }),\n })\n\n const getCuratedDocuments = async () =>\n request({\n path: '/vector/registry/curated',\n responseSchema: z.object({\n results: registryApiMetadata.array(),\n }),\n })\n\n return {\n search,\n getDocument,\n getKeyDocuments,\n getCuratedDocuments,\n }\n}\n\nexport type Api = ReturnType<typeof createApi>\n","export function createDocumentName(namespace: string, slug: string) {\n return `${namespace}/${slug}`\n}\n","import type { Chat } from '@ai-sdk/vue'\nimport { buildRequestSecurity, getResolvedUrl } from '@scalar/api-client/v2/blocks/operation-block'\nimport type { SecuritySchemeObjectSecret } from '@scalar/api-client/v2/blocks/scalar-auth-selector-block'\nimport { redirectToProxy } from '@scalar/helpers/url/redirect-to-proxy'\nimport type { ServerObject } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\nimport type { UIDataTypes, UIMessage } from 'ai'\nimport { n } from 'neverpanic'\nimport truncateJson from 'truncate-json'\n\nimport { EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME, TOOL_NAMESPACE_SLUG_DELIMITER } from '@/entities'\nimport { createError } from '@/entities/error/helpers'\nimport { createDocumentName } from '@/registry/create-document-name'\nimport type { Tools } from '@/state/state'\n\n// The maximum number of bytes the requests response can be.\nconst MAX_RESPONSE_SIZE = 50_000\n\nconst getBody = n.safeFn(\n async (response: Response) => {\n const contentType = response.headers.get('content-type')\n\n if (contentType === 'application/json') {\n return { success: true, data: await response.json() }\n }\n\n return { success: true, data: await response.text() }\n },\n (originalError) => createError('FAILED_TO_PARSE_RESPONSE_BODY', { originalError }),\n)\n\nconst truncateResponse = (response: unknown) =>\n JSON.parse(truncateJson(JSON.stringify(response), MAX_RESPONSE_SIZE).jsonString)\n\n/* Result type wrapper for fetch */\nconst safeFetch = n.safeFn(\n async (url: string, init: RequestInit) => {\n const response = await fetch(url, init)\n\n const responseBodyResult = await getBody(response)\n\n if (!response.ok) {\n return {\n success: false,\n error: createError('REQUEST_NOT_OK', {\n status: response.status,\n url: response.url,\n responseBody: truncateResponse(responseBodyResult.success ? responseBodyResult.data : undefined),\n headers: Object.fromEntries(response.headers.entries()),\n }),\n }\n }\n\n if (!responseBodyResult.success) {\n return responseBodyResult\n }\n\n return {\n success: true,\n data: {\n status: response.status,\n responseBody: truncateResponse(responseBodyResult.data),\n headers: Object.fromEntries(response.headers.entries()),\n },\n }\n },\n (originalError) => createError('FAILED_TO_FETCH', { originalError }),\n)\n\nfunction createUrl({\n path,\n activeServer,\n proxyUrl,\n}: {\n path: string\n activeServer: ServerObject | null\n proxyUrl: string\n}) {\n const resolvedUrl = getResolvedUrl({\n path,\n server: activeServer,\n pathVariables: {},\n environment: {\n color: '',\n variables: [],\n },\n })\n\n return redirectToProxy(proxyUrl, resolvedUrl)\n}\n\n/**\n * Executes an HTTP request with the specified options, including method, path, headers, and security schemes, and returns the processed response.\n */\nexport const executeRequestTool = n.safeFn(\n async ({\n documentSettings,\n toolCallId,\n chat,\n proxyUrl,\n input: { method, path, body, headers, documentIdentifier },\n }: {\n documentSettings: Record<\n string,\n { activeServer: ServerObject | null; securitySchemes: SecuritySchemeObjectSecret[] }\n >\n toolCallId: string\n chat: Chat<UIMessage<unknown, UIDataTypes, Tools>>\n proxyUrl: string\n input: {\n method: string\n path: string\n headers?: Record<string, string>\n body?: string\n documentIdentifier: string\n }\n }) => {\n const [namespace, slug] = documentIdentifier.split(TOOL_NAMESPACE_SLUG_DELIMITER)\n if (!namespace || !slug) {\n return {\n success: false,\n error: createError('FAILED_TO_DETERMINE_DOCUMENT', { namespace, slug, documentIdentifier }),\n }\n }\n\n const documentName = createDocumentName(namespace, slug)\n const settings = documentSettings[documentName]\n\n if (!settings) {\n return {\n success: false,\n error: createError('DOCUMENT_SETTINGS_COULD_NOT_BE_DETERMINED', {\n documentName,\n namespace,\n slug,\n }),\n }\n }\n\n const requestSecurityOptions = buildRequestSecurity(settings.securitySchemes)\n\n const fetchOptions = {\n method,\n body,\n ...requestSecurityOptions,\n headers: {\n ...headers,\n ...requestSecurityOptions.headers,\n },\n }\n\n const url = createUrl({\n path,\n activeServer: settings.activeServer,\n proxyUrl,\n })\n\n const result = await safeFetch(url, fetchOptions)\n\n chat.addToolOutput({\n tool: EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME,\n toolCallId,\n output: result,\n state: 'output-available',\n })\n\n return result\n },\n (originalError) => createError('FAILED_TO_EXECUTE_REQUEST', originalError),\n)\n","export const URLS = {\n DEFAULT_PROXY_URL: 'https://proxy.scalar.com',\n PRIVACY_POLICY: 'https://scalar.com/legal/privacy-policy',\n TERMS_AND_CONDITIONS: 'https://scalar.com/legal/terms-and-conditions',\n AGENT_SCALAR_DOCUMENTATION: 'https://scalar.com/products/agent/getting-started',\n PROXY_SOURCE_CODE: 'https://github.com/scalar/scalar/tree/main/projects/proxy-scalar-com',\n} as const\n","import { mergeSecurity } from '@scalar/api-client/v2/blocks/scalar-auth-selector-block'\nimport { getSelectedServer } from '@scalar/api-client/v2/features/operation'\nimport { getServers } from '@scalar/api-client/v2/helpers'\nimport { REFERENCE_LS_KEYS, safeLocalStorage } from '@scalar/helpers/object/local-storage'\nimport type { OpenAPIV3_1 } from '@scalar/openapi-types'\nimport type { WorkspaceStore } from '@scalar/workspace-store/client'\nimport type { AuthStore } from '@scalar/workspace-store/entities/auth'\nimport { type Auth, AuthSchema } from '@scalar/workspace-store/entities/auth'\nimport type { WorkspaceDocument } from '@scalar/workspace-store/schemas'\nimport { coerceValue } from '@scalar/workspace-store/schemas/typebox-coerce'\nimport type { OperationObject } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\n\nexport function getOperations(doc: Partial<OpenAPIV3_1.Document>) {\n return Object.values(doc.paths ?? {}).flatMap((path) => Object.values(path ?? {})) as OperationObject[]\n}\n\n/** Flattens all security requirements from a document */\nfunction getSecurityFromDocument(documentName: string, document: WorkspaceDocument, authStore: AuthStore) {\n return Object.values(mergeSecurity(document?.components?.securitySchemes, {}, authStore, documentName))\n}\n\n/** Generate document settings from workspace store */\nexport function createDocumentSettings(workspaceStore: WorkspaceStore) {\n return Object.fromEntries(\n Object.entries(workspaceStore.workspace.documents).map(([key, document]) => {\n const servers = getServers(document.servers, {\n documentUrl: document?.['x-scalar-original-source-url'],\n })\n\n return [\n key,\n {\n activeServer: getSelectedServer(servers, document['x-scalar-selected-server']),\n securitySchemes: getSecurityFromDocument(key, document, workspaceStore.auth),\n },\n ]\n }),\n )\n}\n\n// Local storage helper instance, safely wrapped.\nconst storage = safeLocalStorage()\n\n/**\n * Provides an interface to store and retrieve authentication scheme\n * information in local storage, including both the available schemes and\n * the user's selected schemes.\n */\nexport const authStorage = () => {\n const getKey = (slug: string) => {\n return `${REFERENCE_LS_KEYS.AUTH}-${slug}`\n }\n\n return {\n /**\n * Retrieves and coerces the authentication schemes stored in local storage.\n */\n getAuth: (slug: string) => {\n const parsed = JSON.parse(storage.getItem(getKey(slug)) ?? '{}')\n return coerceValue(AuthSchema, parsed)\n },\n /**\n * Stores the authentication schemes in local storage.\n * @param value The Auth object to stringify and store.\n */\n setAuth: (slug: string, value: Auth) => {\n storage.setItem(getKey(slug), JSON.stringify(value))\n },\n }\n}\n\n/**\n * Restores authentication secrets from local storage to the workspace store.\n *\n * This function iterates through stored authentication schemes and restores\n * any secret values (keys starting with x-scalar-secret-) to the active\n * document's security schemes. It uses the current security schemes as the\n * source of truth, only restoring secrets for structures that exist in the\n * current document.\n */\nexport const restoreAuthSecretsFromStorage = ({\n documentName,\n workspaceStore,\n}: {\n documentName: string\n workspaceStore: WorkspaceStore\n}): void => {\n const authPersistence = authStorage()\n const auth = authPersistence.getAuth(documentName)\n workspaceStore.auth.load({ [documentName]: auth })\n}\n\nexport function safeParseJson(value: string) {\n try {\n return JSON.parse(value)\n } catch {\n return\n }\n}\n","import { onMounted, ref } from 'vue'\n\nconst TERMS_AND_CONDITIONS_LS_KEY = 'scalar/agent-terms-accepted'\n\nexport function useTermsAndConditions() {\n const accepted = ref(false)\n\n onMounted(() => {\n accepted.value = localStorage.getItem(TERMS_AND_CONDITIONS_LS_KEY) === 'true'\n })\n\n function accept() {\n accepted.value = true\n localStorage.setItem(TERMS_AND_CONDITIONS_LS_KEY, 'true')\n }\n\n return { accepted, accept }\n}\n","import { redirectToProxy } from '@scalar/helpers/url/redirect-to-proxy'\nimport { ref } from 'vue'\nimport { z } from 'zod/mini'\n\nimport { useState } from '@/state/state'\n\nconst SHOW_UPLOAD_SUCCESS_DELAY = 5_000 // 5 seconds\n\nexport type UploadTmpDocumentState =\n | { type: 'error'; error: unknown }\n | { type: 'uploading' }\n | { type: 'processing' }\n | { type: 'loading' }\n | { type: 'done' }\n\nconst TMP_DOC_LS_KEY = 'scalar-tmp-doc'\n\nfunction saveTmpDocumentInLocalStorage({ namespace, slug }: { namespace: string; slug: string }) {\n localStorage.setItem(TMP_DOC_LS_KEY, JSON.stringify({ namespace, slug }))\n}\n\nexport function getTmpDocFromLocalStorage() {\n const tmpDoc = localStorage.getItem(TMP_DOC_LS_KEY)\n if (!tmpDoc) {\n return\n }\n\n return z\n .object({\n namespace: z.string(),\n slug: z.string(),\n })\n .parse(JSON.parse(tmpDoc))\n}\n\nexport function removeTmpDocFromLocalStorage() {\n const tmpDoc = localStorage.getItem(TMP_DOC_LS_KEY)\n if (!tmpDoc) {\n return\n }\n\n localStorage.removeItem(TMP_DOC_LS_KEY)\n}\n\n/**\n * Handle uploading a temporary OpenAPI document.\n */\nexport function useUploadTmpDocument() {\n const state = useState()\n const uploadState = ref<UploadTmpDocumentState>()\n\n function createUrl(path: string) {\n const fullUrl = `${state.baseUrl}${path}`\n return redirectToProxy(state.proxyUrl.value, fullUrl)\n }\n\n async function uploadTempDocument(document: string, isAgent = false) {\n try {\n uploadState.value = {\n type: 'uploading',\n }\n\n const response = await fetch(createUrl(`/core/share/upload/apis${isAgent ? '?source=agent' : ''}`), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ document }),\n })\n\n if (!response.ok) {\n uploadState.value = {\n type: 'error',\n error: 'Failed to upload your OpenAPI document.',\n }\n\n return\n }\n\n const json = await response.json()\n\n const { success, data } = z.object({ url: z.string(), namespace: z.string(), slug: z.string() }).safeParse(json)\n\n if (!success) {\n uploadState.value = {\n type: 'error',\n error: 'Failed to process document.',\n }\n return\n }\n\n uploadState.value = {\n type: 'processing',\n }\n const embeddingStatusResponse = await fetch(\n createUrl(`/vector/registry/embeddings/${data.namespace}/${data.slug}`),\n {\n method: 'GET',\n },\n )\n\n saveTmpDocumentInLocalStorage({\n namespace: data.namespace,\n slug: data.slug,\n })\n\n await state.addDocument({\n namespace: data.namespace,\n slug: data.slug,\n removable: false,\n tmp: true,\n })\n\n if (!embeddingStatusResponse.ok) {\n uploadState.value = {\n type: 'error',\n error: 'Failed to embed document.',\n }\n return\n }\n\n uploadState.value = { type: 'done' }\n state.uploadedTmpDocumentUrl.value = data.url\n\n setTimeout(() => {\n uploadState.value = undefined\n }, SHOW_UPLOAD_SUCCESS_DELAY)\n\n return data\n } catch {\n uploadState.value = { type: 'error', error: 'Failed to upload your OpenAPI document.' }\n return\n }\n }\n\n return {\n uploadTempDocument,\n uploadState,\n }\n}\n","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","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","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","import { useToasts } from '@scalar/use-toasts'\nimport { onMounted } from 'vue'\n\nimport { useState } from '@/state/state'\n\nexport function useAgentKeyDocuments() {\n const { api, addDocument, mode, getAgentKey } = useState()\n const { toast } = useToasts()\n\n onMounted(async () => {\n if (mode !== 'full' || !getAgentKey) {\n return\n }\n\n const keyDocumentsResult = await api.getKeyDocuments()\n\n if (!keyDocumentsResult.success) {\n toast('Failed to fetch your OpenAPI document. The Agent key may be invalid.', 'error')\n return\n }\n\n keyDocumentsResult.data.documents.forEach(({ namespace, slug }) =>\n addDocument({ namespace, slug, removable: false }),\n )\n })\n}\n","import type { UIMessage } from 'ai'\nimport { nextTick, watch } from 'vue'\n\nimport { useState } from '@/state/state'\n\nexport function useChatScroll() {\n const state = useState()\n\n function getMsgContent(msg?: UIMessage) {\n const lastPart = msg?.parts.at(-1)\n if (!lastPart) return\n\n if (lastPart.type !== 'text') return\n\n return lastPart.text\n }\n\n watch([() => state.chat.status, () => getMsgContent(state.chat.lastMessage)], async () => {\n await nextTick()\n window.scrollTo(0, document.body.scrollHeight)\n })\n}\n","import { onMounted } from 'vue'\n\nimport { useState } from '@/state/state'\n\nexport function useCuratedDocuments() {\n const { api, curatedDocuments } = useState()\n\n onMounted(async () => {\n const getCuratedDocumentsResult = await api.getCuratedDocuments()\n\n if (!getCuratedDocumentsResult.success) {\n return\n }\n\n curatedDocuments.value = getCuratedDocumentsResult.data.results\n })\n}\n","<template>\n <div class=\"authenticationProvided\">\n <svg\n fill=\"none\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n width=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <rect\n height=\"14.25\"\n rx=\"7.125\"\n width=\"14.25\"\n x=\"0.875\"\n y=\"0.875\" />\n <rect\n height=\"14.25\"\n rx=\"7.125\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n width=\"14.25\"\n x=\"0.875\"\n y=\"0.875\" />\n <g clip-path=\"url(#clip0_74_840)\">\n <path\n d=\"M11.6037 6.841L7.59117 10.8535C7.49742 10.9472 7.37029 10.9998 7.23774 10.9998C7.10519 10.9998 6.97806 10.9472 6.8843 10.8535L4.64617 8.6035C4.55257 8.50975 4.5 8.38269 4.5 8.25022C4.5 8.11774 4.55257 7.99068 4.64617 7.89694L5.27117 7.27194C5.36488 7.17862 5.49174 7.12623 5.62399 7.12623C5.75623 7.12623 5.88309 7.17862 5.9768 7.27194L7.25024 8.50694L10.274 5.52037C10.3677 5.42696 10.4946 5.37451 10.627 5.37451C10.7593 5.37451 10.8862 5.42696 10.9799 5.52037L11.6034 6.131C11.6502 6.17746 11.6875 6.23274 11.7129 6.29366C11.7383 6.35458 11.7514 6.41993 11.7514 6.48593C11.7514 6.55194 11.7384 6.6173 11.713 6.67824C11.6877 6.73918 11.6505 6.7945 11.6037 6.841Z\"\n fill=\"currentColor\" />\n </g>\n <defs>\n <clipPath id=\"clip0_74_840\">\n <rect\n height=\"8\"\n rx=\"4\"\n width=\"8\"\n x=\"4\"\n y=\"4\" />\n </clipPath>\n </defs>\n </svg>\n Authorized\n </div>\n</template>\n\n<style scoped>\n.authenticationProvided {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--scalar-color-1);\n font-weight: var(--scalar-semibold);\n min-height: 40px;\n font-size: var(--scalar-font-size-3);\n position: relative;\n}\n</style>\n","<template>\n <div class=\"authenticationRequired\">\n <svg\n fill=\"none\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n width=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <rect\n height=\"14.25\"\n rx=\"7.125\"\n width=\"14.25\"\n x=\"0.875\"\n y=\"0.875\" />\n <rect\n height=\"14.25\"\n rx=\"7.125\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n width=\"14.25\"\n x=\"0.875\"\n y=\"0.875\" />\n <g clip-path=\"url(#clip0_74_585)\">\n <path\n d=\"M10.75 5.5V10.5C10.75 10.6326 10.6973 10.7598 10.6036 10.8536C10.5098 10.9473 10.3826 11 10.25 11H9C8.86739 11 8.74021 10.9473 8.64645 10.8536C8.55268 10.7598 8.5 10.6326 8.5 10.5V5.5C8.5 5.36739 8.55268 5.24021 8.64645 5.14645C8.74021 5.05268 8.86739 5 9 5H10.25C10.3826 5 10.5098 5.05268 10.6036 5.14645C10.6973 5.24021 10.75 5.36739 10.75 5.5ZM7 5H5.75C5.61739 5 5.49021 5.05268 5.39645 5.14645C5.30268 5.24021 5.25 5.36739 5.25 5.5V10.5C5.25 10.6326 5.30268 10.7598 5.39645 10.8536C5.49021 10.9473 5.61739 11 5.75 11H7C7.13261 11 7.25979 10.9473 7.35355 10.8536C7.44732 10.7598 7.5 10.6326 7.5 10.5V5.5C7.5 5.36739 7.44732 5.24021 7.35355 5.14645C7.25979 5.05268 7.13261 5 7 5Z\"\n fill=\"currentColor\" />\n </g>\n <defs>\n <clipPath id=\"clip0_74_585\">\n <rect\n height=\"8\"\n rx=\"4\"\n width=\"8\"\n x=\"4\"\n y=\"4\" />\n </clipPath>\n </defs>\n </svg>\n Authentication required\n </div>\n</template>\n\n<style scoped>\n.authenticationRequired {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--scalar-color-blue);\n font-weight: var(--scalar-semibold);\n min-height: 40px;\n font-size: var(--scalar-font-size-3);\n position: relative;\n}\n</style>\n","<script setup lang=\"ts\">\nimport {\n AuthSelector,\n mergeSecurity,\n} from '@scalar/api-client/v2/blocks/scalar-auth-selector-block'\nimport {\n getSecurityRequirements,\n getSelectedSecurity,\n} from '@scalar/api-client/v2/features/operation'\nimport type { ApiReferenceConfigurationRaw } from '@scalar/types/api-reference'\nimport type { AuthStore } from '@scalar/workspace-store/entities/auth'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport type { ServerObject } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\nimport type { WorkspaceDocument } from '@scalar/workspace-store/schemas/workspace'\nimport { useFocusWithin } from '@vueuse/core'\nimport { computed, shallowRef, watch } from 'vue'\n\nimport { useState } from '@/state/state'\n\nconst { document, name, environment, eventBus, options, authStore } =\n defineProps<{\n options: Pick<\n ApiReferenceConfigurationRaw,\n 'authentication' | 'persistAuth' | 'proxyUrl'\n >\n name: string\n authStore: AuthStore\n document: WorkspaceDocument | undefined\n eventBus: WorkspaceEventBus\n selectedServer: ServerObject | null\n environment: XScalarEnvironment\n }>()\n\nconst { workspaceStore } = useState()\n\n/** Compute what the security requirements should be for the document */\nconst securityRequirements = computed(() =>\n getSecurityRequirements(document?.security),\n)\n\n/** The selected security keys for the document */\nconst selectedSecurity = computed(() =>\n getSelectedSecurity(\n authStore.getAuthSelectedSchemas({\n type: 'document',\n documentName: name,\n }),\n undefined,\n securityRequirements.value,\n ),\n)\n\nconst focusRef = shallowRef()\nconst { focused } = useFocusWithin(focusRef)\n\n/** Merge the security schemes with the authentication config and the auth store */\nconst securitySchemes = computed(() =>\n mergeSecurity(\n document?.components?.securitySchemes ?? {},\n options.authentication?.securitySchemes,\n authStore,\n name,\n ),\n)\n\nwatch(focused, (isFocused) => {\n if (!isFocused) {\n return\n }\n\n workspaceStore.update('x-scalar-active-document', name)\n})\n</script>\n<template>\n <div\n ref=\"focusRef\"\n tabindex=\"0\">\n <AuthSelector\n v-if=\"Object.keys(securitySchemes).length\"\n :authStore\n :documentSlug=\"name\"\n :environment\n :eventBus\n isReadOnly\n isStatic\n layout=\"reference\"\n :meta=\"{ type: 'document' }\"\n :persistAuth=\"options.persistAuth\"\n :proxyUrl=\"options.proxyUrl ?? ''\"\n :securityRequirements\n :securitySchemes\n :selectedSecurity\n :server=\"selectedServer\"\n title=\"Authentication\" />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport {\n AuthSelector,\n mergeSecurity,\n} from '@scalar/api-client/v2/blocks/scalar-auth-selector-block'\nimport {\n getSecurityRequirements,\n getSelectedSecurity,\n} from '@scalar/api-client/v2/features/operation'\nimport type { ApiReferenceConfigurationRaw } from '@scalar/types/api-reference'\nimport type { AuthStore } from '@scalar/workspace-store/entities/auth'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport type { ServerObject } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\nimport type { WorkspaceDocument } from '@scalar/workspace-store/schemas/workspace'\nimport { useFocusWithin } from '@vueuse/core'\nimport { computed, shallowRef, watch } from 'vue'\n\nimport { useState } from '@/state/state'\n\nconst { document, name, environment, eventBus, options, authStore } =\n defineProps<{\n options: Pick<\n ApiReferenceConfigurationRaw,\n 'authentication' | 'persistAuth' | 'proxyUrl'\n >\n name: string\n authStore: AuthStore\n document: WorkspaceDocument | undefined\n eventBus: WorkspaceEventBus\n selectedServer: ServerObject | null\n environment: XScalarEnvironment\n }>()\n\nconst { workspaceStore } = useState()\n\n/** Compute what the security requirements should be for the document */\nconst securityRequirements = computed(() =>\n getSecurityRequirements(document?.security),\n)\n\n/** The selected security keys for the document */\nconst selectedSecurity = computed(() =>\n getSelectedSecurity(\n authStore.getAuthSelectedSchemas({\n type: 'document',\n documentName: name,\n }),\n undefined,\n securityRequirements.value,\n ),\n)\n\nconst focusRef = shallowRef()\nconst { focused } = useFocusWithin(focusRef)\n\n/** Merge the security schemes with the authentication config and the auth store */\nconst securitySchemes = computed(() =>\n mergeSecurity(\n document?.components?.securitySchemes ?? {},\n options.authentication?.securitySchemes,\n authStore,\n name,\n ),\n)\n\nwatch(focused, (isFocused) => {\n if (!isFocused) {\n return\n }\n\n workspaceStore.update('x-scalar-active-document', name)\n})\n</script>\n<template>\n <div\n ref=\"focusRef\"\n tabindex=\"0\">\n <AuthSelector\n v-if=\"Object.keys(securitySchemes).length\"\n :authStore\n :documentSlug=\"name\"\n :environment\n :eventBus\n isReadOnly\n isStatic\n layout=\"reference\"\n :meta=\"{ type: 'document' }\"\n :persistAuth=\"options.persistAuth\"\n :proxyUrl=\"options.proxyUrl ?? ''\"\n :securityRequirements\n :securitySchemes\n :selectedSecurity\n :server=\"selectedServer\"\n title=\"Authentication\" />\n </div>\n</template>\n","<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","<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","<template>\n <div class=\"autosendPaused\">\n <svg\n fill=\"none\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n width=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <rect\n height=\"14.25\"\n rx=\"7.125\"\n width=\"14.25\"\n x=\"0.875\"\n y=\"0.875\" />\n <rect\n height=\"14.25\"\n rx=\"7.125\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n width=\"14.25\"\n x=\"0.875\"\n y=\"0.875\" />\n <g clip-path=\"url(#clip0_74_585)\">\n <path\n d=\"M10.75 5.5V10.5C10.75 10.6326 10.6973 10.7598 10.6036 10.8536C10.5098 10.9473 10.3826 11 10.25 11H9C8.86739 11 8.74021 10.9473 8.64645 10.8536C8.55268 10.7598 8.5 10.6326 8.5 10.5V5.5C8.5 5.36739 8.55268 5.24021 8.64645 5.14645C8.74021 5.05268 8.86739 5 9 5H10.25C10.3826 5 10.5098 5.05268 10.6036 5.14645C10.6973 5.24021 10.75 5.36739 10.75 5.5ZM7 5H5.75C5.61739 5 5.49021 5.05268 5.39645 5.14645C5.30268 5.24021 5.25 5.36739 5.25 5.5V10.5C5.25 10.6326 5.30268 10.7598 5.39645 10.8536C5.49021 10.9473 5.61739 11 5.75 11H7C7.13261 11 7.25979 10.9473 7.35355 10.8536C7.44732 10.7598 7.5 10.6326 7.5 10.5V5.5C7.5 5.36739 7.44732 5.24021 7.35355 5.14645C7.25979 5.05268 7.13261 5 7 5Z\"\n fill=\"currentColor\" />\n </g>\n <defs>\n <clipPath id=\"clip0_74_585\">\n <rect\n height=\"8\"\n rx=\"4\"\n width=\"8\"\n x=\"4\"\n y=\"4\" />\n </clipPath>\n </defs>\n </svg>\n Accept Request to Continue\n </div>\n</template>\n\n<style scoped>\n.autosendPaused {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--scalar-color-blue);\n font-weight: var(--scalar-semibold);\n min-height: 40px;\n font-size: var(--scalar-font-size-3);\n position: relative;\n}\n</style>\n","<template>\n <div class=\"buildingRequest\">\n <div class=\"playIcon\">\n <svg\n fill=\"currentColor\"\n height=\"32\"\n viewBox=\"0 0 256 256\"\n width=\"32\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M240,128a15.74,15.74,0,0,1-7.6,13.51L88.32,229.65a16,16,0,0,1-16.2.3A15.86,15.86,0,0,1,64,216.13V39.87a15.86,15.86,0,0,1,8.12-13.82,16,16,0,0,1,16.2.3L232.4,114.49A15.74,15.74,0,0,1,240,128Z\"></path>\n </svg>\n </div>\n Building Request...\n </div>\n</template>\n\n<style scoped>\n.playIcon {\n padding: 4px;\n height: 16px;\n width: 16px;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n background: var(--scalar-background-1);\n border-radius: 50%;\n}\n\n.playIcon::before {\n content: '';\n width: 16px;\n height: 16px;\n display: inline-block;\n box-sizing: border-box;\n position: absolute;\n border-width: 1.75px;\n border-style: solid;\n border-color: currentcolor currentcolor transparent;\n border-image: initial;\n border-radius: 50%;\n background: var(--scalar-background-1);\n animation: 0.42s linear 0s infinite normal none running rotation;\n}\n\n.buildingRequest {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--scalar-color-blue);\n font-weight: var(--scalar-semibold);\n min-height: 40px;\n font-size: var(--scalar-font-size-3);\n position: relative;\n}\n\n.buildingRequest svg {\n width: 100%;\n height: 100%;\n z-index: 1;\n border-radius: 50%;\n}\n\n@keyframes rotation {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n</style>\n","<template>\n <div class=\"requestApproved\">\n <svg\n fill=\"none\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n width=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <rect\n height=\"14.25\"\n rx=\"7.125\"\n width=\"14.25\"\n x=\"0.875\"\n y=\"0.875\" />\n <rect\n height=\"14.25\"\n rx=\"7.125\"\n stroke=\"var(--scalar-color-green)\"\n stroke-width=\"1.75\"\n width=\"14.25\"\n x=\"0.875\"\n y=\"0.875\" />\n <g clip-path=\"url(#clip0_74_840)\">\n <path\n d=\"M11.6037 6.841L7.59117 10.8535C7.49742 10.9472 7.37029 10.9998 7.23774 10.9998C7.10519 10.9998 6.97806 10.9472 6.8843 10.8535L4.64617 8.6035C4.55257 8.50975 4.5 8.38269 4.5 8.25022C4.5 8.11774 4.55257 7.99068 4.64617 7.89694L5.27117 7.27194C5.36488 7.17862 5.49174 7.12623 5.62399 7.12623C5.75623 7.12623 5.88309 7.17862 5.9768 7.27194L7.25024 8.50694L10.274 5.52037C10.3677 5.42696 10.4946 5.37451 10.627 5.37451C10.7593 5.37451 10.8862 5.42696 10.9799 5.52037L11.6034 6.131C11.6502 6.17746 11.6875 6.23274 11.7129 6.29366C11.7383 6.35458 11.7514 6.41993 11.7514 6.48593C11.7514 6.55194 11.7384 6.6173 11.713 6.67824C11.6877 6.73918 11.6505 6.7945 11.6037 6.841Z\"\n fill=\"var(--scalar-color-green)\" />\n </g>\n <defs>\n <clipPath id=\"clip0_74_840\">\n <rect\n height=\"8\"\n rx=\"4\"\n width=\"8\"\n x=\"4\"\n y=\"4\" />\n </clipPath>\n </defs>\n </svg>\n Request Approved\n </div>\n</template>\n\n<style scoped>\n.requestApproved {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--scalar-color-green);\n font-weight: var(--scalar-semibold);\n min-height: 40px;\n font-size: var(--scalar-font-size-3);\n position: relative;\n}\n</style>\n","<template>\n <div class=\"requestFailed\">\n <i class=\"requestFailedIcon\">\n <svg\n fill=\"currentColor\"\n height=\"100%\"\n viewBox=\"0 0 256 256\"\n width=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M216,48V208a16,16,0,0,1-16,16H160a16,16,0,0,1-16-16V48a16,16,0,0,1,16-16h40A16,16,0,0,1,216,48ZM96,32H56A16,16,0,0,0,40,48V208a16,16,0,0,0,16,16H96a16,16,0,0,0,16-16V48A16,16,0,0,0,96,32Z\"></path>\n </svg>\n </i>\n Request Failed\n </div>\n</template>\n\n<style scoped>\n.requestFailed {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--scalar-color-red);\n font-weight: var(--scalar-semibold);\n min-height: 40px;\n font-size: var(--scalar-font-size-3);\n position: relative;\n}\n.requestFailedIcon {\n box-shadow: inset 0 0 0 1.5px currentColor;\n padding: 4px;\n padding: 4px;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n}\n</style>\n","<template>\n <div class=\"requestRejected\">\n <svg\n fill=\"currentColor\"\n height=\"16\"\n viewBox=\"0 0 256 256\"\n width=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M56.88,31.93A12,12,0,1,0,39.12,48.07l7.81,8.59A108,108,0,0,0,31.85,177.23L21,209.66A20,20,0,0,0,46.34,235l32.43-10.81a108.08,108.08,0,0,0,112.55-8.66l7.8,8.58a12,12,0,0,0,17.76-16.14ZM128,212a83.91,83.91,0,0,1-42-11.27,12,12,0,0,0-9.82-1l-29.79,9.93,9.93-29.79a12,12,0,0,0-1-9.82,84,84,0,0,1,7.94-95.49l111.84,123A83.83,83.83,0,0,1,128,212Zm108-84a107.22,107.22,0,0,1-8.65,42.4A12,12,0,0,1,205.28,161a84.07,84.07,0,0,0-102.77-113,12,12,0,0,1-7.27-22.87A108.08,108.08,0,0,1,236,128Z\"></path>\n </svg>\n Request Rejected\n </div>\n</template>\n\n<style scoped>\n.requestRejected {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--scalar-color-red);\n font-weight: var(--scalar-semibold);\n min-height: 40px;\n font-size: var(--scalar-font-size-3);\n position: relative;\n}\n</style>\n","<template>\n <div class=\"requestSuccess\">\n <svg\n fill=\"none\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n width=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <rect\n height=\"14.25\"\n rx=\"7.125\"\n width=\"14.25\"\n x=\"0.875\"\n y=\"0.875\" />\n <rect\n height=\"14.25\"\n rx=\"7.125\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n width=\"14.25\"\n x=\"0.875\"\n y=\"0.875\" />\n <g clip-path=\"url(#clip0_74_840)\">\n <path\n d=\"M11.6037 6.841L7.59117 10.8535C7.49742 10.9472 7.37029 10.9998 7.23774 10.9998C7.10519 10.9998 6.97806 10.9472 6.8843 10.8535L4.64617 8.6035C4.55257 8.50975 4.5 8.38269 4.5 8.25022C4.5 8.11774 4.55257 7.99068 4.64617 7.89694L5.27117 7.27194C5.36488 7.17862 5.49174 7.12623 5.62399 7.12623C5.75623 7.12623 5.88309 7.17862 5.9768 7.27194L7.25024 8.50694L10.274 5.52037C10.3677 5.42696 10.4946 5.37451 10.627 5.37451C10.7593 5.37451 10.8862 5.42696 10.9799 5.52037L11.6034 6.131C11.6502 6.17746 11.6875 6.23274 11.7129 6.29366C11.7383 6.35458 11.7514 6.41993 11.7514 6.48593C11.7514 6.55194 11.7384 6.6173 11.713 6.67824C11.6877 6.73918 11.6505 6.7945 11.6037 6.841Z\"\n fill=\"currentColor\" />\n </g>\n <defs>\n <clipPath id=\"clip0_74_840\">\n <rect\n height=\"8\"\n rx=\"4\"\n width=\"8\"\n x=\"4\"\n y=\"4\" />\n </clipPath>\n </defs>\n </svg>\n Request Succeeded\n </div>\n</template>\n\n<style scoped>\n.requestSuccess {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--scalar-color-1);\n font-weight: var(--scalar-semibold);\n min-height: 40px;\n font-size: var(--scalar-font-size-3);\n position: relative;\n}\n</style>\n","export type MediaPreview = 'object' | 'image' | 'video' | 'audio'\n\nexport type MediaConfig = {\n preview?: MediaPreview\n alpha?: boolean\n raw?: boolean\n language?: string\n extension: string\n}\n\n/** Media Type (MIME Type) Definitions */\nconst mediaTypes: { [type: string]: MediaConfig | undefined } = {\n 'application/epub+zip': { extension: '.epub' },\n 'application/gzip': { extension: '.gz' },\n 'application/java-archive': { extension: '.jar' },\n 'application/javascript': { extension: '.js', raw: true },\n 'application/json': { extension: '.json', raw: true, language: 'json' },\n 'application/ld+json': { extension: '.jsonld', raw: true, language: 'json' },\n 'application/problem+json': {\n extension: '.json',\n raw: true,\n language: 'json',\n },\n 'application/vnd.api+json': {\n extension: '.json',\n raw: true,\n language: 'json',\n },\n 'application/dns-json': { extension: '.json', raw: true, language: 'json' },\n 'application/msword': { extension: '.doc' },\n 'application/octet-stream': { extension: '.bin' },\n 'application/ogg': { extension: '.ogx' },\n 'application/pdf': { extension: '.pdf', preview: 'object' },\n 'application/rtf': { extension: '.rtf', raw: true },\n 'application/vnd.amazon.ebook': { extension: '.azw' },\n 'application/vnd.apple.installer+xml': {\n extension: '.mpkg',\n raw: true,\n language: 'xml',\n },\n 'application/vnd.mozilla.xul+xml': {\n extension: '.xul',\n raw: true,\n language: 'xml',\n },\n 'application/vnd.ms-excel': { extension: '.xls' },\n 'application/vnd.ms-fontobject': { extension: '.eot' },\n 'application/vnd.ms-powerpoint': { extension: '.ppt' },\n 'application/vnd.oasis.opendocument.presentation': { extension: '.odp' },\n 'application/vnd.oasis.opendocument.spreadsheet': { extension: '.ods' },\n 'application/vnd.oasis.opendocument.text': { extension: '.odt' },\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation': {\n extension: '.pptx',\n },\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': {\n extension: '.xlsx',\n },\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': {\n extension: '.docx',\n },\n 'application/vnd.rar': { extension: '.rar' },\n 'application/vnd.visio': { extension: '.vsd' },\n 'application/x-7z-compressed': { extension: '.7z' },\n 'application/x-abiword': { extension: '.abw' },\n 'application/x-bzip': { extension: '.bz' },\n 'application/x-bzip2': { extension: '.bz2' },\n 'application/x-cdf': { extension: '.cda' },\n 'application/x-csh': { extension: '.csh' },\n 'application/x-freearc': { extension: '.arc' },\n 'application/x-httpd-php': { extension: '.php', raw: true },\n 'application/x-sh': { extension: '.sh', raw: true },\n 'application/x-tar': { extension: '.tar' },\n 'application/xhtml+xml': { extension: '.xhtml', raw: true, language: 'html' },\n 'application/xml': { extension: '.xml', raw: true, language: 'xml' },\n 'application/yaml': { extension: '.yaml', raw: true, language: 'yaml' },\n 'application/zip': { extension: '.zip' },\n 'audio/aac': { extension: '.aac' },\n 'audio/midi': { extension: '.midi' },\n 'audio/mpeg': { extension: '.mp3', preview: 'audio' },\n 'audio/ogg': { extension: '.oga' },\n 'audio/wav': { extension: '.wav' },\n 'audio/webm': { extension: '.weba' },\n 'font/otf': { extension: '.otf' },\n 'font/ttf': { extension: '.ttf' },\n 'font/woff': { extension: '.woff' },\n 'font/woff2': { extension: '.woff2' },\n 'image/apng': { extension: '.apng', preview: 'image', alpha: true },\n 'image/avif': { extension: '.avif', preview: 'image' },\n 'image/bmp': { extension: '.bmp', preview: 'image' },\n 'image/gif': { extension: '.gif', preview: 'image', alpha: true },\n 'image/jpeg': { extension: '.jpg', preview: 'image' },\n 'image/png': { extension: '.png', preview: 'image', alpha: true },\n 'image/svg+xml': {\n extension: '.svg',\n raw: true,\n language: 'xml',\n preview: 'image',\n alpha: true,\n },\n 'image/tiff': { extension: '.tiff' },\n 'image/vnd.microsoft.icon': { extension: '.ico', preview: 'image' },\n 'image/webp': { extension: '.webp', preview: 'image', alpha: true },\n 'text/calendar': { extension: '.ics', raw: true },\n 'text/css': { extension: '.css', raw: true, language: 'css' },\n 'text/csv': { extension: '.csv', raw: true },\n 'text/html': {\n extension: '.html',\n raw: true,\n language: 'html',\n preview: 'object',\n },\n 'text/javascript': { extension: '.js', raw: true },\n 'text/plain': { extension: '.txt', raw: true },\n 'text/xml': { extension: '.xml', raw: true, language: 'xml' },\n 'text/yaml': { extension: '.yaml', raw: true, language: 'yaml' },\n 'video/3gpp': { extension: '.3gp' },\n 'audio/3gpp': { extension: '.3gp' },\n 'video/3gpp2': { extension: '.3g2' },\n 'audio/3gpp2': { extension: '.3g2' },\n 'video/mp2t': { extension: '.ts' },\n 'video/mp4': { extension: '.mp4', preview: 'video' },\n 'video/mpeg': { extension: '.mpeg' },\n 'video/ogg': { extension: '.ogv' },\n 'video/webm': { extension: '.webm', preview: 'video' },\n 'video/x-msvideo': { extension: '.avi' },\n}\n\n/** Get the config for a media type */\nexport function getMediaTypeConfig(type: string): MediaConfig | undefined {\n const config = mediaTypes[type]\n if (config) {\n return config\n }\n\n // Fallback for +json types\n if (type.endsWith('+json')) {\n return {\n extension: '.json',\n raw: true,\n language: 'json',\n }\n }\n\n return undefined\n}\n","import MimeType from 'whatwg-mimetype'\n\nconst decodeURIComponentSafe = (str: string) => {\n try {\n return decodeURIComponent(str)\n } catch {\n return str\n }\n}\n\nfunction extractFilename(contentDisposition: string) {\n let filename = ''\n\n if (contentDisposition) {\n const fileNameMatch =\n contentDisposition.match(/filename\\*=UTF-8''([^;]+)/)?.[1] ??\n contentDisposition.match(/filename\\s*=\\s*\"?([^\";]+)\"?/)?.[1]\n\n if (fileNameMatch) {\n filename = decodeURIComponentSafe(fileNameMatch.trim())\n }\n }\n\n return filename\n}\n\nconst isBlob = (b: any): b is Blob => b instanceof Blob\n\nconst getResponseHeaders = (headers?: Record<string, string>) => {\n return headers\n ? Object.keys(headers).map((key) => ({\n name: key,\n value: headers[key] ?? '',\n }))\n : []\n}\n\nexport function processResponseBody({ data, headers }: { data: unknown; headers?: Record<string, string> }) {\n const responseHeaders = getResponseHeaders(headers)\n\n const contentType = responseHeaders.find((header) => header.name.toLowerCase() === 'content-type')\n const mimeType = contentType?.value ? new MimeType(contentType.value) : undefined\n const attachmentFilename = extractFilename(\n responseHeaders.find((header) => header.name.toLowerCase() === 'content-disposition')?.value ?? '',\n )\n\n const dataUrl = (() => {\n if (isBlob(data)) {\n return URL.createObjectURL(data)\n }\n if (typeof data === 'string') {\n return URL.createObjectURL(new Blob([data], { type: mimeType ? mimeType.toString() : undefined }))\n }\n if (data instanceof Object && Object.keys(data).length) {\n return URL.createObjectURL(\n new Blob([JSON.stringify(data)], {\n type: mimeType ? mimeType.toString() : undefined,\n }),\n )\n }\n return ''\n })()\n\n return { mimeType, attachmentFilename, dataUrl }\n}\n","<template>\n <div class=\"flex justify-center px-2 py-3\">\n <div class=\"text-c-3 p-2 text-sm\"><slot /></div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { ref, watch } from 'vue'\n\nimport { type MediaPreview } from '@/components/ResponseBody/helpers/media-types'\nimport ResponseBodyInfo from '@/components/ResponseBody/ResponseBodyInfo.vue'\n\nconst {\n src,\n type,\n mode,\n alpha = false,\n} = defineProps<{\n src: string\n type: string\n mode: MediaPreview\n alpha?: boolean | undefined\n}>()\n\nconst error = ref(false)\n\nwatch(\n () => src,\n () => {\n error.value = false\n },\n)\n</script>\n<template>\n <div\n v-if=\"!error && src\"\n class=\"flex justify-center overflow-auto rounded-b\"\n :class=\"{ 'bg-preview p-2': alpha }\">\n <img\n v-if=\"mode === 'image'\"\n class=\"h-full max-w-full\"\n :class=\"{ rounded: alpha }\"\n :src=\"src\"\n @error=\"error = true\" />\n <video\n v-else-if=\"mode === 'video'\"\n autoplay\n controls\n width=\"100%\"\n @error=\"error = true\">\n <source\n :src=\"src\"\n :type=\"type\" />\n </video>\n <audio\n v-else-if=\"mode === 'audio'\"\n class=\"my-12\"\n controls\n @error=\"error = true\">\n <source\n :src=\"src\"\n :type=\"type\" />\n </audio>\n <object\n v-else\n class=\"aspect-[4/3] w-full\"\n :data=\"src\"\n :type=\"type\"\n @error=\"error = true\" />\n </div>\n <ResponseBodyInfo v-else>Preview unavailable</ResponseBodyInfo>\n</template>\n<style scoped>\n.light-mode .bg-preview {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23000' fill-opacity='10%25'%3E%3Crect width='8' height='8' /%3E%3Crect x='8' y='8' width='8' height='8' /%3E%3C/svg%3E\");\n}\n.dark-mode .bg-preview {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23FFF' fill-opacity='10%25'%3E%3Crect width='8' height='8' /%3E%3Crect x='8' y='8' width='8' height='8' /%3E%3C/svg%3E\");\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ref, watch } from 'vue'\n\nimport { type MediaPreview } from '@/components/ResponseBody/helpers/media-types'\nimport ResponseBodyInfo from '@/components/ResponseBody/ResponseBodyInfo.vue'\n\nconst {\n src,\n type,\n mode,\n alpha = false,\n} = defineProps<{\n src: string\n type: string\n mode: MediaPreview\n alpha?: boolean | undefined\n}>()\n\nconst error = ref(false)\n\nwatch(\n () => src,\n () => {\n error.value = false\n },\n)\n</script>\n<template>\n <div\n v-if=\"!error && src\"\n class=\"flex justify-center overflow-auto rounded-b\"\n :class=\"{ 'bg-preview p-2': alpha }\">\n <img\n v-if=\"mode === 'image'\"\n class=\"h-full max-w-full\"\n :class=\"{ rounded: alpha }\"\n :src=\"src\"\n @error=\"error = true\" />\n <video\n v-else-if=\"mode === 'video'\"\n autoplay\n controls\n width=\"100%\"\n @error=\"error = true\">\n <source\n :src=\"src\"\n :type=\"type\" />\n </video>\n <audio\n v-else-if=\"mode === 'audio'\"\n class=\"my-12\"\n controls\n @error=\"error = true\">\n <source\n :src=\"src\"\n :type=\"type\" />\n </audio>\n <object\n v-else\n class=\"aspect-[4/3] w-full\"\n :data=\"src\"\n :type=\"type\"\n @error=\"error = true\" />\n </div>\n <ResponseBodyInfo v-else>Preview unavailable</ResponseBodyInfo>\n</template>\n<style scoped>\n.light-mode .bg-preview {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23000' fill-opacity='10%25'%3E%3Crect width='8' height='8' /%3E%3Crect x='8' y='8' width='8' height='8' /%3E%3C/svg%3E\");\n}\n.dark-mode .bg-preview {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23FFF' fill-opacity='10%25'%3E%3Crect width='8' height='8' /%3E%3Crect x='8' y='8' width='8' height='8' /%3E%3C/svg%3E\");\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ScalarCodeBlock } from '@scalar/components'\n\nconst props = defineProps<{\n content: any\n language: string\n}>()\n</script>\n\n<template>\n <ScalarCodeBlock\n class=\"codeBlock\"\n :content=\"props.content\"\n :lang=\"language\" />\n</template>\n","<script lang=\"ts\" setup>\nimport { ScalarCodeBlock } from '@scalar/components'\n\nconst props = defineProps<{\n content: any\n language: string\n}>()\n</script>\n\n<template>\n <ScalarCodeBlock\n class=\"codeBlock\"\n :content=\"props.content\"\n :lang=\"language\" />\n</template>\n","<script lang=\"ts\" setup>\nimport { watch } from 'vue'\nimport type MIMEType from 'whatwg-mimetype'\n\nimport { type MediaConfig } from '@/components/ResponseBody/helpers/media-types'\nimport ResponseBodyInfo from '@/components/ResponseBody/ResponseBodyInfo.vue'\nimport ResponseBodyPreview from '@/components/ResponseBody/ResponseBodyPreview.vue'\nimport ResponseBodyRaw from '@/components/ResponseBody/ResponseBodyRaw.vue'\n\nconst { data, responseBody, mediaConfig, display } = defineProps<{\n data: unknown\n responseBody: {\n mimeType?: MIMEType\n attachmentFilename: string\n dataUrl: string\n }\n mediaConfig?: MediaConfig\n display?: 'preview' | 'raw'\n}>()\n\nwatch(\n () => display,\n (v) => console.log(v),\n)\n</script>\n\n<template>\n <ResponseBodyRaw\n v-if=\"mediaConfig?.raw && display === 'raw' && mediaConfig.language\"\n :key=\"responseBody.dataUrl\"\n :content=\"data\"\n :language=\"mediaConfig.language\" />\n <ResponseBodyPreview\n v-if=\"mediaConfig?.preview && display === 'preview'\"\n :key=\"responseBody.dataUrl\"\n :alpha=\"mediaConfig.alpha\"\n :mode=\"mediaConfig.preview\"\n :src=\"responseBody.dataUrl\"\n :type=\"responseBody.mimeType?.essence ?? ''\" />\n <ResponseBodyInfo v-if=\"!mediaConfig?.raw && !mediaConfig?.preview\">\n Binary file\n </ResponseBodyInfo>\n</template>\n","<script lang=\"ts\" setup>\nimport { watch } from 'vue'\nimport type MIMEType from 'whatwg-mimetype'\n\nimport { type MediaConfig } from '@/components/ResponseBody/helpers/media-types'\nimport ResponseBodyInfo from '@/components/ResponseBody/ResponseBodyInfo.vue'\nimport ResponseBodyPreview from '@/components/ResponseBody/ResponseBodyPreview.vue'\nimport ResponseBodyRaw from '@/components/ResponseBody/ResponseBodyRaw.vue'\n\nconst { data, responseBody, mediaConfig, display } = defineProps<{\n data: unknown\n responseBody: {\n mimeType?: MIMEType\n attachmentFilename: string\n dataUrl: string\n }\n mediaConfig?: MediaConfig\n display?: 'preview' | 'raw'\n}>()\n\nwatch(\n () => display,\n (v) => console.log(v),\n)\n</script>\n\n<template>\n <ResponseBodyRaw\n v-if=\"mediaConfig?.raw && display === 'raw' && mediaConfig.language\"\n :key=\"responseBody.dataUrl\"\n :content=\"data\"\n :language=\"mediaConfig.language\" />\n <ResponseBodyPreview\n v-if=\"mediaConfig?.preview && display === 'preview'\"\n :key=\"responseBody.dataUrl\"\n :alpha=\"mediaConfig.alpha\"\n :mode=\"mediaConfig.preview\"\n :src=\"responseBody.dataUrl\"\n :type=\"responseBody.mimeType?.essence ?? ''\" />\n <ResponseBodyInfo v-if=\"!mediaConfig?.raw && !mediaConfig?.preview\">\n Binary file\n </ResponseBodyInfo>\n</template>\n","<script lang=\"ts\" setup>\ndefineProps<{\n modelValue?: 'preview' | 'raw'\n}>()\n\nconst emit = defineEmits<{\n (e: 'toggle', v: 'preview' | 'raw'): void\n}>()\n</script>\n<template>\n <div\n class=\"text-c-3 text-xxs -my-1 flex justify-center gap-0.5 rounded p-0.5\">\n <button\n class=\"hover:bg-b-3 rounded px-1\"\n :class=\"{ 'bg-b-3 text-c-1 cursor-default': modelValue === 'preview' }\"\n type=\"button\"\n @click.stop=\"emit('toggle', 'preview')\">\n Preview\n </button>\n <button\n class=\"hover:bg-b-3 rounded px-1\"\n :class=\"{ 'bg-b-3 text-c-1 cursor-default': modelValue === 'raw' }\"\n type=\"button\"\n @click.stop=\"emit('toggle', 'raw')\">\n Raw\n </button>\n </div>\n</template>\n","<script lang=\"ts\" setup>\ndefineProps<{\n modelValue?: 'preview' | 'raw'\n}>()\n\nconst emit = defineEmits<{\n (e: 'toggle', v: 'preview' | 'raw'): void\n}>()\n</script>\n<template>\n <div\n class=\"text-c-3 text-xxs -my-1 flex justify-center gap-0.5 rounded p-0.5\">\n <button\n class=\"hover:bg-b-3 rounded px-1\"\n :class=\"{ 'bg-b-3 text-c-1 cursor-default': modelValue === 'preview' }\"\n type=\"button\"\n @click.stop=\"emit('toggle', 'preview')\">\n Preview\n </button>\n <button\n class=\"hover:bg-b-3 rounded px-1\"\n :class=\"{ 'bg-b-3 text-c-1 cursor-default': modelValue === 'raw' }\"\n type=\"button\"\n @click.stop=\"emit('toggle', 'raw')\">\n Raw\n </button>\n </div>\n</template>\n","<template>\n <div class=\"sendingRequest\">\n <div class=\"playIcon\">\n <svg\n fill=\"currentColor\"\n height=\"32\"\n viewBox=\"0 0 256 256\"\n width=\"32\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M240,128a15.74,15.74,0,0,1-7.6,13.51L88.32,229.65a16,16,0,0,1-16.2.3A15.86,15.86,0,0,1,64,216.13V39.87a15.86,15.86,0,0,1,8.12-13.82,16,16,0,0,1,16.2.3L232.4,114.49A15.74,15.74,0,0,1,240,128Z\"></path>\n </svg>\n </div>\n Sending Request to Endpoint\n </div>\n</template>\n\n<style scoped>\n.playIcon {\n padding: 4px;\n height: 16px;\n width: 16px;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n background: var(--scalar-background-1);\n border-radius: 50%;\n}\n\n.playIcon::before {\n content: '';\n width: 16px;\n height: 16px;\n display: inline-block;\n box-sizing: border-box;\n position: absolute;\n border-width: 1.75px;\n border-style: solid;\n border-color: currentcolor currentcolor transparent;\n border-image: initial;\n border-radius: 50%;\n background: var(--scalar-background-1);\n animation: 0.42s linear 0s infinite normal none running rotation;\n}\n\n.sendingRequest {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--scalar-color-blue);\n font-weight: var(--scalar-semibold);\n min-height: 40px;\n font-size: var(--scalar-font-size-3);\n position: relative;\n}\n\n.sendingRequest svg {\n width: 100%;\n height: 100%;\n z-index: 1;\n border-radius: 50%;\n}\n\n@keyframes rotation {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ScalarCodeBlock } from '@scalar/components'\nimport { ScalarIconCaretDown, ScalarIconCaretRight } from '@scalar/icons'\nimport { type DeepPartial } from 'ai'\nimport { computed, ref } from 'vue'\n\nimport AutosendPaused from '@/components/AutosendPaused.vue'\nimport BuildingRequest from '@/components/BuildingRequest.vue'\nimport RequestApproved from '@/components/RequestApproved.vue'\nimport RequestFailed from '@/components/RequestFailed.vue'\nimport RequestRejected from '@/components/RequestRejected.vue'\nimport RequestSuccess from '@/components/RequestSuccess.vue'\nimport { getMediaTypeConfig } from '@/components/ResponseBody/helpers/media-types'\nimport { processResponseBody } from '@/components/ResponseBody/helpers/process-response-body'\nimport ResponseBody from '@/components/ResponseBody/ResponseBody.vue'\nimport ResponseBodyToggle from '@/components/ResponseBody/ResponseBodyToggle.vue'\nimport SendingRequest from '@/components/SendingRequest.vue'\nimport type {\n ExecuteClientSideRequestToolInput,\n ExecuteClientSideRequestToolOutput,\n} from '@/entities/tools/execute-request'\n\nconst { request, response, state } = defineProps<{\n request?:\n | ExecuteClientSideRequestToolInput\n | DeepPartial<ExecuteClientSideRequestToolInput>\n response?: ExecuteClientSideRequestToolOutput\n state:\n | 'requiresApproval'\n | 'sendingRequest'\n | 'requestSucceeded'\n | 'requestFailed'\n | 'approved'\n | 'rejected'\n | 'buildingRequest'\n}>()\n\nconst responseData = computed(() => {\n if (response?.success) {\n return {\n data: response.data.responseBody,\n headers: response.data.headers,\n }\n }\n\n if (response?.error?.code === 'REQUEST_NOT_OK') {\n return {\n data: response.error.detail.responseBody,\n headers: response.error.detail.headers,\n }\n }\n\n return undefined\n})\n\nconst showRequestToggle = ref(false)\n\n/** Show request preview automatically for failed requests or when approval is required. */\nconst shouldShowRequest = computed(() => {\n if (state === 'requestFailed' || state === 'requiresApproval') {\n return true\n }\n return showRequestToggle.value\n})\n\nconst responseBody = computed(() =>\n processResponseBody({\n data: responseData.value?.data,\n headers: responseData.value?.headers,\n }),\n)\n\nconst mediaConfig = computed(() =>\n getMediaTypeConfig(responseBody.value.mimeType?.essence ?? ''),\n)\n\nconst displayToggle = ref<'preview' | 'raw'>()\nfunction toggleDisplay(mode: 'preview' | 'raw') {\n displayToggle.value = mode\n}\n\nconst displayMode = computed(() => {\n if (displayToggle.value) return displayToggle.value\n\n if (mediaConfig.value?.raw && !mediaConfig.value.preview) return 'raw'\n if (mediaConfig.value?.preview) return 'preview'\n\n return 'raw'\n})\n</script>\n\n<template>\n <div\n class=\"requestPreview\"\n :class=\"{\n open: shouldShowRequest,\n succeeded: state === 'requestSucceeded',\n }\">\n <RequestApproved v-if=\"state === 'approved'\" />\n <div\n v-else-if=\"state === 'buildingRequest'\"\n class=\"autosendContainer\">\n <BuildingRequest />\n </div>\n <div\n v-else-if=\"state === 'requiresApproval'\"\n class=\"autosendContainer\">\n <AutosendPaused />\n </div>\n <button\n v-else-if=\"state === 'sendingRequest'\"\n class=\"toggleButton\"\n type=\"button\"\n @click=\"showRequestToggle = !showRequestToggle\">\n <SendingRequest />\n\n <ScalarIconCaretDown v-if=\"shouldShowRequest\" />\n <ScalarIconCaretRight v-else />\n </button>\n <button\n v-else-if=\"state === 'requestSucceeded'\"\n class=\"toggleButton\"\n type=\"button\"\n @click=\"showRequestToggle = !showRequestToggle\">\n <RequestSuccess />\n\n <ScalarIconCaretDown v-if=\"shouldShowRequest\" />\n <ScalarIconCaretRight v-else />\n </button>\n <button\n v-else-if=\"state === 'rejected'\"\n class=\"toggleButton\"\n type=\"button\"\n @click=\"showRequestToggle = !showRequestToggle\">\n <RequestRejected />\n\n <ScalarIconCaretDown v-if=\"shouldShowRequest\" />\n <ScalarIconCaretRight v-else />\n </button>\n <RequestFailed v-else-if=\"state === 'requestFailed'\" />\n <div class=\"requestContent\">\n <div class=\"requestContentInner\">\n <div\n v-if=\"request\"\n class=\"code\">\n <div class=\"requestHeaderContainer\">\n <h1>Request</h1>\n </div>\n <ScalarCodeBlock\n class=\"codeBlock\"\n :content=\"JSON.stringify(request, null, 2)\"\n lang=\"json\" />\n </div>\n <div\n v-if=\"responseData\"\n class=\"code\">\n <div class=\"requestHeaderContainer\">\n <h1>Response</h1>\n <ResponseBodyToggle\n v-if=\"mediaConfig?.raw && mediaConfig.preview\"\n v-model=\"displayMode\"\n @toggle=\"toggleDisplay\" />\n </div>\n <ResponseBody\n :data=\"responseData.data\"\n :display=\"displayMode\"\n :mediaConfig=\"mediaConfig\"\n :responseBody=\"responseBody\" />\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.requestHeaderContainer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 5px;\n}\n\n.requestPreview {\n border-radius: 12px;\n display: flex;\n flex-direction: column;\n width: 100%;\n position: relative;\n}\n\n.requestContent {\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}\n\n.requestPreview.open .requestContent {\n grid-template-rows: 1fr;\n}\n.requestPreview.succeeded {\n padding: 0;\n}\n\n.requestContentInner {\n min-height: 0;\n overflow: hidden;\n}\n.code {\n display: flex;\n flex-direction: column;\n font-size: var(--scalar-font-size-4);\n border-radius: 12px;\n background: color-mix(\n in srgb,\n var(--scalar-background-2),\n var(--scalar-background-1)\n );\n overflow: hidden;\n margin-bottom: 12px;\n}\n.dark-mode .code {\n background: var(--scalar-background-2);\n}\n.code h1 {\n font-size: var(--scalar-font-size-3);\n color: var(--scalar-color-3);\n padding: 8px;\n}\n.code :deep(.codeBlock) {\n max-height: calc(50vh - 100px);\n padding-top: 0;\n}\n.autosendContainer {\n display: flex;\n justify-content: space-between;\n}\n\n.sendButton {\n background: var(--scalar-color-blue);\n color: white;\n font-weight: var(--scalar-semibold);\n padding: 5px 10px;\n}\n.sendButton:hover,\n.sendButton:active {\n background: color-mix(in srgb, var(--scalar-color-blue), black 10%);\n color: white !important;\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.toggleButton:hover {\n text-decoration: underline;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ScalarCodeBlock } from '@scalar/components'\nimport { ScalarIconCaretDown, ScalarIconCaretRight } from '@scalar/icons'\nimport { type DeepPartial } from 'ai'\nimport { computed, ref } from 'vue'\n\nimport AutosendPaused from '@/components/AutosendPaused.vue'\nimport BuildingRequest from '@/components/BuildingRequest.vue'\nimport RequestApproved from '@/components/RequestApproved.vue'\nimport RequestFailed from '@/components/RequestFailed.vue'\nimport RequestRejected from '@/components/RequestRejected.vue'\nimport RequestSuccess from '@/components/RequestSuccess.vue'\nimport { getMediaTypeConfig } from '@/components/ResponseBody/helpers/media-types'\nimport { processResponseBody } from '@/components/ResponseBody/helpers/process-response-body'\nimport ResponseBody from '@/components/ResponseBody/ResponseBody.vue'\nimport ResponseBodyToggle from '@/components/ResponseBody/ResponseBodyToggle.vue'\nimport SendingRequest from '@/components/SendingRequest.vue'\nimport type {\n ExecuteClientSideRequestToolInput,\n ExecuteClientSideRequestToolOutput,\n} from '@/entities/tools/execute-request'\n\nconst { request, response, state } = defineProps<{\n request?:\n | ExecuteClientSideRequestToolInput\n | DeepPartial<ExecuteClientSideRequestToolInput>\n response?: ExecuteClientSideRequestToolOutput\n state:\n | 'requiresApproval'\n | 'sendingRequest'\n | 'requestSucceeded'\n | 'requestFailed'\n | 'approved'\n | 'rejected'\n | 'buildingRequest'\n}>()\n\nconst responseData = computed(() => {\n if (response?.success) {\n return {\n data: response.data.responseBody,\n headers: response.data.headers,\n }\n }\n\n if (response?.error?.code === 'REQUEST_NOT_OK') {\n return {\n data: response.error.detail.responseBody,\n headers: response.error.detail.headers,\n }\n }\n\n return undefined\n})\n\nconst showRequestToggle = ref(false)\n\n/** Show request preview automatically for failed requests or when approval is required. */\nconst shouldShowRequest = computed(() => {\n if (state === 'requestFailed' || state === 'requiresApproval') {\n return true\n }\n return showRequestToggle.value\n})\n\nconst responseBody = computed(() =>\n processResponseBody({\n data: responseData.value?.data,\n headers: responseData.value?.headers,\n }),\n)\n\nconst mediaConfig = computed(() =>\n getMediaTypeConfig(responseBody.value.mimeType?.essence ?? ''),\n)\n\nconst displayToggle = ref<'preview' | 'raw'>()\nfunction toggleDisplay(mode: 'preview' | 'raw') {\n displayToggle.value = mode\n}\n\nconst displayMode = computed(() => {\n if (displayToggle.value) return displayToggle.value\n\n if (mediaConfig.value?.raw && !mediaConfig.value.preview) return 'raw'\n if (mediaConfig.value?.preview) return 'preview'\n\n return 'raw'\n})\n</script>\n\n<template>\n <div\n class=\"requestPreview\"\n :class=\"{\n open: shouldShowRequest,\n succeeded: state === 'requestSucceeded',\n }\">\n <RequestApproved v-if=\"state === 'approved'\" />\n <div\n v-else-if=\"state === 'buildingRequest'\"\n class=\"autosendContainer\">\n <BuildingRequest />\n </div>\n <div\n v-else-if=\"state === 'requiresApproval'\"\n class=\"autosendContainer\">\n <AutosendPaused />\n </div>\n <button\n v-else-if=\"state === 'sendingRequest'\"\n class=\"toggleButton\"\n type=\"button\"\n @click=\"showRequestToggle = !showRequestToggle\">\n <SendingRequest />\n\n <ScalarIconCaretDown v-if=\"shouldShowRequest\" />\n <ScalarIconCaretRight v-else />\n </button>\n <button\n v-else-if=\"state === 'requestSucceeded'\"\n class=\"toggleButton\"\n type=\"button\"\n @click=\"showRequestToggle = !showRequestToggle\">\n <RequestSuccess />\n\n <ScalarIconCaretDown v-if=\"shouldShowRequest\" />\n <ScalarIconCaretRight v-else />\n </button>\n <button\n v-else-if=\"state === 'rejected'\"\n class=\"toggleButton\"\n type=\"button\"\n @click=\"showRequestToggle = !showRequestToggle\">\n <RequestRejected />\n\n <ScalarIconCaretDown v-if=\"shouldShowRequest\" />\n <ScalarIconCaretRight v-else />\n </button>\n <RequestFailed v-else-if=\"state === 'requestFailed'\" />\n <div class=\"requestContent\">\n <div class=\"requestContentInner\">\n <div\n v-if=\"request\"\n class=\"code\">\n <div class=\"requestHeaderContainer\">\n <h1>Request</h1>\n </div>\n <ScalarCodeBlock\n class=\"codeBlock\"\n :content=\"JSON.stringify(request, null, 2)\"\n lang=\"json\" />\n </div>\n <div\n v-if=\"responseData\"\n class=\"code\">\n <div class=\"requestHeaderContainer\">\n <h1>Response</h1>\n <ResponseBodyToggle\n v-if=\"mediaConfig?.raw && mediaConfig.preview\"\n v-model=\"displayMode\"\n @toggle=\"toggleDisplay\" />\n </div>\n <ResponseBody\n :data=\"responseData.data\"\n :display=\"displayMode\"\n :mediaConfig=\"mediaConfig\"\n :responseBody=\"responseBody\" />\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.requestHeaderContainer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 5px;\n}\n\n.requestPreview {\n border-radius: 12px;\n display: flex;\n flex-direction: column;\n width: 100%;\n position: relative;\n}\n\n.requestContent {\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}\n\n.requestPreview.open .requestContent {\n grid-template-rows: 1fr;\n}\n.requestPreview.succeeded {\n padding: 0;\n}\n\n.requestContentInner {\n min-height: 0;\n overflow: hidden;\n}\n.code {\n display: flex;\n flex-direction: column;\n font-size: var(--scalar-font-size-4);\n border-radius: 12px;\n background: color-mix(\n in srgb,\n var(--scalar-background-2),\n var(--scalar-background-1)\n );\n overflow: hidden;\n margin-bottom: 12px;\n}\n.dark-mode .code {\n background: var(--scalar-background-2);\n}\n.code h1 {\n font-size: var(--scalar-font-size-3);\n color: var(--scalar-color-3);\n padding: 8px;\n}\n.code :deep(.codeBlock) {\n max-height: calc(50vh - 100px);\n padding-top: 0;\n}\n.autosendContainer {\n display: flex;\n justify-content: space-between;\n}\n\n.sendButton {\n background: var(--scalar-color-blue);\n color: white;\n font-weight: var(--scalar-semibold);\n padding: 5px 10px;\n}\n.sendButton:hover,\n.sendButton:active {\n background: color-mix(in srgb, var(--scalar-color-blue), black 10%);\n color: white !important;\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.toggleButton:hover {\n text-decoration: underline;\n}\n</style>\n","import type { ToolUIPart, UIMessagePart } from 'ai'\nimport { computed } from 'vue'\n\nimport { executeRequestTool } from '@/client-tools/execute-request'\nimport { EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME } from '@/entities'\nimport { createDocumentSettings } from '@/helpers'\nimport { type Tools, useState } from '@/state/state'\n\ntype RequestToolPart = ToolUIPart & {\n type: 'tool-execute-request'\n state: 'input-available'\n input: Tools['execute-request']['input']\n}\n\nexport function requestPartRequiresApproval(part: UIMessagePart<any, Tools>): part is RequestToolPart {\n return (\n part.type === (`tool-${EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME}` as const) &&\n part.state === 'input-available' &&\n part.input?.method?.toLowerCase() !== 'get'\n )\n}\n\nexport function useRequestApprovals() {\n const state = useState()\n\n const approvalRequiredParts = computed(() => {\n return state.chat.messages\n .filter((message) => message.parts.some(requestPartRequiresApproval))\n .flatMap((message) => message.parts)\n .filter(requestPartRequiresApproval) as RequestToolPart[]\n })\n\n async function respondToRequestApprovals(approved: boolean) {\n const approvalPromises = approvalRequiredParts.value.map(async (toolPart) => {\n if (!approved) {\n return await state.chat.addToolOutput({\n tool: EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME,\n toolCallId: toolPart.toolCallId,\n state: 'output-error',\n errorText: 'The user denied the request.',\n })\n }\n\n await executeRequestTool({\n documentSettings: createDocumentSettings(state.workspaceStore),\n proxyUrl: state.proxyUrl.value,\n input: toolPart.input,\n toolCallId: toolPart.toolCallId,\n chat: state.chat,\n })\n })\n\n await Promise.all(approvalPromises)\n }\n\n return { approvalRequiredParts, respondToRequestApprovals }\n}\n","<script setup lang=\"ts\">\nimport { type ToolUIPart } from 'ai'\nimport { computed, type Ref } from 'vue'\n\nimport RequestPreview from '@/components/RequestPreview.vue'\nimport type { EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME } from '@/entities/tools/execute-request'\nimport { requestPartRequiresApproval } from '@/hooks/use-chat-approvals'\nimport { useState, type Tools } from '@/state/state'\n\nconst { messagePart } = defineProps<{\n messagePart: Ref<\n ToolUIPart<Pick<Tools, typeof EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME>>\n >\n}>()\n\nconst state = useState()\n\nconst requestState = computed(() => {\n if (messagePart.value.state === 'input-streaming') {\n return 'buildingRequest'\n }\n\n if (\n messagePart.value.state === 'approval-responded' &&\n state.chat.status === 'submitted'\n ) {\n return 'sendingRequest'\n }\n\n if (requestPartRequiresApproval(messagePart.value)) {\n return 'requiresApproval'\n }\n\n if (messagePart.value.state === 'output-available') {\n return messagePart.value.output.success\n ? 'requestSucceeded'\n : 'requestFailed'\n }\n\n if (messagePart.value.state === 'output-error') {\n return 'rejected'\n }\n\n return null\n})\n</script>\n\n<template>\n <div class=\"executeRequestTool\">\n <RequestPreview\n v-if=\"requestState\"\n :request=\"messagePart.value.input\"\n :response=\"messagePart.value.output\"\n :state=\"requestState\" />\n </div>\n</template>\n\n<style scoped>\n.executeRequestTool {\n display: flex;\n flex-direction: column;\n gap: 10px;\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 /* ensures no overlapping border colors when there's two sibling execute request tools */\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}\n.tool {\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n padding: 15px;\n border-radius: 15px;\n margin-bottom: 20px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { type ToolUIPart } from 'ai'\nimport { computed, type Ref } from 'vue'\n\nimport RequestPreview from '@/components/RequestPreview.vue'\nimport type { EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME } from '@/entities/tools/execute-request'\nimport { requestPartRequiresApproval } from '@/hooks/use-chat-approvals'\nimport { useState, type Tools } from '@/state/state'\n\nconst { messagePart } = defineProps<{\n messagePart: Ref<\n ToolUIPart<Pick<Tools, typeof EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME>>\n >\n}>()\n\nconst state = useState()\n\nconst requestState = computed(() => {\n if (messagePart.value.state === 'input-streaming') {\n return 'buildingRequest'\n }\n\n if (\n messagePart.value.state === 'approval-responded' &&\n state.chat.status === 'submitted'\n ) {\n return 'sendingRequest'\n }\n\n if (requestPartRequiresApproval(messagePart.value)) {\n return 'requiresApproval'\n }\n\n if (messagePart.value.state === 'output-available') {\n return messagePart.value.output.success\n ? 'requestSucceeded'\n : 'requestFailed'\n }\n\n if (messagePart.value.state === 'output-error') {\n return 'rejected'\n }\n\n return null\n})\n</script>\n\n<template>\n <div class=\"executeRequestTool\">\n <RequestPreview\n v-if=\"requestState\"\n :request=\"messagePart.value.input\"\n :response=\"messagePart.value.output\"\n :state=\"requestState\" />\n </div>\n</template>\n\n<style scoped>\n.executeRequestTool {\n display: flex;\n flex-direction: column;\n gap: 10px;\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 /* ensures no overlapping border colors when there's two sibling execute request tools */\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}\n.tool {\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n padding: 15px;\n border-radius: 15px;\n margin-bottom: 20px;\n}\n</style>\n","<script setup lang=\"ts\">\nconst { loading } = defineProps<{ loading: boolean }>()\n</script>\n\n<template>\n <div\n class=\"contextItem\"\n :class=\"{\n shimmer: loading,\n }\">\n <slot />\n </div>\n</template>\n\n<style scoped>\n.contextItem {\n font-size: 10px;\n display: inline-block;\n color: var(--scalar-color-2);\n cursor: pointer;\n vertical-align: middle;\n padding: 1px 8px;\n border-radius: 12px;\n padding: 5px 10px;\n display: flex;\n align-items: center;\n background: color-mix(\n in srgb,\n var(--scalar-background-2),\n var(--scalar-background-1)\n );\n}\n\n.shimmer {\n background: var(--scalar-background-2);\n background-image: linear-gradient(\n 90deg,\n #202020 0%,\n var(--scalar-background-2) 40%,\n var(--scalar-background-3) 80%\n );\n background-size: 200% 100%;\n animation: shimmer 1.4s ease-in-out infinite;\n}\n\n.light-mode .shimmer {\n background: var(--scalar-background-2);\n background-image: linear-gradient(\n 90deg,\n #fafafa 0%,\n var(--scalar-background-2) 40%,\n var(--scalar-background-3) 80%\n );\n background-size: 200% 100%;\n animation: shimmer 1.4s ease-in-out infinite;\n}\n\n@keyframes shimmer {\n 0% {\n background-position: 200% 0;\n }\n 100% {\n background-position: -200% 0;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nconst { loading } = defineProps<{ loading: boolean }>()\n</script>\n\n<template>\n <div\n class=\"contextItem\"\n :class=\"{\n shimmer: loading,\n }\">\n <slot />\n </div>\n</template>\n\n<style scoped>\n.contextItem {\n font-size: 10px;\n display: inline-block;\n color: var(--scalar-color-2);\n cursor: pointer;\n vertical-align: middle;\n padding: 1px 8px;\n border-radius: 12px;\n padding: 5px 10px;\n display: flex;\n align-items: center;\n background: color-mix(\n in srgb,\n var(--scalar-background-2),\n var(--scalar-background-1)\n );\n}\n\n.shimmer {\n background: var(--scalar-background-2);\n background-image: linear-gradient(\n 90deg,\n #202020 0%,\n var(--scalar-background-2) 40%,\n var(--scalar-background-3) 80%\n );\n background-size: 200% 100%;\n animation: shimmer 1.4s ease-in-out infinite;\n}\n\n.light-mode .shimmer {\n background: var(--scalar-background-2);\n background-image: linear-gradient(\n 90deg,\n #fafafa 0%,\n var(--scalar-background-2) 40%,\n var(--scalar-background-3) 80%\n );\n background-size: 200% 100%;\n animation: shimmer 1.4s ease-in-out infinite;\n}\n\n@keyframes shimmer {\n 0% {\n background-position: 200% 0;\n }\n 100% {\n background-position: -200% 0;\n }\n}\n</style>\n","<template>\n <div class=\"sendingRequest\">\n <div class=\"playIcon\"></div>\n Retrieving relevant information...\n </div>\n</template>\n\n<style scoped>\n.playIcon {\n padding: 4px;\n height: 16px;\n width: 16px;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n background: var(--scalar-background-1);\n border-radius: 50%;\n}\n\n.playIcon::before {\n content: '';\n width: 16px;\n height: 16px;\n display: inline-block;\n box-sizing: border-box;\n position: absolute;\n border-width: 1.5px;\n border-style: solid;\n border-color: currentcolor currentcolor transparent;\n border-image: initial;\n border-radius: 50%;\n background: var(--scalar-background-1);\n animation: 0.42s linear 0s infinite normal none running rotation;\n}\n\n.sendingRequest {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--scalar-color-2);\n font-weight: var(--scalar-semibold);\n font-size: var(--scalar-font-size-3);\n margin-bottom: 10px;\n}\n\n.sendingRequest svg {\n width: 100%;\n height: 100%;\n z-index: 1;\n border-radius: 50%;\n}\n\n@keyframes rotation {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { type ToolUIPart, type UIMessage } from 'ai'\nimport { computed, ref, watch, type Reactive, type Ref } from 'vue'\n\nimport ContextItem from '@/components/ContextItem.vue'\nimport LoadingMiniOpenAPIDoc from '@/components/LoadingMiniOpenAPIDoc.vue'\nimport type { GET_MINI_OPENAPI_SPEC_TOOL_NAME } from '@/entities/tools/get-mini-openapi-spec'\nimport { getOperations } from '@/helpers'\nimport { useState, type Tools } from '@/state/state'\n\nconst { messagePart, message } = defineProps<{\n messagePart: Ref<\n ToolUIPart<Pick<Tools, typeof GET_MINI_OPENAPI_SPEC_TOOL_NAME>>\n >\n message: Reactive<UIMessage>\n}>()\n\nconst messageFinished = ref(false)\n\nwatch(\n () => message,\n () => {\n const parts = message.parts\n\n const index = parts.findIndex(\n (part) =>\n 'toolCallId' in part &&\n part.toolCallId === messagePart.value.toolCallId,\n )\n\n messageFinished.value = Boolean(parts[index + 1])\n },\n)\n\nconst operations = computed(() => {\n if (!messagePart.value.output?.structuredContent) {\n return\n }\n\n const title = messagePart.value.output?.structuredContent?.info?.title\n\n const documentOperations = getOperations(\n messagePart.value.output?.structuredContent,\n )\n\n return documentOperations\n .map(\n (operation) => `${title ? `${title} - ` : ''}${operation.summary ?? ''}`,\n )\n .filter(Boolean)\n})\n\nconst state = useState()\n</script>\n\n<template>\n <div\n v-if=\"\n messagePart.value.state === 'input-available' &&\n state.chat.status === 'streaming'\n \">\n <LoadingMiniOpenAPIDoc />\n </div>\n <div\n v-if=\"operations\"\n class=\"operations\">\n <ContextItem\n v-for=\"operation of operations\"\n :key=\"operation\"\n :loading=\"!messageFinished\">\n {{ operation }}\n </ContextItem>\n </div>\n</template>\n\n<style scoped>\n.operations {\n display: flex;\n gap: 5px;\n align-items: center;\n margin-bottom: 12px;\n}\n.operations:empty {\n margin-bottom: -12px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { type ToolUIPart, type UIMessage } from 'ai'\nimport { computed, ref, watch, type Reactive, type Ref } from 'vue'\n\nimport ContextItem from '@/components/ContextItem.vue'\nimport LoadingMiniOpenAPIDoc from '@/components/LoadingMiniOpenAPIDoc.vue'\nimport type { GET_MINI_OPENAPI_SPEC_TOOL_NAME } from '@/entities/tools/get-mini-openapi-spec'\nimport { getOperations } from '@/helpers'\nimport { useState, type Tools } from '@/state/state'\n\nconst { messagePart, message } = defineProps<{\n messagePart: Ref<\n ToolUIPart<Pick<Tools, typeof GET_MINI_OPENAPI_SPEC_TOOL_NAME>>\n >\n message: Reactive<UIMessage>\n}>()\n\nconst messageFinished = ref(false)\n\nwatch(\n () => message,\n () => {\n const parts = message.parts\n\n const index = parts.findIndex(\n (part) =>\n 'toolCallId' in part &&\n part.toolCallId === messagePart.value.toolCallId,\n )\n\n messageFinished.value = Boolean(parts[index + 1])\n },\n)\n\nconst operations = computed(() => {\n if (!messagePart.value.output?.structuredContent) {\n return\n }\n\n const title = messagePart.value.output?.structuredContent?.info?.title\n\n const documentOperations = getOperations(\n messagePart.value.output?.structuredContent,\n )\n\n return documentOperations\n .map(\n (operation) => `${title ? `${title} - ` : ''}${operation.summary ?? ''}`,\n )\n .filter(Boolean)\n})\n\nconst state = useState()\n</script>\n\n<template>\n <div\n v-if=\"\n messagePart.value.state === 'input-available' &&\n state.chat.status === 'streaming'\n \">\n <LoadingMiniOpenAPIDoc />\n </div>\n <div\n v-if=\"operations\"\n class=\"operations\">\n <ContextItem\n v-for=\"operation of operations\"\n :key=\"operation\"\n :loading=\"!messageFinished\">\n {{ operation }}\n </ContextItem>\n </div>\n</template>\n\n<style scoped>\n.operations {\n display: flex;\n gap: 5px;\n align-items: center;\n margin-bottom: 12px;\n}\n.operations:empty {\n margin-bottom: -12px;\n}\n</style>\n","<template>\n <div class=\"loadingApiSpecs\">\n <div class=\"playIcon\"></div>\n Loading APIs...\n </div>\n</template>\n\n<style scoped>\n.playIcon {\n padding: 4px;\n height: 16px;\n width: 16px;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n background: var(--scalar-background-1);\n border-radius: 50%;\n}\n\n.playIcon::before {\n content: '';\n width: 16px;\n height: 16px;\n display: inline-block;\n box-sizing: border-box;\n position: absolute;\n border-width: 1.5px;\n border-style: solid;\n border-color: currentcolor currentcolor transparent;\n border-image: initial;\n border-radius: 50%;\n background: var(--scalar-background-1);\n animation: 0.42s linear 0s infinite normal none running rotation;\n}\n\n.loadingApiSpecs {\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--scalar-color-2);\n font-weight: var(--scalar-semibold);\n font-size: var(--scalar-font-size-3);\n margin-bottom: 10px;\n}\n\n.loadingApiSpecs svg {\n width: 100%;\n height: 100%;\n z-index: 1;\n border-radius: 50%;\n}\n\n@keyframes rotation {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { ToolUIPart, UIMessage } from 'ai'\nimport { ref, watch, type Reactive, type Ref } from 'vue'\n\nimport LoadingOpenAPISpecsSummary from '@/components/LoadingOpenAPISpecsSummary.vue'\nimport type { GET_OPENAPI_SPECS_SUMMARY_TOOL_NAME } from '@/entities/tools/get-openapi-spec-summary'\nimport { type Tools } from '@/state/state'\n\nconst { messagePart, message } = defineProps<{\n messagePart: Ref<\n ToolUIPart<Pick<Tools, typeof GET_OPENAPI_SPECS_SUMMARY_TOOL_NAME>>\n >\n message: Reactive<UIMessage>\n}>()\n\nconst messageFinished = ref(false)\n\nwatch(\n () => message,\n () => {\n const parts = message.parts\n\n const index = parts.findIndex(\n (part) =>\n 'toolCallId' in part &&\n part.toolCallId === messagePart.value.toolCallId,\n )\n\n messageFinished.value = Boolean(parts[index + 1])\n },\n)\n</script>\n\n<template>\n <div v-if=\"!messageFinished\">\n <LoadingOpenAPISpecsSummary />\n </div>\n</template>\n\n<style scoped></style>\n","<script setup lang=\"ts\">\nimport type { ToolUIPart, UIMessage } from 'ai'\nimport { ref, watch, type Reactive, type Ref } from 'vue'\n\nimport LoadingOpenAPISpecsSummary from '@/components/LoadingOpenAPISpecsSummary.vue'\nimport type { GET_OPENAPI_SPECS_SUMMARY_TOOL_NAME } from '@/entities/tools/get-openapi-spec-summary'\nimport { type Tools } from '@/state/state'\n\nconst { messagePart, message } = defineProps<{\n messagePart: Ref<\n ToolUIPart<Pick<Tools, typeof GET_OPENAPI_SPECS_SUMMARY_TOOL_NAME>>\n >\n message: Reactive<UIMessage>\n}>()\n\nconst messageFinished = ref(false)\n\nwatch(\n () => message,\n () => {\n const parts = message.parts\n\n const index = parts.findIndex(\n (part) =>\n 'toolCallId' in part &&\n part.toolCallId === messagePart.value.toolCallId,\n )\n\n messageFinished.value = Boolean(parts[index + 1])\n },\n)\n</script>\n\n<template>\n <div v-if=\"!messageFinished\">\n <LoadingOpenAPISpecsSummary />\n </div>\n</template>\n\n<style scoped></style>\n","<script setup lang=\"ts\">\nimport { ScalarMarkdown } from '@scalar/components'\nimport { type TextUIPart } from 'ai'\nimport { type Ref } from 'vue'\n\nconst { messagePart } = defineProps<{\n messagePart: Ref<TextUIPart>\n}>()\n</script>\n\n<template>\n <ScalarMarkdown :value=\"messagePart.value.text\" />\n</template>\n","<script setup lang=\"ts\">\nimport { ScalarMarkdown } from '@scalar/components'\nimport { type TextUIPart } from 'ai'\nimport { type Ref } from 'vue'\n\nconst { messagePart } = defineProps<{\n messagePart: Ref<TextUIPart>\n}>()\n</script>\n\n<template>\n <ScalarMarkdown :value=\"messagePart.value.text\" />\n</template>\n","import { useDebounceFn } from '@vueuse/core'\nimport { computed, ref } from 'vue'\n\nimport type { ApiMetadata } from '@/entities/registry/document'\nimport { useState } from '@/state/state'\n\nexport function useSearch() {\n const { api } = useState()\n\n const queryRef = ref('')\n\n const search = useDebounceFn(async (q) => {\n const searchResponse = await api.search(q)\n\n if (!searchResponse.success) {\n return\n }\n\n results.value = searchResponse.data.results\n }, 200)\n\n const query = computed({\n get: () => {\n return queryRef.value\n },\n set: (v) => {\n search(v)\n queryRef.value = v\n },\n })\n\n const results = ref<ApiMetadata[]>([])\n\n search('')\n\n return {\n query,\n results,\n }\n}\n","<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","<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","<script setup lang=\"ts\">\nimport {\n ScalarDropdown,\n ScalarDropdownItem,\n useModal,\n} from '@scalar/components'\nimport { ScalarIconMagnifyingGlass, ScalarIconUpload } from '@scalar/icons'\n\nimport Catalog from '@/views/Catalog/Catalog.vue'\n\ndefineEmits<{\n (e: 'uploadApi'): void\n}>()\n\nconst catalogModal = useModal()\n</script>\n\n<template>\n <ScalarDropdown :offset=\"{ crossAxis: -5, mainAxis: 5 }\">\n <slot />\n\n <template #items>\n <ScalarDropdownItem @click=\"$emit('uploadApi')\">\n <div class=\"dropdown-item\">\n <ScalarIconUpload />\n Upload API\n </div>\n </ScalarDropdownItem>\n\n <ScalarDropdownItem @click=\"catalogModal.show()\">\n <div class=\"dropdown-item\">\n <ScalarIconMagnifyingGlass />\n Search Catalog\n </div>\n </ScalarDropdownItem>\n </template>\n </ScalarDropdown>\n\n <Catalog\n v-if=\"catalogModal.open\"\n :modal=\"catalogModal\" />\n</template>\n\n<style scoped>\n.dropdown-item {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport {\n ScalarDropdown,\n ScalarDropdownItem,\n useModal,\n} from '@scalar/components'\nimport { ScalarIconMagnifyingGlass, ScalarIconUpload } from '@scalar/icons'\n\nimport Catalog from '@/views/Catalog/Catalog.vue'\n\ndefineEmits<{\n (e: 'uploadApi'): void\n}>()\n\nconst catalogModal = useModal()\n</script>\n\n<template>\n <ScalarDropdown :offset=\"{ crossAxis: -5, mainAxis: 5 }\">\n <slot />\n\n <template #items>\n <ScalarDropdownItem @click=\"$emit('uploadApi')\">\n <div class=\"dropdown-item\">\n <ScalarIconUpload />\n Upload API\n </div>\n </ScalarDropdownItem>\n\n <ScalarDropdownItem @click=\"catalogModal.show()\">\n <div class=\"dropdown-item\">\n <ScalarIconMagnifyingGlass />\n Search Catalog\n </div>\n </ScalarDropdownItem>\n </template>\n </ScalarDropdown>\n\n <Catalog\n v-if=\"catalogModal.open\"\n :modal=\"catalogModal\" />\n</template>\n\n<style scoped>\n.dropdown-item {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ScalarIconInfo } from '@scalar/icons'\n\nconst emit = defineEmits<{\n (e: 'approve'): void\n (e: 'reject'): void\n}>()\n</script>\n\n<template>\n <div class=\"approvalSection\">\n <strong class=\"approvalText flex items-center gap-1.5\">\n <ScalarIconInfo\n class=\"text-blue size-4\"\n weight=\"bold\" />\n One or more requests require approval.\n </strong>\n <div class=\"approveContainer\">\n <button\n type=\"button\"\n class=\"actionButton rejectButton\"\n @click=\"emit('reject')\">\n Reject\n </button>\n <button\n type=\"button\"\n class=\"actionButton approveButton\"\n @click=\"emit('approve')\">\n Approve\n </button>\n </div>\n </div>\n</template>\n\n<style scoped>\n.approvalSection {\n width: 100%;\n margin-bottom: -16px;\n padding: 8px 8px 24px 12px;\n\n background: color-mix(\n in srgb,\n var(--scalar-color-blue),\n var(--scalar-background-1) 95%\n );\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-radius: 16px 16px 0 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n position: absolute;\n top: 0;\n transform: translate3d(0, calc(-100% + 16px), 0);\n}\n\n.approvalText {\n font-weight: var(--scalar-semibold);\n font-size: var(--scalar-font-size-3);\n}\n\n.approveContainer {\n display: flex;\n gap: 5px;\n}\n\n.actionButton {\n display: flex;\n align-items: center;\n font-weight: var(--scalar-semibold);\n border-radius: 50px;\n padding: 6px 12px;\n font-size: var(--scalar-font-size-3);\n}\n\n.rejectButton {\n color: white;\n background: var(--scalar-color-red);\n}\n.rejectButton:hover,\n.rejectButton:active {\n background: color-mix(\n in srgb,\n var(--scalar-color-red),\n var(--scalar-background-1) 10%\n );\n color: white !important;\n}\n\n.approveButton {\n color: white;\n background: var(--scalar-color-blue);\n}\n.approveButton:hover,\n.approveButton:active {\n background: color-mix(\n in srgb,\n var(--scalar-color-blue),\n var(--scalar-background-1) 10%\n );\n color: white !important;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ScalarIconInfo } from '@scalar/icons'\n\nconst emit = defineEmits<{\n (e: 'approve'): void\n (e: 'reject'): void\n}>()\n</script>\n\n<template>\n <div class=\"approvalSection\">\n <strong class=\"approvalText flex items-center gap-1.5\">\n <ScalarIconInfo\n class=\"text-blue size-4\"\n weight=\"bold\" />\n One or more requests require approval.\n </strong>\n <div class=\"approveContainer\">\n <button\n type=\"button\"\n class=\"actionButton rejectButton\"\n @click=\"emit('reject')\">\n Reject\n </button>\n <button\n type=\"button\"\n class=\"actionButton approveButton\"\n @click=\"emit('approve')\">\n Approve\n </button>\n </div>\n </div>\n</template>\n\n<style scoped>\n.approvalSection {\n width: 100%;\n margin-bottom: -16px;\n padding: 8px 8px 24px 12px;\n\n background: color-mix(\n in srgb,\n var(--scalar-color-blue),\n var(--scalar-background-1) 95%\n );\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-radius: 16px 16px 0 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n position: absolute;\n top: 0;\n transform: translate3d(0, calc(-100% + 16px), 0);\n}\n\n.approvalText {\n font-weight: var(--scalar-semibold);\n font-size: var(--scalar-font-size-3);\n}\n\n.approveContainer {\n display: flex;\n gap: 5px;\n}\n\n.actionButton {\n display: flex;\n align-items: center;\n font-weight: var(--scalar-semibold);\n border-radius: 50px;\n padding: 6px 12px;\n font-size: var(--scalar-font-size-3);\n}\n\n.rejectButton {\n color: white;\n background: var(--scalar-color-red);\n}\n.rejectButton:hover,\n.rejectButton:active {\n background: color-mix(\n in srgb,\n var(--scalar-color-red),\n var(--scalar-background-1) 10%\n );\n color: white !important;\n}\n\n.approveButton {\n color: white;\n background: var(--scalar-color-blue);\n}\n.approveButton:hover,\n.approveButton:active {\n background: color-mix(\n in srgb,\n var(--scalar-color-blue),\n var(--scalar-background-1) 10%\n );\n color: white !important;\n}\n</style>\n","import { computed } from 'vue'\nimport { z } from 'zod/mini'\n\nimport { safeParseJson } from '@/helpers'\nimport { useState } from '@/state/state'\n\nconst chatErrorSchema = z.object({\n message: z.string(),\n code: z.string(),\n status: z.optional(z.number()),\n})\nexport type ChatError = z.infer<typeof chatErrorSchema>\n\nexport function useChatError() {\n const { chat } = useState()\n\n return computed(() => {\n if (!chat.error) return\n\n const errorJson = safeParseJson(chat.error.message)\n const parsedError = chatErrorSchema.safeParse(errorJson)\n\n if (!errorJson || !parsedError.success)\n return {\n message: chat.error.message,\n code: 'UNKNOWN_ERROR',\n }\n\n return parsedError.data\n })\n}\n","<script setup lang=\"ts\">\nimport { ScalarIconInfo } from '@scalar/icons'\n\nimport { AgentErrorCodes } from '@/entities/error/constants'\nimport { type ChatError } from '@/hooks/use-chat-error'\n\nconst { error } = defineProps<{ error: ChatError }>()\n\nconst HIDDEN_ERROR_CODES: string[] = [AgentErrorCodes.LIMIT_REACHED]\n</script>\n\n<template>\n <div\n v-if=\"!HIDDEN_ERROR_CODES.includes(error.code)\"\n class=\"error gap-1.5\">\n <ScalarIconInfo\n class=\"text-red size-4\"\n weight=\"bold\" />\n {{ error.message }}\n </div>\n</template>\n\n<style scoped>\n.error {\n display: flex;\n align-items: center;\n margin-bottom: -16px;\n padding: 8px 8px 24px 12px;\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-radius: 16px 16px 0 0;\n background: color-mix(\n in srgb,\n var(--scalar-color-red),\n var(--scalar-background-1) 95%\n );\n font-weight: var(--scalar-semibold);\n font-size: var(--scalar-font-size-3);\n position: absolute;\n top: 0;\n transform: translate3d(0, calc(-100% + 16px), 0);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ScalarIconInfo } from '@scalar/icons'\n\nimport { AgentErrorCodes } from '@/entities/error/constants'\nimport { type ChatError } from '@/hooks/use-chat-error'\n\nconst { error } = defineProps<{ error: ChatError }>()\n\nconst HIDDEN_ERROR_CODES: string[] = [AgentErrorCodes.LIMIT_REACHED]\n</script>\n\n<template>\n <div\n v-if=\"!HIDDEN_ERROR_CODES.includes(error.code)\"\n class=\"error gap-1.5\">\n <ScalarIconInfo\n class=\"text-red size-4\"\n weight=\"bold\" />\n {{ error.message }}\n </div>\n</template>\n\n<style scoped>\n.error {\n display: flex;\n align-items: center;\n margin-bottom: -16px;\n padding: 8px 8px 24px 12px;\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-radius: 16px 16px 0 0;\n background: color-mix(\n in srgb,\n var(--scalar-color-red),\n var(--scalar-background-1) 95%\n );\n font-weight: var(--scalar-semibold);\n font-size: var(--scalar-font-size-3);\n position: absolute;\n top: 0;\n transform: translate3d(0, calc(-100% + 16px), 0);\n}\n</style>\n","import type { ComputedRef } from 'vue'\nimport { computed } from 'vue'\n\nimport { useState } from '@/state/state'\n\n/**\n * Agent Scalar signup/upgrade URL for both full (agent.scalar.com) and embedded\n * (@scalar/api-reference) modes.\n *\n * In embedded mode, includes register flow and optional docUrl when a temporary document was uploaded.\n */\nexport function useSignupLink(): {\n signupLink: ComputedRef<string>\n navigateToSignup: () => void\n} {\n const { dashboardUrl, mode, uploadedTmpDocumentUrl } = useState()\n\n const signupLink = computed(() => {\n // we use mode 'full' on agent.scalar.com\n if (mode === 'full') {\n return dashboardUrl\n }\n\n // we use mode 'preview' in @scalar/api-reference\n return uploadedTmpDocumentUrl.value\n ? `${dashboardUrl}/register?flow=oss-agent&docUrl=${uploadedTmpDocumentUrl.value}`\n : dashboardUrl\n })\n\n function navigateToSignup() {\n window.location.assign(signupLink.value)\n }\n\n return { signupLink, navigateToSignup }\n}\n","<script setup lang=\"ts\">\nimport { ScalarIconInfo, ScalarIconX } from '@scalar/icons'\nimport { ref } from 'vue'\n\nimport { URLS } from '@/consts/urls'\nimport { useSignupLink } from '@/hooks/use-signup-link'\n\nconst isDismissed = ref(false)\nconst { signupLink } = useSignupLink()\n\n/**\n * Dismiss the free messages info section.\n */\nfunction dismiss() {\n isDismissed.value = true\n}\n</script>\n\n<template>\n <div\n v-show=\"!isDismissed\"\n class=\"freeMessagesInfoSection\">\n <strong class=\"infoText flex items-center gap-1.5\">\n <!-- Sign up -->\n <ScalarIconInfo\n class=\"text-blue size-4\"\n weight=\"bold\" />\n <a\n class=\"underline\"\n :href=\"signupLink\"\n target=\"_blank\"\n >Sign up for Agent Scalar</a\n >\n to continue without hitting limits.\n </strong>\n <div class=\"actionsContainer\">\n <a\n class=\"actionButton upgradeButton\"\n :href=\"URLS.AGENT_SCALAR_DOCUMENTATION\"\n target=\"_blank\"\n type=\"button\">\n Read more\n </a>\n <button\n aria-label=\"Close\"\n class=\"closeButton\"\n type=\"button\"\n @click=\"dismiss\">\n <ScalarIconX\n class=\"size-4\"\n weight=\"bold\" />\n </button>\n </div>\n </div>\n</template>\n\n<style scoped>\n.freeMessagesInfoSection {\n width: 100%;\n margin-bottom: -16px;\n padding: 8px 8px 24px 12px;\n position: relative;\n background: color-mix(\n in srgb,\n var(--scalar-color-blue),\n var(--scalar-background-1) 95%\n );\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-radius: 16px 16px 0 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.infoText {\n font-weight: var(--scalar-semibold);\n font-size: var(--scalar-font-size-3);\n}\n\n.actionsContainer {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.actionButton {\n display: flex;\n align-items: center;\n font-weight: var(--scalar-semibold);\n border-radius: 50px;\n padding: 6px 12px;\n}\n\n.upgradeButton {\n color: white;\n font-size: var(--scalar-font-size-3);\n background: var(--scalar-color-blue);\n}\n.upgradeButton:hover,\n.upgradeButton:active {\n background: color-mix(\n in srgb,\n var(--scalar-color-blue),\n var(--scalar-background-1) 10%\n );\n color: white !important;\n}\n\n.closeButton {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border-radius: 50%;\n color: var(--scalar-color-2);\n background: transparent;\n border: none;\n cursor: pointer;\n}\n.closeButton:hover {\n background: color-mix(\n in srgb,\n var(--scalar-color-blue),\n var(--scalar-background-1) 80%\n );\n color: var(--scalar-color-1);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ScalarIconInfo, ScalarIconX } from '@scalar/icons'\nimport { ref } from 'vue'\n\nimport { URLS } from '@/consts/urls'\nimport { useSignupLink } from '@/hooks/use-signup-link'\n\nconst isDismissed = ref(false)\nconst { signupLink } = useSignupLink()\n\n/**\n * Dismiss the free messages info section.\n */\nfunction dismiss() {\n isDismissed.value = true\n}\n</script>\n\n<template>\n <div\n v-show=\"!isDismissed\"\n class=\"freeMessagesInfoSection\">\n <strong class=\"infoText flex items-center gap-1.5\">\n <!-- Sign up -->\n <ScalarIconInfo\n class=\"text-blue size-4\"\n weight=\"bold\" />\n <a\n class=\"underline\"\n :href=\"signupLink\"\n target=\"_blank\"\n >Sign up for Agent Scalar</a\n >\n to continue without hitting limits.\n </strong>\n <div class=\"actionsContainer\">\n <a\n class=\"actionButton upgradeButton\"\n :href=\"URLS.AGENT_SCALAR_DOCUMENTATION\"\n target=\"_blank\"\n type=\"button\">\n Read more\n </a>\n <button\n aria-label=\"Close\"\n class=\"closeButton\"\n type=\"button\"\n @click=\"dismiss\">\n <ScalarIconX\n class=\"size-4\"\n weight=\"bold\" />\n </button>\n </div>\n </div>\n</template>\n\n<style scoped>\n.freeMessagesInfoSection {\n width: 100%;\n margin-bottom: -16px;\n padding: 8px 8px 24px 12px;\n position: relative;\n background: color-mix(\n in srgb,\n var(--scalar-color-blue),\n var(--scalar-background-1) 95%\n );\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-radius: 16px 16px 0 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.infoText {\n font-weight: var(--scalar-semibold);\n font-size: var(--scalar-font-size-3);\n}\n\n.actionsContainer {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.actionButton {\n display: flex;\n align-items: center;\n font-weight: var(--scalar-semibold);\n border-radius: 50px;\n padding: 6px 12px;\n}\n\n.upgradeButton {\n color: white;\n font-size: var(--scalar-font-size-3);\n background: var(--scalar-color-blue);\n}\n.upgradeButton:hover,\n.upgradeButton:active {\n background: color-mix(\n in srgb,\n var(--scalar-color-blue),\n var(--scalar-background-1) 10%\n );\n color: white !important;\n}\n\n.closeButton {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border-radius: 50%;\n color: var(--scalar-color-2);\n background: transparent;\n border: none;\n cursor: pointer;\n}\n.closeButton:hover {\n background: color-mix(\n in srgb,\n var(--scalar-color-blue),\n var(--scalar-background-1) 80%\n );\n color: var(--scalar-color-1);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ScalarIconInfo } from '@scalar/icons'\n\nimport { useSignupLink } from '@/hooks/use-signup-link'\n\nconst { navigateToSignup } = useSignupLink()\n</script>\n\n<template>\n <div class=\"paymentSection\">\n <strong class=\"approvalText flex items-center gap-1.5\">\n <ScalarIconInfo\n class=\"text-blue size-4\"\n weight=\"bold\" />\n You've reached your free message limit. Unlock unlimited access by\n upgrading now.\n </strong>\n <div class=\"paymentContainer\">\n <button\n class=\"actionButton approveButton\"\n type=\"button\"\n @click=\"navigateToSignup\">\n Upgrade\n </button>\n <div class=\"paymentInfo\">\n <h3>$72 <span>/ month</span></h3>\n <div class=\"paymentInfoSection\">\n <div class=\"paymentInfoItem\">\n <span>Seat minimum</span>\n <span>3</span>\n </div>\n <div class=\"paymentInfoItem\">\n <span>Base monthly total</span>\n <span>$72.00</span>\n </div>\n </div>\n <div class=\"paymentInfoSection\">\n <div class=\"paymentInfoItem\">\n <span>Messages</span>\n <span>250</span>\n </div>\n <div class=\"paymentInfoItem\">\n <span>Additional Messages</span>\n <span>+ $0.02 Message</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.paymentSection {\n width: 100%;\n margin-bottom: -16px;\n padding: 8px 8px 24px 12px;\n position: relative;\n background: color-mix(\n in srgb,\n var(--scalar-color-blue),\n var(--scalar-background-1) 95%\n );\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-radius: 16px 16px 0 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n position: absolute;\n top: 0;\n transform: translate3d(0, calc(-100% + 16px), 0);\n}\n\n.approvalText {\n font-weight: var(--scalar-semibold);\n font-size: var(--scalar-font-size-3);\n}\n\n.paymentContainer {\n display: flex;\n gap: 5px;\n}\n\n.actionButton {\n display: flex;\n align-items: center;\n font-weight: var(--scalar-semibold);\n border-radius: 50px;\n padding: 6px 12px;\n}\n\n.rejectButton {\n color: white;\n background: var(--scalar-color-red);\n}\n.rejectButton:hover,\n.rejectButton:active {\n background: color-mix(\n in srgb,\n var(--scalar-color-red),\n var(--scalar-background-1) 10%\n );\n color: white !important;\n}\n\n.approveButton {\n color: white;\n font-size: var(--scalar-font-size-3);\n background: var(--scalar-color-blue);\n}\n.approveButton:hover,\n.approveButton:active {\n background: color-mix(\n in srgb,\n var(--scalar-color-blue),\n var(--scalar-background-1) 10%\n );\n color: white !important;\n}\n.paymentInfo {\n width: 300px;\n position: absolute;\n right: 0;\n bottom: 70px;\n box-shadow: var(--scalar-shadow-2);\n background: var(--scalar-background-1);\n border-radius: 16px;\n pointer-events: none;\n padding: 12px;\n transform: translate3d(0, -5px, 0);\n opacity: 0;\n transition: all 0.2s ease-in-out;\n}\n.paymentInfo h3 {\n font-size: var(--scalar-font-size-1);\n font-weight: var(--scalar-bold);\n margin-bottom: 18px;\n}\n.paymentInfo h3 span {\n font-size: var(--scalar-font-size-2);\n}\n.dark-mode .paymentInfo {\n background: var(--scalar-background-2);\n}\n.paymentContainer:hover .paymentInfo {\n transform: translate3d(0, 0, 0);\n opacity: 1;\n}\n.paymentInfoItem {\n display: flex;\n justify-content: space-between;\n margin-top: 8px;\n font-size: var(--scalar-font-size-3);\n color: var(--scalar-color-2);\n font-weight: var(--scalar-semibold);\n}\n.paymentInfoSection:not(:last-child) {\n border-bottom: var(--scalar-border-width) solid var(--scalar-border-color);\n padding-bottom: 8px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ScalarIconInfo } from '@scalar/icons'\n\nimport { useSignupLink } from '@/hooks/use-signup-link'\n\nconst { navigateToSignup } = useSignupLink()\n</script>\n\n<template>\n <div class=\"paymentSection\">\n <strong class=\"approvalText flex items-center gap-1.5\">\n <ScalarIconInfo\n class=\"text-blue size-4\"\n weight=\"bold\" />\n You've reached your free message limit. Unlock unlimited access by\n upgrading now.\n </strong>\n <div class=\"paymentContainer\">\n <button\n class=\"actionButton approveButton\"\n type=\"button\"\n @click=\"navigateToSignup\">\n Upgrade\n </button>\n <div class=\"paymentInfo\">\n <h3>$72 <span>/ month</span></h3>\n <div class=\"paymentInfoSection\">\n <div class=\"paymentInfoItem\">\n <span>Seat minimum</span>\n <span>3</span>\n </div>\n <div class=\"paymentInfoItem\">\n <span>Base monthly total</span>\n <span>$72.00</span>\n </div>\n </div>\n <div class=\"paymentInfoSection\">\n <div class=\"paymentInfoItem\">\n <span>Messages</span>\n <span>250</span>\n </div>\n <div class=\"paymentInfoItem\">\n <span>Additional Messages</span>\n <span>+ $0.02 Message</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.paymentSection {\n width: 100%;\n margin-bottom: -16px;\n padding: 8px 8px 24px 12px;\n position: relative;\n background: color-mix(\n in srgb,\n var(--scalar-color-blue),\n var(--scalar-background-1) 95%\n );\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-radius: 16px 16px 0 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n position: absolute;\n top: 0;\n transform: translate3d(0, calc(-100% + 16px), 0);\n}\n\n.approvalText {\n font-weight: var(--scalar-semibold);\n font-size: var(--scalar-font-size-3);\n}\n\n.paymentContainer {\n display: flex;\n gap: 5px;\n}\n\n.actionButton {\n display: flex;\n align-items: center;\n font-weight: var(--scalar-semibold);\n border-radius: 50px;\n padding: 6px 12px;\n}\n\n.rejectButton {\n color: white;\n background: var(--scalar-color-red);\n}\n.rejectButton:hover,\n.rejectButton:active {\n background: color-mix(\n in srgb,\n var(--scalar-color-red),\n var(--scalar-background-1) 10%\n );\n color: white !important;\n}\n\n.approveButton {\n color: white;\n font-size: var(--scalar-font-size-3);\n background: var(--scalar-color-blue);\n}\n.approveButton:hover,\n.approveButton:active {\n background: color-mix(\n in srgb,\n var(--scalar-color-blue),\n var(--scalar-background-1) 10%\n );\n color: white !important;\n}\n.paymentInfo {\n width: 300px;\n position: absolute;\n right: 0;\n bottom: 70px;\n box-shadow: var(--scalar-shadow-2);\n background: var(--scalar-background-1);\n border-radius: 16px;\n pointer-events: none;\n padding: 12px;\n transform: translate3d(0, -5px, 0);\n opacity: 0;\n transition: all 0.2s ease-in-out;\n}\n.paymentInfo h3 {\n font-size: var(--scalar-font-size-1);\n font-weight: var(--scalar-bold);\n margin-bottom: 18px;\n}\n.paymentInfo h3 span {\n font-size: var(--scalar-font-size-2);\n}\n.dark-mode .paymentInfo {\n background: var(--scalar-background-2);\n}\n.paymentContainer:hover .paymentInfo {\n transform: translate3d(0, 0, 0);\n opacity: 1;\n}\n.paymentInfoItem {\n display: flex;\n justify-content: space-between;\n margin-top: 8px;\n font-size: var(--scalar-font-size-3);\n color: var(--scalar-color-2);\n font-weight: var(--scalar-semibold);\n}\n.paymentInfoSection:not(:last-child) {\n border-bottom: var(--scalar-border-width) solid var(--scalar-border-color);\n padding-bottom: 8px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ScalarPopover, ScalarTextInput } from '@scalar/components'\nimport { ScalarIconMagnifyingGlass } from '@scalar/icons'\nimport { computed } from 'vue'\n\nimport { useSearch } from '@/hooks/use-search'\nimport { useState } from '@/state/state'\n\nconst state = useState()\n\nconst search = useSearch()\n\nconst searchOptions = computed(() =>\n search.results.value\n .filter(\n (r) =>\n !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 <ScalarPopover\n :offset=\"0\"\n placement=\"top-start\"\n resize\n style=\"width: 220px\">\n <slot />\n <template #popover=\"{ close }\">\n <ScalarTextInput\n autofocus\n class=\"searchInput\"\n :modelValue=\"search.query.value\"\n placeholder=\"Add an API\"\n @update:modelValue=\"(v) => (search.query.value = v ?? '')\">\n <template #prefix>\n <ScalarIconMagnifyingGlass class=\"searchIcon\" />\n </template>\n </ScalarTextInput>\n\n <template v-if=\"searchOptions.length\">\n <button\n v-for=\"option in searchOptions\"\n :key=\"option.id\"\n class=\"searchItem\"\n type=\"button\"\n @click=\"\n () => {\n state.addDocument(option)\n close()\n }\n \">\n <img\n v-if=\"option.logoUrl\"\n class=\"searchItemLogo\"\n :src=\"option.logoUrl\" />\n <span>{{ option.title }}</span>\n </button>\n </template>\n\n <span\n v-else\n class=\"searchResultsEmpty\">\n No APIs found\n </span>\n </template>\n </ScalarPopover>\n</template>\n\n<style scoped>\n.searchItem {\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 8px 10px;\n font-size: var(--scalar-font-size-3);\n}\n\n.searchInput {\n margin-bottom: 5px;\n}\n\n.searchItem:hover {\n background: var(--scalar-background-2);\n}\n\n.searchItemLogo {\n width: 15px;\n}\n\n.searchIcon {\n margin-right: 7px;\n}\n\n.searchResultsEmpty {\n font-size: var(--scalar-font-size-3);\n color: var(--scalar-color-2);\n margin: 10px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ScalarPopover, ScalarTextInput } from '@scalar/components'\nimport { ScalarIconMagnifyingGlass } from '@scalar/icons'\nimport { computed } from 'vue'\n\nimport { useSearch } from '@/hooks/use-search'\nimport { useState } from '@/state/state'\n\nconst state = useState()\n\nconst search = useSearch()\n\nconst searchOptions = computed(() =>\n search.results.value\n .filter(\n (r) =>\n !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 <ScalarPopover\n :offset=\"0\"\n placement=\"top-start\"\n resize\n style=\"width: 220px\">\n <slot />\n <template #popover=\"{ close }\">\n <ScalarTextInput\n autofocus\n class=\"searchInput\"\n :modelValue=\"search.query.value\"\n placeholder=\"Add an API\"\n @update:modelValue=\"(v) => (search.query.value = v ?? '')\">\n <template #prefix>\n <ScalarIconMagnifyingGlass class=\"searchIcon\" />\n </template>\n </ScalarTextInput>\n\n <template v-if=\"searchOptions.length\">\n <button\n v-for=\"option in searchOptions\"\n :key=\"option.id\"\n class=\"searchItem\"\n type=\"button\"\n @click=\"\n () => {\n state.addDocument(option)\n close()\n }\n \">\n <img\n v-if=\"option.logoUrl\"\n class=\"searchItemLogo\"\n :src=\"option.logoUrl\" />\n <span>{{ option.title }}</span>\n </button>\n </template>\n\n <span\n v-else\n class=\"searchResultsEmpty\">\n No APIs found\n </span>\n </template>\n </ScalarPopover>\n</template>\n\n<style scoped>\n.searchItem {\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 8px 10px;\n font-size: var(--scalar-font-size-3);\n}\n\n.searchInput {\n margin-bottom: 5px;\n}\n\n.searchItem:hover {\n background: var(--scalar-background-2);\n}\n\n.searchItemLogo {\n width: 15px;\n}\n\n.searchIcon {\n margin-right: 7px;\n}\n\n.searchResultsEmpty {\n font-size: var(--scalar-font-size-3);\n color: var(--scalar-color-2);\n margin: 10px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ScalarLoading, useLoadingState } from '@scalar/components'\nimport { ScalarIconCheck, ScalarIconXCircle } from '@scalar/icons'\nimport { computed } from 'vue'\n\nimport { type UploadTmpDocumentState } from '@/hooks/use-upload-tmp-document'\n\nconst { uploadState } = defineProps<{\n uploadState: UploadTmpDocumentState\n}>()\n\nconst loadingState = useLoadingState()\n\nconst isLoading = computed(() =>\n ['uploading', 'processing', 'loading'].includes(uploadState.type),\n)\n</script>\n\n<template>\n <div\n class=\"uploadSection\"\n :class=\"{\n error: uploadState.type === 'error',\n done: uploadState.type === 'done',\n }\">\n <div\n v-if=\"isLoading\"\n class=\"flex items-center gap-1.5\">\n <ScalarLoading\n class=\"text-blue\"\n :loader=\"{\n ...loadingState,\n isLoading: true,\n }\"\n size=\"lg\" />\n <strong\n v-if=\"uploadState.type === 'loading'\"\n class=\"uploadText\">\n Loading OpenAPI document…\n </strong>\n <strong\n v-else-if=\"uploadState.type === 'processing'\"\n class=\"uploadText\">\n Processing OpenAPI document…\n </strong>\n <strong\n v-else\n class=\"uploadText\">\n Uploading OpenAPI document…\n </strong>\n </div>\n <strong\n v-if=\"uploadState.type === 'done'\"\n class=\"uploadText flex items-center gap-1.5\">\n <ScalarIconCheck class=\"icon text-green\" />\n Your OpenAPI document has been processed successfully.\n </strong>\n <strong\n v-if=\"uploadState.type === 'error'\"\n class=\"uploadText flex items-center gap-1.5\">\n <ScalarIconXCircle class=\"icon text-red\" />\n {{ uploadState.error }}\n </strong>\n </div>\n</template>\n\n<style scoped>\n.uploadSection {\n width: 100%;\n margin-bottom: -16px;\n padding: 8px 8px 24px 12px;\n position: relative;\n background: color-mix(\n in srgb,\n var(--scalar-color-blue),\n var(--scalar-background-1) 95%\n );\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-radius: 16px 16px 0 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n position: absolute;\n top: 0;\n transform: translate3d(0, calc(-100% + 16px), 0);\n}\n\n.uploadSection.error {\n background: color-mix(\n in srgb,\n var(--scalar-color-red),\n var(--scalar-background-1) 95%\n );\n}\n\n.uploadSection.done {\n background: color-mix(\n in srgb,\n var(--scalar-color-green),\n var(--scalar-background-1) 95%\n );\n}\n\n.uploadText {\n font-weight: var(--scalar-semibold);\n font-size: var(--scalar-font-size-3);\n}\n\n.icon {\n height: 20px;\n width: 20px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ScalarLoading, useLoadingState } from '@scalar/components'\nimport { ScalarIconCheck, ScalarIconXCircle } from '@scalar/icons'\nimport { computed } from 'vue'\n\nimport { type UploadTmpDocumentState } from '@/hooks/use-upload-tmp-document'\n\nconst { uploadState } = defineProps<{\n uploadState: UploadTmpDocumentState\n}>()\n\nconst loadingState = useLoadingState()\n\nconst isLoading = computed(() =>\n ['uploading', 'processing', 'loading'].includes(uploadState.type),\n)\n</script>\n\n<template>\n <div\n class=\"uploadSection\"\n :class=\"{\n error: uploadState.type === 'error',\n done: uploadState.type === 'done',\n }\">\n <div\n v-if=\"isLoading\"\n class=\"flex items-center gap-1.5\">\n <ScalarLoading\n class=\"text-blue\"\n :loader=\"{\n ...loadingState,\n isLoading: true,\n }\"\n size=\"lg\" />\n <strong\n v-if=\"uploadState.type === 'loading'\"\n class=\"uploadText\">\n Loading OpenAPI document…\n </strong>\n <strong\n v-else-if=\"uploadState.type === 'processing'\"\n class=\"uploadText\">\n Processing OpenAPI document…\n </strong>\n <strong\n v-else\n class=\"uploadText\">\n Uploading OpenAPI document…\n </strong>\n </div>\n <strong\n v-if=\"uploadState.type === 'done'\"\n class=\"uploadText flex items-center gap-1.5\">\n <ScalarIconCheck class=\"icon text-green\" />\n Your OpenAPI document has been processed successfully.\n </strong>\n <strong\n v-if=\"uploadState.type === 'error'\"\n class=\"uploadText flex items-center gap-1.5\">\n <ScalarIconXCircle class=\"icon text-red\" />\n {{ uploadState.error }}\n </strong>\n </div>\n</template>\n\n<style scoped>\n.uploadSection {\n width: 100%;\n margin-bottom: -16px;\n padding: 8px 8px 24px 12px;\n position: relative;\n background: color-mix(\n in srgb,\n var(--scalar-color-blue),\n var(--scalar-background-1) 95%\n );\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-radius: 16px 16px 0 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n position: absolute;\n top: 0;\n transform: translate3d(0, calc(-100% + 16px), 0);\n}\n\n.uploadSection.error {\n background: color-mix(\n in srgb,\n var(--scalar-color-red),\n var(--scalar-background-1) 95%\n );\n}\n\n.uploadSection.done {\n background: color-mix(\n in srgb,\n var(--scalar-color-green),\n var(--scalar-background-1) 95%\n );\n}\n\n.uploadText {\n font-weight: var(--scalar-semibold);\n font-size: var(--scalar-font-size-3);\n}\n\n.icon {\n height: 20px;\n width: 20px;\n}\n</style>\n","import type { ToolUIPart, UIMessagePart, UITools } from 'ai'\nimport { computed } from 'vue'\n\nimport { useState } from '@/state/state'\n\ntype PendingClientToolPart = ToolUIPart & { state: 'input-available' }\n\nfunction isPendingClientToolPart(part: UIMessagePart<any, UITools>): part is PendingClientToolPart {\n return part.type.startsWith('tool') && (part as ToolUIPart).state === 'input-available'\n}\n\nexport function useChatPendingClientToolParts() {\n const state = useState()\n\n const pendingClientToolParts = computed(() => {\n return state.chat.messages\n .filter((message) => message.parts.some(isPendingClientToolPart))\n .flatMap((message) => message.parts)\n .filter(isPendingClientToolPart) as PendingClientToolPart[]\n })\n\n return { pendingClientToolParts }\n}\n","<script setup lang=\"ts\">\nimport {\n ScalarIconButton,\n ScalarLoading,\n ScalarTooltip,\n} from '@scalar/components'\nimport {\n ScalarIconArrowUp,\n ScalarIconCheck,\n ScalarIconLockSimple,\n ScalarIconPlus,\n ScalarIconX,\n} from '@scalar/icons'\nimport { computed, useTemplateRef, watch } from 'vue'\n\nimport ActionsDropdown from '@/components/ActionsDropdown.vue'\nimport ApprovalSection from '@/components/ApprovalSection.vue'\nimport ErrorMessageMessage from '@/components/ErrorMessage.vue'\nimport FreeMessagesInfoSection from '@/components/FreeMessagesInfoSection.vue'\nimport PaymentSection from '@/components/PaymentSection.vue'\nimport SearchPopover from '@/components/SearchPopover.vue'\nimport UploadSection from '@/components/UploadSection.vue'\nimport { AgentErrorCodes } from '@/entities/error/constants'\nimport { MAX_PROMPT_SIZE } from '@/entities/prompt/constants'\nimport { useRequestApprovals } from '@/hooks/use-chat-approvals'\nimport { useChatError } from '@/hooks/use-chat-error'\nimport { useChatPendingClientToolParts } from '@/hooks/use-chat-pending-client-tool-parts'\nimport { useUploadTmpDocument } from '@/hooks/use-upload-tmp-document'\nimport { useState } from '@/state/state'\n\nconst emit = defineEmits<{\n (e: 'submit'): void\n (e: 'uploadApi'): void\n}>()\n\ndefineExpose({ focusPrompt })\n\nconst promptRef = useTemplateRef<HTMLTextAreaElement>('agentPrompt')\n\nconst state = useState()\n\nconst inputHasContent = computed(() => state.prompt.value.trim().length > 0)\nconst promptTooLarge = computed(\n () => state.prompt.value.trim().length > MAX_PROMPT_SIZE,\n)\n\n/** Show free messages info only after at least one message has been sent and when no API key is set. */\nconst showFreeMessagesInfo = computed(\n () =>\n state.chat.messages.length > 1 &&\n !state.getAgentKey?.() &&\n chatError?.value?.code !== AgentErrorCodes.LIMIT_REACHED,\n)\n\nwatch(state.prompt, () => {\n if (!promptRef?.value) {\n return\n }\n\n if (!state.prompt.value.length) {\n promptRef.value.style.height = '0px'\n return\n }\n\n promptRef.value.style.height = 'auto'\n promptRef.value.style.height = promptRef.value.scrollHeight + 'px'\n})\n\nfunction handlePromptKeydown(e: KeyboardEvent) {\n if (state.loading.value) {\n return\n }\n\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSubmit()\n window.scrollTo(0, document.body.scrollHeight)\n }\n}\n\nfunction focusPrompt() {\n promptRef.value?.focus()\n}\n\nwatch(\n () => state.chat.status,\n (status) => {\n if (status === 'ready' || status === 'error') {\n promptRef.value?.focus()\n }\n },\n)\n\nconst { approvalRequiredParts, respondToRequestApprovals } =\n useRequestApprovals()\n\nconst { pendingClientToolParts } = useChatPendingClientToolParts()\n\nconst uploadTmpDoc = useUploadTmpDocument()\n\nfunction acceptTerms() {\n state.terms.accept()\n\n if (state.mode === 'preview' && state.getActiveDocumentJson) {\n uploadTmpDoc.uploadTempDocument(state.getActiveDocumentJson(), true)\n }\n}\n\nconst isPending = computed(() =>\n Object.values(state.pendingDocuments).some(Boolean),\n)\n\nconst submitDisabled = computed(() => {\n const tooLarge = promptTooLarge.value\n const missingInput = !inputHasContent.value\n const awaitingApproval = approvalRequiredParts.value.length > 0\n const pendingToolParts = pendingClientToolParts.value.length > 0\n\n const isPreview = state.mode === 'preview'\n\n const termsNotAccepted = isPreview && !state.terms.accepted.value\n const uploadingTmpDoc = isPreview && !!uploadTmpDoc.uploadState.value\n const isLoading = isPending.value\n\n return (\n tooLarge ||\n missingInput ||\n awaitingApproval ||\n pendingToolParts ||\n termsNotAccepted ||\n uploadingTmpDoc ||\n isLoading\n )\n})\n\nfunction handleSubmit() {\n if (submitDisabled.value) {\n return\n }\n\n emit('submit')\n}\n\nconst chatError = useChatError()\n</script>\n\n<template>\n <div class=\"actionContainer\">\n <UploadSection\n v-if=\"uploadTmpDoc.uploadState.value || isPending\"\n :uploadState=\"uploadTmpDoc.uploadState.value ?? { type: 'loading' }\" />\n <ErrorMessageMessage\n v-if=\"chatError\"\n :error=\"chatError\" />\n <ApprovalSection\n v-if=\"approvalRequiredParts.length\"\n @approve=\"respondToRequestApprovals(true)\"\n @reject=\"respondToRequestApprovals(false)\" />\n <PaymentSection v-if=\"chatError?.code === AgentErrorCodes.LIMIT_REACHED\" />\n <FreeMessagesInfoSection v-if=\"showFreeMessagesInfo\" />\n <form\n class=\"promptForm\"\n @submit.prevent=\"handleSubmit\">\n <label\n class=\"agentLabel\"\n for=\"agentTextarea\">\n Type a Request To get Started\n </label>\n <textarea\n id=\"agentTextarea\"\n ref=\"agentPrompt\"\n v-model=\"state.prompt.value\"\n class=\"prompt custom-scroll\"\n :disabled=\"state.loading.value\"\n name=\"prompt\"\n placeholder=\"Ask me anything…\"\n @keydown=\"handlePromptKeydown\" />\n <div class=\"inputActionsContainer\">\n <div class=\"inputActionsLeft\">\n <template v-if=\"!state.hideAddApi\">\n <SearchPopover v-if=\"!state.isLoggedIn?.value\">\n <button\n class=\"addAPIButton\"\n type=\"button\">\n <ScalarIconPlus\n class=\"size-4\"\n weight=\"bold\" />\n </button>\n </SearchPopover>\n <ActionsDropdown\n v-else\n @uploadApi=\"$emit('uploadApi')\">\n <button\n class=\"addAPIButton\"\n type=\"button\">\n <ScalarIconPlus\n class=\"size-4\"\n weight=\"bold\" />\n </button>\n </ActionsDropdown>\n </template>\n <div\n v-for=\"document in state.registryDocuments.value\"\n :key=\"document.id\"\n class=\"apiPill\">\n <img\n v-if=\"document.logoUrl\"\n class=\"apiPillLogo\"\n :src=\"document.logoUrl\" />\n {{ document.title }}\n <button\n v-if=\"document.removable\"\n class=\"apiPillRemove\"\n type=\"button\"\n @click=\"state.removeDocument(document)\">\n <ScalarIconX\n class=\"size-4\"\n weight=\"bold\" />\n </button>\n </div>\n </div>\n\n <div class=\"inputActionsRight\">\n <template v-if=\"!state.loading.value\">\n <ScalarTooltip content=\"Settings\">\n <ScalarIconButton\n class=\"settingsButton h-7 w-7 p-1.5\"\n :icon=\"ScalarIconLockSimple\"\n label=\"Scalar\"\n size=\"md\"\n weight=\"bold\"\n @click=\"state.settingsModal.show()\" />\n </ScalarTooltip>\n </template>\n <div class=\"sendCheckboxContinue\">\n <div\n v-if=\"!state.terms.accepted.value && state.mode === 'preview'\"\n class=\"relative flex items-center gap-1.5\">\n <input\n id=\"agentTermsAgree\"\n class=\"sr-only\"\n type=\"checkbox\"\n @change=\"acceptTerms\" />\n <label\n class=\"termsAgree\"\n for=\"agentTermsAgree\">\n <ScalarIconCheck\n class=\"termsAgreeIcon\"\n weight=\"bold\" />\n Agree to Terms & Conditions\n </label>\n </div>\n <ScalarIconButton\n v-if=\"!state.loading.value\"\n class=\"sendButton h-7 w-7 p-1.5\"\n :disabled=\"submitDisabled\"\n :icon=\"ScalarIconArrowUp\"\n label=\"Scalar\"\n size=\"md\"\n type=\"submit\"\n weight=\"bold\" />\n <ScalarLoading\n v-else\n class=\"loader h-7 w-7\"\n :loader=\"{\n isLoading: state.loading.value,\n isValid: false,\n clear: async () => {},\n invalidate: async () => {},\n isInvalid: false,\n isActive: false,\n validate: async () => {},\n start: () => {},\n }\"\n size=\"2xl\" />\n </div>\n </div>\n </div>\n </form>\n\n <div\n v-if=\"state.chat.messages.length <= 1 && !state.hideAddApi\"\n class=\"addMoreContext\">\n <span>Load additional APIs</span>\n <div class=\"ml-auto flex items-center gap-1\">\n <button\n v-for=\"doc of state.curatedDocuments.value\"\n :key=\"doc.id\"\n class=\"addAPIContext\"\n type=\"button\"\n @click=\"state.addDocument(doc)\">\n <img\n v-if=\"doc.logoUrl\"\n :alt=\"doc.title\"\n class=\"size-4\"\n :src=\"doc.logoUrl\" />\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.actionContainer {\n background: color-mix(\n in srgb,\n var(--scalar-background-2),\n var(--scalar-background-1)\n );\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-radius: 16px;\n width: 100%;\n position: relative;\n /* visually hides overflowing text below */\n box-shadow: 0 24px 0 2px var(--scalar-background-1);\n}\n.promptForm {\n width: 100%;\n position: relative;\n display: flex;\n flex-direction: column;\n background: var(--scalar-background-1);\n box-shadow:\n var(--scalar-shadow-1),\n 0 0 0 var(--scalar-border-width) var(--scalar-border-color);\n border-radius: 16px;\n}\n\n.inputActionsContainer {\n display: flex;\n justify-content: space-between;\n padding: 0 8px 8px 8px;\n}\n\n.inputActionsLeft {\n display: flex;\n flex-wrap: wrap; /* key: allows pills to go to next line */\n align-items: center;\n gap: 5px; /* spacing between pills */\n}\n\n.inputActionsRight {\n display: flex;\n gap: 5px;\n position: relative;\n}\n\n.apiPill {\n font-size: var(--scalar-font-size-3);\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n color: var(--scalar-color-2);\n font-weight: var(--scalar-semibold);\n height: 28px;\n align-items: center;\n display: flex;\n border-radius: 16px;\n padding: 0 8px;\n pointer-events: all;\n z-index: 1;\n gap: 4px;\n user-select: none;\n}\n.apiPillLogo {\n width: 15px;\n}\n\n.apiPillRemove {\n width: 24px;\n height: 24px;\n margin-right: -6px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.apiPill:hover .apiPillRemove {\n background: var(--scalar-background-2);\n}\n.dark-mode .apiPill:hover .apiPillRemove {\n background: var(--scalar-background-3);\n}\n\n.apiPillRemove:hover {\n color: var(--scalar-color-1);\n}\n\n.prompt {\n width: 100%;\n outline: none;\n border: none;\n resize: none;\n field-sizing: content;\n min-height: 64px;\n z-index: 1;\n max-height: 250px;\n max-width: 100%;\n overflow-y: auto;\n scrollbar-width: thin;\n word-wrap: break-word;\n font-family: var(--scalar-font);\n font-size: 16px;\n padding: 12px 12px 14px 12px;\n}\n.dark-mode .promptForm {\n background: var(--scalar-background-2);\n}\n\n.prompt:disabled {\n color: var(--scalar-color-3);\n}\n\n.addAPIButton {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--scalar-color-2);\n font-size: var(--scalar-font-size-3);\n height: 28px;\n width: 28px;\n font-weight: var(--scalar-bold);\n border-radius: 100%;\n display: flex;\n align-items: center;\n gap: 4px;\n pointer-events: all;\n z-index: 1;\n box-shadow: 0 0 0 var(--scalar-border-width) var(--scalar-border-color);\n}\n.addAPIButton:hover {\n background: color-mix(\n in srgb,\n var(--scalar-background-2),\n var(--scalar-background-1)\n );\n box-shadow: 0 0 0 var(--scalar-border-width) var(--scalar-border-color);\n}\n.dark-mode .addAPIButton:hover {\n background: var(--scalar-background-3);\n}\n\n.settingsButton {\n color: var(--scalar-color-3) !important;\n border-radius: 50% !important;\n margin: 0 !important;\n z-index: 1;\n}\n.settingsButton[aria-disabled='true'] {\n background: var(--scalar-background-2);\n}\n.dark-mode .settingsButton:hover {\n background: var(--scalar-background-3);\n}\n\n.sendButton {\n background: var(--scalar-color-blue) !important;\n border-radius: 50% !important;\n margin: 0 !important;\n z-index: 1;\n border: var(--scalar-border-width) solid var(--scalar-color-blue);\n}\n.sendButton:not([aria-disabled='true']) {\n color: white !important;\n}\n.sendButton:not([aria-disabled='true']):hover {\n background: color-mix(\n in srgb,\n var(--scalar-color-blue),\n transparent 10%\n ) !important;\n}\n.sendButton[aria-disabled='true'] {\n background: var(--scalar-background-2) !important;\n color: var(--scalar-color-3) !important;\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n}\n\n.dark-mode .sendButton[aria-disabled='true'] {\n background: var(--scalar-background-3) !important;\n}\n.contextContainer {\n display: flex;\n width: 100%;\n padding: 10px 12px 12px 12px;\n color: var(--scalar-color-2);\n font-size: var(--scalar-font-size-3);\n user-select: none;\n justify-content: space-between;\n}\n\n.settingsButton {\n font-weight: var(--scalar-semibold);\n border-radius: var(--scalar-radius-lg);\n padding: 4px 6px;\n margin: -4px -6px;\n}\n.settingsButton:hover {\n background: var(--scalar-background-2);\n box-shadow: 0 0 var(--scalar-border-width) 0 var(--scalar-border-color);\n cursor: pointer;\n}\n\n.agentLabel {\n font-size: 0px;\n position: absolute;\n width: 100%;\n height: 100%;\n cursor: text;\n}\n.sendCheckboxContinue:has(input) {\n display: flex;\n align-items: center;\n border-radius: 14px;\n background: var(--scalar-background-2);\n box-shadow: 0 0 0 1.5px var(--scalar-background-2);\n color: var(--scalar-color-2);\n font-size: var(--scalar-font-size-3);\n font-weight: var(--scalar-semibold);\n user-select: none;\n height: 28px;\n}\n.dark-mode .sendCheckboxContinue:has(input) {\n background: var(--scalar-background-3);\n box-shadow: 0 0 0 1.5px var(--scalar-background-3);\n}\n\n.addMoreContext {\n height: 40px;\n display: flex;\n position: relative;\n font-size: var(--scalar-font-size-3);\n color: var(--scalar-color-3);\n padding: 0 8px 0 12px;\n align-items: center;\n}\n.addMoreContext:before {\n content: '';\n width: 8px;\n height: 8px;\n background: color-mix(\n in srgb,\n var(--scalar-background-1),\n var(--scalar-background-2)\n );\n transform: rotate(45deg);\n left: 18px;\n top: -3px;\n position: absolute;\n box-shadow:\n -0.5px -0.5px 0 var(--scalar-border-color),\n inset 0.5px 0.5px 1px var(--scalar-border-color);\n}\n.dark-mode .addMoreContext:before {\n box-shadow: -0.5px -0.5px 0 var(--scalar-border-color);\n}\n.addAPIContext {\n width: 28px;\n height: 28px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n}\n\n.termsAgree {\n display: flex;\n cursor: pointer;\n height: inherit;\n align-items: center;\n border-radius: 14px;\n gap: 5px;\n margin: 0px 5px;\n}\n\n.termsAgree:hover {\n color: var(--scalar-color-1);\n}\n\n.termsAgree:hover .termsAgreeIcon {\n background: var(--scalar-color-1);\n color: var(--scalar-background-1);\n}\n\n.termsAgreeIcon {\n width: inherit;\n height: inherit;\n padding: 2px;\n border-radius: 50%;\n background: var(--scalar-background-2);\n}\n</style>\n","<script setup lang=\"ts\">\nimport {\n ScalarIconButton,\n ScalarLoading,\n ScalarTooltip,\n} from '@scalar/components'\nimport {\n ScalarIconArrowUp,\n ScalarIconCheck,\n ScalarIconLockSimple,\n ScalarIconPlus,\n ScalarIconX,\n} from '@scalar/icons'\nimport { computed, useTemplateRef, watch } from 'vue'\n\nimport ActionsDropdown from '@/components/ActionsDropdown.vue'\nimport ApprovalSection from '@/components/ApprovalSection.vue'\nimport ErrorMessageMessage from '@/components/ErrorMessage.vue'\nimport FreeMessagesInfoSection from '@/components/FreeMessagesInfoSection.vue'\nimport PaymentSection from '@/components/PaymentSection.vue'\nimport SearchPopover from '@/components/SearchPopover.vue'\nimport UploadSection from '@/components/UploadSection.vue'\nimport { AgentErrorCodes } from '@/entities/error/constants'\nimport { MAX_PROMPT_SIZE } from '@/entities/prompt/constants'\nimport { useRequestApprovals } from '@/hooks/use-chat-approvals'\nimport { useChatError } from '@/hooks/use-chat-error'\nimport { useChatPendingClientToolParts } from '@/hooks/use-chat-pending-client-tool-parts'\nimport { useUploadTmpDocument } from '@/hooks/use-upload-tmp-document'\nimport { useState } from '@/state/state'\n\nconst emit = defineEmits<{\n (e: 'submit'): void\n (e: 'uploadApi'): void\n}>()\n\ndefineExpose({ focusPrompt })\n\nconst promptRef = useTemplateRef<HTMLTextAreaElement>('agentPrompt')\n\nconst state = useState()\n\nconst inputHasContent = computed(() => state.prompt.value.trim().length > 0)\nconst promptTooLarge = computed(\n () => state.prompt.value.trim().length > MAX_PROMPT_SIZE,\n)\n\n/** Show free messages info only after at least one message has been sent and when no API key is set. */\nconst showFreeMessagesInfo = computed(\n () =>\n state.chat.messages.length > 1 &&\n !state.getAgentKey?.() &&\n chatError?.value?.code !== AgentErrorCodes.LIMIT_REACHED,\n)\n\nwatch(state.prompt, () => {\n if (!promptRef?.value) {\n return\n }\n\n if (!state.prompt.value.length) {\n promptRef.value.style.height = '0px'\n return\n }\n\n promptRef.value.style.height = 'auto'\n promptRef.value.style.height = promptRef.value.scrollHeight + 'px'\n})\n\nfunction handlePromptKeydown(e: KeyboardEvent) {\n if (state.loading.value) {\n return\n }\n\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSubmit()\n window.scrollTo(0, document.body.scrollHeight)\n }\n}\n\nfunction focusPrompt() {\n promptRef.value?.focus()\n}\n\nwatch(\n () => state.chat.status,\n (status) => {\n if (status === 'ready' || status === 'error') {\n promptRef.value?.focus()\n }\n },\n)\n\nconst { approvalRequiredParts, respondToRequestApprovals } =\n useRequestApprovals()\n\nconst { pendingClientToolParts } = useChatPendingClientToolParts()\n\nconst uploadTmpDoc = useUploadTmpDocument()\n\nfunction acceptTerms() {\n state.terms.accept()\n\n if (state.mode === 'preview' && state.getActiveDocumentJson) {\n uploadTmpDoc.uploadTempDocument(state.getActiveDocumentJson(), true)\n }\n}\n\nconst isPending = computed(() =>\n Object.values(state.pendingDocuments).some(Boolean),\n)\n\nconst submitDisabled = computed(() => {\n const tooLarge = promptTooLarge.value\n const missingInput = !inputHasContent.value\n const awaitingApproval = approvalRequiredParts.value.length > 0\n const pendingToolParts = pendingClientToolParts.value.length > 0\n\n const isPreview = state.mode === 'preview'\n\n const termsNotAccepted = isPreview && !state.terms.accepted.value\n const uploadingTmpDoc = isPreview && !!uploadTmpDoc.uploadState.value\n const isLoading = isPending.value\n\n return (\n tooLarge ||\n missingInput ||\n awaitingApproval ||\n pendingToolParts ||\n termsNotAccepted ||\n uploadingTmpDoc ||\n isLoading\n )\n})\n\nfunction handleSubmit() {\n if (submitDisabled.value) {\n return\n }\n\n emit('submit')\n}\n\nconst chatError = useChatError()\n</script>\n\n<template>\n <div class=\"actionContainer\">\n <UploadSection\n v-if=\"uploadTmpDoc.uploadState.value || isPending\"\n :uploadState=\"uploadTmpDoc.uploadState.value ?? { type: 'loading' }\" />\n <ErrorMessageMessage\n v-if=\"chatError\"\n :error=\"chatError\" />\n <ApprovalSection\n v-if=\"approvalRequiredParts.length\"\n @approve=\"respondToRequestApprovals(true)\"\n @reject=\"respondToRequestApprovals(false)\" />\n <PaymentSection v-if=\"chatError?.code === AgentErrorCodes.LIMIT_REACHED\" />\n <FreeMessagesInfoSection v-if=\"showFreeMessagesInfo\" />\n <form\n class=\"promptForm\"\n @submit.prevent=\"handleSubmit\">\n <label\n class=\"agentLabel\"\n for=\"agentTextarea\">\n Type a Request To get Started\n </label>\n <textarea\n id=\"agentTextarea\"\n ref=\"agentPrompt\"\n v-model=\"state.prompt.value\"\n class=\"prompt custom-scroll\"\n :disabled=\"state.loading.value\"\n name=\"prompt\"\n placeholder=\"Ask me anything…\"\n @keydown=\"handlePromptKeydown\" />\n <div class=\"inputActionsContainer\">\n <div class=\"inputActionsLeft\">\n <template v-if=\"!state.hideAddApi\">\n <SearchPopover v-if=\"!state.isLoggedIn?.value\">\n <button\n class=\"addAPIButton\"\n type=\"button\">\n <ScalarIconPlus\n class=\"size-4\"\n weight=\"bold\" />\n </button>\n </SearchPopover>\n <ActionsDropdown\n v-else\n @uploadApi=\"$emit('uploadApi')\">\n <button\n class=\"addAPIButton\"\n type=\"button\">\n <ScalarIconPlus\n class=\"size-4\"\n weight=\"bold\" />\n </button>\n </ActionsDropdown>\n </template>\n <div\n v-for=\"document in state.registryDocuments.value\"\n :key=\"document.id\"\n class=\"apiPill\">\n <img\n v-if=\"document.logoUrl\"\n class=\"apiPillLogo\"\n :src=\"document.logoUrl\" />\n {{ document.title }}\n <button\n v-if=\"document.removable\"\n class=\"apiPillRemove\"\n type=\"button\"\n @click=\"state.removeDocument(document)\">\n <ScalarIconX\n class=\"size-4\"\n weight=\"bold\" />\n </button>\n </div>\n </div>\n\n <div class=\"inputActionsRight\">\n <template v-if=\"!state.loading.value\">\n <ScalarTooltip content=\"Settings\">\n <ScalarIconButton\n class=\"settingsButton h-7 w-7 p-1.5\"\n :icon=\"ScalarIconLockSimple\"\n label=\"Scalar\"\n size=\"md\"\n weight=\"bold\"\n @click=\"state.settingsModal.show()\" />\n </ScalarTooltip>\n </template>\n <div class=\"sendCheckboxContinue\">\n <div\n v-if=\"!state.terms.accepted.value && state.mode === 'preview'\"\n class=\"relative flex items-center gap-1.5\">\n <input\n id=\"agentTermsAgree\"\n class=\"sr-only\"\n type=\"checkbox\"\n @change=\"acceptTerms\" />\n <label\n class=\"termsAgree\"\n for=\"agentTermsAgree\">\n <ScalarIconCheck\n class=\"termsAgreeIcon\"\n weight=\"bold\" />\n Agree to Terms & Conditions\n </label>\n </div>\n <ScalarIconButton\n v-if=\"!state.loading.value\"\n class=\"sendButton h-7 w-7 p-1.5\"\n :disabled=\"submitDisabled\"\n :icon=\"ScalarIconArrowUp\"\n label=\"Scalar\"\n size=\"md\"\n type=\"submit\"\n weight=\"bold\" />\n <ScalarLoading\n v-else\n class=\"loader h-7 w-7\"\n :loader=\"{\n isLoading: state.loading.value,\n isValid: false,\n clear: async () => {},\n invalidate: async () => {},\n isInvalid: false,\n isActive: false,\n validate: async () => {},\n start: () => {},\n }\"\n size=\"2xl\" />\n </div>\n </div>\n </div>\n </form>\n\n <div\n v-if=\"state.chat.messages.length <= 1 && !state.hideAddApi\"\n class=\"addMoreContext\">\n <span>Load additional APIs</span>\n <div class=\"ml-auto flex items-center gap-1\">\n <button\n v-for=\"doc of state.curatedDocuments.value\"\n :key=\"doc.id\"\n class=\"addAPIContext\"\n type=\"button\"\n @click=\"state.addDocument(doc)\">\n <img\n v-if=\"doc.logoUrl\"\n :alt=\"doc.title\"\n class=\"size-4\"\n :src=\"doc.logoUrl\" />\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.actionContainer {\n background: color-mix(\n in srgb,\n var(--scalar-background-2),\n var(--scalar-background-1)\n );\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-radius: 16px;\n width: 100%;\n position: relative;\n /* visually hides overflowing text below */\n box-shadow: 0 24px 0 2px var(--scalar-background-1);\n}\n.promptForm {\n width: 100%;\n position: relative;\n display: flex;\n flex-direction: column;\n background: var(--scalar-background-1);\n box-shadow:\n var(--scalar-shadow-1),\n 0 0 0 var(--scalar-border-width) var(--scalar-border-color);\n border-radius: 16px;\n}\n\n.inputActionsContainer {\n display: flex;\n justify-content: space-between;\n padding: 0 8px 8px 8px;\n}\n\n.inputActionsLeft {\n display: flex;\n flex-wrap: wrap; /* key: allows pills to go to next line */\n align-items: center;\n gap: 5px; /* spacing between pills */\n}\n\n.inputActionsRight {\n display: flex;\n gap: 5px;\n position: relative;\n}\n\n.apiPill {\n font-size: var(--scalar-font-size-3);\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n color: var(--scalar-color-2);\n font-weight: var(--scalar-semibold);\n height: 28px;\n align-items: center;\n display: flex;\n border-radius: 16px;\n padding: 0 8px;\n pointer-events: all;\n z-index: 1;\n gap: 4px;\n user-select: none;\n}\n.apiPillLogo {\n width: 15px;\n}\n\n.apiPillRemove {\n width: 24px;\n height: 24px;\n margin-right: -6px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.apiPill:hover .apiPillRemove {\n background: var(--scalar-background-2);\n}\n.dark-mode .apiPill:hover .apiPillRemove {\n background: var(--scalar-background-3);\n}\n\n.apiPillRemove:hover {\n color: var(--scalar-color-1);\n}\n\n.prompt {\n width: 100%;\n outline: none;\n border: none;\n resize: none;\n field-sizing: content;\n min-height: 64px;\n z-index: 1;\n max-height: 250px;\n max-width: 100%;\n overflow-y: auto;\n scrollbar-width: thin;\n word-wrap: break-word;\n font-family: var(--scalar-font);\n font-size: 16px;\n padding: 12px 12px 14px 12px;\n}\n.dark-mode .promptForm {\n background: var(--scalar-background-2);\n}\n\n.prompt:disabled {\n color: var(--scalar-color-3);\n}\n\n.addAPIButton {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--scalar-color-2);\n font-size: var(--scalar-font-size-3);\n height: 28px;\n width: 28px;\n font-weight: var(--scalar-bold);\n border-radius: 100%;\n display: flex;\n align-items: center;\n gap: 4px;\n pointer-events: all;\n z-index: 1;\n box-shadow: 0 0 0 var(--scalar-border-width) var(--scalar-border-color);\n}\n.addAPIButton:hover {\n background: color-mix(\n in srgb,\n var(--scalar-background-2),\n var(--scalar-background-1)\n );\n box-shadow: 0 0 0 var(--scalar-border-width) var(--scalar-border-color);\n}\n.dark-mode .addAPIButton:hover {\n background: var(--scalar-background-3);\n}\n\n.settingsButton {\n color: var(--scalar-color-3) !important;\n border-radius: 50% !important;\n margin: 0 !important;\n z-index: 1;\n}\n.settingsButton[aria-disabled='true'] {\n background: var(--scalar-background-2);\n}\n.dark-mode .settingsButton:hover {\n background: var(--scalar-background-3);\n}\n\n.sendButton {\n background: var(--scalar-color-blue) !important;\n border-radius: 50% !important;\n margin: 0 !important;\n z-index: 1;\n border: var(--scalar-border-width) solid var(--scalar-color-blue);\n}\n.sendButton:not([aria-disabled='true']) {\n color: white !important;\n}\n.sendButton:not([aria-disabled='true']):hover {\n background: color-mix(\n in srgb,\n var(--scalar-color-blue),\n transparent 10%\n ) !important;\n}\n.sendButton[aria-disabled='true'] {\n background: var(--scalar-background-2) !important;\n color: var(--scalar-color-3) !important;\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n}\n\n.dark-mode .sendButton[aria-disabled='true'] {\n background: var(--scalar-background-3) !important;\n}\n.contextContainer {\n display: flex;\n width: 100%;\n padding: 10px 12px 12px 12px;\n color: var(--scalar-color-2);\n font-size: var(--scalar-font-size-3);\n user-select: none;\n justify-content: space-between;\n}\n\n.settingsButton {\n font-weight: var(--scalar-semibold);\n border-radius: var(--scalar-radius-lg);\n padding: 4px 6px;\n margin: -4px -6px;\n}\n.settingsButton:hover {\n background: var(--scalar-background-2);\n box-shadow: 0 0 var(--scalar-border-width) 0 var(--scalar-border-color);\n cursor: pointer;\n}\n\n.agentLabel {\n font-size: 0px;\n position: absolute;\n width: 100%;\n height: 100%;\n cursor: text;\n}\n.sendCheckboxContinue:has(input) {\n display: flex;\n align-items: center;\n border-radius: 14px;\n background: var(--scalar-background-2);\n box-shadow: 0 0 0 1.5px var(--scalar-background-2);\n color: var(--scalar-color-2);\n font-size: var(--scalar-font-size-3);\n font-weight: var(--scalar-semibold);\n user-select: none;\n height: 28px;\n}\n.dark-mode .sendCheckboxContinue:has(input) {\n background: var(--scalar-background-3);\n box-shadow: 0 0 0 1.5px var(--scalar-background-3);\n}\n\n.addMoreContext {\n height: 40px;\n display: flex;\n position: relative;\n font-size: var(--scalar-font-size-3);\n color: var(--scalar-color-3);\n padding: 0 8px 0 12px;\n align-items: center;\n}\n.addMoreContext:before {\n content: '';\n width: 8px;\n height: 8px;\n background: color-mix(\n in srgb,\n var(--scalar-background-1),\n var(--scalar-background-2)\n );\n transform: rotate(45deg);\n left: 18px;\n top: -3px;\n position: absolute;\n box-shadow:\n -0.5px -0.5px 0 var(--scalar-border-color),\n inset 0.5px 0.5px 1px var(--scalar-border-color);\n}\n.dark-mode .addMoreContext:before {\n box-shadow: -0.5px -0.5px 0 var(--scalar-border-color);\n}\n.addAPIContext {\n width: 28px;\n height: 28px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n}\n\n.termsAgree {\n display: flex;\n cursor: pointer;\n height: inherit;\n align-items: center;\n border-radius: 14px;\n gap: 5px;\n margin: 0px 5px;\n}\n\n.termsAgree:hover {\n color: var(--scalar-color-1);\n}\n\n.termsAgree:hover .termsAgreeIcon {\n background: var(--scalar-color-1);\n color: var(--scalar-background-1);\n}\n\n.termsAgreeIcon {\n width: inherit;\n height: inherit;\n padding: 2px;\n border-radius: 50%;\n background: var(--scalar-background-2);\n}\n</style>\n","<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","<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","<template>\n <svg\n fill=\"none\"\n height=\"54\"\n viewBox=\"0 0 64 54\"\n width=\"64\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n clip-rule=\"evenodd\"\n d=\"M31.0667 0C40.2667 0 48.3333 6.13333 52.6 14.9333H57.2667C59.6 14.9333 61.5333 16.8 61.5333 19.1333V32.2C61.5333 33.4667 60.8667 34.6 60 35.3333L63.3333 45.4V45.4667C63.5639 46.207 63.6166 46.9912 63.4874 47.7557C63.3582 48.5202 63.0505 49.2435 62.5895 49.8669C62.1284 50.4903 61.5269 50.9962 60.8338 51.3437C60.1406 51.6911 59.3754 51.8703 58.6 51.8667H54.3333C53.9895 52.4222 53.5082 52.8797 52.936 53.195C52.3638 53.5103 51.72 53.6728 51.0667 53.6667H47.0667C46.5764 53.6755 46.0892 53.5877 45.6328 53.4082C45.1765 53.2287 44.76 52.961 44.4071 52.6205C44.0542 52.28 43.7719 51.8733 43.5762 51.4237C43.3805 50.9741 43.2753 50.4903 43.2667 50C43.2667 47.9333 44.9333 46.2667 47 46.2667H51.0667C52.4667 46.2667 53.7333 46.9333 54.3333 48.0667H58.6C59.3333 48.0667 59.9333 47.4 59.6667 46.6L56.3333 36.3333H51.3333C49.9333 36.3333 48.6 35.6667 47.8 34.5333V34.4667L46.8 32.9333C46.7585 32.8643 46.6999 32.8072 46.6298 32.7675C46.5597 32.7279 46.4805 32.707 46.4 32.707C46.3195 32.707 46.2403 32.7279 46.1702 32.7675C46.1001 32.8072 46.0415 32.8643 46 32.9333L45.4667 34C45.1162 34.7065 44.5739 35.3 43.9019 35.7126C43.2299 36.1253 42.4552 36.3404 41.6667 36.3333H24.9333C23.4 36.3333 21.9333 35.7333 20.8667 34.6667H20.8L19.8667 33.6667C19.6667 33.4667 19.4667 33.3333 19.2 33.3333L17.4667 33.1333C17.3333 38.8667 13.4667 43.4667 8.73333 43.4667C3.93333 43.4667 0 38.6667 0 32.9333C0 32.2667 0 31.6667 0.133333 31.1333V31C0.8 26.8 3.46667 23.4667 6.93333 22.6C9.46667 9.93333 19.3333 0 31.0667 0ZM3.93333 31.5333C4.46667 28 6.93333 26.2 8.73333 26.2C10.7333 26.2 13.6 28.4 13.6 32.8667C13.6 34.4667 13.2667 35.7333 12.7333 36.7333C11.7333 38.7333 10.0667 39.6667 8.73333 39.6667C7.67025 39.6269 6.66506 39.1722 5.93333 38.4C5.8414 38.3142 5.75246 38.2253 5.66667 38.1333C5.19113 37.6008 4.80806 36.9924 4.53333 36.3333C4.0607 35.2169 3.83335 34.0119 3.86667 32.8V31.6667L3.93333 31.6V31.5333ZM24.3333 20.6667C24.3333 19.6667 25.2 18.8 26.2667 18.8H55.8667C56.9333 18.8 57.8 19.6667 57.7333 20.7333V30.7333C57.6667 31.8 56.8 32.6667 55.7333 32.6667H53.4C53.0667 32.6667 52.7333 32.6667 52.4 32.5333C51.5333 32.3333 50.7333 31.8667 50.4 31.3333L47.9333 27.6C47.7363 27.2901 47.4602 27.0383 47.1336 26.8706C46.8069 26.7028 46.4414 26.6251 46.0747 26.6455C45.7081 26.6658 45.3535 26.7835 45.0474 26.9865C44.7413 27.1894 44.4948 27.4702 44.3333 27.8L42.6667 31C42.4199 31.4974 42.04 31.9165 41.5692 32.2107C41.0984 32.505 40.5552 32.6628 40 32.6667L26.2 32.8C25.1333 32.8 24.2667 31.9333 24.2667 30.8667V20.6667H24.3333ZM11 22.2C13.5333 11.5333 22 3.86667 31 3.86667C37.9333 3.86667 44.4 8.2 48.3333 15H24.3333C21.4667 15 18.6 16 16.3333 17.8L16.2667 17.8667L10.9333 22.2H11Z\"\n fill=\"currentColor\"\n fill-rule=\"evenodd\" />\n </svg>\n</template>\n","<script setup lang=\"ts\">\nimport Logo from '@/components/Logo.vue'\nimport { URLS } from '@/consts/urls'\nimport { useState } from '@/state/state'\nimport PromptForm from '@/views/PromptForm.vue'\n\nconst emit = defineEmits<{\n (e: 'submit'): void\n (e: 'uploadApi'): void\n}>()\n\nconst { mode } = useState()\n</script>\n\n<template>\n <div class=\"startContainer\">\n <Logo class=\"agentLogo\" />\n <h1 class=\"heading\">How can I help you today?</h1>\n <PromptForm\n ref=\"promptFormField\"\n @submit=\"emit('submit')\"\n @uploadApi=\"emit('uploadApi')\" />\n <p class=\"disclaimerText\">\n <template v-if=\"mode === 'preview'\">\n By messaging Agent Scalar your OpenAPI document will be temporarily\n uploaded to Scalar's servers. You must agree to our\n </template>\n <template v-else>By messaging Agent Scalar you agree to our </template>\n <a\n class=\"disclaimerLink\"\n :href=\"URLS.TERMS_AND_CONDITIONS\"\n target=\"_blank\"\n >Terms</a\n >\n and\n <a\n class=\"disclaimerLink\"\n :href=\"URLS.PRIVACY_POLICY\"\n target=\"_blank\"\n >Privacy Policy</a\n >.\n </p>\n </div>\n</template>\n\n<style scoped>\n.agentLogo {\n margin-bottom: 15px;\n}\n\n.startContainer {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n max-width: 720px;\n position: relative;\n}\n\n.heading {\n font-size: 1.5rem;\n font-weight: var(--scalar-font-bold);\n margin-bottom: 50px;\n}\n\n.disclaimerText {\n text-align: center;\n color: var(--scalar-color-3);\n font-size: var(--scalar-font-size-3);\n text-wrap: balance;\n line-height: 1.44;\n margin-top: 40px;\n}\n\n.disclaimerLink {\n text-decoration: underline;\n}\n</style>\n","<script setup lang=\"ts\">\nimport Logo from '@/components/Logo.vue'\nimport { URLS } from '@/consts/urls'\nimport { useState } from '@/state/state'\nimport PromptForm from '@/views/PromptForm.vue'\n\nconst emit = defineEmits<{\n (e: 'submit'): void\n (e: 'uploadApi'): void\n}>()\n\nconst { mode } = useState()\n</script>\n\n<template>\n <div class=\"startContainer\">\n <Logo class=\"agentLogo\" />\n <h1 class=\"heading\">How can I help you today?</h1>\n <PromptForm\n ref=\"promptFormField\"\n @submit=\"emit('submit')\"\n @uploadApi=\"emit('uploadApi')\" />\n <p class=\"disclaimerText\">\n <template v-if=\"mode === 'preview'\">\n By messaging Agent Scalar your OpenAPI document will be temporarily\n uploaded to Scalar's servers. You must agree to our\n </template>\n <template v-else>By messaging Agent Scalar you agree to our </template>\n <a\n class=\"disclaimerLink\"\n :href=\"URLS.TERMS_AND_CONDITIONS\"\n target=\"_blank\"\n >Terms</a\n >\n and\n <a\n class=\"disclaimerLink\"\n :href=\"URLS.PRIVACY_POLICY\"\n target=\"_blank\"\n >Privacy Policy</a\n >.\n </p>\n </div>\n</template>\n\n<style scoped>\n.agentLogo {\n margin-bottom: 15px;\n}\n\n.startContainer {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n max-width: 720px;\n position: relative;\n}\n\n.heading {\n font-size: 1.5rem;\n font-weight: var(--scalar-font-bold);\n margin-bottom: 50px;\n}\n\n.disclaimerText {\n text-align: center;\n color: var(--scalar-color-3);\n font-size: var(--scalar-font-size-3);\n text-wrap: balance;\n line-height: 1.44;\n margin-top: 40px;\n}\n\n.disclaimerLink {\n text-decoration: underline;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useState } from '@/state/state'\nimport Chat from '@/views/Chat/Chat.vue'\nimport Start from '@/views/Start.vue'\n\nconst emit = defineEmits<{\n (e: 'submit'): void\n (e: 'uploadApi'): void\n}>()\n\nconst { chat } = useState()\n</script>\n\n<template>\n <div class=\"wrapper\">\n <Chat\n v-if=\"\n chat.messages.length &&\n (chat.messages.length > 1 || chat.status !== 'submitted')\n \"\n @submit=\"emit('submit')\"\n @uploadApi=\"emit('uploadApi')\" />\n <Start\n v-else\n @submit=\"emit('submit')\"\n @uploadApi=\"emit('uploadApi')\" />\n </div>\n</template>\n\n<style scoped>\n.wrapper {\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 100%;\n width: 100%;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useState } from '@/state/state'\nimport Chat from '@/views/Chat/Chat.vue'\nimport Start from '@/views/Start.vue'\n\nconst emit = defineEmits<{\n (e: 'submit'): void\n (e: 'uploadApi'): void\n}>()\n\nconst { chat } = useState()\n</script>\n\n<template>\n <div class=\"wrapper\">\n <Chat\n v-if=\"\n chat.messages.length &&\n (chat.messages.length > 1 || chat.status !== 'submitted')\n \"\n @submit=\"emit('submit')\"\n @uploadApi=\"emit('uploadApi')\" />\n <Start\n v-else\n @submit=\"emit('submit')\"\n @uploadApi=\"emit('uploadApi')\" />\n </div>\n</template>\n\n<style scoped>\n.wrapper {\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 100%;\n width: 100%;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ScalarButton, ScalarListbox } from '@scalar/components'\nimport { ScalarIconCaretDown } from '@scalar/icons'\nimport type { ServerObject } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\nimport { computed } from 'vue'\n\nconst { target, servers, selectedServer } = defineProps<{\n /** The selected server URL */\n selectedServer: ServerObject | null\n /** Available servers */\n servers: ServerObject[]\n /** The id of the target to use for the popover (e.g. address bar) */\n target: string\n}>()\n\nconst emit = defineEmits<{\n /** Emitted when the selected server changes */\n (e: 'update:modelValue', value: string): void\n}>()\n\nconst serverOptions = computed(() =>\n servers.map((server) => ({\n id: server.url,\n label: server.url,\n })),\n)\n\nconst serverUrlWithoutTrailingSlash = computed(\n () => selectedServer?.url?.replace(/\\/$/, '') || '',\n)\n\nconst selectedServerOption = computed(() =>\n serverOptions.value.find((opt) => opt.id === selectedServer?.url),\n)\n\n// For testing\ndefineExpose({\n servers,\n serverUrlWithoutTrailingSlash,\n serverOptions,\n selectedServer,\n})\n</script>\n<template>\n <ScalarListbox\n v-if=\"serverOptions.length > 1\"\n ref=\"elem\"\n class=\"group\"\n :modelValue=\"selectedServerOption\"\n :options=\"serverOptions\"\n placement=\"bottom-start\"\n resize\n :target=\"target\"\n @update:modelValue=\"(e) => emit('update:modelValue', e.id)\">\n <ScalarButton\n class=\"bg-b-1 text-c-1 h-auto w-full justify-start gap-1.5 overflow-x-auto rounded-t-none rounded-b-xl px-3 py-1.5 text-base font-normal whitespace-nowrap -outline-offset-1\"\n variant=\"ghost\">\n <span class=\"sr-only\">Server:</span>\n <span class=\"overflow-x-auto\">{{\n serverUrlWithoutTrailingSlash || 'Select a server'\n }}</span>\n <ScalarIconCaretDown\n class=\"text-c-2 ui-open:rotate-180 mt-0.25 size-3 transition-transform duration-100\"\n weight=\"bold\" />\n </ScalarButton>\n </ScalarListbox>\n <div\n v-else\n class=\"text-c-1 flex h-auto w-full items-center gap-0.75 rounded-b-lg px-3 py-1.5 text-base leading-[20px] whitespace-nowrap\">\n <span class=\"sr-only\">Server:</span>\n <span class=\"overflow-x-auto\">{{ serverUrlWithoutTrailingSlash }}</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { ScalarButton, ScalarListbox } from '@scalar/components'\nimport { ScalarIconCaretDown } from '@scalar/icons'\nimport type { ServerObject } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\nimport { computed } from 'vue'\n\nconst { target, servers, selectedServer } = defineProps<{\n /** The selected server URL */\n selectedServer: ServerObject | null\n /** Available servers */\n servers: ServerObject[]\n /** The id of the target to use for the popover (e.g. address bar) */\n target: string\n}>()\n\nconst emit = defineEmits<{\n /** Emitted when the selected server changes */\n (e: 'update:modelValue', value: string): void\n}>()\n\nconst serverOptions = computed(() =>\n servers.map((server) => ({\n id: server.url,\n label: server.url,\n })),\n)\n\nconst serverUrlWithoutTrailingSlash = computed(\n () => selectedServer?.url?.replace(/\\/$/, '') || '',\n)\n\nconst selectedServerOption = computed(() =>\n serverOptions.value.find((opt) => opt.id === selectedServer?.url),\n)\n\n// For testing\ndefineExpose({\n servers,\n serverUrlWithoutTrailingSlash,\n serverOptions,\n selectedServer,\n})\n</script>\n<template>\n <ScalarListbox\n v-if=\"serverOptions.length > 1\"\n ref=\"elem\"\n class=\"group\"\n :modelValue=\"selectedServerOption\"\n :options=\"serverOptions\"\n placement=\"bottom-start\"\n resize\n :target=\"target\"\n @update:modelValue=\"(e) => emit('update:modelValue', e.id)\">\n <ScalarButton\n class=\"bg-b-1 text-c-1 h-auto w-full justify-start gap-1.5 overflow-x-auto rounded-t-none rounded-b-xl px-3 py-1.5 text-base font-normal whitespace-nowrap -outline-offset-1\"\n variant=\"ghost\">\n <span class=\"sr-only\">Server:</span>\n <span class=\"overflow-x-auto\">{{\n serverUrlWithoutTrailingSlash || 'Select a server'\n }}</span>\n <ScalarIconCaretDown\n class=\"text-c-2 ui-open:rotate-180 mt-0.25 size-3 transition-transform duration-100\"\n weight=\"bold\" />\n </ScalarButton>\n </ScalarListbox>\n <div\n v-else\n class=\"text-c-1 flex h-auto w-full items-center gap-0.75 rounded-b-lg px-3 py-1.5 text-base leading-[20px] whitespace-nowrap\">\n <span class=\"sr-only\">Server:</span>\n <span class=\"overflow-x-auto\">{{ serverUrlWithoutTrailingSlash }}</span>\n </div>\n</template>\n","<script lang=\"ts\">\ntype SelectorProps = {\n /** The event bus to use for emitting events */\n eventBus: WorkspaceEventBus\n /** The selected server */\n selectedServer: ServerObject | null\n /** Available servers */\n servers: ServerObject[]\n}\n\n/**\n * ServerSelector\n *\n * Core component for rendering a server selector block.\n * Handles server selection and emits a 'server:update:selected' event when the selected server changes.\n *\n * @event server:update:selected - Emitted when the selected server changes\n * @event server:update:variables - Emitted when a server variable changes\n */\nexport default {}\n</script>\n\n<script lang=\"ts\" setup>\nimport { ServerVariablesForm } from '@scalar/api-client/components/Server'\nimport { ScalarMarkdown } from '@scalar/components'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport type { ServerObject } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\nimport { useId } from 'vue'\n\nimport Selector from './Selector.vue'\n\nconst { eventBus, servers, selectedServer } = defineProps<SelectorProps>()\n\nconst id = useId()\n\n/** Update the selected server */\nconst updateServer = (newServer: string) => {\n eventBus.emit('server:update:selected', {\n url: selectedServer?.url === newServer ? '' : newServer,\n meta: {\n type: 'document',\n },\n })\n}\n\n/** Update the server variable */\nconst updateServerVariable = (key: string, value: string) => {\n /** Find the index of the selected server */\n const index = servers.findIndex((s) => s.url === selectedServer?.url)\n if (index === -1) {\n return\n }\n\n eventBus.emit('server:update:variables', {\n index,\n key,\n value,\n meta: {\n type: 'document',\n },\n })\n}\n</script>\n\n<template>\n <label\n class=\"bg-b-2 flex h-8 items-center rounded-t-xl border border-b-0 px-3 py-2.5 font-medium\">\n Server\n </label>\n <div\n :id=\"id\"\n class=\"border\"\n :class=\"{\n 'rounded-b-xl':\n !selectedServer?.description && !selectedServer?.variables,\n }\">\n <Selector\n v-if=\"servers.length\"\n :selectedServer\n :servers=\"servers\"\n :target=\"id\"\n @update:modelValue=\"updateServer\" />\n </div>\n <ServerVariablesForm\n layout=\"reference\"\n :variables=\"selectedServer?.variables\"\n @update:variable=\"updateServerVariable\" />\n\n <!-- Description -->\n <ScalarMarkdown\n v-if=\"selectedServer?.description\"\n class=\"text-c-3 rounded-b-xl border border-t-0 px-3 py-1.5\"\n :value=\"selectedServer.description\" />\n</template>\n","<script lang=\"ts\">\ntype SelectorProps = {\n /** The event bus to use for emitting events */\n eventBus: WorkspaceEventBus\n /** The selected server */\n selectedServer: ServerObject | null\n /** Available servers */\n servers: ServerObject[]\n}\n\n/**\n * ServerSelector\n *\n * Core component for rendering a server selector block.\n * Handles server selection and emits a 'server:update:selected' event when the selected server changes.\n *\n * @event server:update:selected - Emitted when the selected server changes\n * @event server:update:variables - Emitted when a server variable changes\n */\nexport default {}\n</script>\n\n<script lang=\"ts\" setup>\nimport { ServerVariablesForm } from '@scalar/api-client/components/Server'\nimport { ScalarMarkdown } from '@scalar/components'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport type { ServerObject } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\nimport { useId } from 'vue'\n\nimport Selector from './Selector.vue'\n\nconst { eventBus, servers, selectedServer } = defineProps<SelectorProps>()\n\nconst id = useId()\n\n/** Update the selected server */\nconst updateServer = (newServer: string) => {\n eventBus.emit('server:update:selected', {\n url: selectedServer?.url === newServer ? '' : newServer,\n meta: {\n type: 'document',\n },\n })\n}\n\n/** Update the server variable */\nconst updateServerVariable = (key: string, value: string) => {\n /** Find the index of the selected server */\n const index = servers.findIndex((s) => s.url === selectedServer?.url)\n if (index === -1) {\n return\n }\n\n eventBus.emit('server:update:variables', {\n index,\n key,\n value,\n meta: {\n type: 'document',\n },\n })\n}\n</script>\n\n<template>\n <label\n class=\"bg-b-2 flex h-8 items-center rounded-t-xl border border-b-0 px-3 py-2.5 font-medium\">\n Server\n </label>\n <div\n :id=\"id\"\n class=\"border\"\n :class=\"{\n 'rounded-b-xl':\n !selectedServer?.description && !selectedServer?.variables,\n }\">\n <Selector\n v-if=\"servers.length\"\n :selectedServer\n :servers=\"servers\"\n :target=\"id\"\n @update:modelValue=\"updateServer\" />\n </div>\n <ServerVariablesForm\n layout=\"reference\"\n :variables=\"selectedServer?.variables\"\n @update:variable=\"updateServerVariable\" />\n\n <!-- Description -->\n <ScalarMarkdown\n v-if=\"selectedServer?.description\"\n class=\"text-c-3 rounded-b-xl border border-t-0 px-3 py-1.5\"\n :value=\"selectedServer.description\" />\n</template>\n","<script setup lang=\"ts\">\nimport { getSelectedServer } from '@scalar/api-client/v2/features/operation'\nimport { getActiveEnvironment, getServers } from '@scalar/api-client/v2/helpers'\nimport { type WorkspaceDocument } from '@scalar/workspace-store/schemas/workspace'\nimport { computed } from 'vue'\n\nimport ServerSelector from '@/components/ServerSelector.vue'\nimport { useState } from '@/state/state'\nimport Auth from '@/views/Settings/Auth.vue'\n\nconst { document, name } = defineProps<{\n document: WorkspaceDocument\n name: string\n}>()\n\nconst { workspaceStore, config, eventBus } = useState()\n\nconst environment = computed(() =>\n getActiveEnvironment(workspaceStore, document),\n)\n\nconst selectedServer = computed(() => {\n const servers = getServers(document.servers, {\n documentUrl: document['x-scalar-original-source-url'],\n })\n\n return getSelectedServer(servers, document['x-scalar-selected-server'])\n})\n\nconst securitySchemes = computed(\n () => document.components?.securitySchemes ?? {},\n)\n</script>\n\n<template>\n <div class=\"docSettings\">\n <div>\n <Auth\n :authStore=\"workspaceStore.auth\"\n :document\n :environment\n :eventBus\n :name\n :options=\"config\"\n :securitySchemes\n :selectedServer />\n </div>\n <div>\n <ServerSelector\n :eventBus\n :selectedServer\n :servers=\"document.servers ?? []\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n.docSettings {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-bottom: 12px;\n font-size: var(--scalar-font-size-3);\n max-height: 600px;\n}\n\n.documentName {\n font-weight: var(--scalar-semibold);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { getSelectedServer } from '@scalar/api-client/v2/features/operation'\nimport { getActiveEnvironment, getServers } from '@scalar/api-client/v2/helpers'\nimport { type WorkspaceDocument } from '@scalar/workspace-store/schemas/workspace'\nimport { computed } from 'vue'\n\nimport ServerSelector from '@/components/ServerSelector.vue'\nimport { useState } from '@/state/state'\nimport Auth from '@/views/Settings/Auth.vue'\n\nconst { document, name } = defineProps<{\n document: WorkspaceDocument\n name: string\n}>()\n\nconst { workspaceStore, config, eventBus } = useState()\n\nconst environment = computed(() =>\n getActiveEnvironment(workspaceStore, document),\n)\n\nconst selectedServer = computed(() => {\n const servers = getServers(document.servers, {\n documentUrl: document['x-scalar-original-source-url'],\n })\n\n return getSelectedServer(servers, document['x-scalar-selected-server'])\n})\n\nconst securitySchemes = computed(\n () => document.components?.securitySchemes ?? {},\n)\n</script>\n\n<template>\n <div class=\"docSettings\">\n <div>\n <Auth\n :authStore=\"workspaceStore.auth\"\n :document\n :environment\n :eventBus\n :name\n :options=\"config\"\n :securitySchemes\n :selectedServer />\n </div>\n <div>\n <ServerSelector\n :eventBus\n :selectedServer\n :servers=\"document.servers ?? []\" />\n </div>\n </div>\n</template>\n\n<style scoped>\n.docSettings {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-bottom: 12px;\n font-size: var(--scalar-font-size-3);\n max-height: 600px;\n}\n\n.documentName {\n font-weight: var(--scalar-semibold);\n}\n</style>\n","<script setup lang=\"ts\">\nimport {\n ScalarColorModeToggle,\n ScalarModal,\n ScalarTextInput,\n type ModalState,\n} from '@scalar/components'\nimport { ScalarIconCaretDown, ScalarIconCaretRight } from '@scalar/icons'\n\nimport { URLS } from '@/consts/urls'\nimport { useState } from '@/state/state'\nimport DocSettings from '@/views/Settings/DocSettings.vue'\n\nconst { modalState } = defineProps<{\n modalState: ModalState\n}>()\n\nconst { workspaceStore, proxyUrlRaw } = useState()\n\nfunction selectDocument(name: string) {\n workspaceStore.update('x-scalar-active-document', name)\n}\n</script>\n\n<template>\n <ScalarModal\n class=\"settingsModal\"\n :state=\"modalState\">\n <div class=\"settingsHeading\">\n <h1>Settings</h1>\n <ScalarColorModeToggle class=\"colorToggle ml-auto\" />\n </div>\n <div class=\"documentList\">\n <template\n v-if=\"Object.entries(workspaceStore.workspace.documents).length\">\n <div\n v-for=\"[name, document] of Object.entries(\n workspaceStore.workspace.documents,\n )\"\n :key=\"name\"\n class=\"document\">\n <button\n class=\"documentName\"\n :class=\"{\n documentNameActive:\n workspaceStore.workspace.activeDocument === document,\n }\"\n type=\"button\"\n @click=\"selectDocument(name)\">\n @{{ name }}\n <ScalarIconCaretDown\n v-if=\"workspaceStore.workspace.activeDocument === document\" />\n <ScalarIconCaretRight v-else />\n </button>\n <div v-if=\"workspaceStore.workspace.activeDocument === document\">\n <DocSettings\n :document\n :name />\n </div>\n </div>\n </template>\n <div\n v-else\n class=\"noDocuments\">\n There's no API definition loaded. Use the + button to load APIs.\n </div>\n </div>\n\n <div class=\"proxyUrlContainer\">\n <label for=\"proxyUrl\">CORS Proxy</label>\n <p>\n All requests will be sent through the specified proxy URL to help avoid\n CORS (Cross-Origin Resource Sharing) issues.\n <a\n class=\"underline\"\n :href=\"URLS.PROXY_SOURCE_CODE\"\n target=\"_blank\">\n Read more\n </a>\n </p>\n <ScalarTextInput\n id=\"proxyUrl\"\n v-model=\"proxyUrlRaw\"\n label=\"Proxy URL\"\n :placeholder=\"URLS.DEFAULT_PROXY_URL\" />\n </div>\n </ScalarModal>\n</template>\n\n<style>\n/* Prevent auth method dropdown from going behind the modal */\n.settingsModal .scalar-modal-layout {\n z-index: 10 !important;\n}\n\n.settingsModal .scalar-modal-body {\n overflow-y: auto;\n overflow-x: hidden;\n}\n</style>\n\n<style scoped>\n.documentList {\n display: flex;\n flex-direction: column;\n font-size: var(--scalar-font-size-3);\n margin-bottom: 12px;\n}\n\n.document {\n display: flex;\n flex-direction: column;\n width: calc(100% + 24px);\n left: -12px;\n position: relative;\n padding: 0 12px;\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}\n.document:first-of-type:not(:last-of-type) {\n border-bottom: none;\n}\n\n.documentName {\n gap: 4px;\n display: flex;\n align-items: center;\n font-weight: var(--scalar-semibold);\n color: var(--scalar-color-2);\n padding: 12px 0;\n}\n\n.documentNameActive {\n color: var(--scalar-color-1);\n}\n\n.settingsHeading {\n font-size: 19px;\n margin-bottom: 12px;\n display: flex;\n gap: 5px;\n align-items: center;\n font-weight: var(--scalar-semibold);\n}\n\n.proxyUrlContainer {\n font-size: var(--scalar-font-size-3);\n display: flex;\n gap: 5px;\n flex-direction: column;\n}\n.proxyUrlContainer label {\n font-weight: var(--scalar-semibold);\n}\n.noDocuments {\n color: var(--scalar-color-2);\n margin-bottom: 10px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport {\n ScalarColorModeToggle,\n ScalarModal,\n ScalarTextInput,\n type ModalState,\n} from '@scalar/components'\nimport { ScalarIconCaretDown, ScalarIconCaretRight } from '@scalar/icons'\n\nimport { URLS } from '@/consts/urls'\nimport { useState } from '@/state/state'\nimport DocSettings from '@/views/Settings/DocSettings.vue'\n\nconst { modalState } = defineProps<{\n modalState: ModalState\n}>()\n\nconst { workspaceStore, proxyUrlRaw } = useState()\n\nfunction selectDocument(name: string) {\n workspaceStore.update('x-scalar-active-document', name)\n}\n</script>\n\n<template>\n <ScalarModal\n class=\"settingsModal\"\n :state=\"modalState\">\n <div class=\"settingsHeading\">\n <h1>Settings</h1>\n <ScalarColorModeToggle class=\"colorToggle ml-auto\" />\n </div>\n <div class=\"documentList\">\n <template\n v-if=\"Object.entries(workspaceStore.workspace.documents).length\">\n <div\n v-for=\"[name, document] of Object.entries(\n workspaceStore.workspace.documents,\n )\"\n :key=\"name\"\n class=\"document\">\n <button\n class=\"documentName\"\n :class=\"{\n documentNameActive:\n workspaceStore.workspace.activeDocument === document,\n }\"\n type=\"button\"\n @click=\"selectDocument(name)\">\n @{{ name }}\n <ScalarIconCaretDown\n v-if=\"workspaceStore.workspace.activeDocument === document\" />\n <ScalarIconCaretRight v-else />\n </button>\n <div v-if=\"workspaceStore.workspace.activeDocument === document\">\n <DocSettings\n :document\n :name />\n </div>\n </div>\n </template>\n <div\n v-else\n class=\"noDocuments\">\n There's no API definition loaded. Use the + button to load APIs.\n </div>\n </div>\n\n <div class=\"proxyUrlContainer\">\n <label for=\"proxyUrl\">CORS Proxy</label>\n <p>\n All requests will be sent through the specified proxy URL to help avoid\n CORS (Cross-Origin Resource Sharing) issues.\n <a\n class=\"underline\"\n :href=\"URLS.PROXY_SOURCE_CODE\"\n target=\"_blank\">\n Read more\n </a>\n </p>\n <ScalarTextInput\n id=\"proxyUrl\"\n v-model=\"proxyUrlRaw\"\n label=\"Proxy URL\"\n :placeholder=\"URLS.DEFAULT_PROXY_URL\" />\n </div>\n </ScalarModal>\n</template>\n\n<style>\n/* Prevent auth method dropdown from going behind the modal */\n.settingsModal .scalar-modal-layout {\n z-index: 10 !important;\n}\n\n.settingsModal .scalar-modal-body {\n overflow-y: auto;\n overflow-x: hidden;\n}\n</style>\n\n<style scoped>\n.documentList {\n display: flex;\n flex-direction: column;\n font-size: var(--scalar-font-size-3);\n margin-bottom: 12px;\n}\n\n.document {\n display: flex;\n flex-direction: column;\n width: calc(100% + 24px);\n left: -12px;\n position: relative;\n padding: 0 12px;\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}\n.document:first-of-type:not(:last-of-type) {\n border-bottom: none;\n}\n\n.documentName {\n gap: 4px;\n display: flex;\n align-items: center;\n font-weight: var(--scalar-semibold);\n color: var(--scalar-color-2);\n padding: 12px 0;\n}\n\n.documentNameActive {\n color: var(--scalar-color-1);\n}\n\n.settingsHeading {\n font-size: 19px;\n margin-bottom: 12px;\n display: flex;\n gap: 5px;\n align-items: center;\n font-weight: var(--scalar-semibold);\n}\n\n.proxyUrlContainer {\n font-size: var(--scalar-font-size-3);\n display: flex;\n gap: 5px;\n flex-direction: column;\n}\n.proxyUrlContainer label {\n font-weight: var(--scalar-semibold);\n}\n.noDocuments {\n color: var(--scalar-color-2);\n margin-bottom: 10px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport {\n createApiClientModal,\n type ApiClientModal,\n} from '@scalar/api-client/v2/features/modal'\nimport { onBeforeUnmount, onMounted, ref, useTemplateRef } from 'vue'\n\nimport { useAgentKeyDocuments } from '@/hooks/use-agent-key-documents'\nimport { useChatScroll } from '@/hooks/use-chat-scroll'\nimport { useCuratedDocuments } from '@/hooks/use-curated-documents'\nimport { getTmpDocFromLocalStorage } from '@/hooks/use-upload-tmp-document'\nimport { useState } from '@/state/state'\nimport Layout from '@/views/Layout.vue'\nimport Settings from '@/views/Settings/Settings.vue'\n\ndefineEmits<{\n (e: 'uploadApi'): void\n}>()\n\nconst {\n chat,\n prompt,\n settingsModal,\n eventBus,\n workspaceStore,\n config,\n mode,\n addDocument,\n} = useState()\n\nconst clientModalRef = useTemplateRef<HTMLElement>('clientModal')\nconst apiClient = ref<ApiClientModal | null>(null)\n\nonMounted(async () => {\n const tmpDoc = getTmpDocFromLocalStorage()\n\n if (mode === 'preview' && tmpDoc) {\n await addDocument({\n namespace: tmpDoc.namespace,\n slug: tmpDoc.slug,\n removable: false,\n tmp: true,\n })\n }\n\n if (!clientModalRef.value) {\n return\n }\n\n apiClient.value = createApiClientModal({\n el: clientModalRef.value,\n options: config,\n eventBus,\n workspaceStore,\n })\n})\n\nonBeforeUnmount(() => {\n apiClient.value?.app.unmount()\n})\n\nuseChatScroll()\nuseAgentKeyDocuments()\nuseCuratedDocuments()\n\nasync function handleSubmit() {\n await chat.sendMessage({ text: prompt.value })\n}\n</script>\n\n<template>\n <div ref=\"clientModal\" />\n <Layout\n @submit=\"handleSubmit\"\n @uploadApi=\"$emit('uploadApi')\" />\n <Settings :modalState=\"settingsModal\" />\n</template>\n","<script setup lang=\"ts\">\nimport {\n createApiClientModal,\n type ApiClientModal,\n} from '@scalar/api-client/v2/features/modal'\nimport { onBeforeUnmount, onMounted, ref, useTemplateRef } from 'vue'\n\nimport { useAgentKeyDocuments } from '@/hooks/use-agent-key-documents'\nimport { useChatScroll } from '@/hooks/use-chat-scroll'\nimport { useCuratedDocuments } from '@/hooks/use-curated-documents'\nimport { getTmpDocFromLocalStorage } from '@/hooks/use-upload-tmp-document'\nimport { useState } from '@/state/state'\nimport Layout from '@/views/Layout.vue'\nimport Settings from '@/views/Settings/Settings.vue'\n\ndefineEmits<{\n (e: 'uploadApi'): void\n}>()\n\nconst {\n chat,\n prompt,\n settingsModal,\n eventBus,\n workspaceStore,\n config,\n mode,\n addDocument,\n} = useState()\n\nconst clientModalRef = useTemplateRef<HTMLElement>('clientModal')\nconst apiClient = ref<ApiClientModal | null>(null)\n\nonMounted(async () => {\n const tmpDoc = getTmpDocFromLocalStorage()\n\n if (mode === 'preview' && tmpDoc) {\n await addDocument({\n namespace: tmpDoc.namespace,\n slug: tmpDoc.slug,\n removable: false,\n tmp: true,\n })\n }\n\n if (!clientModalRef.value) {\n return\n }\n\n apiClient.value = createApiClientModal({\n el: clientModalRef.value,\n options: config,\n eventBus,\n workspaceStore,\n })\n})\n\nonBeforeUnmount(() => {\n apiClient.value?.app.unmount()\n})\n\nuseChatScroll()\nuseAgentKeyDocuments()\nuseCuratedDocuments()\n\nasync function handleSubmit() {\n await chat.sendMessage({ text: prompt.value })\n}\n</script>\n\n<template>\n <div ref=\"clientModal\" />\n <Layout\n @submit=\"handleSubmit\"\n @uploadApi=\"$emit('uploadApi')\" />\n <Settings :modalState=\"settingsModal\" />\n</template>\n","<script setup lang=\"ts\">\nimport { provide, type Ref } from 'vue'\n\nimport Chat from '@/Chat.vue'\nimport { createState, STATE_SYMBOL, type RegistryDocument } from '@/state/state'\nimport { type ChatMode } from '@/types'\n\nconst {\n dashboardUrl,\n registryDocuments,\n registryUrl,\n baseUrl,\n mode = 'full',\n getAccessToken,\n getAgentKey,\n getActiveDocumentJson,\n isLoggedIn,\n prefilledMessage,\n hideAddApi,\n} = defineProps<{\n registryDocuments: RegistryDocument[]\n registryUrl: string\n dashboardUrl: string\n baseUrl: string\n mode?: ChatMode\n getAccessToken?: () => string\n getAgentKey?: () => string\n getActiveDocumentJson?: () => string\n isLoggedIn?: Ref<boolean>\n prefilledMessage?: Ref<string>\n hideAddApi?: boolean\n}>()\n\ndefineEmits<{\n (e: 'uploadApi'): void\n}>()\n\nconst state = createState({\n getActiveDocumentJson,\n initialRegistryDocuments: registryDocuments,\n prefilledMessageRef: prefilledMessage,\n registryUrl,\n baseUrl,\n mode,\n getAccessToken,\n getAgentKey,\n isLoggedIn,\n dashboardUrl,\n hideAddApi,\n})\n\nprovide(STATE_SYMBOL, state)\n\nexport type ChatExposed = {\n addDocumentAsync: typeof state.addDocumentAsync\n}\n\ndefineExpose<ChatExposed>({\n addDocumentAsync: state.addDocumentAsync,\n})\n</script>\n\n<template>\n <Chat @uploadApi=\"$emit('uploadApi')\" />\n</template>\n\n<style scoped></style>\n","<script setup lang=\"ts\">\nimport { provide, type Ref } from 'vue'\n\nimport Chat from '@/Chat.vue'\nimport { createState, STATE_SYMBOL, type RegistryDocument } from '@/state/state'\nimport { type ChatMode } from '@/types'\n\nconst {\n dashboardUrl,\n registryDocuments,\n registryUrl,\n baseUrl,\n mode = 'full',\n getAccessToken,\n getAgentKey,\n getActiveDocumentJson,\n isLoggedIn,\n prefilledMessage,\n hideAddApi,\n} = defineProps<{\n registryDocuments: RegistryDocument[]\n registryUrl: string\n dashboardUrl: string\n baseUrl: string\n mode?: ChatMode\n getAccessToken?: () => string\n getAgentKey?: () => string\n getActiveDocumentJson?: () => string\n isLoggedIn?: Ref<boolean>\n prefilledMessage?: Ref<string>\n hideAddApi?: boolean\n}>()\n\ndefineEmits<{\n (e: 'uploadApi'): void\n}>()\n\nconst state = createState({\n getActiveDocumentJson,\n initialRegistryDocuments: registryDocuments,\n prefilledMessageRef: prefilledMessage,\n registryUrl,\n baseUrl,\n mode,\n getAccessToken,\n getAgentKey,\n isLoggedIn,\n dashboardUrl,\n hideAddApi,\n})\n\nprovide(STATE_SYMBOL, state)\n\nexport type ChatExposed = {\n addDocumentAsync: typeof state.addDocumentAsync\n}\n\ndefineExpose<ChatExposed>({\n addDocumentAsync: state.addDocumentAsync,\n})\n</script>\n\n<template>\n <Chat @uploadApi=\"$emit('uploadApi')\" />\n</template>\n\n<style scoped></style>\n"],"mappings":"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"}