@kodaris/krubble-app-components 1.0.85 → 1.0.87
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/chatbot.d.ts +33 -42
- package/dist/chatbot.d.ts.map +1 -1
- package/dist/chatbot.js +132 -109
- package/dist/chatbot.js.map +1 -1
- package/dist/krubble-app.bundled.js +132 -109
- package/dist/krubble-app.bundled.js.map +1 -1
- package/dist/krubble-app.bundled.min.js +18 -40
- package/dist/krubble-app.bundled.min.js.map +1 -1
- package/dist/krubble-app.umd.js +132 -109
- package/dist/krubble-app.umd.js.map +1 -1
- package/dist/krubble-app.umd.min.js +9 -31
- package/dist/krubble-app.umd.min.js.map +1 -1
- package/package.json +1 -1
package/dist/chatbot.d.ts
CHANGED
|
@@ -1,47 +1,33 @@
|
|
|
1
1
|
import { LitElement } from 'lit';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* pass through unchanged. The chatbot displays images
|
|
6
|
-
* view URL from `
|
|
3
|
+
* A conversation file stored on the server (a chat attachment: image / library /
|
|
4
|
+
* prompt / memory). Mirrors the backend ConversationFileViewDto, so files loaded
|
|
5
|
+
* with a conversation pass through unchanged. The chatbot displays images by
|
|
6
|
+
* building a view URL from `conversationFileID` at render time.
|
|
7
7
|
*/
|
|
8
|
-
export interface
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
export interface KRChatbotConversationFile {
|
|
9
|
+
conversationFileID: number;
|
|
10
|
+
administratorID?: number;
|
|
11
|
+
type?: string;
|
|
12
|
+
subType?: string;
|
|
13
|
+
path?: string;
|
|
14
|
+
folder?: string;
|
|
12
15
|
mimeType?: string;
|
|
13
|
-
lastModified?: string;
|
|
14
16
|
fileType?: string;
|
|
15
|
-
|
|
16
|
-
created?: string;
|
|
17
|
-
entityID?: number;
|
|
18
|
-
entityType?: string;
|
|
19
|
-
geoCoordinates?: string;
|
|
20
|
-
imageDetectionType?: string;
|
|
17
|
+
niceName?: string;
|
|
21
18
|
name?: string;
|
|
22
19
|
description?: string;
|
|
23
|
-
creator?: string;
|
|
24
20
|
keywords?: string;
|
|
25
|
-
subType?: string;
|
|
26
|
-
alt?: string;
|
|
27
21
|
metadata?: string;
|
|
28
|
-
deleted?: boolean;
|
|
29
|
-
extraText?: string;
|
|
30
|
-
emailID?: number;
|
|
31
|
-
aiPimSource?: string;
|
|
32
|
-
aiPimLastParsed?: string;
|
|
33
|
-
aiPimStatus?: string;
|
|
34
|
-
folder?: string;
|
|
35
22
|
status?: string;
|
|
36
23
|
extra1?: string;
|
|
37
24
|
extra2?: string;
|
|
38
25
|
extra3?: string;
|
|
39
26
|
extra4?: string;
|
|
40
27
|
extra5?: string;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
aiPimEnabled?: boolean;
|
|
28
|
+
extraText?: string;
|
|
29
|
+
created?: string;
|
|
30
|
+
lastModified?: string;
|
|
45
31
|
}
|
|
46
32
|
/**
|
|
47
33
|
* Chat message interface. Field names mirror the backend
|
|
@@ -51,8 +37,8 @@ export interface KRChatbotMessage {
|
|
|
51
37
|
type: 'user' | 'assistant';
|
|
52
38
|
content: string;
|
|
53
39
|
reasoning?: string;
|
|
54
|
-
/**
|
|
55
|
-
|
|
40
|
+
/** Conversation files attached to this message. */
|
|
41
|
+
conversationFiles?: KRChatbotConversationFile[];
|
|
56
42
|
}
|
|
57
43
|
/**
|
|
58
44
|
* INTERNAL-ONLY debug telemetry carried by a `TOKEN_USAGE` SSE event's `data`.
|
|
@@ -166,7 +152,7 @@ export interface KRChatbotSkill {
|
|
|
166
152
|
export type KRChatbotSend = (params: {
|
|
167
153
|
message: string;
|
|
168
154
|
messages: KRChatbotMessage[];
|
|
169
|
-
|
|
155
|
+
conversationFiles: File[];
|
|
170
156
|
}) => Promise<Response>;
|
|
171
157
|
/**
|
|
172
158
|
* AI chatbot component with SSE streaming.
|
|
@@ -251,14 +237,6 @@ export declare class KRChatbot extends LitElement {
|
|
|
251
237
|
* from the Kodaris Bedrock conversation endpoints. Set this to override.
|
|
252
238
|
*/
|
|
253
239
|
send: KRChatbotSend | null;
|
|
254
|
-
/**
|
|
255
|
-
* Callback function called when the user clears the conversation.
|
|
256
|
-
* Must return a Promise — messages are only cleared if it resolves.
|
|
257
|
-
*
|
|
258
|
-
* Optional — when not set, the chatbot uses its built-in default that clears
|
|
259
|
-
* the Kodaris Bedrock conversation state. Set this to override.
|
|
260
|
-
*/
|
|
261
|
-
clear: (() => Promise<unknown>) | null;
|
|
262
240
|
/**
|
|
263
241
|
* Callback function called on init to load existing conversation messages.
|
|
264
242
|
* Must return a Promise that resolves with an array of KRChatbotMessage.
|
|
@@ -301,6 +279,20 @@ export declare class KRChatbot extends LitElement {
|
|
|
301
279
|
* full page or panel region.
|
|
302
280
|
*/
|
|
303
281
|
variant: 'floating' | 'inline';
|
|
282
|
+
/**
|
|
283
|
+
* The conversation this chatbot's turns target (backend `conversationID`).
|
|
284
|
+
*
|
|
285
|
+
* - Set → every turn is sent with this `conversationID`, so the chat continues
|
|
286
|
+
* that specific conversation.
|
|
287
|
+
* - Unset → the first turn is sent with `createNew: true` (a fresh
|
|
288
|
+
* conversation); the component then resolves the new conversation's id (via
|
|
289
|
+
* `/conversation/last`) and pins it here so the rest of the session stays one
|
|
290
|
+
* conversation instead of spawning a new one per message.
|
|
291
|
+
*
|
|
292
|
+
* Only used by the built-in `send` default; a custom `send` owns its own
|
|
293
|
+
* targeting.
|
|
294
|
+
*/
|
|
295
|
+
conversationId: number | null;
|
|
304
296
|
private _inputValue;
|
|
305
297
|
private _isStreaming;
|
|
306
298
|
private _error;
|
|
@@ -338,7 +330,7 @@ export declare class KRChatbot extends LitElement {
|
|
|
338
330
|
/** True while the user is dragging the debug drawer's resize handle. */
|
|
339
331
|
private _isDebugResizing;
|
|
340
332
|
/** Images staged in the composer, before the message is sent. */
|
|
341
|
-
private
|
|
333
|
+
private _pendingConversationFiles;
|
|
342
334
|
/** True while a file is being dragged over the panel (shows the drop overlay). */
|
|
343
335
|
private _isDraggingFile;
|
|
344
336
|
/** Whether the `/` skill menu is open above the composer. */
|
|
@@ -514,7 +506,6 @@ export declare class KRChatbot extends LitElement {
|
|
|
514
506
|
*/
|
|
515
507
|
private _send;
|
|
516
508
|
private _handleStop;
|
|
517
|
-
private _handleClear;
|
|
518
509
|
private _handleMessagesScroll;
|
|
519
510
|
private _handleErrorDismiss;
|
|
520
511
|
private _handleContextWarningDismiss;
|
package/dist/chatbot.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatbot.d.ts","sourceRoot":"","sources":["../src/chatbot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,KAAK,CAAC;AAYrD;;;;;GAKG;AACH,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"chatbot.d.ts","sourceRoot":"","sources":["../src/chatbot.ts"],"names":[],"mappings":"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"}
|
package/dist/chatbot.js
CHANGED
|
@@ -103,14 +103,6 @@ let KRChatbot = class KRChatbot extends LitElement {
|
|
|
103
103
|
* from the Kodaris Bedrock conversation endpoints. Set this to override.
|
|
104
104
|
*/
|
|
105
105
|
this.send = null;
|
|
106
|
-
/**
|
|
107
|
-
* Callback function called when the user clears the conversation.
|
|
108
|
-
* Must return a Promise — messages are only cleared if it resolves.
|
|
109
|
-
*
|
|
110
|
-
* Optional — when not set, the chatbot uses its built-in default that clears
|
|
111
|
-
* the Kodaris Bedrock conversation state. Set this to override.
|
|
112
|
-
*/
|
|
113
|
-
this.clear = null;
|
|
114
106
|
/**
|
|
115
107
|
* Callback function called on init to load existing conversation messages.
|
|
116
108
|
* Must return a Promise that resolves with an array of KRChatbotMessage.
|
|
@@ -153,6 +145,20 @@ let KRChatbot = class KRChatbot extends LitElement {
|
|
|
153
145
|
* full page or panel region.
|
|
154
146
|
*/
|
|
155
147
|
this.variant = 'floating';
|
|
148
|
+
/**
|
|
149
|
+
* The conversation this chatbot's turns target (backend `conversationID`).
|
|
150
|
+
*
|
|
151
|
+
* - Set → every turn is sent with this `conversationID`, so the chat continues
|
|
152
|
+
* that specific conversation.
|
|
153
|
+
* - Unset → the first turn is sent with `createNew: true` (a fresh
|
|
154
|
+
* conversation); the component then resolves the new conversation's id (via
|
|
155
|
+
* `/conversation/last`) and pins it here so the rest of the session stays one
|
|
156
|
+
* conversation instead of spawning a new one per message.
|
|
157
|
+
*
|
|
158
|
+
* Only used by the built-in `send` default; a custom `send` owns its own
|
|
159
|
+
* targeting.
|
|
160
|
+
*/
|
|
161
|
+
this.conversationId = null;
|
|
156
162
|
// --- @state (internal) ---
|
|
157
163
|
this._inputValue = '';
|
|
158
164
|
this._isStreaming = false;
|
|
@@ -191,7 +197,7 @@ let KRChatbot = class KRChatbot extends LitElement {
|
|
|
191
197
|
/** True while the user is dragging the debug drawer's resize handle. */
|
|
192
198
|
this._isDebugResizing = false;
|
|
193
199
|
/** Images staged in the composer, before the message is sent. */
|
|
194
|
-
this.
|
|
200
|
+
this._pendingConversationFiles = [];
|
|
195
201
|
/** True while a file is being dragged over the panel (shows the drop overlay). */
|
|
196
202
|
this._isDraggingFile = false;
|
|
197
203
|
/** Whether the `/` skill menu is open above the composer. */
|
|
@@ -317,16 +323,32 @@ let KRChatbot = class KRChatbot extends LitElement {
|
|
|
317
323
|
// --- Lifecycle ---
|
|
318
324
|
connectedCallback() {
|
|
319
325
|
super.connectedCallback();
|
|
320
|
-
// Default to loading
|
|
321
|
-
//
|
|
322
|
-
//
|
|
323
|
-
//
|
|
326
|
+
// Default to loading a specific conversation's messages when the consumer
|
|
327
|
+
// hasn't provided their own `load`. With `conversationId` set we rebuild that
|
|
328
|
+
// conversation from `/conversation/{id}/messages`; with none set there's
|
|
329
|
+
// nothing to resume, so start empty. Rows already match KRChatbotMessage
|
|
330
|
+
// ({ type, content }); we only parse each row's `conversationFileIDs` (a JSON
|
|
331
|
+
// array string of ids) into the `conversationFiles` the render iterates.
|
|
324
332
|
if (!this.load) {
|
|
325
|
-
this.load = () =>
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
.
|
|
333
|
+
this.load = () => {
|
|
334
|
+
if (this.conversationId == null) {
|
|
335
|
+
return Promise.resolve([]);
|
|
336
|
+
}
|
|
337
|
+
return KRHttp.fetch({
|
|
338
|
+
url: `/api/system/conversation/${this.conversationId}/messages`,
|
|
339
|
+
})
|
|
340
|
+
.then((r) => r.json())
|
|
341
|
+
.then((res) => (res?.data || []).map((msg) => {
|
|
342
|
+
try {
|
|
343
|
+
const ids = JSON.parse(msg.conversationFileIDs || '[]');
|
|
344
|
+
if (ids.length) {
|
|
345
|
+
msg.conversationFiles = ids.map((id) => ({ conversationFileID: id }));
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
catch { /* no/invalid attachments — leave empty */ }
|
|
349
|
+
return msg;
|
|
350
|
+
}));
|
|
351
|
+
};
|
|
330
352
|
}
|
|
331
353
|
this.load().then((messages) => {
|
|
332
354
|
if (messages && messages.length) {
|
|
@@ -361,7 +383,7 @@ let KRChatbot = class KRChatbot extends LitElement {
|
|
|
361
383
|
document.removeEventListener('mousemove', this._handleMouseMove);
|
|
362
384
|
document.removeEventListener('mouseup', this._handleMouseUp);
|
|
363
385
|
// Release any object URLs still held by staged attachments.
|
|
364
|
-
this.
|
|
386
|
+
this._pendingConversationFiles.forEach((p) => URL.revokeObjectURL(p.previewUrl));
|
|
365
387
|
}
|
|
366
388
|
updated(changed) {
|
|
367
389
|
if (changed.has('messages')) {
|
|
@@ -694,7 +716,7 @@ let KRChatbot = class KRChatbot extends LitElement {
|
|
|
694
716
|
this._skillMenuOpened = false;
|
|
695
717
|
this._send({
|
|
696
718
|
message: '/test-context-warning',
|
|
697
|
-
|
|
719
|
+
conversationFiles: [],
|
|
698
720
|
});
|
|
699
721
|
return;
|
|
700
722
|
}
|
|
@@ -702,7 +724,7 @@ let KRChatbot = class KRChatbot extends LitElement {
|
|
|
702
724
|
this._skillMenuOpened = false;
|
|
703
725
|
this._send({
|
|
704
726
|
message: '/test-context-limit',
|
|
705
|
-
|
|
727
|
+
conversationFiles: [],
|
|
706
728
|
});
|
|
707
729
|
return;
|
|
708
730
|
}
|
|
@@ -1019,6 +1041,10 @@ let KRChatbot = class KRChatbot extends LitElement {
|
|
|
1019
1041
|
}
|
|
1020
1042
|
// --- Attachments ---
|
|
1021
1043
|
_openFilePicker() {
|
|
1044
|
+
// Close the skill/attachment menu — opening the OS file picker is the end of
|
|
1045
|
+
// the menu interaction, and the picker is a separate window so the menu would
|
|
1046
|
+
// otherwise linger open behind it (and after a file is chosen).
|
|
1047
|
+
this._skillMenuOpened = false;
|
|
1022
1048
|
this._fileInputEl?.click();
|
|
1023
1049
|
}
|
|
1024
1050
|
_handleFileInputChange(e) {
|
|
@@ -1100,49 +1126,49 @@ let KRChatbot = class KRChatbot extends LitElement {
|
|
|
1100
1126
|
name: file.name,
|
|
1101
1127
|
previewUrl: URL.createObjectURL(file),
|
|
1102
1128
|
};
|
|
1103
|
-
this.
|
|
1129
|
+
this._pendingConversationFiles = [...this._pendingConversationFiles, pending];
|
|
1104
1130
|
});
|
|
1105
1131
|
}
|
|
1106
1132
|
_removePending(localId) {
|
|
1107
|
-
const target = this.
|
|
1133
|
+
const target = this._pendingConversationFiles.find((p) => p.localId === localId);
|
|
1108
1134
|
if (target) {
|
|
1109
1135
|
URL.revokeObjectURL(target.previewUrl);
|
|
1110
1136
|
}
|
|
1111
|
-
this.
|
|
1137
|
+
this._pendingConversationFiles = this._pendingConversationFiles.filter((p) => p.localId !== localId);
|
|
1112
1138
|
}
|
|
1113
1139
|
_clearPending() {
|
|
1114
|
-
this.
|
|
1115
|
-
this.
|
|
1140
|
+
this._pendingConversationFiles.forEach((p) => URL.revokeObjectURL(p.previewUrl));
|
|
1141
|
+
this._pendingConversationFiles = [];
|
|
1116
1142
|
}
|
|
1117
1143
|
/** Open the shared full-screen previewer for a message image. */
|
|
1118
1144
|
_openImage(img) {
|
|
1119
1145
|
KRFilePreview.open({
|
|
1120
|
-
src: `/api/system/
|
|
1146
|
+
src: `/api/system/conversationFile/${img.conversationFileID}/view`,
|
|
1121
1147
|
name: img.niceName || 'image',
|
|
1122
1148
|
});
|
|
1123
1149
|
}
|
|
1124
1150
|
/** Whether the send button is active: needs text or at least one image. */
|
|
1125
1151
|
_canSend() {
|
|
1126
|
-
return Boolean(this._inputValue.trim()) || this.
|
|
1152
|
+
return Boolean(this._inputValue.trim()) || this._pendingConversationFiles.length > 0;
|
|
1127
1153
|
}
|
|
1128
1154
|
_handleSubmit() {
|
|
1129
1155
|
if (this._isStreaming) {
|
|
1130
1156
|
return;
|
|
1131
1157
|
}
|
|
1132
1158
|
const messageText = this._inputValue.trim();
|
|
1133
|
-
const pending = this.
|
|
1159
|
+
const pending = this._pendingConversationFiles;
|
|
1134
1160
|
// Allow sending an image with no text, but require at least one of them.
|
|
1135
1161
|
if (!messageText && !pending.length) {
|
|
1136
1162
|
return;
|
|
1137
1163
|
}
|
|
1138
1164
|
// The raw files sent to the backend. Sent images are shown once the
|
|
1139
|
-
// conversation reloads and they come back as stored
|
|
1165
|
+
// conversation reloads and they come back as stored conversation files; the
|
|
1140
1166
|
// just-sent message itself carries text only.
|
|
1141
|
-
const
|
|
1167
|
+
const conversationFiles = pending.map((p) => p.file);
|
|
1142
1168
|
const submitEvent = new CustomEvent('message-submit', {
|
|
1143
1169
|
detail: {
|
|
1144
1170
|
message: messageText,
|
|
1145
|
-
|
|
1171
|
+
conversationFiles,
|
|
1146
1172
|
},
|
|
1147
1173
|
bubbles: true,
|
|
1148
1174
|
composed: true,
|
|
@@ -1154,7 +1180,7 @@ let KRChatbot = class KRChatbot extends LitElement {
|
|
|
1154
1180
|
}
|
|
1155
1181
|
this._send({
|
|
1156
1182
|
message: messageText,
|
|
1157
|
-
|
|
1183
|
+
conversationFiles
|
|
1158
1184
|
});
|
|
1159
1185
|
}
|
|
1160
1186
|
/**
|
|
@@ -1174,8 +1200,8 @@ let KRChatbot = class KRChatbot extends LitElement {
|
|
|
1174
1200
|
this._error = '';
|
|
1175
1201
|
this._userHasScrolledUp = false;
|
|
1176
1202
|
// Clear the composer and release its preview object URLs.
|
|
1177
|
-
this.
|
|
1178
|
-
this.
|
|
1203
|
+
this._pendingConversationFiles.forEach((p) => URL.revokeObjectURL(p.previewUrl));
|
|
1204
|
+
this._pendingConversationFiles = [];
|
|
1179
1205
|
// Reset textarea height
|
|
1180
1206
|
if (this._inputEl) {
|
|
1181
1207
|
this._inputEl.style.height = 'auto';
|
|
@@ -1211,30 +1237,74 @@ let KRChatbot = class KRChatbot extends LitElement {
|
|
|
1211
1237
|
// the consumer hasn't provided their own `send`.
|
|
1212
1238
|
if (!this.send) {
|
|
1213
1239
|
this.send = (params) => {
|
|
1214
|
-
//
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1240
|
+
// Images are upload-first: each file is stored as a conversation file
|
|
1241
|
+
// (type LIBRARY — the format lives in mimeType), then the resulting
|
|
1242
|
+
// conversationFileIDs are attached to the message via `fileIds` on the
|
|
1243
|
+
// normal JSON stream call. There is no multipart chat endpoint. With no
|
|
1244
|
+
// images the upload resolves to an empty list immediately; a failed
|
|
1245
|
+
// upload is dropped so an undefined id never reaches `fileIds`.
|
|
1246
|
+
let uploaded = Promise.resolve([]);
|
|
1247
|
+
if (params.conversationFiles.length) {
|
|
1248
|
+
uploaded = Promise.all(params.conversationFiles.map((file) => {
|
|
1249
|
+
const form = new FormData();
|
|
1250
|
+
form.append('file', file);
|
|
1251
|
+
form.append('type', 'LIBRARY');
|
|
1252
|
+
form.append('niceName', file.name);
|
|
1253
|
+
return KRHttp.fetch({
|
|
1254
|
+
url: '/api/system/conversationFile/upload',
|
|
1255
|
+
method: 'POST',
|
|
1256
|
+
body: form,
|
|
1257
|
+
})
|
|
1258
|
+
.then((r) => r.json())
|
|
1259
|
+
.then((res) => res?.data?.conversationFileID);
|
|
1260
|
+
})).then((ids) => ids.filter((id) => typeof id === 'number'));
|
|
1261
|
+
}
|
|
1262
|
+
return uploaded.then((fileIds) => {
|
|
1263
|
+
// Conversation targeting: continue `conversationId` when set, else
|
|
1264
|
+
// start a fresh conversation (createNew) for this turn. The pin below
|
|
1265
|
+
// means createNew only fires on the very first untargeted turn.
|
|
1266
|
+
const body = {
|
|
1267
|
+
userText: params.message,
|
|
1268
|
+
fileIds,
|
|
1269
|
+
};
|
|
1270
|
+
if (this.conversationId != null) {
|
|
1271
|
+
body.conversationID = this.conversationId;
|
|
1272
|
+
}
|
|
1273
|
+
else {
|
|
1274
|
+
body.createNew = true;
|
|
1275
|
+
}
|
|
1219
1276
|
return KRHttp.fetch({
|
|
1220
|
-
url: '/api/system/integration/aws/bedrock/stream/
|
|
1277
|
+
url: '/api/system/integration/aws/bedrock/stream/invokeModelForConversationWithState',
|
|
1221
1278
|
method: 'POST',
|
|
1222
1279
|
headers: { Accept: 'text/event-stream' },
|
|
1223
|
-
body
|
|
1280
|
+
body,
|
|
1281
|
+
}).then((response) => {
|
|
1282
|
+
// Pin the session to the conversation this turn used. The stream
|
|
1283
|
+
// doesn't echo the resolved id, so when we let the server create one
|
|
1284
|
+
// (no conversationId set) we resolve it via `/last` and keep it, so
|
|
1285
|
+
// subsequent turns continue this conversation instead of each sending
|
|
1286
|
+
// createNew and spawning a new one. Best-effort, fire-and-forget: a
|
|
1287
|
+
// failure leaves it unpinned and the next turn resolves server-side.
|
|
1288
|
+
if (this.conversationId == null) {
|
|
1289
|
+
KRHttp.fetch({ url: '/api/system/conversation/last' })
|
|
1290
|
+
.then((r) => r.json())
|
|
1291
|
+
.then((res) => {
|
|
1292
|
+
const id = res?.data?.conversationID;
|
|
1293
|
+
if (typeof id === 'number') {
|
|
1294
|
+
this.conversationId = id;
|
|
1295
|
+
}
|
|
1296
|
+
})
|
|
1297
|
+
.catch(() => { });
|
|
1298
|
+
}
|
|
1299
|
+
return response;
|
|
1224
1300
|
});
|
|
1225
|
-
}
|
|
1226
|
-
return KRHttp.fetch({
|
|
1227
|
-
url: '/api/system/integration/aws/bedrock/stream/invokeModelForConversationWithState',
|
|
1228
|
-
method: 'POST',
|
|
1229
|
-
headers: { Accept: 'text/event-stream' },
|
|
1230
|
-
body: { userText: params.message },
|
|
1231
1301
|
});
|
|
1232
1302
|
};
|
|
1233
1303
|
}
|
|
1234
1304
|
this.send({
|
|
1235
1305
|
message: params.message,
|
|
1236
1306
|
messages: this.messages.slice(0, -1),
|
|
1237
|
-
|
|
1307
|
+
conversationFiles: params.conversationFiles,
|
|
1238
1308
|
}).then((response) => {
|
|
1239
1309
|
if (!response.ok) {
|
|
1240
1310
|
this._handleStreamError('Request failed: ' + response.status);
|
|
@@ -1261,35 +1331,6 @@ let KRChatbot = class KRChatbot extends LitElement {
|
|
|
1261
1331
|
}
|
|
1262
1332
|
this._isStreaming = false;
|
|
1263
1333
|
}
|
|
1264
|
-
_handleClear() {
|
|
1265
|
-
// Default to clearing the Kodaris Bedrock conversation state when the consumer
|
|
1266
|
-
// hasn't provided their own `clear`.
|
|
1267
|
-
if (!this.clear) {
|
|
1268
|
-
this.clear = () => KRHttp.fetch({
|
|
1269
|
-
url: '/api/system/integration/aws/bedrock/clearConversationWithState',
|
|
1270
|
-
method: 'POST',
|
|
1271
|
-
});
|
|
1272
|
-
}
|
|
1273
|
-
this.clear().then(() => {
|
|
1274
|
-
if (this._reader) {
|
|
1275
|
-
this._reader.cancel();
|
|
1276
|
-
this._reader = null;
|
|
1277
|
-
}
|
|
1278
|
-
this.messages = [];
|
|
1279
|
-
this._isStreaming = false;
|
|
1280
|
-
this._error = '';
|
|
1281
|
-
this._inputValue = '';
|
|
1282
|
-
this._userHasScrolledUp = false;
|
|
1283
|
-
// Reset conversation-scoped context + telemetry state for the new convo.
|
|
1284
|
-
this._contextWarning = '';
|
|
1285
|
-
this._contextLimitReached = false;
|
|
1286
|
-
this._contextLimitMessage = '';
|
|
1287
|
-
this._telemetry = null;
|
|
1288
|
-
this._iterationLog = [];
|
|
1289
|
-
this._cacheCheckpoints = {};
|
|
1290
|
-
this._saveState();
|
|
1291
|
-
});
|
|
1292
|
-
}
|
|
1293
1334
|
_handleMessagesScroll(e) {
|
|
1294
1335
|
const container = e.target;
|
|
1295
1336
|
const distanceFromBottom = container.scrollHeight - container.scrollTop - container.clientHeight;
|
|
@@ -1899,28 +1940,6 @@ let KRChatbot = class KRChatbot extends LitElement {
|
|
|
1899
1940
|
</svg>
|
|
1900
1941
|
</button>
|
|
1901
1942
|
` : nothing}
|
|
1902
|
-
${this.messages.length > 0 ? html `
|
|
1903
|
-
<button
|
|
1904
|
-
class="header-action"
|
|
1905
|
-
@click=${this._handleClear}
|
|
1906
|
-
title="Clear conversation"
|
|
1907
|
-
>
|
|
1908
|
-
<svg
|
|
1909
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
1910
|
-
fill="none"
|
|
1911
|
-
viewBox="0 0 24 24"
|
|
1912
|
-
stroke-width="1.5"
|
|
1913
|
-
stroke="currentColor"
|
|
1914
|
-
class="header-action-icon"
|
|
1915
|
-
>
|
|
1916
|
-
<path
|
|
1917
|
-
stroke-linecap="round"
|
|
1918
|
-
stroke-linejoin="round"
|
|
1919
|
-
d="m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0"
|
|
1920
|
-
/>
|
|
1921
|
-
</svg>
|
|
1922
|
-
</button>
|
|
1923
|
-
` : nothing}
|
|
1924
1943
|
${this.variant === 'inline' ? nothing : html `
|
|
1925
1944
|
<button
|
|
1926
1945
|
class="header-action"
|
|
@@ -1965,9 +1984,9 @@ let KRChatbot = class KRChatbot extends LitElement {
|
|
|
1965
1984
|
<div class="reasoning-content">${msg.reasoning}</div>
|
|
1966
1985
|
</details>
|
|
1967
1986
|
` : nothing}
|
|
1968
|
-
${msg.
|
|
1987
|
+
${msg.conversationFiles && msg.conversationFiles.length ? html `
|
|
1969
1988
|
<div class="attachments">
|
|
1970
|
-
${msg.
|
|
1989
|
+
${msg.conversationFiles.map((img) => html `
|
|
1971
1990
|
<button
|
|
1972
1991
|
class="attachment"
|
|
1973
1992
|
type="button"
|
|
@@ -1975,7 +1994,7 @@ let KRChatbot = class KRChatbot extends LitElement {
|
|
|
1975
1994
|
@click=${() => this._openImage(img)}
|
|
1976
1995
|
>
|
|
1977
1996
|
<img
|
|
1978
|
-
src="/api/system/
|
|
1997
|
+
src="/api/system/conversationFile/${img.conversationFileID}/view"
|
|
1979
1998
|
alt=${img.niceName || ''}
|
|
1980
1999
|
/>
|
|
1981
2000
|
</button>
|
|
@@ -2093,9 +2112,9 @@ let KRChatbot = class KRChatbot extends LitElement {
|
|
|
2093
2112
|
` : nothing}
|
|
2094
2113
|
|
|
2095
2114
|
<div class="footer">
|
|
2096
|
-
${this.
|
|
2115
|
+
${this._pendingConversationFiles.length ? html `
|
|
2097
2116
|
<div class="composer-attachments">
|
|
2098
|
-
${repeat(this.
|
|
2117
|
+
${repeat(this._pendingConversationFiles, (p) => p.localId, (p) => html `
|
|
2099
2118
|
<div class="chip">
|
|
2100
2119
|
<img src=${p.previewUrl} alt=${p.name} />
|
|
2101
2120
|
<button
|
|
@@ -3385,9 +3404,6 @@ KRChatbot.styles = css `
|
|
|
3385
3404
|
__decorate([
|
|
3386
3405
|
property({ attribute: false })
|
|
3387
3406
|
], KRChatbot.prototype, "send", void 0);
|
|
3388
|
-
__decorate([
|
|
3389
|
-
property({ attribute: false })
|
|
3390
|
-
], KRChatbot.prototype, "clear", void 0);
|
|
3391
3407
|
__decorate([
|
|
3392
3408
|
property({ attribute: false })
|
|
3393
3409
|
], KRChatbot.prototype, "load", void 0);
|
|
@@ -3419,6 +3435,13 @@ __decorate([
|
|
|
3419
3435
|
reflect: true
|
|
3420
3436
|
})
|
|
3421
3437
|
], KRChatbot.prototype, "variant", void 0);
|
|
3438
|
+
__decorate([
|
|
3439
|
+
property({
|
|
3440
|
+
type: Number,
|
|
3441
|
+
attribute: 'conversation-id',
|
|
3442
|
+
reflect: true
|
|
3443
|
+
})
|
|
3444
|
+
], KRChatbot.prototype, "conversationId", void 0);
|
|
3422
3445
|
__decorate([
|
|
3423
3446
|
state()
|
|
3424
3447
|
], KRChatbot.prototype, "_inputValue", void 0);
|
|
@@ -3457,7 +3480,7 @@ __decorate([
|
|
|
3457
3480
|
], KRChatbot.prototype, "_isDebugResizing", void 0);
|
|
3458
3481
|
__decorate([
|
|
3459
3482
|
state()
|
|
3460
|
-
], KRChatbot.prototype, "
|
|
3483
|
+
], KRChatbot.prototype, "_pendingConversationFiles", void 0);
|
|
3461
3484
|
__decorate([
|
|
3462
3485
|
state()
|
|
3463
3486
|
], KRChatbot.prototype, "_isDraggingFile", void 0);
|