@8wave/ai-elements 0.98.0-beta.4 → 0.98.0-beta.5
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/_chunks/{Document-CjCQXPDF.js → Document-DtFcn7Mq.js} +2 -2
- package/dist/_chunks/Document-DtFcn7Mq.js.map +1 -0
- package/dist/_chunks/{PkToolRequestConfirm-BGt2J3e5.js → PkToolRequestConfirm-FQ9nDFXy.js} +2 -2
- package/dist/_chunks/{PkToolRequestConfirm-BGt2J3e5.js.map → PkToolRequestConfirm-FQ9nDFXy.js.map} +1 -1
- package/dist/_chunks/{PkToolRequestGeolocation-D9kfr6SV.js → PkToolRequestGeolocation-BJ9NJZIg.js} +2 -2
- package/dist/_chunks/{PkToolRequestGeolocation-D9kfr6SV.js.map → PkToolRequestGeolocation-BJ9NJZIg.js.map} +1 -1
- package/dist/_chunks/{PkToolRequestOAuthConnection-BH2tXr0j.js → PkToolRequestOAuthConnection-DdvJ6n1K.js} +2 -2
- package/dist/_chunks/{PkToolRequestOAuthConnection-BH2tXr0j.js.map → PkToolRequestOAuthConnection-DdvJ6n1K.js.map} +1 -1
- package/dist/_chunks/{PkToolShowCalendarEvent-DZwH1Run.js → PkToolShowCalendarEvent-BYnhl2er.js} +2 -2
- package/dist/_chunks/{PkToolShowCalendarEvent-DZwH1Run.js.map → PkToolShowCalendarEvent-BYnhl2er.js.map} +1 -1
- package/dist/_chunks/{PkToolShowContactForm-DEQBTzf4.js → PkToolShowContactForm-upUNZtId.js} +3 -3
- package/dist/_chunks/{PkToolShowContactForm-DEQBTzf4.js.map → PkToolShowContactForm-upUNZtId.js.map} +1 -1
- package/dist/_chunks/{PkToolShowDiagram-siwsx1K7.js → PkToolShowDiagram-Jq_4KWiK.js} +2 -2
- package/dist/_chunks/{PkToolShowDiagram-siwsx1K7.js.map → PkToolShowDiagram-Jq_4KWiK.js.map} +1 -1
- package/dist/_chunks/{PkToolShowForm-AZwrmmM9.js → PkToolShowForm-BNV4Ja6g.js} +2 -2
- package/dist/_chunks/{PkToolShowForm-AZwrmmM9.js.map → PkToolShowForm-BNV4Ja6g.js.map} +1 -1
- package/dist/_chunks/{PkToolShowSources-FnMkkdm6.js → PkToolShowSources-DwB6VXrK.js} +2 -2
- package/dist/_chunks/{PkToolShowSources-FnMkkdm6.js.map → PkToolShowSources-DwB6VXrK.js.map} +1 -1
- package/dist/_chunks/{PkToolShowWeather-COyrzQ7m.js → PkToolShowWeather-C2rPCQ_K.js} +2 -2
- package/dist/_chunks/{PkToolShowWeather-COyrzQ7m.js.map → PkToolShowWeather-C2rPCQ_K.js.map} +1 -1
- package/dist/_chunks/{index.es-eLFDkB2Y.js → index.es-u1dF1xg2.js} +2 -2
- package/dist/_chunks/{index.es-eLFDkB2Y.js.map → index.es-u1dF1xg2.js.map} +1 -1
- package/dist/_chunks/{vue-i18n-BBwABYBg.js → vue-i18n-kZs9Hfey.js} +650 -640
- package/dist/_chunks/vue-i18n-kZs9Hfey.js.map +1 -0
- package/dist/ai-elements.es.js +150 -121
- package/dist/ai-elements.es.js.map +1 -1
- package/dist-vue/PkChatbot.js +1 -1
- package/dist-vue/PkChatbotMessages.js +1 -1
- package/dist-vue/PkChatbotViewChat.js +1 -1
- package/dist-vue/PkChatbotViewConversations.js +1 -1
- package/dist-vue/PkChatbotViewFiles.js +1 -1
- package/dist-vue/PkChatbotViewProfile.js +1 -1
- package/dist-vue/_chunks/{Document-B8gv0e2O.js → Document-CSdfKj_B.js} +2 -2
- package/dist-vue/_chunks/{Document-B8gv0e2O.js.map → Document-CSdfKj_B.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbot-CxpAotKB.js → PkChatbot-DHkhT0Jf.js} +6 -6
- package/dist-vue/_chunks/{PkChatbot-CxpAotKB.js.map → PkChatbot-DHkhT0Jf.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotMessages-DEzcxcqc.js → PkChatbotMessages-B4qfTNOJ.js} +2 -2
- package/dist-vue/_chunks/{PkChatbotMessages-DEzcxcqc.js.map → PkChatbotMessages-B4qfTNOJ.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotViewChat-QzWSymIg.js → PkChatbotViewChat-C08TsXiL.js} +4 -4
- package/dist-vue/_chunks/{PkChatbotViewChat-QzWSymIg.js.map → PkChatbotViewChat-C08TsXiL.js.map} +1 -1
- package/dist-vue/_chunks/PkChatbotViewConversations-BQZi5kSC.js +192 -0
- package/dist-vue/_chunks/PkChatbotViewConversations-BQZi5kSC.js.map +1 -0
- package/dist-vue/_chunks/{PkChatbotViewFiles-RHMwvWUS.js → PkChatbotViewFiles-TLKE_tRw.js} +3 -3
- package/dist-vue/_chunks/{PkChatbotViewFiles-RHMwvWUS.js.map → PkChatbotViewFiles-TLKE_tRw.js.map} +1 -1
- package/dist-vue/_chunks/{PkChatbotViewProfile-Bka6CUAa.js → PkChatbotViewProfile-B6ANZY96.js} +2 -2
- package/dist-vue/_chunks/{PkChatbotViewProfile-Bka6CUAa.js.map → PkChatbotViewProfile-B6ANZY96.js.map} +1 -1
- package/dist-vue/_chunks/{PkToolShowSources-rGZz65c2.js → PkToolShowSources-CFh-i60o.js} +2 -2
- package/dist-vue/_chunks/{PkToolShowSources-rGZz65c2.js.map → PkToolShowSources-CFh-i60o.js.map} +1 -1
- package/dist-vue/_chunks/{constants-BSe0uxSf.js → constants-BCJ_gKeL.js} +2 -2
- package/dist-vue/_chunks/{constants-BSe0uxSf.js.map → constants-BCJ_gKeL.js.map} +1 -1
- package/dist-vue/_chunks/{createChatbotApiClient-Bf5DbqVH.js → createChatbotApiClient-BOBdBxmf.js} +2 -2
- package/dist-vue/_chunks/{createChatbotApiClient-Bf5DbqVH.js.map → createChatbotApiClient-BOBdBxmf.js.map} +1 -1
- package/dist-vue/_chunks/{useChatbotStore-DeHwEN8W.js → useChatbotStore-BJ-EDmND.js} +3 -3
- package/dist-vue/_chunks/useChatbotStore-BJ-EDmND.js.map +1 -0
- package/dist-vue/api.js +1 -1
- package/dist-vue/apps/web-component/src/components/EmbeddedChatWidget.ce.d.ts +7 -0
- package/dist-vue/apps/web-component/src/components/FloatingChatWidget.ce.d.ts +7 -0
- package/dist-vue/apps/web-component/src/composables/useChatbotAuth.d.ts +11 -0
- package/dist-vue/apps/web-component/src/lib.d.ts +6 -0
- package/dist-vue/composables.js +118 -103
- package/dist-vue/composables.js.map +1 -1
- package/dist-vue/index.js +12 -10
- package/dist-vue/index.js.map +1 -1
- package/dist-vue/packages/components/src/chat/PkChatbotMessages.d.ts +3 -134
- package/dist-vue/packages/components/src/chat/PkMessageParts.d.ts +3 -134
- package/dist-vue/packages/components/src/chat/constants.d.ts +1 -1
- package/dist-vue/packages/composable/src/chatbot/useChatbotStore.d.ts +24 -24
- package/dist-vue/packages/models/src/schema/constants.d.ts +2 -0
- package/package.json +1 -1
- package/dist/_chunks/Document-CjCQXPDF.js.map +0 -1
- package/dist/_chunks/vue-i18n-BBwABYBg.js.map +0 -1
- package/dist-vue/_chunks/PkChatbotViewConversations-O-wm_nu1.js +0 -192
- package/dist-vue/_chunks/PkChatbotViewConversations-O-wm_nu1.js.map +0 -1
- package/dist-vue/_chunks/useChatbotStore-DeHwEN8W.js.map +0 -1
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
import { t as e } from "./useChatbotStore-DeHwEN8W.js";
|
|
2
|
-
import "./src-8QXYVWIx.js";
|
|
3
|
-
import { t } from "./markdown-CCMpGUA7.js";
|
|
4
|
-
import { n } from "./message-RohfrdWS.js";
|
|
5
|
-
import { t as r } from "./useDialogConfirm-DaoekZdk.js";
|
|
6
|
-
import { t as i } from "./PkRelativeTime-C9zd1ffO.js";
|
|
7
|
-
import { t as a } from "./chatbotProfileContext-CgnFhNPn.js";
|
|
8
|
-
import { VvButton as o, VvButtonGroup as s, VvDropdown as c, VvDropdownAction as l, VvIcon as u, VvInputText as ee } from "@volverjs/ui-vue/components";
|
|
9
|
-
import { Fragment as d, createBlock as f, createCommentVNode as p, createElementBlock as m, createElementVNode as h, createTextVNode as g, createVNode as _, defineComponent as v, inject as y, isRef as te, mergeProps as b, normalizeClass as x, openBlock as S, ref as C, renderList as w, toDisplayString as T, unref as E, withCtx as D, withModifiers as O } from "vue";
|
|
10
|
-
import { useI18n as k } from "vue-i18n";
|
|
11
|
-
import { storeToRefs as A } from "pinia";
|
|
12
|
-
//#region ../../packages/composable/src/chatbot/useConversationActions.ts
|
|
13
|
-
function j(e) {
|
|
14
|
-
return t(e.title) || t(n(e.messages?.find((e) => e.role === "user"))) || "";
|
|
15
|
-
}
|
|
16
|
-
function M(e) {
|
|
17
|
-
let n = C(null), i = C(""), a = (e, r = "") => {
|
|
18
|
-
n.value = e.id, i.value = t(e.title) || r;
|
|
19
|
-
}, o = async (t) => {
|
|
20
|
-
let r = i.value.trim();
|
|
21
|
-
if (n.value = null, r && r.length <= 255) try {
|
|
22
|
-
await e.renameChatTitle(t, r);
|
|
23
|
-
} catch {}
|
|
24
|
-
}, s = () => {
|
|
25
|
-
n.value = null;
|
|
26
|
-
}, c = (e, t) => {
|
|
27
|
-
e.key === "Enter" ? (e.preventDefault(), o(t)) : e.key === "Escape" && (e.preventDefault(), s());
|
|
28
|
-
}, { openDialogConfirm: l } = r();
|
|
29
|
-
return {
|
|
30
|
-
editingId: n,
|
|
31
|
-
editingTitle: i,
|
|
32
|
-
startEdit: a,
|
|
33
|
-
confirmEdit: o,
|
|
34
|
-
cancelEdit: s,
|
|
35
|
-
onRenameKeydown: c,
|
|
36
|
-
requestDelete: async (t) => {
|
|
37
|
-
try {
|
|
38
|
-
if (!await l()) return;
|
|
39
|
-
await e.deleteChat(t);
|
|
40
|
-
} catch {}
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
//#endregion
|
|
45
|
-
//#region ../../packages/components/src/chat/PkChatbotViewConversations.vue?vue&type=script&setup=true&lang.ts
|
|
46
|
-
var ne = { class: "flex flex-col flex-1 min-h-0 relative" }, re = {
|
|
47
|
-
key: 0,
|
|
48
|
-
class: "flex flex-col gap-8 p-16 vv-skeleton"
|
|
49
|
-
}, ie = {
|
|
50
|
-
key: 1,
|
|
51
|
-
class: "flex flex-col flex-1 items-center justify-center gap-12 p-24 text-center"
|
|
52
|
-
}, ae = { class: "w-64 h-64 rounded-full bg-surface-1 border border-surface-3 flex items-center justify-center" }, oe = { class: "flex flex-col gap-4" }, N = { class: "text-16 font-semibold text-word-1" }, P = { class: "text-14 text-word-3 leading-relaxed" }, F = {
|
|
53
|
-
key: 2,
|
|
54
|
-
class: "flex flex-col gap-8 overflow-y-auto p-16 pb-64 light-scrollbar"
|
|
55
|
-
}, I = ["onClick"], L = { class: "flex gap-8" }, R = { class: "font-bold truncate block flex-1" }, z = {
|
|
56
|
-
key: 0,
|
|
57
|
-
class: "text-12 text-word-4 line-clamp-2"
|
|
58
|
-
}, B = {
|
|
59
|
-
key: 3,
|
|
60
|
-
class: "absolute bottom-0 left-0 right-0 flex flex-col items-center gap-4 px-16 pb-16 pt-32 pointer-events-none",
|
|
61
|
-
style: { background: "linear-gradient(to top, var(--color-surface) 55%, transparent)" }
|
|
62
|
-
}, V = /* @__PURE__ */ v({
|
|
63
|
-
__name: "PkChatbotViewConversations",
|
|
64
|
-
props: { agentId: {} },
|
|
65
|
-
setup(v) {
|
|
66
|
-
let j = v, { t: V } = k({ useScope: "global" }), H = e(j.agentId), { conversations: U, isLoadingConversations: W, localChatId: G } = A(H), { navigate: K, startNewChat: q, renameChatTitle: se, deleteChat: ce } = H, { editingId: J, editingTitle: Y, startEdit: le, confirmEdit: ue, cancelEdit: de, onRenameKeydown: fe, requestDelete: pe } = M({
|
|
67
|
-
renameChatTitle: se,
|
|
68
|
-
deleteChat: ce
|
|
69
|
-
}), me = (e) => {
|
|
70
|
-
J.value || (G.value = e, K("chat"));
|
|
71
|
-
}, he = (e) => G.value === e.id, X = (e, r) => t(n(e.filter((e) => e.role === r).slice(-1)[0]) || ""), Z = (e) => {
|
|
72
|
-
le(e, X(e.messages, "assistant"));
|
|
73
|
-
}, { openDialogConfirm: ge } = r(), Q = y(a, void 0), $ = C(!1), _e = async () => {
|
|
74
|
-
let e = Q?.eraseConversations;
|
|
75
|
-
if (e && await ge({
|
|
76
|
-
title: V("action.deleteMyConversations"),
|
|
77
|
-
questionLabel: V("message.deleteMyConversationsConfirm")
|
|
78
|
-
})) {
|
|
79
|
-
$.value = !0;
|
|
80
|
-
try {
|
|
81
|
-
await e(), U.value = [], q();
|
|
82
|
-
} catch {
|
|
83
|
-
H.loadConversations(j.agentId);
|
|
84
|
-
} finally {
|
|
85
|
-
$.value = !1;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
|
-
return (e, n) => {
|
|
90
|
-
let r = u, a = o, v = ee, y = s, C = l, k = c;
|
|
91
|
-
return S(), m("div", ne, [E(W) && E(U).length === 0 ? (S(), m("div", re, [(S(), m(d, null, w(5, (e) => h("div", {
|
|
92
|
-
key: e,
|
|
93
|
-
class: "vv-skeleton__item rounded-md h-64"
|
|
94
|
-
})), 64))])) : E(U).length === 0 ? (S(), m("div", ie, [
|
|
95
|
-
h("div", ae, [_(r, {
|
|
96
|
-
name: "ri:chat-3-line",
|
|
97
|
-
class: "w-28 h-28 text-word-4"
|
|
98
|
-
})]),
|
|
99
|
-
h("div", oe, [h("strong", N, T(E(V)("message.noConversations")), 1), h("span", P, T(E(V)("message.noConversationsHint")), 1)]),
|
|
100
|
-
_(a, {
|
|
101
|
-
modifiers: "primary rounded",
|
|
102
|
-
icon: "ri:add-line",
|
|
103
|
-
class: "mt-8",
|
|
104
|
-
label: E(V)("action.startNewChat"),
|
|
105
|
-
onClick: n[0] ||= (e) => E(q)()
|
|
106
|
-
}, null, 8, ["label"])
|
|
107
|
-
])) : (S(), m("ul", F, [(S(!0), m(d, null, w(E(U), (e) => (S(), m("li", { key: e.id }, [h("button", {
|
|
108
|
-
type: "button",
|
|
109
|
-
class: x(["w-full block rounded-md border border-surface-3 p-12 text-left text-14 leading-relaxed cursor-pointer transition-colors hover:border-surface-5 hover:bg-surface-1 focus-within:border-word", { "border-brand bg-surface-1": he(e) }]),
|
|
110
|
-
onClick: (t) => me(e.id)
|
|
111
|
-
}, [h("div", L, [E(J) === e.id ? (S(), m(d, { key: 0 }, [_(v, {
|
|
112
|
-
modelValue: E(Y),
|
|
113
|
-
"onUpdate:modelValue": n[1] ||= (e) => te(Y) ? Y.value = e : null,
|
|
114
|
-
class: "flex-1",
|
|
115
|
-
modifiers: "compact",
|
|
116
|
-
autofocus: "",
|
|
117
|
-
"select-on-focus": "",
|
|
118
|
-
maxlength: 255,
|
|
119
|
-
placeholder: E(V)("placeholder.insert"),
|
|
120
|
-
onClick: n[2] ||= O(() => {}, ["stop"]),
|
|
121
|
-
onKeydown: (t) => E(fe)(t, e.id)
|
|
122
|
-
}, null, 8, [
|
|
123
|
-
"modelValue",
|
|
124
|
-
"placeholder",
|
|
125
|
-
"onKeydown"
|
|
126
|
-
]), _(y, { modifiers: "compact" }, {
|
|
127
|
-
default: D(() => [_(a, {
|
|
128
|
-
icon: "ri:save-line",
|
|
129
|
-
title: E(V)("action.save"),
|
|
130
|
-
modifiers: "action-quiet-small",
|
|
131
|
-
onClick: O((t) => E(ue)(e.id), ["stop"])
|
|
132
|
-
}, null, 8, ["title", "onClick"]), _(a, {
|
|
133
|
-
icon: "ri:close-line",
|
|
134
|
-
title: E(V)("action.cancel"),
|
|
135
|
-
modifiers: "action-quiet-small",
|
|
136
|
-
onClick: n[3] ||= O((e) => E(de)(), ["stop"])
|
|
137
|
-
}, null, 8, ["title"])]),
|
|
138
|
-
_: 2
|
|
139
|
-
}, 1024)], 64)) : (S(), m(d, { key: 1 }, [
|
|
140
|
-
h("strong", R, T(E(t)(e.title) || X(e.messages, "assistant")), 1),
|
|
141
|
-
_(i, {
|
|
142
|
-
class: "text-word-4 text-smaller shrink-0",
|
|
143
|
-
date: e.lastMessageAt
|
|
144
|
-
}, null, 8, ["date"]),
|
|
145
|
-
h("div", { onClick: n[4] ||= O(() => {}, ["stop"]) }, [_(k, b({ ref_for: !0 }, {
|
|
146
|
-
placement: "bottom-end",
|
|
147
|
-
modifiers: "menu",
|
|
148
|
-
flip: !0,
|
|
149
|
-
offset: 3,
|
|
150
|
-
strategy: "fixed"
|
|
151
|
-
}), {
|
|
152
|
-
items: D(() => [_(C, { onClick: (t) => Z(e) }, {
|
|
153
|
-
default: D(() => [_(r, { name: "ri:pencil-line" }), g(" " + T(E(V)("action.renameChat")), 1)]),
|
|
154
|
-
_: 1
|
|
155
|
-
}, 8, ["onClick"]), _(C, { onClick: (t) => E(pe)(e.id) }, {
|
|
156
|
-
default: D(() => [_(r, { name: "ri:delete-bin-line" }), g(" " + T(E(V)("action.delete")), 1)]),
|
|
157
|
-
_: 1
|
|
158
|
-
}, 8, ["onClick"])]),
|
|
159
|
-
default: D(() => [_(a, {
|
|
160
|
-
icon: "ri:more-2-fill",
|
|
161
|
-
title: E(V)("action.moreActions"),
|
|
162
|
-
modifiers: "action-quiet-small"
|
|
163
|
-
}, null, 8, ["title"])]),
|
|
164
|
-
_: 2
|
|
165
|
-
}, 1040)])
|
|
166
|
-
], 64))]), E(J) === e.id ? p("", !0) : (S(), m("span", z, T(E(t)(e.summary) || X(e.messages, "user")), 1))], 10, I)]))), 128))])), E(U).length > 0 ? (S(), m("div", B, [_(a, {
|
|
167
|
-
class: "text-14 pointer-events-auto",
|
|
168
|
-
modifiers: "primary rounded",
|
|
169
|
-
icon: "ri:add-line",
|
|
170
|
-
label: E(V)("action.startNewChat"),
|
|
171
|
-
onClick: n[5] ||= O((e) => E(q)(), ["stop"])
|
|
172
|
-
}, null, 8, ["label"]), E(Q)?.eraseConversations ? (S(), f(a, {
|
|
173
|
-
key: 0,
|
|
174
|
-
class: "text-12 pointer-events-auto",
|
|
175
|
-
modifiers: "action-quiet-danger",
|
|
176
|
-
icon: "ri:delete-bin-line",
|
|
177
|
-
loading: $.value,
|
|
178
|
-
disabled: $.value,
|
|
179
|
-
label: E(V)("action.deleteMyConversations"),
|
|
180
|
-
onClick: n[6] ||= O((e) => _e(), ["stop"])
|
|
181
|
-
}, null, 8, [
|
|
182
|
-
"loading",
|
|
183
|
-
"disabled",
|
|
184
|
-
"label"
|
|
185
|
-
])) : p("", !0)])) : p("", !0)]);
|
|
186
|
-
};
|
|
187
|
-
}
|
|
188
|
-
});
|
|
189
|
-
//#endregion
|
|
190
|
-
export { j as n, M as r, V as t };
|
|
191
|
-
|
|
192
|
-
//# sourceMappingURL=PkChatbotViewConversations-O-wm_nu1.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PkChatbotViewConversations-O-wm_nu1.js","names":[],"sources":["../../../../packages/composable/src/chatbot/useConversationActions.ts","../../../../packages/components/src/chat/PkChatbotViewConversations.vue","../../../../packages/components/src/chat/PkChatbotViewConversations.vue"],"sourcesContent":["import { ref } from 'vue'\nimport type { Chat as Conversation } from 'models'\nimport { getTextPart, stripMarkdown } from 'utils'\nimport { useDialogConfirm } from '../useDialogConfirm'\n\n/**\n * Single-line preview for a conversation: explicit title, otherwise the\n * first user message. Used as list label and as search haystack.\n */\nexport function getConversationPreview(conversation: Conversation): string {\n return (\n stripMarkdown(conversation.title) ||\n stripMarkdown(\n getTextPart(\n // The list endpoint isn't Zod-parsed: don't trust the\n // declared types at runtime\n conversation.messages?.find(\n (message) => message.role === 'user',\n ),\n ),\n ) ||\n ''\n )\n}\n\n/**\n * Inline-rename and delete-with-confirm state shared by the conversation\n * lists (PkChatbotViewConversations, PkChatSidebar). Renames are optimistic:\n * on failure the next conversations load reconciles with the server state.\n */\nexport function useConversationActions(actions: {\n renameChatTitle: (chatId: string, title: string) => Promise<unknown>\n deleteChat: (chatId: string) => Promise<unknown>\n}) {\n const editingId = ref<string | null>(null)\n const editingTitle = ref('')\n\n const startEdit = (conversation: Conversation, fallbackTitle = '') => {\n editingId.value = conversation.id\n editingTitle.value = stripMarkdown(conversation.title) || fallbackTitle\n }\n\n const confirmEdit = async (id: string) => {\n const trimmed = editingTitle.value.trim()\n editingId.value = null\n if (trimmed && trimmed.length <= 255) {\n try {\n await actions.renameChatTitle(id, trimmed)\n } catch {\n // Revert optimistically: reload will pick up server state\n }\n }\n }\n\n const cancelEdit = () => {\n editingId.value = null\n }\n\n const onRenameKeydown = (event: KeyboardEvent, id: string) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n confirmEdit(id)\n } else if (event.key === 'Escape') {\n event.preventDefault()\n cancelEdit()\n }\n }\n\n const { openDialogConfirm } = useDialogConfirm()\n const requestDelete = async (id: string) => {\n try {\n const proceed = await openDialogConfirm()\n if (!proceed) {\n return\n }\n await actions.deleteChat(id)\n } catch {\n // Silently fail: next load will reconcile\n }\n }\n\n return {\n editingId,\n editingTitle,\n startEdit,\n confirmEdit,\n cancelEdit,\n onRenameKeydown,\n requestDelete,\n }\n}\n","<script setup lang=\"ts\">\n import { inject, ref } from 'vue'\n import { storeToRefs } from 'pinia'\n import { useI18n } from 'vue-i18n'\n import type { Chat as Conversation, UIChatMessage } from 'models'\n import { stripMarkdown, getTextPart } from 'utils'\n import {\n useChatbotStore,\n useConversationActions,\n useDialogConfirm,\n } from 'composables'\n import PkRelativeTime from '../PkRelativeTime.vue'\n import { ChatbotProfileContextKey } from './chatbotProfileContext'\n\n const props = defineProps<{ agentId: string }>()\n\n const { t: $t } = useI18n({ useScope: 'global' })\n\n const store = useChatbotStore(props.agentId)\n const { conversations, isLoadingConversations, localChatId } =\n storeToRefs(store)\n const { navigate, startNewChat, renameChatTitle, deleteChat } = store\n\n const {\n editingId,\n editingTitle,\n startEdit: startEditConversation,\n confirmEdit,\n cancelEdit,\n onRenameKeydown,\n requestDelete: handleDelete,\n } = useConversationActions({ renameChatTitle, deleteChat })\n\n const openConversation = (id: string) => {\n if (editingId.value) {\n return\n }\n localChatId.value = id\n navigate('chat')\n }\n\n const isCurrentConversation = (conversation: Conversation) => {\n return localChatId.value === conversation.id\n }\n\n const getLastMessage = (\n messages: UIChatMessage[],\n role: 'user' | 'assistant',\n ) => {\n return stripMarkdown(\n getTextPart(messages.filter((m) => m.role === role).slice(-1)[0]) ||\n '',\n )\n }\n\n const startEdit = (conversation: Conversation) => {\n startEditConversation(\n conversation,\n getLastMessage(conversation.messages, 'assistant'),\n )\n }\n\n const { openDialogConfirm } = useDialogConfirm()\n\n // GDPR B.3 — bulk \"delete my conversations\", available to anonymous\n // sessions too (the host wires the endpoint through the profile context)\n const profile = inject(ChatbotProfileContextKey, undefined)\n const isErasingConversations = ref(false)\n const handleEraseAll = async () => {\n const eraseConversations = profile?.eraseConversations\n if (!eraseConversations) {\n return\n }\n const proceed = await openDialogConfirm({\n title: $t('action.deleteMyConversations'),\n questionLabel: $t('message.deleteMyConversationsConfirm'),\n })\n if (!proceed) {\n return\n }\n isErasingConversations.value = true\n try {\n await eraseConversations()\n conversations.value = []\n startNewChat()\n } catch {\n // Same policy as single delete: fail silently and reconcile\n // with the server state\n store.loadConversations(props.agentId)\n } finally {\n isErasingConversations.value = false\n }\n }\n</script>\n\n<template>\n <div class=\"flex flex-col flex-1 min-h-0 relative\">\n <!-- Loading skeleton -->\n <div\n v-if=\"isLoadingConversations && conversations.length === 0\"\n class=\"flex flex-col gap-8 p-16 vv-skeleton\">\n <div\n v-for=\"i in 5\"\n :key=\"i\"\n class=\"vv-skeleton__item rounded-md h-64\" />\n </div>\n\n <!-- Empty state -->\n <div\n v-else-if=\"conversations.length === 0\"\n class=\"flex flex-col flex-1 items-center justify-center gap-12 p-24 text-center\">\n <div\n class=\"w-64 h-64 rounded-full bg-surface-1 border border-surface-3 flex items-center justify-center\">\n <VvIcon name=\"ri:chat-3-line\" class=\"w-28 h-28 text-word-4\" />\n </div>\n <div class=\"flex flex-col gap-4\">\n <strong class=\"text-16 font-semibold text-word-1\">\n {{ $t('message.noConversations') }}\n </strong>\n <span class=\"text-14 text-word-3 leading-relaxed\">\n {{ $t('message.noConversationsHint') }}\n </span>\n </div>\n <VvButton\n modifiers=\"primary rounded\"\n icon=\"ri:add-line\"\n class=\"mt-8\"\n :label=\"$t('action.startNewChat')\"\n @click=\"startNewChat()\" />\n </div>\n\n <!-- Conversation list -->\n <ul\n v-else\n class=\"flex flex-col gap-8 overflow-y-auto p-16 pb-64 light-scrollbar\">\n <li v-for=\"conversation in conversations\" :key=\"conversation.id\">\n <button\n type=\"button\"\n class=\"w-full block rounded-md border border-surface-3 p-12 text-left text-14 leading-relaxed cursor-pointer transition-colors hover:border-surface-5 hover:bg-surface-1 focus-within:border-word\"\n :class=\"{\n 'border-brand bg-surface-1':\n isCurrentConversation(conversation),\n }\"\n @click=\"openConversation(conversation.id)\">\n <div class=\"flex gap-8\">\n <template v-if=\"editingId === conversation.id\">\n <VvInputText\n v-model=\"editingTitle\"\n class=\"flex-1\"\n modifiers=\"compact\"\n autofocus\n select-on-focus\n :maxlength=\"255\"\n :placeholder=\"$t('placeholder.insert')\"\n @click.stop\n @keydown=\"\n onRenameKeydown($event, conversation.id)\n \" />\n <VvButtonGroup modifiers=\"compact\">\n <VvButton\n icon=\"ri:save-line\"\n :title=\"$t('action.save')\"\n modifiers=\"action-quiet-small\"\n @click.stop=\"\n confirmEdit(conversation.id)\n \" />\n <VvButton\n icon=\"ri:close-line\"\n :title=\"$t('action.cancel')\"\n modifiers=\"action-quiet-small\"\n @click.stop=\"cancelEdit()\" />\n </VvButtonGroup>\n </template>\n <template v-else>\n <strong class=\"font-bold truncate block flex-1\">\n {{\n stripMarkdown(conversation.title) ||\n getLastMessage(\n conversation.messages,\n 'assistant',\n )\n }}\n </strong>\n <PkRelativeTime\n class=\"text-word-4 text-smaller shrink-0\"\n :date=\"conversation.lastMessageAt\" />\n <div @click.stop>\n <VvDropdown\n v-bind=\"{\n placement: 'bottom-end',\n modifiers: 'menu',\n flip: true,\n offset: 3,\n strategy: 'fixed',\n }\">\n <VvButton\n icon=\"ri:more-2-fill\"\n :title=\"$t('action.moreActions')\"\n modifiers=\"action-quiet-small\" />\n <template #items>\n <VvDropdownAction\n @click=\"startEdit(conversation)\">\n <VvIcon name=\"ri:pencil-line\" />\n {{ $t('action.renameChat') }}\n </VvDropdownAction>\n <VvDropdownAction\n @click=\"\n handleDelete(conversation.id)\n \">\n <VvIcon name=\"ri:delete-bin-line\" />\n {{ $t('action.delete') }}\n </VvDropdownAction>\n </template>\n </VvDropdown>\n </div>\n </template>\n </div>\n <span\n v-if=\"editingId !== conversation.id\"\n class=\"text-12 text-word-4 line-clamp-2\">\n {{\n stripMarkdown(conversation.summary) ||\n getLastMessage(conversation.messages, 'user')\n }}\n </span>\n </button>\n </li>\n </ul>\n\n <!-- Sticky \"new chat\" CTA (hidden on empty state, which has its own CTA) -->\n <div\n v-if=\"conversations.length > 0\"\n class=\"absolute bottom-0 left-0 right-0 flex flex-col items-center gap-4 px-16 pb-16 pt-32 pointer-events-none\"\n :style=\"{\n background:\n 'linear-gradient(to top, var(--color-surface) 55%, transparent)',\n }\">\n <VvButton\n class=\"text-14 pointer-events-auto\"\n modifiers=\"primary rounded\"\n icon=\"ri:add-line\"\n :label=\"$t('action.startNewChat')\"\n @click.stop=\"startNewChat()\" />\n <VvButton\n v-if=\"profile?.eraseConversations\"\n class=\"text-12 pointer-events-auto\"\n modifiers=\"action-quiet-danger\"\n icon=\"ri:delete-bin-line\"\n :loading=\"isErasingConversations\"\n :disabled=\"isErasingConversations\"\n :label=\"$t('action.deleteMyConversations')\"\n @click.stop=\"handleEraseAll()\" />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { inject, ref } from 'vue'\n import { storeToRefs } from 'pinia'\n import { useI18n } from 'vue-i18n'\n import type { Chat as Conversation, UIChatMessage } from 'models'\n import { stripMarkdown, getTextPart } from 'utils'\n import {\n useChatbotStore,\n useConversationActions,\n useDialogConfirm,\n } from 'composables'\n import PkRelativeTime from '../PkRelativeTime.vue'\n import { ChatbotProfileContextKey } from './chatbotProfileContext'\n\n const props = defineProps<{ agentId: string }>()\n\n const { t: $t } = useI18n({ useScope: 'global' })\n\n const store = useChatbotStore(props.agentId)\n const { conversations, isLoadingConversations, localChatId } =\n storeToRefs(store)\n const { navigate, startNewChat, renameChatTitle, deleteChat } = store\n\n const {\n editingId,\n editingTitle,\n startEdit: startEditConversation,\n confirmEdit,\n cancelEdit,\n onRenameKeydown,\n requestDelete: handleDelete,\n } = useConversationActions({ renameChatTitle, deleteChat })\n\n const openConversation = (id: string) => {\n if (editingId.value) {\n return\n }\n localChatId.value = id\n navigate('chat')\n }\n\n const isCurrentConversation = (conversation: Conversation) => {\n return localChatId.value === conversation.id\n }\n\n const getLastMessage = (\n messages: UIChatMessage[],\n role: 'user' | 'assistant',\n ) => {\n return stripMarkdown(\n getTextPart(messages.filter((m) => m.role === role).slice(-1)[0]) ||\n '',\n )\n }\n\n const startEdit = (conversation: Conversation) => {\n startEditConversation(\n conversation,\n getLastMessage(conversation.messages, 'assistant'),\n )\n }\n\n const { openDialogConfirm } = useDialogConfirm()\n\n // GDPR B.3 — bulk \"delete my conversations\", available to anonymous\n // sessions too (the host wires the endpoint through the profile context)\n const profile = inject(ChatbotProfileContextKey, undefined)\n const isErasingConversations = ref(false)\n const handleEraseAll = async () => {\n const eraseConversations = profile?.eraseConversations\n if (!eraseConversations) {\n return\n }\n const proceed = await openDialogConfirm({\n title: $t('action.deleteMyConversations'),\n questionLabel: $t('message.deleteMyConversationsConfirm'),\n })\n if (!proceed) {\n return\n }\n isErasingConversations.value = true\n try {\n await eraseConversations()\n conversations.value = []\n startNewChat()\n } catch {\n // Same policy as single delete: fail silently and reconcile\n // with the server state\n store.loadConversations(props.agentId)\n } finally {\n isErasingConversations.value = false\n }\n }\n</script>\n\n<template>\n <div class=\"flex flex-col flex-1 min-h-0 relative\">\n <!-- Loading skeleton -->\n <div\n v-if=\"isLoadingConversations && conversations.length === 0\"\n class=\"flex flex-col gap-8 p-16 vv-skeleton\">\n <div\n v-for=\"i in 5\"\n :key=\"i\"\n class=\"vv-skeleton__item rounded-md h-64\" />\n </div>\n\n <!-- Empty state -->\n <div\n v-else-if=\"conversations.length === 0\"\n class=\"flex flex-col flex-1 items-center justify-center gap-12 p-24 text-center\">\n <div\n class=\"w-64 h-64 rounded-full bg-surface-1 border border-surface-3 flex items-center justify-center\">\n <VvIcon name=\"ri:chat-3-line\" class=\"w-28 h-28 text-word-4\" />\n </div>\n <div class=\"flex flex-col gap-4\">\n <strong class=\"text-16 font-semibold text-word-1\">\n {{ $t('message.noConversations') }}\n </strong>\n <span class=\"text-14 text-word-3 leading-relaxed\">\n {{ $t('message.noConversationsHint') }}\n </span>\n </div>\n <VvButton\n modifiers=\"primary rounded\"\n icon=\"ri:add-line\"\n class=\"mt-8\"\n :label=\"$t('action.startNewChat')\"\n @click=\"startNewChat()\" />\n </div>\n\n <!-- Conversation list -->\n <ul\n v-else\n class=\"flex flex-col gap-8 overflow-y-auto p-16 pb-64 light-scrollbar\">\n <li v-for=\"conversation in conversations\" :key=\"conversation.id\">\n <button\n type=\"button\"\n class=\"w-full block rounded-md border border-surface-3 p-12 text-left text-14 leading-relaxed cursor-pointer transition-colors hover:border-surface-5 hover:bg-surface-1 focus-within:border-word\"\n :class=\"{\n 'border-brand bg-surface-1':\n isCurrentConversation(conversation),\n }\"\n @click=\"openConversation(conversation.id)\">\n <div class=\"flex gap-8\">\n <template v-if=\"editingId === conversation.id\">\n <VvInputText\n v-model=\"editingTitle\"\n class=\"flex-1\"\n modifiers=\"compact\"\n autofocus\n select-on-focus\n :maxlength=\"255\"\n :placeholder=\"$t('placeholder.insert')\"\n @click.stop\n @keydown=\"\n onRenameKeydown($event, conversation.id)\n \" />\n <VvButtonGroup modifiers=\"compact\">\n <VvButton\n icon=\"ri:save-line\"\n :title=\"$t('action.save')\"\n modifiers=\"action-quiet-small\"\n @click.stop=\"\n confirmEdit(conversation.id)\n \" />\n <VvButton\n icon=\"ri:close-line\"\n :title=\"$t('action.cancel')\"\n modifiers=\"action-quiet-small\"\n @click.stop=\"cancelEdit()\" />\n </VvButtonGroup>\n </template>\n <template v-else>\n <strong class=\"font-bold truncate block flex-1\">\n {{\n stripMarkdown(conversation.title) ||\n getLastMessage(\n conversation.messages,\n 'assistant',\n )\n }}\n </strong>\n <PkRelativeTime\n class=\"text-word-4 text-smaller shrink-0\"\n :date=\"conversation.lastMessageAt\" />\n <div @click.stop>\n <VvDropdown\n v-bind=\"{\n placement: 'bottom-end',\n modifiers: 'menu',\n flip: true,\n offset: 3,\n strategy: 'fixed',\n }\">\n <VvButton\n icon=\"ri:more-2-fill\"\n :title=\"$t('action.moreActions')\"\n modifiers=\"action-quiet-small\" />\n <template #items>\n <VvDropdownAction\n @click=\"startEdit(conversation)\">\n <VvIcon name=\"ri:pencil-line\" />\n {{ $t('action.renameChat') }}\n </VvDropdownAction>\n <VvDropdownAction\n @click=\"\n handleDelete(conversation.id)\n \">\n <VvIcon name=\"ri:delete-bin-line\" />\n {{ $t('action.delete') }}\n </VvDropdownAction>\n </template>\n </VvDropdown>\n </div>\n </template>\n </div>\n <span\n v-if=\"editingId !== conversation.id\"\n class=\"text-12 text-word-4 line-clamp-2\">\n {{\n stripMarkdown(conversation.summary) ||\n getLastMessage(conversation.messages, 'user')\n }}\n </span>\n </button>\n </li>\n </ul>\n\n <!-- Sticky \"new chat\" CTA (hidden on empty state, which has its own CTA) -->\n <div\n v-if=\"conversations.length > 0\"\n class=\"absolute bottom-0 left-0 right-0 flex flex-col items-center gap-4 px-16 pb-16 pt-32 pointer-events-none\"\n :style=\"{\n background:\n 'linear-gradient(to top, var(--color-surface) 55%, transparent)',\n }\">\n <VvButton\n class=\"text-14 pointer-events-auto\"\n modifiers=\"primary rounded\"\n icon=\"ri:add-line\"\n :label=\"$t('action.startNewChat')\"\n @click.stop=\"startNewChat()\" />\n <VvButton\n v-if=\"profile?.eraseConversations\"\n class=\"text-12 pointer-events-auto\"\n modifiers=\"action-quiet-danger\"\n icon=\"ri:delete-bin-line\"\n :loading=\"isErasingConversations\"\n :disabled=\"isErasingConversations\"\n :label=\"$t('action.deleteMyConversations')\"\n @click.stop=\"handleEraseAll()\" />\n </div>\n </div>\n</template>\n"],"mappings":"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"}
|