blun-king-cli 9.0.0 → 9.1.0

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 (238) hide show
  1. package/LIESMICH.txt +32 -13
  2. package/README.md +39 -20
  3. package/bin/blun.js +248 -160
  4. package/bin/core-bootstrap.js +47 -0
  5. package/bin/king.js +277 -1
  6. package/bin/launcher-mode.js +15 -3
  7. package/bin/launcher-runtime.js +293 -0
  8. package/bin/plugin-bootstrap.js +11 -4
  9. package/bin/private-paths.js +1577 -10
  10. package/bin/update-lease.js +399 -0
  11. package/bin/update-notice.js +1245 -0
  12. package/blun.mjs +26606 -25239
  13. package/dist-web/assets/{CodeBlockNode-Bsvp6ZEy.js → CodeBlockNode-CXnTLMNr.js} +1 -1
  14. package/dist-web/assets/{CodeBlockShell.vue_vue_type_style_index_0_lang-ta7hLjia.js → CodeBlockShell.vue_vue_type_style_index_0_lang-CCF8Ntnq.js} +1 -1
  15. package/dist-web/assets/{DesignSystemView-BmDDe28A.js → DesignSystemView-BbMOu-XO.js} +1 -1
  16. package/dist-web/assets/{Tooltip-nEEfaYVY.js → Tooltip-CFQEzqC-.js} +1 -1
  17. package/dist-web/assets/abnfDiagram-N423BO3Z-CsByy-GW.js +1 -0
  18. package/dist-web/assets/abnfDiagram-N423BO3Z-Z1APZG5m.js +1 -0
  19. package/dist-web/assets/arc-C-LXCaja.js +1 -0
  20. package/dist-web/assets/arc-C4VyWloT.js +1 -0
  21. package/dist-web/assets/architectureDiagram-T3A2C74G-DZq4L18e.js +36 -0
  22. package/dist-web/assets/architectureDiagram-T3A2C74G-DpddbUcM.js +36 -0
  23. package/dist-web/assets/blockDiagram-VBNYF7ZC-BV4sIf98.js +132 -0
  24. package/dist-web/assets/blockDiagram-VBNYF7ZC-BqccOSMr.js +132 -0
  25. package/dist-web/assets/{c4Diagram-AAUBKEIU-DtzacMnD.js → c4Diagram-5PPSVZJV-0MRkZlgP.js} +1 -1
  26. package/dist-web/assets/{c4Diagram-AAUBKEIU-D1VdMx8d.js → c4Diagram-5PPSVZJV-OHAcJrTy.js} +1 -1
  27. package/dist-web/assets/channel-B2VOQOI-.js +1 -0
  28. package/dist-web/assets/channel-DKjwM05G.js +1 -0
  29. package/dist-web/assets/{chunk-ND2GUHAM-DJoY9wNJ.js → chunk-2GRJ4B5K-DqJHs8Fw.js} +1 -1
  30. package/dist-web/assets/{chunk-ND2GUHAM-C4-rwdcv.js → chunk-2GRJ4B5K-oO6nqeLA.js} +1 -1
  31. package/dist-web/assets/{chunk-QZHKN3VN-C7YGaShq.js → chunk-2Q5K7J3B-B1nCd91o.js} +1 -1
  32. package/dist-web/assets/{chunk-QZHKN3VN-_Rz9_NuS.js → chunk-2Q5K7J3B-BC0Hsfqy.js} +1 -1
  33. package/dist-web/assets/chunk-5RXB4S5H-BfZa4yDH.js +231 -0
  34. package/dist-web/assets/chunk-5RXB4S5H-neG70kZx.js +231 -0
  35. package/dist-web/assets/{chunk-FMBD7UC4-DlLNDUx6.js → chunk-5VM5RSS4-l7biGqeH.js} +1 -1
  36. package/dist-web/assets/{chunk-FMBD7UC4-B2zs_Y-d.js → chunk-5VM5RSS4-u00AcpiJ.js} +1 -1
  37. package/dist-web/assets/chunk-6Q2QTUOP-BO-F11Gs.js +88 -0
  38. package/dist-web/assets/chunk-6Q2QTUOP-RUVRPBzG.js +88 -0
  39. package/dist-web/assets/{chunk-727SXJPM-Dn5wkDO_.js → chunk-GF5L2VYU-Ba-86KTd.js} +5 -5
  40. package/dist-web/assets/{chunk-727SXJPM-Dk2Xa3bA.js → chunk-GF5L2VYU-BtC69fw0.js} +5 -5
  41. package/dist-web/assets/{chunk-4BX2VUAB-DxZViaHS.js → chunk-JWPE2WC7-DIOubEqr.js} +1 -1
  42. package/dist-web/assets/{chunk-4BX2VUAB-WqrE2gaw.js → chunk-JWPE2WC7-u8Pcfhwh.js} +1 -1
  43. package/dist-web/assets/{chunk-2J33WTMH-Dm_s0_4f.js → chunk-KBJHAD2P-DDUeH_Ba.js} +1 -1
  44. package/dist-web/assets/{chunk-2J33WTMH-w4sdiKFO.js → chunk-KBJHAD2P-DS3BL64y.js} +1 -1
  45. package/dist-web/assets/chunk-RYQCIY6F-B9gFMVbS.js +1 -0
  46. package/dist-web/assets/chunk-RYQCIY6F-xg3EO0le.js +1 -0
  47. package/dist-web/assets/{chunk-55IACEB6-B5dE1-Um.js → chunk-XXDRQBXY-B60H0rRC.js} +1 -1
  48. package/dist-web/assets/{chunk-55IACEB6-B12zGIFz.js → chunk-XXDRQBXY-Bn1Xz6TQ.js} +1 -1
  49. package/dist-web/assets/classDiagram-JCYQIIEL-BA1TjAxj.js +1 -0
  50. package/dist-web/assets/classDiagram-JCYQIIEL-BNU7Qn4k.js +1 -0
  51. package/dist-web/assets/classDiagram-v2-OCEON4UE-BA1TjAxj.js +1 -0
  52. package/dist-web/assets/classDiagram-v2-OCEON4UE-BNU7Qn4k.js +1 -0
  53. package/dist-web/assets/{cose-bilkent-S5V4N54A-Bi19n8m-.js → cose-bilkent-JH36ORCC-4Ybddg08.js} +1 -1
  54. package/dist-web/assets/{cose-bilkent-S5V4N54A-c8o8NFp5.js → cose-bilkent-JH36ORCC-DqigO3T4.js} +1 -1
  55. package/dist-web/assets/cynefin-VYW2F7L2-C-EfYT07.js +178 -0
  56. package/dist-web/assets/cynefin-VYW2F7L2-rpD93tQ-.js +178 -0
  57. package/dist-web/assets/cynefinDiagram-MW4NZA55-DWZPLJcD.js +62 -0
  58. package/dist-web/assets/cynefinDiagram-MW4NZA55-DbTqnkVJ.js +62 -0
  59. package/dist-web/assets/dagre-VZM6K2ZE-DcM8aEVY.js +4 -0
  60. package/dist-web/assets/dagre-VZM6K2ZE-M_HVNtqP.js +4 -0
  61. package/dist-web/assets/diagram-7IWD3JNH-DoNximNF.js +30 -0
  62. package/dist-web/assets/diagram-7IWD3JNH-UymgsBNa.js +30 -0
  63. package/dist-web/assets/{diagram-KO2AKTUF-CFQs13i5.js → diagram-B4RE2ZJO-BVA2EhnC.js} +3 -3
  64. package/dist-web/assets/{diagram-KO2AKTUF-agFIuPJW.js → diagram-B4RE2ZJO-BiYu5WPF.js} +3 -3
  65. package/dist-web/assets/{diagram-LMA3HP47-TMIXizxR.js → diagram-LBJQPF4R-BD3kkgOO.js} +2 -2
  66. package/dist-web/assets/{diagram-LMA3HP47-He5zlyMt.js → diagram-LBJQPF4R-m3a1Euj3.js} +2 -2
  67. package/dist-web/assets/diagram-Q27KOJAE-D1mYQ_cI.js +24 -0
  68. package/dist-web/assets/diagram-Q27KOJAE-hy_T73PK.js +24 -0
  69. package/dist-web/assets/diagram-UB23O5K3-BWkoQZ4A.js +41 -0
  70. package/dist-web/assets/diagram-UB23O5K3-BtX8u6HG.js +41 -0
  71. package/dist-web/assets/ebnfDiagram-BXEA7PRR-BKs9JUHW.js +1 -0
  72. package/dist-web/assets/ebnfDiagram-BXEA7PRR-CBAnFkRF.js +1 -0
  73. package/dist-web/assets/erDiagram-JOGREHBK-3vKcWsxm.js +85 -0
  74. package/dist-web/assets/erDiagram-JOGREHBK-BIpd6dTf.js +85 -0
  75. package/dist-web/assets/flowDiagram-UKHOOZJN-D9wBbHm2.js +156 -0
  76. package/dist-web/assets/flowDiagram-UKHOOZJN-Z83i2UWI.js +156 -0
  77. package/dist-web/assets/ganttDiagram-PKOTCBZU-Cd_dViF-.js +292 -0
  78. package/dist-web/assets/ganttDiagram-PKOTCBZU-DFrb_S1d.js +292 -0
  79. package/dist-web/assets/{gitGraphDiagram-PVQCEYII-BSDFfwdY.js → gitGraphDiagram-DS77QQ5N-BiEEtTo7.js} +3 -3
  80. package/dist-web/assets/{gitGraphDiagram-PVQCEYII-DMbTATyw.js → gitGraphDiagram-DS77QQ5N-Dp3Ar-hi.js} +3 -3
  81. package/dist-web/assets/{graph-BwjfAU3j.js → graph-CAUpWmoK.js} +1 -1
  82. package/dist-web/assets/{graph--OzhPTMs.js → graph-DOmOIIwC.js} +1 -1
  83. package/dist-web/assets/{index-W6VnSrkB.js → index-Ba1OvLjf.js} +2 -2
  84. package/dist-web/assets/{index-CkVgGDpx.js → index-CiPA8Kex.js} +4 -4
  85. package/dist-web/assets/{index-BzK4vJBu.js → index-DdEakFJM.js} +1 -1
  86. package/dist-web/assets/{index10-Czg_oF-W.js → index10-CNr4U-Nw.js} +1 -1
  87. package/dist-web/assets/{index11-BjzCZuCr.js → index11-Dto_yZNz.js} +1 -1
  88. package/dist-web/assets/{index5-DlVoNkCD.js → index5-B2PldaO2.js} +1 -1
  89. package/dist-web/assets/{index6-BxiXA2yo.js → index6-CBdZmmyx.js} +1 -1
  90. package/dist-web/assets/{index7-BPdza6d1.js → index7-Dz9oCsUF.js} +1 -1
  91. package/dist-web/assets/{index8-Q_XzGC1Z.js → index8-B6k25jtU.js} +2 -2
  92. package/dist-web/assets/{infoDiagram-5YYISTIA-2JF3XEdD.js → infoDiagram-6WML65LV-BSa2g04G.js} +1 -1
  93. package/dist-web/assets/{infoDiagram-5YYISTIA-UrQusrJq.js → infoDiagram-6WML65LV-D4ph2sIH.js} +1 -1
  94. package/dist-web/assets/{ishikawaDiagram-YF4QCWOH-7RVUL-vB.js → ishikawaDiagram-WSZJBQD7-DjKjbMm9.js} +5 -5
  95. package/dist-web/assets/{ishikawaDiagram-YF4QCWOH-C5OstRVV.js → ishikawaDiagram-WSZJBQD7-Hm36UOQe.js} +5 -5
  96. package/dist-web/assets/{journeyDiagram-JHISSGLW-B34fCMu9.js → journeyDiagram-NVQOT4AX-DttHDfPQ.js} +1 -1
  97. package/dist-web/assets/{journeyDiagram-JHISSGLW-yctdo4bX.js → journeyDiagram-NVQOT4AX-MvWWPNDV.js} +1 -1
  98. package/dist-web/assets/{kanban-definition-UN3LZRKU-BS4FBZsQ.js → kanban-definition-27J2QSJJ-C5gB-W0d.js} +7 -7
  99. package/dist-web/assets/{kanban-definition-UN3LZRKU-CxBCv27E.js → kanban-definition-27J2QSJJ-Cu-E_cXA.js} +5 -5
  100. package/dist-web/assets/layout-CvP6o9AK.js +1 -0
  101. package/dist-web/assets/layout-D-LzfAck.js +1 -0
  102. package/dist-web/assets/{linear-3mB6q2-g.js → linear-B3HWgQI2.js} +1 -1
  103. package/dist-web/assets/{linear-BKCnUo31.js → linear-BRGe4-d6.js} +1 -1
  104. package/dist-web/assets/map-CWKZqZjr.js +1 -0
  105. package/dist-web/assets/map-DxJ2ADlA.js +1 -0
  106. package/dist-web/assets/mermaid.core-D-9Sx1No.js +314 -0
  107. package/dist-web/assets/mermaidParser.worker-PTFfzpoB.js +318 -0
  108. package/dist-web/assets/{mindmap-definition-RKZ34NQL-BmJZpjh6.js → mindmap-definition-FAOFIHXS-C4vnms3i.js} +2 -2
  109. package/dist-web/assets/{mindmap-definition-RKZ34NQL-1mjWUcf6.js → mindmap-definition-FAOFIHXS-Cg_hoVIq.js} +1 -1
  110. package/dist-web/assets/pegDiagram-VL7TDLO6-B2fFEFUH.js +1 -0
  111. package/dist-web/assets/pegDiagram-VL7TDLO6-CSX9hitD.js +1 -0
  112. package/dist-web/assets/pieDiagram-7S7Q4E2Y-0L0mxahZ.js +39 -0
  113. package/dist-web/assets/pieDiagram-7S7Q4E2Y-C7T0Cmw1.js +39 -0
  114. package/dist-web/assets/{quadrantDiagram-W4KKPZXB-BmT_qM09.js → quadrantDiagram-CIZ2JOQS-BBy7w4kD.js} +3 -3
  115. package/dist-web/assets/{quadrantDiagram-W4KKPZXB-C0kPuyNP.js → quadrantDiagram-CIZ2JOQS-U483z0er.js} +3 -3
  116. package/dist-web/assets/railroadDiagram-AXF67PYL-D80a2_DJ.js +1 -0
  117. package/dist-web/assets/railroadDiagram-AXF67PYL-DX8y0MzW.js +1 -0
  118. package/dist-web/assets/{requirementDiagram-4Y6WPE33-C0YP_Amt.js → requirementDiagram-LRYGKXZP-CeyHfq8t.js} +3 -3
  119. package/dist-web/assets/{requirementDiagram-4Y6WPE33-CZrxH1Y2.js → requirementDiagram-LRYGKXZP-DGD5J_4k.js} +3 -3
  120. package/dist-web/assets/sankeyDiagram-W5VNT64P-CCISkkrR.js +40 -0
  121. package/dist-web/assets/sankeyDiagram-W5VNT64P-CT5PdZz2.js +40 -0
  122. package/dist-web/assets/sequenceDiagram-SI44F4Z6-BeMzHWXI.js +162 -0
  123. package/dist-web/assets/sequenceDiagram-SI44F4Z6-jQfm2XS7.js +162 -0
  124. package/dist-web/assets/sizeCapture-X5ZJPWSS-BQsTdtrv.js +1 -0
  125. package/dist-web/assets/sizeCapture-X5ZJPWSS-lRZsmCoS.js +1 -0
  126. package/dist-web/assets/stateDiagram-OKZ733FA-ClCgTdUm.js +1 -0
  127. package/dist-web/assets/stateDiagram-OKZ733FA-Cv59z5YT.js +1 -0
  128. package/dist-web/assets/stateDiagram-v2-UEYNNEHI-R8jTc--F.js +1 -0
  129. package/dist-web/assets/stateDiagram-v2-UEYNNEHI-fi_lrTAx.js +1 -0
  130. package/dist-web/assets/swimlanes-SLNWSIFB-BCdOUN05.js +2 -0
  131. package/dist-web/assets/swimlanes-SLNWSIFB-Cu5l7SuR.js +1 -0
  132. package/dist-web/assets/swimlanesDiagram-ULZ7WXOC-BUd_uYK3.js +8 -0
  133. package/dist-web/assets/swimlanesDiagram-ULZ7WXOC-CalrsgPK.js +8 -0
  134. package/dist-web/assets/{timeline-definition-PNZ67QCA-DsVZdrZa.js → timeline-definition-Z64GVDOM-CMjnh4bu.js} +4 -4
  135. package/dist-web/assets/{timeline-definition-PNZ67QCA-DnB6Usl0.js → timeline-definition-Z64GVDOM-DpWutSKa.js} +4 -4
  136. package/dist-web/assets/vennDiagram-T6HMQDX7-DKJW_8oU.js +34 -0
  137. package/dist-web/assets/vennDiagram-T6HMQDX7-DVC5JVsc.js +34 -0
  138. package/dist-web/assets/{vue.runtime.esm-bundler-pgHGheCW.js → vue.runtime.esm-bundler-BwwRtQwQ.js} +1 -1
  139. package/dist-web/assets/{wardleyDiagram-YWT4CUSO-oBauTCEw.js → wardleyDiagram-T6FBY63Y-BK2mrq7L.js} +3 -3
  140. package/dist-web/assets/{wardleyDiagram-YWT4CUSO-DCiyDQNB.js → wardleyDiagram-T6FBY63Y-oUvgepFn.js} +3 -3
  141. package/dist-web/assets/xychartDiagram-ELKLHX3M-DI6n79q0.js +7 -0
  142. package/dist-web/assets/xychartDiagram-ELKLHX3M-DUJu9F7-.js +7 -0
  143. package/dist-web/index.html +1 -1
  144. package/dist-web/vis/index.html.gz +0 -0
  145. package/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
  146. package/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
  147. package/package.json +9 -11
  148. package/skills/screenshot-lesen/SKILL.md +0 -1
  149. package/skills/web-lesen/SKILL.md +0 -1
  150. package/telegram-plugin/dist/bridge.mjs +7 -25
  151. package/telegram-plugin/dist/mcp-server.mjs +236 -71
  152. package/dist-web/assets/arc-4xPfymbf.js +0 -1
  153. package/dist-web/assets/arc-Doj0wRZ0.js +0 -1
  154. package/dist-web/assets/architectureDiagram-3BPJPVTR-BGih283a.js +0 -36
  155. package/dist-web/assets/architectureDiagram-3BPJPVTR-CQ09RrbH.js +0 -36
  156. package/dist-web/assets/blockDiagram-GPEHLZMM-3ShMf1gu.js +0 -132
  157. package/dist-web/assets/blockDiagram-GPEHLZMM-CAtDjkJt.js +0 -132
  158. package/dist-web/assets/channel-DNkUo9e6.js +0 -1
  159. package/dist-web/assets/channel-DcnUTIGB.js +0 -1
  160. package/dist-web/assets/chunk-AQP2D5EJ-FS8-f8lF.js +0 -231
  161. package/dist-web/assets/chunk-AQP2D5EJ-UKhb4V4r.js +0 -231
  162. package/dist-web/assets/classDiagram-4FO5ZUOK-B1ZO8EbE.js +0 -1
  163. package/dist-web/assets/classDiagram-4FO5ZUOK-xk6cM9Kq.js +0 -1
  164. package/dist-web/assets/classDiagram-v2-Q7XG4LA2-B1ZO8EbE.js +0 -1
  165. package/dist-web/assets/classDiagram-v2-Q7XG4LA2-xk6cM9Kq.js +0 -1
  166. package/dist-web/assets/dagre-BM42HDAG-CmUO9qKN.js +0 -4
  167. package/dist-web/assets/dagre-BM42HDAG-DLMfLCoV.js +0 -4
  168. package/dist-web/assets/diagram-2AECGRRQ-DQTst0OH.js +0 -43
  169. package/dist-web/assets/diagram-2AECGRRQ-L74iLMqd.js +0 -43
  170. package/dist-web/assets/diagram-5GNKFQAL-BiBm7CJR.js +0 -10
  171. package/dist-web/assets/diagram-5GNKFQAL-DoE6q7H1.js +0 -10
  172. package/dist-web/assets/diagram-OG6HWLK6-BHCt1E0n.js +0 -24
  173. package/dist-web/assets/diagram-OG6HWLK6-DRyxjFMa.js +0 -24
  174. package/dist-web/assets/erDiagram-TEJ5UH35-BoDczjGG.js +0 -85
  175. package/dist-web/assets/erDiagram-TEJ5UH35-yd6SOv_7.js +0 -85
  176. package/dist-web/assets/flowDiagram-I6XJVG4X-DHoceI7r.js +0 -162
  177. package/dist-web/assets/flowDiagram-I6XJVG4X-DkYNQv0R.js +0 -162
  178. package/dist-web/assets/ganttDiagram-6RSMTGT7-Cg1TQBc0.js +0 -292
  179. package/dist-web/assets/ganttDiagram-6RSMTGT7-Z6klo7KK.js +0 -292
  180. package/dist-web/assets/layout-C1ojF0zw.js +0 -1
  181. package/dist-web/assets/layout-SsrduOYp.js +0 -1
  182. package/dist-web/assets/mermaid.core-D_lKT0dR.js +0 -309
  183. package/dist-web/assets/mermaidParser.worker-Dx4jPi9z.js +0 -313
  184. package/dist-web/assets/pieDiagram-4H26LBE5-BU41t2A_.js +0 -30
  185. package/dist-web/assets/pieDiagram-4H26LBE5-BkwDAvbt.js +0 -30
  186. package/dist-web/assets/sankeyDiagram-5OEKKPKP-De_o7hDr.js +0 -40
  187. package/dist-web/assets/sankeyDiagram-5OEKKPKP-Dvuj6bMA.js +0 -40
  188. package/dist-web/assets/sequenceDiagram-3UESZ5HK-DuCrgPyA.js +0 -162
  189. package/dist-web/assets/sequenceDiagram-3UESZ5HK-VAxffBe7.js +0 -162
  190. package/dist-web/assets/stateDiagram-AJRCARHV-CYLupxM7.js +0 -1
  191. package/dist-web/assets/stateDiagram-AJRCARHV-nDExQydZ.js +0 -1
  192. package/dist-web/assets/stateDiagram-v2-BHNVJYJU-BhEc7Thx.js +0 -1
  193. package/dist-web/assets/stateDiagram-v2-BHNVJYJU-BzwD_BIl.js +0 -1
  194. package/dist-web/assets/vennDiagram-CIIHVFJN-BBHQmCFf.js +0 -34
  195. package/dist-web/assets/vennDiagram-CIIHVFJN-Cfj-K9NW.js +0 -34
  196. package/dist-web/assets/wardley-L42UT6IY-BJFn8eDD.js +0 -173
  197. package/dist-web/assets/wardley-L42UT6IY-BSu8-4hg.js +0 -173
  198. package/dist-web/assets/xychartDiagram-2RQKCTM6-C2iZpl9I.js +0 -7
  199. package/dist-web/assets/xychartDiagram-2RQKCTM6-Db_VoDBV.js +0 -7
  200. package/mnemo/access_routes.js +0 -692
  201. package/mnemo/agent_governance.js +0 -4242
  202. package/mnemo/agent_mail.js +0 -901
  203. package/mnemo/bootstrap_auto.js +0 -137
  204. package/mnemo/brief_coordination.js +0 -226
  205. package/mnemo/code_read_tools.js +0 -375
  206. package/mnemo/context_preview_tools.js +0 -603
  207. package/mnemo/embeddings.js +0 -66
  208. package/mnemo/external_repo_ops.js +0 -575
  209. package/mnemo/facts/example-project-rules.json +0 -90
  210. package/mnemo/facts/example.json +0 -34
  211. package/mnemo/identity_schema.sql +0 -139
  212. package/mnemo/journal_schema.js +0 -561
  213. package/mnemo/loop_doctor_tools.js +0 -661
  214. package/mnemo/mail_secret_refs.js +0 -150
  215. package/mnemo/mcp.js +0 -9309
  216. package/mnemo/memory_consolidation.js +0 -1914
  217. package/mnemo/memory_health_tools.js +0 -165
  218. package/mnemo/package.json +0 -79
  219. package/mnemo/protected_scope_gate.js +0 -627
  220. package/mnemo/resource_access_control.js +0 -684
  221. package/mnemo/runtime_governance.js +0 -1256
  222. package/mnemo/runtime_turn_gate.js +0 -862
  223. package/mnemo/sandbox.js +0 -143
  224. package/mnemo/schema.sql +0 -389
  225. package/mnemo/shared_utils.js +0 -763
  226. package/mnemo/skills/agent-auto-resume/SKILL.md +0 -56
  227. package/mnemo/skills/agent_hand/SKILL.md +0 -43
  228. package/mnemo/skills/agent_hand/run.js +0 -63
  229. package/mnemo/skills/book_flight/SKILL.md +0 -34
  230. package/mnemo/skills/external_repo_review/SKILL.md +0 -43
  231. package/mnemo/skills/external_repo_review/run.js +0 -73
  232. package/mnemo/skills/pay_invoice/SKILL.md +0 -34
  233. package/mnemo/team_quality_ops.js +0 -944
  234. package/mnemo/timeline_report_tools.js +0 -810
  235. package/mnemo/write_gate_risk.js +0 -80
  236. package/mnemo/writer_health.js +0 -152
  237. package/skills/doku-ingestion/SKILL.md +0 -48
  238. package/skills/doku-ingestion/ingest_docs.py +0 -133
