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 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) this.renderRecord(context, record);
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) this.onStreamingTextStart();
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,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blun-king-cli",
3
- "version": "9.1.399",
3
+ "version": "9.1.401",
4
4
  "description": "BLUN CLI - your own AI agent with a Telegram channel. Get it done. With BLUN.",
5
5
  "license": "MIT",
6
6
  "bin": {