@scalar/agent-chat 0.10.9 → 0.10.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/package.json CHANGED
@@ -10,7 +10,7 @@
10
10
  "url": "git+https://github.com/scalar/scalar.git",
11
11
  "directory": "packages/agent-chat"
12
12
  },
13
- "version": "0.10.9",
13
+ "version": "0.10.10",
14
14
  "engines": {
15
15
  "node": ">=22"
16
16
  },
@@ -18,6 +18,7 @@
18
18
  "build": "vite build && vue-tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && shx cp package.json dist",
19
19
  "build:watch": "vite build --watch",
20
20
  "playground": "cd playground && vite",
21
+ "test": "vitest --run",
21
22
  "types:check": "vue-tsc --noEmit"
22
23
  },
23
24
  "type": "module",
@@ -69,9 +70,12 @@
69
70
  },
70
71
  "devDependencies": {
71
72
  "@tailwindcss/vite": "catalog:*",
73
+ "@types/jsdom": "catalog:*",
72
74
  "@vitejs/plugin-vue": "catalog:*",
73
75
  "hono": "catalog:*",
76
+ "jsdom": "catalog:*",
74
77
  "tailwindcss": "catalog:*",
75
- "vite": "catalog:*"
78
+ "vite": "catalog:*",
79
+ "vitest": "catalog:*"
76
80
  }
77
81
  }
