@aleph-alpha/chat-kit 3.3.0 → 5.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-BAcBFs6I.js → CkHistory.vue_vue_type_script_setup_true_lang-Bp9hXdH6.js} +452 -348
- 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 +36 -14
- package/dist/components/base/CkAgentMessage/CkAgentMessage.stories.d.ts +14 -13
- package/dist/components/base/CkAgentMessage/CkAgentMessage.stories.d.ts.map +1 -1
- package/dist/components/base/CkAgentMessage/CkAgentMessage.vue.d.ts +8 -7
- package/dist/components/base/CkAgentMessage/CkAgentMessage.vue.d.ts.map +1 -1
- package/dist/components/base/CkAgentMessage/types.d.ts +16 -5
- package/dist/components/base/CkAgentMessage/types.d.ts.map +1 -1
- package/dist/components/base/CkAgentMessageHeader/CkAgentMessageHeader.stories.d.ts +16 -0
- package/dist/components/base/CkAgentMessageHeader/CkAgentMessageHeader.stories.d.ts.map +1 -0
- package/dist/components/base/CkAgentMessageHeader/CkAgentMessageHeader.vue.d.ts +21 -0
- package/dist/components/base/CkAgentMessageHeader/CkAgentMessageHeader.vue.d.ts.map +1 -0
- package/dist/components/base/CkAgentMessageHeader/index.d.ts +3 -0
- package/dist/components/base/CkAgentMessageHeader/index.d.ts.map +1 -0
- package/dist/components/base/CkAgentMessageHeader/types.d.ts +22 -0
- package/dist/components/base/CkAgentMessageHeader/types.d.ts.map +1 -0
- package/dist/components/base/CkCitation/CkCitation.stories.d.ts +6 -0
- package/dist/components/base/CkCitation/CkCitation.stories.d.ts.map +1 -1
- package/dist/components/base/CkCitation/CkCitation.vue.d.ts.map +1 -1
- package/dist/components/base/CkCitationCard/CkCitationCard.stories.d.ts +5 -4
- package/dist/components/base/CkCitationCard/CkCitationCard.stories.d.ts.map +1 -1
- package/dist/components/base/CkCitationCard/CkCitationCard.vue.d.ts.map +1 -1
- 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/CkFeedbackButton/types.d.ts +1 -1
- package/dist/components/base/CkFeedbackDialog/types.d.ts +1 -1
- package/dist/components/base/CkFileItemsList/CkFileItemsList.stories.d.ts +15 -4
- package/dist/components/base/CkFileItemsList/CkFileItemsList.stories.d.ts.map +1 -1
- package/dist/components/base/CkFileItemsList/CkFileItemsList.vue.d.ts +2 -1
- package/dist/components/base/CkFileItemsList/CkFileItemsList.vue.d.ts.map +1 -1
- package/dist/components/base/CkFileItemsList/types.d.ts +17 -4
- package/dist/components/base/CkFileItemsList/types.d.ts.map +1 -1
- package/dist/components/base/CkHeaderActivityButton/CkHeaderActivityButton.stories.d.ts +19 -0
- package/dist/components/base/CkHeaderActivityButton/CkHeaderActivityButton.stories.d.ts.map +1 -0
- package/dist/components/base/CkHeaderActivityButton/CkHeaderActivityButton.vue.d.ts +22 -0
- package/dist/components/base/CkHeaderActivityButton/CkHeaderActivityButton.vue.d.ts.map +1 -0
- package/dist/components/base/CkHeaderActivityButton/index.d.ts +3 -0
- package/dist/components/base/CkHeaderActivityButton/index.d.ts.map +1 -0
- package/dist/components/base/CkHeaderActivityButton/types.d.ts +36 -0
- package/dist/components/base/CkHeaderActivityButton/types.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/CkPromptInput/CkPromptInput.stories.d.ts +6 -6
- package/dist/components/base/CkPromptInput/CkPromptInput.vue.d.ts.map +1 -1
- package/dist/components/base/CkPromptInput/types.d.ts +4 -4
- package/dist/components/base/CkPromptInputDisclaimer/CkPromptInputDisclaimer.vue.d.ts.map +1 -1
- package/dist/components/base/CkPromptInputDisclaimer/types.d.ts +1 -1
- package/dist/components/base/CkPromptSendButton/CkPromptSendButton.vue.d.ts +1 -1
- package/dist/components/base/CkPromptSendButton/types.d.ts +1 -1
- package/dist/components/base/CkPromptStopButton/types.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 +7 -2
- 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/CkConversation.vue.d.ts +13 -1
- package/dist/components/composed/CkConversation/CkConversation.vue.d.ts.map +1 -1
- package/dist/components/composed/CkConversation/types.d.ts +1 -1
- package/dist/components/composed/index.d.ts +0 -1
- package/dist/components/composed/index.d.ts.map +1 -1
- package/dist/components/index.d.ts +3 -3
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +26 -24
- package/dist/composables/index.js +1 -1
- package/dist/handlers/index.js +2 -2
- package/dist/handlers/useChatKitLabels.d.ts +2 -0
- package/dist/handlers/useChatKitLabels.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/{index-C6njJ8EB.js → index-CyrVnbS9.js} +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -28
- package/dist/{useChatKitLabels-BM2I7-9o.js → useChatKitLabels-zMFV7aEz.js} +1 -0
- package/dist/{useMessageHandler-CMdy-lm0.js → useMessageHandler-N50Yj-NU.js} +45 -7
- package/package.json +3 -3
- package/src/adapters/responses-api.spec.ts +52 -5
- package/src/adapters/responses-api.ts +26 -7
- package/src/components/base/CkAgentMessage/CkAgentMessage.spec.ts +12 -17
- package/src/components/base/CkAgentMessage/CkAgentMessage.stories.ts +124 -113
- package/src/components/base/CkAgentMessage/CkAgentMessage.vue +18 -16
- package/src/components/base/CkAgentMessage/types.ts +16 -5
- package/src/components/base/CkAgentMessageHeader/CkAgentMessageHeader.spec.ts +64 -0
- package/src/components/base/CkAgentMessageHeader/CkAgentMessageHeader.stories.ts +90 -0
- package/src/components/base/CkAgentMessageHeader/CkAgentMessageHeader.vue +47 -0
- package/src/components/base/CkAgentMessageHeader/index.ts +2 -0
- package/src/components/base/CkAgentMessageHeader/types.ts +21 -0
- package/src/components/base/CkCitation/CkCitation.stories.ts +12 -0
- package/src/components/base/CkCitation/CkCitation.vue +34 -9
- package/src/components/base/CkCitationCard/CkCitationCard.stories.ts +5 -4
- package/src/components/base/CkCitationCard/CkCitationCard.vue +2 -2
- package/src/components/base/CkConversationLayout/CkConversationLayout.vue +1 -1
- 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/CkFileItemsList/CkFileItemsList.spec.ts +88 -13
- package/src/components/base/CkFileItemsList/CkFileItemsList.stories.ts +61 -13
- package/src/components/base/CkFileItemsList/CkFileItemsList.vue +153 -110
- package/src/components/base/CkFileItemsList/types.ts +17 -4
- package/src/components/base/CkHeaderActivityButton/CkHeaderActivityButton.spec.ts +50 -0
- package/src/components/base/CkHeaderActivityButton/CkHeaderActivityButton.stories.ts +102 -0
- package/src/components/base/CkHeaderActivityButton/CkHeaderActivityButton.vue +39 -0
- package/src/components/base/CkHeaderActivityButton/index.ts +2 -0
- package/src/components/base/CkHeaderActivityButton/types.ts +36 -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/CkPromptInput/CkPromptInput.spec.ts +88 -0
- package/src/components/base/CkPromptInput/CkPromptInput.stories.ts +6 -6
- package/src/components/base/CkPromptInput/CkPromptInput.vue +63 -12
- package/src/components/base/CkPromptInput/types.ts +4 -4
- package/src/components/base/CkPromptInputDisclaimer/CkPromptInputDisclaimer.spec.ts +1 -1
- package/src/components/base/CkPromptInputDisclaimer/CkPromptInputDisclaimer.vue +1 -1
- package/src/components/base/CkPromptInputDisclaimer/types.ts +1 -1
- package/src/components/base/CkPromptSendButton/types.ts +1 -1
- package/src/components/base/CkPromptStopButton/types.ts +1 -1
- 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 +10 -2
- package/src/components/composed/CkConversation/CkConversation.spec.ts +81 -6
- package/src/components/composed/CkConversation/CkConversation.stories.ts +6 -6
- package/src/components/composed/CkConversation/CkConversation.vue +80 -37
- package/src/components/composed/CkConversation/types.ts +1 -1
- package/src/components/composed/index.ts +0 -1
- package/src/components/index.ts +9 -3
- package/src/handlers/useChatKitLabels.spec.ts +1 -0
- package/src/handlers/useChatKitLabels.ts +3 -0
- 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/index.ts +8 -3
- 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/dist/components/composed/CkInput/CkInput.stories.d.ts +0 -43
- package/dist/components/composed/CkInput/CkInput.stories.d.ts.map +0 -1
- package/dist/components/composed/CkInput/CkInput.vue.d.ts +0 -50
- package/dist/components/composed/CkInput/CkInput.vue.d.ts.map +0 -1
- package/dist/components/composed/CkInput/index.d.ts +0 -3
- package/dist/components/composed/CkInput/index.d.ts.map +0 -1
- package/dist/components/composed/CkInput/types.d.ts +0 -55
- package/dist/components/composed/CkInput/types.d.ts.map +0 -1
- package/src/components/base/CkCopyMessageActionButton/index.ts +0 -2
- package/src/components/base/CkMessageActionButton/index.ts +0 -2
- package/src/components/composed/CkInput/CkInput.spec.ts +0 -191
- package/src/components/composed/CkInput/CkInput.stories.ts +0 -434
- package/src/components/composed/CkInput/CkInput.vue +0 -106
- package/src/components/composed/CkInput/index.ts +0 -2
- package/src/components/composed/CkInput/types.ts +0 -55
package/dist/index.js
CHANGED
|
@@ -1,40 +1,42 @@
|
|
|
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 { _, a as a3, C as C2, 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, z } from "./CkHistory.vue_vue_type_script_setup_true_lang-Bp9hXdH6.js";
|
|
5
5
|
export {
|
|
6
6
|
C as CHAT_KIT_LABELS,
|
|
7
7
|
_ as CkAgentMessage,
|
|
8
|
+
a3 as CkAgentMessageHeader,
|
|
8
9
|
C2 as CkCitation,
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
10
|
+
b2 as CkCitationCard,
|
|
11
|
+
c2 as CkConversation,
|
|
12
|
+
d3 as CkConversationLayout,
|
|
13
|
+
e2 as CkCopyMessageButton,
|
|
14
|
+
f2 as CkDropZoneOverlay,
|
|
15
|
+
g as CkFeedbackButton,
|
|
16
|
+
h as CkFeedbackDialog,
|
|
17
|
+
i as CkFileItemsList,
|
|
18
|
+
j as CkHeaderActivityButton,
|
|
19
|
+
k as CkHistory,
|
|
20
|
+
l as CkHistoryItem,
|
|
21
|
+
m as CkHistoryWrapper,
|
|
22
|
+
n as CkMarkdownRenderer,
|
|
23
|
+
o as CkMessageButton,
|
|
24
|
+
p2 as CkModelSelector,
|
|
25
|
+
q as CkPromptInput,
|
|
26
|
+
r as CkPromptInputDisclaimer,
|
|
27
|
+
s as CkPromptMenuButton,
|
|
28
|
+
t as CkPromptSendButton,
|
|
29
|
+
u4 as CkPromptStopButton,
|
|
30
|
+
v as CkRegenerateMessageButton,
|
|
31
|
+
w as CkSendIcon,
|
|
32
|
+
x as CkStopIcon,
|
|
33
|
+
y as CkUserMessage,
|
|
32
34
|
S as SdkError,
|
|
33
35
|
c as createDocumentUploadProvider,
|
|
34
36
|
d as defaultChatKitLabels,
|
|
35
37
|
d2 as defaultDocumentUploadConfig,
|
|
36
38
|
a2 as defaultEndpoints,
|
|
37
|
-
|
|
39
|
+
z as formatRelativeTime,
|
|
38
40
|
p as provideChatKitLabels,
|
|
39
41
|
u3 as useChat,
|
|
40
42
|
u2 as useChatKitLabels,
|
|
@@ -28680,6 +28680,7 @@ const defaultChatKitLabels = {
|
|
|
28680
28680
|
inputPlaceholder: "Type a message...",
|
|
28681
28681
|
copyMessageAction: "Copy response",
|
|
28682
28682
|
copyMessageActionCopied: "Copied!",
|
|
28683
|
+
regenerateMessageAction: "Regenerate response",
|
|
28683
28684
|
feedbackThumbsUp: "Good response",
|
|
28684
28685
|
feedbackThumbsDown: "Bad response",
|
|
28685
28686
|
feedbackGroup: "Rate this response",
|
|
@@ -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": "5.0.0",
|
|
4
4
|
"description": "Chat kit package for building chat interfaces with Vue",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -102,9 +102,9 @@
|
|
|
102
102
|
"vitest": "3.2.6",
|
|
103
103
|
"vue": "^3.5.27",
|
|
104
104
|
"vue-tsc": "^3.2.4",
|
|
105
|
-
"@aleph-alpha/
|
|
105
|
+
"@aleph-alpha/eslint-config-frontend": "0.7.0",
|
|
106
106
|
"@aleph-alpha/prettier-config-frontend": "2.1.0",
|
|
107
|
-
"@aleph-alpha/
|
|
107
|
+
"@aleph-alpha/tsconfig-frontend": "0.7.0"
|
|
108
108
|
},
|
|
109
109
|
"scripts": {
|
|
110
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 {
|
|
@@ -212,6 +212,7 @@ export interface ResponseAttachment {
|
|
|
212
212
|
fileId: string;
|
|
213
213
|
fileName: string;
|
|
214
214
|
searchStoreId: string;
|
|
215
|
+
documentId?: string;
|
|
215
216
|
}
|
|
216
217
|
|
|
217
218
|
/**
|
|
@@ -219,15 +220,17 @@ export interface ResponseAttachment {
|
|
|
219
220
|
* `metadata.attachments` on the user `TreeMessage` (chat-kit's `BaseMessage`
|
|
220
221
|
* /`TreeMessage` carry `metadata` as an opaque `Record<string, unknown>`).
|
|
221
222
|
*
|
|
222
|
-
*
|
|
223
|
-
*
|
|
224
|
-
* using a different attachment shape can either skip this adapter
|
|
225
|
-
* project this onto their own type at the read site.
|
|
223
|
+
* Carries a human-readable `name` plus every id needed to resolve a public
|
|
224
|
+
* URL for the file or to re-submit it on a later turn (e.g. regenerate).
|
|
225
|
+
* Consumers using a different attachment shape can either skip this adapter
|
|
226
|
+
* or project this onto their own type at the read site.
|
|
226
227
|
*/
|
|
227
228
|
export interface ResponseMessageAttachment {
|
|
228
229
|
name: string;
|
|
229
230
|
fileId?: string;
|
|
231
|
+
fileName?: string;
|
|
230
232
|
searchStoreId?: string;
|
|
233
|
+
documentId?: string;
|
|
231
234
|
}
|
|
232
235
|
|
|
233
236
|
/**
|
|
@@ -280,6 +283,7 @@ export interface ResponseList {
|
|
|
280
283
|
*/
|
|
281
284
|
export type ResponseTreeMessageMetadata = MessageMetadata & {
|
|
282
285
|
responseId: string;
|
|
286
|
+
model?: string;
|
|
283
287
|
attachments?: ResponseMessageAttachment[];
|
|
284
288
|
};
|
|
285
289
|
|
|
@@ -478,13 +482,18 @@ function responseToMessageNodes(resp: StoredResponse): ResponseMessageNode[] {
|
|
|
478
482
|
const userContent = text || responseAttachments?.length;
|
|
479
483
|
if (role !== 'user' || !userContent) continue;
|
|
480
484
|
|
|
481
|
-
const metadata: ResponseTreeMessageMetadata = {
|
|
485
|
+
const metadata: ResponseTreeMessageMetadata = {
|
|
486
|
+
responseId: resp.id,
|
|
487
|
+
...(resp.model ? { model: resp.model } : {}),
|
|
488
|
+
};
|
|
482
489
|
if (responseAttachments && userNodesPushed === 0) {
|
|
483
490
|
metadata.attachments = responseAttachments.map(
|
|
484
491
|
(a): ResponseMessageAttachment => ({
|
|
485
492
|
name: a.fileName,
|
|
486
493
|
fileId: a.fileId,
|
|
494
|
+
fileName: a.fileName,
|
|
487
495
|
searchStoreId: a.searchStoreId,
|
|
496
|
+
...(a.documentId ? { documentId: a.documentId } : {}),
|
|
488
497
|
}),
|
|
489
498
|
);
|
|
490
499
|
}
|
|
@@ -607,6 +616,12 @@ function linkResponse(state: TreeBuildState, resp: StoredResponse): void {
|
|
|
607
616
|
parentResponseId !== null
|
|
608
617
|
? (tailMessageByResponse.get(parentResponseId) ?? null)
|
|
609
618
|
: null;
|
|
619
|
+
// Whether this response opens a new root-level branch (it chains onto
|
|
620
|
+
// nothing). The first turn can be branched/regenerated, producing several
|
|
621
|
+
// root responses; since the tree has a single `rootId` with no parent node
|
|
622
|
+
// to track sibling navigation, we keep the latest such branch as the active
|
|
623
|
+
// root — mirroring the "latest sibling wins" rule used for deeper branches.
|
|
624
|
+
const isRootChain = chainParent === null;
|
|
610
625
|
|
|
611
626
|
const messageNodes = responseToMessageNodes(resp);
|
|
612
627
|
|
|
@@ -624,7 +639,9 @@ function linkResponse(state: TreeBuildState, resp: StoredResponse): void {
|
|
|
624
639
|
chainParent = node.id;
|
|
625
640
|
}
|
|
626
641
|
|
|
627
|
-
|
|
642
|
+
// Favour the latest root branch: responses arrive in ascending `created_at`
|
|
643
|
+
// order, so a later root chain overwrites an earlier one.
|
|
644
|
+
if (firstId !== null && (state.rootMessageId === null || isRootChain)) {
|
|
628
645
|
state.rootMessageId = firstId;
|
|
629
646
|
}
|
|
630
647
|
|
|
@@ -639,7 +656,9 @@ function linkResponse(state: TreeBuildState, resp: StoredResponse): void {
|
|
|
639
656
|
* pass: each response's `previous_response_id` always points to a response
|
|
640
657
|
* we have already processed, so we can wire its messages onto the parent's
|
|
641
658
|
* last message immediately. Sibling responses (same `previous_response_id`)
|
|
642
|
-
* surface as branches; the latest one wins as the active branch.
|
|
659
|
+
* surface as branches; the latest one wins as the active branch. The same
|
|
660
|
+
* preference applies at the top level: when the first turn is branched into
|
|
661
|
+
* several root responses, the latest becomes the active `rootId`.
|
|
643
662
|
*
|
|
644
663
|
* Every emitted node carries `metadata.responseId` pointing back to the
|
|
645
664
|
* originating `StoredResponse.id` (see {@link ResponseTreeMessage}). The
|
|
@@ -32,31 +32,26 @@ describe('CkAgentMessage', () => {
|
|
|
32
32
|
});
|
|
33
33
|
});
|
|
34
34
|
|
|
35
|
-
describe('
|
|
36
|
-
it('
|
|
37
|
-
render(CkAgentMessage, {
|
|
38
|
-
slots: {
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
expect(screen.getByAltText('bot-icon')).toBeInTheDocument();
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
it('renders the icon container only when the icon slot is provided', () => {
|
|
45
|
-
render(CkAgentMessage, {
|
|
46
|
-
slots: { icon: '<img src="" alt="bot-icon" />' },
|
|
35
|
+
describe('bottom separator', () => {
|
|
36
|
+
it('renders a bottom border by default', () => {
|
|
37
|
+
const { container } = render(CkAgentMessage, {
|
|
38
|
+
slots: { default: 'Some content' },
|
|
47
39
|
});
|
|
48
40
|
|
|
49
|
-
expect(
|
|
41
|
+
expect((container.firstElementChild as HTMLElement).className).toContain(
|
|
42
|
+
'border-b',
|
|
43
|
+
);
|
|
50
44
|
});
|
|
51
45
|
|
|
52
|
-
it('
|
|
53
|
-
render(CkAgentMessage, {
|
|
46
|
+
it('omits the bottom border when bottomSeparator is false', () => {
|
|
47
|
+
const { container } = render(CkAgentMessage, {
|
|
48
|
+
props: { bottomSeparator: false },
|
|
54
49
|
slots: { default: 'Some content' },
|
|
55
50
|
});
|
|
56
51
|
|
|
57
52
|
expect(
|
|
58
|
-
|
|
59
|
-
).not.
|
|
53
|
+
(container.firstElementChild as HTMLElement).className,
|
|
54
|
+
).not.toContain('border-b');
|
|
60
55
|
});
|
|
61
56
|
});
|
|
62
57
|
|