package/LIESMICH.txt CHANGED
@@ -1,5 +1,5 @@
1
- BLUN King für macOS
2
- ===================
1
+ BLUN King für macOS und Windows
2
+ ===============================
3
3
 
4
4
  Voraussetzung
5
5
  -------------
@@ -7,18 +7,43 @@ Node.js 24.15 oder neuer muss installiert sein.
7
7
 
8
8
  Installation
9
9
  ------------
10
- Das bereitgestellte Paket global installieren:
10
+ Die geprüfte Version exakt global installieren:
11
11
 
12
- npm install -g blun-king-cli
12
+ npm install -g blun-king-cli@9.1.0
13
13
 
14
14
  Start
15
15
  -----
16
16
 
17
- blun Lokale Konsole ohne Telegram
18
- king Dieselbe Konsole mit Telegram
17
+ blun Dieselbe CLI, ohne Telegram automatisch anzubinden
18
+ king Dieselbe CLI, mit automatisch angebundenem Telegram-Kanal
19
+
20
+ Beide Startbefehle verwenden dieselbe Version, dasselbe Konto, dasselbe Modell
21
+ und dieselben Befehle.
22
+
23
+ Nachweisbare Arbeitsabläufe
24
+ ---------------------------
25
+
26
+ blun proof Prüfergebnisse und Artefakte mit SHA-256 belegen
27
+ blun brief Einen versionierten Projektauftrag anlegen
28
+ blun handoff Eine Sitzung zwischen CLI, Desktop und Web übergeben
29
+ blun replay Einen bereinigten Arbeitsverlauf erzeugen
30
+ blun guard Belegintegrität und aktuelle Artefakte prüfen
31
+ blun demo Eine bereinigte statische Projektdemo erzeugen
32
+ blun workspace Isolierte Git-Arbeitsbereiche verwalten
33
+
34
+ Alle Befehle funktionieren identisch mit `king`.
35
+
36
+ Aktualisieren
37
+ -------------
38
+
39
+ blun update
40
+
41
+ `king update` und `upgrade` sind gleichwertig. Der Updater bleibt im installierten
42
+ Stable- oder Next-Kanal, verhindert Rückstufungen und installiert nur eine zuvor
43
+ aufgelöste exakte Paketversion.
19
44
 
