@neuralnomads/codenomad-dev 0.20.0-dev-20260927-a77e37ef → 0.20.0-dev-20260930-47f9e43e
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/opencode/runtime-support.js +1 -1
- package/dist/opencode/runtime-support.js.map +1 -1
- package/dist/opencode/runtime-support.test.js +2 -2
- package/dist/opencode/runtime-support.test.js.map +1 -1
- package/dist/opencode-update/service.test.js +7 -7
- package/dist/opencode-update/service.test.js.map +1 -1
- package/package.json +3 -3
- package/public/assets/{App-Bt-tnQXl.js → App-CH6cfB0g.js} +8 -8
- package/public/assets/{App-Bt-tnQXl.js.map → App-CH6cfB0g.js.map} +1 -1
- package/public/assets/{FilesTab-fonqwqxm.js → FilesTab-D8siBvjz.js} +2 -2
- package/public/assets/{FilesTab-fonqwqxm.js.map → FilesTab-D8siBvjz.js.map} +1 -1
- package/public/assets/{GitChangesTab-DsU2QupN.js → GitChangesTab-vQDkJfb1.js} +2 -2
- package/public/assets/{GitChangesTab-DsU2QupN.js.map → GitChangesTab-vQDkJfb1.js.map} +1 -1
- package/public/assets/{SplitFilePanel-DVyHD97U.js → SplitFilePanel-45-ssHhd.js} +2 -2
- package/public/assets/{SplitFilePanel-DVyHD97U.js.map → SplitFilePanel-45-ssHhd.js.map} +1 -1
- package/public/assets/{StatusTab-BYOUdsmS.js → StatusTab-CUlz3uGG.js} +2 -2
- package/public/assets/{StatusTab-BYOUdsmS.js.map → StatusTab-CUlz3uGG.js.map} +1 -1
- package/public/assets/{align-justify-DmcKEWsB.js → align-justify-DjlaBdyk.js} +2 -2
- package/public/assets/{align-justify-DmcKEWsB.js.map → align-justify-DjlaBdyk.js.map} +1 -1
- package/public/assets/{bundle-full-CV_LTEPl.js → bundle-full-DpHg2UyZ.js} +2 -2
- package/public/assets/{bundle-full-CV_LTEPl.js.map → bundle-full-DpHg2UyZ.js.map} +1 -1
- package/public/assets/{client-state-9tEzHtfW.js → client-state-C2XNu_km.js} +2 -2
- package/public/assets/{client-state-9tEzHtfW.js.map → client-state-C2XNu_km.js.map} +1 -1
- package/public/assets/{diff-viewer-CXCXiyRO.js → diff-viewer-CiYhl2x9.js} +2 -2
- package/public/assets/{diff-viewer-CXCXiyRO.js.map → diff-viewer-CiYhl2x9.js.map} +1 -1
- package/public/assets/{index-CuhtAbYJ.js → index-6oDOgk2Z.js} +3 -3
- package/public/assets/index-6oDOgk2Z.js.map +1 -0
- package/public/assets/{index-Ropj5M3p.js → index-B4_MU-br.js} +2 -2
- package/public/assets/index-B4_MU-br.js.map +1 -0
- package/public/assets/{index-DqE-g5em.js → index-BaZoOnmA.js} +2 -2
- package/public/assets/{index-DqE-g5em.js.map → index-BaZoOnmA.js.map} +1 -1
- package/public/assets/{index-B-_YmFJc.js → index-C9fWE_Zp.js} +2 -2
- package/public/assets/index-C9fWE_Zp.js.map +1 -0
- package/public/assets/{index-XQu8RsTR.js → index-CLLdccpq.js} +2 -2
- package/public/assets/index-CLLdccpq.js.map +1 -0
- package/public/assets/{index-97B_EqpY.js → index-CRYXivNH.js} +2 -2
- package/public/assets/index-CRYXivNH.js.map +1 -0
- package/public/assets/{index-CDY1e4Uc.js → index-CVF0ij-F.js} +2 -2
- package/public/assets/{index-CDY1e4Uc.js.map → index-CVF0ij-F.js.map} +1 -1
- package/public/assets/{index-DY9ZO9ld.js → index-CaF2oDiU.js} +2 -2
- package/public/assets/{index-DY9ZO9ld.js.map → index-CaF2oDiU.js.map} +1 -1
- package/public/assets/index-DT_2SeHL.css +1 -0
- package/public/assets/{index-CvKnyKel.js → index-Do13J2Ow.js} +2 -2
- package/public/assets/index-Do13J2Ow.js.map +1 -0
- package/public/assets/{index-DX4zzTPL.js → index-DuOitl8E.js} +2 -2
- package/public/assets/{index-DX4zzTPL.js.map → index-DuOitl8E.js.map} +1 -1
- package/public/assets/{index-C5ZxyV3U.js → index-bDfFMW09.js} +2 -2
- package/public/assets/index-bDfFMW09.js.map +1 -0
- package/public/assets/{index-QXZuSZ1s.js → index-v8DVuyeN.js} +2 -2
- package/public/assets/index-v8DVuyeN.js.map +1 -0
- package/public/assets/{loading-DMhZHPMZ.js → loading-Cf2WxCXs.js} +2 -2
- package/public/assets/{loading-DMhZHPMZ.js.map → loading-Cf2WxCXs.js.map} +1 -1
- package/public/assets/main-C6k-tEZT.js +43 -0
- package/public/assets/main-C6k-tEZT.js.map +1 -0
- package/public/assets/{markdown-ChsQ8753.js → markdown-UiScYuQW.js} +4 -4
- package/public/assets/{markdown-ChsQ8753.js.map → markdown-UiScYuQW.js.map} +1 -1
- package/public/assets/{startup-state-settings-card-DlwE2O3S.js → startup-state-settings-card-DVUiMY1X.js} +2 -2
- package/public/assets/{startup-state-settings-card-DlwE2O3S.js.map → startup-state-settings-card-DVUiMY1X.js.map} +1 -1
- package/public/assets/{terminal-square-Br2FaCdg.js → terminal-square-DiZ6HdRj.js} +2 -2
- package/public/assets/{terminal-square-Br2FaCdg.js.map → terminal-square-DiZ6HdRj.js.map} +1 -1
- package/public/assets/{tool-call-DNxCNLt7.js → tool-call-C3mOLsxT.js} +4 -4
- package/public/assets/{tool-call-DNxCNLt7.js.map → tool-call-C3mOLsxT.js.map} +1 -1
- package/public/assets/{unified-picker-CPPucpt3.js → unified-picker-CQHMwv72.js} +2 -2
- package/public/assets/{unified-picker-CPPucpt3.js.map → unified-picker-CQHMwv72.js.map} +1 -1
- package/public/assets/{wrap-text-BJW9yImb.js → wrap-text-DZtPfwI6.js} +2 -2
- package/public/assets/{wrap-text-BJW9yImb.js.map → wrap-text-DZtPfwI6.js.map} +1 -1
- package/public/index.html +3 -3
- package/public/loading.html +3 -3
- package/public/sw.js +1 -1
- package/public/sw.js.map +1 -1
- package/public/assets/index-97B_EqpY.js.map +0 -1
- package/public/assets/index-B-_YmFJc.js.map +0 -1
- package/public/assets/index-C5ZxyV3U.js.map +0 -1
- package/public/assets/index-CuhtAbYJ.js.map +0 -1
- package/public/assets/index-CvKnyKel.js.map +0 -1
- package/public/assets/index-NCKXobfr.css +0 -1
- package/public/assets/index-QXZuSZ1s.js.map +0 -1
- package/public/assets/index-Ropj5M3p.js.map +0 -1
- package/public/assets/index-XQu8RsTR.js.map +0 -1
- package/public/assets/main-Y9fQI3c9.js +0 -43
- package/public/assets/main-Y9fQI3c9.js.map +0 -1
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
export const MINIMUM_OPENCODE_VERSION = "2.0.7";
|
|
7
7
|
/** Qualification target, independent of the technically required minimum. */
|
|
8
|
-
export const RECOMMENDED_OPENCODE_VERSION = "2.0.
|
|
8
|
+
export const RECOMMENDED_OPENCODE_VERSION = "2.0.19";
|
|
9
9
|
export const OPENCODE_UPDATE_REQUIRED = "opencode_update_required";
|
|
10
10
|
export function isBelowOpenCodeMinimum(version) {
|
|
11
11
|
// These historical V2 beta publications predate the stable event contract.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-support.js","sourceRoot":"","sources":["../../src/opencode/runtime-support.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,OAAO,CAAA;AAC/C,6EAA6E;AAC7E,MAAM,CAAC,MAAM,4BAA4B,GAAG,QAAQ,CAAA;AACpD,MAAM,CAAC,MAAM,wBAAwB,GAAG,0BAA0B,CAAA;AAElE,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,2EAA2E;IAC3E,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAA;IACnD,MAAM,KAAK,GAAG,qCAAqC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACjE,2EAA2E;IAC3E,4EAA4E;IAC5E,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAA;IACxB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACxD,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,CAAC,GAAG,wBAAwB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAClG,OAAO,KAAM,GAAG,YAAa,IAAI,CAAC,KAAK,KAAK,YAAY,IAAI,CAAC,KAAM,GAAG,YAAa;WAC9E,CAAC,KAAK,KAAK,YAAY,IAAI,KAAM,GAAG,YAAa,CAAC,CAAC,CAAC,CAAA;AAC3D,CAAC;AAID,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IAIjD,YAAqB,aAAqB,EAAW,SAAkC,gBAAgB;QACrG,KAAK,CAAC,GAAG,wBAAwB,cAAc,aAAa,KAAK,MAAM,KAAK,gBAAgB;YAC1F,CAAC,CAAC,iFAAiF,wBAAwB,EAAE;YAC7G,CAAC,CAAC,MAAM,KAAK,qBAAqB,CAAC,CAAC,CAAC,kEAAkE;gBACrG,CAAC,CAAC,gFAAgF,EAAE,CAAC,CAAA;QAJtE,kBAAa,GAAb,aAAa,CAAQ;QAAW,WAAM,GAAN,MAAM,CAA4C;QAH9F,SAAI,GAAG,wBAAwB,CAAA;QAC/B,eAAU,GAAG,GAAG,CAAA;QAChB,mBAAc,GAAG,wBAAwB,CAAA;QAMhD,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAA;IACxC,CAAC;CACF;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,IAAI,sBAAsB,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,wBAAwB,CAAC,OAAO,CAAC,CAAA;AAClF,CAAC","sourcesContent":["/**\n * 2.0.7 introduces session.step.started.data.started. The current Solid reducer\n * consumes this native timestamp directly; earlier releases need a retired\n * event adapter. This is a technical floor, not the latest qualified release.\n */\nexport const MINIMUM_OPENCODE_VERSION = \"2.0.7\"\n/** Qualification target, independent of the technically required minimum. */\nexport const RECOMMENDED_OPENCODE_VERSION = \"2.0.
|
|
1
|
+
{"version":3,"file":"runtime-support.js","sourceRoot":"","sources":["../../src/opencode/runtime-support.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,OAAO,CAAA;AAC/C,6EAA6E;AAC7E,MAAM,CAAC,MAAM,4BAA4B,GAAG,QAAQ,CAAA;AACpD,MAAM,CAAC,MAAM,wBAAwB,GAAG,0BAA0B,CAAA;AAElE,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,2EAA2E;IAC3E,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAA;IACnD,MAAM,KAAK,GAAG,qCAAqC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACjE,2EAA2E;IAC3E,4EAA4E;IAC5E,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAA;IACxB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACxD,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,CAAC,GAAG,wBAAwB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAClG,OAAO,KAAM,GAAG,YAAa,IAAI,CAAC,KAAK,KAAK,YAAY,IAAI,CAAC,KAAM,GAAG,YAAa;WAC9E,CAAC,KAAK,KAAK,YAAY,IAAI,KAAM,GAAG,YAAa,CAAC,CAAC,CAAC,CAAA;AAC3D,CAAC;AAID,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IAIjD,YAAqB,aAAqB,EAAW,SAAkC,gBAAgB;QACrG,KAAK,CAAC,GAAG,wBAAwB,cAAc,aAAa,KAAK,MAAM,KAAK,gBAAgB;YAC1F,CAAC,CAAC,iFAAiF,wBAAwB,EAAE;YAC7G,CAAC,CAAC,MAAM,KAAK,qBAAqB,CAAC,CAAC,CAAC,kEAAkE;gBACrG,CAAC,CAAC,gFAAgF,EAAE,CAAC,CAAA;QAJtE,kBAAa,GAAb,aAAa,CAAQ;QAAW,WAAM,GAAN,MAAM,CAA4C;QAH9F,SAAI,GAAG,wBAAwB,CAAA;QAC/B,eAAU,GAAG,GAAG,CAAA;QAChB,mBAAc,GAAG,wBAAwB,CAAA;QAMhD,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAA;IACxC,CAAC;CACF;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,IAAI,sBAAsB,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,wBAAwB,CAAC,OAAO,CAAC,CAAA;AAClF,CAAC","sourcesContent":["/**\n * 2.0.7 introduces session.step.started.data.started. The current Solid reducer\n * consumes this native timestamp directly; earlier releases need a retired\n * event adapter. This is a technical floor, not the latest qualified release.\n */\nexport const MINIMUM_OPENCODE_VERSION = \"2.0.7\"\n/** Qualification target, independent of the technically required minimum. */\nexport const RECOMMENDED_OPENCODE_VERSION = \"2.0.19\"\nexport const OPENCODE_UPDATE_REQUIRED = \"opencode_update_required\"\n\nexport function isBelowOpenCodeMinimum(version: string): boolean {\n // These historical V2 beta publications predate the stable event contract.\n if (/^0\\.0\\.0-beta-\\d+$/.test(version)) return true\n const match = /^(\\d+)\\.(\\d+)\\.(\\d+)(?:\\+[\\w.-]+)?$/.exec(version)\n // Custom/prerelease labels are unverified, not automatically incompatible.\n // Their authenticated API contract is inspected before functional requests.\n if (!match) return false\n const [major, minor, patch] = match.slice(1).map(Number)\n const [minimumMajor, minimumMinor, minimumPatch] = MINIMUM_OPENCODE_VERSION.split(\".\").map(Number)\n return major! < minimumMajor! || (major === minimumMajor && (minor! < minimumMinor!\n || (minor === minimumMinor && patch! < minimumPatch!)))\n}\n\nexport type OpenCodeIncompatibility = \"step_timestamp\" | \"canonical_api\" | \"session_environment\"\n\nexport class UnsupportedOpenCodeError extends Error {\n readonly code = OPENCODE_UPDATE_REQUIRED\n readonly statusCode = 426\n readonly minimumVersion = MINIMUM_OPENCODE_VERSION\n constructor(readonly actualVersion: string, readonly reason: OpenCodeIncompatibility = \"step_timestamp\") {\n super(`${OPENCODE_UPDATE_REQUIRED}: OpenCode ${actualVersion}; ${reason === \"step_timestamp\"\n ? `requires the native session.step.started.data.started timestamp introduced in ${MINIMUM_OPENCODE_VERSION}`\n : reason === \"session_environment\" ? \"requires PUT /api/session/{sessionID}/environment with variables\"\n : \"does not expose the canonical session, permission, Form and inbox API contract\"}`)\n this.name = \"UnsupportedOpenCodeError\"\n }\n}\n\nexport function assertSupportedOpenCode(version: string): void {\n if (isBelowOpenCodeMinimum(version)) throw new UnsupportedOpenCodeError(version)\n}\n"]}
|
|
@@ -5,8 +5,8 @@ import { rememberRuntime } from "./compatibility/runtime";
|
|
|
5
5
|
import { OpenCodeSharedService } from "../workspaces/opencode-service";
|
|
6
6
|
test("native timestamp minimum is distinct from recommendation and unfamiliar version labels", () => {
|
|
7
7
|
assert.equal(MINIMUM_OPENCODE_VERSION, "2.0.7");
|
|
8
|
-
assert.equal(RECOMMENDED_OPENCODE_VERSION, "2.0.
|
|
9
|
-
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", "2.0.16", "2.0.17", "2.0.18", "2.1.0", "2.0.
|
|
8
|
+
assert.equal(RECOMMENDED_OPENCODE_VERSION, "2.0.19");
|
|
9
|
+
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", "2.0.16", "2.0.17", "2.0.18", "2.0.19", "2.1.0", "2.0.19-dev.1", "3.0.0", "custom-build"]) {
|
|
10
10
|
assert.equal(isBelowOpenCodeMinimum(version), false, version);
|
|
11
11
|
}
|
|
12
12
|
for (const version of ["2.0.0", "2.0.4", "2.0.5", "2.0.6", "0.0.0-beta-19507"])
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-support.test.js","sourceRoot":"","sources":["../../src/opencode/runtime-support.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAA;AACvC,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAA;AAC5I,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAA;AAEtE,IAAI,CAAC,wFAAwF,EAAE,GAAG,EAAE;IAClG,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAA;IAC/C,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,QAAQ,CAAC,CAAA;IACpD,KAAK,MAAM,OAAO,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime-support.test.js","sourceRoot":"","sources":["../../src/opencode/runtime-support.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAA;AACvC,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAA;AAC5I,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAA;AAEtE,IAAI,CAAC,wFAAwF,EAAE,GAAG,EAAE;IAClG,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAA;IAC/C,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,QAAQ,CAAC,CAAA;IACpD,KAAK,MAAM,OAAO,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,CAAC;QACxM,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;IAC/D,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,CAAC;QAAE,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;AAC9I,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;IAC7F,IAAI,WAAW,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAA;IACjC,MAAM,QAAQ,GAAa,EAAE,GAAG,EAAE,uBAAuB,EAAE,CAAA;IAC3D,eAAe,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAA;IAC1E,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAA,CAAC,CAAC,EAAE,CAAC,CAAA;IACjK,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,WAAoB,EAAE,QAAQ,EAAE,SAAS;QAC/D,SAAS,EAAE,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAA,CAAC,CAAC,EAAE;QACxG,qBAAqB,EAAE,KAAK,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,OAAO,IAAI,CAAA,CAAC,CAAC,GAC/D,CAAA;IACD,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK,YAAY,wBAAwB;WACtG,KAAK,CAAC,aAAa,KAAK,OAAO,IAAI,KAAK,CAAC,cAAc,KAAK,OAAO,IAAI,KAAK,CAAC,MAAM,KAAK,gBAAgB,CAAC,CAAA;IAC9G,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;IAC5B,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;AAC3B,CAAC,CAAC,CAAA","sourcesContent":["import assert from \"node:assert/strict\"\nimport test from \"node:test\"\nimport type { Endpoint } from \"@opencode/client/service\"\nimport { isBelowOpenCodeMinimum, UnsupportedOpenCodeError, MINIMUM_OPENCODE_VERSION, RECOMMENDED_OPENCODE_VERSION } from \"./runtime-support\"\nimport { rememberRuntime } from \"./compatibility/runtime\"\nimport { OpenCodeSharedService } from \"../workspaces/opencode-service\"\n\ntest(\"native timestamp minimum is distinct from recommendation and unfamiliar version labels\", () => {\n assert.equal(MINIMUM_OPENCODE_VERSION, \"2.0.7\")\n assert.equal(RECOMMENDED_OPENCODE_VERSION, \"2.0.19\")\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\", \"2.0.16\", \"2.0.17\", \"2.0.18\", \"2.0.19\", \"2.1.0\", \"2.0.19-dev.1\", \"3.0.0\", \"custom-build\"]) {\n assert.equal(isBelowOpenCodeMinimum(version), false, version)\n }\n for (const version of [\"2.0.0\", \"2.0.4\", \"2.0.5\", \"2.0.6\", \"0.0.0-beta-19507\"]) assert.equal(isBelowOpenCodeMinimum(version), true, version)\n})\n\ntest(\"refuses old authenticated daemons before client calls or plugin preparation\", async () => {\n let constructed = 0, prepared = 0\n const endpoint: Endpoint = { url: \"http://127.0.0.1:4321\" }\n rememberRuntime(endpoint, { version: \"2.0.6\", pid: 1, discovery: \"info\" })\n const service = new OpenCodeSharedService({ headers: () => ({ authorization: \"fixture\" }), makeClient: () => { constructed++; throw new Error(\"not reached\") } })\n const options = { kind: \"lifecycle\" as const, identity: \"fixture\",\n lifecycle: { discover: async () => endpoint, ensure: async () => { throw new Error(\"must not start\") } },\n prepareDesktopPlugins: async () => { prepared++; return true },\n }\n await assert.rejects(service.client(options), (error: unknown) => error instanceof UnsupportedOpenCodeError\n && error.actualVersion === \"2.0.6\" && error.minimumVersion === \"2.0.7\" && error.reason === \"step_timestamp\")\n assert.equal(constructed, 0)\n assert.equal(prepared, 0)\n})\n"]}
|
|
@@ -262,28 +262,28 @@ test("an in-flight native reload holds shared-service authority across binary ch
|
|
|
262
262
|
test("beta version comparison remains numeric", () => {
|
|
263
263
|
assert.equal(compareOpenCodeVersionStrings("0.0.0-beta-10000", "0.0.0-beta-9999") > 0, true);
|
|
264
264
|
});
|
|
265
|
-
test("2.0.7 through 2.0.
|
|
266
|
-
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", "2.0.16", "2.0.17", "2.0.18"]) {
|
|
265
|
+
test("2.0.7 through 2.0.19 remain usable; recommendation only offers an optional update", async () => {
|
|
266
|
+
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", "2.0.16", "2.0.17", "2.0.18", "2.0.19"]) {
|
|
267
267
|
const endpoint = { url: "http://127.0.0.1:9876" };
|
|
268
268
|
rememberRuntime(endpoint, { version, pid: 123, discovery: "info" });
|
|
269
269
|
const service = new OpenCodeUpdateService(deps({
|
|
270
|
-
probeBinary: () => ({ valid: true, version }), resolveLatestVersion: async () => "2.0.
|
|
270
|
+
probeBinary: () => ({ valid: true, version }), resolveLatestVersion: async () => "2.0.19",
|
|
271
271
|
lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => { throw new Error("must retain daemon"); } }),
|
|
272
272
|
}));
|
|
273
273
|
const status = await service.start();
|
|
274
274
|
assert.equal(status.minimumVersion, "2.0.7");
|
|
275
|
-
assert.equal(status.recommendedVersion, "2.0.
|
|
275
|
+
assert.equal(status.recommendedVersion, "2.0.19");
|
|
276
276
|
assert.equal(status.state, "ready");
|
|
277
277
|
assert.equal(status.serviceState, "ready");
|
|
278
|
-
assert.equal(status.versionAssessment, version === "2.0.
|
|
278
|
+
assert.equal(status.versionAssessment, version === "2.0.19" ? "tested" : "untested", "only the current recommendation is release-qualified");
|
|
279
279
|
assert.equal(status.incompatibilityReason, undefined);
|
|
280
|
-
assert.equal(status.canUpgrade, version !== "2.0.
|
|
280
|
+
assert.equal(status.canUpgrade, version !== "2.0.19");
|
|
281
281
|
assert.equal(status.canRestart, false);
|
|
282
282
|
}
|
|
283
283
|
});
|
|
284
284
|
test("a current daemon remains usable through an older selected discovery CLI", async () => {
|
|
285
285
|
const endpoint = { url: "http://127.0.0.1:9876" };
|
|
286
|
-
rememberRuntime(endpoint, { version: "2.0.
|
|
286
|
+
rememberRuntime(endpoint, { version: "2.0.19", pid: 123, discovery: "info" });
|
|
287
287
|
const service = new OpenCodeUpdateService(deps({
|
|
288
288
|
probeBinary: () => ({ valid: true, version: "2.0.3" }),
|
|
289
289
|
lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => { throw new Error("must retain daemon"); } }),
|
|
@@ -1 +1 @@
|
|
|
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.18 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\", \"2.0.16\", \"2.0.17\", \"2.0.18\"]) {\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.18\",\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.18\")\n assert.equal(status.state, \"ready\")\n assert.equal(status.serviceState, \"ready\")\n assert.equal(status.versionAssessment, version === \"2.0.18\" ? \"tested\" : \"untested\", \"only the current recommendation is release-qualified\")\n assert.equal(status.incompatibilityReason, undefined)\n assert.equal(status.canUpgrade, version !== \"2.0.18\")\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.18\", 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.19 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\", \"2.0.16\", \"2.0.17\", \"2.0.18\", \"2.0.19\"]) {\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.19\",\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.19\")\n assert.equal(status.state, \"ready\")\n assert.equal(status.serviceState, \"ready\")\n assert.equal(status.versionAssessment, version === \"2.0.19\" ? \"tested\" : \"untested\", \"only the current recommendation is release-qualified\")\n assert.equal(status.incompatibilityReason, undefined)\n assert.equal(status.canUpgrade, version !== \"2.0.19\")\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.19\", 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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@neuralnomads/codenomad-dev",
|
|
3
|
-
"version": "0.20.0-dev-
|
|
3
|
+
"version": "0.20.0-dev-20260930-47f9e43e",
|
|
4
4
|
"description": "CodeNomad Server",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": {
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"@fastify/cors": "^8.5.0",
|
|
31
31
|
"@fastify/reply-from": "^9.8.0",
|
|
32
32
|
"@fastify/static": "^7.0.4",
|
|
33
|
-
"@opencode/client": "2.0.
|
|
33
|
+
"@opencode/client": "2.0.19",
|
|
34
34
|
"commander": "^12.1.0",
|
|
35
35
|
"fastify": "^4.28.1",
|
|
36
36
|
"fuzzysort": "^2.0.4",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"esbuild": "^0.25.12",
|
|
48
|
-
"@opencode/plugin": "2.0.
|
|
48
|
+
"@opencode/plugin": "2.0.19",
|
|
49
49
|
"@types/node-forge": "^1.3.14",
|
|
50
50
|
"@types/yauzl": "^2.10.0",
|
|
51
51
|
"cross-env": "^7.0.3",
|