blun-king-cli 9.1.513 → 9.1.514

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 9.1.514 - 2026-08-31
4
+
5
+ - Rejects nonnumeric Telegram message IDs and malformed precomputed chat hashes before they can enter the content-free delivery lifecycle journal.
6
+ - Closes a fail-open diagnostic edge where a forged queue envelope could smuggle text through the field named `message_id`, even though normal Telegram message IDs are positive decimal numbers.
7
+ - Adds a negative privacy regression and keeps the complete package suite green at 133 tests without changing Telegram routing, queueing, acknowledgement, or replay behavior.
8
+
3
9
  ## 9.1.513 - 2026-08-31
4
10
 
5
11
  - Adds one bounded Telegram delivery lifecycle journal that connects bridge receipt, TUI injection, queue class, attempt, acceptance, commit or restore, quarantine, and durable acknowledgement by message ID.
package/LIESMICH.txt CHANGED
@@ -9,18 +9,11 @@ Installation
9
9
  ------------
10
10
  Die geprüfte Version exakt global installieren:
11
11
 
12
- npm install -g blun-king-cli@9.1.513
12
+ npm install -g blun-king-cli@9.1.514
13
13
 
14
14
  AgentSpine 0.10.1
15
15
  -----------------
16
- Version 9.1.513 liefert AgentSpine 0.10.1 als neue inhaltsadressierte
17
- Pluginfassung. Der Preflight prueft weiterhin jede aktive Host-Anweisungsdatei
18
- race-sicher und bindet SHA-256 sowie Dateiidentitaet an den Zug, dupliziert den
19
- bereits vom Host geladenen Volltext aber nicht mehr in den Laufzeitkontext.
20
- Die reale 15.519-Byte-CLAUDE.md-Probe blieb dadurch bei 5.667 injizierten Byte.
21
- Der Stand enthaelt ausserdem den selbstheilenden Persona- und Beziehungsgraphen,
22
- die begrenzte Telegram-Mnemo-Abfrage und eine sichtbare Fuenf-Sekunden-Grenze
23
- fuer lokale Beziehungsabfragen.
16
+ Version 9.1.514 enthält weiterhin AgentSpine 0.10.1 als inhaltsadressierte Pluginfassung. Der Preflight prüft jede aktive Host-Anweisungsdatei weiterhin race-sicher und bindet SHA-256 sowie Dateiidentität an den Zug, dupliziert den bereits vom Host geladenen Volltext aber nicht im Laufzeitkontext. Die reale Probe mit einer 15.519 Byte großen `CLAUDE.md` blieb dadurch bei 5.667 injizierten Byte. Der Stand enthält außerdem den selbstheilenden Persona- und Beziehungsgraphen, die begrenzte Telegram-Mnemo-Abfrage und eine sichtbare Fünf-Sekunden-Grenze für lokale Beziehungsabfragen.
24
17
 
25
18
  Start
26
19
  -----
