blun-king-cli 9.1.624 → 9.1.625

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.
Files changed (142) hide show
  1. package/CHANGELOG.md +62 -213
  2. package/LIESMICH.txt +57 -74
  3. package/README.md +76 -119
  4. package/agent-spine-plugin/scripts/check-install.js +4 -4
  5. package/agent-spine-plugin/src/hook.js +0 -4
  6. package/agent-spine-plugin/src/lib/documents.js +1 -1
  7. package/agent-spine-plugin/src/lib/hook-context.js +0 -1
  8. package/agent-spine-plugin/src/lib/host-instruction-budget.js +2 -1
  9. package/agent-spine-plugin/src/lib/preflight.js +9 -38
  10. package/agent-spine-plugin/src/lib/source-roots.js +1 -1
  11. package/bin/agentspine-king-goal-inbox.mjs +127 -127
  12. package/bin/agentspine-king-goal-intake.mjs +106 -106
  13. package/bin/agentspine-king-host-runner.mjs +109 -109
  14. package/bin/agentspine-king-snapshot-policy.cjs +80 -80
  15. package/bin/agentspine-king-status-policy.mjs +226 -226
  16. package/bin/agentspine-king-worker-host.mjs +160 -160
  17. package/bin/core-bootstrap.js +71 -100
  18. package/bin/launcher-mode.js +93 -93
  19. package/bin/launcher-restart-policy.cjs +131 -131
  20. package/bin/launcher-runtime.js +89 -254
  21. package/bin/managed-node.js +186 -186
  22. package/bin/managed-plugin-selection.cjs +109 -116
  23. package/bin/native-module-repair.js +201 -201
  24. package/bin/node-runtime.js +34 -34
  25. package/bin/node-version.js +49 -49
  26. package/bin/plugin-bootstrap.js +149 -172
  27. package/bin/private-paths.js +1578 -1624
  28. package/bin/runtime-exit-ledger.cjs +144 -144
  29. package/bin/runtime-exit-ledger.d.cts +23 -23
  30. package/bin/standard-tools-bootstrap.js +277 -272
  31. package/bin/turn-thinking-policy.cjs +82 -82
  32. package/bin/update-copy.js +200 -200
  33. package/bin/update-lease.js +597 -599
  34. package/bin/update-notice.js +1568 -1568
  35. package/bin/verify-agent-behavior.cjs +122 -122
  36. package/bin/verify-agent-components.cjs +104 -104
  37. package/bin/verify-bundled-agent-sources.cjs +91 -96
  38. package/bin/windows-node-crash-dump.cjs +289 -289
  39. package/blun.mjs +187640 -180475
  40. package/bundled-agent-sources.json +26 -30
  41. package/codebase-index/codebase_index.py +462 -470
  42. package/dist-web/assets/{CodeBlockNode-TKKkJX8L.js → CodeBlockNode-BMbuG85x.js} +1 -1
  43. package/dist-web/assets/{CodeBlockShell.vue_vue_type_style_index_0_lang-CUj2Ds5x.js → CodeBlockShell.vue_vue_type_style_index_0_lang-C1fv7l_Z.js} +1 -1
  44. package/dist-web/assets/DesignSystemView-6HgAUEmC.css +1 -0
  45. package/dist-web/assets/DesignSystemView-CEEBqXSX.js +12 -0
  46. package/dist-web/assets/{Tooltip-CTWv7WCU.js → Tooltip--YoauJ24.js} +1 -1
  47. package/dist-web/assets/{abnfDiagram-N423BO3Z-DA8V8Zjh.js → abnfDiagram-N423BO3Z-DZvBWkRg.js} +1 -1
  48. package/dist-web/assets/{arc-YtddKbdY.js → arc-B04JATeX.js} +1 -1
  49. package/dist-web/assets/{architectureDiagram-T3A2C74G-CGEiObmo.js → architectureDiagram-T3A2C74G-DmYnMep2.js} +1 -1
  50. package/dist-web/assets/{blockDiagram-VBNYF7ZC-Bd5Vt50e.js → blockDiagram-VBNYF7ZC-DJ1gPS1C.js} +1 -1
  51. package/dist-web/assets/{c4Diagram-5PPSVZJV-D2ApPM54.js → c4Diagram-5PPSVZJV-DmjxvUbd.js} +1 -1
  52. package/dist-web/assets/channel-472fcEvw.js +1 -0
  53. package/dist-web/assets/{chunk-2GRJ4B5K-BDcIEZSl.js → chunk-2GRJ4B5K-AB0raj3I.js} +1 -1
  54. package/dist-web/assets/{chunk-2Q5K7J3B-6aSabCX7.js → chunk-2Q5K7J3B-Drf039vM.js} +1 -1
  55. package/dist-web/assets/{chunk-5RXB4S5H-BFRQvIJS.js → chunk-5RXB4S5H-D5ILttmz.js} +1 -1
  56. package/dist-web/assets/{chunk-5VM5RSS4-ChAa-DNY.js → chunk-5VM5RSS4-DrLSdi8y.js} +1 -1
  57. package/dist-web/assets/{chunk-6Q2QTUOP-BIfrb2Jc.js → chunk-6Q2QTUOP-LiaqdEOQ.js} +1 -1
  58. package/dist-web/assets/{chunk-GF5L2VYU-BR0gvtWI.js → chunk-GF5L2VYU-AIYkb--o.js} +1 -1
  59. package/dist-web/assets/{chunk-JWPE2WC7-BgXKsx5E.js → chunk-JWPE2WC7-CogdNl0i.js} +1 -1
  60. package/dist-web/assets/{chunk-KBJHAD2P-I8mrZhpz.js → chunk-KBJHAD2P-DHjpNtZv.js} +1 -1
  61. package/dist-web/assets/{chunk-RYQCIY6F-BMPaem92.js → chunk-RYQCIY6F-BUSOqH2X.js} +1 -1
  62. package/dist-web/assets/{chunk-XXDRQBXY-COy0J-0j.js → chunk-XXDRQBXY-BpoMV0bh.js} +1 -1
  63. package/dist-web/assets/classDiagram-JCYQIIEL-BTZeLngj.js +1 -0
  64. package/dist-web/assets/classDiagram-v2-OCEON4UE-BTZeLngj.js +1 -0
  65. package/dist-web/assets/{cose-bilkent-JH36ORCC-MosTTRdo.js → cose-bilkent-JH36ORCC-BJr2I61o.js} +1 -1
  66. package/dist-web/assets/{cynefin-VYW2F7L2-5tjPgrkP.js → cynefin-VYW2F7L2-HtysQZ4A.js} +1 -1
  67. package/dist-web/assets/{cynefinDiagram-MW4NZA55-CbDcdInR.js → cynefinDiagram-MW4NZA55-CcpC_2uv.js} +1 -1
  68. package/dist-web/assets/{dagre-VZM6K2ZE-YaBom1ZH.js → dagre-VZM6K2ZE-D8Ao0LUg.js} +1 -1
  69. package/dist-web/assets/{diagram-7IWD3JNH-Da4m-Hgz.js → diagram-7IWD3JNH-BITiLhjX.js} +1 -1
  70. package/dist-web/assets/{diagram-B4RE2ZJO-CAUUegxg.js → diagram-B4RE2ZJO-CJtwfy9f.js} +1 -1
  71. package/dist-web/assets/{diagram-LBJQPF4R-o21mWKG4.js → diagram-LBJQPF4R-BsVTh6w8.js} +1 -1
  72. package/dist-web/assets/{diagram-Q27KOJAE-BA3z3sXf.js → diagram-Q27KOJAE-pA_MUCUf.js} +1 -1
  73. package/dist-web/assets/{diagram-UB23O5K3-CGRdSSDK.js → diagram-UB23O5K3-CIY8z7vu.js} +1 -1
  74. package/dist-web/assets/{ebnfDiagram-BXEA7PRR-Bw-iU9FP.js → ebnfDiagram-BXEA7PRR-C3FMioqp.js} +1 -1
  75. package/dist-web/assets/{erDiagram-JOGREHBK-BwM1yiR0.js → erDiagram-JOGREHBK-CzoyKmKc.js} +1 -1
  76. package/dist-web/assets/{flowDiagram-UKHOOZJN-z05eOR1Q.js → flowDiagram-UKHOOZJN-DOqfushy.js} +1 -1
  77. package/dist-web/assets/{ganttDiagram-PKOTCBZU-BMUubNTl.js → ganttDiagram-PKOTCBZU-Cf9XQSWl.js} +1 -1
  78. package/dist-web/assets/{gitGraphDiagram-DS77QQ5N-Dccbi1wU.js → gitGraphDiagram-DS77QQ5N-DHUDofE5.js} +1 -1
  79. package/dist-web/assets/{index-h0KEOmkU.js → index-B6qEMQMx.js} +14 -14
  80. package/dist-web/assets/{index-C9eDH3u-.css → index-BmKj7CB1.css} +1 -1
  81. package/dist-web/assets/{index-BBbC5LRF.js → index-DokxDX1w.js} +1 -1
  82. package/dist-web/assets/{index-D48p0M2S.js → index-auojtiAA.js} +2 -2
  83. package/dist-web/assets/{index10-Qbuw1N6u.js → index10-Drb2n5e5.js} +1 -1
  84. package/dist-web/assets/{index11-g8v025wN.js → index11-Cx-aV4G2.js} +1 -1
  85. package/dist-web/assets/{index5-BYNcV8BY.js → index5-Dg3qGTyH.js} +1 -1
  86. package/dist-web/assets/{index6-BetANtnV.js → index6-BgvtIICP.js} +1 -1
  87. package/dist-web/assets/{index7-BcPbgCKN.js → index7-uEnniPQG.js} +1 -1
  88. package/dist-web/assets/{index8-B1lp-RvF.js → index8-h4IKc0ek.js} +2 -2
  89. package/dist-web/assets/{infoDiagram-6WML65LV-BF_pbUnN.js → infoDiagram-6WML65LV-D-3tvEiJ.js} +1 -1
  90. package/dist-web/assets/{ishikawaDiagram-WSZJBQD7-Dedv4urS.js → ishikawaDiagram-WSZJBQD7-DIIBNv7a.js} +1 -1
  91. package/dist-web/assets/{journeyDiagram-NVQOT4AX-B1Ex3b6o.js → journeyDiagram-NVQOT4AX-DP4r1Vlx.js} +1 -1
  92. package/dist-web/assets/{kanban-definition-27J2QSJJ-BtCGliBH.js → kanban-definition-27J2QSJJ-C3_Ztgxv.js} +1 -1
  93. package/dist-web/assets/{linear-ByItc8Qr.js → linear-DnqhIw-y.js} +1 -1
  94. package/dist-web/assets/{mermaid.core-B1M2O7nN.js → mermaid.core-xYUgBa3T.js} +4 -4
  95. package/dist-web/assets/{mindmap-definition-FAOFIHXS-D0UHKUyj.js → mindmap-definition-FAOFIHXS-l-dq-zfr.js} +1 -1
  96. package/dist-web/assets/{pegDiagram-VL7TDLO6-D7zYCVmG.js → pegDiagram-VL7TDLO6-C8vXQiaJ.js} +1 -1
  97. package/dist-web/assets/{pieDiagram-7S7Q4E2Y-Bd0i9CHa.js → pieDiagram-7S7Q4E2Y-CyNRSsI6.js} +1 -1
  98. package/dist-web/assets/{quadrantDiagram-CIZ2JOQS-MG-Ug47d.js → quadrantDiagram-CIZ2JOQS-D-w8AD_g.js} +1 -1
  99. package/dist-web/assets/{railroadDiagram-AXF67PYL-AZdl90Gj.js → railroadDiagram-AXF67PYL-BLkyQCWy.js} +1 -1
  100. package/dist-web/assets/{requirementDiagram-LRYGKXZP-DjplF9kt.js → requirementDiagram-LRYGKXZP-CEWO7XfT.js} +1 -1
  101. package/dist-web/assets/{sankeyDiagram-W5VNT64P-Bi9Zgfjs.js → sankeyDiagram-W5VNT64P-ByGoAaGj.js} +1 -1
  102. package/dist-web/assets/{sequenceDiagram-SI44F4Z6-ChEpdCvb.js → sequenceDiagram-SI44F4Z6-Bhn9GQtd.js} +1 -1
  103. package/dist-web/assets/{sizeCapture-X5ZJPWSS-B5RFUdaa.js → sizeCapture-X5ZJPWSS-jVKR9CTu.js} +1 -1
  104. package/dist-web/assets/{stateDiagram-OKZ733FA-BkRblSKp.js → stateDiagram-OKZ733FA-wW3XbegA.js} +1 -1
  105. package/dist-web/assets/stateDiagram-v2-UEYNNEHI-B8aids-Z.js +1 -0
  106. package/dist-web/assets/{swimlanes-SLNWSIFB-DLXH6Zhc.js → swimlanes-SLNWSIFB-B8QyFS7G.js} +2 -2
  107. package/dist-web/assets/swimlanesDiagram-ULZ7WXOC-B8XAkdSm.js +8 -0
  108. package/dist-web/assets/{timeline-definition-Z64GVDOM-C_N88siO.js → timeline-definition-Z64GVDOM-DpvxS-1A.js} +1 -1
  109. package/dist-web/assets/{vennDiagram-T6HMQDX7-DMsnvDt0.js → vennDiagram-T6HMQDX7-BzGM0ihY.js} +1 -1
  110. package/dist-web/assets/{vue.runtime.esm-bundler-B-3uIy85.js → vue.runtime.esm-bundler-BOcpwIX1.js} +1 -1
  111. package/dist-web/assets/{wardleyDiagram-T6FBY63Y-C9SJIPzq.js → wardleyDiagram-T6FBY63Y-2DKAOs5e.js} +1 -1
  112. package/dist-web/assets/{xychartDiagram-ELKLHX3M-DZLWA6Go.js → xychartDiagram-ELKLHX3M-B0SP0TXd.js} +1 -1
  113. package/dist-web/index.html +32 -32
  114. package/dist-web/vis/index.html.gz +0 -0
  115. package/package.json +1 -1
  116. package/scripts/fix-node-pty-perms.js +53 -53
  117. package/standard-skills/blun-app-design-system/SKILL.md +30 -30
  118. package/standard-skills/blun-app-design-system/provenance.json +17 -17
  119. package/standard-skills/blun-app-design-system/references/tokens.md +48 -48
  120. package/standard-skills/blun-app-design-system/scripts/check-blun-design.mjs +49 -49
  121. package/standard-skills/translate-native/README.md +1 -1
  122. package/standard-skills/translate-native/scripts/blun_language_guard.py +2 -0
  123. package/standard-skills/translate-native/scripts/language_gateway.py +2 -0
  124. package/standard-skills/translate-native/scripts/pre_output_guard.py +2 -0
  125. package/standard-tools/language-guard/blun_language_guard.py +2 -0
  126. package/standard-tools/language-guard/language_gateway.py +2 -0
  127. package/standard-tools/language-guard/pre_output_guard.py +2 -0
  128. package/telegram-plugin/blun.plugin.json +20 -20
  129. package/telegram-plugin/commands/access.md +37 -37
  130. package/telegram-plugin/dist/bridge.mjs +310 -187
  131. package/telegram-plugin/dist/mcp-server.mjs +174 -261
  132. package/telegram-plugin/dist/noise.mjs +1 -19
  133. package/worker-host.mjs +13747 -16824
  134. package/bin/profile-handoff.cjs +0 -152
  135. package/bin/profile-launch.cjs +0 -120
  136. package/dist-web/assets/DesignSystemView-DwK1aQMo.js +0 -12
  137. package/dist-web/assets/DesignSystemView-szjTj7ns.css +0 -1
  138. package/dist-web/assets/channel-BnluexuN.js +0 -1
  139. package/dist-web/assets/classDiagram-JCYQIIEL-BliFdSD9.js +0 -1
  140. package/dist-web/assets/classDiagram-v2-OCEON4UE-BliFdSD9.js +0 -1
  141. package/dist-web/assets/stateDiagram-v2-UEYNNEHI-fVkQcACW.js +0 -1
  142. package/dist-web/assets/swimlanesDiagram-ULZ7WXOC-Bg-BiZJQ.js +0 -8