@@ -7,6 +7,7 @@ export declare const loadDocument: (args_0: {
7
7
  namespace: string;
8
8
  slug: string;
9
9
  workspaceStore: WorkspaceStore;
10
+ getAccessToken?: () => string;
10
11
  registryDocuments: Ref<ApiMetadata[]>;
11
12
  registryUrl: string;
12
13
  config: Partial<ApiReferenceConfiguration>;
@@ -1 +1 @@
1
- {"version":3,"file":"add-documents-to-store.d.ts","sourceRoot":"","sources":["../../src/registry/add-documents-to-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAA;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAEpE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAE9B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAI/D,eAAO,MAAM,YAAY;eAWV,MAAM;UACX,MAAM;oBACI,cAAc;uBACX,GAAG,CAAC,WAAW,EAAE,CAAC;iBACxB,MAAM;YACX,OAAO,CAAC,yBAAyB,CAAC;SACrC,GAAG;gBACI,OAAO;;;;;;;;;;;;;;;;;;;;;gHAwCtB,CAAA"}
1
+ {"version":3,"file":"add-documents-to-store.d.ts","sourceRoot":"","sources":["../../src/registry/add-documents-to-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAA;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAEpE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAE9B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAI/D,eAAO,MAAM,YAAY;eAYV,MAAM;UACX,MAAM;oBACI,cAAc;qBACb,MAAM,MAAM;uBACV,GAAG,CAAC,WAAW,EAAE,CAAC;iBACxB,MAAM;YACX,OAAO,CAAC,yBAAyB,CAAC;SACrC,GAAG;gBACI,OAAO;;;;;;;;;;;;;;;;;;;;;gHA4DtB,CAAA"}
@@ -5,29 +5,34 @@ import { n as r } from "neverpanic";
5
5
  import { bundle as i } from "@scalar/json-magic/bundle";
6
6
  import { fetchUrls as a } from "@scalar/json-magic/bundle/plugins/browser";
7
7
  //#region src/registry/add-documents-to-store.ts
8
- var o = r.safeFn(async ({ namespace: e, slug: r, workspaceStore: o, registryDocuments: s, registryUrl: c, config: l, api: u, removable: d }) => {
9
- let f = await u.getDocument({
8
+ var o = r.safeFn(async ({ namespace: e, slug: r, workspaceStore: o, registryDocuments: s, getAccessToken: c, registryUrl: l, config: u, api: d, removable: f }) => {
9
+ let p = await d.getDocument({
10
10
  namespace: e,
11
11
  slug: r
12
12
  });
13
- if (!f.success) return f;
13
+ if (!p.success) return p;
14
14
  s.value.push({
15
- ...f.data,
16
- removable: d
15
+ ...p.data,
16
+ removable: f
17
17
  });
18
- let p = await i(new URL(`/@${e}/apis/${r}/latest`, c).toString(), {
19
- plugins: [a()],
18
+ let m = new URL(`/@${e}/apis/${r}/latest`, l), h = [], g = c?.();
19
+ g && h.push({
20
+ domains: [new URL(l).host],
21
+ headers: { "x-scalar-auth": g }
22
+ });
23
+ let _ = await i(m.toString(), {
24
+ plugins: [a({ headers: h })],
20
25
  treeShake: !1
21
- }), m = t(e, r);
26
+ }), v = t(e, r);
22
27
  return await o.addDocument({
23
- name: m,
24
- document: p
25
- }, l), o.update("x-scalar-active-document", m), n({
26
- documentName: m,
28
+ name: v,
29
+ document: _
30
+ }, u), o.update("x-scalar-active-document", v), n({
31
+ documentName: v,
27
32
  workspaceStore: o
28
33
  }), {
29
34
  success: !0,
30
- data: f.data
35
+ data: p.data
31
36
  };
32
37
  }, (t) => e("UNABLE_TO_LOAD_DOCUMENT", t));
33
38
  //#endregion
@@ -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 registryUrl,\n config,\n api,\n removable,\n }: {\n namespace: string\n slug: string\n workspaceStore: WorkspaceStore\n registryDocuments: Ref<ApiMetadata[]>\n registryUrl: string\n config: Partial<ApiReferenceConfiguration>\n api: Api\n removable?: boolean\n }) => {\n const getDocumentResult = await api.getDocument({\n namespace,\n slug,\n })\n\n if (!getDocumentResult.success) {\n return getDocumentResult\n }\n\n registryDocuments.value.push({ ...getDocumentResult.data, removable })\n\n const url = new URL(`/@${namespace}/apis/${slug}/latest`, registryUrl)\n\n const document: OpenAPIV3_1.Document = await bundle(url.toString(), {\n plugins: [fetchUrls()],\n treeShake: false,\n })\n\n const documentName = createDocumentName(namespace, slug)\n\n await workspaceStore.addDocument(\n {\n name: documentName,\n document,\n },\n config,\n )\n\n workspaceStore.update('x-scalar-active-document', documentName)\n\n restoreAuthSecretsFromStorage({ documentName, workspaceStore })\n\n return {\n success: true,\n data: getDocumentResult.data,\n }\n },\n (originalError) => createError('UNABLE_TO_LOAD_DOCUMENT', originalError),\n)\n"],"mappings":";;;;;;;AAcA,IAAa,IAAe,EAAE,OAC5B,OAAO,EACL,cACA,SACA,mBACA,sBACA,gBACA,WACA,QACA,mBAUI;CACJ,IAAM,IAAoB,MAAM,EAAI,YAAY;EAC9C;EACA;EACD,CAAC;AAEF,KAAI,CAAC,EAAkB,QACrB,QAAO;AAGT,GAAkB,MAAM,KAAK;EAAE,GAAG,EAAkB;EAAM;EAAW,CAAC;CAItE,IAAM,IAAiC,MAAM,EAFjC,IAAI,IAAI,KAAK,EAAU,QAAQ,EAAK,UAAU,EAAY,CAEd,UAAU,EAAE;EAClE,SAAS,CAAC,GAAW,CAAC;EACtB,WAAW;EACZ,CAAC,EAEI,IAAe,EAAmB,GAAW,EAAK;AAcxD,QAZA,MAAM,EAAe,YACnB;EACE,MAAM;EACN;EACD,EACD,EACD,EAED,EAAe,OAAO,4BAA4B,EAAa,EAE/D,EAA8B;EAAE;EAAc;EAAgB,CAAC,EAExD;EACL,SAAS;EACT,MAAM,EAAkB;EACzB;IAEF,MAAkB,EAAY,2BAA2B,EAAc,CACzE"}
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,IAAe,EAAE,OAC5B,OAAO,EACL,cACA,SACA,mBACA,sBACA,mBACA,gBACA,WACA,QACA,mBAWI;CACJ,IAAM,IAAoB,MAAM,EAAI,YAAY;EAC9C;EACA;EACD,CAAC;AAEF,KAAI,CAAC,EAAkB,QACrB,QAAO;AAGT,GAAkB,MAAM,KAAK;EAAE,GAAG,EAAkB;EAAM;EAAW,CAAC;CAEtE,IAAM,IAAM,IAAI,IAAI,KAAK,EAAU,QAAQ,EAAK,UAAU,EAAY,EAEhE,IAGA,EAAE,EAEF,IAAQ,KAAkB;AAEhC,CAAI,KACF,EAAQ,KAAK;EACX,SAAS,CAAC,IAAI,IAAI,EAAY,CAAC,KAAK;EACpC,SAAS,EACP,iBAAiB,GAClB;EACF,CAAC;CAGJ,IAAM,IAAiC,MAAM,EAAO,EAAI,UAAU,EAAE;EAClE,SAAS,CACP,EAAU,EACR,YACD,CAAC,CACH;EACD,WAAW;EACZ,CAAC,EAEI,IAAe,EAAmB,GAAW,EAAK;AAcxD,QAZA,MAAM,EAAe,YACnB;EACE,MAAM;EACN;EACD,EACD,EACD,EAED,EAAe,OAAO,4BAA4B,EAAa,EAE/D,EAA8B;EAAE;EAAc;EAAgB,CAAC,EAExD;EACL,SAAS;EACT,MAAM,EAAkB;EACzB;IAEF,MAAkB,EAAY,2BAA2B,EAAc,CACzE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=add-documents-to-store.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-documents-to-store.test.d.ts","sourceRoot":"","sources":["../../src/registry/add-documents-to-store.test.ts"],"names":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/state/state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/state/state.ts"],"names":[],"mappings":"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"}
@@ -76,6 +76,7 @@ function O({ initialRegistryDocuments: n, registryUrl: i, dashboardUrl: o, platf
76
76
  registryUrl: i,
77
77
  registryDocuments: M,
78
78
  config: V.value,
79
+ getAccessToken: C,
79
80
  api: U,
80
81
  removable: n
81
82
  });
@@ -94,6 +95,7 @@ function O({ initialRegistryDocuments: n, registryUrl: i, dashboardUrl: o, platf
94
95
  registryUrl: i,
95
96
  registryDocuments: M,
96
97
  config: V.value,
98
+ getAccessToken: C,
97
99
  api: U,
98
100
  removable: r
99
101
  });
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","names":[],"sources":["../../src/state/state.ts"],"sourcesContent":["import { Chat } from '@ai-sdk/vue'\nimport { type ModalState, useModal } from '@scalar/components'\nimport { type ApiReferenceConfigurationRaw, apiReferenceConfigurationSchema } from '@scalar/types/api-reference'\nimport { useToasts } from '@scalar/use-toasts'\nimport { type WorkspaceStore, createWorkspaceStore } from '@scalar/workspace-store/client'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport { createWorkspaceEventBus } from '@scalar/workspace-store/events'\nimport { DefaultChatTransport, type UIDataTypes, type UIMessage, lastAssistantMessageIsCompleteWithToolCalls } from 'ai'\nimport { n } from 'neverpanic'\nimport { type ComputedRef, type InjectionKey, type Ref, computed, inject, reactive, ref, watch } from 'vue'\n\nimport { type Api, createApi, createAuthorizationHeaders } from '@/api'\nimport { executeRequestTool } from '@/client-tools/execute-request'\nimport { URLS } from '@/consts/urls'\nimport { createError } from '@/entities'\nimport type { ApiMetadata } from '@/entities/registry/document'\nimport type {\n ASK_FOR_AUTHENTICATION_TOOL_NAME,\n AskForAuthenticationInput,\n} from '@/entities/tools/ask-for-authentication'\nimport {\n EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME,\n type ExecuteClientSideRequestToolInput,\n type ExecuteClientSideRequestToolOutput,\n} from '@/entities/tools/execute-request'\nimport type {\n GetOpenAPISpecsSummaryToolOutput,\n SUMMARIZE_OPENAPI_SPECS_TOOL_NAME,\n} from '@/entities/tools/get-openapi-specs-summary'\nimport type {\n SEARCH_OPENAPI_OPERATIONS_TOOL_NAME,\n SearchOpenAPIOperationsToolInput,\n SearchOpenAPIOperationsToolOutput,\n} from '@/entities/tools/search-openapi-operations'\nimport { createDocumentSettings } from '@/helpers'\nimport { useTermsAndConditions } from '@/hooks/use-term-and-conditions'\nimport { removeTmpDocFromLocalStorage } from '@/hooks/use-upload-tmp-document'\nimport { persistencePlugin } from '@/plugins/persistance'\nimport { loadDocument } from '@/registry/add-documents-to-store'\nimport { createDocumentName } from '@/registry/create-document-name'\nimport type { ChatMode } from '@/types'\n\nexport type RegistryDocument = {\n namespace: string\n slug: string\n}\n\nexport type Tools = {\n [SEARCH_OPENAPI_OPERATIONS_TOOL_NAME]: {\n input: SearchOpenAPIOperationsToolInput\n output: SearchOpenAPIOperationsToolOutput\n }\n [EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME]: {\n input: ExecuteClientSideRequestToolInput\n output: ExecuteClientSideRequestToolOutput\n }\n [SUMMARIZE_OPENAPI_SPECS_TOOL_NAME]: {\n input: object\n output: GetOpenAPISpecsSummaryToolOutput\n }\n [ASK_FOR_AUTHENTICATION_TOOL_NAME]: {\n input: AskForAuthenticationInput\n output: unknown\n }\n}\n\nexport const STATE_SYMBOL: InjectionKey<State> = Symbol('STATE_SYMBOL')\n\nconst { toast } = useToasts()\n\ntype State = {\n prompt: Ref<string>\n chat: Chat<UIMessage<unknown, UIDataTypes, Tools>>\n workspaceStore: WorkspaceStore\n loading: ComputedRef<boolean>\n settingsModal: ModalState\n eventBus: WorkspaceEventBus\n proxyUrl: ComputedRef<string>\n proxyUrlRaw: Ref<string | undefined>\n config: ComputedRef<ApiReferenceConfigurationRaw>\n registryUrl: string\n dashboardUrl: string\n baseUrl: string\n platformProxyUrl: string\n isLoggedIn?: Ref<boolean>\n registryDocuments: Ref<ApiMetadata[]>\n pendingDocuments: Record<string, boolean>\n mode: ChatMode\n terms: { accepted: Ref<boolean>; accept: () => void }\n addDocument: (document: { namespace: string; slug: string; removable?: boolean; tmp?: boolean }) => Promise<void>\n addDocumentAsync: (document: { namespace: string; slug: string; removable?: boolean }) => Promise<void>\n removeDocument: (document: { namespace: string; slug: string }) => void\n getAccessToken?: () => string\n getAgentKey?: () => string\n api: Api\n uploadedTmpDocumentUrl: Ref<string | undefined>\n curatedDocuments: Ref<ApiMetadata[]>\n getActiveDocumentJson?: () => string\n hideAddApi?: boolean\n}\n\nfunction createChat({\n registryDocuments,\n workspaceStore,\n baseUrl,\n proxyUrl,\n getAccessToken,\n getAgentKey,\n}: {\n registryDocuments: Ref<ApiMetadata[]>\n workspaceStore: WorkspaceStore\n baseUrl: string\n proxyUrl: ComputedRef<string>\n getAccessToken?: () => string\n getAgentKey?: () => string\n}) {\n const chat = new Chat<UIMessage<unknown, UIDataTypes, Tools>>({\n sendAutomaticallyWhen: lastAssistantMessageIsCompleteWithToolCalls,\n transport: new DefaultChatTransport({\n api: `${baseUrl}/vector/openapi/chat`,\n headers: () => createAuthorizationHeaders({ getAccessToken, getAgentKey }),\n body: () => ({\n registryDocuments: registryDocuments.value,\n }),\n }),\n async onToolCall({ toolCall }): Promise<any> {\n if (toolCall.dynamic) {\n return\n }\n\n if (\n toolCall.toolName === EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME &&\n toolCall.input.method.toLowerCase() === 'get'\n ) {\n await executeRequestTool({\n documentSettings: createDocumentSettings(workspaceStore),\n input: toolCall.input,\n toolCallId: toolCall.toolCallId,\n chat,\n proxyUrl: proxyUrl.value,\n })\n }\n },\n })\n\n return chat\n}\n\nexport function createState({\n initialRegistryDocuments,\n registryUrl,\n dashboardUrl,\n platformProxyUrl,\n baseUrl,\n mode,\n isLoggedIn,\n getAccessToken,\n getAgentKey,\n getActiveDocumentJson,\n prefilledMessageRef,\n hideAddApi,\n}: {\n initialRegistryDocuments: { namespace: string; slug: string }[]\n registryUrl: string\n dashboardUrl: string\n platformProxyUrl: string\n baseUrl: string\n mode: ChatMode\n isLoggedIn?: Ref<boolean>\n getAccessToken?: () => string\n getAgentKey?: () => string\n getActiveDocumentJson?: () => string\n prefilledMessageRef?: Ref<string>\n hideAddApi?: boolean\n}): State {\n const prompt = ref<State['prompt']['value']>(prefilledMessageRef?.value ?? '')\n const registryDocuments = ref<ApiMetadata[]>([])\n const pendingDocuments = reactive<Record<string, boolean>>({})\n const curatedDocuments = ref<ApiMetadata[]>([])\n const proxyUrlRaw = ref<State['proxyUrlRaw']['value']>(URLS.DEFAULT_PROXY_URL)\n const proxyUrl = computed(() => proxyUrlRaw.value?.trim() || URLS.DEFAULT_PROXY_URL)\n const uploadedTmpDocumentUrl = ref<string>()\n const terms = useTermsAndConditions()\n\n const eventBus = createWorkspaceEventBus()\n const workspaceStore = createWorkspaceStore({\n plugins: [\n persistencePlugin({\n persistAuth: true,\n }),\n ],\n })\n\n const config = computed(() =>\n apiReferenceConfigurationSchema.parse({\n proxyUrl: proxyUrl.value,\n persistAuth: true,\n }),\n )\n\n const chat = createChat({\n registryDocuments,\n workspaceStore,\n baseUrl,\n proxyUrl,\n getAccessToken,\n getAgentKey,\n })\n\n const api = createApi({\n baseUrl,\n getAccessToken,\n getAgentKey,\n })\n\n const loading = computed(\n () =>\n chat.status === 'submitted' ||\n (chat.status === 'streaming' && !chat.lastMessage?.parts.some((part) => part.type === 'text')),\n )\n\n watch(\n () => chat.status,\n () => {\n if (chat.status === 'streaming') {\n prompt.value = ''\n }\n },\n )\n\n if (prefilledMessageRef) {\n watch(prefilledMessageRef, async (val) => {\n if (val) {\n prompt.value = val\n if (terms.accepted.value) {\n await chat.sendMessage({ text: prompt.value })\n }\n }\n })\n }\n\n const settingsModal = useModal()\n\n async function addDocument({\n namespace,\n slug,\n removable = true,\n tmp = false,\n }: {\n namespace: string\n slug: string\n removable?: boolean\n tmp?: boolean\n }) {\n const matchingDoc = registryDocuments.value.find((doc) => doc.namespace === namespace && doc.slug === slug)\n\n if (matchingDoc) {\n return\n }\n\n const identifier = `@${namespace}/${slug}`\n\n pendingDocuments[identifier] = true\n\n const loadDocumentResult = await loadDocument({\n namespace,\n slug,\n workspaceStore,\n registryUrl,\n registryDocuments,\n config: config.value,\n 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 api,\n removable,\n })\n\n if (!loadDocumentResult.success) {\n console.warn('[AGENT]: Unable to load document', loadDocumentResult.error)\n toast(`Unable to load the document @${namespace}/${slug}`, 'warn')\n }\n } else {\n console.warn('[AGENT]: Document could not be embedded')\n toast(`Unable to embed the document @${namespace}/${slug}`, 'warn')\n }\n\n pendingDocuments[identifier] = false\n }\n\n function removeDocument({ namespace, slug }: { namespace: string; slug: string }) {\n registryDocuments.value = registryDocuments.value.filter(\n (doc) => !(doc.namespace === namespace && doc.slug === slug),\n )\n\n workspaceStore.deleteDocument(createDocumentName(namespace, slug))\n }\n\n initialRegistryDocuments.forEach(({ namespace, slug }) => addDocument({ namespace, slug, removable: false }))\n\n return {\n prompt,\n chat,\n workspaceStore,\n eventBus,\n loading,\n settingsModal,\n config,\n registryUrl,\n dashboardUrl,\n platformProxyUrl,\n baseUrl,\n registryDocuments,\n pendingDocuments,\n proxyUrl,\n proxyUrlRaw,\n mode,\n terms,\n isLoggedIn,\n addDocument,\n addDocumentAsync,\n removeDocument,\n getAccessToken,\n getAgentKey,\n api,\n uploadedTmpDocumentUrl,\n curatedDocuments,\n getActiveDocumentJson,\n hideAddApi,\n }\n}\n\nexport function useState() {\n const state = inject(STATE_SYMBOL)\n\n if (!state) {\n throw new Error('No state provided.')\n }\n\n return state\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"state.js","names":[],"sources":["../../src/state/state.ts"],"sourcesContent":["import { Chat } from '@ai-sdk/vue'\nimport { type ModalState, useModal } from '@scalar/components'\nimport { type ApiReferenceConfigurationRaw, apiReferenceConfigurationSchema } from '@scalar/types/api-reference'\nimport { useToasts } from '@scalar/use-toasts'\nimport { type WorkspaceStore, createWorkspaceStore } from '@scalar/workspace-store/client'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport { createWorkspaceEventBus } from '@scalar/workspace-store/events'\nimport { DefaultChatTransport, type UIDataTypes, type UIMessage, lastAssistantMessageIsCompleteWithToolCalls } from 'ai'\nimport { n } from 'neverpanic'\nimport { type ComputedRef, type InjectionKey, type Ref, computed, inject, reactive, ref, watch } from 'vue'\n\nimport { type Api, createApi, createAuthorizationHeaders } from '@/api'\nimport { executeRequestTool } from '@/client-tools/execute-request'\nimport { URLS } from '@/consts/urls'\nimport { createError } from '@/entities'\nimport type { ApiMetadata } from '@/entities/registry/document'\nimport type {\n ASK_FOR_AUTHENTICATION_TOOL_NAME,\n AskForAuthenticationInput,\n} from '@/entities/tools/ask-for-authentication'\nimport {\n EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME,\n type ExecuteClientSideRequestToolInput,\n type ExecuteClientSideRequestToolOutput,\n} from '@/entities/tools/execute-request'\nimport type {\n GetOpenAPISpecsSummaryToolOutput,\n SUMMARIZE_OPENAPI_SPECS_TOOL_NAME,\n} from '@/entities/tools/get-openapi-specs-summary'\nimport type {\n SEARCH_OPENAPI_OPERATIONS_TOOL_NAME,\n SearchOpenAPIOperationsToolInput,\n SearchOpenAPIOperationsToolOutput,\n} from '@/entities/tools/search-openapi-operations'\nimport { createDocumentSettings } from '@/helpers'\nimport { useTermsAndConditions } from '@/hooks/use-term-and-conditions'\nimport { removeTmpDocFromLocalStorage } from '@/hooks/use-upload-tmp-document'\nimport { persistencePlugin } from '@/plugins/persistance'\nimport { loadDocument } from '@/registry/add-documents-to-store'\nimport { createDocumentName } from '@/registry/create-document-name'\nimport type { ChatMode } from '@/types'\n\nexport type RegistryDocument = {\n namespace: string\n slug: string\n}\n\nexport type Tools = {\n [SEARCH_OPENAPI_OPERATIONS_TOOL_NAME]: {\n input: SearchOpenAPIOperationsToolInput\n output: SearchOpenAPIOperationsToolOutput\n }\n [EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME]: {\n input: ExecuteClientSideRequestToolInput\n output: ExecuteClientSideRequestToolOutput\n }\n [SUMMARIZE_OPENAPI_SPECS_TOOL_NAME]: {\n input: object\n output: GetOpenAPISpecsSummaryToolOutput\n }\n [ASK_FOR_AUTHENTICATION_TOOL_NAME]: {\n input: AskForAuthenticationInput\n output: unknown\n }\n}\n\nexport const STATE_SYMBOL: InjectionKey<State> = Symbol('STATE_SYMBOL')\n\nconst { toast } = useToasts()\n\ntype State = {\n prompt: Ref<string>\n chat: Chat<UIMessage<unknown, UIDataTypes, Tools>>\n workspaceStore: WorkspaceStore\n loading: ComputedRef<boolean>\n settingsModal: ModalState\n eventBus: WorkspaceEventBus\n proxyUrl: ComputedRef<string>\n proxyUrlRaw: Ref<string | undefined>\n config: ComputedRef<ApiReferenceConfigurationRaw>\n registryUrl: string\n dashboardUrl: string\n baseUrl: string\n platformProxyUrl: string\n isLoggedIn?: Ref<boolean>\n registryDocuments: Ref<ApiMetadata[]>\n pendingDocuments: Record<string, boolean>\n mode: ChatMode\n terms: { accepted: Ref<boolean>; accept: () => void }\n addDocument: (document: { namespace: string; slug: string; removable?: boolean; tmp?: boolean }) => Promise<void>\n addDocumentAsync: (document: { namespace: string; slug: string; removable?: boolean }) => Promise<void>\n removeDocument: (document: { namespace: string; slug: string }) => void\n getAccessToken?: () => string\n getAgentKey?: () => string\n api: Api\n uploadedTmpDocumentUrl: Ref<string | undefined>\n curatedDocuments: Ref<ApiMetadata[]>\n getActiveDocumentJson?: () => string\n hideAddApi?: boolean\n}\n\nfunction createChat({\n registryDocuments,\n workspaceStore,\n baseUrl,\n proxyUrl,\n getAccessToken,\n getAgentKey,\n}: {\n registryDocuments: Ref<ApiMetadata[]>\n workspaceStore: WorkspaceStore\n baseUrl: string\n proxyUrl: ComputedRef<string>\n getAccessToken?: () => string\n getAgentKey?: () => string\n}) {\n const chat = new Chat<UIMessage<unknown, UIDataTypes, Tools>>({\n sendAutomaticallyWhen: lastAssistantMessageIsCompleteWithToolCalls,\n transport: new DefaultChatTransport({\n api: `${baseUrl}/vector/openapi/chat`,\n headers: () => createAuthorizationHeaders({ getAccessToken, getAgentKey }),\n body: () => ({\n registryDocuments: registryDocuments.value,\n }),\n }),\n async onToolCall({ toolCall }): Promise<any> {\n if (toolCall.dynamic) {\n return\n }\n\n if (\n toolCall.toolName === EXECUTE_CLIENT_SIDE_REQUEST_TOOL_NAME &&\n toolCall.input.method.toLowerCase() === 'get'\n ) {\n await executeRequestTool({\n documentSettings: createDocumentSettings(workspaceStore),\n input: toolCall.input,\n toolCallId: toolCall.toolCallId,\n chat,\n proxyUrl: proxyUrl.value,\n })\n }\n },\n })\n\n return chat\n}\n\nexport function createState({\n initialRegistryDocuments,\n registryUrl,\n dashboardUrl,\n platformProxyUrl,\n baseUrl,\n mode,\n isLoggedIn,\n getAccessToken,\n getAgentKey,\n getActiveDocumentJson,\n prefilledMessageRef,\n hideAddApi,\n}: {\n initialRegistryDocuments: { namespace: string; slug: string }[]\n registryUrl: string\n dashboardUrl: string\n platformProxyUrl: string\n baseUrl: string\n mode: ChatMode\n isLoggedIn?: Ref<boolean>\n getAccessToken?: () => string\n getAgentKey?: () => string\n getActiveDocumentJson?: () => string\n prefilledMessageRef?: Ref<string>\n hideAddApi?: boolean\n}): State {\n const prompt = ref<State['prompt']['value']>(prefilledMessageRef?.value ?? '')\n const registryDocuments = ref<ApiMetadata[]>([])\n const pendingDocuments = reactive<Record<string, boolean>>({})\n const curatedDocuments = ref<ApiMetadata[]>([])\n const proxyUrlRaw = ref<State['proxyUrlRaw']['value']>(URLS.DEFAULT_PROXY_URL)\n const proxyUrl = computed(() => proxyUrlRaw.value?.trim() || URLS.DEFAULT_PROXY_URL)\n const uploadedTmpDocumentUrl = ref<string>()\n const terms = useTermsAndConditions()\n\n const eventBus = createWorkspaceEventBus()\n const workspaceStore = createWorkspaceStore({\n plugins: [\n persistencePlugin({\n persistAuth: true,\n }),\n ],\n })\n\n const config = computed(() =>\n apiReferenceConfigurationSchema.parse({\n proxyUrl: proxyUrl.value,\n persistAuth: true,\n }),\n )\n\n const chat = createChat({\n registryDocuments,\n workspaceStore,\n baseUrl,\n proxyUrl,\n getAccessToken,\n getAgentKey,\n })\n\n const api = createApi({\n baseUrl,\n getAccessToken,\n getAgentKey,\n })\n\n const loading = computed(\n () =>\n chat.status === 'submitted' ||\n (chat.status === 'streaming' && !chat.lastMessage?.parts.some((part) => part.type === 'text')),\n )\n\n watch(\n () => chat.status,\n () => {\n if (chat.status === 'streaming') {\n prompt.value = ''\n }\n },\n )\n\n if (prefilledMessageRef) {\n watch(prefilledMessageRef, async (val) => {\n if (val) {\n prompt.value = val\n if (terms.accepted.value) {\n await chat.sendMessage({ text: prompt.value })\n }\n }\n })\n }\n\n const settingsModal = useModal()\n\n async function addDocument({\n namespace,\n slug,\n removable = true,\n tmp = false,\n }: {\n namespace: string\n slug: string\n removable?: boolean\n tmp?: boolean\n }) {\n const matchingDoc = registryDocuments.value.find((doc) => doc.namespace === namespace && doc.slug === slug)\n\n if (matchingDoc) {\n return\n }\n\n const identifier = `@${namespace}/${slug}`\n\n pendingDocuments[identifier] = true\n\n const loadDocumentResult = await loadDocument({\n namespace,\n slug,\n workspaceStore,\n registryUrl,\n registryDocuments,\n config: config.value,\n getAccessToken,\n api,\n removable,\n })\n\n pendingDocuments[identifier] = false\n\n if (!loadDocumentResult.success) {\n /**\n * If we are unable to load a document, we just remove it\n * from tmp local storage, do not warn the user.\n */\n if (tmp) {\n removeTmpDocFromLocalStorage()\n throw loadDocumentResult.error\n }\n\n console.warn('[AGENT]: Unable to load document', loadDocumentResult.error)\n toast(`Unable to load the document @${namespace}/${slug}`, 'warn')\n throw loadDocumentResult.error\n }\n }\n\n /**\n * Waits for document to be available in embeddings\n * and adds to the list\n */\n async function addDocumentAsync({\n namespace,\n slug,\n removable = true,\n }: {\n namespace: string\n slug: string\n removable?: boolean\n }) {\n const matchingDoc = registryDocuments.value.find((doc) => doc.namespace === namespace && doc.slug === slug)\n\n if (matchingDoc) {\n return\n }\n\n const identifier = `@${namespace}/${slug}`\n\n pendingDocuments[identifier] = true\n\n const embeddingStatusResponse = await n.fromUnsafe(\n () =>\n fetch(`${baseUrl}/vector/registry/embeddings/${namespace}/${slug}`, {\n method: 'GET',\n }),\n (originalError) => createError('FAILED_TO_GET_EMBEDDING_STATUS', originalError),\n )\n\n if (embeddingStatusResponse.success && embeddingStatusResponse.data.ok) {\n const loadDocumentResult = await loadDocument({\n namespace,\n slug,\n workspaceStore,\n registryUrl,\n registryDocuments,\n config: config.value,\n getAccessToken,\n api,\n removable,\n })\n\n if (!loadDocumentResult.success) {\n console.warn('[AGENT]: Unable to load document', loadDocumentResult.error)\n toast(`Unable to load the document @${namespace}/${slug}`, 'warn')\n }\n } else {\n console.warn('[AGENT]: Document could not be embedded')\n toast(`Unable to embed the document @${namespace}/${slug}`, 'warn')\n }\n\n pendingDocuments[identifier] = false\n }\n\n function removeDocument({ namespace, slug }: { namespace: string; slug: string }) {\n registryDocuments.value = registryDocuments.value.filter(\n (doc) => !(doc.namespace === namespace && doc.slug === slug),\n )\n\n workspaceStore.deleteDocument(createDocumentName(namespace, slug))\n }\n\n initialRegistryDocuments.forEach(({ namespace, slug }) => addDocument({ namespace, slug, removable: false }))\n\n return {\n prompt,\n chat,\n workspaceStore,\n eventBus,\n loading,\n settingsModal,\n config,\n registryUrl,\n dashboardUrl,\n platformProxyUrl,\n baseUrl,\n registryDocuments,\n pendingDocuments,\n proxyUrl,\n proxyUrlRaw,\n mode,\n terms,\n isLoggedIn,\n addDocument,\n addDocumentAsync,\n removeDocument,\n getAccessToken,\n getAgentKey,\n api,\n uploadedTmpDocumentUrl,\n curatedDocuments,\n getActiveDocumentJson,\n hideAddApi,\n }\n}\n\nexport function useState() {\n const state = inject(STATE_SYMBOL)\n\n if (!state) {\n throw new Error('No state provided.')\n }\n\n return state\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -10,7 +10,7 @@
10
10
  "url": "git+https://github.com/scalar/scalar.git",
11
11
  "directory": "packages/agent-chat"
12
12
  },
13
- "version": "0.10.9",
13
+ "version": "0.10.10",
14
14
  "engines": {
15
15
  "node": ">=22"
16
16
  },
@@ -50,28 +50,32 @@
50
50
  "truncate-json": "3.0.1",
51
51
  "vue": "^3.5.30",
52
52
  "zod": "^4.3.5",
53
- "@scalar/api-client": "3.3.0",
54
- "@scalar/helpers": "0.5.2",
53
+ "@scalar/api-client": "3.3.1",
54
+ "@scalar/helpers": "0.5.3",
55
+ "@scalar/components": "0.22.5",
55
56
  "@scalar/icons": "0.7.2",
56
- "@scalar/json-magic": "0.12.8",
57
+ "@scalar/json-magic": "0.12.9",
58
+ "@scalar/types": "0.9.3",
57
59
  "@scalar/openapi-types": "0.8.0",
58
- "@scalar/themes": "0.15.3",
59
- "@scalar/types": "0.9.2",
60
60
  "@scalar/use-toasts": "0.10.2",
61
- "@scalar/components": "0.22.4",
62
- "@scalar/workspace-store": "0.47.0"
61
+ "@scalar/themes": "0.15.3",
62
+ "@scalar/workspace-store": "0.47.1"
63
63
  },
64
64
  "devDependencies": {
65
65
  "@tailwindcss/vite": "^4.2.0",
66
+ "@types/jsdom": "28.0.1",
66
67
  "@vitejs/plugin-vue": "^6.0.3",
67
68
  "hono": "^4.12.7",
69
+ "jsdom": "27.4.0",
68
70
  "tailwindcss": "^4.1.18",
69
- "vite": "8.0.0"
71
+ "vite": "8.0.0",
72
+ "vitest": "4.1.0"
70
73
  },
71
74
  "scripts": {
72
75
  "build": "vite build && vue-tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && shx cp package.json dist",
73
76
  "build:watch": "vite build --watch",
74
77
  "playground": "cd playground && vite",
78
+ "test": "vitest --run",
75
79
  "types:check": "vue-tsc --noEmit"
76
80
  }
77
81
  }