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.
- package/LIESMICH.txt +32 -13
- package/README.md +39 -20
- package/bin/blun.js +248 -160
- package/bin/core-bootstrap.js +47 -0
- package/bin/king.js +277 -1
- package/bin/launcher-mode.js +15 -3
- package/bin/launcher-runtime.js +293 -0
- package/bin/plugin-bootstrap.js +11 -4
- package/bin/private-paths.js +1577 -10
- package/bin/update-lease.js +399 -0
- package/bin/update-notice.js +1245 -0
- package/blun.mjs +26606 -25239
- package/dist-web/assets/{CodeBlockNode-Bsvp6ZEy.js → CodeBlockNode-CXnTLMNr.js} +1 -1
- 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
- package/dist-web/assets/{DesignSystemView-BmDDe28A.js → DesignSystemView-BbMOu-XO.js} +1 -1
- package/dist-web/assets/{Tooltip-nEEfaYVY.js → Tooltip-CFQEzqC-.js} +1 -1
- package/dist-web/assets/abnfDiagram-N423BO3Z-CsByy-GW.js +1 -0
- package/dist-web/assets/abnfDiagram-N423BO3Z-Z1APZG5m.js +1 -0
- package/dist-web/assets/arc-C-LXCaja.js +1 -0
- package/dist-web/assets/arc-C4VyWloT.js +1 -0
- package/dist-web/assets/architectureDiagram-T3A2C74G-DZq4L18e.js +36 -0
- package/dist-web/assets/architectureDiagram-T3A2C74G-DpddbUcM.js +36 -0
- package/dist-web/assets/blockDiagram-VBNYF7ZC-BV4sIf98.js +132 -0
- package/dist-web/assets/blockDiagram-VBNYF7ZC-BqccOSMr.js +132 -0
- package/dist-web/assets/{c4Diagram-AAUBKEIU-DtzacMnD.js → c4Diagram-5PPSVZJV-0MRkZlgP.js} +1 -1
- package/dist-web/assets/{c4Diagram-AAUBKEIU-D1VdMx8d.js → c4Diagram-5PPSVZJV-OHAcJrTy.js} +1 -1
- package/dist-web/assets/channel-B2VOQOI-.js +1 -0
- package/dist-web/assets/channel-DKjwM05G.js +1 -0
- package/dist-web/assets/{chunk-ND2GUHAM-DJoY9wNJ.js → chunk-2GRJ4B5K-DqJHs8Fw.js} +1 -1
- package/dist-web/assets/{chunk-ND2GUHAM-C4-rwdcv.js → chunk-2GRJ4B5K-oO6nqeLA.js} +1 -1
- package/dist-web/assets/{chunk-QZHKN3VN-C7YGaShq.js → chunk-2Q5K7J3B-B1nCd91o.js} +1 -1
- package/dist-web/assets/{chunk-QZHKN3VN-_Rz9_NuS.js → chunk-2Q5K7J3B-BC0Hsfqy.js} +1 -1
- package/dist-web/assets/chunk-5RXB4S5H-BfZa4yDH.js +231 -0
- package/dist-web/assets/chunk-5RXB4S5H-neG70kZx.js +231 -0
- package/dist-web/assets/{chunk-FMBD7UC4-DlLNDUx6.js → chunk-5VM5RSS4-l7biGqeH.js} +1 -1
- package/dist-web/assets/{chunk-FMBD7UC4-B2zs_Y-d.js → chunk-5VM5RSS4-u00AcpiJ.js} +1 -1
- package/dist-web/assets/chunk-6Q2QTUOP-BO-F11Gs.js +88 -0
- package/dist-web/assets/chunk-6Q2QTUOP-RUVRPBzG.js +88 -0
- package/dist-web/assets/{chunk-727SXJPM-Dn5wkDO_.js → chunk-GF5L2VYU-Ba-86KTd.js} +5 -5
- package/dist-web/assets/{chunk-727SXJPM-Dk2Xa3bA.js → chunk-GF5L2VYU-BtC69fw0.js} +5 -5
- package/dist-web/assets/{chunk-4BX2VUAB-DxZViaHS.js → chunk-JWPE2WC7-DIOubEqr.js} +1 -1
- package/dist-web/assets/{chunk-4BX2VUAB-WqrE2gaw.js → chunk-JWPE2WC7-u8Pcfhwh.js} +1 -1
- package/dist-web/assets/{chunk-2J33WTMH-Dm_s0_4f.js → chunk-KBJHAD2P-DDUeH_Ba.js} +1 -1
- package/dist-web/assets/{chunk-2J33WTMH-w4sdiKFO.js → chunk-KBJHAD2P-DS3BL64y.js} +1 -1
- package/dist-web/assets/chunk-RYQCIY6F-B9gFMVbS.js +1 -0
- package/dist-web/assets/chunk-RYQCIY6F-xg3EO0le.js +1 -0
- package/dist-web/assets/{chunk-55IACEB6-B5dE1-Um.js → chunk-XXDRQBXY-B60H0rRC.js} +1 -1
- package/dist-web/assets/{chunk-55IACEB6-B12zGIFz.js → chunk-XXDRQBXY-Bn1Xz6TQ.js} +1 -1
- package/dist-web/assets/classDiagram-JCYQIIEL-BA1TjAxj.js +1 -0
- package/dist-web/assets/classDiagram-JCYQIIEL-BNU7Qn4k.js +1 -0
- package/dist-web/assets/classDiagram-v2-OCEON4UE-BA1TjAxj.js +1 -0
- package/dist-web/assets/classDiagram-v2-OCEON4UE-BNU7Qn4k.js +1 -0
- package/dist-web/assets/{cose-bilkent-S5V4N54A-Bi19n8m-.js → cose-bilkent-JH36ORCC-4Ybddg08.js} +1 -1
- package/dist-web/assets/{cose-bilkent-S5V4N54A-c8o8NFp5.js → cose-bilkent-JH36ORCC-DqigO3T4.js} +1 -1
- package/dist-web/assets/cynefin-VYW2F7L2-C-EfYT07.js +178 -0
- package/dist-web/assets/cynefin-VYW2F7L2-rpD93tQ-.js +178 -0
- package/dist-web/assets/cynefinDiagram-MW4NZA55-DWZPLJcD.js +62 -0
- package/dist-web/assets/cynefinDiagram-MW4NZA55-DbTqnkVJ.js +62 -0
- package/dist-web/assets/dagre-VZM6K2ZE-DcM8aEVY.js +4 -0
- package/dist-web/assets/dagre-VZM6K2ZE-M_HVNtqP.js +4 -0
- package/dist-web/assets/diagram-7IWD3JNH-DoNximNF.js +30 -0
- package/dist-web/assets/diagram-7IWD3JNH-UymgsBNa.js +30 -0
- package/dist-web/assets/{diagram-KO2AKTUF-CFQs13i5.js → diagram-B4RE2ZJO-BVA2EhnC.js} +3 -3
- package/dist-web/assets/{diagram-KO2AKTUF-agFIuPJW.js → diagram-B4RE2ZJO-BiYu5WPF.js} +3 -3
- package/dist-web/assets/{diagram-LMA3HP47-TMIXizxR.js → diagram-LBJQPF4R-BD3kkgOO.js} +2 -2
- package/dist-web/assets/{diagram-LMA3HP47-He5zlyMt.js → diagram-LBJQPF4R-m3a1Euj3.js} +2 -2
- package/dist-web/assets/diagram-Q27KOJAE-D1mYQ_cI.js +24 -0
- package/dist-web/assets/diagram-Q27KOJAE-hy_T73PK.js +24 -0
- package/dist-web/assets/diagram-UB23O5K3-BWkoQZ4A.js +41 -0
- package/dist-web/assets/diagram-UB23O5K3-BtX8u6HG.js +41 -0
- package/dist-web/assets/ebnfDiagram-BXEA7PRR-BKs9JUHW.js +1 -0
- package/dist-web/assets/ebnfDiagram-BXEA7PRR-CBAnFkRF.js +1 -0
- package/dist-web/assets/erDiagram-JOGREHBK-3vKcWsxm.js +85 -0
- package/dist-web/assets/erDiagram-JOGREHBK-BIpd6dTf.js +85 -0
- package/dist-web/assets/flowDiagram-UKHOOZJN-D9wBbHm2.js +156 -0
- package/dist-web/assets/flowDiagram-UKHOOZJN-Z83i2UWI.js +156 -0
- package/dist-web/assets/ganttDiagram-PKOTCBZU-Cd_dViF-.js +292 -0
- package/dist-web/assets/ganttDiagram-PKOTCBZU-DFrb_S1d.js +292 -0
- package/dist-web/assets/{gitGraphDiagram-PVQCEYII-BSDFfwdY.js → gitGraphDiagram-DS77QQ5N-BiEEtTo7.js} +3 -3
- package/dist-web/assets/{gitGraphDiagram-PVQCEYII-DMbTATyw.js → gitGraphDiagram-DS77QQ5N-Dp3Ar-hi.js} +3 -3
- package/dist-web/assets/{graph-BwjfAU3j.js → graph-CAUpWmoK.js} +1 -1
- package/dist-web/assets/{graph--OzhPTMs.js → graph-DOmOIIwC.js} +1 -1
- package/dist-web/assets/{index-W6VnSrkB.js → index-Ba1OvLjf.js} +2 -2
- package/dist-web/assets/{index-CkVgGDpx.js → index-CiPA8Kex.js} +4 -4
- package/dist-web/assets/{index-BzK4vJBu.js → index-DdEakFJM.js} +1 -1
- package/dist-web/assets/{index10-Czg_oF-W.js → index10-CNr4U-Nw.js} +1 -1
- package/dist-web/assets/{index11-BjzCZuCr.js → index11-Dto_yZNz.js} +1 -1
- package/dist-web/assets/{index5-DlVoNkCD.js → index5-B2PldaO2.js} +1 -1
- package/dist-web/assets/{index6-BxiXA2yo.js → index6-CBdZmmyx.js} +1 -1
- package/dist-web/assets/{index7-BPdza6d1.js → index7-Dz9oCsUF.js} +1 -1
- package/dist-web/assets/{index8-Q_XzGC1Z.js → index8-B6k25jtU.js} +2 -2
- package/dist-web/assets/{infoDiagram-5YYISTIA-2JF3XEdD.js → infoDiagram-6WML65LV-BSa2g04G.js} +1 -1
- package/dist-web/assets/{infoDiagram-5YYISTIA-UrQusrJq.js → infoDiagram-6WML65LV-D4ph2sIH.js} +1 -1
- package/dist-web/assets/{ishikawaDiagram-YF4QCWOH-7RVUL-vB.js → ishikawaDiagram-WSZJBQD7-DjKjbMm9.js} +5 -5
- package/dist-web/assets/{ishikawaDiagram-YF4QCWOH-C5OstRVV.js → ishikawaDiagram-WSZJBQD7-Hm36UOQe.js} +5 -5
- package/dist-web/assets/{journeyDiagram-JHISSGLW-B34fCMu9.js → journeyDiagram-NVQOT4AX-DttHDfPQ.js} +1 -1
- package/dist-web/assets/{journeyDiagram-JHISSGLW-yctdo4bX.js → journeyDiagram-NVQOT4AX-MvWWPNDV.js} +1 -1
- package/dist-web/assets/{kanban-definition-UN3LZRKU-BS4FBZsQ.js → kanban-definition-27J2QSJJ-C5gB-W0d.js} +7 -7
- package/dist-web/assets/{kanban-definition-UN3LZRKU-CxBCv27E.js → kanban-definition-27J2QSJJ-Cu-E_cXA.js} +5 -5
- package/dist-web/assets/layout-CvP6o9AK.js +1 -0
- package/dist-web/assets/layout-D-LzfAck.js +1 -0
- package/dist-web/assets/{linear-3mB6q2-g.js → linear-B3HWgQI2.js} +1 -1
- package/dist-web/assets/{linear-BKCnUo31.js → linear-BRGe4-d6.js} +1 -1
- package/dist-web/assets/map-CWKZqZjr.js +1 -0
- package/dist-web/assets/map-DxJ2ADlA.js +1 -0
- package/dist-web/assets/mermaid.core-D-9Sx1No.js +314 -0
- package/dist-web/assets/mermaidParser.worker-PTFfzpoB.js +318 -0
- package/dist-web/assets/{mindmap-definition-RKZ34NQL-BmJZpjh6.js → mindmap-definition-FAOFIHXS-C4vnms3i.js} +2 -2
- package/dist-web/assets/{mindmap-definition-RKZ34NQL-1mjWUcf6.js → mindmap-definition-FAOFIHXS-Cg_hoVIq.js} +1 -1
- package/dist-web/assets/pegDiagram-VL7TDLO6-B2fFEFUH.js +1 -0
- package/dist-web/assets/pegDiagram-VL7TDLO6-CSX9hitD.js +1 -0
- package/dist-web/assets/pieDiagram-7S7Q4E2Y-0L0mxahZ.js +39 -0
- package/dist-web/assets/pieDiagram-7S7Q4E2Y-C7T0Cmw1.js +39 -0
- package/dist-web/assets/{quadrantDiagram-W4KKPZXB-BmT_qM09.js → quadrantDiagram-CIZ2JOQS-BBy7w4kD.js} +3 -3
- package/dist-web/assets/{quadrantDiagram-W4KKPZXB-C0kPuyNP.js → quadrantDiagram-CIZ2JOQS-U483z0er.js} +3 -3
- package/dist-web/assets/railroadDiagram-AXF67PYL-D80a2_DJ.js +1 -0
- package/dist-web/assets/railroadDiagram-AXF67PYL-DX8y0MzW.js +1 -0
- package/dist-web/assets/{requirementDiagram-4Y6WPE33-C0YP_Amt.js → requirementDiagram-LRYGKXZP-CeyHfq8t.js} +3 -3
- package/dist-web/assets/{requirementDiagram-4Y6WPE33-CZrxH1Y2.js → requirementDiagram-LRYGKXZP-DGD5J_4k.js} +3 -3
- package/dist-web/assets/sankeyDiagram-W5VNT64P-CCISkkrR.js +40 -0
- package/dist-web/assets/sankeyDiagram-W5VNT64P-CT5PdZz2.js +40 -0
- package/dist-web/assets/sequenceDiagram-SI44F4Z6-BeMzHWXI.js +162 -0
- package/dist-web/assets/sequenceDiagram-SI44F4Z6-jQfm2XS7.js +162 -0
- package/dist-web/assets/sizeCapture-X5ZJPWSS-BQsTdtrv.js +1 -0
- package/dist-web/assets/sizeCapture-X5ZJPWSS-lRZsmCoS.js +1 -0
- package/dist-web/assets/stateDiagram-OKZ733FA-ClCgTdUm.js +1 -0
- package/dist-web/assets/stateDiagram-OKZ733FA-Cv59z5YT.js +1 -0
- package/dist-web/assets/stateDiagram-v2-UEYNNEHI-R8jTc--F.js +1 -0
- package/dist-web/assets/stateDiagram-v2-UEYNNEHI-fi_lrTAx.js +1 -0
- package/dist-web/assets/swimlanes-SLNWSIFB-BCdOUN05.js +2 -0
- package/dist-web/assets/swimlanes-SLNWSIFB-Cu5l7SuR.js +1 -0
- package/dist-web/assets/swimlanesDiagram-ULZ7WXOC-BUd_uYK3.js +8 -0
- package/dist-web/assets/swimlanesDiagram-ULZ7WXOC-CalrsgPK.js +8 -0
- package/dist-web/assets/{timeline-definition-PNZ67QCA-DsVZdrZa.js → timeline-definition-Z64GVDOM-CMjnh4bu.js} +4 -4
- package/dist-web/assets/{timeline-definition-PNZ67QCA-DnB6Usl0.js → timeline-definition-Z64GVDOM-DpWutSKa.js} +4 -4
- package/dist-web/assets/vennDiagram-T6HMQDX7-DKJW_8oU.js +34 -0
- package/dist-web/assets/vennDiagram-T6HMQDX7-DVC5JVsc.js +34 -0
- package/dist-web/assets/{vue.runtime.esm-bundler-pgHGheCW.js → vue.runtime.esm-bundler-BwwRtQwQ.js} +1 -1
- package/dist-web/assets/{wardleyDiagram-YWT4CUSO-oBauTCEw.js → wardleyDiagram-T6FBY63Y-BK2mrq7L.js} +3 -3
- package/dist-web/assets/{wardleyDiagram-YWT4CUSO-DCiyDQNB.js → wardleyDiagram-T6FBY63Y-oUvgepFn.js} +3 -3
- package/dist-web/assets/xychartDiagram-ELKLHX3M-DI6n79q0.js +7 -0
- package/dist-web/assets/xychartDiagram-ELKLHX3M-DUJu9F7-.js +7 -0
- package/dist-web/index.html +1 -1
- package/dist-web/vis/index.html.gz +0 -0
- package/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
- package/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
- package/package.json +9 -11
- package/skills/screenshot-lesen/SKILL.md +0 -1
- package/skills/web-lesen/SKILL.md +0 -1
- package/telegram-plugin/dist/bridge.mjs +7 -25
- package/telegram-plugin/dist/mcp-server.mjs +236 -71
- package/dist-web/assets/arc-4xPfymbf.js +0 -1
- package/dist-web/assets/arc-Doj0wRZ0.js +0 -1
- package/dist-web/assets/architectureDiagram-3BPJPVTR-BGih283a.js +0 -36
- package/dist-web/assets/architectureDiagram-3BPJPVTR-CQ09RrbH.js +0 -36
- package/dist-web/assets/blockDiagram-GPEHLZMM-3ShMf1gu.js +0 -132
- package/dist-web/assets/blockDiagram-GPEHLZMM-CAtDjkJt.js +0 -132
- package/dist-web/assets/channel-DNkUo9e6.js +0 -1
- package/dist-web/assets/channel-DcnUTIGB.js +0 -1
- package/dist-web/assets/chunk-AQP2D5EJ-FS8-f8lF.js +0 -231
- package/dist-web/assets/chunk-AQP2D5EJ-UKhb4V4r.js +0 -231
- package/dist-web/assets/classDiagram-4FO5ZUOK-B1ZO8EbE.js +0 -1
- package/dist-web/assets/classDiagram-4FO5ZUOK-xk6cM9Kq.js +0 -1
- package/dist-web/assets/classDiagram-v2-Q7XG4LA2-B1ZO8EbE.js +0 -1
- package/dist-web/assets/classDiagram-v2-Q7XG4LA2-xk6cM9Kq.js +0 -1
- package/dist-web/assets/dagre-BM42HDAG-CmUO9qKN.js +0 -4
- package/dist-web/assets/dagre-BM42HDAG-DLMfLCoV.js +0 -4
- package/dist-web/assets/diagram-2AECGRRQ-DQTst0OH.js +0 -43
- package/dist-web/assets/diagram-2AECGRRQ-L74iLMqd.js +0 -43
- package/dist-web/assets/diagram-5GNKFQAL-BiBm7CJR.js +0 -10
- package/dist-web/assets/diagram-5GNKFQAL-DoE6q7H1.js +0 -10
- package/dist-web/assets/diagram-OG6HWLK6-BHCt1E0n.js +0 -24
- package/dist-web/assets/diagram-OG6HWLK6-DRyxjFMa.js +0 -24
- package/dist-web/assets/erDiagram-TEJ5UH35-BoDczjGG.js +0 -85
- package/dist-web/assets/erDiagram-TEJ5UH35-yd6SOv_7.js +0 -85
- package/dist-web/assets/flowDiagram-I6XJVG4X-DHoceI7r.js +0 -162
- package/dist-web/assets/flowDiagram-I6XJVG4X-DkYNQv0R.js +0 -162
- package/dist-web/assets/ganttDiagram-6RSMTGT7-Cg1TQBc0.js +0 -292
- package/dist-web/assets/ganttDiagram-6RSMTGT7-Z6klo7KK.js +0 -292
- package/dist-web/assets/layout-C1ojF0zw.js +0 -1
- package/dist-web/assets/layout-SsrduOYp.js +0 -1
- package/dist-web/assets/mermaid.core-D_lKT0dR.js +0 -309
- package/dist-web/assets/mermaidParser.worker-Dx4jPi9z.js +0 -313
- package/dist-web/assets/pieDiagram-4H26LBE5-BU41t2A_.js +0 -30
- package/dist-web/assets/pieDiagram-4H26LBE5-BkwDAvbt.js +0 -30
- package/dist-web/assets/sankeyDiagram-5OEKKPKP-De_o7hDr.js +0 -40
- package/dist-web/assets/sankeyDiagram-5OEKKPKP-Dvuj6bMA.js +0 -40
- package/dist-web/assets/sequenceDiagram-3UESZ5HK-DuCrgPyA.js +0 -162
- package/dist-web/assets/sequenceDiagram-3UESZ5HK-VAxffBe7.js +0 -162
- package/dist-web/assets/stateDiagram-AJRCARHV-CYLupxM7.js +0 -1
- package/dist-web/assets/stateDiagram-AJRCARHV-nDExQydZ.js +0 -1
- package/dist-web/assets/stateDiagram-v2-BHNVJYJU-BhEc7Thx.js +0 -1
- package/dist-web/assets/stateDiagram-v2-BHNVJYJU-BzwD_BIl.js +0 -1
- package/dist-web/assets/vennDiagram-CIIHVFJN-BBHQmCFf.js +0 -34
- package/dist-web/assets/vennDiagram-CIIHVFJN-Cfj-K9NW.js +0 -34
- package/dist-web/assets/wardley-L42UT6IY-BJFn8eDD.js +0 -173
- package/dist-web/assets/wardley-L42UT6IY-BSu8-4hg.js +0 -173
- package/dist-web/assets/xychartDiagram-2RQKCTM6-C2iZpl9I.js +0 -7
- package/dist-web/assets/xychartDiagram-2RQKCTM6-Db_VoDBV.js +0 -7
- package/mnemo/access_routes.js +0 -692
- package/mnemo/agent_governance.js +0 -4242
- package/mnemo/agent_mail.js +0 -901
- package/mnemo/bootstrap_auto.js +0 -137
- package/mnemo/brief_coordination.js +0 -226
- package/mnemo/code_read_tools.js +0 -375
- package/mnemo/context_preview_tools.js +0 -603
- package/mnemo/embeddings.js +0 -66
- package/mnemo/external_repo_ops.js +0 -575
- package/mnemo/facts/example-project-rules.json +0 -90
- package/mnemo/facts/example.json +0 -34
- package/mnemo/identity_schema.sql +0 -139
- package/mnemo/journal_schema.js +0 -561
- package/mnemo/loop_doctor_tools.js +0 -661
- package/mnemo/mail_secret_refs.js +0 -150
- package/mnemo/mcp.js +0 -9309
- package/mnemo/memory_consolidation.js +0 -1914
- package/mnemo/memory_health_tools.js +0 -165
- package/mnemo/package.json +0 -79
- package/mnemo/protected_scope_gate.js +0 -627
- package/mnemo/resource_access_control.js +0 -684
- package/mnemo/runtime_governance.js +0 -1256
- package/mnemo/runtime_turn_gate.js +0 -862
- package/mnemo/sandbox.js +0 -143
- package/mnemo/schema.sql +0 -389
- package/mnemo/shared_utils.js +0 -763
- package/mnemo/skills/agent-auto-resume/SKILL.md +0 -56
- package/mnemo/skills/agent_hand/SKILL.md +0 -43
- package/mnemo/skills/agent_hand/run.js +0 -63
- package/mnemo/skills/book_flight/SKILL.md +0 -34
- package/mnemo/skills/external_repo_review/SKILL.md +0 -43
- package/mnemo/skills/external_repo_review/run.js +0 -73
- package/mnemo/skills/pay_invoice/SKILL.md +0 -34
- package/mnemo/team_quality_ops.js +0 -944
- package/mnemo/timeline_report_tools.js +0 -810
- package/mnemo/write_gate_risk.js +0 -80
- package/mnemo/writer_health.js +0 -152
- package/skills/doku-ingestion/SKILL.md +0 -48
- 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
|
-
|
|
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
|
|
18
|
-
king Dieselbe
|
|
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.
|
|
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
|
-
|
|
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
|
|
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`
|
|
36
|
-
Konsole
|
|
37
|
-
|
|
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
|
|
41
|
-
|
|
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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
|
8
|
+
const net = require('node:net');
|
|
12
9
|
const os = require('node:os');
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
41
|
-
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
}
|
|
86
|
-
|
|
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
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
if (
|
|
95
|
-
|
|
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
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
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
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
.
|
|
143
|
-
|
|
144
|
-
|
|
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
|
-
|
|
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
|
-
|
|
159
|
-
|
|
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
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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.
|
|
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 };
|