package/README.md CHANGED
@@ -1,133 +1,90 @@
1
- # blun-king-cli — npm-Distribution
2
-
3
- Dieses Verzeichnis ist das Gerüst des öffentlichen npm-Pakets `blun-king-cli`
4
- (Erstveröffentlichung 8.0.0, 06.07.2026, Account `blunking`).
5
-
6
- ## Installation
7
-
8
- Voraussetzung ist Node.js 24.15 oder neuer. Die geprüfte Version wird exakt
9
- installiert:
10
-
11
- ```powershell
12
- npm install -g blun-king-cli@9.1.624
13
- ```
14
-
15
- ### Windows: Node.js, npm und Git Bash
16
-
17
- Node.js ab Version 24.15 ist erforderlich; npm wird mit Node.js installiert. Unter Windows benötigt die Konsole außerdem Git Bash aus Git for Windows. Nach der Installation ein neues Terminal öffnen und prüfen:
1
+ # blun-king-cli — npm-Distribution
2
+
3
+ Dieses Verzeichnis ist das Gerüst des öffentlichen npm-Pakets `blun-king-cli`
4
+ (Erstveröffentlichung 8.0.0, 06.07.2026, Account `blunking`).
5
+
6
+ ## Installation
7
+
8
+ Voraussetzung ist Node.js 24.15 oder neuer. Die geprüfte Version wird exakt
9
+ installiert:
18
10
 
