blun-king-cli 9.1.42 → 9.1.44

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
@@ -9,7 +9,7 @@ Installation
9
9
  ------------
10
10
  Die geprüfte Version exakt global installieren:
11
11
 
12
- npm install -g blun-king-cli@9.1.36
12
+ npm install -g blun-king-cli@9.1.44
13
13
 
14
14
  Start
15
15
  -----
@@ -20,6 +20,17 @@ Start
20
20
  Beide Startbefehle verwenden dieselbe Version, dasselbe Konto, dasselbe Modell
21
21
  und dieselben Befehle.
22
22
 
23
+ Zug-Wächter
24
+ -----------
25
+ Läuft ein Zug 20 Minuten ohne neues Werkzeugergebnis, meldet die Konsole den
26
+ Stand auch im verbundenen Telegram-Kanal. Fünf aufeinanderfolgende identische
27
+ fehlgeschlagene Werkzeugaufrufe beenden den Zug mit einer Fehlermeldung.
28
+
29
+ Die Grenzwerte lassen sich vor dem Start über diese Umgebungsvariablen ändern:
30
+
31
+ BLUN_TURN_WATCHDOG_IDLE_MINUTES
32
+ BLUN_TURN_WATCHDOG_MAX_FAILED_REPETITIONS
33
+
23
34
  Nachweisbare Arbeitsabläufe
24
35
  ---------------------------
25
36
 
package/README.md CHANGED
@@ -9,7 +9,7 @@ Voraussetzung ist Node.js 24.15 oder neuer. Die geprüfte Version wird exakt
9
9
  installiert:
10
10
 
11
11
  ```powershell
12
- npm install -g blun-king-cli@9.1.36
12
+ npm install -g blun-king-cli@9.1.44
13
13
  ```
14
14
 
15
15
  ## Reproduzierbares Staging und Packen
@@ -35,6 +35,16 @@ an. Version, Konto, Modell und Befehle sind ansonsten identisch. Der Unterschied
35
35
  gilt nur für den laufenden Prozess; die gespeicherte
36
36
  Plugin-Konfiguration wird nicht umgeschrieben.
37
37
 
38
+ ## Zug-Wächter
39
+
40
+ Läuft ein Zug 20 Minuten ohne neues Werkzeugergebnis, meldet die Konsole den
41
+ Stand auch im verbundenen Telegram-Kanal. Fünf aufeinanderfolgende identische
42
+ fehlgeschlagene Werkzeugaufrufe beenden den Zug mit einer Fehlermeldung.
43
+
44
+ Die Grenzwerte lassen sich vor dem Start mit
45
+ `BLUN_TURN_WATCHDOG_IDLE_MINUTES` und
46
+ `BLUN_TURN_WATCHDOG_MAX_FAILED_REPETITIONS` ändern.
47
+
38
48
  Beim ersten Start werden das Telegram-Plugin und die mitgelieferten Skills
39
49
  eingerichtet. Die Anmeldung erfolgt anschließend in der
40
50
  Konsole mit `/login` über den BLUN-OAuth-Server. Das Paket erzeugt keine
package/bin/blun.js CHANGED
File without changes
File without changes
package/bin/king.js CHANGED
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -46,14 +46,25 @@ const SEMVER_PATTERN = new RegExp(
46
46
  + `(?:-(${SEMVER_IDENTIFIER}(?:\\.${SEMVER_IDENTIFIER})*))?`
47
47
  + '(?:\\+([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?$',
48
48
  );
49
+ const LEGACY_MANIFEST_KEYS = Object.freeze([
50
+ 'install',
51
+ 'latest',
52
+ 'minSupported',
53
+ 'name',
54
+ 'notesUrl',
55
+ 'releasedAt',
56
+ ]);
49
57
  const MANIFEST_KEYS = Object.freeze([
50
58
  'install',
51
59
  'latest',
52
60
  'minSupported',
53
61
  'name',
54
62
  'notesUrl',
63
+ 'releaseNotes',
55
64
  'releasedAt',
56
65
  ]);
