blun-king-cli 9.1.399 → 9.1.401
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/LIESMICH.txt +14 -0
- package/README.md +24 -0
- package/bin/session-replay-policy.cjs +20 -0
- package/blun.mjs +19 -4
- package/package.json +1 -1
package/LIESMICH.txt
CHANGED
|
@@ -407,6 +407,20 @@ Profilspeicher erhalten. Damit kann eine gemessene Projektregel später wieder
|
|
|
407
407
|
aufgerufen werden, ohne als vermeintlich allgemeine Regel in fachfremde Projekte
|
|
408
408
|
zu gelangen.
|
|
409
409
|
|
|
410
|
+
Reaktionsfähige Wiederaufnahme großer Sitzungen
|
|
411
|
+
-----------------------------------------------
|
|
412
|
+
|
|
413
|
+
Ab BLUN King 9.1.400 spielt die TUI gespeicherte Sitzungsverläufe weiterhin
|
|
414
|
+
vollständig ab, gibt bei großen Wiederaufnahmen aber nach jeweils 30 Datensätzen
|
|
415
|
+
kurz an die Node-Ereignisschleife ab. Dadurch können Anzeige, Eingabe und
|
|
416
|
+
Zustandsleiste während des Wiederaufbaus reagieren, statt bis zum letzten
|
|
417
|
+
Verlaufseintrag zu warten.
|
|
418
|
+
|
|
419
|
+
Es werden keine Datensätze gekürzt, übersprungen oder aus dem gespeicherten
|
|
420
|
+
Verlauf entfernt. Nach dem letzten Datensatz erfolgt keine unnötige zusätzliche
|
|
421
|
+
Unterbrechung; kleine Sitzungen behalten damit praktisch ihr bisheriges
|
|
422
|
+
Startverhalten.
|
|
423
|
+
|
|
410
424
|
Keine doppelte Telegram-Antwort ohne neue Nachricht
|
|
411
425
|
---------------------------------------------------
|
|
412
426
|
|
package/README.md
CHANGED
|
@@ -415,6 +415,30 @@ Profilspeicher erhalten. Damit kann eine gemessene Projektregel später wieder
|
|
|
415
415
|
aufgerufen werden, ohne als vermeintlich allgemeine Regel in fachfremde Projekte
|
|
416
416
|
zu gelangen.
|
|
417
417
|
|
|
418
|
+
## Sofort sichtbarer Antwortbeginn
|
|
419
|
+
|
|
420
|
+
Ab BLUN King 9.1.401 rendert die TUI das erste Textfragment eines neuen Zuges
|
|
421
|
+
oder eines neuen Antwortabschnitts sofort. Es wartet nicht mehr auf den ersten
|
|
422
|
+
Intervall-Timer und übernimmt auch keinen Render-Zeitstempel aus dem vorherigen
|
|
423
|
+
Zug. Dadurch erscheint der Antwortbeginn ohne vermeidbare Pause in der Konsole.
|
|
424
|
+
|
|
425
|
+
Weitere Text-, Denk- und Werkzeugfragmente bleiben adaptiv gebündelt. Kurze
|
|
426
|
+
Ausgaben behalten ihren schnellen Takt; bei langen Ausgaben wächst das Intervall
|
|
427
|
+
weiterhin stufenweise, damit vollständige Neurenderings die TUI nicht ausbremsen.
|
|
428
|
+
|
|
429
|
+
## Reaktionsfähige Wiederaufnahme großer Sitzungen
|
|
430
|
+
|
|
431
|
+
Ab BLUN King 9.1.400 spielt die TUI gespeicherte Sitzungsverläufe weiterhin
|
|
432
|
+
vollständig ab, gibt bei großen Wiederaufnahmen aber nach jeweils 30 Datensätzen
|
|
433
|
+
kurz an die Node-Ereignisschleife ab. Dadurch können Anzeige, Eingabe und
|
|
434
|
+
Zustandsleiste während des Wiederaufbaus reagieren, statt bis zum letzten
|
|
435
|
+
Verlaufseintrag zu warten.
|
|
436
|
+
|
|
437
|
+
Es werden keine Datensätze gekürzt, übersprungen oder aus dem gespeicherten
|
|
438
|
+
Verlauf entfernt. Nach dem letzten Datensatz erfolgt keine unnötige zusätzliche
|
|
439
|
+
Unterbrechung; kleine Sitzungen behalten damit praktisch ihr bisheriges
|
|
440
|
+
Startverhalten.
|
|
441
|
+
|
|
418
442
|
## Keine doppelte Telegram-Antwort ohne neue Nachricht
|
|
419
443
|
|
|
420
444
|
Ab BLUN King 9.1.398 prüft jeder Text-Ausgangspfad vor dem Senden die jüngste
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const SESSION_REPLAY_BATCH_RECORDS = 30;
|
|
4
|
+
|
|
5
|
+
function shouldYieldSessionReplay(renderedRecords, totalRecords) {
|
|
6
|
+
if (!Number.isSafeInteger(renderedRecords) || renderedRecords < 1) return false;
|
|
7
|
+
if (!Number.isSafeInteger(totalRecords) || totalRecords < 1) return false;
|
|
8
|
+
return renderedRecords < totalRecords
|
|
9
|
+
&& renderedRecords % SESSION_REPLAY_BATCH_RECORDS === 0;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function yieldSessionReplayControl(schedule = setImmediate) {
|
|
13
|
+
return new Promise((resolve) => schedule(resolve));
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
module.exports = {
|
|
17
|
+
SESSION_REPLAY_BATCH_RECORDS,
|
|
18
|
+
shouldYieldSessionReplay,
|
|
19
|
+
yieldSessionReplayControl,
|
|
20
|
+
};
|
package/blun.mjs
CHANGED
|
@@ -509231,6 +509231,10 @@ function isRecord(value) {
|
|
|
509231
509231
|
}
|
|
509232
509232
|
//#endregion
|
|
509233
509233
|
//#region src/tui/controllers/session-replay.ts
|
|
509234
|
+
const {
|
|
509235
|
+
shouldYieldSessionReplay,
|
|
509236
|
+
yieldSessionReplayControl
|
|
509237
|
+
} = createRequire(import.meta.url)("./bin/session-replay-policy.cjs");
|
|
509234
509238
|
function extractBashTag(text, tag) {
|
|
509235
509239
|
const match = new RegExp(`<${tag}>([\\s\\S]*?)</${tag}>`).exec(text);
|
|
509236
509240
|
return match?.[1] === void 0 ? void 0 : unescapeBashXml(match[1]);
|
|
@@ -509252,7 +509256,7 @@ var SessionReplayRenderer = class {
|
|
|
509252
509256
|
return false;
|
|
509253
509257
|
}
|
|
509254
509258
|
this.hydrateSnapshot(main);
|
|
509255
|
-
this.renderRecords(main);
|
|
509259
|
+
await this.renderRecords(main);
|
|
509256
509260
|
this.applyTerminalBackgroundAgentStatuses(main);
|
|
509257
509261
|
this.host.mergeAllTurnSteps();
|
|
509258
509262
|
return true;
|
|
@@ -509318,9 +509322,12 @@ var SessionReplayRenderer = class {
|
|
|
509318
509322
|
state.footer.setBackgroundCounts(countActiveBackgroundTasks(sessionEventHandler.backgroundTasks));
|
|
509319
509323
|
state.ui.requestRender();
|
|
509320
509324
|
}
|
|
509321
|
-
renderRecords(agent) {
|
|
509325
|
+
async renderRecords(agent) {
|
|
509322
509326
|
const context = createReplayRenderContext();
|
|
509323
|
-
for (const record of agent.replay
|
|
509327
|
+
for (const [recordIndex, record] of agent.replay.entries()) {
|
|
509328
|
+
this.renderRecord(context, record);
|
|
509329
|
+
if (shouldYieldSessionReplay(recordIndex + 1, agent.replay.length)) await yieldSessionReplayControl();
|
|
509330
|
+
}
|
|
509324
509331
|
this.flushAssistant(context);
|
|
509325
509332
|
this.cleanupRuntime(context);
|
|
509326
509333
|
}
|
|
@@ -511052,6 +511059,7 @@ var StreamingUIController = class {
|
|
|
511052
511059
|
this._liveTurnStartedAtMs = Date.now();
|
|
511053
511060
|
this._liveOutputTokens.reset();
|
|
511054
511061
|
this._countedToolCallIds.clear();
|
|
511062
|
+
this.lastFlushAt = void 0;
|
|
511055
511063
|
}
|
|
511056
511064
|
getLiveActivityMetrics() {
|
|
511057
511065
|
return {
|
|
@@ -511107,7 +511115,10 @@ var StreamingUIController = class {
|
|
|
511107
511115
|
}
|
|
511108
511116
|
appendAssistantDelta(delta) {
|
|
511109
511117
|
this.recordLiveOutput(delta);
|
|
511110
|
-
if (this._streamingBlock === null)
|
|
511118
|
+
if (this._streamingBlock === null) {
|
|
511119
|
+
this.onStreamingTextStart();
|
|
511120
|
+
this.lastFlushAt = void 0;
|
|
511121
|
+
}
|
|
511111
511122
|
this._assistantDraft += delta;
|
|
511112
511123
|
this.pendingAssistantFlush = true;
|
|
511113
511124
|
}
|
|
@@ -511395,6 +511406,10 @@ var StreamingUIController = class {
|
|
|
511395
511406
|
scheduleFlush() {
|
|
511396
511407
|
if (!this.hasPending()) return;
|
|
511397
511408
|
if (this.flushTimer !== void 0) return;
|
|
511409
|
+
if (this.lastFlushAt === void 0) {
|
|
511410
|
+
this.flush();
|
|
511411
|
+
return;
|
|
511412
|
+
}
|
|
511398
511413
|
const flushIntervalMs = resolveStreamingFlushInterval({
|
|
511399
511414
|
assistantChars: this._assistantDraft.length,
|
|
511400
511415
|
thinkingChars: this._thinkingDraft.length,
|