20
45
  Beim ersten Start in der Konsole /login eingeben. Der Browser öffnet den
21
- BLUN-OAuth-Login. Nach der Freigabe stehen King, Queen und Prince bereit.
46
+ BLUN-OAuth-Login.
22
47
  Ein API-Schlüssel wird weder abgefragt noch in die Konfiguration geschrieben.
23
48
 
24
49
  Telegram einrichten
@@ -30,9 +55,3 @@ Telegram einrichten
30
55
 
31
56
  3. `king` starten und den angezeigten Pairing-Code mit
32
57
  /telegram:access pair CODE bestätigen.
33
-
34
- Lokale Daten
35
- ------------
36
- Konfiguration, Anmeldedaten, Telegram-Zustand und Mnemo liegen unter ~/.blun.
37
- Die privaten Verzeichnisse und Dateien werden auf macOS mit restriktiven
38
- Dateirechten angelegt.
package/README.md CHANGED
@@ -3,41 +3,60 @@
3
3
  Dieses Verzeichnis ist das Gerüst des öffentlichen npm-Pakets `blun-king-cli`
4
4
  (Erstveröffentlichung 8.0.0, 06.07.2026, Account `blunking`).
5
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.0
13
+ ```
14
+
6
15
  ## Reproduzierbares Staging und Packen
7
16
 
8
17
  Der Schritt baut nichts, installiert nichts und veröffentlicht nichts. Vorher müssen
9
- `apps/blun-king/dist/main.mjs`, `dist-web`, die Darwin-Natives sowie
18
+ `apps/blun-king/dist/main.mjs`, `dist-web`, die Darwin- und Windows-Natives sowie
10
19
  `plugins/telegram/dist` bereits frisch gebaut sein.
11
20
 
12
- Mnemo ist kein Teil dieses Repos. Seine Quelle muss deshalb immer explizit angegeben
13
- werden; ein benutzerspezifischer Pfad wird nie angenommen:
14
-
15
- ```text
16
- npm run stage:mac -- /pfad/zu/mnemo/packages/core
17
- npm run pack:mac -- /pfad/zu/mnemo/packages/core
18
- ```
19
-
20
- Alternativ kann `BLUN_MNEMO_SOURCE` gesetzt werden. Das Staging landet standardmäßig
21
+ Das Staging landet standardmäßig
21
22
  unter `.stage/package`, das Tarball unter `.stage/artifacts`.
22
23
  `BLUN_NPM_STAGE_DIR` und `BLUN_NPM_ARTIFACT_DIR` können beide Ziele überschreiben;
23
24
  beim direkten Skriptaufruf stehen zusätzlich `--output` und `--artifacts` bereit.
24
25
 
25
26
  Der Schritt validiert alle Pflichtartefakte vor dem Leeren des alten Stagings. Er
26
27
  kopiert nur die Paket-Hülle, `blun.mjs`, `dist-web`, `native`, Telegrams
27
- `dist`/Manifest/Commands, die Repo-Skills und die angegebene Mnemo-Runtime. Lokale
28
- Mnemo-Zustände und Geheimnisse (`mnemo.db*`, `.env*`, `facts`, `logs`, `media`,
29
- `sources`, `tenants`, `tmp`, `node_modules`) werden ausgeschlossen. Die
30
- Mnemo-Abhängigkeiten werden in das gestagte `package.json` übernommen; Konflikte
31
- brechen vor dem Packen ab.
28
+ `dist`/Manifest/Commands und die Repo-Skills.
32
29
 
33
30
  ## Startmodi
34
31
 
35
- `blun` startet die lokale Konsole ohne Telegram. `king` startet dieselbe
36
- Konsole mit Telegram-Kanal, Pairing-Befehl und Telegram-Werkzeugen. Der
37
- Unterschied gilt nur für den laufenden Prozess; die gespeicherte
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
38
36
  Plugin-Konfiguration wird nicht umgeschrieben.
39
37
 
40
- Beim ersten Start werden das Telegram-Plugin, die lokale Mnemo-Runtime und die
41
- mitgelieferten Skills eingerichtet. Die Anmeldung erfolgt anschließend in der
38
+ Beim ersten Start werden das Telegram-Plugin und die mitgelieferten Skills
39
+ eingerichtet. Die Anmeldung erfolgt anschließend in der
42
40
  Konsole mit `/login` über den BLUN-OAuth-Server. Das Paket erzeugt keine
43
41
  statische Anbieter- oder API-Key-Konfiguration.
42
+
43
+ ## Nachweisbare Arbeitsabläufe
44
+
45
+ Version 9.1.0 enthält sieben zusätzliche, getrennt nutzbare Befehlsgruppen:
46
+
47
+ - `proof` belegt Prüfungen und Artefakte mit SHA-256.
48
+ - `brief` erstellt einen versionierten Projektauftrag.
49
+ - `handoff` übergibt eine Sitzung zwischen CLI, Desktop und Web.
50
+ - `replay` erzeugt einen bereinigten Arbeitsverlauf.
51
+ - `guard` prüft Belegintegrität und aktuelle Artefakte.
52
+ - `demo` erzeugt eine bereinigte statische Projektdemo.
53
+ - `workspace` verwaltet isolierte Git-Arbeitsbereiche.
54
+
55
+ Sie stehen unter `blun` und `king` identisch zur Verfügung.
56
+
57
+ ## Aktualisieren
58
+
59
+ `blun update`, `king update` und die jeweilige Variante `upgrade` verwenden
60
+ denselben abgesicherten Updater. Er bleibt im installierten Stable- oder
61
+ Next-Kanal, verhindert Rückstufungen und übergibt npm ausschließlich eine zuvor
62
+ aufgelöste exakte Paketversion.
package/bin/blun.js CHANGED
@@ -1,192 +1,280 @@
1
1
  #!/usr/bin/env node
2
2
  'use strict';
3
- /*
4
- * BLUN CLI Launcher (npm) Erststart richtet alles ein:
5
- * 1. King richtet das Telegram-Plugin im BLUN_HOME ein
6
- * 2. Eigene lokale Memory (mnemo, SQLite) unter ~/.blun/mnemo — kein Hub,
7
- * alles privat auf dem Rechner, ueberlebt Sessions und Updates.
8
- * Danach: TUI starten. Anmeldung und Modellkatalog kommen ueber BLUN OAuth.
9
- */
3
+
4
+ // This public entry must stay self-contained. Package-local modules are loaded
5
+ // only after the update owner proves that the package root is not being replaced.
6
+ const { createHash } = require('node:crypto');
10
7
  const fs = require('node:fs');
11
- const path = require('node:path');
8
+ const net = require('node:net');
12
9
  const os = require('node:os');
13
- const { spawnSync, spawn } = require('node:child_process');
14
- const {
15
- LAUNCHER_MODES,
16
- NPM_PACKAGE_UPDATE_COMMAND,
17
- createLauncherEnvironment,
18
- isNpmPackageUpdateRequest,
19
- launcherModeFromArgv,
20
- } = require('./launcher-mode');
21
- const { installManagedTelegramPlugin } = require('./plugin-bootstrap');
22
- const {
23
- ensurePrivateDirectory,
24
- securePrivateFile,
25
- writePrivateFile,
26
- } = require('./private-paths');
27
-
28
- const PKG = path.resolve(__dirname, '..');
29
- const HOME = os.homedir();
30
- const configuredBlunHome = String(process.env.BLUN_HOME || '').trim();
31
- const BLUN = configuredBlunHome ? path.resolve(configuredBlunHome) : path.join(HOME, '.blun');
32
- const MODE = launcherModeFromArgv(process.argv);
33
- const ARGS = process.argv.slice(2);
34
-
35
- if (ARGS.some((arg) => arg === '--version' || arg === '-V')) {
36
- const { version } = JSON.parse(fs.readFileSync(path.join(PKG, 'package.json'), 'utf8'));
37
- if (typeof version !== 'string' || version.length === 0) {
38
- throw new Error('Ungueltige Paketversion in package.json');
10
+ const path = require('node:path');
11
+
12
+ const LEASE_PROTOCOL_VERSION = 'BLUN_UPDATE_LEASE_V3';
13
+ const LEASE_PROBE_TIMEOUT_MS = 500;
14
+ const MAX_POSIX_SOCKET_PATH_BYTES = 96;
15
+ const PACKAGE_ROOT = path.resolve(__dirname, '..');
16
+
17
+ function deriveLeaseEndpoint(role) {
18
+ const realpath = fs.realpathSync.native || fs.realpathSync;
19
+ let identity = realpath(PACKAGE_ROOT);
20
+ if (!fs.statSync(identity).isDirectory()) throw new Error('INVALID_PACKAGE_ROOT');
21
+ identity = identity.replaceAll('\\', '/');
22
+ if (process.platform === 'win32') identity = identity.toLowerCase();
23
+ const digest = createHash('sha256')
24
+ .update(`blun-update-v3\0${role}\0${identity}`)
25
+ .digest('hex');
26
+ const magic = `${LEASE_PROTOCOL_VERSION} ${digest}\n`;
27
+ if (process.platform === 'win32') {
28
+ return {
29
+ magic,
30
+ path: `\\\\.\\pipe\\blun-update-v3-${digest.slice(0, 32)}`,
31
+ platform: 'win32',
32
+ };
33
+ }
34
+
35
+ const uid = typeof process.getuid === 'function' ? process.getuid() : undefined;
36
+ const directoryName = `blun-update-${uid ?? digest.slice(0, 12)}`;
37
+ let directory = path.posix.join(os.tmpdir().replaceAll('\\', '/'), directoryName);
38
+ let socketPath = path.posix.join(directory, `lease-${digest.slice(0, 24)}.sock`);
39
+ if (Buffer.byteLength(socketPath, 'utf8') > MAX_POSIX_SOCKET_PATH_BYTES) {
40
+ directory = path.posix.join('/tmp', directoryName);
41
+ socketPath = path.posix.join(directory, `lease-${digest.slice(0, 24)}.sock`);
39
42
  }
40
- process.stdout.write(`${version}\n`);
41
- process.exit(0);
43
+ if (Buffer.byteLength(socketPath, 'utf8') > MAX_POSIX_SOCKET_PATH_BYTES) {
44
+ throw new Error('UPDATE_LEASE_SOCKET_PATH_TOO_LONG');
45
+ }
46
+ return { directory, magic, path: socketPath, platform: process.platform };
42
47
  }
43
48
 
44
- if (isNpmPackageUpdateRequest(ARGS)) {
45
- process.stdout.write(`${NPM_PACKAGE_UPDATE_COMMAND}\n`);
46
- process.exit(0);
49
+ function ensurePrivateSocketDirectory(endpoint) {
50
+ if (endpoint.platform === 'win32') return;
51
+ fs.mkdirSync(endpoint.directory, { recursive: true, mode: 0o700 });
52
+ const stat = fs.lstatSync(endpoint.directory);
53
+ if (!stat.isDirectory() || stat.isSymbolicLink()) {
54
+ throw new Error('INVALID_UPDATE_LEASE_DIRECTORY');
55
+ }
56
+ if (typeof process.getuid === 'function'
57
+ && Number.isInteger(stat.uid)
58
+ && stat.uid !== process.getuid()) {
59
+ throw new Error('INVALID_UPDATE_LEASE_DIRECTORY_OWNER');
60
+ }
61
+ fs.chmodSync(endpoint.directory, 0o700);
47
62
  }
48
63
 
49
- /**
50
- * Prueft hoechstens einmal pro Tag, ob eine neuere Version von blun-king-cli
51
- * auf npm liegt, und zeigt einen dezenten Hinweis. Alle Fehler werden
52
- * verschluckt — der Start darf davon NIE abhaengen.
53
- */
54
- async function maybeShowUpdateHint(pkgRoot, blunDir) {
55
- try {
56
- const own = JSON.parse(fs.readFileSync(path.join(pkgRoot, 'package.json'), 'utf8'));
57
- const stamp = path.join(blunDir, 'update-check.json');
58
- let last = 0;
59
- try { last = JSON.parse(fs.readFileSync(stamp, 'utf8')).at || 0; } catch {}
60
- if (Date.now() - last < 24 * 60 * 60 * 1000) return;
61
-
62
- const latest = await new Promise((resolve) => {
63
- const req = require('node:https').get(
64
- 'https://registry.npmjs.org/blun-king-cli/latest',
65
- { timeout: 2500, headers: { accept: 'application/json' } },
66
- (res) => {
67
- let body = '';
68
- res.on('data', (c) => (body += c));
69
- res.on('end', () => {
70
- try { resolve(JSON.parse(body).version); } catch { resolve(null); }
71
- });
72
- },
73
- );
74
- req.on('error', () => resolve(null));
75
- req.on('timeout', () => { req.destroy(); resolve(null); });
64
+ function closeServer(server) {
65
+ return new Promise((resolve) => {
66
+ if (!server.listening) {
67
+ resolve();
68
+ return;
69
+ }
70
+ try {
71
+ server.close(() => resolve());
72
+ } catch {
73
+ resolve();
74
+ }
75
+ });
76
+ }
77
+
78
+ function listenForLease(endpoint) {
79
+ return new Promise((resolve, reject) => {
80
+ const server = net.createServer((socket) => {
81
+ socket.on('error', () => {});
82
+ socket.end(endpoint.magic);
76
83
  });
84
+ const onError = (error) => {
85
+ server.removeListener('error', onError);
86
+ reject(error);
87
+ };
88
+ server.once('error', onError);
89
+ server.listen({ path: endpoint.path, exclusive: true }, () => {
90
+ server.removeListener('error', onError);
91
+ resolve(server);
92
+ });
93
+ });
94
+ }
77
95
 
78
- try { fs.writeFileSync(stamp, JSON.stringify({ at: Date.now() })); } catch {}
79
- if (latest && latest !== own.version && isNewer(latest, own.version)) {
80
- console.log('');
81
- console.log(' Update verfuegbar: ' + own.version + ' -> ' + latest);
82
- console.log(' Aktualisieren mit: npm i -g blun-king-cli');
83
- console.log('');
96
+ function probeLease(endpoint) {
97
+ return new Promise((resolve) => {
98
+ let received = '';
99
+ let settled = false;
100
+ let socket;
101
+ const finish = (state) => {
102
+ if (settled) return;
103
+ settled = true;
104
+ clearTimeout(timer);
105
+ try {
106
+ socket?.destroy();
107
+ } catch {}
108
+ // oxlint-disable-next-line promise/no-multiple-resolved -- settled is the idempotence guard.
109
+ resolve(state);
110
+ };
111
+ const timer = setTimeout(() => finish('foreign'), LEASE_PROBE_TIMEOUT_MS);
112
+ timer.unref?.();
113
+ try {
114
+ socket = net.createConnection({ path: endpoint.path });
115
+ socket.setEncoding('utf8');
116
+ socket.on('data', (chunk) => {
117
+ received += String(chunk);
118
+ if (Buffer.byteLength(received, 'utf8') > Buffer.byteLength(endpoint.magic, 'utf8')) {
119
+ finish('foreign');
120
+ }
121
+ });
122
+ socket.once('end', () => finish(received === endpoint.magic ? 'owner' : 'foreign'));
123
+ socket.once('error', (error) => {
124
+ finish(error?.code === 'ECONNREFUSED' || error?.code === 'ENOENT'
125
+ ? 'stale'
126
+ : 'foreign');
127
+ });
128
+ socket.once('close', () => {
129
+ if (!settled) finish(received === endpoint.magic ? 'owner' : 'foreign');
130
+ });
131
+ } catch (error) {
132
+ finish(error?.code === 'ECONNREFUSED' || error?.code === 'ENOENT'
133
+ ? 'stale'
134
+ : 'foreign');
84
135
  }
85
- } catch {
86
- // Update-Check ist Kosmetik — niemals den Start blockieren.
136
+ });
137
+ }
138
+
139
+ function observeSocket(endpoint) {
140
+ if (endpoint.platform === 'win32') return { state: 'not_applicable' };
141
+ try {
142
+ const stat = fs.lstatSync(endpoint.path);
143
+ if (!stat.isSocket() || stat.isSymbolicLink()) return { state: 'unsafe' };
144
+ return { dev: stat.dev, ino: stat.ino, state: 'socket' };
145
+ } catch (error) {
146
+ return error?.code === 'ENOENT' ? { state: 'missing' } : { state: 'unsafe' };
87
147
  }
88
148
  }
89
149
 
90
- function isNewer(a, b) {
91
- const pa = String(a).split('.').map((n) => parseInt(n, 10) || 0);
92
- const pb = String(b).split('.').map((n) => parseInt(n, 10) || 0);
93
- for (let i = 0; i < 3; i++) {
94
- if ((pa[i] || 0) > (pb[i] || 0)) return true;
95
- if ((pa[i] || 0) < (pb[i] || 0)) return false;
150
+ function removeObservedSocket(endpoint, observed) {
151
+ if (endpoint.platform === 'win32') return false;
152
+ try {
153
+ const stat = fs.lstatSync(endpoint.path);
154
+ if (observed.state !== 'socket'
155
+ || !stat.isSocket()
156
+ || stat.isSymbolicLink()
157
+ || stat.dev !== observed.dev
158
+ || stat.ino !== observed.ino) {
159
+ return false;
160
+ }
161
+ fs.unlinkSync(endpoint.path);
162
+ return true;
163
+ } catch (error) {
164
+ return error?.code === 'ENOENT' && observed.state === 'missing';
96
165
  }
97
- return false;
98
166
  }
99
167
 
100
- (async () => {
101
- ensurePrivateDirectory(BLUN);
102
-
103
- // --- 1. Bestehende Konfiguration absichern -------------------------------
104
- // Ein frischer Start bleibt absichtlich ohne statischen Anbieter. /login
105
- // provisioniert King, Queen und Prince ueber den BLUN-OAuth-Server.
106
- const cfgFile = path.join(BLUN, 'config.toml');
107
- if (fs.existsSync(cfgFile)) securePrivateFile(cfgFile);
108
-
109
- // --- 2. Telegram-Plugin + Token-Vorlage (nur King) -----------------------
110
- if (MODE === LAUNCHER_MODES.KING) {
111
- installManagedTelegramPlugin({ packageRoot: PKG, blunDir: BLUN });
112
- const channelDir = path.join(BLUN, 'channels', 'telegram');
113
- fs.mkdirSync(channelDir, { recursive: true });
114
- const envFile = path.join(channelDir, '.env');
115
- if (!fs.existsSync(envFile)) {
116
- writePrivateFile(envFile, 'BLUN_TELEGRAM_BOT_TOKEN=HIER_DEIN_BOT_TOKEN_EINFUEGEN\n');
117
- } else {
118
- securePrivateFile(envFile);
168
+ function recordSocket(endpoint) {
169
+ if (endpoint.platform === 'win32') return undefined;
170
+ const stat = fs.lstatSync(endpoint.path);
171
+ if (!stat.isSocket() || stat.isSymbolicLink()) throw new Error('INVALID_UPDATE_LEASE_SOCKET');
172
+ fs.chmodSync(endpoint.path, 0o600);
173
+ return { dev: stat.dev, ino: stat.ino };
174
+ }
175
+
176
+ function removeOwnedSocket(endpoint, identity) {
177
+ if (endpoint.platform === 'win32' || !identity) return;
178
+ try {
179
+ const stat = fs.lstatSync(endpoint.path);
180
+ if (stat.isSocket()
181
+ && !stat.isSymbolicLink()
182
+ && stat.dev === identity.dev
183
+ && stat.ino === identity.ino) {
184
+ fs.unlinkSync(endpoint.path);
119
185
  }
186
+ } catch {}
187
+ }
188
+
189
+ async function acquireNoticeLease() {
190
+ let endpoint;
191
+ try {
192
+ endpoint = deriveLeaseEndpoint('notice');
193
+ ensurePrivateSocketDirectory(endpoint);
194
+ } catch {
195
+ return { acquired: false, reason: 'unavailable' };
120
196
  }
121
197
 
122
- // --- 2b. Built-in-Skills installieren (fehlende ergaenzen, nie
123
- // vorhandene ueberschreiben User-Anpassungen bleiben) -----------
124
- const skillsSrc = path.join(PKG, 'skills');
125
- const skillsDst = path.join(BLUN, 'skills');
126
- if (fs.existsSync(skillsSrc)) {
127
- fs.mkdirSync(skillsDst, { recursive: true });
128
- for (const entry of fs.readdirSync(skillsSrc)) {
129
- const dst = path.join(skillsDst, entry);
130
- if (!fs.existsSync(dst)) {
131
- fs.cpSync(path.join(skillsSrc, entry), dst, { recursive: true });
198
+ let server;
199
+ for (let attempt = 0; attempt < 2; attempt += 1) {
200
+ try {
201
+ server = await listenForLease(endpoint);
202
+ break;
203
+ } catch (error) {
204
+ if (error?.code !== 'EADDRINUSE') return { acquired: false, reason: 'unavailable' };
205
+ const observed = observeSocket(endpoint);
206
+ const state = await probeLease(endpoint);
207
+ if (state === 'owner') return { acquired: false, reason: 'busy' };
208
+ if (state !== 'stale' || attempt > 0) return { acquired: false, reason: 'unavailable' };
209
+ if (endpoint.platform === 'win32') continue;
210
+ if (!removeObservedSocket(endpoint, observed)) {
211
+ return { acquired: false, reason: 'unavailable' };
132
212
  }
133
213
  }
134
214
  }
215
+ if (!server) return { acquired: false, reason: 'unavailable' };
216
+
217
+ let identity;
218
+ try {
219
+ identity = recordSocket(endpoint);
220
+ } catch {
221
+ await closeServer(server);
222
+ return { acquired: false, reason: 'unavailable' };
223
+ }
135
224
 
136
- // --- 3. Eigene lokale Memory (einmalig anlegen) --------------------------
137
- const memHome = path.join(BLUN, 'mnemo');
138
- const factsDir = path.join(memHome, 'facts');
139
- fs.mkdirSync(factsDir, { recursive: true });
140
- const dbFile = path.join(memHome, 'mnemo.db');
141
- const agent = (process.env.BLUN_MNEMO_AGENT || os.userInfo().username || 'agent')
142
- .toLowerCase().replaceAll(/[^a-z0-9_-]/g, '-') || 'agent';
143
- if (!fs.existsSync(dbFile)) {
144
- const result = spawnSync(process.execPath, [path.join(PKG, 'mnemo', 'bootstrap_auto.js')], {
145
- env: {
146
- ...process.env,
147
- BLUN_HOME: BLUN,
148
- MNEMO_DB: dbFile,
149
- MNEMO_AGENT: agent,
150
- MNEMO_OWNER_NAME: agent,
151
- MNEMO_FACTS_DIR: factsDir,
152
- MNEMO_ENV_FILE: path.join(memHome, '.env.local'),
153
- MNEMO_HOOK_ENV_FILE: path.join(BLUN, '.mnemo-hook.env'),
154
- MNEMO_HUB_URL: '',
225
+ let owned = true;
226
+ let released = false;
227
+ server.on('error', () => { owned = false; });
228
+ server.on('close', () => { owned = false; });
229
+ return {
230
+ acquired: true,
231
+ lease: Object.freeze({
232
+ assertOwned() {
233
+ if (!owned || !server.listening) throw new Error('UPDATE_LEASE_LOST');
155
234
  },
156
- stdio: 'ignore',
235
+ async release() {
236
+ if (released) return;
237
+ released = true;
238
+ owned = false;
239
+ await closeServer(server);
240
+ removeOwnedSocket(endpoint, identity);
241
+ },
242
+ }),
243
+ };
244
+ }
245
+
246
+ async function installLeaseIsClear() {
247
+ try {
248
+ const endpoint = deriveLeaseEndpoint('install');
249
+ ensurePrivateSocketDirectory(endpoint);
250
+ return await probeLease(endpoint) === 'stale';
251
+ } catch {
252
+ return false;
253
+ }
254
+ }
255
+
256
+ async function main() {
257
+ const result = await acquireNoticeLease();
258
+ if (!result.acquired) return;
259
+ try {
260
+ if (!await installLeaseIsClear()) return;
261
+ result.lease.assertOwned();
262
+ const { runLauncher } = require('./launcher-runtime');
263
+ result.lease.assertOwned();
264
+ const filename = path.basename(__filename).toLowerCase();
265
+ await runLauncher({
266
+ mode: filename.startsWith('king') ? 'king' : 'blun',
267
+ noticeLease: result.lease,
157
268
  });
158
- if (result.status === 0 && fs.existsSync(dbFile)) {
159
- console.log(' Eigene Memory angelegt (Agent: ' + agent + ') — merkt sich alles, Sessions-uebergreifend.');
160
- } else {
161
- console.error(' Warnung: Memory konnte nicht angelegt werden — BLUN laeuft trotzdem, nur ohne Langzeitgedaechtnis.');
162
- }
269
+ } finally {
270
+ await result.lease.release();
163
271
  }
272
+ }
164
273
 
165
- // --- 3b. Update-Hinweis. Best-effort, blockiert NIE und prueft hoechstens
166
- // einmal pro Tag die neueste Version auf npm. ---------------------
167
- await maybeShowUpdateHint(PKG, BLUN);
168
-
169
- // --- 4. Start -------------------------------------------------------------
170
- const env = createLauncherEnvironment(process.env, MODE);
171
- env.BLUN_HOME = BLUN;
172
- env.BLUN_MODEL_MAX_COMPLETION_TOKENS = env.BLUN_MODEL_MAX_COMPLETION_TOKENS || '32768';
173
- env.BLUN_MNEMO_MCP = path.join(PKG, 'mnemo', 'mcp.js');
174
- env.BLUN_MNEMO_AGENT = agent;
175
- env.MNEMO_DB = dbFile;
176
- env.MNEMO_FACTS_DIR = factsDir;
177
- env.MNEMO_HUB_URL = '';
178
-
179
- const workspace = path.join(HOME, 'BLUN-Workspace');
180
- fs.mkdirSync(workspace, { recursive: true });
181
-
182
- const child = spawn(process.execPath, [path.join(PKG, 'blun.mjs'), '--yolo', ...ARGS], {
183
- cwd: workspace,
184
- env,
185
- stdio: 'inherit',
186
- });
187
- child.on('exit', (code) => process.exit(code ?? 0));
188
- })().catch((error) => {
274
+ // oxlint-disable-next-line unicorn/prefer-top-level-await -- Public npm bins are CommonJS.
275
+ void main().catch((error) => {
276
+ // oxlint-disable-next-line no-console -- Fatal launcher errors belong on stderr.
189
277
  console.error('BLUN Start fehlgeschlagen: '
190
278
  + (error && error.message ? error.message : String(error)));
191
- process.exit(1);
279
+ process.exitCode = 1;
192
280
  });
@@ -0,0 +1,47 @@
1
+ 'use strict';
2
+
3
+ const path = require('node:path');
4
+ const { pathToFileURL } = require('node:url');
5
+
6
+ const { tryAcquireUpdateLease } = require('./update-lease');
7
+
8
+ const CORE_LOADED_MESSAGE = 'blun-core-bootstrap-loaded';
9
+
10
+ async function runCoreBootstrap() {
11
+ const packageRoot = path.resolve(__dirname, '..');
12
+ const mainPath = path.join(packageRoot, 'blun.mjs');
13
+ const leaseResult = await tryAcquireUpdateLease({ packageRoot, role: 'install' });
14
+ if (!leaseResult.acquired) process.exit(75);
15
+
16
+ try {
17
+ leaseResult.lease.assertOwned();
18
+ process.argv = [process.execPath, mainPath, ...process.argv.slice(2)];
19
+ await import(pathToFileURL(mainPath).href);
20
+ leaseResult.lease.assertOwned();
21
+ } catch (error) {
22
+ await leaseResult.lease.release();
23
+ throw error;
24
+ }
25
+
26
+ // The bundled CLI loads package assets lazily after module evaluation. Keep
27
+ // the install lease for this process's lifetime, without keeping print/help
28
+ // commands alive solely because of the owner server.
29
+ leaseResult.lease.unref();
30
+
31
+ if (process.connected) {
32
+ try {
33
+ process.send({ type: CORE_LOADED_MESSAGE }, () => {
34
+ try {
35
+ process.disconnect();
36
+ } catch {}
37
+ });
38
+ } catch {}
39
+ }
40
+ }
41
+
42
+ if (require.main === module) {
43
+ // oxlint-disable-next-line unicorn/prefer-top-level-await -- Worker entry is CommonJS.
44
+ void runCoreBootstrap().catch(() => process.exit(1));
45
+ }
46
+
47
+ module.exports = { CORE_LOADED_MESSAGE, runCoreBootstrap };