@aleph-alpha/chat-kit 3.2.0 → 4.0.0
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/{CkInput.vue_vue_type_script_setup_true_lang-B-4xnH2c.js → CkInput.vue_vue_type_script_setup_true_lang-DJN-nZ2-.js} +391 -113
- package/dist/adapters/responses-api.d.ts +11 -5
- package/dist/adapters/responses-api.d.ts.map +1 -1
- package/dist/adapters/responses-api.js +9 -3
- package/dist/chat-kit.css +14 -8
- package/dist/components/base/CkAgentMessage/CkAgentMessage.stories.d.ts +7 -0
- package/dist/components/base/CkAgentMessage/CkAgentMessage.stories.d.ts.map +1 -1
- package/dist/components/base/CkAgentMessage/types.d.ts +1 -1
- package/dist/components/base/CkCitation/CkCitation.stories.d.ts +47 -0
- package/dist/components/base/CkCitation/CkCitation.stories.d.ts.map +1 -0
- package/dist/components/base/CkCitation/CkCitation.vue.d.ts +15 -0
- package/dist/components/base/CkCitation/CkCitation.vue.d.ts.map +1 -0
- package/dist/components/base/CkCitation/index.d.ts +3 -0
- package/dist/components/base/CkCitation/index.d.ts.map +1 -0
- package/dist/components/base/CkCitation/types.d.ts +79 -0
- package/dist/components/base/CkCitation/types.d.ts.map +1 -0
- package/dist/components/base/CkCitationCard/CkCitationCard.stories.d.ts +51 -0
- package/dist/components/base/CkCitationCard/CkCitationCard.stories.d.ts.map +1 -0
- package/dist/components/base/CkCitationCard/CkCitationCard.vue.d.ts +13 -0
- package/dist/components/base/CkCitationCard/CkCitationCard.vue.d.ts.map +1 -0
- package/dist/components/base/CkCitationCard/index.d.ts +3 -0
- package/dist/components/base/CkCitationCard/index.d.ts.map +1 -0
- package/dist/components/base/CkCitationCard/types.d.ts +51 -0
- package/dist/components/base/CkCitationCard/types.d.ts.map +1 -0
- package/dist/components/base/{CkCopyMessageActionButton/CkCopyMessageActionButton.stories.d.ts → CkCopyMessageButton/CkCopyMessageButton.stories.d.ts} +3 -3
- package/dist/components/base/CkCopyMessageButton/CkCopyMessageButton.stories.d.ts.map +1 -0
- package/dist/components/base/{CkCopyMessageActionButton/CkCopyMessageActionButton.vue.d.ts → CkCopyMessageButton/CkCopyMessageButton.vue.d.ts} +4 -4
- package/dist/components/base/CkCopyMessageButton/CkCopyMessageButton.vue.d.ts.map +1 -0
- package/dist/components/base/CkCopyMessageButton/index.d.ts +3 -0
- package/dist/components/base/CkCopyMessageButton/index.d.ts.map +1 -0
- package/dist/components/base/{CkCopyMessageActionButton → CkCopyMessageButton}/types.d.ts +3 -3
- package/dist/components/base/CkCopyMessageButton/types.d.ts.map +1 -0
- package/dist/components/base/CkDropZoneOverlay/CkDropZoneOverlay.vue.d.ts +1 -1
- package/dist/components/base/CkFeedbackButton/types.d.ts +1 -1
- package/dist/components/base/CkFeedbackDialog/CkFeedbackDialog.vue.d.ts +2 -2
- package/dist/components/base/CkFeedbackDialog/types.d.ts +1 -1
- package/dist/components/base/CkFileItemsList/CkFileItemsList.vue.d.ts +1 -1
- package/dist/components/base/CkMarkdownRenderer/CkMarkdownRenderer.stories.d.ts +15 -0
- package/dist/components/base/CkMarkdownRenderer/CkMarkdownRenderer.stories.d.ts.map +1 -1
- package/dist/components/base/CkMarkdownRenderer/CkMarkdownRenderer.vue.d.ts +16 -2
- package/dist/components/base/CkMarkdownRenderer/CkMarkdownRenderer.vue.d.ts.map +1 -1
- package/dist/components/base/CkMarkdownRenderer/index.d.ts +1 -1
- package/dist/components/base/CkMarkdownRenderer/index.d.ts.map +1 -1
- package/dist/components/base/CkMarkdownRenderer/types.d.ts +25 -0
- package/dist/components/base/CkMarkdownRenderer/types.d.ts.map +1 -1
- package/dist/components/base/CkMarkdownRenderer/useCitationRendering.d.ts +17 -0
- package/dist/components/base/CkMarkdownRenderer/useCitationRendering.d.ts.map +1 -0
- package/dist/components/base/{CkMessageActionButton/CkMessageActionButton.stories.d.ts → CkMessageButton/CkMessageButton.stories.d.ts} +3 -3
- package/dist/components/base/CkMessageButton/CkMessageButton.stories.d.ts.map +1 -0
- package/dist/components/base/{CkMessageActionButton/CkMessageActionButton.vue.d.ts → CkMessageButton/CkMessageButton.vue.d.ts} +3 -3
- package/dist/components/base/CkMessageButton/CkMessageButton.vue.d.ts.map +1 -0
- package/dist/components/base/CkMessageButton/index.d.ts +3 -0
- package/dist/components/base/CkMessageButton/index.d.ts.map +1 -0
- package/dist/components/base/{CkMessageActionButton → CkMessageButton}/types.d.ts +2 -2
- package/dist/components/base/CkMessageButton/types.d.ts.map +1 -0
- package/dist/components/base/CkPromptSendButton/CkPromptSendButton.vue.d.ts +1 -1
- package/dist/components/base/CkRegenerateMessageButton/CkRegenerateMessageButton.stories.d.ts +16 -0
- package/dist/components/base/CkRegenerateMessageButton/CkRegenerateMessageButton.stories.d.ts.map +1 -0
- package/dist/components/base/CkRegenerateMessageButton/CkRegenerateMessageButton.vue.d.ts +12 -0
- package/dist/components/base/CkRegenerateMessageButton/CkRegenerateMessageButton.vue.d.ts.map +1 -0
- package/dist/components/base/CkRegenerateMessageButton/index.d.ts +3 -0
- package/dist/components/base/{CkCopyMessageActionButton → CkRegenerateMessageButton}/index.d.ts.map +1 -1
- package/dist/components/base/CkRegenerateMessageButton/types.d.ts +27 -0
- package/dist/components/base/CkRegenerateMessageButton/types.d.ts.map +1 -0
- package/dist/components/base/index.d.ts +8 -3
- package/dist/components/base/index.d.ts.map +1 -1
- package/dist/components/composed/CkConversation/CkConversation.stories.d.ts +1 -1
- package/dist/components/composed/CkConversation/types.d.ts +1 -1
- package/dist/components/composed/CkInput/CkInput.vue.d.ts +1 -1
- package/dist/components/index.d.ts +2 -2
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +26 -23
- package/dist/composables/fileUpload/useFileUpload.d.ts.map +1 -1
- package/dist/composables/fileUpload/useFileUploadWrapper.d.ts.map +1 -1
- package/dist/composables/index.js +1 -1
- package/dist/handlers/index.d.ts +2 -0
- package/dist/handlers/index.d.ts.map +1 -1
- package/dist/handlers/index.js +4 -3
- package/dist/handlers/useChatKitLabels.d.ts +13 -0
- package/dist/handlers/useChatKitLabels.d.ts.map +1 -1
- package/dist/handlers/useMarkdownParser.d.ts.map +1 -1
- package/dist/handlers/useMessageHandler.d.ts +37 -0
- package/dist/handlers/useMessageHandler.d.ts.map +1 -1
- package/dist/helpers/conversationTree.d.ts +15 -0
- package/dist/helpers/conversationTree.d.ts.map +1 -1
- package/dist/helpers/unified/remarkCitations.d.ts +17 -0
- package/dist/helpers/unified/remarkCitations.d.ts.map +1 -0
- package/dist/{index-DAmWGYNH.js → index-CyrVnbS9.js} +86 -71
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -27
- package/dist/{useChatKitLabels-D5gNv8se.js → useChatKitLabels-zMFV7aEz.js} +31 -3
- package/dist/{useMessageHandler-CMdy-lm0.js → useMessageHandler-N50Yj-NU.js} +45 -7
- package/package.json +5 -3
- package/src/adapters/responses-api.spec.ts +52 -5
- package/src/adapters/responses-api.ts +26 -7
- package/src/components/base/CkAgentMessage/CkAgentMessage.stories.ts +112 -0
- package/src/components/base/CkAgentMessage/types.ts +1 -1
- package/src/components/base/CkCitation/CkCitation.spec.ts +79 -0
- package/src/components/base/CkCitation/CkCitation.stories.ts +136 -0
- package/src/components/base/CkCitation/CkCitation.vue +145 -0
- package/src/components/base/CkCitation/index.ts +2 -0
- package/src/components/base/CkCitation/types.ts +80 -0
- package/src/components/base/CkCitationCard/CkCitationCard.spec.ts +77 -0
- package/src/components/base/CkCitationCard/CkCitationCard.stories.ts +144 -0
- package/src/components/base/CkCitationCard/CkCitationCard.vue +76 -0
- package/src/components/base/CkCitationCard/index.ts +2 -0
- package/src/components/base/CkCitationCard/types.ts +51 -0
- package/src/components/base/{CkCopyMessageActionButton/CkCopyMessageActionButton.spec.ts → CkCopyMessageButton/CkCopyMessageButton.spec.ts} +6 -6
- package/src/components/base/{CkCopyMessageActionButton/CkCopyMessageActionButton.stories.ts → CkCopyMessageButton/CkCopyMessageButton.stories.ts} +8 -8
- package/src/components/base/{CkCopyMessageActionButton/CkCopyMessageActionButton.vue → CkCopyMessageButton/CkCopyMessageButton.vue} +6 -6
- package/src/components/base/CkCopyMessageButton/index.ts +2 -0
- package/src/components/base/{CkCopyMessageActionButton → CkCopyMessageButton}/types.ts +3 -3
- package/src/components/base/CkFeedbackButton/CkFeedbackButton.vue +5 -5
- package/src/components/base/CkFeedbackButton/types.ts +1 -1
- package/src/components/base/CkFeedbackDialog/types.ts +1 -1
- package/src/components/base/CkMarkdownRenderer/CkMarkdownRenderer.spec.ts +124 -0
- package/src/components/base/CkMarkdownRenderer/CkMarkdownRenderer.stories.ts +118 -0
- package/src/components/base/CkMarkdownRenderer/CkMarkdownRenderer.vue +70 -28
- package/src/components/base/CkMarkdownRenderer/index.ts +1 -0
- package/src/components/base/CkMarkdownRenderer/types.ts +26 -0
- package/src/components/base/CkMarkdownRenderer/useCitationRendering.spec.ts +94 -0
- package/src/components/base/CkMarkdownRenderer/useCitationRendering.ts +52 -0
- package/src/components/base/{CkMessageActionButton/CkMessageActionButton.spec.ts → CkMessageButton/CkMessageButton.spec.ts} +6 -6
- package/src/components/base/{CkMessageActionButton/CkMessageActionButton.stories.ts → CkMessageButton/CkMessageButton.stories.ts} +10 -10
- package/src/components/base/{CkMessageActionButton/CkMessageActionButton.vue → CkMessageButton/CkMessageButton.vue} +3 -3
- package/src/components/base/CkMessageButton/index.ts +2 -0
- package/src/components/base/{CkMessageActionButton → CkMessageButton}/types.ts +2 -2
- package/src/components/base/CkRegenerateMessageButton/CkRegenerateMessageButton.spec.ts +49 -0
- package/src/components/base/CkRegenerateMessageButton/CkRegenerateMessageButton.stories.ts +63 -0
- package/src/components/base/CkRegenerateMessageButton/CkRegenerateMessageButton.vue +43 -0
- package/src/components/base/CkRegenerateMessageButton/index.ts +2 -0
- package/src/components/base/CkRegenerateMessageButton/types.ts +27 -0
- package/src/components/base/index.ts +15 -2
- package/src/components/composed/CkConversation/CkConversation.stories.ts +6 -6
- package/src/components/composed/CkConversation/CkConversation.vue +2 -2
- package/src/components/composed/CkConversation/types.ts +1 -1
- package/src/components/index.ts +11 -2
- package/src/composables/fileUpload/useFileUpload.spec.ts +2 -61
- package/src/composables/fileUpload/useFileUpload.ts +2 -9
- package/src/composables/fileUpload/useFileUploadWrapper.spec.ts +195 -14
- package/src/composables/fileUpload/useFileUploadWrapper.ts +114 -81
- package/src/handlers/index.ts +2 -0
- package/src/handlers/useChatKitLabels.spec.ts +1 -0
- package/src/handlers/useChatKitLabels.ts +16 -0
- package/src/handlers/useMarkdownParser.ts +5 -2
- package/src/handlers/useMessageHandler.spec.ts +79 -0
- package/src/handlers/useMessageHandler.ts +50 -2
- package/src/helpers/conversationTree.spec.ts +120 -0
- package/src/helpers/conversationTree.ts +57 -8
- package/src/helpers/unified/remarkCitations.spec.ts +112 -0
- package/src/helpers/unified/remarkCitations.ts +55 -0
- package/src/index.ts +11 -2
- package/dist/components/base/CkCopyMessageActionButton/CkCopyMessageActionButton.stories.d.ts.map +0 -1
- package/dist/components/base/CkCopyMessageActionButton/CkCopyMessageActionButton.vue.d.ts.map +0 -1
- package/dist/components/base/CkCopyMessageActionButton/index.d.ts +0 -3
- package/dist/components/base/CkCopyMessageActionButton/types.d.ts.map +0 -1
- package/dist/components/base/CkMessageActionButton/CkMessageActionButton.stories.d.ts.map +0 -1
- package/dist/components/base/CkMessageActionButton/CkMessageActionButton.vue.d.ts.map +0 -1
- package/dist/components/base/CkMessageActionButton/index.d.ts +0 -3
- package/dist/components/base/CkMessageActionButton/index.d.ts.map +0 -1
- package/dist/components/base/CkMessageActionButton/types.d.ts.map +0 -1
- package/src/components/base/CkCopyMessageActionButton/index.ts +0 -2
- package/src/components/base/CkMessageActionButton/index.ts +0 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { g as generateId } from "./generateId-BHf0W4Rq.js";
|
|
2
2
|
import { ref, shallowRef, computed, readonly, toRaw, toValue, watch } from "vue";
|
|
3
|
-
import { u as useMessageHandler } from "./useMessageHandler-
|
|
3
|
+
import { u as useMessageHandler } from "./useMessageHandler-N50Yj-NU.js";
|
|
4
4
|
import "./katex.min-md74IFlY.js";
|
|
5
5
|
function secondsToDate(seconds) {
|
|
6
6
|
return new Date(seconds * 1e3);
|
|
@@ -765,13 +765,10 @@ function useFileUpload(options) {
|
|
|
765
765
|
}
|
|
766
766
|
async function upload(params) {
|
|
767
767
|
const fileList = Array.isArray(params.files) ? params.files : [params.files];
|
|
768
|
-
|
|
769
|
-
(e) => e.status !== "failed" && e.status !== "cancelled" && e.status !== "removed"
|
|
770
|
-
).length;
|
|
771
|
-
if (activeFileCount + fileList.length > constraints.maxFilesPerUpload) {
|
|
768
|
+
if (fileList.length > constraints.maxFilesPerUpload) {
|
|
772
769
|
throw new SdkError(
|
|
773
770
|
"MAX_FILES_EXCEEDED",
|
|
774
|
-
`Cannot upload ${fileList.length} file(s) —
|
|
771
|
+
`Cannot upload ${fileList.length} file(s) — maximum per selection is ${constraints.maxFilesPerUpload}.`
|
|
775
772
|
);
|
|
776
773
|
}
|
|
777
774
|
const mergedMeta = {
|
|
@@ -1346,68 +1343,80 @@ function createDocumentUploadProvider(config) {
|
|
|
1346
1343
|
...config.headers ?? {}
|
|
1347
1344
|
};
|
|
1348
1345
|
const httpClient = buildHttpClient(baseUrl, defaultHeaders);
|
|
1349
|
-
const
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1346
|
+
const storeIdByConversation = /* @__PURE__ */ new Map();
|
|
1347
|
+
const resolvePromises = /* @__PURE__ */ new Map();
|
|
1348
|
+
function searchStoreNameForConversation(conversationId) {
|
|
1349
|
+
return conversationId;
|
|
1350
|
+
}
|
|
1351
|
+
function findConfiguredWorkflow(items) {
|
|
1352
|
+
const configuredWorkflowName = typeof workflowConfig.name === "string" ? workflowConfig.name : void 0;
|
|
1353
|
+
return items?.find(
|
|
1354
|
+
(workflow) => workflow.id === workflowId || workflow.name === workflowId || configuredWorkflowName != null && workflow.name === configuredWorkflowName
|
|
1355
|
+
);
|
|
1356
|
+
}
|
|
1357
|
+
async function resolveWorkflowId(storeId) {
|
|
1358
|
+
const response = await httpClient.get(
|
|
1359
|
+
`search-stores/${storeId}/workflows`
|
|
1360
|
+
);
|
|
1361
|
+
const existing = findConfiguredWorkflow(response.items);
|
|
1362
|
+
if (existing) {
|
|
1363
|
+
return existing.id;
|
|
1364
|
+
}
|
|
1365
|
+
const created = await httpClient.post(
|
|
1366
|
+
`search-stores/${storeId}/workflows`,
|
|
1356
1367
|
workflowConfig
|
|
1357
1368
|
);
|
|
1358
|
-
return
|
|
1369
|
+
return created.id;
|
|
1359
1370
|
}
|
|
1360
|
-
async function
|
|
1361
|
-
const name = `store-${(/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-")}`;
|
|
1371
|
+
async function createSearchStore(conversationId) {
|
|
1362
1372
|
const storeRes = await httpClient.post("search-stores", {
|
|
1363
|
-
name,
|
|
1373
|
+
name: searchStoreNameForConversation(conversationId),
|
|
1364
1374
|
...searchStoreConfig
|
|
1365
1375
|
});
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1376
|
+
await httpClient.post(
|
|
1377
|
+
`search-stores/${storeRes.id}/workflows`,
|
|
1378
|
+
workflowConfig
|
|
1379
|
+
);
|
|
1380
|
+
return storeRes.id;
|
|
1370
1381
|
}
|
|
1371
|
-
|
|
1372
|
-
const
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1382
|
+
function findStoreForConversation(items, conversationId) {
|
|
1383
|
+
const expectedName = searchStoreNameForConversation(conversationId);
|
|
1384
|
+
const expectedModel = searchStoreConfig.models[0]?.embedding_model;
|
|
1385
|
+
return items.find(
|
|
1386
|
+
(store) => store.name === expectedName && (!expectedModel || store.models.some((m) => m.embedding_model === expectedModel))
|
|
1376
1387
|
);
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1388
|
+
}
|
|
1389
|
+
async function fetchOrCreateStore(conversationId) {
|
|
1390
|
+
const response = await httpClient.get("search-stores");
|
|
1391
|
+
const existing = findStoreForConversation(response.items, conversationId);
|
|
1392
|
+
if (existing) {
|
|
1393
|
+
await resolveWorkflowId(existing.id);
|
|
1394
|
+
storeIdByConversation.set(conversationId, existing.id);
|
|
1395
|
+
return existing.id;
|
|
1382
1396
|
}
|
|
1383
|
-
const
|
|
1384
|
-
|
|
1385
|
-
return
|
|
1397
|
+
const newStoreId = await createSearchStore(conversationId);
|
|
1398
|
+
storeIdByConversation.set(conversationId, newStoreId);
|
|
1399
|
+
return newStoreId;
|
|
1386
1400
|
}
|
|
1387
|
-
async function
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
}
|
|
1398
|
-
resolvedStoreId = await createSearchStoreWithWorkflow();
|
|
1399
|
-
return resolvedStoreId;
|
|
1400
|
-
} catch (err) {
|
|
1401
|
-
resolvePromise = null;
|
|
1401
|
+
async function resolveSearchStore(conversationId) {
|
|
1402
|
+
if (!conversationId) {
|
|
1403
|
+
throw new Error("conversationId is required to resolve a search store.");
|
|
1404
|
+
}
|
|
1405
|
+
const cached = storeIdByConversation.get(conversationId);
|
|
1406
|
+
if (cached) return cached;
|
|
1407
|
+
const pending = resolvePromises.get(conversationId);
|
|
1408
|
+
if (pending) return pending;
|
|
1409
|
+
const promise = fetchOrCreateStore(conversationId).catch((err) => {
|
|
1410
|
+
storeIdByConversation.delete(conversationId);
|
|
1402
1411
|
throw err;
|
|
1412
|
+
});
|
|
1413
|
+
resolvePromises.set(conversationId, promise);
|
|
1414
|
+
try {
|
|
1415
|
+
return await promise;
|
|
1416
|
+
} finally {
|
|
1417
|
+
resolvePromises.delete(conversationId);
|
|
1403
1418
|
}
|
|
1404
1419
|
}
|
|
1405
|
-
async function resolveSearchStore() {
|
|
1406
|
-
if (resolvedStoreId) return resolvedStoreId;
|
|
1407
|
-
if (resolvePromise) return resolvePromise;
|
|
1408
|
-
resolvePromise = fetchOrCreateStore();
|
|
1409
|
-
return resolvePromise;
|
|
1410
|
-
}
|
|
1411
1420
|
let instance = null;
|
|
1412
1421
|
function purgeInterruptedFiles() {
|
|
1413
1422
|
if (!instance) return;
|
|
@@ -1441,33 +1450,40 @@ function createDocumentUploadProvider(config) {
|
|
|
1441
1450
|
const fileInput = ref(null);
|
|
1442
1451
|
const upload = getUploadInstance();
|
|
1443
1452
|
const resolvedMaxFiles = upload.getSupportedFileTypes().maxFilesPerUpload;
|
|
1444
|
-
const storeId = ref(
|
|
1453
|
+
const storeId = ref(
|
|
1454
|
+
storeIdByConversation.get(toValue(conversationIdRef)) ?? ""
|
|
1455
|
+
);
|
|
1445
1456
|
const currentScope = shallowRef(
|
|
1446
1457
|
upload.scopeBy("conversationId", toValue(conversationIdRef))
|
|
1447
1458
|
);
|
|
1448
1459
|
watch(
|
|
1449
1460
|
() => toValue(conversationIdRef),
|
|
1450
|
-
(newId
|
|
1451
|
-
if (oldId && oldId !== newId) {
|
|
1452
|
-
const oldScope = upload.scopeBy("conversationId", oldId);
|
|
1453
|
-
for (const entry of oldScope.files.value) {
|
|
1454
|
-
upload.updateFileMetadata(entry.id, { conversationId: newId });
|
|
1455
|
-
}
|
|
1456
|
-
}
|
|
1461
|
+
async (newId) => {
|
|
1457
1462
|
currentScope.value = upload.scopeBy("conversationId", newId);
|
|
1458
|
-
|
|
1463
|
+
if (!newId) {
|
|
1464
|
+
storeId.value = "";
|
|
1465
|
+
return;
|
|
1466
|
+
}
|
|
1467
|
+
try {
|
|
1468
|
+
storeId.value = await resolveSearchStore(newId);
|
|
1469
|
+
} catch {
|
|
1470
|
+
storeId.value = "";
|
|
1471
|
+
}
|
|
1472
|
+
},
|
|
1473
|
+
{ immediate: true }
|
|
1459
1474
|
);
|
|
1460
1475
|
function scopedFiles() {
|
|
1461
1476
|
return currentScope.value?.files.value ?? [];
|
|
1462
1477
|
}
|
|
1463
1478
|
async function uploadFiles(files) {
|
|
1464
1479
|
if (!files.length) return;
|
|
1465
|
-
const
|
|
1466
|
-
|
|
1480
|
+
const conversationId = toValue(conversationIdRef);
|
|
1481
|
+
if (!conversationId) return;
|
|
1482
|
+
const userStoreId = await resolveSearchStore(conversationId);
|
|
1483
|
+
const workflowApiId = await resolveWorkflowId(userStoreId);
|
|
1467
1484
|
upload.setStoreId(userStoreId);
|
|
1468
1485
|
upload.setWorkflowId(workflowApiId);
|
|
1469
1486
|
storeId.value = userStoreId;
|
|
1470
|
-
const conversationId = toValue(conversationIdRef);
|
|
1471
1487
|
const result = await upload.upload({
|
|
1472
1488
|
id: `${conversationId}::${Date.now()}`,
|
|
1473
1489
|
files,
|
|
@@ -1521,12 +1537,11 @@ function createDocumentUploadProvider(config) {
|
|
|
1521
1537
|
function handleFilesSelected(event, options) {
|
|
1522
1538
|
const input = event.target;
|
|
1523
1539
|
let fileList = Array.from(input.files ?? []);
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
const kept = Math.max(0, availableSlots);
|
|
1540
|
+
if (fileList.length > resolvedMaxFiles) {
|
|
1541
|
+
const kept = Math.max(0, resolvedMaxFiles);
|
|
1527
1542
|
options?.onFilesExceeded?.({
|
|
1528
1543
|
selected: fileList.length,
|
|
1529
|
-
allowed:
|
|
1544
|
+
allowed: resolvedMaxFiles,
|
|
1530
1545
|
kept
|
|
1531
1546
|
});
|
|
1532
1547
|
fileList = fileList.slice(0, kept);
|
package/dist/index.d.ts
CHANGED
|
@@ -5,8 +5,8 @@ export { useChat, useConversationSessions, useConversations, } from './composabl
|
|
|
5
5
|
export type { ChatActions, ChatState, ConversationSession, CreateConversationInput, MessageHandler, MutationOptions, UseChatReturn, UseConversationSessionsReturn, UseConversationsOptions, UseConversationsReturn, } from './composables';
|
|
6
6
|
export { SdkError, createDocumentUploadProvider, defaultDocumentUploadConfig, defaultEndpoints, useDocumentUploadWithDefaultConfig, } from './composables/fileUpload';
|
|
7
7
|
export type { DocumentUploadConfig, DocumentUploadProvider, FileEntry, FileStatus, } from './composables/fileUpload';
|
|
8
|
-
export { CkAgentMessage, CkConversation, CkConversationLayout,
|
|
9
|
-
export type { CkConversationLayoutProps, CkConversationProps, CkDropZoneOverlayProps, CkDropZoneOverlayEmits, CkDropZoneRejection, CkDropZoneRejectionReason, CkFeedbackButtonProps, CkFeedbackDialogEmits, CkFeedbackDialogProps, CkFeedbackDialogSubmitPayload, CkFeedbackReason, CkFeedbackSentiment, CkFeedbackValue, CkFileEntry, CkFileItemsListEmits, CkFileItemsListProps, CkHistoryEmits, CkHistoryItemEmits, CkHistoryItemProps, CkHistoryProps, CkHistoryWrapperProps, CkMarkdownElementClasses, CkMarkdownRendererProps, CkModelOption, CkModelSelectorProps, CkModelSelectorEmits, CkPromptMenuButtonProps, CkUserMessageProps, } from './components';
|
|
8
|
+
export { CkAgentMessage, CkCitation, CkCitationCard, CkConversation, CkConversationLayout, CkCopyMessageButton, CkDropZoneOverlay, CkFeedbackButton, CkFeedbackDialog, CkFileItemsList, CkHistory, CkHistoryItem, CkHistoryWrapper, CkInput, CkMarkdownRenderer, CkMessageButton, CkModelSelector, CkPromptSendButton, CkPromptMenuButton, CkPromptStopButton, CkPromptInput, CkPromptInputDisclaimer, CkRegenerateMessageButton, CkSendIcon, CkStopIcon, CkUserMessage, } from './components';
|
|
9
|
+
export type { CkCitationProps, CkCitationEmits, CkCitationSource, CkCitationCardProps, CkCitationCardEmits, CkConversationLayoutProps, CkConversationProps, CkDropZoneOverlayProps, CkDropZoneOverlayEmits, CkDropZoneRejection, CkDropZoneRejectionReason, CkFeedbackButtonProps, CkFeedbackDialogEmits, CkFeedbackDialogProps, CkFeedbackDialogSubmitPayload, CkFeedbackReason, CkFeedbackSentiment, CkFeedbackValue, CkFileEntry, CkFileItemsListEmits, CkFileItemsListProps, CkHistoryEmits, CkHistoryItemEmits, CkHistoryItemProps, CkHistoryProps, CkHistoryWrapperProps, CkMarkdownElementClasses, CkMarkdownRendererProps, CkMarkdownRendererEmits, CkModelOption, CkModelSelectorProps, CkModelSelectorEmits, CkPromptMenuButtonProps, CkUserMessageProps, } from './components';
|
|
10
10
|
export { formatRelativeTime } from './helpers';
|
|
11
11
|
export type { BaseMessage, Conversation, ConversationTree, MessageContent, MessageContentStatus, MessageMetadata, MessageReasoningContent, MessageRole, MessageStatus, MessageTextContent, MessageToolContent, TreeMessage, } from './types';
|
|
12
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,WAAW,GACjB,MAAM,YAAY,CAAC;AASpB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,OAAO,EACL,OAAO,EACP,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,WAAW,EACX,SAAS,EACT,mBAAmB,EACnB,uBAAuB,EACvB,cAAc,EACd,eAAe,EACf,aAAa,EACb,6BAA6B,EAC7B,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,QAAQ,EACR,4BAA4B,EAC5B,2BAA2B,EAC3B,gBAAgB,EAChB,kCAAkC,GACnC,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,oBAAoB,EACpB,sBAAsB,EACtB,SAAS,EACT,UAAU,GACX,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,WAAW,GACjB,MAAM,YAAY,CAAC;AASpB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,OAAO,EACL,OAAO,EACP,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,WAAW,EACX,SAAS,EACT,mBAAmB,EACnB,uBAAuB,EACvB,cAAc,EACd,eAAe,EACf,aAAa,EACb,6BAA6B,EAC7B,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,QAAQ,EACR,4BAA4B,EAC5B,2BAA2B,EAC3B,gBAAgB,EAChB,kCAAkC,GACnC,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,oBAAoB,EACpB,sBAAsB,EACtB,SAAS,EACT,UAAU,GACX,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,cAAc,EACd,UAAU,EACV,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,OAAO,EACP,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,uBAAuB,EACvB,yBAAyB,EACzB,UAAU,EACV,UAAU,EACV,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,yBAAyB,EACzB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,6BAA6B,EAC7B,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,WAAW,EACX,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAG/C,YAAY,EACV,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,uBAAuB,EACvB,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,WAAW,GACZ,MAAM,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,38 +1,41 @@
|
|
|
1
|
-
import { u } from "./useMessageHandler-
|
|
2
|
-
import { C, d, p, u as u2, a } from "./useChatKitLabels-
|
|
3
|
-
import { S, c, d as d2, a as a2, u as u3, b, e, f } from "./index-
|
|
4
|
-
import { _,
|
|
1
|
+
import { u } from "./useMessageHandler-N50Yj-NU.js";
|
|
2
|
+
import { C, d, p, u as u2, a } from "./useChatKitLabels-zMFV7aEz.js";
|
|
3
|
+
import { S, c, d as d2, a as a2, u as u3, b, e, f } from "./index-CyrVnbS9.js";
|
|
4
|
+
import { _, C as C2, a as a3, b as b2, c as c2, d as d3, e as e2, f as f2, g, h, i, j, k, l, m, n, o, p as p2, q, r, s, t, u as u4, v, w, x, y } from "./CkInput.vue_vue_type_script_setup_true_lang-DJN-nZ2-.js";
|
|
5
5
|
export {
|
|
6
6
|
C as CHAT_KIT_LABELS,
|
|
7
7
|
_ as CkAgentMessage,
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
c2 as
|
|
12
|
-
d3 as
|
|
13
|
-
e2 as
|
|
14
|
-
f2 as
|
|
15
|
-
g as
|
|
16
|
-
h as
|
|
17
|
-
i as
|
|
18
|
-
j as
|
|
19
|
-
k as
|
|
20
|
-
l as
|
|
21
|
-
m as
|
|
22
|
-
n as
|
|
23
|
-
o as
|
|
24
|
-
p2 as
|
|
25
|
-
q as
|
|
26
|
-
r as
|
|
27
|
-
s as
|
|
28
|
-
t as
|
|
29
|
-
u4 as
|
|
8
|
+
C2 as CkCitation,
|
|
9
|
+
a3 as CkCitationCard,
|
|
10
|
+
b2 as CkConversation,
|
|
11
|
+
c2 as CkConversationLayout,
|
|
12
|
+
d3 as CkCopyMessageButton,
|
|
13
|
+
e2 as CkDropZoneOverlay,
|
|
14
|
+
f2 as CkFeedbackButton,
|
|
15
|
+
g as CkFeedbackDialog,
|
|
16
|
+
h as CkFileItemsList,
|
|
17
|
+
i as CkHistory,
|
|
18
|
+
j as CkHistoryItem,
|
|
19
|
+
k as CkHistoryWrapper,
|
|
20
|
+
l as CkInput,
|
|
21
|
+
m as CkMarkdownRenderer,
|
|
22
|
+
n as CkMessageButton,
|
|
23
|
+
o as CkModelSelector,
|
|
24
|
+
p2 as CkPromptInput,
|
|
25
|
+
q as CkPromptInputDisclaimer,
|
|
26
|
+
r as CkPromptMenuButton,
|
|
27
|
+
s as CkPromptSendButton,
|
|
28
|
+
t as CkPromptStopButton,
|
|
29
|
+
u4 as CkRegenerateMessageButton,
|
|
30
|
+
v as CkSendIcon,
|
|
31
|
+
w as CkStopIcon,
|
|
32
|
+
x as CkUserMessage,
|
|
30
33
|
S as SdkError,
|
|
31
34
|
c as createDocumentUploadProvider,
|
|
32
35
|
d as defaultChatKitLabels,
|
|
33
36
|
d2 as defaultDocumentUploadConfig,
|
|
34
37
|
a2 as defaultEndpoints,
|
|
35
|
-
|
|
38
|
+
y as formatRelativeTime,
|
|
36
39
|
p as provideChatKitLabels,
|
|
37
40
|
u3 as useChat,
|
|
38
41
|
u2 as useChatKitLabels,
|
|
@@ -28622,8 +28622,8 @@ const SANITIZE_CONFIG = {
|
|
|
28622
28622
|
};
|
|
28623
28623
|
function buildProcessor(plugins) {
|
|
28624
28624
|
let proc = unified().use(remarkParse).use(remarkNormalizeMath).use(remarkGfm).use(remarkMath);
|
|
28625
|
-
|
|
28626
|
-
proc = proc.use(
|
|
28625
|
+
if (plugins.length > 0) {
|
|
28626
|
+
proc = proc.use(plugins);
|
|
28627
28627
|
}
|
|
28628
28628
|
return proc.use(remarkRehype).use(rehypeKatex).use(rehypeStringify);
|
|
28629
28629
|
}
|
|
@@ -28650,12 +28650,37 @@ function useMarkdownParser(source, plugins) {
|
|
|
28650
28650
|
});
|
|
28651
28651
|
return { html: html2 };
|
|
28652
28652
|
}
|
|
28653
|
+
const CITATION_RE = /\[(\d+)\]/g;
|
|
28654
|
+
const remarkCitations = (options = {}) => {
|
|
28655
|
+
const { indices } = options;
|
|
28656
|
+
return (tree) => {
|
|
28657
|
+
findAndReplace(tree, [
|
|
28658
|
+
CITATION_RE,
|
|
28659
|
+
(_match, digits) => {
|
|
28660
|
+
const index2 = Number(digits);
|
|
28661
|
+
if (index2 < 1) return false;
|
|
28662
|
+
if (indices && !indices.has(index2)) return false;
|
|
28663
|
+
return {
|
|
28664
|
+
type: "citationReference",
|
|
28665
|
+
data: {
|
|
28666
|
+
hName: "span",
|
|
28667
|
+
// Use the literal attribute name so the placeholder contract matches
|
|
28668
|
+
// the renderer's `getAttribute('data-citation-index')` lookup exactly.
|
|
28669
|
+
hProperties: { "data-citation-index": index2 },
|
|
28670
|
+
hChildren: [{ type: "text", value: String(index2) }]
|
|
28671
|
+
}
|
|
28672
|
+
};
|
|
28673
|
+
}
|
|
28674
|
+
]);
|
|
28675
|
+
};
|
|
28676
|
+
};
|
|
28653
28677
|
const defaultChatKitLabels = {
|
|
28654
28678
|
agentAvatarAlt: "Agent avatar",
|
|
28655
28679
|
agentLoadingAvatarAlt: "Agent loading",
|
|
28656
28680
|
inputPlaceholder: "Type a message...",
|
|
28657
28681
|
copyMessageAction: "Copy response",
|
|
28658
28682
|
copyMessageActionCopied: "Copied!",
|
|
28683
|
+
regenerateMessageAction: "Regenerate response",
|
|
28659
28684
|
feedbackThumbsUp: "Good response",
|
|
28660
28685
|
feedbackThumbsDown: "Bad response",
|
|
28661
28686
|
feedbackGroup: "Rate this response",
|
|
@@ -28674,6 +28699,8 @@ const defaultChatKitLabels = {
|
|
|
28674
28699
|
modelSelectorListAriaLabel: "Models",
|
|
28675
28700
|
modelSelectorPlaceholder: "Select model",
|
|
28676
28701
|
markdownTableLabel: "Table",
|
|
28702
|
+
citationOpenSource: "Open source",
|
|
28703
|
+
citationSourceLabel: "Source",
|
|
28677
28704
|
historyItemUntitled: "Untitled conversation",
|
|
28678
28705
|
historyItemActionAriaLabel: "Conversation options",
|
|
28679
28706
|
historyItemEditAction: "Edit",
|
|
@@ -28696,9 +28723,10 @@ function useChatKitLabels() {
|
|
|
28696
28723
|
export {
|
|
28697
28724
|
CHAT_KIT_LABELS as C,
|
|
28698
28725
|
useMarkdownParser as a,
|
|
28726
|
+
remarkNormalizeMath as b,
|
|
28699
28727
|
defaultChatKitLabels as d,
|
|
28700
28728
|
normalizeMathDelimiters as n,
|
|
28701
28729
|
provideChatKitLabels as p,
|
|
28702
|
-
|
|
28730
|
+
remarkCitations as r,
|
|
28703
28731
|
useChatKitLabels as u
|
|
28704
28732
|
};
|
|
@@ -71,10 +71,8 @@ function updateNodeId(tree, oldId, newId) {
|
|
|
71
71
|
}
|
|
72
72
|
if (tree.rootId === oldId) tree.rootId = newId;
|
|
73
73
|
}
|
|
74
|
-
function
|
|
75
|
-
const
|
|
76
|
-
if (!node) return;
|
|
77
|
-
const stack = [...node.childrenIds];
|
|
74
|
+
function deleteSubtrees(tree, ids) {
|
|
75
|
+
const stack = [...ids];
|
|
78
76
|
while (stack.length > 0) {
|
|
79
77
|
const currentId = stack.pop();
|
|
80
78
|
const current = tree.nodes[currentId];
|
|
@@ -82,9 +80,33 @@ function cutBranchAfter(tree, id) {
|
|
|
82
80
|
stack.push(...current.childrenIds);
|
|
83
81
|
delete tree.nodes[currentId];
|
|
84
82
|
}
|
|
83
|
+
}
|
|
84
|
+
function cutBranchAfter(tree, id) {
|
|
85
|
+
const node = tree.nodes[id];
|
|
86
|
+
if (!node) return;
|
|
87
|
+
deleteSubtrees(tree, node.childrenIds);
|
|
85
88
|
node.childrenIds = [];
|
|
86
89
|
node.activeChildIndex = 0;
|
|
87
90
|
}
|
|
91
|
+
function cutBranchAt(tree, id) {
|
|
92
|
+
const node = tree.nodes[id];
|
|
93
|
+
if (!node) return;
|
|
94
|
+
deleteSubtrees(tree, [id]);
|
|
95
|
+
if (node.parentId === null) {
|
|
96
|
+
if (tree.rootId === id) tree.rootId = null;
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const parent = tree.nodes[node.parentId];
|
|
100
|
+
if (!parent) return;
|
|
101
|
+
const idx = parent.childrenIds.indexOf(id);
|
|
102
|
+
if (idx !== -1) {
|
|
103
|
+
parent.childrenIds.splice(idx, 1);
|
|
104
|
+
if (idx < parent.activeChildIndex) parent.activeChildIndex -= 1;
|
|
105
|
+
}
|
|
106
|
+
if (parent.activeChildIndex >= parent.childrenIds.length) {
|
|
107
|
+
parent.activeChildIndex = Math.max(0, parent.childrenIds.length - 1);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
88
110
|
function navigate(tree, targetId) {
|
|
89
111
|
const node = tree.nodes[targetId];
|
|
90
112
|
if (!node || node.parentId === null) return;
|
|
@@ -102,6 +124,13 @@ const useMessageHandler = () => {
|
|
|
102
124
|
const list = messages.value;
|
|
103
125
|
return list.length > 0 ? list[list.length - 1].id : null;
|
|
104
126
|
});
|
|
127
|
+
function resolveParentId(parentId) {
|
|
128
|
+
if (parentId === void 0) return currentLeafId.value;
|
|
129
|
+
if (!tree.nodes[parentId]) {
|
|
130
|
+
throw new Error(`Unknown parent message id: ${parentId}`);
|
|
131
|
+
}
|
|
132
|
+
return parentId;
|
|
133
|
+
}
|
|
105
134
|
function setCurrentUserMessage(text) {
|
|
106
135
|
currentUserMessage.value = text;
|
|
107
136
|
}
|
|
@@ -112,12 +141,13 @@ const useMessageHandler = () => {
|
|
|
112
141
|
const id = generateId();
|
|
113
142
|
const text = currentUserMessage.value.trim();
|
|
114
143
|
if (!text) throw new Error("No message");
|
|
144
|
+
const parentId = resolveParentId(opts?.parentId);
|
|
115
145
|
const content = [
|
|
116
146
|
{ type: "text", id: generateId(), text, status: "completed" }
|
|
117
147
|
];
|
|
118
148
|
const node = {
|
|
119
149
|
id,
|
|
120
|
-
parentId
|
|
150
|
+
parentId,
|
|
121
151
|
childrenIds: [],
|
|
122
152
|
activeChildIndex: 0,
|
|
123
153
|
role: "user",
|
|
@@ -150,7 +180,7 @@ const useMessageHandler = () => {
|
|
|
150
180
|
} else {
|
|
151
181
|
const node = {
|
|
152
182
|
id: message.id,
|
|
153
|
-
parentId:
|
|
183
|
+
parentId: resolveParentId(message.parentId),
|
|
154
184
|
childrenIds: [],
|
|
155
185
|
activeChildIndex: 0,
|
|
156
186
|
role: message.role,
|
|
@@ -191,6 +221,12 @@ const useMessageHandler = () => {
|
|
|
191
221
|
function cutBranchAfter$1(messageId) {
|
|
192
222
|
cutBranchAfter(tree, messageId);
|
|
193
223
|
}
|
|
224
|
+
function cutBranchAt$1(messageId) {
|
|
225
|
+
cutBranchAt(tree, messageId);
|
|
226
|
+
}
|
|
227
|
+
function getTree() {
|
|
228
|
+
return readonly(tree);
|
|
229
|
+
}
|
|
194
230
|
return {
|
|
195
231
|
messages,
|
|
196
232
|
currentUserMessage: readonly(currentUserMessage),
|
|
@@ -204,7 +240,9 @@ const useMessageHandler = () => {
|
|
|
204
240
|
clearMessages,
|
|
205
241
|
setTree,
|
|
206
242
|
navigate: navigate$1,
|
|
207
|
-
cutBranchAfter: cutBranchAfter$1
|
|
243
|
+
cutBranchAfter: cutBranchAfter$1,
|
|
244
|
+
cutBranchAt: cutBranchAt$1,
|
|
245
|
+
getTree
|
|
208
246
|
};
|
|
209
247
|
};
|
|
210
248
|
export {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aleph-alpha/chat-kit",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"description": "Chat kit package for building chat interfaces with Vue",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -68,6 +68,7 @@
|
|
|
68
68
|
"@aleph-alpha/ui-library": "^2.8.3",
|
|
69
69
|
"dompurify": "^3.3.2",
|
|
70
70
|
"katex": "^0.17.0",
|
|
71
|
+
"mdast-util-find-and-replace": "^3.0.2",
|
|
71
72
|
"rehype-katex": "^7.0.1",
|
|
72
73
|
"rehype-stringify": "^10.0.1",
|
|
73
74
|
"remark-gfm": "^4.0.1",
|
|
@@ -84,6 +85,7 @@
|
|
|
84
85
|
"@testing-library/jest-dom": "6.9.1",
|
|
85
86
|
"@testing-library/vue": "8.1.0",
|
|
86
87
|
"@types/dompurify": "^3.2.0",
|
|
88
|
+
"@types/mdast": "^4.0.4",
|
|
87
89
|
"@types/node": "^25.1.0",
|
|
88
90
|
"@unocss/preset-wind4": "^66.6.2",
|
|
89
91
|
"@unocss/reset": "^66.6.2",
|
|
@@ -100,9 +102,9 @@
|
|
|
100
102
|
"vitest": "3.2.6",
|
|
101
103
|
"vue": "^3.5.27",
|
|
102
104
|
"vue-tsc": "^3.2.4",
|
|
105
|
+
"@aleph-alpha/eslint-config-frontend": "0.7.0",
|
|
103
106
|
"@aleph-alpha/prettier-config-frontend": "2.1.0",
|
|
104
|
-
"@aleph-alpha/tsconfig-frontend": "0.7.0"
|
|
105
|
-
"@aleph-alpha/eslint-config-frontend": "0.7.0"
|
|
107
|
+
"@aleph-alpha/tsconfig-frontend": "0.7.0"
|
|
106
108
|
},
|
|
107
109
|
"scripts": {
|
|
108
110
|
"build": "vite build && vue-tsc --project tsconfig.build.json --declaration --emitDeclarationOnly --outDir dist",
|
|
@@ -142,6 +142,34 @@ describe('responsesToTree', () => {
|
|
|
142
142
|
expect(a1.activeChildIndex).toBe(1);
|
|
143
143
|
});
|
|
144
144
|
|
|
145
|
+
it('favours the latest root branch when the first turn is branched into several root responses', () => {
|
|
146
|
+
const tree = responsesToTree([
|
|
147
|
+
makeResponse({
|
|
148
|
+
id: 'r1',
|
|
149
|
+
request_input: [userInput('First attempt')],
|
|
150
|
+
output: [assistantOutput('msg-a1', 'A1')],
|
|
151
|
+
}),
|
|
152
|
+
makeResponse({
|
|
153
|
+
id: 'r2',
|
|
154
|
+
request_input: [userInput('Second attempt')],
|
|
155
|
+
output: [assistantOutput('msg-a2', 'A2')],
|
|
156
|
+
}),
|
|
157
|
+
]);
|
|
158
|
+
|
|
159
|
+
// Both turns are root-anchored (no previous_response_id); the latest wins
|
|
160
|
+
// as the active root so getLinearPath surfaces it.
|
|
161
|
+
expect(tree.nodes['user-r1-0']!.parentId).toBeNull();
|
|
162
|
+
expect(tree.nodes['user-r2-0']!.parentId).toBeNull();
|
|
163
|
+
expect(tree.rootId).toBe('user-r2-0');
|
|
164
|
+
|
|
165
|
+
const handler = useMessageHandler();
|
|
166
|
+
handler.setTree(tree);
|
|
167
|
+
expect(handler.messages.value.map((m) => m.id)).toEqual([
|
|
168
|
+
'user-r2-0',
|
|
169
|
+
'msg-a2',
|
|
170
|
+
]);
|
|
171
|
+
});
|
|
172
|
+
|
|
145
173
|
it('skips responses with no visible content but keeps descendants attached to the parent tail', () => {
|
|
146
174
|
const tree = responsesToTree([
|
|
147
175
|
makeResponse({
|
|
@@ -402,15 +430,31 @@ describe('responsesToTree', () => {
|
|
|
402
430
|
// string on the wire (transports flatten nested metadata).
|
|
403
431
|
metadata: {
|
|
404
432
|
attachments: JSON.stringify([
|
|
405
|
-
{
|
|
433
|
+
{
|
|
434
|
+
fileName: 'report.pdf',
|
|
435
|
+
fileId: 'f1',
|
|
436
|
+
searchStoreId: 's1',
|
|
437
|
+
documentId: 'd1',
|
|
438
|
+
},
|
|
406
439
|
]),
|
|
407
440
|
},
|
|
408
441
|
}),
|
|
409
442
|
]);
|
|
410
443
|
|
|
444
|
+
// The full attachment shape (incl. `documentId`) is preserved so the
|
|
445
|
+
// turn can be faithfully re-submitted (e.g. regenerate) after a reload.
|
|
411
446
|
expect(tree.nodes['user-r1-0']!.metadata).toEqual({
|
|
412
447
|
responseId: 'r1',
|
|
413
|
-
|
|
448
|
+
model: 'pharia-1',
|
|
449
|
+
attachments: [
|
|
450
|
+
{
|
|
451
|
+
name: 'report.pdf',
|
|
452
|
+
fileId: 'f1',
|
|
453
|
+
fileName: 'report.pdf',
|
|
454
|
+
searchStoreId: 's1',
|
|
455
|
+
documentId: 'd1',
|
|
456
|
+
},
|
|
457
|
+
],
|
|
414
458
|
});
|
|
415
459
|
// The assistant turn does not inherit attachments but still carries
|
|
416
460
|
// its responseId stamp.
|
|
@@ -431,9 +475,12 @@ describe('responsesToTree', () => {
|
|
|
431
475
|
}),
|
|
432
476
|
]);
|
|
433
477
|
|
|
434
|
-
// The malformed attachments are dropped
|
|
435
|
-
//
|
|
436
|
-
expect(tree.nodes['user-r1-0']!.metadata).toEqual({
|
|
478
|
+
// The malformed attachments are dropped; the first user node still
|
|
479
|
+
// carries `responseId` (and `model` when present).
|
|
480
|
+
expect(tree.nodes['user-r1-0']!.metadata).toEqual({
|
|
481
|
+
responseId: 'r1',
|
|
482
|
+
model: 'pharia-1',
|
|
483
|
+
});
|
|
437
484
|
expect(tree.nodes['user-r1-0']!.metadata.attachments).toBeUndefined();
|
|
438
485
|
expect(warn).toHaveBeenCalled();
|
|
439
486
|
} finally {
|