19
11
  ```powershell
20
- node --version
21
- npm --version
22
- git --version
12
+ npm install -g blun-king-cli@9.1.600
23
13
  ```
24
14
 
25
- Wird `npm` nicht gefunden, zuerst die Node.js-Installation und den Suchpfad prüfen. Meldet die Konsole `Git Bash not found`, Git for Windows installieren oder `BLUN_SHELL_PATH` auf die vorhandene `bash.exe` setzen. Die Variable muss auf die Datei zeigen, nicht nur auf ihren Ordner.
15
+ ## Reproduzierbares Staging und Packen
26
16
 
27
- Beim Start lässt sich ein anderer Arbeitsordner über den Windows-Ordnerdialog auswählen. Ist kein Desktopdialog verfügbar, bleibt die manuelle Pfadeingabe möglich. Ein geerbter Windows-Systemordner wie `C:\Windows\System32` wird nicht als vorgeschlagener Arbeitsordner übernommen.
17
+ Der Schritt baut nichts, installiert nichts und veröffentlicht nichts. Vorher müssen
18
+ `apps/blun-king/dist/main.mjs`, `dist-web`, die Darwin- und Windows-Natives sowie
19
+ `plugins/telegram/dist` bereits frisch gebaut sein.
28
20
 
29
- ## Kontext, Werkzeuge und Sitzungssteuerung ab 9.1.604
21
+ Das Staging landet standardmäßig
22
+ unter `.stage/package`, das Tarball unter `.stage/artifacts`.
23
+ `BLUN_NPM_STAGE_DIR` und `BLUN_NPM_ARTIFACT_DIR` können beide Ziele überschreiben;
24
+ beim direkten Skriptaufruf stehen zusätzlich `--output` und `--artifacts` bereit.
30
25
 
31
- Die folgenden Befehle ergänzen die vorhandene Konsole. Sie ändern weder das Modell noch dessen Kontextfenster.
26
+ Der Schritt validiert alle Pflichtartefakte vor dem Leeren des alten Stagings. Er
27
+ kopiert nur die Paket-Hülle, `blun.mjs`, `dist-web`, `native`, Telegrams
28
+ `dist`/Manifest/Commands und die Repo-Skills.
32
29
 
