@kodaris/krubble-app-components 1.0.117 → 1.0.118
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 +32 -0
- package/dist/chatbot.d.ts.map +1 -1
- package/dist/chatbot.js +165 -8
- package/dist/chatbot.js.map +1 -1
- package/dist/krubble-app.bundled.js +166 -10
- package/dist/krubble-app.bundled.js.map +1 -1
- package/dist/krubble-app.bundled.min.js +2 -3
- package/dist/krubble-app.bundled.min.js.map +1 -1
- package/dist/krubble-app.umd.js +166 -10
- package/dist/krubble-app.umd.js.map +1 -1
- package/dist/krubble-app.umd.min.js +14 -15
- package/dist/krubble-app.umd.min.js.map +1 -1
- package/dist/screen-nav.d.ts.map +1 -1
- package/dist/screen-nav.js +1 -2
- package/dist/screen-nav.js.map +1 -1
- package/package.json +1 -1
package/dist/chatbot.d.ts
CHANGED
|
@@ -346,6 +346,21 @@ export declare class KRChatbot extends LitElement {
|
|
|
346
346
|
private _reader;
|
|
347
347
|
private _decoder;
|
|
348
348
|
private _buffer;
|
|
349
|
+
/**
|
|
350
|
+
* True once the current turn ended cleanly (a `finished:true` chunk arrived).
|
|
351
|
+
* Distinguishes a real completion from a dropped stream: if the SSE stream
|
|
352
|
+
* closes (`result.done`) while this is still false, the turn is NOT over — the
|
|
353
|
+
* connection dropped (5-min emitter timeout, tab was backgrounded, network
|
|
354
|
+
* blip) — so we reconnect instead of unlocking the composer. Reset per turn.
|
|
355
|
+
*/
|
|
356
|
+
private _turnFinishedCleanly;
|
|
357
|
+
/**
|
|
358
|
+
* Consecutive failed reconnect attempts for the current drop. Bounds the retry
|
|
359
|
+
* loop so a genuinely dead turn (server gone) can't spin forever — after the
|
|
360
|
+
* cap we give up and finish the turn. Reset when a reconnect succeeds or a new
|
|
361
|
+
* turn starts.
|
|
362
|
+
*/
|
|
363
|
+
private _reconnectAttempts;
|
|
349
364
|
private _userHasScrolledUp;
|
|
350
365
|
private _isDragging;
|
|
351
366
|
private _isResizing;
|
|
@@ -910,6 +925,23 @@ export declare class KRChatbot extends LitElement {
|
|
|
910
925
|
private _handleDrawerResizeMouseMove;
|
|
911
926
|
private _handleDrawerResizeMouseUp;
|
|
912
927
|
private _readStreamChunk;
|
|
928
|
+
/**
|
|
929
|
+
* Reconnect to an in-flight turn after the SSE stream dropped without finishing
|
|
930
|
+
* (5-min emitter timeout, tab backgrounded, network blip). Hits the read-only
|
|
931
|
+
* `/stream/attach/{conversationID}` endpoint, which re-attaches a fresh SSE
|
|
932
|
+
* connection to the still-running server-side turn without starting anything new.
|
|
933
|
+
*
|
|
934
|
+
* - 200 with a body → resume reading; the turn's events keep flowing (events
|
|
935
|
+
* emitted during the gap are not replayed, so the live text may jump forward —
|
|
936
|
+
* the full transcript reconciles from the DB when the turn ends).
|
|
937
|
+
* - 204 → no live turn: it already finished server-side while we were
|
|
938
|
+
* disconnected. Reload the transcript so the final answer appears, then unlock.
|
|
939
|
+
* - failure / retry cap hit → give up and finish so the composer never wedges.
|
|
940
|
+
*
|
|
941
|
+
* The composer stays locked (`_isStreaming` untouched) throughout, so the input
|
|
942
|
+
* never looks ready while the AI is still working.
|
|
943
|
+
*/
|
|
944
|
+
private _reconnectStream;
|
|
913
945
|
/**
|
|
914
946
|
* The assistant bubble streamed text should append to. Returns the last message
|
|
915
947
|
* when it's already an assistant bubble; otherwise (the last message is a tool
|
package/dist/chatbot.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatbot.d.ts","sourceRoot":"","sources":["../src/chatbot.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"chatbot.d.ts","sourceRoot":"","sources":["../src/chatbot.ts"],"names":[],"mappings":"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"}
|
package/dist/chatbot.js
CHANGED
|
@@ -153,6 +153,21 @@ let KRChatbot = class KRChatbot extends LitElement {
|
|
|
153
153
|
this._reader = null;
|
|
154
154
|
this._decoder = new TextDecoder();
|
|
155
155
|
this._buffer = '';
|
|
156
|
+
/**
|
|
157
|
+
* True once the current turn ended cleanly (a `finished:true` chunk arrived).
|
|
158
|
+
* Distinguishes a real completion from a dropped stream: if the SSE stream
|
|
159
|
+
* closes (`result.done`) while this is still false, the turn is NOT over — the
|
|
160
|
+
* connection dropped (5-min emitter timeout, tab was backgrounded, network
|
|
161
|
+
* blip) — so we reconnect instead of unlocking the composer. Reset per turn.
|
|
162
|
+
*/
|
|
163
|
+
this._turnFinishedCleanly = false;
|
|
164
|
+
/**
|
|
165
|
+
* Consecutive failed reconnect attempts for the current drop. Bounds the retry
|
|
166
|
+
* loop so a genuinely dead turn (server gone) can't spin forever — after the
|
|
167
|
+
* cap we give up and finish the turn. Reset when a reconnect succeeds or a new
|
|
168
|
+
* turn starts.
|
|
169
|
+
*/
|
|
170
|
+
this._reconnectAttempts = 0;
|
|
156
171
|
this._userHasScrolledUp = false;
|
|
157
172
|
this._isDragging = false;
|
|
158
173
|
this._isResizing = false;
|
|
@@ -612,6 +627,20 @@ let KRChatbot = class KRChatbot extends LitElement {
|
|
|
612
627
|
data,
|
|
613
628
|
});
|
|
614
629
|
}
|
|
630
|
+
// Persisted reasoning row — the DB stores the model's thinking as its own
|
|
631
|
+
// row with the text in `content` and type "reasoning". Live, reasoning
|
|
632
|
+
// instead arrives as REASONING_PART deltas accumulated onto an assistant
|
|
633
|
+
// bubble's `reasoning` property, which is the ONLY shape the render shows
|
|
634
|
+
// (via msg.reasoning). Map the DB row into that same shape — an assistant
|
|
635
|
+
// bubble carrying the text in `reasoning` — so reloaded/reconciled
|
|
636
|
+
// reasoning renders identically to live instead of vanishing.
|
|
637
|
+
if (msg.type === 'reasoning') {
|
|
638
|
+
return Promise.resolve({
|
|
639
|
+
type: 'assistant',
|
|
640
|
+
content: '',
|
|
641
|
+
reasoning: msg.content || '',
|
|
642
|
+
});
|
|
643
|
+
}
|
|
615
644
|
// A persisted approve/deny record — content is {outcome, tools:[...]}.
|
|
616
645
|
// Keep the type, parse content into `data`; the render reads msg.data.*.
|
|
617
646
|
if (msg.type === 'action_decision') {
|
|
@@ -654,6 +683,16 @@ let KRChatbot = class KRChatbot extends LitElement {
|
|
|
654
683
|
if (messages && messages.length) {
|
|
655
684
|
this.messages = messages;
|
|
656
685
|
}
|
|
686
|
+
// A turn may still be running server-side for this conversation (the page was
|
|
687
|
+
// reloaded mid-turn, or opened on another device while a turn streams). After
|
|
688
|
+
// the transcript loads, try to attach to that live turn: _reconnectStream hits
|
|
689
|
+
// the read-only attach endpoint — 200 resumes streaming (locks the composer +
|
|
690
|
+
// shows the typing indicator so the user knows the AI is still working), 204
|
|
691
|
+
// means nothing is running (stays idle). Only meaningful with a pinned
|
|
692
|
+
// conversation and the built-in stream (a custom `send` owns its own turns).
|
|
693
|
+
if (this.conversationId && !this._isStreaming) {
|
|
694
|
+
this._reconnectStream();
|
|
695
|
+
}
|
|
657
696
|
}).catch(() => { });
|
|
658
697
|
// Fetch the framework config on load (debugTelemetryEnabled, v2ChatEnabled,
|
|
659
698
|
// registryServer). debugTelemetryEnabled gates the debug affordances and is
|
|
@@ -1693,6 +1732,10 @@ let KRChatbot = class KRChatbot extends LitElement {
|
|
|
1693
1732
|
content: '',
|
|
1694
1733
|
}];
|
|
1695
1734
|
this._isStreaming = true;
|
|
1735
|
+
// Fresh turn: not yet finished, no reconnects used. These gate the drop-vs-done
|
|
1736
|
+
// decision in _readStreamChunk when the stream closes.
|
|
1737
|
+
this._turnFinishedCleanly = false;
|
|
1738
|
+
this._reconnectAttempts = 0;
|
|
1696
1739
|
// Scroll user's message to the top (Gemini-style). The runway (min-height =
|
|
1697
1740
|
// viewport) goes on the agent-turn WRAPPER, not an individual message — the
|
|
1698
1741
|
// whole turn (reasoning, tool lines, text, decision) streams inside that one
|
|
@@ -1903,6 +1946,10 @@ let KRChatbot = class KRChatbot extends LitElement {
|
|
|
1903
1946
|
const btn = this._messagesEl?.querySelector(`.confirmation__btn[data-decision="${decision}"]`);
|
|
1904
1947
|
btn?.showLoading();
|
|
1905
1948
|
this._isStreaming = true;
|
|
1949
|
+
// Fresh turn (confirmation decision runs a model turn too): reset the
|
|
1950
|
+
// drop-vs-done gates used by _readStreamChunk.
|
|
1951
|
+
this._turnFinishedCleanly = false;
|
|
1952
|
+
this._reconnectAttempts = 0;
|
|
1906
1953
|
this._userHasScrolledUp = false;
|
|
1907
1954
|
this.send({
|
|
1908
1955
|
message: '',
|
|
@@ -2207,11 +2254,18 @@ let KRChatbot = class KRChatbot extends LitElement {
|
|
|
2207
2254
|
}
|
|
2208
2255
|
this._reader.read().then((result) => {
|
|
2209
2256
|
if (result.done) {
|
|
2210
|
-
//
|
|
2211
|
-
//
|
|
2212
|
-
//
|
|
2213
|
-
//
|
|
2214
|
-
|
|
2257
|
+
// The stream closed. Two very different cases:
|
|
2258
|
+
// 1. A `finished:true` chunk already arrived (_turnFinishedCleanly) — the
|
|
2259
|
+
// turn is genuinely over; finishing was already handled below. Nothing to do.
|
|
2260
|
+
// 2. No finished chunk yet — the connection DROPPED mid-turn (5-min emitter
|
|
2261
|
+
// timeout, tab backgrounded, network blip) but the server-side turn is
|
|
2262
|
+
// still running. Do NOT unlock the composer (that's the old bug that made
|
|
2263
|
+
// the input look ready while the AI was still working). Reconnect to the
|
|
2264
|
+
// live stream and keep receiving events.
|
|
2265
|
+
if (this._turnFinishedCleanly) {
|
|
2266
|
+
return;
|
|
2267
|
+
}
|
|
2268
|
+
this._reconnectStream();
|
|
2215
2269
|
return;
|
|
2216
2270
|
}
|
|
2217
2271
|
this._buffer = this._buffer + this._decoder.decode(result.value, { stream: true });
|
|
@@ -2364,7 +2418,9 @@ let KRChatbot = class KRChatbot extends LitElement {
|
|
|
2364
2418
|
}
|
|
2365
2419
|
if (data.finished) {
|
|
2366
2420
|
// Primary unlock signal: the turn is over and the server released
|
|
2367
|
-
// the turn lock. The SSE stream closes right after this chunk.
|
|
2421
|
+
// the turn lock. The SSE stream closes right after this chunk. Mark
|
|
2422
|
+
// it clean so the imminent `result.done` doesn't trigger a reconnect.
|
|
2423
|
+
this._turnFinishedCleanly = true;
|
|
2368
2424
|
this._finishStream();
|
|
2369
2425
|
}
|
|
2370
2426
|
}
|
|
@@ -2376,9 +2432,110 @@ let KRChatbot = class KRChatbot extends LitElement {
|
|
|
2376
2432
|
}
|
|
2377
2433
|
this._readStreamChunk();
|
|
2378
2434
|
}).catch((err) => {
|
|
2379
|
-
if (err.name
|
|
2380
|
-
|
|
2435
|
+
if (err.name === 'AbortError') {
|
|
2436
|
+
return;
|
|
2437
|
+
}
|
|
2438
|
+
// A read error mid-turn is a drop, not a completion — reconnect (same as a
|
|
2439
|
+
// clean `done` without a finished chunk) unless the turn already finished.
|
|
2440
|
+
if (!this._turnFinishedCleanly) {
|
|
2441
|
+
this._reconnectStream();
|
|
2442
|
+
return;
|
|
2443
|
+
}
|
|
2444
|
+
this._handleStreamError(err.message);
|
|
2445
|
+
});
|
|
2446
|
+
}
|
|
2447
|
+
/**
|
|
2448
|
+
* Reconnect to an in-flight turn after the SSE stream dropped without finishing
|
|
2449
|
+
* (5-min emitter timeout, tab backgrounded, network blip). Hits the read-only
|
|
2450
|
+
* `/stream/attach/{conversationID}` endpoint, which re-attaches a fresh SSE
|
|
2451
|
+
* connection to the still-running server-side turn without starting anything new.
|
|
2452
|
+
*
|
|
2453
|
+
* - 200 with a body → resume reading; the turn's events keep flowing (events
|
|
2454
|
+
* emitted during the gap are not replayed, so the live text may jump forward —
|
|
2455
|
+
* the full transcript reconciles from the DB when the turn ends).
|
|
2456
|
+
* - 204 → no live turn: it already finished server-side while we were
|
|
2457
|
+
* disconnected. Reload the transcript so the final answer appears, then unlock.
|
|
2458
|
+
* - failure / retry cap hit → give up and finish so the composer never wedges.
|
|
2459
|
+
*
|
|
2460
|
+
* The composer stays locked (`_isStreaming` untouched) throughout, so the input
|
|
2461
|
+
* never looks ready while the AI is still working.
|
|
2462
|
+
*/
|
|
2463
|
+
_reconnectStream() {
|
|
2464
|
+
// Without a pinned conversation there's nothing to re-attach to (a custom
|
|
2465
|
+
// `send` owns its own targeting). Fall back to finishing.
|
|
2466
|
+
if (!this.conversationId) {
|
|
2467
|
+
this._finishStream();
|
|
2468
|
+
return;
|
|
2469
|
+
}
|
|
2470
|
+
// Bound the retries so a genuinely dead turn can't loop forever.
|
|
2471
|
+
if (this._reconnectAttempts >= 5) {
|
|
2472
|
+
this._handleStreamError('Lost connection to the assistant. Please reload the conversation.');
|
|
2473
|
+
return;
|
|
2474
|
+
}
|
|
2475
|
+
this._reconnectAttempts = this._reconnectAttempts + 1;
|
|
2476
|
+
KRHttp.fetch({
|
|
2477
|
+
url: `/api/system/integration/aws/bedrock/stream/attach/${this.conversationId}`,
|
|
2478
|
+
method: 'GET',
|
|
2479
|
+
headers: { Accept: 'text/event-stream' },
|
|
2480
|
+
}).then((response) => {
|
|
2481
|
+
// 204 No Content: the turn finished server-side during the gap. Pull the
|
|
2482
|
+
// final transcript from the DB (via the same `load` callback the component
|
|
2483
|
+
// initializes with) so the answer that streamed during the disconnect
|
|
2484
|
+
// appears, then unlock.
|
|
2485
|
+
if (response.status === 204) {
|
|
2486
|
+
this._reconnectAttempts = 0;
|
|
2487
|
+
if (this.load) {
|
|
2488
|
+
this.load().then((messages) => {
|
|
2489
|
+
this.messages = messages;
|
|
2490
|
+
this.requestUpdate();
|
|
2491
|
+
}).catch(() => {
|
|
2492
|
+
// Reload failed — leave the transcript as-is; the user can refresh manually.
|
|
2493
|
+
});
|
|
2494
|
+
}
|
|
2495
|
+
this._finishStream();
|
|
2496
|
+
return;
|
|
2497
|
+
}
|
|
2498
|
+
if (!response.ok || !response.body) {
|
|
2499
|
+
// Transient failure — back off and try again on the same drop.
|
|
2500
|
+
setTimeout(() => this._reconnectStream(), 1000);
|
|
2501
|
+
return;
|
|
2502
|
+
}
|
|
2503
|
+
// Re-attached to the live turn: reset the retry counter and resume reading
|
|
2504
|
+
// into the same buffer/decoder from the fresh stream. Mark streaming so the
|
|
2505
|
+
// composer locks and the typing indicator shows — load-triggered attaches (a
|
|
2506
|
+
// page reloaded mid-turn) start with _isStreaming false, so this is what
|
|
2507
|
+
// surfaces "the AI is still working"; on a mid-session drop it's already true
|
|
2508
|
+
// (a no-op).
|
|
2509
|
+
this._reconnectAttempts = 0;
|
|
2510
|
+
this._isStreaming = true;
|
|
2511
|
+
this._reader = response.body.getReader();
|
|
2512
|
+
this._decoder = new TextDecoder();
|
|
2513
|
+
this._buffer = '';
|
|
2514
|
+
// Close the gap: events the turn emitted between the drop and this re-attach
|
|
2515
|
+
// aren't replayed on the live stream. Every COMPLETED iteration during the
|
|
2516
|
+
// gap was persisted (assistant text, tool_use/tool_result rows), so reload the
|
|
2517
|
+
// transcript from the DB to backfill them, THEN start reading live. Ordering
|
|
2518
|
+
// matters — the reader buffers incoming bytes until _readStreamChunk runs, so
|
|
2519
|
+
// starting live only after the async reload resolves prevents the reload from
|
|
2520
|
+
// clobbering freshly-streamed chunks. Only the current in-flight iteration's
|
|
2521
|
+
// partial text is missing from the reload; it streams live from here.
|
|
2522
|
+
if (this.load) {
|
|
2523
|
+
this.load().then((messages) => {
|
|
2524
|
+
this.messages = messages;
|
|
2525
|
+
this.requestUpdate();
|
|
2526
|
+
this._readStreamChunk();
|
|
2527
|
+
}).catch(() => {
|
|
2528
|
+
// Reload failed — go live anyway; the gap's completed iterations just
|
|
2529
|
+
// won't show until the next full reload, but the turn keeps streaming.
|
|
2530
|
+
this._readStreamChunk();
|
|
2531
|
+
});
|
|
2532
|
+
}
|
|
2533
|
+
else {
|
|
2534
|
+
this._readStreamChunk();
|
|
2381
2535
|
}
|
|
2536
|
+
}).catch(() => {
|
|
2537
|
+
// Network error reaching the attach endpoint — back off and retry.
|
|
2538
|
+
setTimeout(() => this._reconnectStream(), 1000);
|
|
2382
2539
|
});
|
|
2383
2540
|
}
|
|
2384
2541
|
/**
|