@scalar/agent-chat 0.12.23 → 0.12.24
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.
- package/dist/App.vue.d.ts.map +1 -1
- package/dist/App.vue.script.js +1 -1
- package/dist/App.vue.script.js.map +1 -1
- package/dist/Chat.vue.d.ts.map +1 -1
- package/dist/Chat.vue.script.js +1 -1
- package/dist/Chat.vue.script.js.map +1 -1
- package/dist/api.js.map +1 -1
- package/dist/client-tools/execute-request.js.map +1 -1
- package/dist/components/ActionsDropdown.vue.d.ts.map +1 -1
- package/dist/components/ActionsDropdown.vue.js +1 -1
- package/dist/components/ActionsDropdown.vue.script.js +1 -1
- package/dist/components/ActionsDropdown.vue.script.js.map +1 -1
- package/dist/components/ApprovalSection.vue.js +1 -1
- package/dist/components/ApprovalSection.vue.script.js +1 -1
- package/dist/components/ApprovalSection.vue.script.js.map +1 -1
- package/dist/components/AuthenticationProvided.vue.js +1 -1
- package/dist/components/AuthenticationProvided.vue.js.map +1 -1
- package/dist/components/AuthenticationRequired.vue.js +1 -1
- package/dist/components/AuthenticationRequired.vue.js.map +1 -1
- package/dist/components/AutosendPaused.vue.js +1 -1
- package/dist/components/AutosendPaused.vue.js.map +1 -1
- package/dist/components/BuildingRequest.vue.js +1 -1
- package/dist/components/BuildingRequest.vue.js.map +1 -1
- package/dist/components/ContextItem.vue.js +1 -1
- package/dist/components/ContextItem.vue.script.js +1 -1
- package/dist/components/ContextItem.vue.script.js.map +1 -1
- package/dist/components/ErrorMessage.vue.js +1 -1
- package/dist/components/ErrorMessage.vue.script.js +1 -1
- package/dist/components/ErrorMessage.vue.script.js.map +1 -1
- package/dist/components/FreeMessagesInfoSection.vue.js +1 -1
- package/dist/components/FreeMessagesInfoSection.vue.script.js +1 -1
- package/dist/components/FreeMessagesInfoSection.vue.script.js.map +1 -1
- package/dist/components/LoadingOpenAPISpecsSummary.vue.js +1 -1
- package/dist/components/LoadingOpenAPISpecsSummary.vue.js.map +1 -1
- package/dist/components/LoadingSearchOpenAPIOperations.vue.js +1 -1
- package/dist/components/LoadingSearchOpenAPIOperations.vue.js.map +1 -1
- package/dist/components/Logo.vue.js +1 -1
- package/dist/components/PaymentSection.vue.js +1 -1
- package/dist/components/PaymentSection.vue.script.js +1 -1
- package/dist/components/PaymentSection.vue.script.js.map +1 -1
- package/dist/components/RequestApproved.vue.js +1 -1
- package/dist/components/RequestApproved.vue.js.map +1 -1
- package/dist/components/RequestFailed.vue.js +1 -1
- package/dist/components/RequestFailed.vue.js.map +1 -1
- package/dist/components/RequestPreview.vue.d.ts.map +1 -1
- package/dist/components/RequestPreview.vue.js +1 -1
- package/dist/components/RequestPreview.vue.script.js +1 -1
- package/dist/components/RequestPreview.vue.script.js.map +1 -1
- package/dist/components/RequestRejected.vue.js +1 -1
- package/dist/components/RequestRejected.vue.js.map +1 -1
- package/dist/components/RequestSuccess.vue.js +1 -1
- package/dist/components/RequestSuccess.vue.js.map +1 -1
- package/dist/components/ResponseBody/ResponseBody.vue.script.js +1 -1
- package/dist/components/ResponseBody/ResponseBody.vue.script.js.map +1 -1
- package/dist/components/ResponseBody/ResponseBodyInfo.vue.js +1 -1
- package/dist/components/ResponseBody/ResponseBodyInfo.vue.js.map +1 -1
- package/dist/components/ResponseBody/ResponseBodyPreview.vue.js +1 -1
- package/dist/components/ResponseBody/ResponseBodyPreview.vue.script.js +1 -1
- package/dist/components/ResponseBody/ResponseBodyPreview.vue.script.js.map +1 -1
- package/dist/components/ResponseBody/ResponseBodyRaw.vue.script.js +1 -1
- package/dist/components/ResponseBody/ResponseBodyRaw.vue.script.js.map +1 -1
- package/dist/components/ResponseBody/ResponseBodyToggle.vue.script.js +1 -1
- package/dist/components/ResponseBody/ResponseBodyToggle.vue.script.js.map +1 -1
- package/dist/components/ResponseBody/helpers/media-types.js.map +1 -1
- package/dist/components/ResponseBody/helpers/process-response-body.js.map +1 -1
- package/dist/components/SearchPopover.vue.d.ts.map +1 -1
- package/dist/components/SearchPopover.vue.js +1 -1
- package/dist/components/SearchPopover.vue.script.js +1 -1
- package/dist/components/SearchPopover.vue.script.js.map +1 -1
- package/dist/components/Selector.vue.d.ts.map +1 -1
- package/dist/components/Selector.vue.script.js +1 -1
- package/dist/components/Selector.vue.script.js.map +1 -1
- package/dist/components/SendingRequest.vue.js +1 -1
- package/dist/components/SendingRequest.vue.js.map +1 -1
- package/dist/components/ServerSelector.vue.d.ts.map +1 -1
- package/dist/components/ServerSelector.vue.script.js +1 -1
- package/dist/components/ServerSelector.vue.script.js.map +1 -1
- package/dist/components/UploadSection.vue.js +1 -1
- package/dist/components/UploadSection.vue.script.js +1 -1
- package/dist/components/UploadSection.vue.script.js.map +1 -1
- package/dist/consts/urls.js.map +1 -1
- package/dist/entities/error/constants.js.map +1 -1
- package/dist/entities/error/helpers.js.map +1 -1
- package/dist/entities/registry/document.js.map +1 -1
- package/dist/entities/tools/ask-for-authentication.js.map +1 -1
- package/dist/entities/tools/execute-request.js.map +1 -1
- package/dist/entities/tools/search-openapi-operations.js.map +1 -1
- package/dist/helpers.js +7 -0
- package/dist/helpers.js.map +1 -1
- package/dist/hooks/use-agent-key-documents.js.map +1 -1
- package/dist/hooks/use-chat-approvals.js.map +1 -1
- package/dist/hooks/use-chat-error.js.map +1 -1
- package/dist/hooks/use-chat-pending-client-tool-parts.js.map +1 -1
- package/dist/hooks/use-chat-scroll.js.map +1 -1
- package/dist/hooks/use-curated-documents.js.map +1 -1
- package/dist/hooks/use-search.js.map +1 -1
- package/dist/hooks/use-signup-link.js.map +1 -1
- package/dist/hooks/use-term-and-conditions.js.map +1 -1
- package/dist/hooks/use-upload-tmp-document.js.map +1 -1
- package/dist/package.json +1 -1
- package/dist/plugins/persistance.js +6 -1
- package/dist/plugins/persistance.js.map +1 -1
- package/dist/registry/add-documents-to-store.js.map +1 -1
- package/dist/registry/create-document-name.js.map +1 -1
- package/dist/state/state.js.map +1 -1
- package/dist/style.css +277 -281
- package/dist/views/Catalog/Catalog.vue.d.ts.map +1 -1
- package/dist/views/Catalog/Catalog.vue.js +1 -1
- package/dist/views/Catalog/Catalog.vue.script.js +1 -1
- package/dist/views/Catalog/Catalog.vue.script.js.map +1 -1
- package/dist/views/Chat/Chat.vue.d.ts.map +1 -1
- package/dist/views/Chat/Chat.vue.js +1 -1
- package/dist/views/Chat/Chat.vue.script.js +1 -1
- package/dist/views/Chat/Chat.vue.script.js.map +1 -1
- package/dist/views/Chat/Messages/AskForAuthentication.vue.d.ts.map +1 -1
- package/dist/views/Chat/Messages/AskForAuthentication.vue.js +1 -1
- package/dist/views/Chat/Messages/AskForAuthentication.vue.script.js +1 -1
- package/dist/views/Chat/Messages/AskForAuthentication.vue.script.js.map +1 -1
- package/dist/views/Chat/Messages/ExecuteRequestTool.vue.js +1 -1
- package/dist/views/Chat/Messages/ExecuteRequestTool.vue.script.js +1 -1
- package/dist/views/Chat/Messages/ExecuteRequestTool.vue.script.js.map +1 -1
- package/dist/views/Chat/Messages/GetOpenAPISpecsSummary.vue.script.js +1 -1
- package/dist/views/Chat/Messages/GetOpenAPISpecsSummary.vue.script.js.map +1 -1
- package/dist/views/Chat/Messages/SearchOpenAPIOperationsTool.vue.js +1 -1
- package/dist/views/Chat/Messages/SearchOpenAPIOperationsTool.vue.script.js +1 -1
- package/dist/views/Chat/Messages/SearchOpenAPIOperationsTool.vue.script.js.map +1 -1
- package/dist/views/Chat/Messages/Text.vue.script.js +1 -1
- package/dist/views/Chat/Messages/Text.vue.script.js.map +1 -1
- package/dist/views/Layout.vue.d.ts.map +1 -1
- package/dist/views/Layout.vue.js +1 -1
- package/dist/views/Layout.vue.script.js +1 -1
- package/dist/views/Layout.vue.script.js.map +1 -1
- package/dist/views/PromptForm.vue.d.ts.map +1 -1
- package/dist/views/PromptForm.vue.js +1 -1
- package/dist/views/PromptForm.vue.script.js +2 -2
- package/dist/views/PromptForm.vue.script.js.map +1 -1
- package/dist/views/Settings/Auth.vue.script.js +1 -1
- package/dist/views/Settings/Auth.vue.script.js.map +1 -1
- package/dist/views/Settings/DocSettings.vue.js +1 -1
- package/dist/views/Settings/DocSettings.vue.script.js +1 -1
- package/dist/views/Settings/DocSettings.vue.script.js.map +1 -1
- package/dist/views/Settings/Settings.vue.js +1 -1
- package/dist/views/Settings/Settings.vue.script.js +1 -1
- package/dist/views/Settings/Settings.vue.script.js.map +1 -1
- package/dist/views/Start.vue.d.ts.map +1 -1
- package/dist/views/Start.vue.js +1 -1
- package/dist/views/Start.vue.script.js +1 -1
- package/dist/views/Start.vue.script.js.map +1 -1
- package/package.json +17 -17
|
@@ -26,7 +26,7 @@ var _hoisted_6 = {
|
|
|
26
26
|
key: 2,
|
|
27
27
|
class: "uploadText flex items-center gap-1.5"
|
|
28
28
|
};
|
|
29
|
-
var UploadSection_vue_vue_type_script_setup_true_lang_default =
|
|
29
|
+
var UploadSection_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
30
30
|
__name: "UploadSection",
|
|
31
31
|
props: { uploadState: {} },
|
|
32
32
|
setup(__props) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UploadSection.vue.script.js","names":[],"sources":["../../src/components/UploadSection.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarLoading, useLoadingState } from '@scalar/components/loading'\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: var(--scalar-radius-3xl) var(--scalar-radius-3xl) 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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWA,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"UploadSection.vue.script.js","names":[],"sources":["../../src/components/UploadSection.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarLoading, useLoadingState } from '@scalar/components/loading'\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: var(--scalar-radius-3xl) var(--scalar-radius-3xl) 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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWA,MAAM,eAAe,gBAAgB;EAErC,MAAM,YAAY,eAChB;GAAC;GAAa;GAAc;EAAS,CAAC,CAAC,SAAS,QAAA,YAAY,IAAI,CAClE;;uBAIE,mBA4CM,OAAA,EA3CJ,OAAK,eAAA,CAAC,iBAAe;WACE,QAAA,YAAY,SAAI;UAA0B,QAAA,YAAY,SAAI;;IAKzE,UAAA,SAAA,UAAA,GADR,mBAyBM,OAzBN,YAyBM,CAtBJ,YAMc,MAAA,aAAA,GAAA;KALZ,OAAM;KACL,QAAM;SAAiB,MAAA,YAAA;;;KAIxB,MAAK;6BAEC,QAAA,YAAY,SAAI,aAAA,UAAA,GADxB,mBAIS,UAJT,YAEqB,6BAErB,KAEa,QAAA,YAAY,SAAI,gBAAA,UAAA,GAD7B,mBAIS,UAJT,YAEqB,gCAErB,MAAA,UAAA,GACA,mBAIS,UAJT,YAEqB,+BAErB,EAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;IAGM,QAAA,YAAY,SAAI,UAAA,UAAA,GADxB,mBAKS,UALT,YAKS,CAFP,YAA2C,MAAA,eAAA,GAAA,EAA1B,OAAM,kBAAiB,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,gBAAG,4DAE7C,EAAA,EAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;IAEQ,QAAA,YAAY,SAAI,WAAA,UAAA,GADxB,mBAKS,UALT,YAKS,CAFP,YAA2C,MAAA,iBAAA,GAAA,EAAxB,OAAM,gBAAe,CAAA,GAAA,gBAAG,MAC3C,gBAAG,QAAA,YAAY,KAAK,GAAA,CAAA,CAAA,CAAA,KAAA,mBAAA,IAAA,IAAA"}
|
package/dist/consts/urls.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"urls.js","names":[],"sources":["../../src/consts/urls.ts"],"sourcesContent":["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"],"mappings":";AAAA,IAAa,OAAO;CAClB,mBAAmB;CACnB,gBAAgB;CAChB,sBAAsB;CACtB,4BAA4B;CAC5B,mBAAmB;
|
|
1
|
+
{"version":3,"file":"urls.js","names":[],"sources":["../../src/consts/urls.ts"],"sourcesContent":["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"],"mappings":";AAAA,IAAa,OAAO;CAClB,mBAAmB;CACnB,gBAAgB;CAChB,sBAAsB;CACtB,4BAA4B;CAC5B,mBAAmB;AACrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","names":[],"sources":["../../../src/entities/error/constants.ts"],"sourcesContent":["export type AgentChatError<T extends string = string, D = unknown> = {\n code: T\n detail: D\n}\n\nexport const AgentErrorCodes = {\n LIMIT_REACHED: 'LIMIT_REACHED',\n} as const\n"],"mappings":";AAKA,IAAa,kBAAkB,EAC7B,eAAe,
|
|
1
|
+
{"version":3,"file":"constants.js","names":[],"sources":["../../../src/entities/error/constants.ts"],"sourcesContent":["export type AgentChatError<T extends string = string, D = unknown> = {\n code: T\n detail: D\n}\n\nexport const AgentErrorCodes = {\n LIMIT_REACHED: 'LIMIT_REACHED',\n} as const\n"],"mappings":";AAKA,IAAa,kBAAkB,EAC7B,eAAe,gBACjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","names":[],"sources":["../../../src/entities/error/helpers.ts"],"sourcesContent":["import type { AgentChatError } from './constants'\n\nexport function createError<const T extends string, D>(code: T, detail: D): AgentChatError<T, D> {\n return {\n code,\n detail,\n }\n}\n"],"mappings":";AAEA,SAAgB,YAAuC,MAAS,QAAiC;
|
|
1
|
+
{"version":3,"file":"helpers.js","names":[],"sources":["../../../src/entities/error/helpers.ts"],"sourcesContent":["import type { AgentChatError } from './constants'\n\nexport function createError<const T extends string, D>(code: T, detail: D): AgentChatError<T, D> {\n return {\n code,\n detail,\n }\n}\n"],"mappings":";AAEA,SAAgB,YAAuC,MAAS,QAAiC;CAC/F,OAAO;EACL;EACA;CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document.js","names":[],"sources":["../../../src/entities/registry/document.ts"],"sourcesContent":["import type { OpenAPIV3_1 } from '@scalar/openapi-types'\nimport type { SecurityScheme } from '@scalar/types/entities'\nimport { nullable, object, string, union, type Static } from '@scalar/validation'\n\nexport const registryApiMetadata = object({\n id: string(),\n title: string(),\n namespace: string(),\n currentVersion: string(),\n logoUrl: union([string(), nullable()]),\n slug: string(),\n})\n\nexport type ApiMetadata = Static<typeof registryApiMetadata> & { removable?: boolean; searchEnabled?: boolean }\n\nexport type RegistryDocument = { namespace: string; slug: string }\n\nexport type DocumentSettings = Record<\n string,\n {\n securitySchemes: SecurityScheme[]\n activeServer: OpenAPIV3_1.ServerObject | undefined\n }\n>\n"],"mappings":";;AAIA,IAAa,sBAAsB,OAAO;CACxC,IAAI,
|
|
1
|
+
{"version":3,"file":"document.js","names":[],"sources":["../../../src/entities/registry/document.ts"],"sourcesContent":["import type { OpenAPIV3_1 } from '@scalar/openapi-types'\nimport type { SecurityScheme } from '@scalar/types/entities'\nimport { nullable, object, string, union, type Static } from '@scalar/validation'\n\nexport const registryApiMetadata = object({\n id: string(),\n title: string(),\n namespace: string(),\n currentVersion: string(),\n logoUrl: union([string(), nullable()]),\n slug: string(),\n})\n\nexport type ApiMetadata = Static<typeof registryApiMetadata> & { removable?: boolean; searchEnabled?: boolean }\n\nexport type RegistryDocument = { namespace: string; slug: string }\n\nexport type DocumentSettings = Record<\n string,\n {\n securitySchemes: SecurityScheme[]\n activeServer: OpenAPIV3_1.ServerObject | undefined\n }\n>\n"],"mappings":";;AAIA,IAAa,sBAAsB,OAAO;CACxC,IAAI,OAAO;CACX,OAAO,OAAO;CACd,WAAW,OAAO;CAClB,gBAAgB,OAAO;CACvB,SAAS,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;CACrC,MAAM,OAAO;AACf,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask-for-authentication.js","names":[],"sources":["../../../src/entities/tools/ask-for-authentication.ts"],"sourcesContent":["import { object, string, type Static } from '@scalar/validation'\n\nexport const ASK_FOR_AUTHENTICATION_TOOL_NAME = 'ask-for-authentication' as const\n\nexport const askForAuthenticationInputSchema = object({\n documentName: string(),\n uniqueIdentifier: string({ typeComment: 'Needed for legacy support for old clients' }),\n})\n\nexport type AskForAuthenticationInput = Static<typeof askForAuthenticationInputSchema>\n"],"mappings":";;AAEA,IAAa,mCAAmC;AAEhD,IAAa,kCAAkC,OAAO;CACpD,cAAc,
|
|
1
|
+
{"version":3,"file":"ask-for-authentication.js","names":[],"sources":["../../../src/entities/tools/ask-for-authentication.ts"],"sourcesContent":["import { object, string, type Static } from '@scalar/validation'\n\nexport const ASK_FOR_AUTHENTICATION_TOOL_NAME = 'ask-for-authentication' as const\n\nexport const askForAuthenticationInputSchema = object({\n documentName: string(),\n uniqueIdentifier: string({ typeComment: 'Needed for legacy support for old clients' }),\n})\n\nexport type AskForAuthenticationInput = Static<typeof askForAuthenticationInputSchema>\n"],"mappings":";;AAEA,IAAa,mCAAmC;AAEhD,IAAa,kCAAkC,OAAO;CACpD,cAAc,OAAO;CACrB,kBAAkB,OAAO,EAAE,aAAa,4CAA4C,CAAC;AACvF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute-request.js","names":[],"sources":["../../../src/entities/tools/execute-request.ts"],"sourcesContent":["import type { Result } from 'neverpanic'\nimport { object, optional, record, string, type Static } from '@scalar/validation'\n\nimport type { AgentChatError } from '@/entities/error/constants'\n\nexport const EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME = 'execute-request' as const\n\nexport const executeClientSideRequestToolInputSchema = object({\n method: string(),\n path: string(),\n headers: optional(record(string(), string())),\n body: optional(string()),\n documentName: string(),\n documentIdentifier: string({ typeComment: 'Needed for legacy support for old clients' }),\n})\n\nexport type ExecuteClientSideRequestToolInput = Static<typeof executeClientSideRequestToolInputSchema>\n\nexport type ExecuteClientSideRequestToolOutput = Result<\n { status: number; responseBody?: unknown; headers: {} },\n | AgentChatError<\n 'FAILED_TO_PARSE_RESPONSE_BODY',\n {\n originalError: unknown\n }\n >\n | AgentChatError<\n 'REQUEST_NOT_OK',\n {\n status: number\n url: string\n responseBody: unknown\n headers: Record<string, string>\n }\n >\n | AgentChatError<\n 'FAILED_TO_FETCH',\n {\n originalError: unknown\n }\n >\n | AgentChatError<\n 'DOCUMENT_SETTINGS_COULD_NOT_BE_DETERMINED',\n {\n documentName: string\n namespace: string\n slug: string\n }\n >\n | AgentChatError<'FAILED_TO_DETERMINE_DOCUMENT', { namespace?: string; slug?: string; documentIdentifier: string }>\n | AgentChatError<'FAILED_TO_EXECUTE_REQUEST', unknown>\n>\n"],"mappings":";;AAKA,IAAa,wCAAwC;AAErD,IAAa,0CAA0C,OAAO;CAC5D,QAAQ,
|
|
1
|
+
{"version":3,"file":"execute-request.js","names":[],"sources":["../../../src/entities/tools/execute-request.ts"],"sourcesContent":["import type { Result } from 'neverpanic'\nimport { object, optional, record, string, type Static } from '@scalar/validation'\n\nimport type { AgentChatError } from '@/entities/error/constants'\n\nexport const EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME = 'execute-request' as const\n\nexport const executeClientSideRequestToolInputSchema = object({\n method: string(),\n path: string(),\n headers: optional(record(string(), string())),\n body: optional(string()),\n documentName: string(),\n documentIdentifier: string({ typeComment: 'Needed for legacy support for old clients' }),\n})\n\nexport type ExecuteClientSideRequestToolInput = Static<typeof executeClientSideRequestToolInputSchema>\n\nexport type ExecuteClientSideRequestToolOutput = Result<\n { status: number; responseBody?: unknown; headers: {} },\n | AgentChatError<\n 'FAILED_TO_PARSE_RESPONSE_BODY',\n {\n originalError: unknown\n }\n >\n | AgentChatError<\n 'REQUEST_NOT_OK',\n {\n status: number\n url: string\n responseBody: unknown\n headers: Record<string, string>\n }\n >\n | AgentChatError<\n 'FAILED_TO_FETCH',\n {\n originalError: unknown\n }\n >\n | AgentChatError<\n 'DOCUMENT_SETTINGS_COULD_NOT_BE_DETERMINED',\n {\n documentName: string\n namespace: string\n slug: string\n }\n >\n | AgentChatError<'FAILED_TO_DETERMINE_DOCUMENT', { namespace?: string; slug?: string; documentIdentifier: string }>\n | AgentChatError<'FAILED_TO_EXECUTE_REQUEST', unknown>\n>\n"],"mappings":";;AAKA,IAAa,wCAAwC;AAErD,IAAa,0CAA0C,OAAO;CAC5D,QAAQ,OAAO;CACf,MAAM,OAAO;CACb,SAAS,SAAS,OAAO,OAAO,GAAG,OAAO,CAAC,CAAC;CAC5C,MAAM,SAAS,OAAO,CAAC;CACvB,cAAc,OAAO;CACrB,oBAAoB,OAAO,EAAE,aAAa,4CAA4C,CAAC;AACzF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-openapi-operations.js","names":[],"sources":["../../../src/entities/tools/search-openapi-operations.ts"],"sourcesContent":["import type { OpenAPIV3_1 } from '@scalar/openapi-types'\nimport { object, string, type Static } from '@scalar/validation'\n\nexport const SEARCH_OPENAPI_OPERATIONS_TOOL_NAME = 'search-openapi-operations' as const\n\nexport const searchOpenAPIOperationsInputSchema = object({\n question: string(),\n})\n\nexport type SearchOpenAPIOperationsToolInput = Static<typeof searchOpenAPIOperationsInputSchema>\n\nexport type SearchOpenAPIOperationsToolOutput = Partial<OpenAPIV3_1.Document>[]\n"],"mappings":";;AAGA,IAAa,sCAAsC;AAEnD,IAAa,qCAAqC,OAAO,EACvD,UAAU,
|
|
1
|
+
{"version":3,"file":"search-openapi-operations.js","names":[],"sources":["../../../src/entities/tools/search-openapi-operations.ts"],"sourcesContent":["import type { OpenAPIV3_1 } from '@scalar/openapi-types'\nimport { object, string, type Static } from '@scalar/validation'\n\nexport const SEARCH_OPENAPI_OPERATIONS_TOOL_NAME = 'search-openapi-operations' as const\n\nexport const searchOpenAPIOperationsInputSchema = object({\n question: string(),\n})\n\nexport type SearchOpenAPIOperationsToolInput = Static<typeof searchOpenAPIOperationsInputSchema>\n\nexport type SearchOpenAPIOperationsToolOutput = Partial<OpenAPIV3_1.Document>[]\n"],"mappings":";;AAGA,IAAa,sCAAsC;AAEnD,IAAa,qCAAqC,OAAO,EACvD,UAAU,OAAO,EACnB,CAAC"}
|
package/dist/helpers.js
CHANGED
|
@@ -39,9 +39,16 @@ var authStorage = () => {
|
|
|
39
39
|
return `${REFERENCE_LS_KEYS.AUTH}-${slug}`;
|
|
40
40
|
};
|
|
41
41
|
return {
|
|
42
|
+
/**
|
|
43
|
+
* Retrieves and coerces the authentication schemes stored in local storage.
|
|
44
|
+
*/
|
|
42
45
|
getAuth: (slug) => {
|
|
43
46
|
return coerceValue(AuthSchema, JSON.parse(storage.getItem(getKey(slug)) ?? "{}"));
|
|
44
47
|
},
|
|
48
|
+
/**
|
|
49
|
+
* Stores the authentication schemes in local storage.
|
|
50
|
+
* @param value The Auth object to stringify and store.
|
|
51
|
+
*/
|
|
45
52
|
setAuth: (slug, value) => {
|
|
46
53
|
storage.setItem(getKey(slug), JSON.stringify(value));
|
|
47
54
|
}
|
package/dist/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","names":[],"sources":["../src/helpers.ts"],"sourcesContent":["import { 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 { SecuritySchemeObjectSecret } from '@scalar/workspace-store/request-example'\nimport {\n getSecurityRequirements,\n getSecuritySchemes,\n getSelectedSecurity,\n getSelectedServer,\n getServers,\n mergeSecurity,\n} from '@scalar/workspace-store/request-example'\nimport { isOpenApiDocument } from '@scalar/workspace-store/schemas/type-guards'\nimport { coerceValue } from '@scalar/workspace-store/schemas/typebox-coerce'\nimport type { OpenApiDocument, 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(\n documentName: string,\n document: OpenApiDocument,\n authStore: AuthStore,\n): SecuritySchemeObjectSecret[] {\n const mergedSecurity = mergeSecurity(document?.components?.securitySchemes, {}, authStore, documentName)\n\n const securityRequirements = getSecurityRequirements(document.security)\n\n const selectedSecurity = getSelectedSecurity(\n authStore.getAuthSelectedSchemas({\n type: 'document',\n documentName,\n }),\n undefined,\n securityRequirements,\n )\n\n return getSecuritySchemes(mergedSecurity, selectedSecurity.selectedSchemes[selectedSecurity.selectedIndex] ?? {})\n}\n\n/** Generate document settings from workspace store. AsyncAPI docs are skipped — this feature is OpenAPI-native. */\nexport function createDocumentSettings(workspaceStore: WorkspaceStore) {\n const openApiEntries: [string, OpenApiDocument][] = []\n for (const [key, document] of Object.entries(workspaceStore.workspace.documents)) {\n if (isOpenApiDocument(document)) {\n openApiEntries.push([key, document])\n }\n }\n\n return Object.fromEntries(\n openApiEntries.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(document, null, null, servers),\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"],"mappings":";;;;;;AAkBA,SAAgB,cAAc,KAAoC;
|
|
1
|
+
{"version":3,"file":"helpers.js","names":[],"sources":["../src/helpers.ts"],"sourcesContent":["import { 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 { SecuritySchemeObjectSecret } from '@scalar/workspace-store/request-example'\nimport {\n getSecurityRequirements,\n getSecuritySchemes,\n getSelectedSecurity,\n getSelectedServer,\n getServers,\n mergeSecurity,\n} from '@scalar/workspace-store/request-example'\nimport { isOpenApiDocument } from '@scalar/workspace-store/schemas/type-guards'\nimport { coerceValue } from '@scalar/workspace-store/schemas/typebox-coerce'\nimport type { OpenApiDocument, 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(\n documentName: string,\n document: OpenApiDocument,\n authStore: AuthStore,\n): SecuritySchemeObjectSecret[] {\n const mergedSecurity = mergeSecurity(document?.components?.securitySchemes, {}, authStore, documentName)\n\n const securityRequirements = getSecurityRequirements(document.security)\n\n const selectedSecurity = getSelectedSecurity(\n authStore.getAuthSelectedSchemas({\n type: 'document',\n documentName,\n }),\n undefined,\n securityRequirements,\n )\n\n return getSecuritySchemes(mergedSecurity, selectedSecurity.selectedSchemes[selectedSecurity.selectedIndex] ?? {})\n}\n\n/** Generate document settings from workspace store. AsyncAPI docs are skipped — this feature is OpenAPI-native. */\nexport function createDocumentSettings(workspaceStore: WorkspaceStore) {\n const openApiEntries: [string, OpenApiDocument][] = []\n for (const [key, document] of Object.entries(workspaceStore.workspace.documents)) {\n if (isOpenApiDocument(document)) {\n openApiEntries.push([key, document])\n }\n }\n\n return Object.fromEntries(\n openApiEntries.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(document, null, null, servers),\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"],"mappings":";;;;;;AAkBA,SAAgB,cAAc,KAAoC;CAChE,OAAO,OAAO,OAAO,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,SAAS,OAAO,OAAO,QAAQ,CAAC,CAAC,CAAC;AACnF;;AAGA,SAAS,wBACP,cACA,UACA,WAC8B;CAC9B,MAAM,iBAAiB,cAAc,UAAU,YAAY,iBAAiB,CAAC,GAAG,WAAW,YAAY;CAEvG,MAAM,uBAAuB,wBAAwB,SAAS,QAAQ;CAEtE,MAAM,mBAAmB,oBACvB,UAAU,uBAAuB;EAC/B,MAAM;EACN;CACF,CAAC,GACD,KAAA,GACA,oBACF;CAEA,OAAO,mBAAmB,gBAAgB,iBAAiB,gBAAgB,iBAAiB,kBAAkB,CAAC,CAAC;AAClH;;AAGA,SAAgB,uBAAuB,gBAAgC;CACrE,MAAM,iBAA8C,CAAC;CACrD,KAAK,MAAM,CAAC,KAAK,aAAa,OAAO,QAAQ,eAAe,UAAU,SAAS,GAC7E,IAAI,kBAAkB,QAAQ,GAC5B,eAAe,KAAK,CAAC,KAAK,QAAQ,CAAC;CAIvC,OAAO,OAAO,YACZ,eAAe,KAAK,CAAC,KAAK,cAAc;EAKtC,OAAO,CACL,KACA;GACE,cAAc,kBAAkB,UAAU,MAAM,MAPpC,WAAW,SAAS,SAAS,EAC3C,aAAa,SAAS,gCACxB,CAK0D,CAAO;GAC7D,iBAAiB,wBAAwB,KAAK,UAAU,eAAe,IAAI;EAC7E,CACF;CACF,CAAC,CACH;AACF;AAGA,IAAM,UAAU,iBAAiB;;;;;;AAOjC,IAAa,oBAAoB;CAC/B,MAAM,UAAU,SAAiB;EAC/B,OAAO,GAAG,kBAAkB,KAAK,GAAG;CACtC;CAEA,OAAO;;;;EAIL,UAAU,SAAiB;GAEzB,OAAO,YAAY,YADJ,KAAK,MAAM,QAAQ,QAAQ,OAAO,IAAI,CAAC,KAAK,IAC5B,CAAM;EACvC;;;;;EAKA,UAAU,MAAc,UAAgB;GACtC,QAAQ,QAAQ,OAAO,IAAI,GAAG,KAAK,UAAU,KAAK,CAAC;EACrD;CACF;AACF;;;;;;;;;;AAWA,IAAa,iCAAiC,EAC5C,cACA,qBAIU;CAEV,MAAM,OADkB,YACX,CAAA,CAAgB,QAAQ,YAAY;CACjD,eAAe,KAAK,KAAK,GAAG,eAAe,KAAK,CAAC;AACnD;AAEA,SAAgB,cAAc,OAAe;CAC3C,IAAI;EACF,OAAO,KAAK,MAAM,KAAK;CACzB,QAAQ;EACN;CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-agent-key-documents.js","names":[],"sources":["../../src/hooks/use-agent-key-documents.ts"],"sourcesContent":["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"],"mappings":";;;;AAKA,SAAgB,uBAAuB;CACrC,MAAM,EAAE,KAAK,aAAa,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"use-agent-key-documents.js","names":[],"sources":["../../src/hooks/use-agent-key-documents.ts"],"sourcesContent":["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"],"mappings":";;;;AAKA,SAAgB,uBAAuB;CACrC,MAAM,EAAE,KAAK,aAAa,MAAM,gBAAgB,SAAS;CACzD,MAAM,EAAE,UAAU,UAAU;CAE5B,UAAU,YAAY;EACpB,IAAI,SAAS,UAAU,CAAC,aACtB;EAGF,MAAM,qBAAqB,MAAM,IAAI,gBAAgB;EAErD,IAAI,CAAC,mBAAmB,SAAS;GAC/B,MAAM,wEAAwE,OAAO;GACrF;EACF;EAEA,mBAAmB,KAAK,UAAU,SAAS,EAAE,WAAW,WACtD,YAAY;GAAE;GAAW;GAAM,WAAW;EAAM,CAAC,CACnD;CACF,CAAC;AACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-chat-approvals.js","names":[],"sources":["../../src/hooks/use-chat-approvals.ts"],"sourcesContent":["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"],"mappings":";;;;;;AAcA,SAAgB,4BAA4B,MAA0D;
|
|
1
|
+
{"version":3,"file":"use-chat-approvals.js","names":[],"sources":["../../src/hooks/use-chat-approvals.ts"],"sourcesContent":["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"],"mappings":";;;;;;AAcA,SAAgB,4BAA4B,MAA0D;CACpG,OACE,KAAK,SAAU,0BACf,KAAK,UAAU,qBACf,KAAK,OAAO,QAAQ,YAAY,MAAM;AAE1C;AAEA,SAAgB,sBAAsB;CACpC,MAAM,QAAQ,SAAS;CAEvB,MAAM,wBAAwB,eAAe;EAC3C,OAAO,MAAM,KAAK,SACf,QAAQ,YAAY,QAAQ,MAAM,KAAK,2BAA2B,CAAC,CAAC,CACpE,SAAS,YAAY,QAAQ,KAAK,CAAC,CACnC,OAAO,2BAA2B;CACvC,CAAC;CAED,eAAe,0BAA0B,UAAmB;EAC1D,MAAM,mBAAmB,sBAAsB,MAAM,IAAI,OAAO,aAAa;GAC3E,IAAI,CAAC,UACH,OAAO,MAAM,MAAM,KAAK,cAAc;IACpC,MAAM;IACN,YAAY,SAAS;IACrB,OAAO;IACP,WAAW;GACb,CAAC;GAGH,MAAM,mBAAmB;IACvB,kBAAkB,uBAAuB,MAAM,cAAc;IAC7D,UAAU,MAAM,SAAS;IACzB,OAAO,SAAS;IAChB,YAAY,SAAS;IACrB,MAAM,MAAM;GACd,CAAC;EACH,CAAC;EAED,MAAM,QAAQ,IAAI,gBAAgB;CACpC;CAEA,OAAO;EAAE;EAAuB;CAA0B;AAC5D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-chat-error.js","names":[],"sources":["../../src/hooks/use-chat-error.ts"],"sourcesContent":["import { coerce, number, object, optional, string, validate, type Static } from '@scalar/validation'\nimport { computed } from 'vue'\n\nimport { safeParseJson } from '@/helpers'\nimport { useState } from '@/state/state'\n\nconst chatErrorSchema = object({\n message: string(),\n code: string(),\n status: optional(number()),\n})\nexport type ChatError = Static<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\n if (!errorJson || !validate(chatErrorSchema, errorJson))\n return {\n message: chat.error.message,\n code: 'UNKNOWN_ERROR',\n }\n\n return coerce(chatErrorSchema, errorJson)\n })\n}\n"],"mappings":";;;;;AAMA,IAAM,kBAAkB,OAAO;CAC7B,SAAS,
|
|
1
|
+
{"version":3,"file":"use-chat-error.js","names":[],"sources":["../../src/hooks/use-chat-error.ts"],"sourcesContent":["import { coerce, number, object, optional, string, validate, type Static } from '@scalar/validation'\nimport { computed } from 'vue'\n\nimport { safeParseJson } from '@/helpers'\nimport { useState } from '@/state/state'\n\nconst chatErrorSchema = object({\n message: string(),\n code: string(),\n status: optional(number()),\n})\nexport type ChatError = Static<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\n if (!errorJson || !validate(chatErrorSchema, errorJson))\n return {\n message: chat.error.message,\n code: 'UNKNOWN_ERROR',\n }\n\n return coerce(chatErrorSchema, errorJson)\n })\n}\n"],"mappings":";;;;;AAMA,IAAM,kBAAkB,OAAO;CAC7B,SAAS,OAAO;CAChB,MAAM,OAAO;CACb,QAAQ,SAAS,OAAO,CAAC;AAC3B,CAAC;AAGD,SAAgB,eAAe;CAC7B,MAAM,EAAE,SAAS,SAAS;CAE1B,OAAO,eAAe;EACpB,IAAI,CAAC,KAAK,OAAO;EAEjB,MAAM,YAAY,cAAc,KAAK,MAAM,OAAO;EAElD,IAAI,CAAC,aAAa,CAAC,SAAS,iBAAiB,SAAS,GACpD,OAAO;GACL,SAAS,KAAK,MAAM;GACpB,MAAM;EACR;EAEF,OAAO,OAAO,iBAAiB,SAAS;CAC1C,CAAC;AACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-chat-pending-client-tool-parts.js","names":[],"sources":["../../src/hooks/use-chat-pending-client-tool-parts.ts"],"sourcesContent":["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"],"mappings":";;;AAOA,SAAS,wBAAwB,MAAkE;
|
|
1
|
+
{"version":3,"file":"use-chat-pending-client-tool-parts.js","names":[],"sources":["../../src/hooks/use-chat-pending-client-tool-parts.ts"],"sourcesContent":["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"],"mappings":";;;AAOA,SAAS,wBAAwB,MAAkE;CACjG,OAAO,KAAK,KAAK,WAAW,MAAM,KAAM,KAAoB,UAAU;AACxE;AAEA,SAAgB,gCAAgC;CAC9C,MAAM,QAAQ,SAAS;CASvB,OAAO,EAAE,wBAPsB,eAAe;EAC5C,OAAO,MAAM,KAAK,SACf,QAAQ,YAAY,QAAQ,MAAM,KAAK,uBAAuB,CAAC,CAAC,CAChE,SAAS,YAAY,QAAQ,KAAK,CAAC,CACnC,OAAO,uBAAuB;CACnC,CAES,EAAuB;AAClC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-chat-scroll.js","names":[],"sources":["../../src/hooks/use-chat-scroll.ts"],"sourcesContent":["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"],"mappings":";;;AAKA,SAAgB,gBAAgB;CAC9B,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"use-chat-scroll.js","names":[],"sources":["../../src/hooks/use-chat-scroll.ts"],"sourcesContent":["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"],"mappings":";;;AAKA,SAAgB,gBAAgB;CAC9B,MAAM,QAAQ,SAAS;CAEvB,SAAS,cAAc,KAAiB;EACtC,MAAM,WAAW,KAAK,MAAM,GAAG,EAAE;EACjC,IAAI,CAAC,UAAU;EAEf,IAAI,SAAS,SAAS,QAAQ;EAE9B,OAAO,SAAS;CAClB;CAEA,MAAM,OAAO,MAAM,KAAK,cAAc,cAAc,MAAM,KAAK,WAAW,CAAC,GAAG,YAAY;EACxF,MAAM,SAAS;EACf,OAAO,SAAS,GAAG,SAAS,KAAK,YAAY;CAC/C,CAAC;AACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-curated-documents.js","names":[],"sources":["../../src/hooks/use-curated-documents.ts"],"sourcesContent":["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"],"mappings":";;;AAIA,SAAgB,sBAAsB;CACpC,MAAM,EAAE,KAAK,qBAAqB,
|
|
1
|
+
{"version":3,"file":"use-curated-documents.js","names":[],"sources":["../../src/hooks/use-curated-documents.ts"],"sourcesContent":["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"],"mappings":";;;AAIA,SAAgB,sBAAsB;CACpC,MAAM,EAAE,KAAK,qBAAqB,SAAS;CAE3C,UAAU,YAAY;EACpB,MAAM,4BAA4B,MAAM,IAAI,oBAAoB;EAEhE,IAAI,CAAC,0BAA0B,SAC7B;EAGF,iBAAiB,QAAQ,0BAA0B,KAAK;CAC1D,CAAC;AACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-search.js","names":[],"sources":["../../src/hooks/use-search.ts"],"sourcesContent":["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"],"mappings":";;;;AAMA,SAAgB,YAAY;CAC1B,MAAM,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"use-search.js","names":[],"sources":["../../src/hooks/use-search.ts"],"sourcesContent":["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"],"mappings":";;;;AAMA,SAAgB,YAAY;CAC1B,MAAM,EAAE,QAAQ,SAAS;CAEzB,MAAM,WAAW,IAAI,EAAE;CAEvB,MAAM,SAAS,cAAc,OAAO,MAAM;EACxC,MAAM,iBAAiB,MAAM,IAAI,OAAO,CAAC;EAEzC,IAAI,CAAC,eAAe,SAClB;EAGF,QAAQ,QAAQ,eAAe,KAAK;CACtC,GAAG,GAAG;CAEN,MAAM,QAAQ,SAAS;EACrB,WAAW;GACT,OAAO,SAAS;EAClB;EACA,MAAM,MAAM;GACV,OAAO,CAAC;GACR,SAAS,QAAQ;EACnB;CACF,CAAC;CAED,MAAM,UAAU,IAAmB,CAAC,CAAC;CAErC,OAAO,EAAE;CAET,OAAO;EACL;EACA;CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-signup-link.js","names":[],"sources":["../../src/hooks/use-signup-link.ts"],"sourcesContent":["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"],"mappings":";;;;;;;;;AAWA,SAAgB,gBAGd;CACA,MAAM,EAAE,cAAc,MAAM,2BAA2B,
|
|
1
|
+
{"version":3,"file":"use-signup-link.js","names":[],"sources":["../../src/hooks/use-signup-link.ts"],"sourcesContent":["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"],"mappings":";;;;;;;;;AAWA,SAAgB,gBAGd;CACA,MAAM,EAAE,cAAc,MAAM,2BAA2B,SAAS;CAEhE,MAAM,aAAa,eAAe;EAEhC,IAAI,SAAS,QACX,OAAO;EAIT,OAAO,uBAAuB,QAC1B,GAAG,aAAa,kCAAkC,uBAAuB,UACzE;CACN,CAAC;CAED,SAAS,mBAAmB;EAC1B,OAAO,SAAS,OAAO,WAAW,KAAK;CACzC;CAEA,OAAO;EAAE;EAAY;CAAiB;AACxC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-term-and-conditions.js","names":[],"sources":["../../src/hooks/use-term-and-conditions.ts"],"sourcesContent":["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"],"mappings":";;AAEA,IAAM,8BAA8B;AAEpC,SAAgB,wBAAwB;CACtC,MAAM,WAAW,IAAI,
|
|
1
|
+
{"version":3,"file":"use-term-and-conditions.js","names":[],"sources":["../../src/hooks/use-term-and-conditions.ts"],"sourcesContent":["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"],"mappings":";;AAEA,IAAM,8BAA8B;AAEpC,SAAgB,wBAAwB;CACtC,MAAM,WAAW,IAAI,KAAK;CAE1B,gBAAgB;EACd,SAAS,QAAQ,aAAa,QAAQ,2BAA2B,MAAM;CACzE,CAAC;CAED,SAAS,SAAS;EAChB,SAAS,QAAQ;EACjB,aAAa,QAAQ,6BAA6B,MAAM;CAC1D;CAEA,OAAO;EAAE;EAAU;CAAO;AAC5B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-upload-tmp-document.js","names":[],"sources":["../../src/hooks/use-upload-tmp-document.ts"],"sourcesContent":["import { redirectToProxy } from '@scalar/helpers/url/redirect-to-proxy'\nimport { coerce, object, string, validate } from '@scalar/validation'\nimport { ref } from 'vue'\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\nconst tmpDocSchema = object({\n namespace: string(),\n slug: string(),\n})\n\nexport function getTmpDocFromLocalStorage() {\n const tmpDoc = localStorage.getItem(TMP_DOC_LS_KEY)\n if (!tmpDoc) {\n return\n }\n\n return coerce(tmpDocSchema, 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.platformProxyUrl, 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 uploadResponseSchema = object({ url: string(), namespace: string(), slug: string() })\n\n if (!validate(uploadResponseSchema, json)) {\n uploadState.value = {\n type: 'error',\n error: 'Failed to process document.',\n }\n return\n }\n\n const uploadData = coerce(uploadResponseSchema, json)\n\n uploadState.value = {\n type: 'processing',\n }\n const embeddingStatusResponse = await fetch(\n createUrl(`/vector/registry/embeddings/${uploadData.namespace}/${uploadData.slug}`),\n {\n method: 'GET',\n },\n )\n\n saveTmpDocumentInLocalStorage({\n namespace: uploadData.namespace,\n slug: uploadData.slug,\n })\n\n await state.addDocument({\n namespace: uploadData.namespace,\n slug: uploadData.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 = uploadData.url\n\n setTimeout(() => {\n uploadState.value = undefined\n }, SHOW_UPLOAD_SUCCESS_DELAY)\n\n return uploadData\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"],"mappings":";;;;;AAMA,IAAM,4BAA4B;AASlC,IAAM,iBAAiB;AAEvB,SAAS,8BAA8B,EAAE,WAAW,QAA6C;
|
|
1
|
+
{"version":3,"file":"use-upload-tmp-document.js","names":[],"sources":["../../src/hooks/use-upload-tmp-document.ts"],"sourcesContent":["import { redirectToProxy } from '@scalar/helpers/url/redirect-to-proxy'\nimport { coerce, object, string, validate } from '@scalar/validation'\nimport { ref } from 'vue'\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\nconst tmpDocSchema = object({\n namespace: string(),\n slug: string(),\n})\n\nexport function getTmpDocFromLocalStorage() {\n const tmpDoc = localStorage.getItem(TMP_DOC_LS_KEY)\n if (!tmpDoc) {\n return\n }\n\n return coerce(tmpDocSchema, 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.platformProxyUrl, 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 uploadResponseSchema = object({ url: string(), namespace: string(), slug: string() })\n\n if (!validate(uploadResponseSchema, json)) {\n uploadState.value = {\n type: 'error',\n error: 'Failed to process document.',\n }\n return\n }\n\n const uploadData = coerce(uploadResponseSchema, json)\n\n uploadState.value = {\n type: 'processing',\n }\n const embeddingStatusResponse = await fetch(\n createUrl(`/vector/registry/embeddings/${uploadData.namespace}/${uploadData.slug}`),\n {\n method: 'GET',\n },\n )\n\n saveTmpDocumentInLocalStorage({\n namespace: uploadData.namespace,\n slug: uploadData.slug,\n })\n\n await state.addDocument({\n namespace: uploadData.namespace,\n slug: uploadData.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 = uploadData.url\n\n setTimeout(() => {\n uploadState.value = undefined\n }, SHOW_UPLOAD_SUCCESS_DELAY)\n\n return uploadData\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"],"mappings":";;;;;AAMA,IAAM,4BAA4B;AASlC,IAAM,iBAAiB;AAEvB,SAAS,8BAA8B,EAAE,WAAW,QAA6C;CAC/F,aAAa,QAAQ,gBAAgB,KAAK,UAAU;EAAE;EAAW;CAAK,CAAC,CAAC;AAC1E;AAEA,IAAM,eAAe,OAAO;CAC1B,WAAW,OAAO;CAClB,MAAM,OAAO;AACf,CAAC;AAED,SAAgB,4BAA4B;CAC1C,MAAM,SAAS,aAAa,QAAQ,cAAc;CAClD,IAAI,CAAC,QACH;CAGF,OAAO,OAAO,cAAc,KAAK,MAAM,MAAM,CAAC;AAChD;AAEA,SAAgB,+BAA+B;CAE7C,IAAI,CADW,aAAa,QAAQ,cAC/B,GACH;CAGF,aAAa,WAAW,cAAc;AACxC;;;;AAKA,SAAgB,uBAAuB;CACrC,MAAM,QAAQ,SAAS;CACvB,MAAM,cAAc,IAA4B;CAEhD,SAAS,UAAU,MAAc;EAC/B,MAAM,UAAU,GAAG,MAAM,UAAU;EACnC,OAAO,gBAAgB,MAAM,kBAAkB,OAAO;CACxD;CAEA,eAAe,mBAAmB,UAAkB,UAAU,OAAO;EACnE,IAAI;GACF,YAAY,QAAQ,EAClB,MAAM,YACR;GAEA,MAAM,WAAW,MAAM,MAAM,UAAU,0BAA0B,UAAU,kBAAkB,IAAI,GAAG;IAClG,QAAQ;IACR,SAAS,EACP,gBAAgB,mBAClB;IACA,MAAM,KAAK,UAAU,EAAE,SAAS,CAAC;GACnC,CAAC;GAED,IAAI,CAAC,SAAS,IAAI;IAChB,YAAY,QAAQ;KAClB,MAAM;KACN,OAAO;IACT;IAEA;GACF;GAEA,MAAM,OAAO,MAAM,SAAS,KAAK;GAEjC,MAAM,uBAAuB,OAAO;IAAE,KAAK,OAAO;IAAG,WAAW,OAAO;IAAG,MAAM,OAAO;GAAE,CAAC;GAE1F,IAAI,CAAC,SAAS,sBAAsB,IAAI,GAAG;IACzC,YAAY,QAAQ;KAClB,MAAM;KACN,OAAO;IACT;IACA;GACF;GAEA,MAAM,aAAa,OAAO,sBAAsB,IAAI;GAEpD,YAAY,QAAQ,EAClB,MAAM,aACR;GACA,MAAM,0BAA0B,MAAM,MACpC,UAAU,+BAA+B,WAAW,UAAU,GAAG,WAAW,MAAM,GAClF,EACE,QAAQ,MACV,CACF;GAEA,8BAA8B;IAC5B,WAAW,WAAW;IACtB,MAAM,WAAW;GACnB,CAAC;GAED,MAAM,MAAM,YAAY;IACtB,WAAW,WAAW;IACtB,MAAM,WAAW;IACjB,WAAW;IACX,KAAK;GACP,CAAC;GAED,IAAI,CAAC,wBAAwB,IAAI;IAC/B,YAAY,QAAQ;KAClB,MAAM;KACN,OAAO;IACT;IACA;GACF;GAEA,YAAY,QAAQ,EAAE,MAAM,OAAO;GACnC,MAAM,uBAAuB,QAAQ,WAAW;GAEhD,iBAAiB;IACf,YAAY,QAAQ,KAAA;GACtB,GAAG,yBAAyB;GAE5B,OAAO;EACT,QAAQ;GACN,YAAY,QAAQ;IAAE,MAAM;IAAS,OAAO;GAA0C;GACtF;EACF;CACF;CAEA,OAAO;EACL;EACA;CACF;AACF"}
|
package/dist/package.json
CHANGED
|
@@ -14,7 +14,12 @@ var persistencePlugin = ({ debounceDelay = 500, maxWait = 1e4, persistAuth = fal
|
|
|
14
14
|
if (typeof persistAuth === "function") return persistAuth();
|
|
15
15
|
return persistAuth;
|
|
16
16
|
};
|
|
17
|
-
return { hooks: {
|
|
17
|
+
return { hooks: {
|
|
18
|
+
/**
|
|
19
|
+
* Handles all workspace state change events.
|
|
20
|
+
* Each write is debounced by a key to prevent frequent writes for the same entity.
|
|
21
|
+
*/
|
|
22
|
+
onWorkspaceStateChanges(event) {
|
|
18
23
|
if (getPersistAuth() && event.type === "auth") execute("auth", () => authPersistence.setAuth(event.documentName, event.value));
|
|
19
24
|
} } };
|
|
20
25
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistance.js","names":[],"sources":["../../src/plugins/persistance.ts"],"sourcesContent":["import { debounce } from '@scalar/helpers/general/debounce'\nimport type { WorkspacePlugin } from '@scalar/workspace-store/workspace-plugin'\n\nimport { authStorage } from '@/helpers'\n\n/**\n * Plugin to persist workspace state changes with debounced writes.\n */\nexport const persistencePlugin = ({\n debounceDelay = 500,\n maxWait = 10000,\n persistAuth = false,\n}: {\n debounceDelay?: number\n /** Maximum time in milliseconds to wait before forcing execution, even with continuous calls. */\n maxWait?: number\n /**\n * Determines whether authentication details should be persisted.\n * Accepts a boolean or a function that returns a boolean.\n * Allows for conditional persistence logic, e.g., based on environment or user settings.\n */\n persistAuth?: boolean | (() => boolean)\n}): WorkspacePlugin => {\n // Debounced execute function for batching similar state changes\n const { execute } = debounce({ delay: debounceDelay, maxWait })\n const authPersistence = authStorage()\n\n const getPersistAuth = () => {\n if (typeof persistAuth === 'function') {\n return persistAuth()\n }\n\n return persistAuth\n }\n\n return {\n hooks: {\n /**\n * Handles all workspace state change events.\n * Each write is debounced by a key to prevent frequent writes for the same entity.\n */\n onWorkspaceStateChanges(event) {\n // Persist auth\n if (getPersistAuth() && event.type === 'auth') {\n execute('auth', () => authPersistence.setAuth(event.documentName, event.value))\n }\n\n // No action for other event types\n return\n },\n },\n }\n}\n"],"mappings":";;;;;;AAQA,IAAa,qBAAqB,EAChC,gBAAgB,KAChB,UAAU,KACV,cAAc,YAWO;CAErB,MAAM,EAAE,YAAY,SAAS;EAAE,OAAO;EAAe;
|
|
1
|
+
{"version":3,"file":"persistance.js","names":[],"sources":["../../src/plugins/persistance.ts"],"sourcesContent":["import { debounce } from '@scalar/helpers/general/debounce'\nimport type { WorkspacePlugin } from '@scalar/workspace-store/workspace-plugin'\n\nimport { authStorage } from '@/helpers'\n\n/**\n * Plugin to persist workspace state changes with debounced writes.\n */\nexport const persistencePlugin = ({\n debounceDelay = 500,\n maxWait = 10000,\n persistAuth = false,\n}: {\n debounceDelay?: number\n /** Maximum time in milliseconds to wait before forcing execution, even with continuous calls. */\n maxWait?: number\n /**\n * Determines whether authentication details should be persisted.\n * Accepts a boolean or a function that returns a boolean.\n * Allows for conditional persistence logic, e.g., based on environment or user settings.\n */\n persistAuth?: boolean | (() => boolean)\n}): WorkspacePlugin => {\n // Debounced execute function for batching similar state changes\n const { execute } = debounce({ delay: debounceDelay, maxWait })\n const authPersistence = authStorage()\n\n const getPersistAuth = () => {\n if (typeof persistAuth === 'function') {\n return persistAuth()\n }\n\n return persistAuth\n }\n\n return {\n hooks: {\n /**\n * Handles all workspace state change events.\n * Each write is debounced by a key to prevent frequent writes for the same entity.\n */\n onWorkspaceStateChanges(event) {\n // Persist auth\n if (getPersistAuth() && event.type === 'auth') {\n execute('auth', () => authPersistence.setAuth(event.documentName, event.value))\n }\n\n // No action for other event types\n return\n },\n },\n }\n}\n"],"mappings":";;;;;;AAQA,IAAa,qBAAqB,EAChC,gBAAgB,KAChB,UAAU,KACV,cAAc,YAWO;CAErB,MAAM,EAAE,YAAY,SAAS;EAAE,OAAO;EAAe;CAAQ,CAAC;CAC9D,MAAM,kBAAkB,YAAY;CAEpC,MAAM,uBAAuB;EAC3B,IAAI,OAAO,gBAAgB,YACzB,OAAO,YAAY;EAGrB,OAAO;CACT;CAEA,OAAO,EACL,OAAO;;;;;AAKL,wBAAwB,OAAO;EAE7B,IAAI,eAAe,KAAK,MAAM,SAAS,QACrC,QAAQ,cAAc,gBAAgB,QAAQ,MAAM,cAAc,MAAM,KAAK,CAAC;CAKlF,EACF,EACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-documents-to-store.js","names":[],"sources":["../../src/registry/add-documents-to-store.ts"],"sourcesContent":["import { bundle } from '@scalar/json-magic/bundle'\nimport { fetchUrls } from '@scalar/json-magic/bundle/plugins/browser'\nimport type { OpenAPIV3_1 } from '@scalar/openapi-types'\nimport type { ApiReferenceConfiguration } from '@scalar/types/api-reference'\nimport type { WorkspaceStore } from '@scalar/workspace-store/client'\nimport { n } from 'neverpanic'\nimport type { Ref } from 'vue'\n\nimport type { Api } from '@/api'\nimport { createError } from '@/entities'\nimport type { ApiMetadata } from '@/entities/registry/document'\nimport { restoreAuthSecretsFromStorage } from '@/helpers'\nimport { createDocumentName } from '@/registry/create-document-name'\n\nexport const loadDocument = n.safeFn(\n async ({\n namespace,\n slug,\n workspaceStore,\n registryDocuments,\n getAccessToken,\n registryUrl,\n config,\n api,\n removable,\n }: {\n namespace: string\n slug: string\n workspaceStore: WorkspaceStore\n getAccessToken?: () => string\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 headers: {\n headers: HeadersInit\n domains: string[]\n }[] = []\n\n const token = getAccessToken?.()\n\n if (token) {\n headers.push({\n domains: [new URL(registryUrl).host],\n headers: {\n 'x-scalar-auth': token,\n },\n })\n }\n\n const document: OpenAPIV3_1.Document = await bundle(url.toString(), {\n plugins: [\n fetchUrls({\n headers,\n }),\n ],\n treeShake: false,\n })\n\n const documentName = createDocumentName(namespace, slug)\n\n await workspaceStore.addDocument(\n {\n name: documentName,\n document,\n },\n config,\n )\n\n workspaceStore.update('x-scalar-active-document', documentName)\n\n restoreAuthSecretsFromStorage({ documentName, workspaceStore })\n\n return {\n success: true,\n data: getDocumentResult.data,\n }\n },\n (originalError) => createError('UNABLE_TO_LOAD_DOCUMENT', originalError),\n)\n"],"mappings":";;;;;;;AAcA,IAAa,eAAe,EAAE,OAC5B,OAAO,EACL,WACA,MACA,gBACA,mBACA,gBACA,aACA,QACA,KACA,gBAWI;CACJ,MAAM,oBAAoB,MAAM,IAAI,YAAY;EAC9C;EACA;
|
|
1
|
+
{"version":3,"file":"add-documents-to-store.js","names":[],"sources":["../../src/registry/add-documents-to-store.ts"],"sourcesContent":["import { bundle } from '@scalar/json-magic/bundle'\nimport { fetchUrls } from '@scalar/json-magic/bundle/plugins/browser'\nimport type { OpenAPIV3_1 } from '@scalar/openapi-types'\nimport type { ApiReferenceConfiguration } from '@scalar/types/api-reference'\nimport type { WorkspaceStore } from '@scalar/workspace-store/client'\nimport { n } from 'neverpanic'\nimport type { Ref } from 'vue'\n\nimport type { Api } from '@/api'\nimport { createError } from '@/entities'\nimport type { ApiMetadata } from '@/entities/registry/document'\nimport { restoreAuthSecretsFromStorage } from '@/helpers'\nimport { createDocumentName } from '@/registry/create-document-name'\n\nexport const loadDocument = n.safeFn(\n async ({\n namespace,\n slug,\n workspaceStore,\n registryDocuments,\n getAccessToken,\n registryUrl,\n config,\n api,\n removable,\n }: {\n namespace: string\n slug: string\n workspaceStore: WorkspaceStore\n getAccessToken?: () => string\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 headers: {\n headers: HeadersInit\n domains: string[]\n }[] = []\n\n const token = getAccessToken?.()\n\n if (token) {\n headers.push({\n domains: [new URL(registryUrl).host],\n headers: {\n 'x-scalar-auth': token,\n },\n })\n }\n\n const document: OpenAPIV3_1.Document = await bundle(url.toString(), {\n plugins: [\n fetchUrls({\n headers,\n }),\n ],\n treeShake: false,\n })\n\n const documentName = createDocumentName(namespace, slug)\n\n await workspaceStore.addDocument(\n {\n name: documentName,\n document,\n },\n config,\n )\n\n workspaceStore.update('x-scalar-active-document', documentName)\n\n restoreAuthSecretsFromStorage({ documentName, workspaceStore })\n\n return {\n success: true,\n data: getDocumentResult.data,\n }\n },\n (originalError) => createError('UNABLE_TO_LOAD_DOCUMENT', originalError),\n)\n"],"mappings":";;;;;;;AAcA,IAAa,eAAe,EAAE,OAC5B,OAAO,EACL,WACA,MACA,gBACA,mBACA,gBACA,aACA,QACA,KACA,gBAWI;CACJ,MAAM,oBAAoB,MAAM,IAAI,YAAY;EAC9C;EACA;CACF,CAAC;CAED,IAAI,CAAC,kBAAkB,SACrB,OAAO;CAGT,kBAAkB,MAAM,KAAK;EAAE,GAAG,kBAAkB;EAAM;CAAU,CAAC;CAErE,MAAM,MAAM,IAAI,IAAI,KAAK,UAAU,QAAQ,KAAK,UAAU,WAAW;CAErE,MAAM,UAGA,CAAC;CAEP,MAAM,QAAQ,iBAAiB;CAE/B,IAAI,OACF,QAAQ,KAAK;EACX,SAAS,CAAC,IAAI,IAAI,WAAW,CAAC,CAAC,IAAI;EACnC,SAAS,EACP,iBAAiB,MACnB;CACF,CAAC;CAGH,MAAM,WAAiC,MAAM,OAAO,IAAI,SAAS,GAAG;EAClE,SAAS,CACP,UAAU,EACR,QACF,CAAC,CACH;EACA,WAAW;CACb,CAAC;CAED,MAAM,eAAe,mBAAmB,WAAW,IAAI;CAEvD,MAAM,eAAe,YACnB;EACE,MAAM;EACN;CACF,GACA,MACF;CAEA,eAAe,OAAO,4BAA4B,YAAY;CAE9D,8BAA8B;EAAE;EAAc;CAAe,CAAC;CAE9D,OAAO;EACL,SAAS;EACT,MAAM,kBAAkB;CAC1B;AACF,IACC,kBAAkB,YAAY,2BAA2B,aAAa,CACzE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-document-name.js","names":[],"sources":["../../src/registry/create-document-name.ts"],"sourcesContent":["export function createDocumentName(namespace: string, slug: string) {\n return `${namespace}/${slug}`\n}\n"],"mappings":";AAAA,SAAgB,mBAAmB,WAAmB,MAAc;
|
|
1
|
+
{"version":3,"file":"create-document-name.js","names":[],"sources":["../../src/registry/create-document-name.ts"],"sourcesContent":["export function createDocumentName(namespace: string, slug: string) {\n return `${namespace}/${slug}`\n}\n"],"mappings":";AAAA,SAAgB,mBAAmB,WAAmB,MAAc;CAClE,OAAO,GAAG,UAAU,GAAG;AACzB"}
|
package/dist/state/state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","names":[],"sources":["../../src/state/state.ts"],"sourcesContent":["import { Chat } from '@ai-sdk/vue'\nimport { type ModalState, useModal } from '@scalar/components/modal'\nimport { apiReferenceConfigurationSchema } from '@scalar/schemas/api-reference'\nimport type { ApiReferenceConfigurationRaw } from '@scalar/types/api-reference'\nimport { useToasts } from '@scalar/use-toasts'\nimport { coerce } from '@scalar/validation'\nimport { type WorkspaceStore, createWorkspaceStore } from '@scalar/workspace-store/client'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport { createWorkspaceEventBus } from '@scalar/workspace-store/events'\nimport { DefaultChatTransport, type UIDataTypes, type UIMessage, lastAssistantMessageIsCompleteWithToolCalls } from 'ai'\nimport { n } from 'neverpanic'\nimport { type ComputedRef, type InjectionKey, type Ref, computed, inject, reactive, ref, watch } from 'vue'\n\nimport { type Api, createApi, createAuthorizationHeaders } from '@/api'\nimport { executeRequestTool } from '@/client-tools/execute-request'\nimport { URLS } from '@/consts/urls'\nimport { createError } from '@/entities'\nimport type { ApiMetadata } from '@/entities/registry/document'\nimport type {\n ASK_FOR_AUTHENTICATION_TOOL_NAME,\n AskForAuthenticationInput,\n} from '@/entities/tools/ask-for-authentication'\nimport {\n EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME,\n type ExecuteClientSideRequestToolInput,\n type ExecuteClientSideRequestToolOutput,\n} from '@/entities/tools/execute-request'\nimport type {\n GetOpenAPISpecsSummaryToolOutput,\n SUMMARIZE_OPENAPI_SPECS_TOOL_NAME,\n} from '@/entities/tools/get-openapi-specs-summary'\nimport type {\n SEARCH_OPENAPI_OPERATIONS_TOOL_NAME,\n SearchOpenAPIOperationsToolInput,\n SearchOpenAPIOperationsToolOutput,\n} from '@/entities/tools/search-openapi-operations'\nimport { createDocumentSettings } from '@/helpers'\nimport { useTermsAndConditions } from '@/hooks/use-term-and-conditions'\nimport { removeTmpDocFromLocalStorage } from '@/hooks/use-upload-tmp-document'\nimport { persistencePlugin } from '@/plugins/persistance'\nimport { loadDocument } from '@/registry/add-documents-to-store'\nimport { createDocumentName } from '@/registry/create-document-name'\nimport type { ChatMode } from '@/types'\n\nexport type RegistryDocument = {\n namespace: string\n slug: string\n}\n\nexport type Tools = {\n [SEARCH_OPENAPI_OPERATIONS_TOOL_NAME]: {\n input: SearchOpenAPIOperationsToolInput\n output: SearchOpenAPIOperationsToolOutput\n }\n [EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME]: {\n input: ExecuteClientSideRequestToolInput\n output: ExecuteClientSideRequestToolOutput\n }\n [SUMMARIZE_OPENAPI_SPECS_TOOL_NAME]: {\n input: object\n output: GetOpenAPISpecsSummaryToolOutput\n }\n [ASK_FOR_AUTHENTICATION_TOOL_NAME]: {\n input: AskForAuthenticationInput\n output: unknown\n }\n}\n\nexport const STATE_SYMBOL: InjectionKey<State> = Symbol('STATE_SYMBOL')\n\nconst { toast } = useToasts()\n\ntype State = {\n prompt: Ref<string>\n chat: Chat<UIMessage<unknown, UIDataTypes, Tools>>\n workspaceStore: WorkspaceStore\n loading: ComputedRef<boolean>\n settingsModal: ModalState\n eventBus: WorkspaceEventBus\n proxyUrl: ComputedRef<string>\n proxyUrlRaw: Ref<string | undefined>\n config: ComputedRef<ApiReferenceConfigurationRaw>\n registryUrl: string\n dashboardUrl: string\n baseUrl: string\n platformProxyUrl: string\n isLoggedIn?: Ref<boolean>\n registryDocuments: Ref<ApiMetadata[]>\n pendingDocuments: Record<string, boolean>\n mode: ChatMode\n terms: { accepted: Ref<boolean>; accept: () => void }\n addDocument: (document: { namespace: string; slug: string; removable?: boolean; tmp?: boolean }) => Promise<void>\n addDocumentAsync: (document: { namespace: string; slug: string; removable?: boolean }) => Promise<void>\n removeDocument: (document: { namespace: string; slug: string }) => void\n getAccessToken?: () => string\n getAgentKey?: () => string\n api: Api\n uploadedTmpDocumentUrl: Ref<string | undefined>\n curatedDocuments: Ref<ApiMetadata[]>\n getActiveDocumentJson?: () => string\n hideAddApi?: boolean\n}\n\nfunction createChat({\n registryDocuments,\n workspaceStore,\n baseUrl,\n proxyUrl,\n getAccessToken,\n getAgentKey,\n}: {\n registryDocuments: Ref<ApiMetadata[]>\n workspaceStore: WorkspaceStore\n baseUrl: string\n proxyUrl: ComputedRef<string>\n getAccessToken?: () => string\n getAgentKey?: () => string\n}) {\n const chat = new Chat<UIMessage<unknown, UIDataTypes, Tools>>({\n sendAutomaticallyWhen: lastAssistantMessageIsCompleteWithToolCalls,\n transport: new DefaultChatTransport({\n api: `${baseUrl}/vector/openapi/chat`,\n headers: () => createAuthorizationHeaders({ getAccessToken, getAgentKey }),\n body: () => ({\n registryDocuments: registryDocuments.value,\n }),\n }),\n async onToolCall({ toolCall }): Promise<any> {\n if (toolCall.dynamic) {\n return\n }\n\n if (\n toolCall.toolName === EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME &&\n toolCall.input.method.toLowerCase() === 'get'\n ) {\n await executeRequestTool({\n documentSettings: createDocumentSettings(workspaceStore),\n input: toolCall.input,\n toolCallId: toolCall.toolCallId,\n chat,\n proxyUrl: proxyUrl.value,\n })\n }\n },\n })\n\n return chat\n}\n\nexport function createState({\n initialRegistryDocuments,\n registryUrl,\n dashboardUrl,\n platformProxyUrl,\n baseUrl,\n mode,\n isLoggedIn,\n getAccessToken,\n getAgentKey,\n getActiveDocumentJson,\n prefilledMessageRef,\n hideAddApi,\n}: {\n initialRegistryDocuments: { namespace: string; slug: string }[]\n registryUrl: string\n dashboardUrl: string\n platformProxyUrl: string\n baseUrl: string\n mode: ChatMode\n isLoggedIn?: Ref<boolean>\n getAccessToken?: () => string\n getAgentKey?: () => string\n getActiveDocumentJson?: () => string\n prefilledMessageRef?: Ref<string>\n hideAddApi?: boolean\n}): State {\n const prompt = ref<State['prompt']['value']>(prefilledMessageRef?.value ?? '')\n const registryDocuments = ref<ApiMetadata[]>([])\n const pendingDocuments = reactive<Record<string, boolean>>({})\n const curatedDocuments = ref<ApiMetadata[]>([])\n const proxyUrlRaw = ref<State['proxyUrlRaw']['value']>(URLS.DEFAULT_PROXY_URL)\n const proxyUrl = computed(() => proxyUrlRaw.value?.trim() || URLS.DEFAULT_PROXY_URL)\n const uploadedTmpDocumentUrl = ref<string>()\n const terms = useTermsAndConditions()\n\n const eventBus = createWorkspaceEventBus()\n const workspaceStore = createWorkspaceStore({\n plugins: [\n persistencePlugin({\n persistAuth: true,\n }),\n ],\n })\n\n const config = computed(() =>\n coerce(apiReferenceConfigurationSchema, {\n proxyUrl: proxyUrl.value,\n persistAuth: true,\n }),\n )\n\n const chat = createChat({\n registryDocuments,\n workspaceStore,\n baseUrl,\n proxyUrl,\n getAccessToken,\n getAgentKey,\n })\n\n const api = createApi({\n baseUrl,\n getAccessToken,\n getAgentKey,\n })\n\n const loading = computed(\n () =>\n chat.status === 'submitted' ||\n (chat.status === 'streaming' && !chat.lastMessage?.parts.some((part) => part.type === 'text')),\n )\n\n watch(\n () => chat.status,\n () => {\n if (chat.status === 'streaming') {\n prompt.value = ''\n }\n },\n )\n\n if (prefilledMessageRef) {\n watch(prefilledMessageRef, async (val) => {\n if (val) {\n prompt.value = val\n if (terms.accepted.value) {\n await chat.sendMessage({ text: prompt.value })\n }\n }\n })\n }\n\n const settingsModal = useModal()\n\n async function addDocument({\n namespace,\n slug,\n removable = true,\n tmp = false,\n }: {\n namespace: string\n slug: string\n removable?: boolean\n tmp?: boolean\n }) {\n const matchingDoc = registryDocuments.value.find((doc) => doc.namespace === namespace && doc.slug === slug)\n\n if (matchingDoc) {\n return\n }\n\n const identifier = `@${namespace}/${slug}`\n\n pendingDocuments[identifier] = true\n\n const loadDocumentResult = await loadDocument({\n namespace,\n slug,\n workspaceStore,\n registryUrl,\n registryDocuments,\n config: config.value,\n getAccessToken,\n api,\n removable,\n })\n\n pendingDocuments[identifier] = false\n\n if (!loadDocumentResult.success) {\n /**\n * If we are unable to load a document, we just remove it\n * from tmp local storage, do not warn the user.\n */\n if (tmp) {\n removeTmpDocFromLocalStorage()\n throw loadDocumentResult.error\n }\n\n console.warn('[AGENT]: Unable to load document', loadDocumentResult.error)\n toast(`Unable to load the document @${namespace}/${slug}`, 'warn')\n throw loadDocumentResult.error\n }\n }\n\n /**\n * Waits for document to be available in embeddings\n * and adds to the list\n */\n async function addDocumentAsync({\n namespace,\n slug,\n removable = true,\n }: {\n namespace: string\n slug: string\n removable?: boolean\n }) {\n const matchingDoc = registryDocuments.value.find((doc) => doc.namespace === namespace && doc.slug === slug)\n\n if (matchingDoc) {\n return\n }\n\n const identifier = `@${namespace}/${slug}`\n\n pendingDocuments[identifier] = true\n\n const embeddingStatusResponse = await n.fromUnsafe(\n () =>\n fetch(`${baseUrl}/vector/registry/embeddings/${namespace}/${slug}`, {\n method: 'GET',\n }),\n (originalError) => createError('FAILED_TO_GET_EMBEDDING_STATUS', originalError),\n )\n\n if (embeddingStatusResponse.success && embeddingStatusResponse.data.ok) {\n const loadDocumentResult = await loadDocument({\n namespace,\n slug,\n workspaceStore,\n registryUrl,\n registryDocuments,\n config: config.value,\n getAccessToken,\n api,\n removable,\n })\n\n if (!loadDocumentResult.success) {\n console.warn('[AGENT]: Unable to load document', loadDocumentResult.error)\n toast(`Unable to load the document @${namespace}/${slug}`, 'warn')\n }\n } else {\n console.warn('[AGENT]: Document could not be embedded')\n toast(`Unable to embed the document @${namespace}/${slug}`, 'warn')\n }\n\n pendingDocuments[identifier] = false\n }\n\n function removeDocument({ namespace, slug }: { namespace: string; slug: string }) {\n registryDocuments.value = registryDocuments.value.filter(\n (doc) => !(doc.namespace === namespace && doc.slug === slug),\n )\n\n workspaceStore.deleteDocument(createDocumentName(namespace, slug))\n }\n\n initialRegistryDocuments.forEach(({ namespace, slug }) => addDocument({ namespace, slug, removable: false }))\n\n return {\n prompt,\n chat,\n workspaceStore,\n eventBus,\n loading,\n settingsModal,\n config,\n registryUrl,\n dashboardUrl,\n platformProxyUrl,\n baseUrl,\n registryDocuments,\n pendingDocuments,\n proxyUrl,\n proxyUrlRaw,\n mode,\n terms,\n isLoggedIn,\n addDocument,\n addDocumentAsync,\n removeDocument,\n getAccessToken,\n getAgentKey,\n api,\n uploadedTmpDocumentUrl,\n curatedDocuments,\n getActiveDocumentJson,\n hideAddApi,\n }\n}\n\nexport function useState() {\n const state = inject(STATE_SYMBOL)\n\n if (!state) {\n throw new Error('No state provided.')\n }\n\n return state\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAoEA,IAAa,eAAoC,OAAO,eAAe;AAEvE,IAAM,EAAE,UAAU,WAAW;AAiC7B,SAAS,WAAW,EAClB,mBACA,gBACA,SACA,UACA,gBACA,eAQC;CACD,MAAM,OAAO,IAAI,KAA6C;EAC5D,uBAAuB;EACvB,WAAW,IAAI,qBAAqB;GAClC,KAAK,GAAG,QAAQ;GAChB,eAAe,2BAA2B;IAAE;IAAgB;IAAa,CAAC;GAC1E,aAAa,EACX,mBAAmB,kBAAkB,OACtC;GACF,CAAC;EACF,MAAM,WAAW,EAAE,YAA0B;AAC3C,OAAI,SAAS,QACX;AAGF,OACE,SAAS,aAAA,qBACT,SAAS,MAAM,OAAO,aAAa,KAAK,MAExC,OAAM,mBAAmB;IACvB,kBAAkB,uBAAuB,eAAe;IACxD,OAAO,SAAS;IAChB,YAAY,SAAS;IACrB;IACA,UAAU,SAAS;IACpB,CAAC;;EAGP,CAAC;AAEF,QAAO;;AAGT,SAAgB,YAAY,EAC1B,0BACA,aACA,cACA,kBACA,SACA,MACA,YACA,gBACA,aACA,uBACA,qBACA,cAcQ;CACR,MAAM,SAAS,IAA8B,qBAAqB,SAAS,GAAG;CAC9E,MAAM,oBAAoB,IAAmB,EAAE,CAAC;CAChD,MAAM,mBAAmB,SAAkC,EAAE,CAAC;CAC9D,MAAM,mBAAmB,IAAmB,EAAE,CAAC;CAC/C,MAAM,cAAc,IAAmC,KAAK,kBAAkB;CAC9E,MAAM,WAAW,eAAe,YAAY,OAAO,MAAM,IAAI,KAAK,kBAAkB;CACpF,MAAM,yBAAyB,KAAa;CAC5C,MAAM,QAAQ,uBAAuB;CAErC,MAAM,WAAW,yBAAyB;CAC1C,MAAM,iBAAiB,qBAAqB,EAC1C,SAAS,CACP,kBAAkB,EAChB,aAAa,MACd,CAAC,CACH,EACF,CAAC;CAEF,MAAM,SAAS,eACb,OAAO,iCAAiC;EACtC,UAAU,SAAS;EACnB,aAAa;EACd,CAAC,CACH;CAED,MAAM,OAAO,WAAW;EACtB;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,MAAM,UAAU;EACpB;EACA;EACA;EACD,CAAC;CAEF,MAAM,UAAU,eAEZ,KAAK,WAAW,eACf,KAAK,WAAW,eAAe,CAAC,KAAK,aAAa,MAAM,MAAM,SAAS,KAAK,SAAS,OAAO,CAChG;AAED,aACQ,KAAK,cACL;AACJ,MAAI,KAAK,WAAW,YAClB,QAAO,QAAQ;GAGpB;AAED,KAAI,oBACF,OAAM,qBAAqB,OAAO,QAAQ;AACxC,MAAI,KAAK;AACP,UAAO,QAAQ;AACf,OAAI,MAAM,SAAS,MACjB,OAAM,KAAK,YAAY,EAAE,MAAM,OAAO,OAAO,CAAC;;GAGlD;CAGJ,MAAM,gBAAgB,UAAU;CAEhC,eAAe,YAAY,EACzB,WACA,MACA,YAAY,MACZ,MAAM,SAML;AAGD,MAFoB,kBAAkB,MAAM,MAAM,QAAQ,IAAI,cAAc,aAAa,IAAI,SAAS,KAAK,CAGzG;EAGF,MAAM,aAAa,IAAI,UAAU,GAAG;AAEpC,mBAAiB,cAAc;EAE/B,MAAM,qBAAqB,MAAM,aAAa;GAC5C;GACA;GACA;GACA;GACA;GACA,QAAQ,OAAO;GACf;GACA;GACA;GACD,CAAC;AAEF,mBAAiB,cAAc;AAE/B,MAAI,CAAC,mBAAmB,SAAS;;;;;AAK/B,OAAI,KAAK;AACP,kCAA8B;AAC9B,UAAM,mBAAmB;;AAG3B,WAAQ,KAAK,oCAAoC,mBAAmB,MAAM;AAC1E,SAAM,gCAAgC,UAAU,GAAG,QAAQ,OAAO;AAClE,SAAM,mBAAmB;;;;;;;CAQ7B,eAAe,iBAAiB,EAC9B,WACA,MACA,YAAY,QAKX;AAGD,MAFoB,kBAAkB,MAAM,MAAM,QAAQ,IAAI,cAAc,aAAa,IAAI,SAAS,KAAK,CAGzG;EAGF,MAAM,aAAa,IAAI,UAAU,GAAG;AAEpC,mBAAiB,cAAc;EAE/B,MAAM,0BAA0B,MAAM,EAAE,iBAEpC,MAAM,GAAG,QAAQ,8BAA8B,UAAU,GAAG,QAAQ,EAClE,QAAQ,OACT,CAAC,GACH,kBAAkB,YAAY,kCAAkC,cAAc,CAChF;AAED,MAAI,wBAAwB,WAAW,wBAAwB,KAAK,IAAI;GACtE,MAAM,qBAAqB,MAAM,aAAa;IAC5C;IACA;IACA;IACA;IACA;IACA,QAAQ,OAAO;IACf;IACA;IACA;IACD,CAAC;AAEF,OAAI,CAAC,mBAAmB,SAAS;AAC/B,YAAQ,KAAK,oCAAoC,mBAAmB,MAAM;AAC1E,UAAM,gCAAgC,UAAU,GAAG,QAAQ,OAAO;;SAE/D;AACL,WAAQ,KAAK,0CAA0C;AACvD,SAAM,iCAAiC,UAAU,GAAG,QAAQ,OAAO;;AAGrE,mBAAiB,cAAc;;CAGjC,SAAS,eAAe,EAAE,WAAW,QAA6C;AAChF,oBAAkB,QAAQ,kBAAkB,MAAM,QAC/C,QAAQ,EAAE,IAAI,cAAc,aAAa,IAAI,SAAS,MACxD;AAED,iBAAe,eAAe,mBAAmB,WAAW,KAAK,CAAC;;AAGpE,0BAAyB,SAAS,EAAE,WAAW,WAAW,YAAY;EAAE;EAAW;EAAM,WAAW;EAAO,CAAC,CAAC;AAE7G,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;;AAGH,SAAgB,WAAW;CACzB,MAAM,QAAQ,OAAO,aAAa;AAElC,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,qBAAqB;AAGvC,QAAO"}
|
|
1
|
+
{"version":3,"file":"state.js","names":[],"sources":["../../src/state/state.ts"],"sourcesContent":["import { Chat } from '@ai-sdk/vue'\nimport { type ModalState, useModal } from '@scalar/components/modal'\nimport { apiReferenceConfigurationSchema } from '@scalar/schemas/api-reference'\nimport type { ApiReferenceConfigurationRaw } from '@scalar/types/api-reference'\nimport { useToasts } from '@scalar/use-toasts'\nimport { coerce } from '@scalar/validation'\nimport { type WorkspaceStore, createWorkspaceStore } from '@scalar/workspace-store/client'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport { createWorkspaceEventBus } from '@scalar/workspace-store/events'\nimport { DefaultChatTransport, type UIDataTypes, type UIMessage, lastAssistantMessageIsCompleteWithToolCalls } from 'ai'\nimport { n } from 'neverpanic'\nimport { type ComputedRef, type InjectionKey, type Ref, computed, inject, reactive, ref, watch } from 'vue'\n\nimport { type Api, createApi, createAuthorizationHeaders } from '@/api'\nimport { executeRequestTool } from '@/client-tools/execute-request'\nimport { URLS } from '@/consts/urls'\nimport { createError } from '@/entities'\nimport type { ApiMetadata } from '@/entities/registry/document'\nimport type {\n ASK_FOR_AUTHENTICATION_TOOL_NAME,\n AskForAuthenticationInput,\n} from '@/entities/tools/ask-for-authentication'\nimport {\n EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME,\n type ExecuteClientSideRequestToolInput,\n type ExecuteClientSideRequestToolOutput,\n} from '@/entities/tools/execute-request'\nimport type {\n GetOpenAPISpecsSummaryToolOutput,\n SUMMARIZE_OPENAPI_SPECS_TOOL_NAME,\n} from '@/entities/tools/get-openapi-specs-summary'\nimport type {\n SEARCH_OPENAPI_OPERATIONS_TOOL_NAME,\n SearchOpenAPIOperationsToolInput,\n SearchOpenAPIOperationsToolOutput,\n} from '@/entities/tools/search-openapi-operations'\nimport { createDocumentSettings } from '@/helpers'\nimport { useTermsAndConditions } from '@/hooks/use-term-and-conditions'\nimport { removeTmpDocFromLocalStorage } from '@/hooks/use-upload-tmp-document'\nimport { persistencePlugin } from '@/plugins/persistance'\nimport { loadDocument } from '@/registry/add-documents-to-store'\nimport { createDocumentName } from '@/registry/create-document-name'\nimport type { ChatMode } from '@/types'\n\nexport type RegistryDocument = {\n namespace: string\n slug: string\n}\n\nexport type Tools = {\n [SEARCH_OPENAPI_OPERATIONS_TOOL_NAME]: {\n input: SearchOpenAPIOperationsToolInput\n output: SearchOpenAPIOperationsToolOutput\n }\n [EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME]: {\n input: ExecuteClientSideRequestToolInput\n output: ExecuteClientSideRequestToolOutput\n }\n [SUMMARIZE_OPENAPI_SPECS_TOOL_NAME]: {\n input: object\n output: GetOpenAPISpecsSummaryToolOutput\n }\n [ASK_FOR_AUTHENTICATION_TOOL_NAME]: {\n input: AskForAuthenticationInput\n output: unknown\n }\n}\n\nexport const STATE_SYMBOL: InjectionKey<State> = Symbol('STATE_SYMBOL')\n\nconst { toast } = useToasts()\n\ntype State = {\n prompt: Ref<string>\n chat: Chat<UIMessage<unknown, UIDataTypes, Tools>>\n workspaceStore: WorkspaceStore\n loading: ComputedRef<boolean>\n settingsModal: ModalState\n eventBus: WorkspaceEventBus\n proxyUrl: ComputedRef<string>\n proxyUrlRaw: Ref<string | undefined>\n config: ComputedRef<ApiReferenceConfigurationRaw>\n registryUrl: string\n dashboardUrl: string\n baseUrl: string\n platformProxyUrl: string\n isLoggedIn?: Ref<boolean>\n registryDocuments: Ref<ApiMetadata[]>\n pendingDocuments: Record<string, boolean>\n mode: ChatMode\n terms: { accepted: Ref<boolean>; accept: () => void }\n addDocument: (document: { namespace: string; slug: string; removable?: boolean; tmp?: boolean }) => Promise<void>\n addDocumentAsync: (document: { namespace: string; slug: string; removable?: boolean }) => Promise<void>\n removeDocument: (document: { namespace: string; slug: string }) => void\n getAccessToken?: () => string\n getAgentKey?: () => string\n api: Api\n uploadedTmpDocumentUrl: Ref<string | undefined>\n curatedDocuments: Ref<ApiMetadata[]>\n getActiveDocumentJson?: () => string\n hideAddApi?: boolean\n}\n\nfunction createChat({\n registryDocuments,\n workspaceStore,\n baseUrl,\n proxyUrl,\n getAccessToken,\n getAgentKey,\n}: {\n registryDocuments: Ref<ApiMetadata[]>\n workspaceStore: WorkspaceStore\n baseUrl: string\n proxyUrl: ComputedRef<string>\n getAccessToken?: () => string\n getAgentKey?: () => string\n}) {\n const chat = new Chat<UIMessage<unknown, UIDataTypes, Tools>>({\n sendAutomaticallyWhen: lastAssistantMessageIsCompleteWithToolCalls,\n transport: new DefaultChatTransport({\n api: `${baseUrl}/vector/openapi/chat`,\n headers: () => createAuthorizationHeaders({ getAccessToken, getAgentKey }),\n body: () => ({\n registryDocuments: registryDocuments.value,\n }),\n }),\n async onToolCall({ toolCall }): Promise<any> {\n if (toolCall.dynamic) {\n return\n }\n\n if (\n toolCall.toolName === EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME &&\n toolCall.input.method.toLowerCase() === 'get'\n ) {\n await executeRequestTool({\n documentSettings: createDocumentSettings(workspaceStore),\n input: toolCall.input,\n toolCallId: toolCall.toolCallId,\n chat,\n proxyUrl: proxyUrl.value,\n })\n }\n },\n })\n\n return chat\n}\n\nexport function createState({\n initialRegistryDocuments,\n registryUrl,\n dashboardUrl,\n platformProxyUrl,\n baseUrl,\n mode,\n isLoggedIn,\n getAccessToken,\n getAgentKey,\n getActiveDocumentJson,\n prefilledMessageRef,\n hideAddApi,\n}: {\n initialRegistryDocuments: { namespace: string; slug: string }[]\n registryUrl: string\n dashboardUrl: string\n platformProxyUrl: string\n baseUrl: string\n mode: ChatMode\n isLoggedIn?: Ref<boolean>\n getAccessToken?: () => string\n getAgentKey?: () => string\n getActiveDocumentJson?: () => string\n prefilledMessageRef?: Ref<string>\n hideAddApi?: boolean\n}): State {\n const prompt = ref<State['prompt']['value']>(prefilledMessageRef?.value ?? '')\n const registryDocuments = ref<ApiMetadata[]>([])\n const pendingDocuments = reactive<Record<string, boolean>>({})\n const curatedDocuments = ref<ApiMetadata[]>([])\n const proxyUrlRaw = ref<State['proxyUrlRaw']['value']>(URLS.DEFAULT_PROXY_URL)\n const proxyUrl = computed(() => proxyUrlRaw.value?.trim() || URLS.DEFAULT_PROXY_URL)\n const uploadedTmpDocumentUrl = ref<string>()\n const terms = useTermsAndConditions()\n\n const eventBus = createWorkspaceEventBus()\n const workspaceStore = createWorkspaceStore({\n plugins: [\n persistencePlugin({\n persistAuth: true,\n }),\n ],\n })\n\n const config = computed(() =>\n coerce(apiReferenceConfigurationSchema, {\n proxyUrl: proxyUrl.value,\n persistAuth: true,\n }),\n )\n\n const chat = createChat({\n registryDocuments,\n workspaceStore,\n baseUrl,\n proxyUrl,\n getAccessToken,\n getAgentKey,\n })\n\n const api = createApi({\n baseUrl,\n getAccessToken,\n getAgentKey,\n })\n\n const loading = computed(\n () =>\n chat.status === 'submitted' ||\n (chat.status === 'streaming' && !chat.lastMessage?.parts.some((part) => part.type === 'text')),\n )\n\n watch(\n () => chat.status,\n () => {\n if (chat.status === 'streaming') {\n prompt.value = ''\n }\n },\n )\n\n if (prefilledMessageRef) {\n watch(prefilledMessageRef, async (val) => {\n if (val) {\n prompt.value = val\n if (terms.accepted.value) {\n await chat.sendMessage({ text: prompt.value })\n }\n }\n })\n }\n\n const settingsModal = useModal()\n\n async function addDocument({\n namespace,\n slug,\n removable = true,\n tmp = false,\n }: {\n namespace: string\n slug: string\n removable?: boolean\n tmp?: boolean\n }) {\n const matchingDoc = registryDocuments.value.find((doc) => doc.namespace === namespace && doc.slug === slug)\n\n if (matchingDoc) {\n return\n }\n\n const identifier = `@${namespace}/${slug}`\n\n pendingDocuments[identifier] = true\n\n const loadDocumentResult = await loadDocument({\n namespace,\n slug,\n workspaceStore,\n registryUrl,\n registryDocuments,\n config: config.value,\n getAccessToken,\n api,\n removable,\n })\n\n pendingDocuments[identifier] = false\n\n if (!loadDocumentResult.success) {\n /**\n * If we are unable to load a document, we just remove it\n * from tmp local storage, do not warn the user.\n */\n if (tmp) {\n removeTmpDocFromLocalStorage()\n throw loadDocumentResult.error\n }\n\n console.warn('[AGENT]: Unable to load document', loadDocumentResult.error)\n toast(`Unable to load the document @${namespace}/${slug}`, 'warn')\n throw loadDocumentResult.error\n }\n }\n\n /**\n * Waits for document to be available in embeddings\n * and adds to the list\n */\n async function addDocumentAsync({\n namespace,\n slug,\n removable = true,\n }: {\n namespace: string\n slug: string\n removable?: boolean\n }) {\n const matchingDoc = registryDocuments.value.find((doc) => doc.namespace === namespace && doc.slug === slug)\n\n if (matchingDoc) {\n return\n }\n\n const identifier = `@${namespace}/${slug}`\n\n pendingDocuments[identifier] = true\n\n const embeddingStatusResponse = await n.fromUnsafe(\n () =>\n fetch(`${baseUrl}/vector/registry/embeddings/${namespace}/${slug}`, {\n method: 'GET',\n }),\n (originalError) => createError('FAILED_TO_GET_EMBEDDING_STATUS', originalError),\n )\n\n if (embeddingStatusResponse.success && embeddingStatusResponse.data.ok) {\n const loadDocumentResult = await loadDocument({\n namespace,\n slug,\n workspaceStore,\n registryUrl,\n registryDocuments,\n config: config.value,\n getAccessToken,\n api,\n removable,\n })\n\n if (!loadDocumentResult.success) {\n console.warn('[AGENT]: Unable to load document', loadDocumentResult.error)\n toast(`Unable to load the document @${namespace}/${slug}`, 'warn')\n }\n } else {\n console.warn('[AGENT]: Document could not be embedded')\n toast(`Unable to embed the document @${namespace}/${slug}`, 'warn')\n }\n\n pendingDocuments[identifier] = false\n }\n\n function removeDocument({ namespace, slug }: { namespace: string; slug: string }) {\n registryDocuments.value = registryDocuments.value.filter(\n (doc) => !(doc.namespace === namespace && doc.slug === slug),\n )\n\n workspaceStore.deleteDocument(createDocumentName(namespace, slug))\n }\n\n initialRegistryDocuments.forEach(({ namespace, slug }) => addDocument({ namespace, slug, removable: false }))\n\n return {\n prompt,\n chat,\n workspaceStore,\n eventBus,\n loading,\n settingsModal,\n config,\n registryUrl,\n dashboardUrl,\n platformProxyUrl,\n baseUrl,\n registryDocuments,\n pendingDocuments,\n proxyUrl,\n proxyUrlRaw,\n mode,\n terms,\n isLoggedIn,\n addDocument,\n addDocumentAsync,\n removeDocument,\n getAccessToken,\n getAgentKey,\n api,\n uploadedTmpDocumentUrl,\n curatedDocuments,\n getActiveDocumentJson,\n hideAddApi,\n }\n}\n\nexport function useState() {\n const state = inject(STATE_SYMBOL)\n\n if (!state) {\n throw new Error('No state provided.')\n }\n\n return state\n}\n"],"mappings":"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"}
|