33
- | Befehl | Wirkung |
34
- | --- | --- |
35
- | `/context doctor`, `/context-doctor`, `/tokens` | Zeigt die ausführliche Kontextdiagnose der aktiven Sitzung. |
36
- | `/queue` | Zeigt die aktuelle Warteschlangenregel. |
37
- | `/queue steer` | Übergibt neue Eingaben am nächsten geeigneten Übergabepunkt; ist das nicht möglich, warten sie auf den nächsten Zug. |
38
- | `/queue followup` | Verarbeitet neue Eingaben nach dem laufenden Zug. |
39
- | `/queue collect debounce:500ms batch:10` | Bündelt zusammengehörige Eingaben; weitere Eingaben bleiben in der Warteschlange. |
40
- | `/queue interrupt` | Unterbricht für neue Eingaben den laufenden Zug. |
41
- | `/queue reset`, `/queue default` | Entfernt die sitzungsspezifische Warteschlangenregel. |
42
- | `/session <ID oder Titel>` | Wählt eine Sitzung im aktuellen Arbeitsbereich. Eindeutige ID-Präfixe werden ebenfalls erkannt; bei Mehrdeutigkeit öffnet sich die Auswahl. |
43
- | `/question` | Öffnet noch ausstehende Rückfragen erneut. Das Einklappen beantwortet oder verwirft sie nicht. |
44
- | `/usage off`, `/usage tokens`, `/usage full` | Speichert den Anzeigemodus für den Verbrauch in dieser Sitzung. |
45
- | `/usage reset` | Entfernt den sitzungsspezifischen Anzeigemodus. `inherit`, `clear` und `default` sind gleichwertig. |
46
- | `/settings` | Öffnet die Einstellungen einschließlich der lokalen Anzeigeoptionen. |
30
+ ## Startmodi
47
31
 
48
- Bei `/queue` sind `debounce:0ms` bis `debounce:60s` und `batch:1` bis `batch:100` zulässig. `batch` begrenzt die Bündelgröße und löscht keine überschüssigen Nachrichten. Es gibt keine `cap:`- oder `drop:`-Option. Die Warteschlangenregel und der Verbrauchsmodus bleiben beim Fortsetzen derselben Sitzung erhalten. Gewöhnliche neue Kanalnachrichten lösen nicht mehr automatisch nach 30 Sekunden einen Abbruch aus; ausdrücklich angeforderte Unterbrechungen bleiben möglich.
32
+ `blun` startet die lokale Konsole, ohne Telegram automatisch anzubinden. `king`
33
+ startet dieselbe Konsole und bindet den eingerichteten Telegram-Kanal automatisch
34
+ an. Version, Konto, Modell und Befehle sind ansonsten identisch. Der Unterschied
35
+ gilt nur für den laufenden Prozess; die gespeicherte
36
+ Plugin-Konfiguration wird nicht umgeschrieben.
49
37
 
50
- Die Kontextdiagnose unterscheidet den gespeicherten Verlauf, geschätzte Tokenzahlen und die tatsächlich serialisierten Anfrage-Bytes. Für die letzte erfasste Anfrage weist sie bekannte Beiträge von AGENTS-Regeln, Mistake-Dateien, eingebundenem Gedächtnis, Skills und Werkzeugdefinitionen getrennt aus. Fehlende Herkunftsdaten bedeuten nicht null Byte. Anfrage-Bytes sind weder Tokenzahlen noch eine Rechnung.
38
+ Beim ersten Start werden das Telegram-Plugin und die mitgelieferten Skills
39
+ eingerichtet. Die Anmeldung erfolgt anschließend in der
40
+ Konsole mit `/login` über den BLUN-OAuth-Server. Das Paket erzeugt keine
41
+ statische Anbieter- oder API-Key-Konfiguration.
51
42
 
52
- Größere Werkzeugkataloge werden über die vorhandene Werkzeugsuche nach Bedarf eingeblendet. Die Schwelle liegt bei 8.000 geschätzten Schema-Token; notwendige Werkzeuge können darüber liegen. Werkzeuge werden dadurch nicht entfernt, und das Modellfenster wird nicht verkleinert.
43
+ ## Persönliches Gedächtnis
53
44
 
54
- Das Transportprotokoll erhält für jeden HTTP-Versuch eine eigene `x-request-id`. Bereits vorgegebene Kennungen bleiben unverändert und werden nicht als beliebiger Fremdtext protokolliert. Damit lassen sich Client- und Servermessungen zuordnen; die Kennung ist kein Abrechnungsschlüssel.
45
+ Seit Version 9.1.599 zeigt BLUN King Freigaben für das persönliche Gedächtnis mit übersetzten Aktionstiteln und vollständigen Vorschauen der tatsächlichen Einstellungsänderungen oder des zu speichernden Textes. Gültige Änderungen lassen sich nur einmalig freigeben, ungültige Eingaben nur ablehnen. Eine Sitzungsfreigabe genehmigt solche wartenden Anfragen nicht automatisch. Steuerzeichen werden sichtbar maskiert; der Originalinhalt bleibt unverändert.
55
46
 
56
- Die Verbrauchsanzeige berücksichtigt auch die Antwortprüfung. `/usage cost` mit Tages- oder Monatskosten gehört nicht zu dieser Fassung. Eine geringere Rechnung oder kürzere Antwortzeit im Live-Betrieb ist durch die lokalen Prüfungen nicht belegt.
47
+ ## Zeitgrenzen für die Antwortprüfung
57
48
 
