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
@@ -0,0 +1,399 @@
1
+ 'use strict';
2
+
3
+ const { createHash } = require('node:crypto');
4
+ const fs = require('node:fs');
5
+ const net = require('node:net');
6
+ const os = require('node:os');
7
+ const path = require('node:path');
8
+
9
+ const LEASE_ADOPT_MESSAGE = 'blun-update-lease-adopted';
10
+ const LEASE_CANCEL_MESSAGE = 'blun-update-lease-cancel';
11
+ const LEASE_COMMIT_MESSAGE = 'blun-update-lease-commit';
12
+ const LEASE_HANDOFF_MESSAGE = 'blun-update-lease-handoff';
13
+ const LEASE_BUSY_MESSAGE = 'blun-update-lease-busy';
14
+ const LEASE_UNAVAILABLE_MESSAGE = 'blun-update-lease-unavailable';
15
+ const LEASE_PROTOCOL_VERSION = 'BLUN_UPDATE_LEASE_V3';
16
+ const LEASE_PROBE_TIMEOUT_MS = 500;
17
+ const MAX_POSIX_SOCKET_PATH_BYTES = 96;
18
+
19
+ function canonicalPackageIdentity(packageRoot, options = {}) {
20
+ if (typeof packageRoot !== 'string' || packageRoot.trim().length === 0) {
21
+ throw new Error('UPDATE_PACKAGE_ROOT_REQUIRED');
22
+ }
23
+ const fsImpl = options.fsImpl || fs;
24
+ const platform = options.platform || process.platform;
25
+ const realpath = fsImpl.realpathSync.native || fsImpl.realpathSync;
26
+ let canonical = realpath(path.resolve(packageRoot));
27
+ if (!fsImpl.statSync(canonical).isDirectory()) throw new Error('INVALID_UPDATE_PACKAGE_ROOT');
28
+ canonical = canonical.replaceAll('\\', '/');
29
+ if (platform === 'win32') canonical = canonical.toLowerCase();
30
+ return canonical;
31
+ }
32
+
33
+ function deriveUpdateLeaseEndpoint(packageRoot, options = {}) {
34
+ const platform = options.platform || process.platform;
35
+ const role = options.role === 'install' ? 'install' : 'notice';
36
+ const identity = canonicalPackageIdentity(packageRoot, options);
37
+ const digest = createHash('sha256')
38
+ .update(`blun-update-v3\0${role}\0${identity}`)
39
+ .digest('hex');
40
+ const magic = `${LEASE_PROTOCOL_VERSION} ${digest}\n`;
41
+ if (platform === 'win32') {
42
+ return Object.freeze({
43
+ magic,
44
+ path: `\\\\.\\pipe\\blun-update-v3-${digest.slice(0, 32)}`,
45
+ platform,
46
+ });
47
+ }
48
+
49
+ const uid = options.uid ?? (typeof process.getuid === 'function' ? process.getuid() : undefined);
50
+ const directoryName = `blun-update-${uid ?? digest.slice(0, 12)}`;
51
+ const requestedRoot = String(options.socketDirectory || options.tempDir || os.tmpdir())
52
+ .replaceAll('\\', '/');
53
+ let directory = options.socketDirectory
54
+ ? requestedRoot
55
+ : path.posix.join(requestedRoot, directoryName);
56
+ let socketPath = path.posix.join(directory, `lease-${digest.slice(0, 24)}.sock`);
57
+ if (Buffer.byteLength(socketPath, 'utf8') > MAX_POSIX_SOCKET_PATH_BYTES) {
58
+ directory = path.posix.join('/tmp', directoryName);
59
+ socketPath = path.posix.join(directory, `lease-${digest.slice(0, 24)}.sock`);
60
+ }
61
+ if (Buffer.byteLength(socketPath, 'utf8') > MAX_POSIX_SOCKET_PATH_BYTES) {
62
+ throw new Error('UPDATE_LEASE_SOCKET_PATH_TOO_LONG');
63
+ }
64
+ return Object.freeze({ directory, magic, path: socketPath, platform });
65
+ }
66
+
67
+ function closeServer(server) {
68
+ return new Promise((resolve) => {
69
+ if (!server.listening) {
70
+ resolve();
71
+ return;
72
+ }
73
+ try {
74
+ server.close(() => resolve());
75
+ } catch {
76
+ resolve();
77
+ }
78
+ });
79
+ }
80
+
81
+ function ensurePrivateSocketDirectory(endpoint, options = {}) {
82
+ if (endpoint.platform === 'win32') return;
83
+ const fsImpl = options.fsImpl || fs;
84
+ fsImpl.mkdirSync(endpoint.directory, { recursive: true, mode: 0o700 });
85
+ const stat = fsImpl.lstatSync(endpoint.directory);
86
+ if (!stat.isDirectory() || stat.isSymbolicLink()) {
87
+ throw new Error('INVALID_UPDATE_LEASE_DIRECTORY');
88
+ }
89
+ if (typeof process.getuid === 'function'
90
+ && Number.isInteger(stat.uid)
91
+ && stat.uid !== process.getuid()) {
92
+ throw new Error('INVALID_UPDATE_LEASE_DIRECTORY_OWNER');
93
+ }
94
+ fsImpl.chmodSync(endpoint.directory, 0o700);
95
+ }
96
+
97
+ function listenForLease(endpoint, options = {}) {
98
+ const netImpl = options.netImpl || net;
99
+ return new Promise((resolve, reject) => {
100
+ const server = netImpl.createServer((socket) => {
101
+ socket.on('error', () => {});
102
+ socket.end(endpoint.magic);
103
+ });
104
+ const onError = (error) => {
105
+ server.removeListener('error', onError);
106
+ reject(error);
107
+ };
108
+ server.once('error', onError);
109
+ server.listen({ path: endpoint.path, exclusive: true }, () => {
110
+ server.removeListener('error', onError);
111
+ resolve(server);
112
+ });
113
+ });
114
+ }
115
+
116
+ function probeExistingLease(endpoint, options = {}) {
117
+ const netImpl = options.netImpl || net;
118
+ const timeoutMs = options.probeTimeoutMs || LEASE_PROBE_TIMEOUT_MS;
119
+ return new Promise((resolve) => {
120
+ let settled = false;
121
+ let received = '';
122
+ let socket;
123
+ const finish = (state, error) => {
124
+ if (settled) return;
125
+ settled = true;
126
+ clearTimeout(timer);
127
+ try {
128
+ socket?.destroy();
129
+ } catch {}
130
+ // oxlint-disable-next-line promise/no-multiple-resolved -- settled is the idempotence guard.
131
+ resolve({ error, state });
132
+ };
133
+ const timer = setTimeout(() => finish('foreign'), timeoutMs);
134
+ timer.unref?.();
135
+ try {
136
+ socket = netImpl.createConnection({ path: endpoint.path });
137
+ socket.setEncoding?.('utf8');
138
+ socket.on('data', (chunk) => {
139
+ received += String(chunk);
140
+ if (Buffer.byteLength(received, 'utf8') > Buffer.byteLength(endpoint.magic, 'utf8')) {
141
+ finish('foreign');
142
+ }
143
+ });
144
+ socket.once('end', () => finish(received === endpoint.magic ? 'owner' : 'foreign'));
145
+ socket.once('error', (error) => {
146
+ const stale = error?.code === 'ECONNREFUSED' || error?.code === 'ENOENT';
147
+ finish(stale ? 'stale' : 'foreign', error);
148
+ });
149
+ socket.once('close', () => {
150
+ if (!settled) finish(received === endpoint.magic ? 'owner' : 'foreign');
151
+ });
152
+ } catch (error) {
153
+ const stale = error?.code === 'ECONNREFUSED' || error?.code === 'ENOENT';
154
+ finish(stale ? 'stale' : 'foreign', error);
155
+ }
156
+ });
157
+ }
158
+
159
+ function observeSocketPath(endpoint, options = {}) {
160
+ if (endpoint.platform === 'win32') return { state: 'not_applicable' };
161
+ const fsImpl = options.fsImpl || fs;
162
+ try {
163
+ const stat = fsImpl.lstatSync(endpoint.path);
164
+ if (!stat.isSocket() || stat.isSymbolicLink()) return { state: 'unsafe' };
165
+ return { dev: stat.dev, ino: stat.ino, state: 'socket' };
166
+ } catch (error) {
167
+ return error?.code === 'ENOENT' ? { state: 'missing' } : { state: 'unsafe' };
168
+ }
169
+ }
170
+
171
+ function removeObservedStaleSocket(endpoint, observed, options = {}) {
172
+ if (endpoint.platform === 'win32') return false;
173
+ const fsImpl = options.fsImpl || fs;
174
+ try {
175
+ const stat = fsImpl.lstatSync(endpoint.path);
176
+ if (observed.state !== 'socket'
177
+ || !stat.isSocket()
178
+ || stat.isSymbolicLink()
179
+ || stat.dev !== observed.dev
180
+ || stat.ino !== observed.ino) {
181
+ return false;
182
+ }
183
+ fsImpl.unlinkSync(endpoint.path);
184
+ return true;
185
+ } catch (error) {
186
+ return error?.code === 'ENOENT' && observed.state === 'missing';
187
+ }
188
+ }
189
+
190
+ function recordSocketIdentity(endpoint, options = {}) {
191
+ if (endpoint.platform === 'win32') return undefined;
192
+ const fsImpl = options.fsImpl || fs;
193
+ const stat = fsImpl.lstatSync(endpoint.path);
194
+ if (!stat.isSocket() || stat.isSymbolicLink()) throw new Error('INVALID_UPDATE_LEASE_SOCKET');
195
+ fsImpl.chmodSync(endpoint.path, 0o600);
196
+ return { dev: stat.dev, ino: stat.ino };
197
+ }
198
+
199
+ function removeOwnedSocket(endpoint, identity, options = {}) {
200
+ if (endpoint.platform === 'win32' || !identity) return;
201
+ const fsImpl = options.fsImpl || fs;
202
+ try {
203
+ const stat = fsImpl.lstatSync(endpoint.path);
204
+ if (stat.isSocket()
205
+ && !stat.isSymbolicLink()
206
+ && stat.dev === identity.dev
207
+ && stat.ino === identity.ino) {
208
+ fsImpl.unlinkSync(endpoint.path);
209
+ }
210
+ } catch {}
211
+ }
212
+
213
+ async function tryAcquireUpdateLease(options = {}) {
214
+ let endpoint;
215
+ try {
216
+ endpoint = deriveUpdateLeaseEndpoint(options.packageRoot, options);
217
+ ensurePrivateSocketDirectory(endpoint, options);
218
+ } catch {
219
+ return { acquired: false, reason: 'unavailable' };
220
+ }
221
+
222
+ let server;
223
+ for (let attempt = 0; attempt < 2; attempt += 1) {
224
+ try {
225
+ server = await listenForLease(endpoint, options);
226
+ break;
227
+ } catch (error) {
228
+ if (error?.code !== 'EADDRINUSE') {
229
+ return { acquired: false, reason: 'unavailable' };
230
+ }
231
+ const observed = observeSocketPath(endpoint, options);
232
+ const probe = await probeExistingLease(endpoint, options);
233
+ if (probe.state === 'owner') return { acquired: false, reason: 'busy' };
234
+ if (probe.state !== 'stale' || attempt > 0) {
235
+ return { acquired: false, reason: 'unavailable' };
236
+ }
237
+ if (endpoint.platform === 'win32') continue;
238
+ if (!removeObservedStaleSocket(endpoint, observed, options)) {
239
+ return { acquired: false, reason: 'unavailable' };
240
+ }
241
+ }
242
+ }
243
+ if (!server) return { acquired: false, reason: 'unavailable' };
244
+
245
+ let identity;
246
+ try {
247
+ identity = recordSocketIdentity(endpoint, options);
248
+ } catch {
249
+ await closeServer(server);
250
+ removeOwnedSocket(endpoint, identity, options);
251
+ return { acquired: false, reason: 'unavailable' };
252
+ }
253
+
254
+ let owned = true;
255
+ let released = false;
256
+ server.on('error', () => {
257
+ owned = false;
258
+ });
259
+ server.on('close', () => {
260
+ owned = false;
261
+ });
262
+ const lease = Object.freeze({
263
+ assertOwned() {
264
+ if (!owned || !server.listening) throw new Error('UPDATE_LEASE_LOST');
265
+ },
266
+ async release() {
267
+ if (released) return;
268
+ released = true;
269
+ owned = false;
270
+ await closeServer(server);
271
+ removeOwnedSocket(endpoint, identity, options);
272
+ },
273
+ unref() {
274
+ server.unref?.();
275
+ },
276
+ });
277
+ return { acquired: true, lease };
278
+ }
279
+
280
+ function isInstallerMessage(message) {
281
+ if (!message || message.type !== LEASE_HANDOFF_MESSAGE) return false;
282
+ const installer = message.installer;
283
+ return installer
284
+ && typeof installer === 'object'
285
+ && typeof message.packageRoot === 'string'
286
+ && path.isAbsolute(message.packageRoot)
287
+ && typeof installer.npmCliPath === 'string'
288
+ && path.isAbsolute(installer.npmCliPath)
289
+ && Array.isArray(installer.npmArgs)
290
+ && installer.npmArgs.every((entry) => typeof entry === 'string')
291
+ && typeof installer.installCwd === 'string'
292
+ && path.isAbsolute(installer.installCwd);
293
+ }
294
+
295
+ function runInstallerWorker() {
296
+ let state = 'BOOT';
297
+ let started = false;
298
+ let installLease;
299
+ let installCwd;
300
+ const isControlMessage = (message, type) => message
301
+ && typeof message === 'object'
302
+ && Object.getPrototypeOf(message) === Object.prototype
303
+ && Reflect.ownKeys(message).length === 1
304
+ && message.type === type;
305
+ const exitWithoutInstall = async (code = 0) => {
306
+ if (state === 'DONE') return;
307
+ state = 'DONE';
308
+ try {
309
+ await installLease?.release();
310
+ } catch {}
311
+ process.exit(code);
312
+ };
313
+ const startInstaller = (installer) => {
314
+ if (started || state !== 'COMMITTED') return;
315
+ started = true;
316
+ try {
317
+ installLease.assertOwned();
318
+ process.chdir(installer.installCwd);
319
+ process.argv = [process.execPath, installer.npmCliPath, ...installer.npmArgs];
320
+ require(installer.npmCliPath);
321
+ } catch {
322
+ process.exit(1);
323
+ }
324
+ };
325
+
326
+ process.once('message', async (message) => {
327
+ if (state !== 'BOOT' || !isInstallerMessage(message)) {
328
+ process.exit(1);
329
+ return;
330
+ }
331
+ state = 'PREPARED';
332
+ installCwd = message.installer.installCwd;
333
+ process.once('exit', () => {
334
+ if (!installCwd) return;
335
+ try {
336
+ process.chdir(path.dirname(installCwd));
337
+ fs.rmSync(installCwd, { recursive: true, force: true });
338
+ } catch {}
339
+ });
340
+ const leaseResult = await tryAcquireUpdateLease({
341
+ packageRoot: message.packageRoot,
342
+ role: 'install',
343
+ });
344
+ if (!leaseResult.acquired) {
345
+ const type = leaseResult.reason === 'busy'
346
+ ? LEASE_BUSY_MESSAGE
347
+ : LEASE_UNAVAILABLE_MESSAGE;
348
+ if (process.connected) {
349
+ try {
350
+ process.send({ type }, () => process.exit(75));
351
+ return;
352
+ } catch {}
353
+ }
354
+ process.exit(75);
355
+ return;
356
+ }
357
+ installLease = leaseResult.lease;
358
+ state = 'LEASED';
359
+ if (!process.connected) {
360
+ await exitWithoutInstall();
361
+ return;
362
+ }
363
+ const onControl = (control) => {
364
+ if (state !== 'LEASED') {
365
+ void exitWithoutInstall(1);
366
+ return;
367
+ }
368
+ if (isControlMessage(control, LEASE_CANCEL_MESSAGE)) {
369
+ void exitWithoutInstall();
370
+ return;
371
+ }
372
+ if (!isControlMessage(control, LEASE_COMMIT_MESSAGE)) {
373
+ void exitWithoutInstall(1);
374
+ return;
375
+ }
376
+ state = 'COMMITTED';
377
+ setImmediate(() => startInstaller(message.installer));
378
+ };
379
+ process.once('message', onControl);
380
+ try {
381
+ process.send({ type: LEASE_ADOPT_MESSAGE });
382
+ } catch {
383
+ process.removeListener('message', onControl);
384
+ await exitWithoutInstall();
385
+ }
386
+ });
387
+ process.once('disconnect', () => {
388
+ if (state !== 'COMMITTED' && state !== 'DONE') void exitWithoutInstall();
389
+ });
390
+ }
391
+
392
+ if (require.main === module && process.argv[2] === '--installer-worker') {
393
+ runInstallerWorker();
394
+ }
395
+
396
+ module.exports = {
397
+ deriveUpdateLeaseEndpoint,
398
+ tryAcquireUpdateLease,
399
+ };