66
+ const RELEASE_NOTES_MAX_COUNT = 8;
67
+ const RELEASE_NOTE_MAX_BYTES = 240;
57
68
  const ENDPOINT_LIMITS = new Map([
58
69
  [REGISTRY_URL, 1024 * 1024],
59
70
  [FALLBACK_MANIFEST_URL, 64 * 1024],
@@ -193,9 +204,23 @@ function isIsoTimestamp(value) {
193
204
  && date.getUTCSeconds() === Number(match[6]);
194
205
  }
195
206
 
207
+ function parseReleaseNotes(value) {
208
+ if (!Array.isArray(value) || value.length > RELEASE_NOTES_MAX_COUNT) return undefined;
209
+ const notes = [];
210
+ for (const note of value) {
211
+ if (!isBoundedText(note, RELEASE_NOTE_MAX_BYTES)) return undefined;
212
+ notes.push(note);
213
+ }
214
+ return Object.freeze(notes);
215
+ }
216
+
196
217
  function parseFallbackManifest(value) {
197
- const record = exactDataRecord(value, MANIFEST_KEYS);
218
+ const record = exactDataRecord(value, MANIFEST_KEYS)
219
+ || exactDataRecord(value, LEGACY_MANIFEST_KEYS);
198
220
  const notesUrl = record ? canonicalOfficialNotesUrl(record.notesUrl) : undefined;
221
+ const releaseNotes = record && Object.hasOwn(record, 'releaseNotes')
222
+ ? parseReleaseNotes(record.releaseNotes)
223
+ : undefined;
199
224
  if (!record
200
225
  || record.name !== PACKAGE_NAME
201
226
  || !parseSemver(record.latest)
@@ -203,6 +228,7 @@ function parseFallbackManifest(value) {
203
228
  || compareSemver(record.minSupported, record.latest) === 1
204
229
  || !isIsoTimestamp(record.releasedAt)
205
230
  || !notesUrl
231
+ || (Object.hasOwn(record, 'releaseNotes') && releaseNotes === undefined)
206
232
  || !isBoundedText(record.install, 256)) {
207
233
  return undefined;
208
234
  }
@@ -212,6 +238,7 @@ function parseFallbackManifest(value) {
212
238
  minSupported: record.minSupported,
213
239
  releasedAt: record.releasedAt,
214
240
  notesUrl,
241
+ ...(releaseNotes === undefined ? {} : { releaseNotes }),
215
242
  install: record.install,
216
243
  });
217
244
  }
@@ -244,7 +271,14 @@ function resolveEffectiveRelease(currentVersion, registryTags, fallbackManifest)
244
271
  if (compareSemver(version, currentVersion) <= 0) return undefined;
245
272
 
246
273
  if (validFallback && compareSemver(validFallback.latest, version) === 0) {
247
- return { channel: 'stable', version, notesUrl: validFallback.notesUrl };
274
+ return {
275
+ channel: 'stable',
276
+ version,
277
+ notesUrl: validFallback.notesUrl,
278
+ ...(validFallback.releaseNotes === undefined
279
+ ? {}
280
+ : { releaseNotes: validFallback.releaseNotes }),
281
+ };
248
282
  }
249
283
  return { channel: 'stable', version };
250
284
  }
@@ -496,7 +530,13 @@ function clearPendingUpdate(blunDir) {
496
530
  fs.rmSync(pendingUpdatePath(blunDir), { force: true });
497
531
  }
498
532
 
499
- function writeCoreInstallSuccess(blunDir, fromVersion, version, now = Date.now()) {
533
+ function writeCoreInstallSuccess(
534
+ blunDir,
535
+ fromVersion,
536
+ version,
537
+ releaseNotes,
538
+ now = Date.now(),
539
+ ) {
500
540
  if (!parseSemver(fromVersion) || !parseSemver(version)) {
501
541
  throw new Error('INVALID_UPDATE_VERSION');
502
542
  }
@@ -515,6 +555,7 @@ function writeCoreInstallSuccess(blunDir, fromVersion, version, now = Date.now()
515
555
  lastSuccess: {
516
556
  version,
517
557
  fromVersion,
558
+ ...(releaseNotes === undefined ? {} : { releaseNotes }),
518
559
  installedAt: new Date(now).toISOString(),
519
560
  notifiedAt: null,
520
561
  },
@@ -1456,6 +1497,7 @@ async function runUpdateFlow(options, explicitUpdate) {
1456
1497
  blunDir,
1457
1498
  currentVersion,
1458
1499
  release.version,
1500
+ release.releaseNotes,
1459
1501
  (options.now || Date.now)(),
1460
1502
  );
1461
1503
  } catch {