58
- ## Reproduzierbares Staging und Packen
59
-
60
- Der Schritt baut nichts, installiert nichts und veröffentlicht nichts. Vorher müssen
61
- `apps/blun-king/dist/main.mjs`, `dist-web`, die Darwin- und Windows-Natives sowie
62
- `plugins/telegram/dist` bereits frisch gebaut sein.
63
-
64
- Das Staging landet standardmäßig
65
- unter `.stage/package`, das Tarball unter `.stage/artifacts`.
66
- `BLUN_NPM_STAGE_DIR` und `BLUN_NPM_ARTIFACT_DIR` können beide Ziele überschreiben;
67
- beim direkten Skriptaufruf stehen zusätzlich `--output` und `--artifacts` bereit.
68
-
69
- Der Schritt validiert alle Pflichtartefakte vor dem Leeren des alten Stagings. Er
70
- kopiert nur die Paket-Hülle, `blun.mjs`, `dist-web`, `native`, Telegrams
71
- `dist`/Manifest/Commands und die Repo-Skills.
72
-
73
- ## Startmodi
74
-
75
- `blun` startet die lokale Konsole, ohne Telegram automatisch anzubinden. `king`
76
- startet dieselbe Konsole und bindet den eingerichteten Telegram-Kanal automatisch
77
- an. Version, Konto, Modell und Befehle sind ansonsten identisch. Der Unterschied
78
- gilt nur für den laufenden Prozess; die gespeicherte
79
- Plugin-Konfiguration wird nicht umgeschrieben.
80
-
81
- Beim ersten Start werden das Telegram-Plugin und die mitgelieferten Skills
82
- eingerichtet. Die Anmeldung erfolgt anschließend in der
83
- Konsole mit `/login` über den BLUN-OAuth-Server. Das Paket erzeugt keine
84
- statische Anbieter- oder API-Key-Konfiguration.
85
-
86
- ## Persönliches Gedächtnis
87
-
88
- Seit Version 9.1.599 zeigt BLUN King Freigaben für das persönliche Gedächtnis mit übersetzten Aktionstiteln und vollständigen Vorschauen der tatsächlichen Einstellungsänderungen oder des zu speichernden Textes. Gültige Änderungen lassen sich nur einmalig freigeben, ungültige Eingaben nur ablehnen. Eine Sitzungsfreigabe genehmigt solche wartenden Anfragen nicht automatisch. Steuerzeichen werden sichtbar maskiert; der Originalinhalt bleibt unverändert.
89
-
90
- ## Zeitgrenzen für die Antwortprüfung
91
-
92
- Version 9.1.600 begrenzt die Antwortprüfung pro äußerem Prüfversuch auf insgesamt 120 Sekunden. Allgemeine Prüfer behalten die bisherige Frist von 30 Sekunden. Bei der nativen Sprachprüfung stehen nach dem bestätigten Start einmalig bis zu 90 Sekunden für den ersten inhaltlichen Text bereit; auch dabei gilt die Gesamtgrenze. Inhaltlicher Text innerhalb der zulässigen Ausgabelänge sowie die geordneten Übergänge zur Freigabe und zur Belegprüfung setzen die Wartefrist jeweils auf 30 Sekunden zurück, ohne die Gesamtgrenze zu verlängern. Es bleibt bei höchstens zwei äußeren Prüfversuchen.
93
-
94
- Abbruch, exakte Bindung an den Antworttext, Belegablauf und Autorisierung bleiben unverändert. Damit ist keine Behebung von HTTP-502-Fehlern im Live-Betrieb nachgewiesen.
95
-
96
- ## Festgelegte Komponentenstände
97
-
98
- - AgentSpine 0.73.0, Commit `38cb94760b19e3a82e7efdf12538a1adf5324964`.
99
- - Translate Native 6.155.0, Commit `21efc66da8f77992c8c63ac0f145a106c31e7eb2`.
100
- - Guard-Protokoll unverändert auf 6.20.0.
101
-
102
- ## Nachweisbare Arbeitsabläufe
103
-
104
- Version 9.1.0 enthält sieben zusätzliche, getrennt nutzbare Befehlsgruppen:
105
-
106
- - `proof` belegt Prüfungen und Artefakte mit SHA-256.
107
- - `brief` erstellt einen versionierten Projektauftrag.
108
- - `handoff` übergibt eine Sitzung zwischen CLI, Desktop und Web.
109
- - `replay` erzeugt einen bereinigten Arbeitsverlauf.
110
- - `guard` prüft Belegintegrität und aktuelle Artefakte.
111
- - `demo` erzeugt eine bereinigte statische Projektdemo.
112
- - `workspace` verwaltet isolierte Git-Arbeitsbereiche.
113
-
114
- Sie stehen unter `blun` und `king` identisch zur Verfügung.
115
-
116
- ## Aktualisieren
117
-
118
- `blun update`, `king update` und die jeweilige Variante `upgrade` verwenden
119
- denselben abgesicherten Updater. Er bleibt im installierten Stable- oder
120
- Next-Kanal, verhindert Rückstufungen und übergibt npm ausschließlich eine zuvor
121
- aufgelöste exakte Paketversion.
122
-
123
- ## Absturzdiagnose unter Windows
124
-
125
- Startfehler und unbehandelte Ausnahmen werden im begrenzten, bereinigten Protokoll `BLUN_HOME/diagnostics/runtime-exits.jsonl` erfasst. Die Diagnose startet keinen neuen Prozess und ändert beim Start keine Windows-Registrywerte.
126
-
127
- Ausführliche Node-Berichte sind optional. Nur `BLUN_NODE_CRASH_REPORTS=1` aktiviert sie für den gestarteten Prozess. Die Berichte liegen unter `BLUN_HOME/diagnostics/crash-dumps`. Umgebungsvariablen und Netzwerkinformationen werden ausgeschlossen; Programmargumente, Dateipfade und weitere sensible Prozessdaten können trotzdem enthalten sein. Berichte vor einer Weitergabe prüfen.
128
-
129
- Drei gemeinsam reservierte Plätze begrenzen die Anzahl dieser Node-Berichte, nicht deren Dateigröße. Ein ordentlich beendeter Prozess gibt seine Reservierung frei; ein späterer Prozess kann den Bericht dieses Platzes ersetzen. Aktive oder unklar verwaiste Reservierungen werden nicht automatisch entfernt. Sind alle Plätze belegt oder liegen alte Berichte mit Zufallskennung vor, bleiben neue Detailberichte aus, bis der Betreiber diese Dateien ausdrücklich geprüft und bereinigt hat. Der normale Start und das kleine Fehlerprotokoll bleiben davon unabhängig. Sitzungen und fremde Dateien werden nicht entfernt.
130
-
131
- Native Windows-Dumps sind davon getrennt. Der mitgelieferte Helfer `bin/windows-node-crash-dump.cjs` bietet `--query-wer` für eine reine Abfrage. Eine Änderung erfordert ausdrücklich `--configure-wer --confirm-system-wide`, ein gesetztes `BLUN_HOME` und ausreichende Windows-Rechte. Sie betrifft alle Prozesse namens `node.exe`, nicht nur BLUN: drei Minidumps im angegebenen Diagnoseordner. Bei einem Teilfehler nennt die JSON-Ausgabe die bereits gesetzten Werte. Der normale Start ruft diesen Befehl niemals auf.
132
-
133
- Node-Berichte erfassen unterstützte Node-Fehler; sie sind kein Beleg dafür, dass jeder native Windows-Abbruch erfasst wird. Die Funktion lässt den ursprünglichen Fehler und den vorgesehenen Prozessabbruch bestehen.
49
+ Version 9.1.600 begrenzt die Antwortprüfung pro äußerem Prüfversuch auf insgesamt 120 Sekunden. Allgemeine Prüfer behalten die bisherige Frist von 30 Sekunden. Bei der nativen Sprachprüfung stehen nach dem bestätigten Start einmalig bis zu 90 Sekunden für den ersten inhaltlichen Text bereit; auch dabei gilt die Gesamtgrenze. Inhaltlicher Text innerhalb der zulässigen Ausgabelänge sowie die geordneten Übergänge zur Freigabe und zur Belegprüfung setzen die Wartefrist jeweils auf 30 Sekunden zurück, ohne die Gesamtgrenze zu verlängern. Es bleibt bei höchstens zwei äußeren Prüfversuchen.
50
+
51
+ Abbruch, exakte Bindung an den Antworttext, Belegablauf und Autorisierung bleiben unverändert. Damit ist keine Behebung von HTTP-502-Fehlern im Live-Betrieb nachgewiesen.
52
+
53
+ ## Festgelegte Komponentenstände
54
+
55
+ - AgentSpine 0.73.0, Commit `38cb94760b19e3a82e7efdf12538a1adf5324964`.
56
+ - Translate Native 6.155.0, Commit `21efc66da8f77992c8c63ac0f145a106c31e7eb2`.
57
+ - Guard-Protokoll unverändert auf 6.20.0.
58
+
59
+ ## Nachweisbare Arbeitsabläufe
60
+
61
+ Version 9.1.0 enthält sieben zusätzliche, getrennt nutzbare Befehlsgruppen:
62
+
63
+ - `proof` belegt Prüfungen und Artefakte mit SHA-256.
64
+ - `brief` erstellt einen versionierten Projektauftrag.
65
+ - `handoff` übergibt eine Sitzung zwischen CLI, Desktop und Web.
66
+ - `replay` erzeugt einen bereinigten Arbeitsverlauf.
67
+ - `guard` prüft Belegintegrität und aktuelle Artefakte.
68
+ - `demo` erzeugt eine bereinigte statische Projektdemo.
69
+ - `workspace` verwaltet isolierte Git-Arbeitsbereiche.
70
+
71
+ Sie stehen unter `blun` und `king` identisch zur Verfügung.
72
+
73
+ ## Aktualisieren
74
+
75
+ `blun update`, `king update` und die jeweilige Variante `upgrade` verwenden
76
+ denselben abgesicherten Updater. Er bleibt im installierten Stable- oder
77
+ Next-Kanal, verhindert Rückstufungen und übergibt npm ausschließlich eine zuvor
78
+ aufgelöste exakte Paketversion.
79
+
80
+ ## Absturzdiagnose unter Windows
81
+
82
+ Startfehler und unbehandelte Ausnahmen werden im begrenzten, bereinigten Protokoll `BLUN_HOME/diagnostics/runtime-exits.jsonl` erfasst. Die Diagnose startet keinen neuen Prozess und ändert beim Start keine Windows-Registrywerte.
83
+
84
+ Ausführliche Node-Berichte sind optional. Nur `BLUN_NODE_CRASH_REPORTS=1` aktiviert sie für den gestarteten Prozess. Die Berichte liegen unter `BLUN_HOME/diagnostics/crash-dumps`. Umgebungsvariablen und Netzwerkinformationen werden ausgeschlossen; Programmargumente, Dateipfade und weitere sensible Prozessdaten können trotzdem enthalten sein. Berichte vor einer Weitergabe prüfen.
85
+
86
+ Drei gemeinsam reservierte Plätze begrenzen die Anzahl dieser Node-Berichte, nicht deren Dateigröße. Ein ordentlich beendeter Prozess gibt seine Reservierung frei; ein späterer Prozess kann den Bericht dieses Platzes ersetzen. Aktive oder unklar verwaiste Reservierungen werden nicht automatisch entfernt. Sind alle Plätze belegt oder liegen alte Berichte mit Zufallskennung vor, bleiben neue Detailberichte aus, bis der Betreiber diese Dateien ausdrücklich geprüft und bereinigt hat. Der normale Start und das kleine Fehlerprotokoll bleiben davon unabhängig. Sitzungen und fremde Dateien werden nicht entfernt.
87
+
88
+ Native Windows-Dumps sind davon getrennt. Der mitgelieferte Helfer `bin/windows-node-crash-dump.cjs` bietet `--query-wer` für eine reine Abfrage. Eine Änderung erfordert ausdrücklich `--configure-wer --confirm-system-wide`, ein gesetztes `BLUN_HOME` und ausreichende Windows-Rechte. Sie betrifft alle Prozesse namens `node.exe`, nicht nur BLUN: drei Minidumps im angegebenen Diagnoseordner. Bei einem Teilfehler nennt die JSON-Ausgabe die bereits gesetzten Werte. Der normale Start ruft diesen Befehl niemals auf.
89
+
90
+ Node-Berichte erfassen unterstützte Node-Fehler; sie sind kein Beleg dafür, dass jeder native Windows-Abbruch erfasst wird. Die Funktion lässt den ursprünglichen Fehler und den vorgesehenen Prozessabbruch bestehen.
@@ -215,7 +215,7 @@ async function prepareInstalledChannelWake(pluginRoot, projectRoot, stateRoot) {
215
215
  const graph = await import(pathToFileURL(join(pluginRoot, "src/lib/graph.js")).href);
216
216
  const channel = await import(pathToFileURL(join(pluginRoot, "src/lib/channel-runtime.js")).href);
217
217
  await graph.upsertEntity({
218
- root: projectRoot, id: "agent:install-channel", kind: "agent", displayName: "ExampleAgent",
218
+ root: projectRoot, id: "agent:install-channel", kind: "agent", displayName: "Franz",
219
219
  attributes: { language: "de-DE", voice: { warmth: "warm", directness: "clear", length: "concise" } },
220
220
  privacy: "shared"
221
221
  });
@@ -261,7 +261,7 @@ async function invokeInstalledChannelWake(pluginRoot, projectRoot, stateRoot, ho
261
261
  agent_spine_channel_event: { event_id: event.eventId, provider: event.provider }
262
262
  }, { extraEnv: { AGENTSPINE_INSTALL_CHANNEL_SECRET: secret } });
