@neuralnomads/codenomad-dev 0.20.0-dev-20260923-baf674fc → 0.20.0-dev-20260924-70aae0b1
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/dist/api-types.js.map +1 -1
- package/dist/opencode-update/npm-runtime.js +22 -0
- package/dist/opencode-update/npm-runtime.js.map +1 -0
- package/dist/opencode-update/retired-installation.js +41 -0
- package/dist/opencode-update/retired-installation.js.map +1 -0
- package/dist/opencode-update/retired-installation.test.js +39 -0
- package/dist/opencode-update/retired-installation.test.js.map +1 -0
- package/dist/opencode-update/service.js +4 -3
- package/dist/opencode-update/service.js.map +1 -1
- package/dist/opencode-update/service.test.js +2 -2
- package/dist/opencode-update/service.test.js.map +1 -1
- package/dist/opencode-update/shared-installation.js +8 -5
- package/dist/opencode-update/shared-installation.js.map +1 -1
- package/dist/opencode-update/shared-installation.test.js +4 -2
- package/dist/opencode-update/shared-installation.test.js.map +1 -1
- package/dist/settings/binaries.js +3 -2
- package/dist/settings/binaries.js.map +1 -1
- package/dist/workspaces/spawn.js +7 -2
- package/dist/workspaces/spawn.js.map +1 -1
- package/package.json +1 -1
- package/public/assets/{App-DHe1TgnC.js → App-DXfroBn-.js} +7 -7
- package/public/assets/{App-DHe1TgnC.js.map → App-DXfroBn-.js.map} +1 -1
- package/public/assets/{FilesTab-D8Ik74MT.js → FilesTab-JN0c2Op2.js} +2 -2
- package/public/assets/{FilesTab-D8Ik74MT.js.map → FilesTab-JN0c2Op2.js.map} +1 -1
- package/public/assets/{GitChangesTab-CYn01GSK.js → GitChangesTab-8MxRVYHz.js} +2 -2
- package/public/assets/{GitChangesTab-CYn01GSK.js.map → GitChangesTab-8MxRVYHz.js.map} +1 -1
- package/public/assets/{SplitFilePanel-DxTSWUXW.js → SplitFilePanel-VXkE7jgT.js} +2 -2
- package/public/assets/{SplitFilePanel-DxTSWUXW.js.map → SplitFilePanel-VXkE7jgT.js.map} +1 -1
- package/public/assets/{StatusTab-CLJHjaqS.js → StatusTab-DljyzM07.js} +2 -2
- package/public/assets/{StatusTab-CLJHjaqS.js.map → StatusTab-DljyzM07.js.map} +1 -1
- package/public/assets/{align-justify-DYu1Iipu.js → align-justify-BMi4r2XK.js} +2 -2
- package/public/assets/{align-justify-DYu1Iipu.js.map → align-justify-BMi4r2XK.js.map} +1 -1
- package/public/assets/{bundle-full-DbjjKxlx.js → bundle-full-LgLNZmib.js} +2 -2
- package/public/assets/{bundle-full-DbjjKxlx.js.map → bundle-full-LgLNZmib.js.map} +1 -1
- package/public/assets/{client-state-LGeRE6k3.js → client-state-DTQzqBPJ.js} +2 -2
- package/public/assets/{client-state-LGeRE6k3.js.map → client-state-DTQzqBPJ.js.map} +1 -1
- package/public/assets/{diff-viewer-D_koHVvF.js → diff-viewer-Dxjea-rB.js} +2 -2
- package/public/assets/{diff-viewer-D_koHVvF.js.map → diff-viewer-Dxjea-rB.js.map} +1 -1
- package/public/assets/index-9bba6B1A.js +2 -0
- package/public/assets/index-9bba6B1A.js.map +1 -0
- package/public/assets/index-C5i7ut9u.js +2 -0
- package/public/assets/index-C5i7ut9u.js.map +1 -0
- package/public/assets/index-CLtLzsWy.js +2 -0
- package/public/assets/index-CLtLzsWy.js.map +1 -0
- package/public/assets/index-CTVIWXHZ.js +2 -0
- package/public/assets/index-CTVIWXHZ.js.map +1 -0
- package/public/assets/{index-CXyTJ12Z.js → index-Cgp1TEtC.js} +2 -2
- package/public/assets/{index-CXyTJ12Z.js.map → index-Cgp1TEtC.js.map} +1 -1
- package/public/assets/index-Cqd_P8c4.js +2 -0
- package/public/assets/index-Cqd_P8c4.js.map +1 -0
- package/public/assets/{index-CHztP7Qx.js → index-DTGOXoDH.js} +2 -2
- package/public/assets/{index-CHztP7Qx.js.map → index-DTGOXoDH.js.map} +1 -1
- package/public/assets/index-D_H_gYdX.js +2 -0
- package/public/assets/index-D_H_gYdX.js.map +1 -0
- package/public/assets/index-Dsd7n295.js +2 -0
- package/public/assets/index-Dsd7n295.js.map +1 -0
- package/public/assets/index-DwKq8v48.js +3 -0
- package/public/assets/index-DwKq8v48.js.map +1 -0
- package/public/assets/index-TnTncRlr.js +2 -0
- package/public/assets/index-TnTncRlr.js.map +1 -0
- package/public/assets/index-eb2qu-xk.js +2 -0
- package/public/assets/index-eb2qu-xk.js.map +1 -0
- package/public/assets/{loading-1PhCNPTJ.js → loading-j5J_ghLL.js} +2 -2
- package/public/assets/{loading-1PhCNPTJ.js.map → loading-j5J_ghLL.js.map} +1 -1
- package/public/assets/{main-UjL26F9i.js → main-Cv7E0c7r.js} +7 -7
- package/public/assets/{main-UjL26F9i.js.map → main-Cv7E0c7r.js.map} +1 -1
- package/public/assets/{markdown-BFEzPV6Z.js → markdown-Cg65SCwC.js} +4 -4
- package/public/assets/{markdown-BFEzPV6Z.js.map → markdown-Cg65SCwC.js.map} +1 -1
- package/public/assets/{startup-state-settings-card-X1QA2uNM.js → startup-state-settings-card-DMFtdRoa.js} +2 -2
- package/public/assets/{startup-state-settings-card-X1QA2uNM.js.map → startup-state-settings-card-DMFtdRoa.js.map} +1 -1
- package/public/assets/{terminal-square-BkG0S2-Z.js → terminal-square-DCn_Ac2k.js} +2 -2
- package/public/assets/{terminal-square-BkG0S2-Z.js.map → terminal-square-DCn_Ac2k.js.map} +1 -1
- package/public/assets/{todo-DKme4PqO.js → todo-DyaFCX9E.js} +2 -2
- package/public/assets/{todo-DKme4PqO.js.map → todo-DyaFCX9E.js.map} +1 -1
- package/public/assets/{tool-call-DZIN0BAW.js → tool-call-DlJUX9AW.js} +4 -4
- package/public/assets/{tool-call-DZIN0BAW.js.map → tool-call-DlJUX9AW.js.map} +1 -1
- package/public/assets/{unified-picker-Ml-4x3ux.js → unified-picker-CrW1bp1Y.js} +2 -2
- package/public/assets/{unified-picker-Ml-4x3ux.js.map → unified-picker-CrW1bp1Y.js.map} +1 -1
- package/public/assets/{wrap-text-B_W6fnE7.js → wrap-text-DLR5jp4s.js} +2 -2
- package/public/assets/{wrap-text-B_W6fnE7.js.map → wrap-text-DLR5jp4s.js.map} +1 -1
- package/public/index.html +2 -2
- package/public/loading.html +2 -2
- package/public/sw.js +1 -1
- package/public/sw.js.map +1 -1
- package/dist/opencode-update/managed-installation.js +0 -102
- package/dist/opencode-update/managed-installation.js.map +0 -1
- package/dist/opencode-update/managed-installation.test.js +0 -102
- package/dist/opencode-update/managed-installation.test.js.map +0 -1
- package/public/assets/index-Bme8jj6C.js +0 -2
- package/public/assets/index-Bme8jj6C.js.map +0 -1
- package/public/assets/index-BxPI94Ww.js +0 -2
- package/public/assets/index-BxPI94Ww.js.map +0 -1
- package/public/assets/index-Cm6Bv3OW.js +0 -2
- package/public/assets/index-Cm6Bv3OW.js.map +0 -1
- package/public/assets/index-Cn9xpv8K.js +0 -2
- package/public/assets/index-Cn9xpv8K.js.map +0 -1
- package/public/assets/index-CooBjdE-.js +0 -2
- package/public/assets/index-CooBjdE-.js.map +0 -1
- package/public/assets/index-CvWB7Vfc.js +0 -2
- package/public/assets/index-CvWB7Vfc.js.map +0 -1
- package/public/assets/index-DFCjhysu.js +0 -3
- package/public/assets/index-DFCjhysu.js.map +0 -1
- package/public/assets/index-DR8ddwAP.js +0 -2
- package/public/assets/index-DR8ddwAP.js.map +0 -1
- package/public/assets/index-THD8itHb.js +0 -2
- package/public/assets/index-THD8itHb.js.map +0 -1
- package/public/assets/index-_bmTx26k.js +0 -2
- package/public/assets/index-_bmTx26k.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.test.js","sourceRoot":"","sources":["../../src/opencode-update/service.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAA;AACvC,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EACjD,4BAA4B,EAAE,6BAA6B,EAC3B,MAAM,WAAW,CAAA;AACnD,OAAO,EAAE,wBAAwB,IAAI,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAA;AAEnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAExD,SAAS,IAAI,CAAC,YAAgD,EAAE;IAC9D,IAAI,OAAO,GAAG,kBAAkB,CAAA;IAChC,OAAO;QACL,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAC/D,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC7C,oBAAoB,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO;QACzC,gBAAgB,EAAE,GAAG,EAAE,CAAC,IAAI;QAC5B,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA,CAAC,CAAC;QACzG,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC9C,GAAG,SAAS;KACb,CAAA;AACH,CAAC;AAED,IAAI,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;IACnG,KAAK,MAAM,OAAO,IAAI,CAAC,SAAS,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,CAAC;QAC/D,IAAI,OAAO,GAAG,OAAO,CAAA;QACrB,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC;YAC7C,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE;YACvF,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA,CAAC,CAAC;SAC1G,CAAC,CAAC,CAAA;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,CAAA;QACxC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QACnE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;QAC5C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;QACrC,MAAM,CAAC,SAAS,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;QAC9E,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAC1D,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC3G,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACxD,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;IAC3D,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK,YAAY,mBAAmB,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,CAAC,CAAA;AAC1I,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;IAC1E,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE,oBAAoB,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAA,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACrH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,CAAA;IACxC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAA;IAC7C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAA;IACtD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;IACtC,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK,YAAY,mBAAmB,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAqB,CAAC,CAAA;AAC3I,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;IAChE,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC;QAC7C,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,+CAA+C,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC9F,gBAAgB,EAAE,GAAG,EAAE,CAAC,KAAK;KAC9B,CAAC,CAAC,CAAA;IACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,CAAA;IACxC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAClC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;IACtC,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK,YAAY,mBAAmB,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,CAAC,CAAA;AAC1I,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;IACnF,IAAI,SAAS,GAAG,KAAK,CAAA;IACrB,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC;QAC7C,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QACvF,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE;QAC7G,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA,CAAC,CAAC;KAC1G,CAAC,CAAC,CAAA;IACH,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACxD,MAAM,KAAK,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC;QAC3C,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QACtD,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;KAC/E,CAAC,CAAC,CAAA;IACH,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK,YAAY,mBAAmB,IAAI,KAAK,CAAC,IAAI,KAAK,6BAA6B,CAAC,CAAA;AACjJ,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,yFAAyF,EAAE,KAAK,IAAI,EAAE;IACzG,KAAK,MAAM,MAAM,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAU,EAAE,CAAC;QACjD,IAAI,QAAQ,GAAG,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAA;QAClC,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC;YAC7C,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YACpH,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;YACvD,oBAAoB,EAAE,KAAK,IAAI,EAAE,CAAC,QAAQ;YAC1C,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;gBACvC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;gBAC9B,QAAQ,EAAE,CAAC;gBAAC,QAAQ,GAAG,IAAI,CAAA;gBAC3B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;YAC3C,CAAC;SACF,CAAC,CAAC,CAAA;QACH,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;QAC1D,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,uBAAuB,EAAE,IAAI,CAAC,CAAA;QACvE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;QACvB,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;QACzB,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAA;QACxE,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;IAC7D,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;IAC1F,IAAI,QAAQ,GAAG,CAAC,CAAA;IAChB,IAAI,OAAO,GAAG,OAAO,CAAA;IACrB,IAAI,OAAoB,CAAA;IACxB,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,GAAG,OAAO,GAAG,OAAO,CAAA,CAAC,CAAC,CAAC,CAAA;IAChE,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC;QAC7C,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC7C,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA,CAAC,CAAC;KAClI,CAAC,CAAC,CAAA;IACH,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;IAC3D,OAAO,EAAE,CAAA;IACT,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;IAClC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;IACzB,OAAO,GAAG,SAAS,CAAA;IACnB,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,eAAe,EAAE,KAAK,CAAC,CAAA;IAChE,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACxD,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;AAC3B,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;IAC/F,IAAI,aAAa,GAAG,OAAO,EAAE,QAAQ,GAAG,CAAC,EAAE,UAAU,GAAG,CAAC,CAAA;IACzD,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,MAAM,KAAK,GAAa,EAAE,GAAG,EAAE,uBAAuB,EAAE,CAAA;QACxD,eAAe,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAA;QAC/E,OAAO,KAAK,CAAA;IACd,CAAC,CAAA;IACD,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC;QAC7C,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QACtD,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,QAAQ,EAAE;YACxF,OAAO,EAAE,KAAK,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,aAAa,GAAG,OAAO,CAAC,CAAC,OAAO,QAAQ,EAAE,CAAA,CAAC,CAAC,EAAE,CAAC;QACpF,SAAS,EAAE,KAAK,IAAI,EAAE,GAAG,UAAU,EAAE,CAAA,CAAC,CAAC;KACxC,CAAC,CAAC,CAAA;IACH,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAA;IAC1E,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;IACzB,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,0BAA0B,CAAC,CAAA;IACjE,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;IACzB,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;IAC3B,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;IAC/D,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;IACzB,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;AAC7B,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;IAC9F,MAAM,CAAC,KAAK,CAAC,MAAM,4BAA4B,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAC5D,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,kEAAkE,CAAC,CAAA;QACrF,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,CAAA;IAChF,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;IACZ,KAAK,MAAM,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC;QAC3G,MAAM,MAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,CAAA;IACrH,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;IACvG,IAAI,QAAQ,GAAG,UAAU,EAAE,QAAQ,GAAG,CAAC,EAAE,UAAU,GAAG,CAAC,CAAA;IACvD,IAAI,OAAoB,CAAA;IACxB,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,GAAG,OAAO,GAAG,OAAO,CAAA,CAAC,CAAC,CAAC,CAAA;IAChE,MAAM,QAAQ,GAAG,CAAC,OAAe,EAAE,EAAE;QACnC,MAAM,KAAK,GAAa,EAAE,GAAG,EAAE,uBAAuB,EAAE,CAAA;QACxD,eAAe,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAA;QAChE,OAAO,KAAK,CAAA;IACd,CAAC,CAAA;IACD,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC;QAC7C,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QAC1D,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QACtD,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;YACtG,OAAO,EAAE,KAAK,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAA,CAAC,CAAC,EAAE,CAAC;QAC9E,SAAS,EAAE,KAAK,IAAI,EAAE,GAAG,UAAU,EAAE,CAAA,CAAC,CAAC;KACxC,CAAC,CAAC,CAAA;IACH,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC/D,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAC3B,QAAQ,GAAG,aAAa,CAAA;IACxB,OAAO,EAAE,CAAA;IACT,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAA;IAChD,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,8DAA8D,CAAC,CAAA;IACzF,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;AAC7B,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;IAC9F,MAAM,KAAK,GAAa,EAAE,GAAG,EAAE,uBAAuB,EAAE,CAAA;IACxD,eAAe,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAA;IACzE,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC;QAC7C,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QACtD,oBAAoB,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO;QACzC,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,KAAK;YAC9E,OAAO,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAA,CAAC,CAAC,EAAE,CAAC;KAC9E,CAAC,CAAC,CAAA;IACH,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;IAC3D,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;IAC3D,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;IAC3D,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAA;IACvE,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,sBAAsB,CAAC,CAAA;AACnE,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;IAC/F,IAAI,SAAS,GAAG,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE,QAAQ,GAAG,CAAC,CAAA;IACzD,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,MAAM,KAAK,GAAa,EAAE,GAAG,EAAE,uBAAuB,EAAE,CAAA;QACxD,eAAe,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAA;QACxE,OAAO,KAAK,CAAA;IACd,CAAC,CAAA;IACD,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC;QAC7C,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,oBAAoB,EAAE,KAAK,IAAI,EAAE,CAAC,QAAQ;QACpG,aAAa,EAAE,KAAK,IAAI,EAAE,GAAG,SAAS,GAAG,QAAQ,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAA,CAAC,CAAC;QACjG,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,QAAQ,EAAE;YACxF,OAAO,EAAE,KAAK,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,OAAO,QAAQ,EAAE,CAAA,CAAC,CAAC,EAAE,CAAC;KAChF,CAAC,CAAC,CAAA;IACH,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;IACvB,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;IACvC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACtC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAA;IACzD,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;IACxC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;IACzB,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;IAC/D,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;AAC3B,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;IACvG,IAAI,QAAQ,GAAG,mBAAmB,EAAE,OAAO,GAAG,QAAQ,EAAE,OAAO,GAAG,CAAC,CAAA;IACnE,IAAI,OAAoB,CAAA;IACxB,IAAI,OAAoB,CAAA;IACxB,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,GAAG,OAAO,GAAG,OAAO,CAAA,CAAC,CAAC,CAAC,CAAA;IAChE,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,GAAG,OAAO,GAAG,OAAO,CAAA,CAAC,CAAC,CAAC,CAAA;IACnE,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC;QAC7C,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAC3D,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;QACvD,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE;gBAC7C,MAAM,QAAQ,GAAa,EAAE,GAAG,EAAE,uBAAuB,EAAE,CAAA;gBAC3D,eAAe,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAA;gBACnE,OAAO,QAAQ,CAAA;YACjB,CAAC,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA,CAAC,CAAC,EAAE,CAAC;QAC/E,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAA,CAAC,CAAC;KAChG,CAAC,CAAC,CAAA;IACH,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IACzD,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IACxB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,CAAA;IAC9B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,CAAA;IACrC,MAAM,OAAO,CAAA;IACb,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,uBAAuB,CAAC,CAAA;IAC9D,QAAQ,GAAG,uBAAuB,CAAA;IAClC,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,uBAAuB,EAAE,8DAA8D,CAAC,CAAA;IAClI,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,uBAAuB,EAAE,+DAA+D,CAAC,CAAA;IAChI,OAAO,EAAE,CAAA;IACT,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAA;IAChD,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IACxB,OAAO,GAAG,OAAO,CAAA;IACjB,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,0BAA0B,CAAC,CAAA;IAClE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;AAC1B,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;IACjG,IAAI,QAAQ,GAAG,qBAAqB,EAAE,QAAQ,GAAG,CAAC,CAAA;IAClD,IAAI,OAAoB,EAAE,OAAoB,CAAA;IAC9C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,GAAG,OAAO,GAAG,OAAO,CAAA,CAAC,CAAC,CAAC,CAAA;IACnE,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,GAAG,OAAO,GAAG,OAAO,CAAA,CAAC,CAAC,CAAC,CAAA;IAChE,MAAM,QAAQ,GAAa,EAAE,GAAG,EAAE,uBAAuB,EAAE,CAAA;IAC3D,eAAe,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAA;IAC7E,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC;QAC7C,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAC3D,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;QACvD,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,QAAQ;YACpF,OAAO,EAAE,KAAK,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,OAAO,QAAQ,CAAA,CAAC,CAAC,EAAE,CAAC;QACzD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,GAAG,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,IAAI,CAAA,CAAC,CAAC;KACrF,CAAC,CAAC,CAAA;IACH,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,CAAA;IAC9B,MAAM,OAAO,CAAA;IACb,QAAQ,GAAG,qBAAqB,CAAA;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,uBAAuB,CAAC,CAAA;QAClE,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,uBAAuB,CAAC,CAAA;QAC/D,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;IAC3B,CAAC;YAAS,CAAC;QAAC,OAAO,EAAE,CAAA;IAAC,CAAC;IACvB,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAA;IAChD,MAAM,OAAO,CAAC,MAAM,EAAE,CAAA;AACxB,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACnD,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,kBAAkB,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAA;AAC9F,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;IACnG,KAAK,MAAM,OAAO,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC9G,MAAM,QAAQ,GAAa,EAAE,GAAG,EAAE,uBAAuB,EAAE,CAAA;QAC3D,eAAe,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAA;QACnE,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC;YAC7C,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,oBAAoB,EAAE,KAAK,IAAI,EAAE,CAAC,QAAQ;YACzF,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA,CAAC,CAAC,EAAE,CAAC;SAC3H,CAAC,CAAC,CAAA;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;QACpC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;QAC5C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAA;QACjD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QACnC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;QAC1C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,EAAE,sDAAsD,CAAC,CAAA;QAC5I,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAA;QACrD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAA;QACrD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;IACxC,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;IACzF,MAAM,QAAQ,GAAa,EAAE,GAAG,EAAE,uBAAuB,EAAE,CAAA;IAC3D,eAAe,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAA;IAC7E,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC;QAC7C,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QACtD,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA,CAAC,CAAC,EAAE,CAAC;KAC3H,CAAC,CAAC,CAAA;IACH,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACpD,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAA;AACvE,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,0FAA0F,EAAE,KAAK,IAAI,EAAE;IAC1G,MAAM,QAAQ,GAAa,EAAE,GAAG,EAAE,uBAAuB,EAAE,CAAA;IAC3D,eAAe,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAA;IACnF,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC;QAC7C,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;QAC7D,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC/C,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA,CAAC,CAAC,EAAE,CAAC;QAC1H,MAAM,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA,CAAC,CAAC;KACpF,CAAC,CAAC,CAAA;IACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;IACpC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACnC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;IAC1C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAA;IAClD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IACrC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;IACtC,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,yBAAyB,CAAC,CAAA;IAClE,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,sCAAsC,CAAC,CAAA;AAChF,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,oFAAoF,EAAE,KAAK,IAAI,EAAE;IACpG,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,cAAc,CAAC,EAAE,CAAC,gCAAgC,EAAE,oBAAoB,CAAC;QACzH,CAAC,0BAA0B,EAAE,cAAc,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;QACjE,MAAM,QAAQ,GAAa,EAAE,GAAG,EAAE,uBAAuB,EAAE,CAAA;QAC3D,eAAe,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAM,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAA;QAC3E,IAAI,WAAW,GAAG,CAAC,EAAE,SAAS,GAAG,CAAC,CAAA;QAClC,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC;YAC7C,WAAW,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YACtF,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAG,WAAW,EAAE,CAAC,CAAC,OAAO,QAAQ,CAAA,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA,CAAC,CAAC,EAAE,CAAC;YACpJ,cAAc,EAAE,KAAK,IAAI,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA,CAAC,CAAC;SACtE,CAAC,CAAC,CAAA;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;QACpC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,KAAK,CAAC,CAAA;QAC1C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QACnC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAA;QAClD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;QACtC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;QACtC,MAAM,CAAC,EAAE,CAAC,WAAW,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,kEAAkE,CAAC,CAAA;QAC/G,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,yBAAyB,CAAC,CAAA;IACpE,CAAC;AACH,CAAC,CAAC,CAAA","sourcesContent":["import assert from \"node:assert/strict\"\nimport test from \"node:test\"\nimport { OpenCodeUpdateService, OpenCodeUpdateError,\n resolveLatestOpenCodeVersion, compareOpenCodeVersionStrings,\n type OpenCodeUpdateServiceDeps } from \"./service\"\nimport { MINIMUM_OPENCODE_VERSION as minimum } from \"../opencode/runtime-support\"\nimport { rememberRuntime } from \"../opencode/compatibility/runtime\"\nimport type { Endpoint } from \"@opencode/client/service\"\nimport { probeBinaryVersion } from \"../workspaces/spawn\"\n\nfunction deps(overrides: Partial<OpenCodeUpdateServiceDeps> = {}): OpenCodeUpdateServiceDeps {\n let version = \"0.0.0-beta-19271\"\n return {\n resolveBinary: () => ({ path: \"opencode2\", label: \"OpenCode\" }),\n probeBinary: () => ({ valid: true, version }),\n resolveLatestVersion: async () => minimum,\n canUpgradeBinary: () => true,\n upgradeBinary: async (_binary, target) => { version = target; return { success: true, version: target } },\n inspectRuntime: async () => ({ reload: true }),\n ...overrides,\n }\n}\n\ntest(\"missing installs and old releases use one updater; probe failures are not absence\", async () => {\n for (const initial of [undefined, \"0.0.0-beta-19271\", \"2.0.6\"]) {\n let version = initial\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => version ? { valid: true, version } : { valid: false, missing: true },\n upgradeBinary: async (_binary, target) => { version = target; return { success: true, version: target } },\n }))\n const status = await service.getStatus()\n assert.equal(status.state, initial ? \"update_required\" : \"missing\")\n assert.equal(status.minimumVersion, minimum)\n assert.equal(status.canUpgrade, true)\n assert.deepEqual(await service.upgrade(), { success: true, version: minimum })\n assert.equal((await service.getStatus()).state, \"ready\")\n }\n const invalid = new OpenCodeUpdateService(deps({ probeBinary: () => ({ valid: false, error: \"EACCES\" }) }))\n assert.equal((await invalid.getStatus()).state, \"error\")\n assert.equal((await invalid.getStatus()).canUpgrade, false)\n await assert.rejects(invalid.upgrade(), (error: unknown) => error instanceof OpenCodeUpdateError && error.code === \"binary_unavailable\")\n})\n\ntest(\"offline registry retains local required-update diagnosis\", async () => {\n const service = new OpenCodeUpdateService(deps({ resolveLatestVersion: async () => { throw new Error(\"offline\") } }))\n const status = await service.getStatus()\n assert.equal(status.state, \"update_required\")\n assert.equal(status.checkError, \"update_check_failed\")\n assert.equal(status.canUpgrade, false)\n await assert.rejects(service.upgrade(), (error: unknown) => error instanceof OpenCodeUpdateError && error.code === \"update_check_failed\")\n})\n\ntest(\"custom and WSL executables remain user managed\", async () => {\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: \"\\\\\\\\wsl.localhost\\\\Ubuntu\\\\usr\\\\bin\\\\opencode\", label: \"WSL\" }),\n canUpgradeBinary: () => false,\n }))\n const status = await service.getStatus()\n assert.equal(status.target, \"wsl\")\n assert.equal(status.canUpgrade, false)\n await assert.rejects(service.upgrade(), (error: unknown) => error instanceof OpenCodeUpdateError && error.code === \"unsupported_binary\")\n})\n\ntest(\"installation re-resolves the executable and rejects false success\", async () => {\n let installed = false\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: installed ? \"managed\" : \"opencode2\", label: \"OpenCode\" }),\n probeBinary: path => path === \"managed\" ? { valid: true, version: minimum } : { valid: false, missing: true },\n upgradeBinary: async (_binary, target) => { installed = true; return { success: true, version: target } },\n }))\n assert.equal((await service.upgrade()).version, minimum)\n const wrong = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: \"2.0.6\" }),\n upgradeBinary: async (_binary, target) => ({ success: true, version: target }),\n }))\n await assert.rejects(wrong.upgrade(), (error: unknown) => error instanceof OpenCodeUpdateError && error.code === \"upgrade_verification_failed\")\n})\n\ntest(\"legacy migration and PATH repair remain available without an update and never downgrade\", async () => {\n for (const source of [\"legacy\", \"user\"] as const) {\n let migrated = false, installs = 0\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: migrated ? \"common\" : source, label: \"OpenCode\", source: migrated ? \"path\" : source }),\n probeBinary: () => ({ valid: true, version: \"2.0.15\" }),\n resolveLatestVersion: async () => \"2.0.14\",\n upgradeBinary: async (_binary, target) => {\n assert.equal(target, \"2.0.15\")\n installs++; migrated = true\n return { success: true, version: target }\n },\n }))\n assert.equal((await service.getStatus()).canUpgrade, true)\n assert.equal((await service.getStatus()).needsSharedInstallation, true)\n await service.upgrade()\n assert.equal(installs, 1)\n assert.equal((await service.getStatus()).needsSharedInstallation, false)\n assert.equal((await service.getStatus()).canUpgrade, false)\n }\n})\n\ntest(\"coalesces overlapping installations and never downgrades a newer version\", async () => {\n let upgrades = 0\n let version = \"2.0.6\"\n let release!: () => void\n const gate = new Promise<void>(resolve => { release = resolve })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version }),\n upgradeBinary: async (_binary, target) => { upgrades++; await gate; version = target; return { success: true, version: target } },\n }))\n const first = service.upgrade(), second = service.upgrade()\n release()\n await Promise.all([first, second])\n assert.equal(upgrades, 1)\n version = \"2.0.999\"\n assert.equal((await service.getStatus()).updateAvailable, false)\n assert.equal((await service.upgrade()).version, version)\n assert.equal(upgrades, 1)\n})\n\ntest(\"stale daemon needs explicit restart; status and installation never restart it\", async () => {\n let daemonVersion = \"2.0.6\", restarts = 0, reconnects = 0\n const endpoint = () => {\n const value: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(value, { version: daemonVersion, pid: 123, discovery: \"info\" })\n return value\n }\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: minimum }),\n lifecycle: async () => ({ discover: async () => endpoint(), ensure: async () => endpoint(),\n restart: async () => { restarts++; daemonVersion = minimum; return endpoint() } }),\n reconnect: async () => { reconnects++ },\n }))\n assert.equal((await service.getStatus()).serviceState, \"restart_required\")\n assert.equal(restarts, 0)\n await assert.rejects(service.start(), /opencode_update_required/)\n assert.equal(restarts, 0)\n assert.equal(reconnects, 0)\n assert.equal((await service.start(true)).serviceState, \"ready\")\n assert.equal(restarts, 1)\n assert.equal(reconnects, 1)\n})\n\ntest(\"resolves exact stable package versions and rejects malformed/prerelease tags\", async () => {\n assert.equal(await resolveLatestOpenCodeVersion(async (url) => {\n assert.equal(url, \"https://registry.npmjs.org/-/package/%40opencode%2Fcli/dist-tags\")\n return new Response(JSON.stringify({ latest: minimum, beta: \"2.1.0-beta.1\" }))\n }), minimum)\n for (const tags of [{ beta: \"0.0.0-beta-19271\" }, { latest: \"2.1.0-beta.1\" }, { latest: \"2.0.11;whoami\" }]) {\n await assert.rejects(resolveLatestOpenCodeVersion(async () => new Response(JSON.stringify(tags))), /valid version/)\n }\n})\n\ntest(\"activation coalesces repeated clicks and refuses a changed selection before reconnect\", async () => {\n let selected = \"original\", restarts = 0, reconnects = 0\n let release!: () => void\n const gate = new Promise<void>(resolve => { release = resolve })\n const endpoint = (version: string) => {\n const value: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(value, { version, pid: 123, discovery: \"info\" })\n return value\n }\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: selected, label: selected }),\n probeBinary: () => ({ valid: true, version: minimum }),\n lifecycle: async () => ({ discover: async () => endpoint(\"2.0.6\"), ensure: async () => endpoint(minimum),\n restart: async () => { restarts++; await gate; return endpoint(minimum) } }),\n reconnect: async () => { reconnects++ },\n }))\n const first = service.start(true), second = service.start(true)\n assert.equal(first, second)\n selected = \"replacement\"\n release()\n await assert.rejects(first, /selection changed/)\n assert.equal(restarts, 0, \"a stale selection must be refused before stopping its daemon\")\n assert.equal(reconnects, 0)\n})\n\ntest(\"an unverified newer major is not blocked but cannot be downgraded by restart\", async () => {\n const value: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(value, { version: \"3.0.0\", pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: minimum }),\n resolveLatestVersion: async () => minimum,\n lifecycle: async () => ({ discover: async () => value, ensure: async () => value,\n restart: async () => { assert.fail(\"must not restart a newer runtime\") } }),\n }))\n assert.equal((await service.getStatus()).canUpgrade, false)\n assert.equal((await service.getStatus()).canRestart, false)\n assert.equal((await service.start()).serviceState, \"ready\")\n assert.equal((await service.getStatus()).versionAssessment, \"untested\")\n await assert.rejects(service.start(true), /not an older runtime/)\n})\n\ntest(\"optional upgrades retain explicit activation for an admitted but older daemon\", async () => {\n let installed = \"2.0.11\", daemon = \"2.0.11\", restarts = 0\n const endpoint = () => {\n const value: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(value, { version: daemon, pid: 123, discovery: \"info\" })\n return value\n }\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: installed }), resolveLatestVersion: async () => \"2.0.12\",\n upgradeBinary: async () => { installed = \"2.0.12\"; return { success: true, version: installed } },\n lifecycle: async () => ({ discover: async () => endpoint(), ensure: async () => endpoint(),\n restart: async () => { restarts++; daemon = installed; return endpoint() } }),\n }))\n await service.upgrade()\n const available = await service.start()\n assert.equal(available.state, \"ready\")\n assert.equal(available.serviceState, \"restart_available\")\n assert.equal(available.canRestart, true)\n assert.equal(restarts, 0)\n assert.equal((await service.start(true)).serviceState, \"ready\")\n assert.equal(restarts, 1)\n})\n\ntest(\"explicit configuration reload is admitted, fenced and serialized with service actions\", async () => {\n let selected = \"/fixture/opencode\", version = \"2.0.11\", reloads = 0\n let release!: () => void\n let entered!: () => void\n const gate = new Promise<void>(resolve => { release = resolve })\n const reached = new Promise<void>(resolve => { entered = resolve })\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: selected, label: \"Fixture\" }),\n probeBinary: () => ({ valid: true, version: \"2.0.11\" }),\n lifecycle: async () => ({ discover: async () => {\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version, pid: 123, discovery: \"info\" })\n return endpoint\n }, ensure: async () => { throw new Error(\"reload must not start a daemon\") } }),\n reload: async (_binary, assertCurrent) => { entered(); await gate; assertCurrent(); reloads++ },\n }))\n assert.equal((await service.getStatus()).canReload, true)\n assert.equal(reloads, 0)\n const first = service.reload()\n assert.equal(service.reload(), first)\n await reached\n await assert.rejects(service.start(), /action is in progress/)\n selected = \"/replacement/opencode\"\n await assert.rejects(service.start(true), /action is in progress/, \"changing executables cannot overlap the shared-daemon reload\")\n await assert.rejects(service.reload(), /action is in progress/, \"a different selection must not coalesce with the captured one\")\n release()\n await assert.rejects(first, /selection changed/)\n assert.equal(reloads, 0)\n version = \"2.0.6\"\n await assert.rejects(service.reload(), /opencode_update_required/)\n assert.equal(reloads, 0)\n})\n\ntest(\"an in-flight native reload holds shared-service authority across binary changes\", async () => {\n let selected = \"/fixture/a/opencode\", restarts = 0\n let entered!: () => void, release!: () => void\n const reached = new Promise<void>(resolve => { entered = resolve })\n const gate = new Promise<void>(resolve => { release = resolve })\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version: \"2.0.11\", pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: selected, label: \"Fixture\" }),\n probeBinary: () => ({ valid: true, version: \"2.0.12\" }),\n lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => endpoint,\n restart: async () => { restarts++; return endpoint } }),\n reload: async (_binary, assertCurrent) => { assertCurrent(); entered(); await gate },\n }))\n const first = service.reload()\n await reached\n selected = \"/fixture/b/opencode\"\n try {\n await assert.rejects(service.start(true), /action is in progress/)\n await assert.rejects(service.reload(), /action is in progress/)\n assert.equal(restarts, 0)\n } finally { release() }\n await assert.rejects(first, /selection changed/)\n await service.reload()\n})\n\ntest(\"beta version comparison remains numeric\", () => {\n assert.equal(compareOpenCodeVersionStrings(\"0.0.0-beta-10000\", \"0.0.0-beta-9999\") > 0, true)\n})\n\ntest(\"2.0.7 through 2.0.14 remain usable; recommendation only offers an optional update\", async () => {\n for (const version of [\"2.0.7\", \"2.0.8\", \"2.0.9\", \"2.0.10\", \"2.0.11\", \"2.0.12\", \"2.0.13\", \"2.0.14\", \"2.0.15\"]) {\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version, pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version }), resolveLatestVersion: async () => \"2.0.15\",\n lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => { throw new Error(\"must retain daemon\") } }),\n }))\n const status = await service.start()\n assert.equal(status.minimumVersion, \"2.0.7\")\n assert.equal(status.recommendedVersion, \"2.0.15\")\n assert.equal(status.state, \"ready\")\n assert.equal(status.serviceState, \"ready\")\n assert.equal(status.versionAssessment, version === \"2.0.15\" ? \"tested\" : \"untested\", \"only the current recommendation is release-qualified\")\n assert.equal(status.incompatibilityReason, undefined)\n assert.equal(status.canUpgrade, version !== \"2.0.15\")\n assert.equal(status.canRestart, false)\n }\n})\n\ntest(\"a current daemon remains usable through an older selected discovery CLI\", async () => {\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version: \"2.0.15\", pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: \"2.0.3\" }),\n lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => { throw new Error(\"must retain daemon\") } }),\n }))\n assert.equal((await service.start()).state, \"ready\")\n assert.equal((await service.getStatus()).versionAssessment, \"tested\")\n})\n\ntest(\"custom labels are unverified, not an update demand; optional reload follows capabilities\", async () => {\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version: \"custom-build\", pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: \"custom-build\" }),\n inspectRuntime: async () => ({ reload: false }),\n lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => { throw new Error(\"must retain daemon\") } }),\n reload: async () => { throw new Error(\"unavailable operation must not be called\") },\n }))\n const status = await service.start()\n assert.equal(status.state, \"ready\")\n assert.equal(status.serviceState, \"ready\")\n assert.equal(status.versionAssessment, \"untested\")\n assert.equal(status.canReload, false)\n assert.equal(status.canUpgrade, false)\n await assert.rejects(service.upgrade(), /custom OpenCode version/)\n await assert.rejects(service.reload(), /does not expose configuration reload/)\n})\n\ntest(\"production stdout parsing preserves custom labels through discovery and activation\", async () => {\n for (const [stdout, label] of [[\"custom-build\\n\", \"custom-build\"], [\"opencode v2.0.7+custom-build\\n\", \"2.0.7+custom-build\"],\n [\"opencode2 vendor-build\\n\", \"vendor-build\"], [\"\", \"unknown\"]]) {\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version: label!, pid: 123, discovery: \"info\" })\n let discoveries = 0, inspected = 0\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => probeBinaryVersion(process.execPath, () => ({ status: 0, stdout })),\n lifecycle: async () => ({ discover: async () => { discoveries++; return endpoint }, ensure: async () => { throw new Error(\"must retain daemon\") } }),\n inspectRuntime: async () => { inspected++; return { reload: false } },\n }))\n const status = await service.start()\n assert.equal(status.currentVersion, label)\n assert.equal(status.state, \"ready\")\n assert.equal(status.versionAssessment, \"untested\")\n assert.equal(status.canUpgrade, false)\n assert.equal(status.canRestart, false)\n assert.ok(discoveries > 0 && inspected > 0, \"successful custom labels reach authenticated contract inspection\")\n await assert.rejects(service.upgrade(), /custom OpenCode version/)\n }\n})\n"]}
|
|
1
|
+
{"version":3,"file":"service.test.js","sourceRoot":"","sources":["../../src/opencode-update/service.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert/strict\"\nimport test from \"node:test\"\nimport { OpenCodeUpdateService, OpenCodeUpdateError,\n resolveLatestOpenCodeVersion, compareOpenCodeVersionStrings,\n type OpenCodeUpdateServiceDeps } from \"./service\"\nimport { MINIMUM_OPENCODE_VERSION as minimum } from \"../opencode/runtime-support\"\nimport { rememberRuntime } from \"../opencode/compatibility/runtime\"\nimport type { Endpoint } from \"@opencode/client/service\"\nimport { probeBinaryVersion } from \"../workspaces/spawn\"\n\nfunction deps(overrides: Partial<OpenCodeUpdateServiceDeps> = {}): OpenCodeUpdateServiceDeps {\n let version = \"0.0.0-beta-19271\"\n return {\n resolveBinary: () => ({ path: \"opencode2\", label: \"OpenCode\" }),\n probeBinary: () => ({ valid: true, version }),\n resolveLatestVersion: async () => minimum,\n canUpgradeBinary: () => true,\n upgradeBinary: async (_binary, target) => { version = target; return { success: true, version: target } },\n inspectRuntime: async () => ({ reload: true }),\n ...overrides,\n }\n}\n\ntest(\"missing installs and old releases use one updater; probe failures are not absence\", async () => {\n for (const initial of [undefined, \"0.0.0-beta-19271\", \"2.0.6\"]) {\n let version = initial\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => version ? { valid: true, version } : { valid: false, missing: true },\n upgradeBinary: async (_binary, target) => { version = target; return { success: true, version: target } },\n }))\n const status = await service.getStatus()\n assert.equal(status.state, initial ? \"update_required\" : \"missing\")\n assert.equal(status.minimumVersion, minimum)\n assert.equal(status.canUpgrade, true)\n assert.deepEqual(await service.upgrade(), { success: true, version: minimum })\n assert.equal((await service.getStatus()).state, \"ready\")\n }\n const invalid = new OpenCodeUpdateService(deps({ probeBinary: () => ({ valid: false, error: \"EACCES\" }) }))\n assert.equal((await invalid.getStatus()).state, \"error\")\n assert.equal((await invalid.getStatus()).canUpgrade, false)\n await assert.rejects(invalid.upgrade(), (error: unknown) => error instanceof OpenCodeUpdateError && error.code === \"binary_unavailable\")\n})\n\ntest(\"offline registry retains local required-update diagnosis\", async () => {\n const service = new OpenCodeUpdateService(deps({ resolveLatestVersion: async () => { throw new Error(\"offline\") } }))\n const status = await service.getStatus()\n assert.equal(status.state, \"update_required\")\n assert.equal(status.checkError, \"update_check_failed\")\n assert.equal(status.canUpgrade, false)\n await assert.rejects(service.upgrade(), (error: unknown) => error instanceof OpenCodeUpdateError && error.code === \"update_check_failed\")\n})\n\ntest(\"custom and WSL executables remain user managed\", async () => {\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: \"\\\\\\\\wsl.localhost\\\\Ubuntu\\\\usr\\\\bin\\\\opencode\", label: \"WSL\" }),\n canUpgradeBinary: () => false,\n }))\n const status = await service.getStatus()\n assert.equal(status.target, \"wsl\")\n assert.equal(status.canUpgrade, false)\n await assert.rejects(service.upgrade(), (error: unknown) => error instanceof OpenCodeUpdateError && error.code === \"unsupported_binary\")\n})\n\ntest(\"installation re-resolves the executable and rejects false success\", async () => {\n let installed = false\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: installed ? \"managed\" : \"opencode2\", label: \"OpenCode\" }),\n probeBinary: path => path === \"managed\" ? { valid: true, version: minimum } : { valid: false, missing: true },\n upgradeBinary: async (_binary, target) => { installed = true; return { success: true, version: target } },\n }))\n assert.equal((await service.upgrade()).version, minimum)\n const wrong = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: \"2.0.6\" }),\n upgradeBinary: async (_binary, target) => ({ success: true, version: target }),\n }))\n await assert.rejects(wrong.upgrade(), (error: unknown) => error instanceof OpenCodeUpdateError && error.code === \"upgrade_verification_failed\")\n})\n\ntest(\"user npm PATH repair remains available without an update and never downgrades\", async () => {\n for (const source of [\"user\"] as const) {\n let migrated = false, installs = 0\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: migrated ? \"common\" : source, label: \"OpenCode\", source: migrated ? \"path\" : source }),\n probeBinary: () => ({ valid: true, version: \"2.0.15\" }),\n resolveLatestVersion: async () => \"2.0.14\",\n upgradeBinary: async (_binary, target) => {\n assert.equal(target, \"2.0.15\")\n installs++; migrated = true\n return { success: true, version: target }\n },\n }))\n assert.equal((await service.getStatus()).canUpgrade, true)\n assert.equal((await service.getStatus()).needsSharedInstallation, true)\n await service.upgrade()\n assert.equal(installs, 1)\n assert.equal((await service.getStatus()).needsSharedInstallation, false)\n assert.equal((await service.getStatus()).canUpgrade, false)\n }\n})\n\ntest(\"coalesces overlapping installations and never downgrades a newer version\", async () => {\n let upgrades = 0\n let version = \"2.0.6\"\n let release!: () => void\n const gate = new Promise<void>(resolve => { release = resolve })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version }),\n upgradeBinary: async (_binary, target) => { upgrades++; await gate; version = target; return { success: true, version: target } },\n }))\n const first = service.upgrade(), second = service.upgrade()\n release()\n await Promise.all([first, second])\n assert.equal(upgrades, 1)\n version = \"2.0.999\"\n assert.equal((await service.getStatus()).updateAvailable, false)\n assert.equal((await service.upgrade()).version, version)\n assert.equal(upgrades, 1)\n})\n\ntest(\"stale daemon needs explicit restart; status and installation never restart it\", async () => {\n let daemonVersion = \"2.0.6\", restarts = 0, reconnects = 0\n const endpoint = () => {\n const value: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(value, { version: daemonVersion, pid: 123, discovery: \"info\" })\n return value\n }\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: minimum }),\n lifecycle: async () => ({ discover: async () => endpoint(), ensure: async () => endpoint(),\n restart: async () => { restarts++; daemonVersion = minimum; return endpoint() } }),\n reconnect: async () => { reconnects++ },\n }))\n assert.equal((await service.getStatus()).serviceState, \"restart_required\")\n assert.equal(restarts, 0)\n await assert.rejects(service.start(), /opencode_update_required/)\n assert.equal(restarts, 0)\n assert.equal(reconnects, 0)\n assert.equal((await service.start(true)).serviceState, \"ready\")\n assert.equal(restarts, 1)\n assert.equal(reconnects, 1)\n})\n\ntest(\"resolves exact stable package versions and rejects malformed/prerelease tags\", async () => {\n assert.equal(await resolveLatestOpenCodeVersion(async (url) => {\n assert.equal(url, \"https://registry.npmjs.org/-/package/%40opencode%2Fcli/dist-tags\")\n return new Response(JSON.stringify({ latest: minimum, beta: \"2.1.0-beta.1\" }))\n }), minimum)\n for (const tags of [{ beta: \"0.0.0-beta-19271\" }, { latest: \"2.1.0-beta.1\" }, { latest: \"2.0.11;whoami\" }]) {\n await assert.rejects(resolveLatestOpenCodeVersion(async () => new Response(JSON.stringify(tags))), /valid version/)\n }\n})\n\ntest(\"activation coalesces repeated clicks and refuses a changed selection before reconnect\", async () => {\n let selected = \"original\", restarts = 0, reconnects = 0\n let release!: () => void\n const gate = new Promise<void>(resolve => { release = resolve })\n const endpoint = (version: string) => {\n const value: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(value, { version, pid: 123, discovery: \"info\" })\n return value\n }\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: selected, label: selected }),\n probeBinary: () => ({ valid: true, version: minimum }),\n lifecycle: async () => ({ discover: async () => endpoint(\"2.0.6\"), ensure: async () => endpoint(minimum),\n restart: async () => { restarts++; await gate; return endpoint(minimum) } }),\n reconnect: async () => { reconnects++ },\n }))\n const first = service.start(true), second = service.start(true)\n assert.equal(first, second)\n selected = \"replacement\"\n release()\n await assert.rejects(first, /selection changed/)\n assert.equal(restarts, 0, \"a stale selection must be refused before stopping its daemon\")\n assert.equal(reconnects, 0)\n})\n\ntest(\"an unverified newer major is not blocked but cannot be downgraded by restart\", async () => {\n const value: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(value, { version: \"3.0.0\", pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: minimum }),\n resolveLatestVersion: async () => minimum,\n lifecycle: async () => ({ discover: async () => value, ensure: async () => value,\n restart: async () => { assert.fail(\"must not restart a newer runtime\") } }),\n }))\n assert.equal((await service.getStatus()).canUpgrade, false)\n assert.equal((await service.getStatus()).canRestart, false)\n assert.equal((await service.start()).serviceState, \"ready\")\n assert.equal((await service.getStatus()).versionAssessment, \"untested\")\n await assert.rejects(service.start(true), /not an older runtime/)\n})\n\ntest(\"optional upgrades retain explicit activation for an admitted but older daemon\", async () => {\n let installed = \"2.0.11\", daemon = \"2.0.11\", restarts = 0\n const endpoint = () => {\n const value: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(value, { version: daemon, pid: 123, discovery: \"info\" })\n return value\n }\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: installed }), resolveLatestVersion: async () => \"2.0.12\",\n upgradeBinary: async () => { installed = \"2.0.12\"; return { success: true, version: installed } },\n lifecycle: async () => ({ discover: async () => endpoint(), ensure: async () => endpoint(),\n restart: async () => { restarts++; daemon = installed; return endpoint() } }),\n }))\n await service.upgrade()\n const available = await service.start()\n assert.equal(available.state, \"ready\")\n assert.equal(available.serviceState, \"restart_available\")\n assert.equal(available.canRestart, true)\n assert.equal(restarts, 0)\n assert.equal((await service.start(true)).serviceState, \"ready\")\n assert.equal(restarts, 1)\n})\n\ntest(\"explicit configuration reload is admitted, fenced and serialized with service actions\", async () => {\n let selected = \"/fixture/opencode\", version = \"2.0.11\", reloads = 0\n let release!: () => void\n let entered!: () => void\n const gate = new Promise<void>(resolve => { release = resolve })\n const reached = new Promise<void>(resolve => { entered = resolve })\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: selected, label: \"Fixture\" }),\n probeBinary: () => ({ valid: true, version: \"2.0.11\" }),\n lifecycle: async () => ({ discover: async () => {\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version, pid: 123, discovery: \"info\" })\n return endpoint\n }, ensure: async () => { throw new Error(\"reload must not start a daemon\") } }),\n reload: async (_binary, assertCurrent) => { entered(); await gate; assertCurrent(); reloads++ },\n }))\n assert.equal((await service.getStatus()).canReload, true)\n assert.equal(reloads, 0)\n const first = service.reload()\n assert.equal(service.reload(), first)\n await reached\n await assert.rejects(service.start(), /action is in progress/)\n selected = \"/replacement/opencode\"\n await assert.rejects(service.start(true), /action is in progress/, \"changing executables cannot overlap the shared-daemon reload\")\n await assert.rejects(service.reload(), /action is in progress/, \"a different selection must not coalesce with the captured one\")\n release()\n await assert.rejects(first, /selection changed/)\n assert.equal(reloads, 0)\n version = \"2.0.6\"\n await assert.rejects(service.reload(), /opencode_update_required/)\n assert.equal(reloads, 0)\n})\n\ntest(\"an in-flight native reload holds shared-service authority across binary changes\", async () => {\n let selected = \"/fixture/a/opencode\", restarts = 0\n let entered!: () => void, release!: () => void\n const reached = new Promise<void>(resolve => { entered = resolve })\n const gate = new Promise<void>(resolve => { release = resolve })\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version: \"2.0.11\", pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: selected, label: \"Fixture\" }),\n probeBinary: () => ({ valid: true, version: \"2.0.12\" }),\n lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => endpoint,\n restart: async () => { restarts++; return endpoint } }),\n reload: async (_binary, assertCurrent) => { assertCurrent(); entered(); await gate },\n }))\n const first = service.reload()\n await reached\n selected = \"/fixture/b/opencode\"\n try {\n await assert.rejects(service.start(true), /action is in progress/)\n await assert.rejects(service.reload(), /action is in progress/)\n assert.equal(restarts, 0)\n } finally { release() }\n await assert.rejects(first, /selection changed/)\n await service.reload()\n})\n\ntest(\"beta version comparison remains numeric\", () => {\n assert.equal(compareOpenCodeVersionStrings(\"0.0.0-beta-10000\", \"0.0.0-beta-9999\") > 0, true)\n})\n\ntest(\"2.0.7 through 2.0.14 remain usable; recommendation only offers an optional update\", async () => {\n for (const version of [\"2.0.7\", \"2.0.8\", \"2.0.9\", \"2.0.10\", \"2.0.11\", \"2.0.12\", \"2.0.13\", \"2.0.14\", \"2.0.15\"]) {\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version, pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version }), resolveLatestVersion: async () => \"2.0.15\",\n lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => { throw new Error(\"must retain daemon\") } }),\n }))\n const status = await service.start()\n assert.equal(status.minimumVersion, \"2.0.7\")\n assert.equal(status.recommendedVersion, \"2.0.15\")\n assert.equal(status.state, \"ready\")\n assert.equal(status.serviceState, \"ready\")\n assert.equal(status.versionAssessment, version === \"2.0.15\" ? \"tested\" : \"untested\", \"only the current recommendation is release-qualified\")\n assert.equal(status.incompatibilityReason, undefined)\n assert.equal(status.canUpgrade, version !== \"2.0.15\")\n assert.equal(status.canRestart, false)\n }\n})\n\ntest(\"a current daemon remains usable through an older selected discovery CLI\", async () => {\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version: \"2.0.15\", pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: \"2.0.3\" }),\n lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => { throw new Error(\"must retain daemon\") } }),\n }))\n assert.equal((await service.start()).state, \"ready\")\n assert.equal((await service.getStatus()).versionAssessment, \"tested\")\n})\n\ntest(\"custom labels are unverified, not an update demand; optional reload follows capabilities\", async () => {\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version: \"custom-build\", pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: \"custom-build\" }),\n inspectRuntime: async () => ({ reload: false }),\n lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => { throw new Error(\"must retain daemon\") } }),\n reload: async () => { throw new Error(\"unavailable operation must not be called\") },\n }))\n const status = await service.start()\n assert.equal(status.state, \"ready\")\n assert.equal(status.serviceState, \"ready\")\n assert.equal(status.versionAssessment, \"untested\")\n assert.equal(status.canReload, false)\n assert.equal(status.canUpgrade, false)\n await assert.rejects(service.upgrade(), /custom OpenCode version/)\n await assert.rejects(service.reload(), /does not expose configuration reload/)\n})\n\ntest(\"production stdout parsing preserves custom labels through discovery and activation\", async () => {\n for (const [stdout, label] of [[\"custom-build\\n\", \"custom-build\"], [\"opencode v2.0.7+custom-build\\n\", \"2.0.7+custom-build\"],\n [\"opencode2 vendor-build\\n\", \"vendor-build\"], [\"\", \"unknown\"]]) {\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version: label!, pid: 123, discovery: \"info\" })\n let discoveries = 0, inspected = 0\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => probeBinaryVersion(process.execPath, () => ({ status: 0, stdout })),\n lifecycle: async () => ({ discover: async () => { discoveries++; return endpoint }, ensure: async () => { throw new Error(\"must retain daemon\") } }),\n inspectRuntime: async () => { inspected++; return { reload: false } },\n }))\n const status = await service.start()\n assert.equal(status.currentVersion, label)\n assert.equal(status.state, \"ready\")\n assert.equal(status.versionAssessment, \"untested\")\n assert.equal(status.canUpgrade, false)\n assert.equal(status.canRestart, false)\n assert.ok(discoveries > 0 && inspected > 0, \"successful custom labels reach authenticated contract inspection\")\n await assert.rejects(service.upgrade(), /custom OpenCode version/)\n }\n})\n"]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { accessSync, constants, existsSync, readFileSync, realpathSync, statSync } from "node:fs";
|
|
2
2
|
import os from "node:os";
|
|
3
3
|
import path from "node:path";
|
|
4
|
-
import { bundledNpm, executeInstaller
|
|
4
|
+
import { bundledNpm, executeInstaller } from "./npm-runtime";
|
|
5
|
+
import { isRetiredInstallation } from "./retired-installation";
|
|
5
6
|
import { registerUserPath } from "./user-path";
|
|
6
7
|
import { probeBinaryVersionAsync, buildSpawnSpec } from "../workspaces/spawn";
|
|
7
8
|
import { assertSupportedOpenCode } from "../opencode/runtime-support";
|
|
@@ -98,6 +99,8 @@ export function findPathOpenCode(host = {}) {
|
|
|
98
99
|
try {
|
|
99
100
|
if (!statSync(candidate).isFile())
|
|
100
101
|
continue;
|
|
102
|
+
if (isRetiredInstallation(candidate))
|
|
103
|
+
continue;
|
|
101
104
|
accessSync(candidate, platform === "win32" ? constants.F_OK : constants.X_OK);
|
|
102
105
|
if (inNpmBin && npmPackage(prefix, platform)) {
|
|
103
106
|
if (retiredNpmAlias(candidate, prefix, platform))
|
|
@@ -115,17 +118,17 @@ export function resolveDefaultInstallation(host = {}) {
|
|
|
115
118
|
return { path: command, source: "path" };
|
|
116
119
|
const prefix = userNpmPrefix(host);
|
|
117
120
|
const binary = npmCommand(prefix, host.platform ?? process.platform)?.binary ?? npmExecutable(prefix, host.platform);
|
|
118
|
-
if (existsSync(binary))
|
|
121
|
+
if (existsSync(binary) && !isRetiredInstallation(binary))
|
|
119
122
|
return { path: binary, source: "user" };
|
|
120
|
-
|
|
121
|
-
const legacy = readManagedExecutable(path.join(host.home ?? os.homedir(), ".local", "share", "codenomad", "opencode"));
|
|
122
|
-
return legacy ? { path: legacy, source: "legacy" } : { path: "opencode2" };
|
|
123
|
+
return { path: "opencode2" };
|
|
123
124
|
}
|
|
124
125
|
/** Only a verified npm installation may be updated via npm. Homebrew/curl and
|
|
125
126
|
* explicit custom executable choices retain their own installation authority. */
|
|
126
127
|
export function sharedInstallPrefix(host = {}) {
|
|
127
128
|
const platform = host.platform ?? process.platform;
|
|
128
129
|
const userPrefix = userNpmPrefix(host);
|
|
130
|
+
if (isRetiredInstallation(userPrefix))
|
|
131
|
+
return undefined;
|
|
129
132
|
const command = findPathOpenCode(host) ?? findPathOpenCode({ ...host,
|
|
130
133
|
env: { PATH: npmCommandDirectory(userPrefix, platform), PATHEXT: ".EXE;.CMD;.BAT" } });
|
|
131
134
|
if (!command)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-installation.js","sourceRoot":"","sources":["../../src/opencode-update/shared-installation.ts"],"names":[],"mappings":"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","sourcesContent":["import { accessSync, constants, existsSync, readFileSync, realpathSync, statSync } from \"node:fs\"\nimport os from \"node:os\"\nimport path from \"node:path\"\nimport { bundledNpm, executeInstaller, readManagedExecutable } from \"./managed-installation\"\nimport { registerUserPath } from \"./user-path\"\nimport { probeBinaryVersionAsync, buildSpawnSpec } from \"../workspaces/spawn\"\nimport { assertSupportedOpenCode } from \"../opencode/runtime-support\"\nimport { compareVersionStrings } from \"../releases/release-monitor\"\nimport { assertExecutableWritable, withInstallationLock } from \"./installation-lock\"\n\nexport interface InstallationHost {\n home?: string\n platform?: NodeJS.Platform\n env?: NodeJS.ProcessEnv\n}\n\nexport function userNpmPrefix(host: InstallationHost = {}): string {\n const home = host.home ?? os.homedir()\n const env = host.env ?? process.env\n const configured = Object.entries(env).find(([key]) => key.toLowerCase() === \"npm_config_prefix\")?.[1]\n if (configured && path.isAbsolute(configured)) return configured\n return (host.platform ?? process.platform) === \"win32\"\n ? path.join(env.APPDATA || path.join(home, \"AppData\", \"Roaming\"), \"npm\") : path.join(home, \".local\")\n}\n\nexport function npmCommandDirectory(prefix: string, platform = process.platform): string {\n return platform === \"win32\" ? prefix : path.join(prefix, \"bin\")\n}\n\nexport function npmExecutable(prefix: string, platform = process.platform): string {\n return path.join(prefix, ...(platform === \"win32\" ? [] : [\"lib\"]), \"node_modules\", \"@opencode\", \"cli\", \"bin\", \"opencode.exe\")\n}\n\nfunction npmPackage(prefix: string, platform: NodeJS.Platform) {\n try {\n const file = path.join(path.dirname(npmExecutable(prefix, platform)), \"..\", \"package.json\")\n const manifest = JSON.parse(readFileSync(file, \"utf8\")) as { name?: string; bin?: Record<string, string> }\n return manifest.name === \"@opencode/cli\" ? manifest : undefined\n } catch { return undefined }\n}\n\nfunction npmLauncher(command: string, prefix: string, platform: NodeJS.Platform): string | undefined {\n const manifest = npmPackage(prefix, platform)\n if (!manifest?.bin) return undefined\n const name = path.basename(command).replace(platform === \"win32\" ? /\\.cmd$/i : /$^/, \"\")\n const relative = manifest.bin[name]\n if (typeof relative !== \"string\" || !/^\\.\\/bin\\/[^/\\\\]+\\.exe$/.test(relative)) return undefined\n const packageRoot = path.join(path.dirname(npmExecutable(prefix, platform)), \"..\")\n const binary = path.resolve(packageRoot, relative)\n try {\n if (!statSync(binary).isFile()) return undefined\n const resolved = platform === \"win32\" ? buildSpawnSpec(command, [], { platform }).command : realpathSync(command)\n return realpathSync(resolved) === realpathSync(binary) ? binary : undefined\n } catch { return undefined }\n}\n\nfunction retiredNpmAlias(command: string, prefix: string, platform: NodeJS.Platform): boolean {\n const name = platform === \"win32\" ? path.basename(command).replace(/\\.cmd$/i, \"\") : path.basename(command)\n const relative = npmPackage(prefix, platform)?.bin?.[name]\n if (typeof relative !== \"string\" || !/^\\.\\/bin\\/[^/\\\\]+\\.cjs$/.test(relative)) return false\n try {\n const target = path.resolve(path.dirname(npmExecutable(prefix, platform)), \"..\", relative)\n if (platform === \"win32\") {\n const script = readFileSync(command, \"utf8\")\n if (script.length > 64 * 1024) return false\n const escaped = path.basename(target).replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n return statSync(target).isFile() && new RegExp(`[\"'](?:%dp0%|%~dp0)[\\\\\\\\/]node_modules[\\\\\\\\/]@opencode[\\\\\\\\/]cli[\\\\\\\\/]bin[\\\\\\\\/]${escaped}[\"']\\\\s+%\\\\*`, \"i\").test(script)\n }\n return realpathSync(command) === realpathSync(target)\n } catch { return false }\n}\n\nfunction npmCommand(prefix: string, platform: NodeJS.Platform): { command: string; binary: string } | undefined {\n const directory = npmCommandDirectory(prefix, platform)\n for (const name of [\"opencode2\", \"opencode\"]) {\n const command = path.join(directory, platform === \"win32\" ? `${name}.cmd` : name)\n const binary = npmLauncher(command, prefix, platform)\n if (binary) return { command, binary }\n }\n}\n\nexport function findPathOpenCode(host: InstallationHost = {}): string | undefined {\n const env = host.env ?? process.env\n const platform = host.platform ?? process.platform\n const key = Object.keys(env).find(key => key.toLowerCase() === \"path\")\n const extensions = platform === \"win32\" ? (env.PATHEXT || \".COM;.EXE;.BAT;.CMD\").toLowerCase().split(\";\") : [\"\"]\n for (const entry of (env[key ?? \"PATH\"] || \"\").split(platform === \"win32\" ? \";\" : \":\")) {\n const directory = entry.replace(/^\"|\"$/g, \"\")\n if (!directory || !path.isAbsolute(directory)) continue\n const prefix = platform === \"win32\" ? directory : path.dirname(directory)\n const inNpmBin = path.resolve(directory) === path.resolve(npmCommandDirectory(prefix, platform))\n for (const name of [\"opencode2\", \"opencode\"]) for (const extension of extensions) {\n const candidate = path.join(directory, `${name}${extension}`)\n try {\n if (!statSync(candidate).isFile()) continue\n accessSync(candidate, platform === \"win32\" ? constants.F_OK : constants.X_OK)\n if (inNpmBin && npmPackage(prefix, platform)) {\n if (retiredNpmAlias(candidate, prefix, platform)) continue\n }\n return candidate\n } catch { /* Continue in PATH order. */ }\n }\n }\n}\n\nexport function resolveDefaultInstallation(host: InstallationHost = {}): { path: string; source?: \"path\" | \"user\" | \"legacy\" } {\n const command = findPathOpenCode(host)\n if (command) return { path: command, source: \"path\" }\n const prefix = userNpmPrefix(host)\n const binary = npmCommand(prefix, host.platform ?? process.platform)?.binary ?? npmExecutable(prefix, host.platform)\n if (existsSync(binary)) return { path: binary, source: \"user\" }\n // Migration fallback only: never override an installation shared through PATH.\n const legacy = readManagedExecutable(path.join(host.home ?? os.homedir(), \".local\", \"share\", \"codenomad\", \"opencode\"))\n return legacy ? { path: legacy, source: \"legacy\" } : { path: \"opencode2\" }\n}\n\n/** Only a verified npm installation may be updated via npm. Homebrew/curl and\n * explicit custom executable choices retain their own installation authority. */\nexport function sharedInstallPrefix(host: InstallationHost = {}): string | undefined {\n const platform = host.platform ?? process.platform\n const userPrefix = userNpmPrefix(host)\n const command = findPathOpenCode(host) ?? findPathOpenCode({ ...host,\n env: { PATH: npmCommandDirectory(userPrefix, platform), PATHEXT: \".EXE;.CMD;.BAT\" } })\n if (!command) return userPrefix\n const prefix = platform === \"win32\" ? path.dirname(command) : path.dirname(path.dirname(command))\n try {\n if (!npmLauncher(command, prefix, platform)) return undefined\n accessSync(prefix, constants.W_OK)\n return prefix\n } catch { return undefined }\n}\n\nexport async function installSharedOpenCode(version: string, options: InstallationHost & {\n node?: string; npm?: string\n execute?: typeof executeInstaller\n probe?: typeof probeBinaryVersionAsync\n registerPath?: (directory: string) => Promise<void>\n} = {}): Promise<string> {\n if (!/^\\d+\\.\\d+\\.\\d+$/.test(version)) throw new Error(\"Installation requires an exact stable OpenCode version\")\n assertSupportedOpenCode(version)\n const platform = options.platform ?? process.platform\n const prefix = sharedInstallPrefix(options)\n if (!prefix) throw new Error(\"The PATH executable is not a writable npm installation\")\n const node = options.node ?? process.execPath\n const npm = options.npm ?? bundledNpm(node)\n if (!npm) throw new Error(\"npm is unavailable beside the CodeNomad Node runtime\")\n const binary = npmExecutable(prefix, platform)\n const probe = options.probe ?? probeBinaryVersionAsync\n return withInstallationLock(prefix, async () => {\n const oldBinary = npmCommand(prefix, platform)?.binary ?? binary\n const existing = await probe(oldBinary)\n if (existing.valid && (!existing.version || !/^(?:\\d+\\.\\d+\\.\\d+|0\\.0\\.0-beta-\\d+)$/.test(existing.version))) {\n throw new Error(\"Cannot replace an unverified OpenCode version automatically\")\n }\n const target = existing.valid && existing.version && /^\\d+\\.\\d+\\.\\d+$/.test(existing.version) && compareVersionStrings(existing.version, version) > 0 ? existing.version : version\n const directory = npmCommandDirectory(prefix, platform)\n const commandHost = { ...options, env: { PATH: directory, PATHEXT: \".EXE;.CMD;.BAT\" } }\n if (!existing.valid || existing.version !== target || !npmCommand(prefix, platform) || oldBinary !== binary) {\n await assertExecutableWritable(oldBinary, platform)\n const env = { ...(options.env ?? process.env) }\n const key = Object.keys(env).find(key => key.toLowerCase() === \"path\") ?? \"PATH\"\n env[key] = `${path.dirname(node)}${platform === \"win32\" ? \";\" : \":\"}${env[key] || \"\"}`\n await (options.execute ?? executeInstaller)(node, [npm, \"install\", \"--global\", \"--prefix\", prefix,\n \"--no-audit\", \"--no-fund\", \"--registry=https://registry.npmjs.org\", `@opencode/cli@${target}`], env)\n }\n const result = await probe(binary)\n if (!result.valid || !result.version || !/^\\d+\\.\\d+\\.\\d+$/.test(result.version) || compareVersionStrings(result.version, target) < 0) {\n throw new Error(\"Installed OpenCode version verification failed\")\n }\n if (!findPathOpenCode(commandHost) || sharedInstallPrefix(commandHost) !== prefix) {\n throw new Error(\"npm did not publish the verified OpenCode terminal command\")\n }\n await (options.registerPath ?? (directory => registerUserPath(directory, options)))(directory)\n return binary\n })\n}\n"]}
|
|
1
|
+
{"version":3,"file":"shared-installation.js","sourceRoot":"","sources":["../../src/opencode-update/shared-installation.ts"],"names":[],"mappings":"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","sourcesContent":["import { accessSync, constants, existsSync, readFileSync, realpathSync, statSync } from \"node:fs\"\nimport os from \"node:os\"\nimport path from \"node:path\"\nimport { bundledNpm, executeInstaller } from \"./npm-runtime\"\nimport { isRetiredInstallation } from \"./retired-installation\"\nimport { registerUserPath } from \"./user-path\"\nimport { probeBinaryVersionAsync, buildSpawnSpec } from \"../workspaces/spawn\"\nimport { assertSupportedOpenCode } from \"../opencode/runtime-support\"\nimport { compareVersionStrings } from \"../releases/release-monitor\"\nimport { assertExecutableWritable, withInstallationLock } from \"./installation-lock\"\n\nexport interface InstallationHost {\n home?: string\n platform?: NodeJS.Platform\n env?: NodeJS.ProcessEnv\n}\n\nexport function userNpmPrefix(host: InstallationHost = {}): string {\n const home = host.home ?? os.homedir()\n const env = host.env ?? process.env\n const configured = Object.entries(env).find(([key]) => key.toLowerCase() === \"npm_config_prefix\")?.[1]\n if (configured && path.isAbsolute(configured)) return configured\n return (host.platform ?? process.platform) === \"win32\"\n ? path.join(env.APPDATA || path.join(home, \"AppData\", \"Roaming\"), \"npm\") : path.join(home, \".local\")\n}\n\nexport function npmCommandDirectory(prefix: string, platform = process.platform): string {\n return platform === \"win32\" ? prefix : path.join(prefix, \"bin\")\n}\n\nexport function npmExecutable(prefix: string, platform = process.platform): string {\n return path.join(prefix, ...(platform === \"win32\" ? [] : [\"lib\"]), \"node_modules\", \"@opencode\", \"cli\", \"bin\", \"opencode.exe\")\n}\n\nfunction npmPackage(prefix: string, platform: NodeJS.Platform) {\n try {\n const file = path.join(path.dirname(npmExecutable(prefix, platform)), \"..\", \"package.json\")\n const manifest = JSON.parse(readFileSync(file, \"utf8\")) as { name?: string; bin?: Record<string, string> }\n return manifest.name === \"@opencode/cli\" ? manifest : undefined\n } catch { return undefined }\n}\n\nfunction npmLauncher(command: string, prefix: string, platform: NodeJS.Platform): string | undefined {\n const manifest = npmPackage(prefix, platform)\n if (!manifest?.bin) return undefined\n const name = path.basename(command).replace(platform === \"win32\" ? /\\.cmd$/i : /$^/, \"\")\n const relative = manifest.bin[name]\n if (typeof relative !== \"string\" || !/^\\.\\/bin\\/[^/\\\\]+\\.exe$/.test(relative)) return undefined\n const packageRoot = path.join(path.dirname(npmExecutable(prefix, platform)), \"..\")\n const binary = path.resolve(packageRoot, relative)\n try {\n if (!statSync(binary).isFile()) return undefined\n const resolved = platform === \"win32\" ? buildSpawnSpec(command, [], { platform }).command : realpathSync(command)\n return realpathSync(resolved) === realpathSync(binary) ? binary : undefined\n } catch { return undefined }\n}\n\nfunction retiredNpmAlias(command: string, prefix: string, platform: NodeJS.Platform): boolean {\n const name = platform === \"win32\" ? path.basename(command).replace(/\\.cmd$/i, \"\") : path.basename(command)\n const relative = npmPackage(prefix, platform)?.bin?.[name]\n if (typeof relative !== \"string\" || !/^\\.\\/bin\\/[^/\\\\]+\\.cjs$/.test(relative)) return false\n try {\n const target = path.resolve(path.dirname(npmExecutable(prefix, platform)), \"..\", relative)\n if (platform === \"win32\") {\n const script = readFileSync(command, \"utf8\")\n if (script.length > 64 * 1024) return false\n const escaped = path.basename(target).replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n return statSync(target).isFile() && new RegExp(`[\"'](?:%dp0%|%~dp0)[\\\\\\\\/]node_modules[\\\\\\\\/]@opencode[\\\\\\\\/]cli[\\\\\\\\/]bin[\\\\\\\\/]${escaped}[\"']\\\\s+%\\\\*`, \"i\").test(script)\n }\n return realpathSync(command) === realpathSync(target)\n } catch { return false }\n}\n\nfunction npmCommand(prefix: string, platform: NodeJS.Platform): { command: string; binary: string } | undefined {\n const directory = npmCommandDirectory(prefix, platform)\n for (const name of [\"opencode2\", \"opencode\"]) {\n const command = path.join(directory, platform === \"win32\" ? `${name}.cmd` : name)\n const binary = npmLauncher(command, prefix, platform)\n if (binary) return { command, binary }\n }\n}\n\nexport function findPathOpenCode(host: InstallationHost = {}): string | undefined {\n const env = host.env ?? process.env\n const platform = host.platform ?? process.platform\n const key = Object.keys(env).find(key => key.toLowerCase() === \"path\")\n const extensions = platform === \"win32\" ? (env.PATHEXT || \".COM;.EXE;.BAT;.CMD\").toLowerCase().split(\";\") : [\"\"]\n for (const entry of (env[key ?? \"PATH\"] || \"\").split(platform === \"win32\" ? \";\" : \":\")) {\n const directory = entry.replace(/^\"|\"$/g, \"\")\n if (!directory || !path.isAbsolute(directory)) continue\n const prefix = platform === \"win32\" ? directory : path.dirname(directory)\n const inNpmBin = path.resolve(directory) === path.resolve(npmCommandDirectory(prefix, platform))\n for (const name of [\"opencode2\", \"opencode\"]) for (const extension of extensions) {\n const candidate = path.join(directory, `${name}${extension}`)\n try {\n if (!statSync(candidate).isFile()) continue\n if (isRetiredInstallation(candidate)) continue\n accessSync(candidate, platform === \"win32\" ? constants.F_OK : constants.X_OK)\n if (inNpmBin && npmPackage(prefix, platform)) {\n if (retiredNpmAlias(candidate, prefix, platform)) continue\n }\n return candidate\n } catch { /* Continue in PATH order. */ }\n }\n }\n}\n\nexport function resolveDefaultInstallation(host: InstallationHost = {}): { path: string; source?: \"path\" | \"user\" } {\n const command = findPathOpenCode(host)\n if (command) return { path: command, source: \"path\" }\n const prefix = userNpmPrefix(host)\n const binary = npmCommand(prefix, host.platform ?? process.platform)?.binary ?? npmExecutable(prefix, host.platform)\n if (existsSync(binary) && !isRetiredInstallation(binary)) return { path: binary, source: \"user\" }\n return { path: \"opencode2\" }\n}\n\n/** Only a verified npm installation may be updated via npm. Homebrew/curl and\n * explicit custom executable choices retain their own installation authority. */\nexport function sharedInstallPrefix(host: InstallationHost = {}): string | undefined {\n const platform = host.platform ?? process.platform\n const userPrefix = userNpmPrefix(host)\n if (isRetiredInstallation(userPrefix)) return undefined\n const command = findPathOpenCode(host) ?? findPathOpenCode({ ...host,\n env: { PATH: npmCommandDirectory(userPrefix, platform), PATHEXT: \".EXE;.CMD;.BAT\" } })\n if (!command) return userPrefix\n const prefix = platform === \"win32\" ? path.dirname(command) : path.dirname(path.dirname(command))\n try {\n if (!npmLauncher(command, prefix, platform)) return undefined\n accessSync(prefix, constants.W_OK)\n return prefix\n } catch { return undefined }\n}\n\nexport async function installSharedOpenCode(version: string, options: InstallationHost & {\n node?: string; npm?: string\n execute?: typeof executeInstaller\n probe?: typeof probeBinaryVersionAsync\n registerPath?: (directory: string) => Promise<void>\n} = {}): Promise<string> {\n if (!/^\\d+\\.\\d+\\.\\d+$/.test(version)) throw new Error(\"Installation requires an exact stable OpenCode version\")\n assertSupportedOpenCode(version)\n const platform = options.platform ?? process.platform\n const prefix = sharedInstallPrefix(options)\n if (!prefix) throw new Error(\"The PATH executable is not a writable npm installation\")\n const node = options.node ?? process.execPath\n const npm = options.npm ?? bundledNpm(node)\n if (!npm) throw new Error(\"npm is unavailable beside the CodeNomad Node runtime\")\n const binary = npmExecutable(prefix, platform)\n const probe = options.probe ?? probeBinaryVersionAsync\n return withInstallationLock(prefix, async () => {\n const oldBinary = npmCommand(prefix, platform)?.binary ?? binary\n const existing = await probe(oldBinary)\n if (existing.valid && (!existing.version || !/^(?:\\d+\\.\\d+\\.\\d+|0\\.0\\.0-beta-\\d+)$/.test(existing.version))) {\n throw new Error(\"Cannot replace an unverified OpenCode version automatically\")\n }\n const target = existing.valid && existing.version && /^\\d+\\.\\d+\\.\\d+$/.test(existing.version) && compareVersionStrings(existing.version, version) > 0 ? existing.version : version\n const directory = npmCommandDirectory(prefix, platform)\n const commandHost = { ...options, env: { PATH: directory, PATHEXT: \".EXE;.CMD;.BAT\" } }\n if (!existing.valid || existing.version !== target || !npmCommand(prefix, platform) || oldBinary !== binary) {\n await assertExecutableWritable(oldBinary, platform)\n const env = { ...(options.env ?? process.env) }\n const key = Object.keys(env).find(key => key.toLowerCase() === \"path\") ?? \"PATH\"\n env[key] = `${path.dirname(node)}${platform === \"win32\" ? \";\" : \":\"}${env[key] || \"\"}`\n await (options.execute ?? executeInstaller)(node, [npm, \"install\", \"--global\", \"--prefix\", prefix,\n \"--no-audit\", \"--no-fund\", \"--registry=https://registry.npmjs.org\", `@opencode/cli@${target}`], env)\n }\n const result = await probe(binary)\n if (!result.valid || !result.version || !/^\\d+\\.\\d+\\.\\d+$/.test(result.version) || compareVersionStrings(result.version, target) < 0) {\n throw new Error(\"Installed OpenCode version verification failed\")\n }\n if (!findPathOpenCode(commandHost) || sharedInstallPrefix(commandHost) !== prefix) {\n throw new Error(\"npm did not publish the verified OpenCode terminal command\")\n }\n await (options.registerPath ?? (directory => registerUserPath(directory, options)))(directory)\n return binary\n })\n}\n"]}
|
|
@@ -23,7 +23,7 @@ async function npmFixture(prefix, version) {
|
|
|
23
23
|
throw error; });
|
|
24
24
|
return command;
|
|
25
25
|
}
|
|
26
|
-
test("
|
|
26
|
+
test("private copies and their receipts are ignored; PATH wins over the user npm installation", async () => {
|
|
27
27
|
const home = await mkdtemp(path.join(os.tmpdir(), "shared-opencode-"));
|
|
28
28
|
const env = { PATH: "", APPDATA: path.join(home, "AppData") };
|
|
29
29
|
const host = { home, env };
|
|
@@ -34,7 +34,9 @@ test("PATH wins over newer private copies; existing user npm and private install
|
|
|
34
34
|
await writeFile(legacy, "legacy");
|
|
35
35
|
await mkdir(path.join(root, "selected"));
|
|
36
36
|
await writeFile(path.join(root, "selected/2.0.99"), "");
|
|
37
|
-
|
|
37
|
+
await writeFile(path.join(root, "current"), "2.0.99");
|
|
38
|
+
assert.deepEqual(resolveDefaultInstallation(host), { path: "opencode2" });
|
|
39
|
+
assert.equal(sharedInstallPrefix(host), userNpmPrefix(host));
|
|
38
40
|
const prefix = userNpmPrefix(host);
|
|
39
41
|
await npmFixture(prefix, "2.0.11");
|
|
40
42
|
assert.deepEqual(resolveDefaultInstallation(host), { path: npmExecutable(prefix), source: "user" });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-installation.test.js","sourceRoot":"","sources":["../../src/opencode-update/shared-installation.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert/strict\"\nimport test from \"node:test\"\nimport { mkdtemp, mkdir, writeFile, readFile, rm, symlink } from \"node:fs/promises\"\nimport os from \"node:os\"\nimport path from \"node:path\"\nimport { findPathOpenCode, installSharedOpenCode, npmCommandDirectory, npmExecutable, resolveDefaultInstallation, sharedInstallPrefix, userNpmPrefix } from \"./shared-installation\"\nimport { registerUserPath } from \"./user-path\"\nimport { withInstallationLock } from \"./installation-lock\"\nimport { execFile } from \"node:child_process\"\nimport { promisify } from \"node:util\"\n\nasync function npmFixture(prefix: string, version: string) {\n const binary = npmExecutable(prefix)\n await mkdir(path.dirname(binary), { recursive: true })\n await writeFile(binary, version, { mode: 0o755 })\n await writeFile(path.join(path.dirname(binary), \"..\", \"package.json\"), JSON.stringify({ name: \"@opencode/cli\", bin: { opencode2: \"./bin/opencode.exe\" } }))\n const bin = npmCommandDirectory(prefix)\n await mkdir(bin, { recursive: true })\n const command = path.join(bin, process.platform === \"win32\" ? \"opencode2.cmd\" : \"opencode2\")\n if (process.platform === \"win32\") await writeFile(command, '@echo off\\r\\n\"%~dp0\\\\node_modules\\\\@opencode\\\\cli\\\\bin\\\\opencode.exe\" %*\\r\\n')\n else await symlink(binary, command).catch(error => { if (error.code !== \"EEXIST\") throw error })\n return command\n}\n\ntest(\"PATH wins over newer private copies; existing user npm and private installations remain migration fallbacks\", async () => {\n const home = await mkdtemp(path.join(os.tmpdir(), \"shared-opencode-\"))\n const env = { PATH: \"\", APPDATA: path.join(home, \"AppData\") }\n const host = { home, env }\n try {\n const root = path.join(home, \".local/share/codenomad/opencode\")\n const legacy = path.join(root, \"2.0.99/node_modules/@opencode/cli/bin/opencode.exe\")\n await mkdir(path.dirname(legacy), { recursive: true }); await writeFile(legacy, \"legacy\")\n await mkdir(path.join(root, \"selected\")); await writeFile(path.join(root, \"selected/2.0.99\"), \"\")\n assert.deepEqual(resolveDefaultInstallation(host), { path: legacy, source: \"legacy\" })\n const prefix = userNpmPrefix(host)\n await npmFixture(prefix, \"2.0.11\")\n assert.deepEqual(resolveDefaultInstallation(host), { path: npmExecutable(prefix), source: \"user\" })\n const existing = path.join(home, \"existing npm\")\n const command = await npmFixture(existing, \"2.0.12\")\n env.PATH = npmCommandDirectory(existing)\n assert.deepEqual(resolveDefaultInstallation(host), { path: command, source: \"path\" })\n assert.equal(sharedInstallPrefix(host), existing)\n assert.equal(await readFile(legacy, \"utf8\"), \"legacy\", \"discovery never removes private installations\")\n } finally { await rm(home, { recursive: true, force: true }) }\n})\n\ntest(\"normal global-user npm install publishes terminal command and retries PATH registration without reinstalling\", async () => {\n const home = await mkdtemp(path.join(os.tmpdir(), \"shared-opencode-install-\"))\n const env = { PATH: \"\", APPDATA: path.join(home, \"AppData\"), SHELL: \"/bin/bash\" }\n let installs = 0, registrations = 0\n const prefix = userNpmPrefix({ home, env })\n const options = { home, env, node: process.execPath, npm: \"fixture-npm.js\",\n execute: async (_file: string, args: string[]) => {\n installs++\n assert.ok(args.includes(\"--global\"))\n assert.equal(args[args.indexOf(\"--prefix\") + 1], prefix)\n await npmFixture(prefix, args.at(-1)!.split(\"@\").at(-1)!)\n },\n probe: async (binary: string) => {\n try { return { valid: true, version: await readFile(binary, \"utf8\") } } catch { return { valid: false, missing: true } }\n },\n registerPath: async (directory: string) => {\n if (++registrations === 1) throw new Error(\"PATH write failed\")\n await registerUserPath(directory, { home, env, registerWindowsPath: async () => {} })\n },\n }\n try {\n await assert.rejects(installSharedOpenCode(\"2.0.11\", options), /PATH write failed/)\n assert.equal((await options.probe(npmExecutable(prefix))).version, \"2.0.11\", \"installation survives PATH failure\")\n assert.equal((resolveDefaultInstallation(options)).source, \"user\", \"repair remains discoverable\")\n assert.equal(await installSharedOpenCode(\"2.0.11\", options), npmExecutable(prefix))\n assert.equal(installs, 1)\n assert.equal(resolveDefaultInstallation(options).path, findPathOpenCode(options))\n assert.equal(resolveDefaultInstallation(options).source, \"path\")\n await installSharedOpenCode(\"2.0.12\", options)\n assert.equal(installs, 2)\n await installSharedOpenCode(\"2.0.11\", options)\n assert.equal(installs, 2, \"never downgrade a newer common installation\")\n assert.equal((await options.probe(npmExecutable(prefix))).version, \"2.0.12\")\n await rm(findPathOpenCode(options)!)\n await installSharedOpenCode(\"2.0.11\", options)\n assert.equal(installs, 3, \"missing command is repaired at the newer installed version\")\n assert.equal((await options.probe(npmExecutable(prefix))).version, \"2.0.12\")\n } finally { await rm(home, { recursive: true, force: true }) }\n})\n\ntest(\"independent backends cannot replace a shared installation concurrently; failures release the lock\", async () => {\n const home = await mkdtemp(path.join(os.tmpdir(), \"shared-opencode-lock-\"))\n try {\n await withInstallationLock(home, async () => {\n const module = new URL(\"./installation-lock.ts\", import.meta.url).href\n const script = `import { withInstallationLock } from ${JSON.stringify(module)};\n try { await withInstallationLock(${JSON.stringify(home)}, async () => { throw new Error('entered'); }); process.exit(2); }\n catch (error) { if (error.code !== 'installation_busy') throw error; }`\n await promisify(execFile)(process.execPath, [\"--import\", \"tsx\", \"--input-type=module\", \"-e\", script])\n })\n await assert.rejects(withInstallationLock(home, async () => { throw new Error(\"fixture failure\") }), /fixture failure/)\n assert.equal(await withInstallationLock(home, async () => \"released\"), \"released\")\n } finally { await rm(home, { recursive: true, force: true }) }\n})\n\ntest(\"standalone opencode commands and custom npm prefixes are discovered without mutation\", async () => {\n const home = await mkdtemp(path.join(os.tmpdir(), \"shared-opencode-prefix-\"))\n try {\n const prefix = path.join(home, \"custom npm\")\n const host = { home, env: { PATH: \"\", NPM_CONFIG_PREFIX: prefix } }\n assert.equal(userNpmPrefix(host), prefix)\n await npmFixture(prefix, \"2.0.12\")\n assert.equal(resolveDefaultInstallation(host).path, npmExecutable(prefix))\n const command = path.join(home, process.platform === \"win32\" ? \"opencode.exe\" : \"opencode\")\n await writeFile(command, \"standalone\", { mode: 0o755 })\n host.env.PATH = home\n assert.equal(resolveDefaultInstallation(host).path, command)\n assert.equal(sharedInstallPrefix(host), undefined)\n } finally { await rm(home, { recursive: true, force: true }) }\n})\n\ntest(\"historical npm launchers select the real executable and allow stable migration\", async () => {\n const home = await mkdtemp(path.join(os.tmpdir(), \"shared-opencode-history-\"))\n try {\n for (const [version, name, oldBinary] of [[\"0.0.0-beta-19275\", \"opencode2\", \"opencode2.exe\"], [\"2.0.0\", \"opencode\", \"opencode.exe\"]]) {\n const prefix = path.join(home, version)\n const binary = path.join(path.dirname(npmExecutable(prefix)), oldBinary)\n await mkdir(path.dirname(binary), { recursive: true })\n await writeFile(binary, version, { mode: 0o755 })\n await writeFile(path.join(path.dirname(binary), \"..\", \"package.json\"), JSON.stringify({ name: \"@opencode/cli\", bin: {\n opencode2: name === \"opencode2\" ? `./bin/${oldBinary}` : \"./bin/opencode2.cjs\", opencode: \"./bin/opencode.exe\",\n } }))\n const directory = npmCommandDirectory(prefix)\n await mkdir(directory, { recursive: true })\n const command = path.join(directory, process.platform === \"win32\" ? `${name}.cmd` : name)\n if (process.platform === \"win32\") {\n await writeFile(command, `@echo off\\r\\n\"%~dp0\\\\node_modules\\\\@opencode\\\\cli\\\\bin\\\\${oldBinary}\" %*\\r\\n`)\n if (name === \"opencode\") {\n await writeFile(path.join(path.dirname(binary), \"opencode2.cjs\"), \"retired\")\n await writeFile(path.join(directory, \"opencode2.cmd\"), '@echo off\\r\\nnode \"%~dp0\\\\node_modules\\\\@opencode\\\\cli\\\\bin\\\\opencode2.cjs\" %*\\r\\n')\n }\n } else {\n await symlink(binary, command)\n if (name === \"opencode\") {\n const retired = path.join(path.dirname(binary), \"opencode2.cjs\")\n await writeFile(retired, \"retired\", { mode: 0o755 })\n await symlink(retired, path.join(directory, \"opencode2\"))\n }\n }\n const host = { home, env: { PATH: directory, APPDATA: home } }\n assert.equal(resolveDefaultInstallation(host).path, command)\n assert.equal(sharedInstallPrefix(host), prefix)\n }\n } finally { await rm(home, { recursive: true, force: true }) }\n})\n\ntest(\"PATH executable precedence wins over npm shims in the same prefix\", async () => {\n const home = await mkdtemp(path.join(os.tmpdir(), \"shared-opencode-precedence-\"))\n try {\n const prefix = path.join(home, \"npm\")\n const directory = npmCommandDirectory(prefix)\n await npmFixture(prefix, \"2.0.3\")\n const standalone = path.join(directory, process.platform === \"win32\" ? \"opencode2.exe\" : \"opencode2\")\n if (process.platform === \"win32\") await writeFile(standalone, \"standalone\")\n else {\n await rm(standalone, { force: true })\n await writeFile(standalone, \"standalone\", { mode: 0o755 })\n await symlink(npmExecutable(prefix), path.join(directory, \"opencode\"))\n }\n const host = { home, env: { PATH: directory } }\n assert.equal(resolveDefaultInstallation(host).path, standalone)\n assert.equal(sharedInstallPrefix(host), undefined)\n if (process.platform !== \"win32\") {\n const sibling = path.join(prefix, \"sibling\")\n await mkdir(sibling)\n const unrelated = path.join(sibling, \"opencode2\")\n await writeFile(unrelated, \"standalone\", { mode: 0o755 })\n assert.equal(resolveDefaultInstallation({ home, env: { PATH: sibling } }).path, unrelated)\n assert.equal(sharedInstallPrefix({ home, env: { PATH: sibling } }), undefined)\n }\n } finally { await rm(home, { recursive: true, force: true }) }\n})\n\ntest(\"custom Windows command wrapper in an npm prefix wins over the package alias\", async () => {\n if (process.platform !== \"win32\") return\n const home = await mkdtemp(path.join(os.tmpdir(), \"shared-opencode-wrapper-\"))\n try {\n const prefix = path.join(home, \"npm\")\n await npmFixture(prefix, \"2.0.3\")\n await writeFile(path.join(path.dirname(npmExecutable(prefix)), \"..\", \"package.json\"), JSON.stringify({\n name: \"@opencode/cli\", bin: { opencode2: \"./bin/opencode.exe\", opencode: \"./bin/opencode.exe\" },\n }))\n await writeFile(path.join(prefix, \"opencode.cmd\"), '@echo off\\r\\n\"%~dp0\\\\node_modules\\\\@opencode\\\\cli\\\\bin\\\\opencode.exe\" %*\\r\\n')\n const standalone = path.join(home, \"standalone.exe\")\n await writeFile(standalone, \"standalone\")\n const command = path.join(prefix, \"opencode2.cmd\")\n await writeFile(command, `@echo off\\r\\n\"${standalone}\" %*\\r\\n`)\n const host = { home, env: { PATH: prefix } }\n assert.equal(resolveDefaultInstallation(host).path, command)\n assert.equal(sharedInstallPrefix(host), undefined)\n } finally { await rm(home, { recursive: true, force: true }) }\n})\n\ntest(\"non-npm PATH executables are reused without allowing npm to shadow them\", async () => {\n const home = await mkdtemp(path.join(os.tmpdir(), \"shared-opencode-custom-\"))\n try {\n const binary = path.join(home, process.platform === \"win32\" ? \"opencode2.exe\" : \"opencode2\")\n await writeFile(binary, \"custom\", { mode: 0o755 })\n const options = { home, env: { PATH: home }, npm: \"fixture-npm.js\" }\n assert.equal(resolveDefaultInstallation(options).path, binary)\n assert.equal(sharedInstallPrefix(options), undefined)\n await assert.rejects(installSharedOpenCode(\"2.0.11\", options), /not a writable npm installation/)\n } finally { await rm(home, { recursive: true, force: true }) }\n})\n\ntest(\"shell PATH registration preserves profiles and is idempotent for bash, zsh, fish and Windows\", async () => {\n const home = await mkdtemp(path.join(os.tmpdir(), \"opencode-shells-\"))\n try {\n for (const shell of [\"bash\", \"zsh\", \"fish\"]) {\n const user = path.join(home, shell)\n const bin = `/users/example/${shell}/bin with spaces`\n await mkdir(user)\n const env = { PATH: \"/existing\", SHELL: `/bin/${shell}` }\n await writeFile(path.join(user, \".profile\"), \"# user settings\\n\")\n const options = { home: user, env, platform: \"linux\" as const }\n await registerUserPath(bin, options)\n const file = shell === \"bash\" ? \".bashrc\" : shell === \"zsh\" ? \".zshrc\" : \".config/fish/conf.d/opencode-path.fish\"\n const first = await readFile(path.join(user, file), \"utf8\")\n await registerUserPath(bin, options)\n assert.equal(await readFile(path.join(user, file), \"utf8\"), first)\n assert.ok((await readFile(path.join(user, \".profile\"), \"utf8\")).startsWith(\"# user settings\\n\"))\n assert.equal(env.PATH, `/existing:${bin}`)\n }\n const env = { Path: \"C:\\\\existing\" }\n let registered = \"\"\n await registerUserPath(\"C:\\\\user\\\\npm\", { home, platform: \"win32\", env, registerWindowsPath: async bin => { registered = bin } })\n assert.equal(registered, \"C:\\\\user\\\\npm\")\n assert.equal(env.Path, \"C:\\\\existing;C:\\\\user\\\\npm\")\n } finally { await rm(home, { recursive: true, force: true }) }\n})\n"]}
|
|
1
|
+
{"version":3,"file":"shared-installation.test.js","sourceRoot":"","sources":["../../src/opencode-update/shared-installation.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert/strict\"\nimport test from \"node:test\"\nimport { mkdtemp, mkdir, writeFile, readFile, rm, symlink } from \"node:fs/promises\"\nimport os from \"node:os\"\nimport path from \"node:path\"\nimport { findPathOpenCode, installSharedOpenCode, npmCommandDirectory, npmExecutable, resolveDefaultInstallation, sharedInstallPrefix, userNpmPrefix } from \"./shared-installation\"\nimport { registerUserPath } from \"./user-path\"\nimport { withInstallationLock } from \"./installation-lock\"\nimport { execFile } from \"node:child_process\"\nimport { promisify } from \"node:util\"\n\nasync function npmFixture(prefix: string, version: string) {\n const binary = npmExecutable(prefix)\n await mkdir(path.dirname(binary), { recursive: true })\n await writeFile(binary, version, { mode: 0o755 })\n await writeFile(path.join(path.dirname(binary), \"..\", \"package.json\"), JSON.stringify({ name: \"@opencode/cli\", bin: { opencode2: \"./bin/opencode.exe\" } }))\n const bin = npmCommandDirectory(prefix)\n await mkdir(bin, { recursive: true })\n const command = path.join(bin, process.platform === \"win32\" ? \"opencode2.cmd\" : \"opencode2\")\n if (process.platform === \"win32\") await writeFile(command, '@echo off\\r\\n\"%~dp0\\\\node_modules\\\\@opencode\\\\cli\\\\bin\\\\opencode.exe\" %*\\r\\n')\n else await symlink(binary, command).catch(error => { if (error.code !== \"EEXIST\") throw error })\n return command\n}\n\ntest(\"private copies and their receipts are ignored; PATH wins over the user npm installation\", async () => {\n const home = await mkdtemp(path.join(os.tmpdir(), \"shared-opencode-\"))\n const env = { PATH: \"\", APPDATA: path.join(home, \"AppData\") }\n const host = { home, env }\n try {\n const root = path.join(home, \".local/share/codenomad/opencode\")\n const legacy = path.join(root, \"2.0.99/node_modules/@opencode/cli/bin/opencode.exe\")\n await mkdir(path.dirname(legacy), { recursive: true }); await writeFile(legacy, \"legacy\")\n await mkdir(path.join(root, \"selected\")); await writeFile(path.join(root, \"selected/2.0.99\"), \"\")\n await writeFile(path.join(root, \"current\"), \"2.0.99\")\n assert.deepEqual(resolveDefaultInstallation(host), { path: \"opencode2\" })\n assert.equal(sharedInstallPrefix(host), userNpmPrefix(host))\n const prefix = userNpmPrefix(host)\n await npmFixture(prefix, \"2.0.11\")\n assert.deepEqual(resolveDefaultInstallation(host), { path: npmExecutable(prefix), source: \"user\" })\n const existing = path.join(home, \"existing npm\")\n const command = await npmFixture(existing, \"2.0.12\")\n env.PATH = npmCommandDirectory(existing)\n assert.deepEqual(resolveDefaultInstallation(host), { path: command, source: \"path\" })\n assert.equal(sharedInstallPrefix(host), existing)\n assert.equal(await readFile(legacy, \"utf8\"), \"legacy\", \"discovery never removes private installations\")\n } finally { await rm(home, { recursive: true, force: true }) }\n})\n\ntest(\"normal global-user npm install publishes terminal command and retries PATH registration without reinstalling\", async () => {\n const home = await mkdtemp(path.join(os.tmpdir(), \"shared-opencode-install-\"))\n const env = { PATH: \"\", APPDATA: path.join(home, \"AppData\"), SHELL: \"/bin/bash\" }\n let installs = 0, registrations = 0\n const prefix = userNpmPrefix({ home, env })\n const options = { home, env, node: process.execPath, npm: \"fixture-npm.js\",\n execute: async (_file: string, args: string[]) => {\n installs++\n assert.ok(args.includes(\"--global\"))\n assert.equal(args[args.indexOf(\"--prefix\") + 1], prefix)\n await npmFixture(prefix, args.at(-1)!.split(\"@\").at(-1)!)\n },\n probe: async (binary: string) => {\n try { return { valid: true, version: await readFile(binary, \"utf8\") } } catch { return { valid: false, missing: true } }\n },\n registerPath: async (directory: string) => {\n if (++registrations === 1) throw new Error(\"PATH write failed\")\n await registerUserPath(directory, { home, env, registerWindowsPath: async () => {} })\n },\n }\n try {\n await assert.rejects(installSharedOpenCode(\"2.0.11\", options), /PATH write failed/)\n assert.equal((await options.probe(npmExecutable(prefix))).version, \"2.0.11\", \"installation survives PATH failure\")\n assert.equal((resolveDefaultInstallation(options)).source, \"user\", \"repair remains discoverable\")\n assert.equal(await installSharedOpenCode(\"2.0.11\", options), npmExecutable(prefix))\n assert.equal(installs, 1)\n assert.equal(resolveDefaultInstallation(options).path, findPathOpenCode(options))\n assert.equal(resolveDefaultInstallation(options).source, \"path\")\n await installSharedOpenCode(\"2.0.12\", options)\n assert.equal(installs, 2)\n await installSharedOpenCode(\"2.0.11\", options)\n assert.equal(installs, 2, \"never downgrade a newer common installation\")\n assert.equal((await options.probe(npmExecutable(prefix))).version, \"2.0.12\")\n await rm(findPathOpenCode(options)!)\n await installSharedOpenCode(\"2.0.11\", options)\n assert.equal(installs, 3, \"missing command is repaired at the newer installed version\")\n assert.equal((await options.probe(npmExecutable(prefix))).version, \"2.0.12\")\n } finally { await rm(home, { recursive: true, force: true }) }\n})\n\ntest(\"independent backends cannot replace a shared installation concurrently; failures release the lock\", async () => {\n const home = await mkdtemp(path.join(os.tmpdir(), \"shared-opencode-lock-\"))\n try {\n await withInstallationLock(home, async () => {\n const module = new URL(\"./installation-lock.ts\", import.meta.url).href\n const script = `import { withInstallationLock } from ${JSON.stringify(module)};\n try { await withInstallationLock(${JSON.stringify(home)}, async () => { throw new Error('entered'); }); process.exit(2); }\n catch (error) { if (error.code !== 'installation_busy') throw error; }`\n await promisify(execFile)(process.execPath, [\"--import\", \"tsx\", \"--input-type=module\", \"-e\", script])\n })\n await assert.rejects(withInstallationLock(home, async () => { throw new Error(\"fixture failure\") }), /fixture failure/)\n assert.equal(await withInstallationLock(home, async () => \"released\"), \"released\")\n } finally { await rm(home, { recursive: true, force: true }) }\n})\n\ntest(\"standalone opencode commands and custom npm prefixes are discovered without mutation\", async () => {\n const home = await mkdtemp(path.join(os.tmpdir(), \"shared-opencode-prefix-\"))\n try {\n const prefix = path.join(home, \"custom npm\")\n const host = { home, env: { PATH: \"\", NPM_CONFIG_PREFIX: prefix } }\n assert.equal(userNpmPrefix(host), prefix)\n await npmFixture(prefix, \"2.0.12\")\n assert.equal(resolveDefaultInstallation(host).path, npmExecutable(prefix))\n const command = path.join(home, process.platform === \"win32\" ? \"opencode.exe\" : \"opencode\")\n await writeFile(command, \"standalone\", { mode: 0o755 })\n host.env.PATH = home\n assert.equal(resolveDefaultInstallation(host).path, command)\n assert.equal(sharedInstallPrefix(host), undefined)\n } finally { await rm(home, { recursive: true, force: true }) }\n})\n\ntest(\"historical npm launchers select the real executable and allow stable migration\", async () => {\n const home = await mkdtemp(path.join(os.tmpdir(), \"shared-opencode-history-\"))\n try {\n for (const [version, name, oldBinary] of [[\"0.0.0-beta-19275\", \"opencode2\", \"opencode2.exe\"], [\"2.0.0\", \"opencode\", \"opencode.exe\"]]) {\n const prefix = path.join(home, version)\n const binary = path.join(path.dirname(npmExecutable(prefix)), oldBinary)\n await mkdir(path.dirname(binary), { recursive: true })\n await writeFile(binary, version, { mode: 0o755 })\n await writeFile(path.join(path.dirname(binary), \"..\", \"package.json\"), JSON.stringify({ name: \"@opencode/cli\", bin: {\n opencode2: name === \"opencode2\" ? `./bin/${oldBinary}` : \"./bin/opencode2.cjs\", opencode: \"./bin/opencode.exe\",\n } }))\n const directory = npmCommandDirectory(prefix)\n await mkdir(directory, { recursive: true })\n const command = path.join(directory, process.platform === \"win32\" ? `${name}.cmd` : name)\n if (process.platform === \"win32\") {\n await writeFile(command, `@echo off\\r\\n\"%~dp0\\\\node_modules\\\\@opencode\\\\cli\\\\bin\\\\${oldBinary}\" %*\\r\\n`)\n if (name === \"opencode\") {\n await writeFile(path.join(path.dirname(binary), \"opencode2.cjs\"), \"retired\")\n await writeFile(path.join(directory, \"opencode2.cmd\"), '@echo off\\r\\nnode \"%~dp0\\\\node_modules\\\\@opencode\\\\cli\\\\bin\\\\opencode2.cjs\" %*\\r\\n')\n }\n } else {\n await symlink(binary, command)\n if (name === \"opencode\") {\n const retired = path.join(path.dirname(binary), \"opencode2.cjs\")\n await writeFile(retired, \"retired\", { mode: 0o755 })\n await symlink(retired, path.join(directory, \"opencode2\"))\n }\n }\n const host = { home, env: { PATH: directory, APPDATA: home } }\n assert.equal(resolveDefaultInstallation(host).path, command)\n assert.equal(sharedInstallPrefix(host), prefix)\n }\n } finally { await rm(home, { recursive: true, force: true }) }\n})\n\ntest(\"PATH executable precedence wins over npm shims in the same prefix\", async () => {\n const home = await mkdtemp(path.join(os.tmpdir(), \"shared-opencode-precedence-\"))\n try {\n const prefix = path.join(home, \"npm\")\n const directory = npmCommandDirectory(prefix)\n await npmFixture(prefix, \"2.0.3\")\n const standalone = path.join(directory, process.platform === \"win32\" ? \"opencode2.exe\" : \"opencode2\")\n if (process.platform === \"win32\") await writeFile(standalone, \"standalone\")\n else {\n await rm(standalone, { force: true })\n await writeFile(standalone, \"standalone\", { mode: 0o755 })\n await symlink(npmExecutable(prefix), path.join(directory, \"opencode\"))\n }\n const host = { home, env: { PATH: directory } }\n assert.equal(resolveDefaultInstallation(host).path, standalone)\n assert.equal(sharedInstallPrefix(host), undefined)\n if (process.platform !== \"win32\") {\n const sibling = path.join(prefix, \"sibling\")\n await mkdir(sibling)\n const unrelated = path.join(sibling, \"opencode2\")\n await writeFile(unrelated, \"standalone\", { mode: 0o755 })\n assert.equal(resolveDefaultInstallation({ home, env: { PATH: sibling } }).path, unrelated)\n assert.equal(sharedInstallPrefix({ home, env: { PATH: sibling } }), undefined)\n }\n } finally { await rm(home, { recursive: true, force: true }) }\n})\n\ntest(\"custom Windows command wrapper in an npm prefix wins over the package alias\", async () => {\n if (process.platform !== \"win32\") return\n const home = await mkdtemp(path.join(os.tmpdir(), \"shared-opencode-wrapper-\"))\n try {\n const prefix = path.join(home, \"npm\")\n await npmFixture(prefix, \"2.0.3\")\n await writeFile(path.join(path.dirname(npmExecutable(prefix)), \"..\", \"package.json\"), JSON.stringify({\n name: \"@opencode/cli\", bin: { opencode2: \"./bin/opencode.exe\", opencode: \"./bin/opencode.exe\" },\n }))\n await writeFile(path.join(prefix, \"opencode.cmd\"), '@echo off\\r\\n\"%~dp0\\\\node_modules\\\\@opencode\\\\cli\\\\bin\\\\opencode.exe\" %*\\r\\n')\n const standalone = path.join(home, \"standalone.exe\")\n await writeFile(standalone, \"standalone\")\n const command = path.join(prefix, \"opencode2.cmd\")\n await writeFile(command, `@echo off\\r\\n\"${standalone}\" %*\\r\\n`)\n const host = { home, env: { PATH: prefix } }\n assert.equal(resolveDefaultInstallation(host).path, command)\n assert.equal(sharedInstallPrefix(host), undefined)\n } finally { await rm(home, { recursive: true, force: true }) }\n})\n\ntest(\"non-npm PATH executables are reused without allowing npm to shadow them\", async () => {\n const home = await mkdtemp(path.join(os.tmpdir(), \"shared-opencode-custom-\"))\n try {\n const binary = path.join(home, process.platform === \"win32\" ? \"opencode2.exe\" : \"opencode2\")\n await writeFile(binary, \"custom\", { mode: 0o755 })\n const options = { home, env: { PATH: home }, npm: \"fixture-npm.js\" }\n assert.equal(resolveDefaultInstallation(options).path, binary)\n assert.equal(sharedInstallPrefix(options), undefined)\n await assert.rejects(installSharedOpenCode(\"2.0.11\", options), /not a writable npm installation/)\n } finally { await rm(home, { recursive: true, force: true }) }\n})\n\ntest(\"shell PATH registration preserves profiles and is idempotent for bash, zsh, fish and Windows\", async () => {\n const home = await mkdtemp(path.join(os.tmpdir(), \"opencode-shells-\"))\n try {\n for (const shell of [\"bash\", \"zsh\", \"fish\"]) {\n const user = path.join(home, shell)\n const bin = `/users/example/${shell}/bin with spaces`\n await mkdir(user)\n const env = { PATH: \"/existing\", SHELL: `/bin/${shell}` }\n await writeFile(path.join(user, \".profile\"), \"# user settings\\n\")\n const options = { home: user, env, platform: \"linux\" as const }\n await registerUserPath(bin, options)\n const file = shell === \"bash\" ? \".bashrc\" : shell === \"zsh\" ? \".zshrc\" : \".config/fish/conf.d/opencode-path.fish\"\n const first = await readFile(path.join(user, file), \"utf8\")\n await registerUserPath(bin, options)\n assert.equal(await readFile(path.join(user, file), \"utf8\"), first)\n assert.ok((await readFile(path.join(user, \".profile\"), \"utf8\")).startsWith(\"# user settings\\n\"))\n assert.equal(env.PATH, `/existing:${bin}`)\n }\n const env = { Path: \"C:\\\\existing\" }\n let registered = \"\"\n await registerUserPath(\"C:\\\\user\\\\npm\", { home, platform: \"win32\", env, registerWindowsPath: async bin => { registered = bin } })\n assert.equal(registered, \"C:\\\\user\\\\npm\")\n assert.equal(env.Path, \"C:\\\\existing;C:\\\\user\\\\npm\")\n } finally { await rm(home, { recursive: true, force: true }) }\n})\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { resolveDefaultInstallation } from "../opencode-update/shared-installation";
|
|
2
|
+
import { isRetiredInstallation } from "../opencode-update/retired-installation";
|
|
2
3
|
function prettyLabel(p) {
|
|
3
4
|
const parts = p.split(/[\\/]/);
|
|
4
5
|
const last = parts[parts.length - 1] || p;
|
|
@@ -22,12 +23,12 @@ export class BinaryResolver {
|
|
|
22
23
|
this.resolveInstallation = resolveInstallation;
|
|
23
24
|
}
|
|
24
25
|
list() {
|
|
25
|
-
return readUiBinaries(this.settings);
|
|
26
|
+
return readUiBinaries(this.settings).filter(binary => !isRetiredInstallation(binary.path));
|
|
26
27
|
}
|
|
27
28
|
resolveDefault() {
|
|
28
29
|
const binaries = this.list();
|
|
29
30
|
const configuredDefault = readDefaultBinaryPath(this.settings);
|
|
30
|
-
const selected = !configuredDefault || configuredDefault === "opencode" ? "opencode2" : configuredDefault;
|
|
31
|
+
const selected = !configuredDefault || configuredDefault === "opencode" || isRetiredInstallation(configuredDefault) ? "opencode2" : configuredDefault;
|
|
31
32
|
const installation = selected === "opencode2" ? this.resolveInstallation() : undefined;
|
|
32
33
|
const path = installation?.path ?? selected;
|
|
33
34
|
const entry = binaries.find((b) => b.path === path);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binaries.js","sourceRoot":"","sources":["../../src/settings/binaries.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,wCAAwC,CAAA;
|
|
1
|
+
{"version":3,"file":"binaries.js","sourceRoot":"","sources":["../../src/settings/binaries.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,wCAAwC,CAAA;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAA;AAgB/E,SAAS,WAAW,CAAC,CAAS;IAC5B,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAA;IACzC,OAAO,IAAI,IAAI,CAAC,CAAA;AAClB,CAAC;AAED,SAAS,cAAc,CAAC,QAAyB;IAC/C,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IAC3C,MAAM,IAAI,GAAI,EAAU,EAAE,gBAAgB,CAAA;IAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAA;IACnC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAQ,IAAY,CAAC,IAAI,KAAK,QAAQ,CAAQ,CAAA;AACjH,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAyB;IACtD,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IACpD,MAAM,KAAK,GAAI,MAAc,EAAE,cAAc,CAAA;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;AACxF,CAAC;AAED,MAAM,OAAO,cAAc;IACzB,YAA6B,QAAyB,EAAmB,sBAAsB,0BAA0B;QAA5F,aAAQ,GAAR,QAAQ,CAAiB;QAAmB,wBAAmB,GAAnB,mBAAmB,CAA6B;IAAG,CAAC;IAE7H,IAAI;QACF,OAAO,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;IAC5F,CAAC;IAED,cAAc;QACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAC5B,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC9D,MAAM,QAAQ,GAAG,CAAC,iBAAiB,IAAI,iBAAiB,KAAK,UAAU,IAAI,qBAAqB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAA;QACrJ,MAAM,YAAY,GAAG,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;QACtF,MAAM,IAAI,GAAG,YAAY,EAAE,IAAI,IAAI,QAAQ,CAAA;QAE3C,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;QACnD,OAAO;YACL,IAAI;YACJ,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC;YACxC,OAAO,EAAE,KAAK,EAAE,OAAO;YACvB,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD,CAAA;IACH,CAAC;CACF","sourcesContent":["import type { SettingsService } from \"./service\"\nimport { resolveDefaultInstallation } from \"../opencode-update/shared-installation\"\nimport { isRetiredInstallation } from \"../opencode-update/retired-installation\"\n\nexport interface OpenCodeBinaryEntry {\n path: string\n version?: string\n lastUsed?: number\n label?: string\n}\n\nexport interface ResolvedBinary {\n path: string\n label: string\n version?: string\n source?: \"path\" | \"user\"\n}\n\nfunction prettyLabel(p: string): string {\n const parts = p.split(/[\\\\/]/)\n const last = parts[parts.length - 1] || p\n return last || p\n}\n\nfunction readUiBinaries(settings: SettingsService): OpenCodeBinaryEntry[] {\n const ui = settings.getOwner(\"state\", \"ui\")\n const list = (ui as any)?.opencodeBinaries\n if (!Array.isArray(list)) return []\n return list.filter((item) => item && typeof item === \"object\" && typeof (item as any).path === \"string\") as any\n}\n\nfunction readDefaultBinaryPath(settings: SettingsService): string | undefined {\n const server = settings.getOwner(\"config\", \"server\")\n const value = (server as any)?.opencodeBinary\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : undefined\n}\n\nexport class BinaryResolver {\n constructor(private readonly settings: SettingsService, private readonly resolveInstallation = resolveDefaultInstallation) {}\n\n list(): OpenCodeBinaryEntry[] {\n return readUiBinaries(this.settings).filter(binary => !isRetiredInstallation(binary.path))\n }\n\n resolveDefault(): ResolvedBinary {\n const binaries = this.list()\n const configuredDefault = readDefaultBinaryPath(this.settings)\n const selected = !configuredDefault || configuredDefault === \"opencode\" || isRetiredInstallation(configuredDefault) ? \"opencode2\" : configuredDefault\n const installation = selected === \"opencode2\" ? this.resolveInstallation() : undefined\n const path = installation?.path ?? selected\n\n const entry = binaries.find((b) => b.path === path)\n return {\n path,\n label: entry?.label ?? prettyLabel(path),\n version: entry?.version,\n ...(installation ? { source: installation.source } : {}),\n }\n }\n}\n"]}
|