package/README.md CHANGED
@@ -9,19 +9,12 @@ 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.513
12
+ npm install -g blun-king-cli@9.1.514
13
13
  ```
14
14
 
15
15
  ## AgentSpine 0.10.1
16
16
 
17
- Version 9.1.513 liefert AgentSpine 0.10.1 als neue inhaltsadressierte
18
- Pluginfassung. Der Preflight prueft weiterhin jede aktive Host-Anweisungsdatei
19
- race-sicher und bindet SHA-256 sowie Dateiidentitaet an den Zug, dupliziert den
20
- bereits vom Host geladenen Volltext aber nicht mehr in den Laufzeitkontext.
21
- Die reale 15.519-Byte-`CLAUDE.md`-Probe blieb dadurch bei 5.667 injizierten Byte.
22
- Der Stand enthaelt ausserdem den selbstheilenden Persona- und Beziehungsgraphen,
23
- die begrenzte Telegram-Mnemo-Abfrage und eine sichtbare Fuenf-Sekunden-Grenze
24
- fuer lokale Beziehungsabfragen.
17
+ Version 9.1.514 enthält weiterhin AgentSpine 0.10.1 als inhaltsadressierte Pluginfassung. Der Preflight prüft jede aktive Host-Anweisungsdatei weiterhin race-sicher und bindet SHA-256 sowie Dateiidentität an den Zug, dupliziert den bereits vom Host geladenen Volltext aber nicht im Laufzeitkontext. Die reale Probe mit einer 15.519 Byte großen `CLAUDE.md` blieb dadurch bei 5.667 injizierten Byte. Der Stand enthält außerdem den selbstheilenden Persona- und Beziehungsgraphen, die begrenzte Telegram-Mnemo-Abfrage und eine sichtbare Fünf-Sekunden-Grenze für lokale Beziehungsabfragen.
25
18
 
26
19
  ## Reproduzierbares Staging und Packen
27
20
 
@@ -20,13 +20,25 @@ function boundedInteger(value) {
20
20
  return Math.min(number, Number.MAX_SAFE_INTEGER);
21
21
  }
22
22
 
23
+ function numericMessageId(value) {
24
+ if (value === undefined || value === null) return undefined;
25
+ const text = String(value);
26
+ return /^[1-9][0-9]{0,39}$/u.test(text) ? text : undefined;
27
+ }
28
+
29
+ function strictChatHash(value) {
30
+ if (value === undefined || value === null) return undefined;
31
+ const text = String(value);
32
+ return /^[a-f0-9]{12}$/u.test(text) ? text : undefined;
33
+ }
34
+
23
35
  function hashChatId(chatId) {
24
36
  if (chatId === undefined || chatId === null || String(chatId).length === 0) return undefined;
25
37
  return crypto.createHash('sha256').update(String(chatId)).digest('hex').slice(0, 12);
26
38
  }
27
39
 
28
40
  function telegramDeliveryIdentity(meta = {}) {
29
- const messageId = cleanToken(meta.message_id ?? meta.messageId, 40);
41
+ const messageId = numericMessageId(meta.message_id ?? meta.messageId);
30
42
  const chatHash = hashChatId(meta.chat_id ?? meta.chatId);
31
43
  return {
32
44
  ...(messageId === undefined ? {} : { messageId }),
@@ -35,11 +47,15 @@ function telegramDeliveryIdentity(meta = {}) {
35
47
  }
36
48
 
37
49
  function lifecycleRecord(event, now, pid) {
50
+ const messageId = numericMessageId(event.messageId);
51
+ const chatHash = event.chatHash === undefined
52
+ ? undefined
53
+ : strictChatHash(event.chatHash);
38
54
  const identity = {
39
- ...(event.messageId === undefined ? {} : { messageId: cleanToken(event.messageId, 40) }),
55
+ ...(messageId === undefined ? {} : { messageId }),
40
56
  ...(event.chatHash === undefined
41
57
  ? telegramDeliveryIdentity({ chatId: event.chatId })
42
- : { chatHash: cleanToken(event.chatHash, 12) }),
58
+ : chatHash === undefined ? {} : { chatHash }),
43
59
  };
44
60
  const record = {
45
61
  version: 1,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blun-king-cli",
3
- "version": "9.1.513",
3
+ "version": "9.1.514",
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": {
@@ -20,13 +20,25 @@ function boundedInteger(value) {
20
20
  return Math.min(number, Number.MAX_SAFE_INTEGER);
21
21
  }
22
22
 
23
+ function numericMessageId(value) {
24
+ if (value === undefined || value === null) return undefined;
25
+ const text = String(value);
26
+ return /^[1-9][0-9]{0,39}$/u.test(text) ? text : undefined;
27
+ }
28
+
29
+ function strictChatHash(value) {
30
+ if (value === undefined || value === null) return undefined;
31
+ const text = String(value);
32
+ return /^[a-f0-9]{12}$/u.test(text) ? text : undefined;
33
+ }
34
+
23
35
  function hashChatId(chatId) {
24
36
  if (chatId === undefined || chatId === null || String(chatId).length === 0) return undefined;
25
37
  return crypto.createHash('sha256').update(String(chatId)).digest('hex').slice(0, 12);
26
38
  }
27
39
 
28
40
  function telegramDeliveryIdentity(meta = {}) {
29
- const messageId = cleanToken(meta.message_id ?? meta.messageId, 40);
41
+ const messageId = numericMessageId(meta.message_id ?? meta.messageId);
30
42
  const chatHash = hashChatId(meta.chat_id ?? meta.chatId);
31
43
  return {
32
44
  ...(messageId === undefined ? {} : { messageId }),
@@ -35,11 +47,15 @@ function telegramDeliveryIdentity(meta = {}) {
35
47
  }
36
48
 
37
49
  function lifecycleRecord(event, now, pid) {
50
+ const messageId = numericMessageId(event.messageId);
51
+ const chatHash = event.chatHash === undefined
52
+ ? undefined
53
+ : strictChatHash(event.chatHash);
38
54
  const identity = {
39
- ...(event.messageId === undefined ? {} : { messageId: cleanToken(event.messageId, 40) }),
55
+ ...(messageId === undefined ? {} : { messageId }),
40
56
  ...(event.chatHash === undefined
41
57
  ? telegramDeliveryIdentity({ chatId: event.chatId })
42
- : { chatHash: cleanToken(event.chatHash, 12) }),
58
+ : chatHash === undefined ? {} : { chatHash }),
43
59
  };
44
60
  const record = {
45
61
  version: 1,