263
263
  if (result.channelEvent?.eventId !== event.eventId || result.channelEvent?.chatId !== event.chatId
264
- || result.channelEvent?.threadId !== event.threadId || result.voiceBrief?.displayName !== "ExampleAgent"
264
+ || result.channelEvent?.threadId !== event.threadId || result.voiceBrief?.displayName !== "Franz"
265
265
  || result.voiceBrief?.profile?.warmth !== "warm") {
266
266
  throw new Error(`${host} installed hook did not inject the exact channel event and voice brief`);
267
267
  }
@@ -288,8 +288,8 @@ async function invokeInstalledGateway(pluginRoot, projectRoot, stateRoot) {
288
288
  bindings: [{
289
289
  id: "persona-binding:installed-gateway", authenticator: "host-manifest", issuer: "host:installed",
290
290
  tenantId: "tenant:installed-gateway", host: "codex", profileId: "profile:installed-gateway",
291
- subjectId: "subject:installed-gateway", kind: "agent", displayName: "Installed ExampleAgent",
292
- sourceBinding: ".codex/agents/installed-example-agent.md", groupId: "group:installed-gateway"
291
+ subjectId: "subject:installed-gateway", kind: "agent", displayName: "Installed Franz",
292
+ sourceBinding: ".codex/agents/installed-franz.md", groupId: "group:installed-gateway"
293
293
  }, {
294
294
  id: "persona-binding:installed-peer", authenticator: "host-manifest", issuer: "host:installed",
295
295
  tenantId: "tenant:installed-gateway", host: "codex", profileId: "profile:installed-gateway",
@@ -431,10 +431,6 @@ async function runHookCore(input, payload, options) {
431
431
  }
432
432
  if (payload) return { blocked: false, context, briefing, preflight, signal, attentionEvent, channelEvent, lessonRecall, catalogPath };
433
433
  const output = hookOutput(event, context, process.env, sourceWarning);
434
- if (preflight?.instructionNotice) {
435
- output.hookSpecificOutput.message = [output.hookSpecificOutput.message, preflight.instructionNotice]
436
- .filter(Boolean).join("\n");
437
- }
438
434
  const handoff = await writeContextOutput(output, process.env.BLUN_PLUGIN_ROOT ? "king"
439
435
  : process.env.PLUGIN_ROOT ? "codex" : process.env.CLAUDE_PLUGIN_ROOT ? "claude" : scope.host);
440
436
  if (event === "UserPromptSubmit" && briefingOrigin) {
@@ -86,7 +86,7 @@ export async function indexExplicitDocuments(entries) {
86
86
  if (!metadata.isFile() || metadata.isSymbolicLink()) throw new Error(`source is not a regular non-symlink file: ${entry.id}`);
87
87
  buffer = await readFile(path);
88
88
  }
89
- if (buffer.byteLength > (entry.maxBytes || 8 * 1024 * 1024)) throw new Error(`source exceeds its byte limit: ${entry.id}`);
89
+ if (buffer.byteLength > (entry.maxBytes || 4 * 1024 * 1024)) throw new Error(`source exceeds its byte limit: ${entry.id}`);
90
90
  const classification = classify(entry.id);
91
91
  const document = {
92
92
  path,
@@ -44,7 +44,6 @@ return null;
44
44
 
45
45
  export function hostContextLimit(preflight) {
46
46
  if (preflight?.receipt?.instructionHost === "codex") return 32768 + Buffer.byteLength(JSON.stringify(preflight.briefing || {}));
47
- if (preflight?.briefing?.instructions?.length) return 32768 + Buffer.byteLength(JSON.stringify(preflight.briefing));
48
47
  const mode = preflight?.receipt?.instructionBudget?.mode;
49
48
  if (mode === "claude-required-overflow") return MAX_CLAUDE_OVERFLOW_CONTEXT_BYTES;
50
49
  return STANDARD_HOST_CONTEXT_BYTES;
@@ -4,7 +4,8 @@ const KING_TOTAL = 8388608;
4
4
  export const isKingHost = (env = process.env) => !!(env.BLUN_PLUGIN_ROOT && env.BLUN_HOME);
5
5
 
6
6
  export function instructionBudget(host, usedBytes = 0, env = process.env) {
7
- const hardLimitBytes = KING_TOTAL;
7
+ const hardLimitBytes = host === "codex" && isKingHost(env) ? KING_TOTAL
8
+ : host === "claude" ? 16384 : host === "codex" ? 32768 : STANDARD;
8
9
  return { mode: usedBytes > STANDARD ? `${host}-required-overflow` : "standard",
9
10
  standardBytes: STANDARD, hardLimitBytes, usedBytes, overflowBytes: Math.max(0, usedBytes - STANDARD) };
10
11
  }
@@ -1,14 +1,13 @@
1
1
  import { createHash, createHmac, randomBytes, randomUUID, timingSafeEqual } from "node:crypto";
2
2
  import { constants as fsConstants } from "node:fs";
3
3
  import { spawn } from "node:child_process";
4
- import { StringDecoder } from "node:string_decoder";
5
4
  import { lstat, mkdir, open, readFile, realpath, stat, unlink, writeFile } from "node:fs/promises";
6
5
  import { basename, dirname, isAbsolute, join, relative, resolve } from "node:path";
7
6
  import { isFileLockContention, replaceFileWithRetry } from "./filesystem-retry.js";
8
7
  import { ancestorsBetween, isInside, stateRoot } from "./paths.js";
9
8
  import { preflightDeliveryId } from "./preflight-delivery-id.js";
10
9
  import { resolveHostSourceCatalog } from "./source-roots.js";
11
- import { instructionBudget, isKingHost } from "./host-instruction-budget.js";
10
+ import { instructionBudget } from "./host-instruction-budget.js";
12
11
 
13
12
  export const PREFLIGHT_SCHEMA = "agentspine.preflight/v2";
14
13
  export const PREFLIGHT_POLICY_SCHEMA = "agentspine.preflight-policy/v1";
@@ -327,7 +326,7 @@ async function assertNoSymlinkParents(path, allowedRoot) {
327
326
  }
328
327
  return { root, target };
329
328
  }
330
- async function safeReadRequired(path, allowedRoot, maximum = STANDARD_REQUIRED_INSTRUCTIONS_BYTES, fileHooks = null, contentLimit = null) {
329
+ async function safeReadRequired(path, allowedRoot, maximum = STANDARD_REQUIRED_INSTRUCTIONS_BYTES, fileHooks = null) {
331
330
  const checked = await assertNoSymlinkParents(path, allowedRoot);
332
331
  const flags = fsConstants.O_RDONLY | (fsConstants.O_NOFOLLOW || 0);
333
332
  const handle = await open(checked.target, flags);
@@ -354,10 +353,7 @@ async function safeReadRequired(path, allowedRoot, maximum = STANDARD_REQUIRED_I
354
353
  || current.size !== before.size || current.mtimeMs !== before.mtimeMs || current.ctimeMs !== before.ctimeMs) {
355
354
  throw new Error(`required instruction ${basename(path)} was replaced during preflight`);
356
355
  }
357
- const decoder = new StringDecoder("utf8");
358
- const content = contentLimit === null ? buffer.toString("utf8") : decoder.write(buffer.subarray(0, contentLimit));
359
- const readBytes = Buffer.byteLength(content);
360
- return { content, bytes: buffer.length, readBytes, omittedBytes: buffer.length - readBytes, sha256: sha256(buffer),
356
+ return { content: buffer.toString("utf8"), bytes: buffer.length, sha256: sha256(buffer),
361
357
  identity: sha256(`${before.dev}\0${before.ino}\0${before.size}\0${before.mtimeMs}\0${before.ctimeMs}`) };
362
358
  } finally { await handle.close(); }
363
359
  }
@@ -496,19 +492,16 @@ export async function runPreflight({ input, scope, resolvedSources, prompt, now
496
492
  const requiredInstructions = [];
497
493
  let instructionBytes = 0;
498
494
  const maximumInstructionBytes = instructionBudget(instructionHost, 0, env).hardLimitBytes;
499
- const kingInstructions = instructionHost === "codex" && isKingHost(env);
500
- const contentBudget = kingInstructions ? 900000 : 32768;
501
495
  for (const document of documents) {
502
496
  const allowedRoot = document.sourceScope === "user" ? resolvedSources.hostHome : resolvedSources.projectRoot;
503
- const snapshot = await safeReadRequired(document.path, allowedRoot, maximumInstructionBytes, fileHooks, Math.max(0, contentBudget - instructionBytes));
497
+ const snapshot = await safeReadRequired(document.path, allowedRoot, maximumInstructionBytes, fileHooks);
504
498
  if (snapshot.sha256 !== document.sha256 || snapshot.bytes !== document.bytes) throw new Error(`required instruction changed after source resolution: ${document.relativePath}`);
505
- instructionBytes += snapshot.readBytes;
499
+ instructionBytes += snapshot.bytes;
506
500
  if (instructionBytes > maximumInstructionBytes) {
507
501
  throw new Error(`required host instructions total ${instructionBytes} bytes; mandatory limit is ${maximumInstructionBytes} bytes`);
508
502
  }
509
503
  requiredInstructions.push({ path: document.path, displayPath: document.relativePath, scope: document.sourceScope,
510
- bytes: snapshot.bytes, readBytes: snapshot.readBytes, omittedBytes: snapshot.omittedBytes,
511
- sha256: snapshot.sha256, identity: snapshot.identity, content: snapshot.content });
504
+ bytes: snapshot.bytes, sha256: snapshot.sha256, identity: snapshot.identity, content: snapshot.content });
512
505
  }
513
506
  const appliedInstructionBudget = instructionBudget(instructionHost, instructionBytes, env);
514
507
  const memoryState = validateMemories(await readJson(paths.memories, MAX_STATE_BYTES, emptyMemories));
@@ -555,7 +548,6 @@ export async function runPreflight({ input, scope, resolvedSources, prompt, now
555
548
  const key = await signingKey(paths); const bodyDigest = digestObject(receiptBody);
556
549
  const receipt = { id: `preflight:${bodyDigest.slice(0, 32)}`, ...receiptBody, bodyDigest,
557
550
  signature: createHmac("sha256", key).update(bodyDigest).digest("hex") };
558
- let instructionNotice = null;
559
551
  await withLock(paths, async () => {
560
552
  const state = await readVerifiedState(paths);
561
553
  state.receipts = state.receipts.filter((item) => new Date(item.receipt?.expiresAt || 0).getTime() >= new Date(createdAt).getTime() - RECEIPT_TTL_MS);
@@ -565,25 +557,6 @@ export async function runPreflight({ input, scope, resolvedSources, prompt, now
565
557
  const envelope = { receipt, consumedAt: null, invalidatedAt: null, stateSignature: "" };
566
558
  envelope.stateSignature = createHmac("sha256", key).update(envelopeBody(envelope)).digest("hex");
567
559
  state.receipts.push(envelope); state.revision += 1;
568
- if (requiredInstructions.length > 0) {
569
- const notices = [];
570
- for (const item of requiredInstructions.filter((instruction) => instruction.bytes > 8192)) {
571
- const sessionDigest = sha256(`${exactScope.sessionId}\0${item.path}`);
572
- if (state.history.some((event) => event.event === "instruction-notice" && event.sessionDigest === sessionDigest)) continue;
573
- state.history.push({ event: "instruction-notice", sessionDigest, at: createdAt, authority: "diagnostic-only" });
574
- notices.push(`${item.displayPath}: ${item.bytes} bytes; ${item.readBytes} read; ${item.omittedBytes} omitted.`);
575
- }
576
- const totalBytes = requiredInstructions.reduce((sum, item) => sum + item.bytes, 0);
577
- const omittedBytes = totalBytes - instructionBytes;
578
- if (omittedBytes > 0) {
579
- const totalDigest = sha256(`${exactScope.sessionId}\0instruction-total`);
580
- if (!state.history.some((event) => event.event === "instruction-notice" && event.sessionDigest === totalDigest)) {
581
- state.history.push({ event: "instruction-notice", sessionDigest: totalDigest, at: createdAt, authority: "diagnostic-only" });
582
- notices.push(`Instruction total: ${totalBytes} bytes; ${instructionBytes} read; ${omittedBytes} omitted.`);
583
- }
584
- }
585
- instructionNotice = notices.join("\n") || null;
586
- }
587
560
  state.lastTurn = { status: "ready", receiptId: receipt.id, at: createdAt, host: exactScope.host,
588
561
  instructionHost, instructionFiles: receipt.instructionFiles.length, recall: receipt.providerQueries.map((item) => ({
589
562
  providerId: item.providerId, status: item.status, rejected: item.rejected
@@ -591,7 +564,7 @@ export async function runPreflight({ input, scope, resolvedSources, prompt, now
591
564
  state.history.push({ event: "ready", receiptId: receipt.id, at: createdAt, authority: "preflight-proof-only" });
592
565
  await writeJson(paths.state, state);
593
566
  });
594
- return { receipt, briefing, instructionNotice, policy: { configured: Boolean(profile), requiredProviderIds } };
567
+ return { receipt, briefing, policy: { configured: Boolean(profile), requiredProviderIds } };
595
568
  }
596
569
 
597
570
  export async function verifyPreflightReceipt({ receipt, input, scope, resolvedSources, prompt, now = new Date(), env = process.env, consume = false }) {
@@ -634,14 +607,12 @@ export async function verifyPreflightReceipt({ receipt, input, scope, resolvedSo
634
607
  || currentDocuments.some((document, index) => document.path !== receipt.instructionFiles[index]?.path)) return false;
635
608
  let instructionBytes = 0;
636
609
  const maximumInstructionBytes = instructionBudget(receipt.instructionHost, 0, env).hardLimitBytes;
637
- const kingInstructions = receipt.instructionHost === "codex" && isKingHost(env);
638
- const contentBudget = kingInstructions ? 900000 : 32768;
639
610
  for (const instruction of receipt.instructionFiles) {
640
611
  const allowedRoot = instruction.scope === "user" ? freshSources.hostHome : freshSources.projectRoot;
641
- const currentSnapshot = await safeReadRequired(instruction.path, allowedRoot, maximumInstructionBytes, null, Math.max(0, contentBudget - instructionBytes));
612
+ const currentSnapshot = await safeReadRequired(instruction.path, allowedRoot, maximumInstructionBytes);
642
613
  if (currentSnapshot.sha256 !== instruction.sha256 || currentSnapshot.bytes !== instruction.bytes
643
614
  || currentSnapshot.identity !== instruction.identity) return false;
644
- instructionBytes += currentSnapshot.readBytes;
615
+ instructionBytes += currentSnapshot.bytes;
645
616
  }
646
617
  if (instructionBytes > maximumInstructionBytes
647
618
  || canonical(receipt.instructionBudget) !== canonical(instructionBudget(receipt.instructionHost, instructionBytes, env))) return false;
@@ -376,7 +376,7 @@ export async function resolveHostSourceCatalog({ host, cwd = process.cwd(), inpu
376
376
  const codexHome = isKingHost(env) ? env.BLUN_HOME : env.CODEX_HOME || env.BLUN_HOME || join(homedir(), ".codex");
377
377
  hostHome = await existingDirectory(resolve(codexHome)) || resolve(codexHome);
378
378
  const config = await codexConfig(hostHome);
379
- config.maxBytes = KING_SOURCE_BYTES;
379
+ if (isKingHost(env)) config.maxBytes = KING_SOURCE_BYTES;
380
380
  if (env.AGENTSPINE_ROOT) projectRoot = await canonicalPath(env.AGENTSPINE_ROOT);
381
381
  else ({ root: projectRoot, resolution: rootResolution } = await findRoot(canonicalCwd, config.rootMarkers));
382
382
  sources = await codexSources({ cwd: canonicalCwd, projectRoot, codexHome: hostHome, config });