@neuralnomads/codenomad-dev 1.0.0-dev-20261022-f8763d7d → 1.0.0-dev-20261022-aa9bbc14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +1 -1
  2. package/dist/opencode/compatibility/runtime.js +1 -1
  3. package/dist/opencode/compatibility/runtime.js.map +1 -1
  4. package/dist/opencode/compatibility/transport.test.js +2 -2
  5. package/dist/opencode/compatibility/transport.test.js.map +1 -1
  6. package/dist/opencode/runtime-support.js +1 -1
  7. package/dist/opencode/runtime-support.js.map +1 -1
  8. package/dist/opencode/runtime-support.test.js +1 -1
  9. package/dist/opencode/runtime-support.test.js.map +1 -1
  10. package/dist/opencode-update/service.test.js +4 -4
  11. package/dist/opencode-update/service.test.js.map +1 -1
  12. package/package.json +1 -1
  13. package/public/apple-touch-icon-180x180.png +0 -0
  14. package/public/assets/{App-CElCGCiB.js → App-BuNl0Al4.js} +8 -8
  15. package/public/assets/{App-CElCGCiB.js.map → App-BuNl0Al4.js.map} +1 -1
  16. package/public/assets/CodeNomad-Icon-BvlAYys-.js +2 -0
  17. package/public/assets/{CodeNomad-Icon-DTDWwXip.js.map → CodeNomad-Icon-BvlAYys-.js.map} +1 -1
  18. package/public/assets/CodeNomad-Icon-DXiCBtTv.png +0 -0
  19. package/public/assets/{FilesPanel-DMIbpMr1.js → FilesPanel-xwpMB-fz.js} +2 -2
  20. package/public/assets/{FilesPanel-DMIbpMr1.js.map → FilesPanel-xwpMB-fz.js.map} +1 -1
  21. package/public/assets/{StatusTab-CoN7g0iU.js → StatusTab-dwML8T-O.js} +2 -2
  22. package/public/assets/{StatusTab-CoN7g0iU.js.map → StatusTab-dwML8T-O.js.map} +1 -1
  23. package/public/assets/{client-state-bYw09DXO.js → client-state-BmnG-PQd.js} +2 -2
  24. package/public/assets/{client-state-bYw09DXO.js.map → client-state-BmnG-PQd.js.map} +1 -1
  25. package/public/assets/{client-state-BC1A-9ew.js → client-state-CZgmvnaz.js} +2 -2
  26. package/public/assets/{client-state-BC1A-9ew.js.map → client-state-CZgmvnaz.js.map} +1 -1
  27. package/public/assets/client-state-owner-commands-C_Y96qAT.js +2 -0
  28. package/public/assets/{client-state-owner-commands-B0tGCi6D.js.map → client-state-owner-commands-C_Y96qAT.js.map} +1 -1
  29. package/public/assets/{diff-viewer-v4RNtgO1.js → diff-viewer-D-k-WU4G.js} +2 -2
  30. package/public/assets/{diff-viewer-v4RNtgO1.js.map → diff-viewer-D-k-WU4G.js.map} +1 -1
  31. package/public/assets/{loading-3pXqDDyr.js → loading-BBqtFMFl.js} +2 -2
  32. package/public/assets/{loading-3pXqDDyr.js.map → loading-BBqtFMFl.js.map} +1 -1
  33. package/public/assets/{main-C3RgNTJU.js → main-B3dkpVFN.js} +58 -58
  34. package/public/assets/main-B3dkpVFN.js.map +1 -0
  35. package/public/assets/{markdown-CKLl8qL4.js → markdown-Ion7XGQ_.js} +2 -2
  36. package/public/assets/{markdown-CKLl8qL4.js.map → markdown-Ion7XGQ_.js.map} +1 -1
  37. package/public/assets/{opener-startup-state-settings-card-bbedCnPX.js → opener-startup-state-settings-card-CMsDV7Oi.js} +2 -2
  38. package/public/assets/{opener-startup-state-settings-card-bbedCnPX.js.map → opener-startup-state-settings-card-CMsDV7Oi.js.map} +1 -1
  39. package/public/assets/{startup-state-settings-card-Wg5cT1HN.js → startup-state-settings-card-DKytnX7U.js} +2 -2
  40. package/public/assets/{startup-state-settings-card-Wg5cT1HN.js.map → startup-state-settings-card-DKytnX7U.js.map} +1 -1
  41. package/public/assets/{startup-state-settings-view-CWFsb8Nw.js → startup-state-settings-view-CuH0jPMu.js} +2 -2
  42. package/public/assets/{startup-state-settings-view-CWFsb8Nw.js.map → startup-state-settings-view-CuH0jPMu.js.map} +1 -1
  43. package/public/assets/{terminal-square-DXYc8r6u.js → terminal-square-GVYyydFt.js} +2 -2
  44. package/public/assets/{terminal-square-DXYc8r6u.js.map → terminal-square-GVYyydFt.js.map} +1 -1
  45. package/public/assets/{tool-call-DOdwRLfS.js → tool-call-YY2YGZQj.js} +4 -4
  46. package/public/assets/{tool-call-DOdwRLfS.js.map → tool-call-YY2YGZQj.js.map} +1 -1
  47. package/public/assets/{unified-picker-dR97LzAr.js → unified-picker-CedTYzm0.js} +2 -2
  48. package/public/assets/{unified-picker-dR97LzAr.js.map → unified-picker-CedTYzm0.js.map} +1 -1
  49. package/public/favicon.ico +0 -0
  50. package/public/index.html +1 -1
  51. package/public/loading.html +2 -2
  52. package/public/logo.png +0 -0
  53. package/public/maskable-icon-512x512.png +0 -0
  54. package/public/pwa-192x192.png +0 -0
  55. package/public/pwa-512x512.png +0 -0
  56. package/public/pwa-64x64.png +0 -0
  57. package/public/sw.js +1 -1
  58. package/public/sw.js.map +1 -1
  59. package/public/assets/CodeNomad-Icon-DTDWwXip.js +0 -2
  60. package/public/assets/CodeNomad-Icon-bmTWNPXy.png +0 -0
  61. package/public/assets/client-state-owner-commands-B0tGCi6D.js +0 -2
  62. package/public/assets/main-C3RgNTJU.js.map +0 -1
package/README.md CHANGED
@@ -21,7 +21,7 @@
21
21
  ## Prerequisites
22
22
 
23
23
  - **Git**: A prerequisite in the backend process's `PATH` for repository identity, Git operations and worktree management. Without Git, directory-only conversations in the explicitly opened physical folder remain available so the user can ask the agent for installation help. Owned session prompts/custom commands update the native `codenomad.git-availability` instruction; it reports the backend platform and is removed when Git becomes available. Git/worktree operations still fail explicitly with `503`/`git_required`. Install from https://git-scm.com/downloads and restart the backend after changing `PATH`. A Windows per-user installation is sufficient; Git inside WSL alone is insufficient for a Windows backend.
24
- - **OpenCode**: install `opencode` **2.1.2 or later** (minimum and recommended version). The npm package is `@opencode/cli`; see the [installation guide](https://opencode.ai/v2/docs/). CodeNomad prefers the CLI on `PATH` and also supports an explicitly selected executable. It uses the official service lifecycle and validates authenticated daemon metadata and API compatibility; custom and prerelease versions undergo the same contract validation. See [`runtime-support.ts`](src/opencode/runtime-support.ts) for the current requirements.
24
+ - **OpenCode**: install `opencode` **2.1.2 or later** (minimum version; **2.1.3** is recommended). The npm package is `@opencode/cli`; see the [installation guide](https://opencode.ai/v2/docs/). CodeNomad prefers the CLI on `PATH` and also supports an explicitly selected executable. It uses the official service lifecycle and validates authenticated daemon metadata and API compatibility; custom and prerelease versions undergo the same contract validation. See [`runtime-support.ts`](src/opencode/runtime-support.ts) for the current requirements.
25
25
  - **OpenCode data**: The global daemon owns its platform-default storage, database, and service registration. Configured startup environment applies only when CodeNomad starts a missing daemon; an existing daemon is unchanged.
26
26
  - **Windows to WSL**: A configured WSL UNC binary uses Linux `service status`, `service start`, and `service get password`; Windows must have WSL localhost forwarding enabled to reach its loopback service.
27
27
  - **Node.js and npm**: Use Node.js 24 LTS for the standalone server; source and release builds use [`.node-version`](../../.node-version) (currently 24.20.0). Desktop distributions bundle Node/npm.
@@ -15,7 +15,7 @@ export function contractProfile(identity) {
15
15
  // Publication contract reviewed and exercised by the isolated native suites
16
16
  // (minimum and qualification target). Unlisted versions still negotiate their
17
17
  // authenticated schema.
18
- if (identity.version === "2.1.2")
18
+ if (identity.version === "2.1.2" || identity.version === "2.1.3")
19
19
  return "modern";
20
20
  return "unknown";
21
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/opencode/compatibility/runtime.ts"],"names":[],"mappings":"AAUA,8EAA8E;AAC9E,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAA;AACjE,MAAM,UAAU,eAAe,CAAC,QAAkB,EAAE,QAAyB;IAC3E,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAA;AAC5G,CAAC;AACD,MAAM,UAAU,eAAe,CAAC,QAAkB;IAChD,OAAQ,QAAgE,CAAC,gBAAgB,CAAC,CAAA;AAC5F,CAAC;AAGD,MAAM,UAAU,eAAe,CAAC,QAAqC;IACnE,gFAAgF;IAChF,IAAI,CAAC,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAC9B,IAAI,QAAQ,CAAC,QAAQ,EAAE,OAAO;QAAE,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAA;IAChE,4EAA4E;IAC5E,8EAA8E;IAC9E,wBAAwB;IACxB,IAAI,QAAQ,CAAC,OAAO,KAAK,OAAO;QAAE,OAAO,QAAQ,CAAA;IACjD,OAAO,SAAS,CAAA;AAClB,CAAC","sourcesContent":["import type { Endpoint } from \"@opencode/client/service\"\n\nexport interface RuntimeIdentity {\n version: string\n pid: number\n discovery: \"status\" | \"health\" | \"info\"\n /** Filled only by a successful, authenticated schema negotiation. */\n contract?: { profile?: Exclude<ContractProfile, \"unknown\">; reload?: boolean }\n}\n\n// Keep authenticated daemon metadata out of public endpoints and credentials.\nconst RUNTIME_IDENTITY = Symbol.for(\"codenomad.opencode.runtime\")\nexport function rememberRuntime(endpoint: Endpoint, identity: RuntimeIdentity): void {\n Object.defineProperty(endpoint, RUNTIME_IDENTITY, { value: Object.freeze({ ...identity, contract: {} }) })\n}\nexport function runtimeIdentity(endpoint: Endpoint): RuntimeIdentity | undefined {\n return (endpoint as Endpoint & { [RUNTIME_IDENTITY]?: RuntimeIdentity })[RUNTIME_IDENTITY]\n}\n\nexport type ContractProfile = \"modern\" | \"unknown\"\nexport function contractProfile(identity: RuntimeIdentity | undefined): ContractProfile {\n // Custom embedded/test lifecycles that don't negotiate use the pinned contract.\n if (!identity) return \"modern\"\n if (identity.contract?.profile) return identity.contract.profile\n // Publication contract reviewed and exercised by the isolated native suites\n // (minimum and qualification target). Unlisted versions still negotiate their\n // authenticated schema.\n if (identity.version === \"2.1.2\") return \"modern\"\n return \"unknown\"\n}\n"]}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/opencode/compatibility/runtime.ts"],"names":[],"mappings":"AAUA,8EAA8E;AAC9E,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAA;AACjE,MAAM,UAAU,eAAe,CAAC,QAAkB,EAAE,QAAyB;IAC3E,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAA;AAC5G,CAAC;AACD,MAAM,UAAU,eAAe,CAAC,QAAkB;IAChD,OAAQ,QAAgE,CAAC,gBAAgB,CAAC,CAAA;AAC5F,CAAC;AAGD,MAAM,UAAU,eAAe,CAAC,QAAqC;IACnE,gFAAgF;IAChF,IAAI,CAAC,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAC9B,IAAI,QAAQ,CAAC,QAAQ,EAAE,OAAO;QAAE,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAA;IAChE,4EAA4E;IAC5E,8EAA8E;IAC9E,wBAAwB;IACxB,IAAI,QAAQ,CAAC,OAAO,KAAK,OAAO,IAAI,QAAQ,CAAC,OAAO,KAAK,OAAO;QAAE,OAAO,QAAQ,CAAA;IACjF,OAAO,SAAS,CAAA;AAClB,CAAC","sourcesContent":["import type { Endpoint } from \"@opencode/client/service\"\n\nexport interface RuntimeIdentity {\n version: string\n pid: number\n discovery: \"status\" | \"health\" | \"info\"\n /** Filled only by a successful, authenticated schema negotiation. */\n contract?: { profile?: Exclude<ContractProfile, \"unknown\">; reload?: boolean }\n}\n\n// Keep authenticated daemon metadata out of public endpoints and credentials.\nconst RUNTIME_IDENTITY = Symbol.for(\"codenomad.opencode.runtime\")\nexport function rememberRuntime(endpoint: Endpoint, identity: RuntimeIdentity): void {\n Object.defineProperty(endpoint, RUNTIME_IDENTITY, { value: Object.freeze({ ...identity, contract: {} }) })\n}\nexport function runtimeIdentity(endpoint: Endpoint): RuntimeIdentity | undefined {\n return (endpoint as Endpoint & { [RUNTIME_IDENTITY]?: RuntimeIdentity })[RUNTIME_IDENTITY]\n}\n\nexport type ContractProfile = \"modern\" | \"unknown\"\nexport function contractProfile(identity: RuntimeIdentity | undefined): ContractProfile {\n // Custom embedded/test lifecycles that don't negotiate use the pinned contract.\n if (!identity) return \"modern\"\n if (identity.contract?.profile) return identity.contract.profile\n // Publication contract reviewed and exercised by the isolated native suites\n // (minimum and qualification target). Unlisted versions still negotiate their\n // authenticated schema.\n if (identity.version === \"2.1.2\" || identity.version === \"2.1.3\") return \"modern\"\n return \"unknown\"\n}\n"]}
@@ -5,8 +5,8 @@ import { rememberRuntime } from "./runtime";
5
5
  import { createRuntimeFetch } from "./transport";
6
6
  import { modernContractFixture } from "./contract-fixture";
7
7
  test("current and future supported releases preserve info, authentication and bounded negotiation", async () => {
8
- const reviewed = ["2.1.2"];
9
- for (const version of [...reviewed, "2.1.3", "2.1.100", "3.0.0", "2.2.0-dev.1", "custom-build"]) {
8
+ const reviewed = ["2.1.2", "2.1.3"];
9
+ for (const version of [...reviewed, "2.1.4", "2.1.100", "3.0.0", "2.2.0-dev.1", "custom-build"]) {
10
10
  const endpoint = { url: "http://127.0.0.1:4321", auth: { type: "basic", username: "opencode", password: "fixture" } };
11
11
  rememberRuntime(endpoint, { version, pid: 123, discovery: "info" });
12
12
  const seen = [];
@@ -1 +1 @@
1
- {"version":3,"file":"transport.test.js","sourceRoot":"","sources":["../../../src/opencode/compatibility/transport.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAA;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAE1D,IAAI,CAAC,6FAA6F,EAAE,KAAK,IAAI,EAAE;IAC7G,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,CAAA;IAC1B,KAAK,MAAM,OAAO,IAAI,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,CAAC,EAAE,CAAC;QAChG,MAAM,QAAQ,GAAG,EAAE,GAAG,EAAE,uBAAuB,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAA;QAC9H,eAAe,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAA;QACnE,MAAM,IAAI,GAAa,EAAE,CAAA;QACzB,MAAM,KAAK,GAAG,kBAAkB,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC/D,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAA;YAC5C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACf,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;YACrC,MAAM,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;YAC5H,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,EAAE,CAAC,CAAA;QACrJ,CAAC,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAA;QAC9D,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;QACnE,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC,CAAA;IACrG,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,4FAA4F,EAAE,KAAK,IAAI,EAAE;IAC5G,MAAM,QAAQ,GAAG,EAAE,GAAG,EAAE,uBAAuB,EAAE,CAAA;IACjD,eAAe,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAA;IAC5E,MAAM,IAAI,GAAa,EAAE,CAAA;IACzB,MAAM,KAAK,GAAG,kBAAkB,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC/D,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAA;QAC5C,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,MAAM,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC,CAAA;QAC7C,OAAO,IAAI,KAAK,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;IAC9G,CAAC,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAA;IAC9D,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;IAC1C,MAAM,KAAK,CAAC,GAAG,QAAQ,CAAC,GAAG,aAAa,CAAC,CAAA;IACzC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC,CAAA;AAC9D,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;IAC5F,KAAK,MAAM,OAAO,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,CAAC,EAAE,CAAC;QAC7G,MAAM,QAAQ,GAAG,EAAE,GAAG,EAAE,uBAAuB,EAAE,CAAA;QACjD,eAAe,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAA;QACnE,MAAM,KAAK,GAAG,kBAAkB,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;QACrH,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,GAAG,gBAAgB,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,EAAE,0BAA0B,CAAC,CAAA;IAC5I,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;IAClF,MAAM,QAAQ,GAAG,EAAE,GAAG,EAAE,uBAAuB,EAAE,CAAA;IACjD,eAAe,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAA;IAC1E,MAAM,KAAK,GAA2D,EAAE,CAAA;IACxE,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,EAAE,KAAK,EAAE,kBAAkB,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC9G,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;YACxC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAA;YAClI,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAAE,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAA;YAC/F,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC5C,CAAC,CAAC,EAAE,CAAC,CAAA;IACL,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;IAClG,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAA;IACnF,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA;IAC/F,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;IACjE,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QAC/B,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,mCAAmC,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE;QACzF,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;QAC3G,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,SAAS,EAAE;KACrE,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,wFAAwF,EAAE,KAAK,IAAI,EAAE;IACxG,MAAM,QAAQ,GAAG,EAAE,GAAG,EAAE,uBAAuB,EAAE,CAAA;IACjD,eAAe,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAA;IAC1E,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAK,MAAM,MAAM,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,CAAA;QAC5D,MAAM,KAAK,GAAG,kBAAkB,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,OAAO,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;QAC/G,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,CAAC,GAAG,gBAAgB,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAAA;QAC/G,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QACrC,MAAM,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAA;IACnD,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IACtB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,UAAU,CAAC,KAAK,EAAE,CAAA;IAClB,MAAM,KAAK,GAAG,kBAAkB,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;IAC5F,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,GAAG,gBAAgB,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAA;IACpI,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,EAAE,iBAAiB,CAAC,CAAA;AACrF,CAAC,CAAC,CAAA","sourcesContent":["import assert from \"node:assert/strict\"\nimport { test } from \"node:test\"\nimport { OpenCode } from \"@opencode/client\"\nimport { rememberRuntime } from \"./runtime\"\nimport { createRuntimeFetch } from \"./transport\"\nimport { modernContractFixture } from \"./contract-fixture\"\n\ntest(\"current and future supported releases preserve info, authentication and bounded negotiation\", async () => {\n const reviewed = [\"2.1.2\"]\n for (const version of [...reviewed, \"2.1.3\", \"2.1.100\", \"3.0.0\", \"2.2.0-dev.1\", \"custom-build\"]) {\n const endpoint = { url: \"http://127.0.0.1:4321\", auth: { type: \"basic\" as const, username: \"opencode\", password: \"fixture\" } }\n rememberRuntime(endpoint, { version, pid: 123, discovery: \"info\" })\n const seen: string[] = []\n const fetch = createRuntimeFetch(endpoint, async (input, init) => {\n const path = new URL(String(input)).pathname\n seen.push(path)\n assert.equal(init?.redirect, \"error\")\n assert.equal(new Headers(init?.headers).get(\"authorization\"), `Basic ${Buffer.from(\"opencode:fixture\").toString(\"base64\")}`)\n return Response.json(path === \"/openapi.json\" ? modernContractFixture : { version, pid: 123, urls: [endpoint.url], paths: { tmp: \"/native/tmp\" } })\n })\n const client = OpenCode.make({ baseUrl: endpoint.url, fetch })\n assert.equal((await client.server.info()).paths.tmp, \"/native/tmp\")\n assert.deepEqual(seen, reviewed.includes(version) ? [\"/api/info\"] : [\"/openapi.json\", \"/api/info\"])\n }\n})\n\ntest(\"info and status routes are forwarded unchanged and never probe alternate routes on failure\", async () => {\n const endpoint = { url: \"http://127.0.0.1:4321\" }\n rememberRuntime(endpoint, { version: \"2.1.2\", pid: 123, discovery: \"info\" })\n const seen: string[] = []\n const fetch = createRuntimeFetch(endpoint, async (input, init) => {\n const path = new URL(String(input)).pathname\n seen.push(`${init?.method ?? \"GET\"} ${path}`)\n return path === \"/openapi.json\" ? Response.json(modernContractFixture) : new Response(null, { status: 404 })\n })\n const client = OpenCode.make({ baseUrl: endpoint.url, fetch })\n await assert.rejects(client.server.info())\n await fetch(`${endpoint.url}/api/status`)\n assert.deepEqual(seen, [\"GET /api/info\", \"GET /api/status\"])\n})\n\ntest(\"retired runtime contracts never dispatch even through the direct transport\", async () => {\n for (const version of [\"2.0.0\", \"2.0.7\", \"2.0.26\", \"2.0.27\", \"2.0.32\", \"2.1.0\", \"2.1.1\", \"0.0.0-beta-19271\"]) {\n const endpoint = { url: \"http://127.0.0.1:4321\" }\n rememberRuntime(endpoint, { version, pid: 1, discovery: \"health\" })\n const fetch = createRuntimeFetch(endpoint, async () => { assert.fail(\"unsupported runtime must not receive calls\") })\n await assert.rejects(fetch(`${endpoint.url}/api/session/s`, { method: \"PATCH\", body: '{\"title\":\"fixture\"}' }), /opencode_update_required/)\n }\n})\n\ntest(\"canonical mutations and inbox timestamps are forwarded unchanged\", async () => {\n const endpoint = { url: \"http://127.0.0.1:4321\" }\n rememberRuntime(endpoint, { version: \"2.1.2\", pid: 1, discovery: \"info\" })\n const calls: Array<{ path: string; method: string; body: unknown }> = []\n const client = OpenCode.make({ baseUrl: endpoint.url, fetch: createRuntimeFetch(endpoint, async (input, init) => {\n const request = new Request(input, init)\n calls.push({ path: new URL(request.url).pathname, method: request.method, body: request.body ? await request.json() : undefined })\n if (request.url.endsWith(\"/prompt\")) return Response.json({ data: { time: { created: 123 } } })\n return new Response(null, { status: 204 })\n }) })\n assert.equal((await client.session.prompt({ sessionID: \"s\", text: \"fixture\" })).time.created, 123)\n await client.permission.reply({ sessionID: \"s\", requestID: \"p\", decision: \"once\" })\n await client.session.command({ sessionID: \"s\", name: \"test\", text: \"args\", delivery: \"queue\" })\n await client.session.form.cancel({ sessionID: \"s\", formID: \"f\" })\n assert.deepEqual(calls.slice(1), [\n { method: \"POST\", path: \"/api/session/s/permission/p/reply\", body: { decision: \"once\" } },\n { method: \"POST\", path: \"/api/session/s/command\", body: { name: \"test\", text: \"args\", delivery: \"queue\" } },\n { method: \"DELETE\", path: \"/api/session/s/form/f\", body: undefined },\n ])\n})\n\ntest(\"errors never retry mutations; native error envelopes, abort and origin fencing survive\", async () => {\n const endpoint = { url: \"http://127.0.0.1:4321\" }\n rememberRuntime(endpoint, { version: \"2.1.2\", pid: 2, discovery: \"info\" })\n let calls = 0\n for (const status of [400, 401, 404, 500]) {\n const envelope = { _tag: \"NativeError\", message: \"fixture\" }\n const fetch = createRuntimeFetch(endpoint, async () => { calls++; return Response.json(envelope, { status }) })\n const response = await fetch(`${endpoint.url}/api/session/s`, { method: \"PATCH\", body: '{\"title\":\"fixture\"}' })\n assert.equal(response.status, status)\n assert.deepEqual(await response.json(), envelope)\n }\n assert.equal(calls, 4)\n const controller = new AbortController()\n controller.abort()\n const fetch = createRuntimeFetch(endpoint, async () => { assert.fail(\"must not dispatch\") })\n await assert.rejects(fetch(`${endpoint.url}/api/session/s`, { method: \"PATCH\", signal: controller.signal }), { name: \"AbortError\" })\n await assert.rejects(fetch(\"http://127.0.0.1:4322/api/session\"), /origin mismatch/)\n})\n"]}
1
+ {"version":3,"file":"transport.test.js","sourceRoot":"","sources":["../../../src/opencode/compatibility/transport.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert/strict\"\nimport { test } from \"node:test\"\nimport { OpenCode } from \"@opencode/client\"\nimport { rememberRuntime } from \"./runtime\"\nimport { createRuntimeFetch } from \"./transport\"\nimport { modernContractFixture } from \"./contract-fixture\"\n\ntest(\"current and future supported releases preserve info, authentication and bounded negotiation\", async () => {\n const reviewed = [\"2.1.2\", \"2.1.3\"]\n for (const version of [...reviewed, \"2.1.4\", \"2.1.100\", \"3.0.0\", \"2.2.0-dev.1\", \"custom-build\"]) {\n const endpoint = { url: \"http://127.0.0.1:4321\", auth: { type: \"basic\" as const, username: \"opencode\", password: \"fixture\" } }\n rememberRuntime(endpoint, { version, pid: 123, discovery: \"info\" })\n const seen: string[] = []\n const fetch = createRuntimeFetch(endpoint, async (input, init) => {\n const path = new URL(String(input)).pathname\n seen.push(path)\n assert.equal(init?.redirect, \"error\")\n assert.equal(new Headers(init?.headers).get(\"authorization\"), `Basic ${Buffer.from(\"opencode:fixture\").toString(\"base64\")}`)\n return Response.json(path === \"/openapi.json\" ? modernContractFixture : { version, pid: 123, urls: [endpoint.url], paths: { tmp: \"/native/tmp\" } })\n })\n const client = OpenCode.make({ baseUrl: endpoint.url, fetch })\n assert.equal((await client.server.info()).paths.tmp, \"/native/tmp\")\n assert.deepEqual(seen, reviewed.includes(version) ? [\"/api/info\"] : [\"/openapi.json\", \"/api/info\"])\n }\n})\n\ntest(\"info and status routes are forwarded unchanged and never probe alternate routes on failure\", async () => {\n const endpoint = { url: \"http://127.0.0.1:4321\" }\n rememberRuntime(endpoint, { version: \"2.1.2\", pid: 123, discovery: \"info\" })\n const seen: string[] = []\n const fetch = createRuntimeFetch(endpoint, async (input, init) => {\n const path = new URL(String(input)).pathname\n seen.push(`${init?.method ?? \"GET\"} ${path}`)\n return path === \"/openapi.json\" ? Response.json(modernContractFixture) : new Response(null, { status: 404 })\n })\n const client = OpenCode.make({ baseUrl: endpoint.url, fetch })\n await assert.rejects(client.server.info())\n await fetch(`${endpoint.url}/api/status`)\n assert.deepEqual(seen, [\"GET /api/info\", \"GET /api/status\"])\n})\n\ntest(\"retired runtime contracts never dispatch even through the direct transport\", async () => {\n for (const version of [\"2.0.0\", \"2.0.7\", \"2.0.26\", \"2.0.27\", \"2.0.32\", \"2.1.0\", \"2.1.1\", \"0.0.0-beta-19271\"]) {\n const endpoint = { url: \"http://127.0.0.1:4321\" }\n rememberRuntime(endpoint, { version, pid: 1, discovery: \"health\" })\n const fetch = createRuntimeFetch(endpoint, async () => { assert.fail(\"unsupported runtime must not receive calls\") })\n await assert.rejects(fetch(`${endpoint.url}/api/session/s`, { method: \"PATCH\", body: '{\"title\":\"fixture\"}' }), /opencode_update_required/)\n }\n})\n\ntest(\"canonical mutations and inbox timestamps are forwarded unchanged\", async () => {\n const endpoint = { url: \"http://127.0.0.1:4321\" }\n rememberRuntime(endpoint, { version: \"2.1.2\", pid: 1, discovery: \"info\" })\n const calls: Array<{ path: string; method: string; body: unknown }> = []\n const client = OpenCode.make({ baseUrl: endpoint.url, fetch: createRuntimeFetch(endpoint, async (input, init) => {\n const request = new Request(input, init)\n calls.push({ path: new URL(request.url).pathname, method: request.method, body: request.body ? await request.json() : undefined })\n if (request.url.endsWith(\"/prompt\")) return Response.json({ data: { time: { created: 123 } } })\n return new Response(null, { status: 204 })\n }) })\n assert.equal((await client.session.prompt({ sessionID: \"s\", text: \"fixture\" })).time.created, 123)\n await client.permission.reply({ sessionID: \"s\", requestID: \"p\", decision: \"once\" })\n await client.session.command({ sessionID: \"s\", name: \"test\", text: \"args\", delivery: \"queue\" })\n await client.session.form.cancel({ sessionID: \"s\", formID: \"f\" })\n assert.deepEqual(calls.slice(1), [\n { method: \"POST\", path: \"/api/session/s/permission/p/reply\", body: { decision: \"once\" } },\n { method: \"POST\", path: \"/api/session/s/command\", body: { name: \"test\", text: \"args\", delivery: \"queue\" } },\n { method: \"DELETE\", path: \"/api/session/s/form/f\", body: undefined },\n ])\n})\n\ntest(\"errors never retry mutations; native error envelopes, abort and origin fencing survive\", async () => {\n const endpoint = { url: \"http://127.0.0.1:4321\" }\n rememberRuntime(endpoint, { version: \"2.1.2\", pid: 2, discovery: \"info\" })\n let calls = 0\n for (const status of [400, 401, 404, 500]) {\n const envelope = { _tag: \"NativeError\", message: \"fixture\" }\n const fetch = createRuntimeFetch(endpoint, async () => { calls++; return Response.json(envelope, { status }) })\n const response = await fetch(`${endpoint.url}/api/session/s`, { method: \"PATCH\", body: '{\"title\":\"fixture\"}' })\n assert.equal(response.status, status)\n assert.deepEqual(await response.json(), envelope)\n }\n assert.equal(calls, 4)\n const controller = new AbortController()\n controller.abort()\n const fetch = createRuntimeFetch(endpoint, async () => { assert.fail(\"must not dispatch\") })\n await assert.rejects(fetch(`${endpoint.url}/api/session/s`, { method: \"PATCH\", signal: controller.signal }), { name: \"AbortError\" })\n await assert.rejects(fetch(\"http://127.0.0.1:4322/api/session\"), /origin mismatch/)\n})\n"]}
@@ -12,7 +12,7 @@
12
12
  */
13
13
  export const MINIMUM_OPENCODE_VERSION = "2.1.2";
14
14
  /** Qualification target, independent of the technically required minimum. */
15
- export const RECOMMENDED_OPENCODE_VERSION = "2.1.2";
15
+ export const RECOMMENDED_OPENCODE_VERSION = "2.1.3";
16
16
  export const OPENCODE_UPDATE_REQUIRED = "opencode_update_required";
17
17
  export function isBelowOpenCodeMinimum(version) {
18
18
  // 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;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,OAAO,CAAA;AAC/C,6EAA6E;AAC7E,MAAM,CAAC,MAAM,4BAA4B,GAAG,OAAO,CAAA;AACnD,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,iBAAiB;QACtG,KAAK,CAAC,GAAG,wBAAwB,cAAc,aAAa,KAAK,MAAM,KAAK,iBAAiB;YAC3F,CAAC,CAAC,wHAAwH,wBAAwB,EAAE;YACpJ,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,CAA6C;QAH/F,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 * CodeNomad consumes OpenCode 2.1's native replay contract through the pinned\n * 2.1 client reducer and codecs: provider replay data is `native` on events and\n * messages, summary compactions reference `metadata.keepID` (older kept text in\n * `metadata.recent`) and provider windows live in `native.messages`. 2.0.x\n * daemons emit the retired `state`/`providerState`/`resultState`/`recent` shapes.\n * OpenCode 2.1.2 also fixes Code Mode jobs violating JavaScript run-to-completion:\n * 2.1.0/2.1.1 lose shared updates and resume async callers before the first await.\n * Reproduced by scripts/test-codemode-jobs-native.mjs against isolated daemons.\n * OpenCode 2.1 reads data stored by older releases. See\n * dev-docs/OPENCODE_COMPATIBILITY.md for the demonstrated boundary.\n */\nexport const MINIMUM_OPENCODE_VERSION = \"2.1.2\"\n/** Qualification target, independent of the technically required minimum. */\nexport const RECOMMENDED_OPENCODE_VERSION = \"2.1.2\"\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 = \"native_contract\" | \"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 = \"native_contract\") {\n super(`${OPENCODE_UPDATE_REQUIRED}: OpenCode ${actualVersion}; ${reason === \"native_contract\"\n ? `requires the 2.1 native replay and compaction contract (native, metadata.keepID) and Code Mode job ordering fixed 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"]}
1
+ {"version":3,"file":"runtime-support.js","sourceRoot":"","sources":["../../src/opencode/runtime-support.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,OAAO,CAAA;AAC/C,6EAA6E;AAC7E,MAAM,CAAC,MAAM,4BAA4B,GAAG,OAAO,CAAA;AACnD,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,iBAAiB;QACtG,KAAK,CAAC,GAAG,wBAAwB,cAAc,aAAa,KAAK,MAAM,KAAK,iBAAiB;YAC3F,CAAC,CAAC,wHAAwH,wBAAwB,EAAE;YACpJ,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,CAA6C;QAH/F,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 * CodeNomad consumes OpenCode 2.1's native replay contract through the pinned\n * 2.1 client reducer and codecs: provider replay data is `native` on events and\n * messages, summary compactions reference `metadata.keepID` (older kept text in\n * `metadata.recent`) and provider windows live in `native.messages`. 2.0.x\n * daemons emit the retired `state`/`providerState`/`resultState`/`recent` shapes.\n * OpenCode 2.1.2 also fixes Code Mode jobs violating JavaScript run-to-completion:\n * 2.1.0/2.1.1 lose shared updates and resume async callers before the first await.\n * Reproduced by scripts/test-codemode-jobs-native.mjs against isolated daemons.\n * OpenCode 2.1 reads data stored by older releases. See\n * dev-docs/OPENCODE_COMPATIBILITY.md for the demonstrated boundary.\n */\nexport const MINIMUM_OPENCODE_VERSION = \"2.1.2\"\n/** Qualification target, independent of the technically required minimum. */\nexport const RECOMMENDED_OPENCODE_VERSION = \"2.1.3\"\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 = \"native_contract\" | \"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 = \"native_contract\") {\n super(`${OPENCODE_UPDATE_REQUIRED}: OpenCode ${actualVersion}; ${reason === \"native_contract\"\n ? `requires the 2.1 native replay and compaction contract (native, metadata.keepID) and Code Mode job ordering fixed 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,7 +5,7 @@ import { rememberRuntime } from "./compatibility/runtime";
5
5
  import { OpenCodeSharedService } from "../workspaces/opencode-service";
6
6
  test("native plugin runtime minimum does not become an allowlist of tested labels", () => {
7
7
  assert.equal(MINIMUM_OPENCODE_VERSION, "2.1.2");
8
- assert.equal(RECOMMENDED_OPENCODE_VERSION, "2.1.2");
8
+ assert.equal(RECOMMENDED_OPENCODE_VERSION, "2.1.3");
9
9
  for (const version of ["2.1.2", "2.1.2+custom", "2.1.3", "2.2.0", "2.1.0-dev.1", "3.0.0", "custom-build"]) {
10
10
  assert.equal(isBelowOpenCodeMinimum(version), false, version);
11
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-support.test.js","sourceRoot":"","sources":["../../src/opencode/runtime-support.test.ts"],"names":[],"mappings":"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","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 plugin runtime minimum does not become an allowlist of tested labels\", () => {\n assert.equal(MINIMUM_OPENCODE_VERSION, \"2.1.2\")\n assert.equal(RECOMMENDED_OPENCODE_VERSION, \"2.1.2\")\n for (const version of [\"2.1.2\", \"2.1.2+custom\", \"2.1.3\", \"2.2.0\", \"2.1.0-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.7\", \"2.0.26\", \"2.0.27\", \"2.0.29\", \"2.0.32\", \"2.1.0\", \"2.1.1\", \"2.1.1+custom\", \"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 for (const version of [\"2.0.32\", \"2.1.0\", \"2.1.1\"]) {\n let constructed = 0, prepared = 0\n const endpoint: Endpoint = { url: \"http://127.0.0.1:4321\" }\n rememberRuntime(endpoint, { version, 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 === version && error.minimumVersion === \"2.1.2\" && error.reason === \"native_contract\"\n && /Code Mode job ordering fixed in 2.1.2/.test(error.message))\n assert.equal(constructed, 0)\n assert.equal(prepared, 0)\n }\n})\n"]}
1
+ {"version":3,"file":"runtime-support.test.js","sourceRoot":"","sources":["../../src/opencode/runtime-support.test.ts"],"names":[],"mappings":"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","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 plugin runtime minimum does not become an allowlist of tested labels\", () => {\n assert.equal(MINIMUM_OPENCODE_VERSION, \"2.1.2\")\n assert.equal(RECOMMENDED_OPENCODE_VERSION, \"2.1.3\")\n for (const version of [\"2.1.2\", \"2.1.2+custom\", \"2.1.3\", \"2.2.0\", \"2.1.0-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.7\", \"2.0.26\", \"2.0.27\", \"2.0.29\", \"2.0.32\", \"2.1.0\", \"2.1.1\", \"2.1.1+custom\", \"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 for (const version of [\"2.0.32\", \"2.1.0\", \"2.1.1\"]) {\n let constructed = 0, prepared = 0\n const endpoint: Endpoint = { url: \"http://127.0.0.1:4321\" }\n rememberRuntime(endpoint, { version, 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 === version && error.minimumVersion === \"2.1.2\" && error.reason === \"native_contract\"\n && /Code Mode job ordering fixed in 2.1.2/.test(error.message))\n assert.equal(constructed, 0)\n assert.equal(prepared, 0)\n }\n})\n"]}
@@ -1,7 +1,7 @@
1
1
  import assert from "node:assert/strict";
2
2
  import test from "node:test";
3
3
  import { OpenCodeUpdateService, OpenCodeUpdateError, resolveLatestOpenCodeVersion, compareOpenCodeVersionStrings } from "./service";
4
- import { MINIMUM_OPENCODE_VERSION as minimum } from "../opencode/runtime-support";
4
+ import { MINIMUM_OPENCODE_VERSION as minimum, RECOMMENDED_OPENCODE_VERSION as recommended } from "../opencode/runtime-support";
5
5
  import { rememberRuntime } from "../opencode/compatibility/runtime";
6
6
  import { probeBinaryVersion } from "../workspaces/spawn";
7
7
  import { LegacyReplacementError } from "./shared-installation";
@@ -447,10 +447,10 @@ test("the native contract floor admits current and newer runtimes without a test
447
447
  }));
448
448
  const status = await service.start();
449
449
  assert.equal(status.minimumVersion, "2.1.2");
450
- assert.equal(status.recommendedVersion, "2.1.2");
450
+ assert.equal(status.recommendedVersion, "2.1.3");
451
451
  assert.equal(status.state, "ready");
452
452
  assert.equal(status.serviceState, "ready");
453
- assert.equal(status.versionAssessment, version === "2.1.2" ? "tested" : "untested", "only the current recommendation is release-qualified");
453
+ assert.equal(status.versionAssessment, version === "2.1.3" ? "tested" : "untested", "only the current recommendation is release-qualified");
454
454
  assert.equal(status.incompatibilityReason, undefined);
455
455
  assert.equal(status.canUpgrade, version === "2.1.2", "offer an optional upgrade below the target; never downgrade current or newer runtimes");
456
456
  assert.equal(status.canRestart, false);
@@ -474,7 +474,7 @@ test("older daemons require native replay and correct Code Mode ordering without
474
474
  });
475
475
  test("a current daemon remains usable through an older selected discovery CLI", async () => {
476
476
  const endpoint = { url: "http://127.0.0.1:9876" };
477
- rememberRuntime(endpoint, { version: minimum, pid: 123, discovery: "info" });
477
+ rememberRuntime(endpoint, { version: recommended, pid: 123, discovery: "info" });
478
478
  const service = new OpenCodeUpdateService(deps({
479
479
  probeBinary: () => ({ valid: true, version: "2.0.3" }),
480
480
  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, type UpgradeOptions } 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\"\nimport { LegacyReplacementError } from \"./shared-installation\"\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.1.3\" }),\n resolveLatestVersion: async () => minimum,\n upgradeBinary: async (_binary, target) => {\n assert.equal(target, \"2.1.3\")\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(\"OpenCode 1.x npm replacement requires explicit consent and reports failure after removal\", async () => {\n let version = \"1.18.10\", replaced = false\n const requests: UpgradeOptions[] = []\n const legacyReplacement = { path: \"C:/npm/opencode.cmd\", version: \"1.18.10\" }\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version }),\n inspectInstallation: () => replaced ? {} : { legacyReplacement },\n upgradeBinary: async (_binary, target, options) => {\n requests.push(options)\n // The first consented attempt fails after removing 1.x.\n if (requests.length === 1) throw new LegacyReplacementError(\"legacy_removed_install_failed\", \"registry offline\")\n version = target; replaced = true\n return { success: true, version: target }\n },\n }))\n const status = await service.getStatus()\n assert.equal(status.canUpgrade, true)\n assert.deepEqual(status.legacyReplacement, legacyReplacement)\n await assert.rejects(service.upgrade(), (error: unknown) => error instanceof OpenCodeUpdateError && error.code === \"legacy_replacement_required\")\n for (const stale of [{ ...legacyReplacement, version: \"1.18.9\" }, { ...legacyReplacement, path: \"C:/other/opencode.cmd\" }]) {\n await assert.rejects(service.upgrade({ replaceLegacy: stale }), (error: unknown) => error instanceof OpenCodeUpdateError && error.code === \"legacy_replacement_required\")\n }\n assert.deepEqual(requests, [], \"no installer runs without consent to the exact installation\")\n await assert.rejects(service.upgrade({ replaceLegacy: legacyReplacement }), (error: unknown) => error instanceof OpenCodeUpdateError && error.code === \"legacy_removed_install_failed\")\n assert.deepEqual(await service.upgrade({ replaceLegacy: legacyReplacement }), { success: true, version: minimum })\n assert.deepEqual(requests, [{ replaceLegacy: legacyReplacement }, { replaceLegacy: legacyReplacement }])\n assert.equal((await service.getStatus()).legacyReplacement, undefined)\n})\n\ntest(\"a broken OpenCode 1.x npm install remains replaceable with consent\", async () => {\n let installed = false\n const legacyReplacement = { path: \"C:/npm/opencode.cmd\", version: \"1.18.10\" }\n const requests: UpgradeOptions[] = []\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: installed ? \"C:/npm/opencode2.cmd\" : legacyReplacement.path, label: \"OpenCode\", source: \"path\" }),\n // The published placeholder bin/opencode.exe fails when postinstall did not run.\n probeBinary: () => installed ? { valid: true, version: minimum } : { valid: false, error: \"Exited with code 1: postinstall script was not run\" },\n inspectInstallation: () => installed ? {} : { legacyReplacement },\n upgradeBinary: async (_binary, target, options) => { requests.push(options); installed = true; return { success: true, version: target } },\n }))\n const status = await service.getStatus()\n assert.equal(status.state, \"error\")\n assert.equal(status.canUpgrade, true)\n assert.deepEqual(status.legacyReplacement, legacyReplacement)\n await assert.rejects(service.upgrade(), (error: unknown) => error instanceof OpenCodeUpdateError && error.code === \"legacy_replacement_required\")\n assert.deepEqual(await service.upgrade({ replaceLegacy: legacyReplacement }), { success: true, version: minimum })\n assert.deepEqual(requests, [{ replaceLegacy: legacyReplacement }])\n})\n\ntest(\"bounded installation inputs settle before resolution on status and upgrade\", async () => {\n const order: string[] = []\n const service = new OpenCodeUpdateService(deps({\n prepareInstallation: async () => { order.push(\"prepare\") },\n resolveBinary: () => { order.push(\"resolve\"); return { path: \"opencode2\", label: \"OpenCode\" } },\n }))\n await service.getStatus()\n await service.upgrade()\n assert.deepEqual(order.slice(0, 2), [\"prepare\", \"resolve\"])\n assert.equal(order.filter(step => step === \"prepare\").length, 2)\n assert.ok(order.indexOf(\"prepare\", 1) < order.lastIndexOf(\"resolve\"))\n})\n\ntest(\"only an explicit recheck asks for fresh installation probes\", async () => {\n const rechecks: boolean[] = []\n const service = new OpenCodeUpdateService(deps({ prepareInstallation: async ({ recheck }) => { rechecks.push(recheck === true) } }))\n await service.getStatus()\n await service.getStatus({ recheck: true })\n await service.upgrade()\n assert.deepEqual(rechecks.slice(0, 2), [false, true])\n assert.ok(rechecks.slice(2).every(recheck => !recheck), \"installation and its follow-up reads never force a probe\")\n})\n\ntest(\"an unusable foreign command still offers OpenCode 2 beside it, never a repair\", async () => {\n let installed = false\n const foreignInstallation = { path: \"C:/winget/Links/opencode.exe\", source: \"winget\" as const, packageId: \"SST.opencode\" }\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => installed ? { path: \"managed\", label: \"OpenCode\", source: \"managed\" } : { path: foreignInstallation.path, label: \"OpenCode\", source: \"path\" },\n probeBinary: path => path === \"managed\" ? { valid: true, version: minimum } : { valid: false, error: \"not a valid application\" },\n inspectInstallation: () => ({ foreignInstallation }),\n upgradeBinary: async (_binary, target, options) => {\n assert.deepEqual(options, {})\n installed = true\n return { success: true, version: target }\n },\n }))\n const status = await service.getStatus()\n assert.equal(status.state, \"error\")\n assert.equal(status.canUpgrade, true)\n assert.deepEqual(status.foreignInstallation, foreignInstallation)\n assert.deepEqual(await service.upgrade(), { success: true, version: minimum })\n const after = await service.getStatus()\n assert.equal(after.installationSource, \"managed\")\n assert.equal(after.canUpgrade, false)\n assert.deepEqual(after.foreignInstallation, foreignInstallation, \"the untouched older command remains reported\")\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.1.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), /cannot safely replace/)\n})\n\ntest(\"optional upgrades retain explicit activation for an admitted but older daemon\", async () => {\n let installed = minimum, daemon = minimum, 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.1.3\",\n upgradeBinary: async () => { installed = \"2.1.3\"; 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(\"same-version troubleshooting restart is explicit for host and WSL; reload never restarts\", async () => {\n for (const binaryPath of [\"/fixture/opencode\", \"\\\\\\\\wsl.localhost\\\\Ubuntu\\\\usr\\\\bin\\\\opencode\"]) {\n let pid = 123, restarts = 0, reloads = 0, reconnects = 0\n const endpoint = () => {\n const value: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(value, { version: minimum, pid, discovery: \"info\" })\n return value\n }\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: binaryPath, label: \"Fixture\" }),\n probeBinary: () => ({ valid: true, version: minimum }), resolveLatestVersion: async () => minimum,\n lifecycle: async () => ({ discover: async () => endpoint(), ensure: async () => { assert.fail(\"retain the running daemon\") },\n restart: async () => { restarts++; pid++; return endpoint() } }),\n upgradeBinary: async () => { assert.fail(\"restart must not install a version\") },\n reload: async () => { reloads++ }, reconnect: async () => { reconnects++ },\n }))\n const status = await service.getStatus()\n assert.equal(status.serviceState, \"ready\")\n assert.equal(status.updateAvailable, false)\n assert.equal(status.canRestart, true)\n assert.equal(status.canReload, true)\n await service.start()\n await service.reload()\n assert.equal(restarts, 0)\n assert.equal(pid, 123, \"configuration reload preserves the process\")\n assert.equal(reloads, 1)\n const restarted = await service.start(true)\n assert.equal(restarts, 1)\n assert.equal(pid, 124)\n assert.equal(reconnects, 2)\n assert.equal(restarted.serviceState, \"ready\")\n assert.equal(restarted.canRestart, true, \"troubleshooting stays available after a restart\")\n }\n})\n\ntest(\"troubleshooting restart refuses unknown identity/builds and a newer daemon\", async () => {\n for (const version of [undefined, \"custom-build\", \"2.1.3\"]) {\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n if (version) rememberRuntime(endpoint, { version, pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: minimum }),\n lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => { assert.fail(\"no fallback start\") },\n restart: async () => { assert.fail(\"must not stop an unverified or newer daemon\") } }),\n }))\n assert.equal((await service.getStatus()).canRestart, false)\n await assert.rejects(service.start(true), /cannot safely replace/)\n }\n})\n\ntest(\"same-version restart coalesces, excludes reload, and never retries a failed mutation\", async () => {\n let restarts = 0, reconnects = 0\n let release!: () => void, entered!: () => void\n const gate = new Promise<void>(resolve => { release = resolve })\n const reached = new Promise<void>(resolve => { entered = resolve })\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version: minimum, pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: minimum }),\n lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => { assert.fail(\"no fallback start\") },\n restart: async () => { restarts++; entered(); await gate; throw new Error(\"restart failed\") } }),\n reconnect: async () => { reconnects++ },\n }))\n const first = service.start(true)\n assert.equal(service.start(true), first)\n await reached\n await assert.rejects(service.reload(), /action is in progress/)\n assert.equal(restarts, 1)\n release()\n await assert.rejects(first, /restart failed/)\n assert.equal(restarts, 1)\n assert.equal(reconnects, 0)\n})\n\ntest(\"a lifecycle without restart cannot expose or silently emulate it\", async () => {\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version: minimum, pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: minimum }),\n lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => { assert.fail(\"no fallback start\") } }),\n }))\n assert.equal((await service.getStatus()).canRestart, false)\n await assert.rejects(service.start(true), /restart unavailable/)\n})\n\ntest(\"explicit configuration reload is admitted, fenced and serialized with service actions\", async () => {\n let selected = \"/fixture/opencode\", version = minimum, 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: minimum }),\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: minimum, pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: selected, label: \"Fixture\" }),\n probeBinary: () => ({ valid: true, version: \"2.1.3\" }),\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(\"the native contract floor admits current and newer runtimes without a tested-version allowlist\", async () => {\n for (const version of [\"2.1.2\", \"2.1.3\", \"2.2.0\", \"3.0.0\"]) {\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.1.3\",\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.1.2\")\n assert.equal(status.recommendedVersion, \"2.1.2\")\n assert.equal(status.state, \"ready\")\n assert.equal(status.serviceState, \"ready\")\n assert.equal(status.versionAssessment, version === \"2.1.2\" ? \"tested\" : \"untested\", \"only the current recommendation is release-qualified\")\n assert.equal(status.incompatibilityReason, undefined)\n assert.equal(status.canUpgrade, version === \"2.1.2\", \"offer an optional upgrade below the target; never downgrade current or newer runtimes\")\n assert.equal(status.canRestart, false)\n }\n})\n\ntest(\"older daemons require native replay and correct Code Mode ordering without being started or replaced\", async () => {\n for (const version of [\"2.0.27\", \"2.0.32\", \"2.1.0\", \"2.1.1\"]) {\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 () => minimum,\n lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => { throw new Error(\"must retain daemon\") } }),\n }))\n const status = await service.getStatus()\n assert.equal(status.state, \"update_required\")\n assert.equal(status.incompatibilityReason, \"native_contract\")\n assert.equal(status.versionAssessment, \"incompatible\")\n // Admission refuses the daemon itself; it is never started, restarted or replaced implicitly.\n await assert.rejects(service.start(), /opencode_update_required.*Code Mode job ordering fixed in 2.1.2/)\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: minimum, 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.1.2+custom-build\\n\", \"2.1.2+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, type UpgradeOptions } from \"./service\"\nimport { MINIMUM_OPENCODE_VERSION as minimum, RECOMMENDED_OPENCODE_VERSION as recommended } from \"../opencode/runtime-support\"\nimport { rememberRuntime } from \"../opencode/compatibility/runtime\"\nimport type { Endpoint } from \"@opencode/client/service\"\nimport { probeBinaryVersion } from \"../workspaces/spawn\"\nimport { LegacyReplacementError } from \"./shared-installation\"\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.1.3\" }),\n resolveLatestVersion: async () => minimum,\n upgradeBinary: async (_binary, target) => {\n assert.equal(target, \"2.1.3\")\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(\"OpenCode 1.x npm replacement requires explicit consent and reports failure after removal\", async () => {\n let version = \"1.18.10\", replaced = false\n const requests: UpgradeOptions[] = []\n const legacyReplacement = { path: \"C:/npm/opencode.cmd\", version: \"1.18.10\" }\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version }),\n inspectInstallation: () => replaced ? {} : { legacyReplacement },\n upgradeBinary: async (_binary, target, options) => {\n requests.push(options)\n // The first consented attempt fails after removing 1.x.\n if (requests.length === 1) throw new LegacyReplacementError(\"legacy_removed_install_failed\", \"registry offline\")\n version = target; replaced = true\n return { success: true, version: target }\n },\n }))\n const status = await service.getStatus()\n assert.equal(status.canUpgrade, true)\n assert.deepEqual(status.legacyReplacement, legacyReplacement)\n await assert.rejects(service.upgrade(), (error: unknown) => error instanceof OpenCodeUpdateError && error.code === \"legacy_replacement_required\")\n for (const stale of [{ ...legacyReplacement, version: \"1.18.9\" }, { ...legacyReplacement, path: \"C:/other/opencode.cmd\" }]) {\n await assert.rejects(service.upgrade({ replaceLegacy: stale }), (error: unknown) => error instanceof OpenCodeUpdateError && error.code === \"legacy_replacement_required\")\n }\n assert.deepEqual(requests, [], \"no installer runs without consent to the exact installation\")\n await assert.rejects(service.upgrade({ replaceLegacy: legacyReplacement }), (error: unknown) => error instanceof OpenCodeUpdateError && error.code === \"legacy_removed_install_failed\")\n assert.deepEqual(await service.upgrade({ replaceLegacy: legacyReplacement }), { success: true, version: minimum })\n assert.deepEqual(requests, [{ replaceLegacy: legacyReplacement }, { replaceLegacy: legacyReplacement }])\n assert.equal((await service.getStatus()).legacyReplacement, undefined)\n})\n\ntest(\"a broken OpenCode 1.x npm install remains replaceable with consent\", async () => {\n let installed = false\n const legacyReplacement = { path: \"C:/npm/opencode.cmd\", version: \"1.18.10\" }\n const requests: UpgradeOptions[] = []\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: installed ? \"C:/npm/opencode2.cmd\" : legacyReplacement.path, label: \"OpenCode\", source: \"path\" }),\n // The published placeholder bin/opencode.exe fails when postinstall did not run.\n probeBinary: () => installed ? { valid: true, version: minimum } : { valid: false, error: \"Exited with code 1: postinstall script was not run\" },\n inspectInstallation: () => installed ? {} : { legacyReplacement },\n upgradeBinary: async (_binary, target, options) => { requests.push(options); installed = true; return { success: true, version: target } },\n }))\n const status = await service.getStatus()\n assert.equal(status.state, \"error\")\n assert.equal(status.canUpgrade, true)\n assert.deepEqual(status.legacyReplacement, legacyReplacement)\n await assert.rejects(service.upgrade(), (error: unknown) => error instanceof OpenCodeUpdateError && error.code === \"legacy_replacement_required\")\n assert.deepEqual(await service.upgrade({ replaceLegacy: legacyReplacement }), { success: true, version: minimum })\n assert.deepEqual(requests, [{ replaceLegacy: legacyReplacement }])\n})\n\ntest(\"bounded installation inputs settle before resolution on status and upgrade\", async () => {\n const order: string[] = []\n const service = new OpenCodeUpdateService(deps({\n prepareInstallation: async () => { order.push(\"prepare\") },\n resolveBinary: () => { order.push(\"resolve\"); return { path: \"opencode2\", label: \"OpenCode\" } },\n }))\n await service.getStatus()\n await service.upgrade()\n assert.deepEqual(order.slice(0, 2), [\"prepare\", \"resolve\"])\n assert.equal(order.filter(step => step === \"prepare\").length, 2)\n assert.ok(order.indexOf(\"prepare\", 1) < order.lastIndexOf(\"resolve\"))\n})\n\ntest(\"only an explicit recheck asks for fresh installation probes\", async () => {\n const rechecks: boolean[] = []\n const service = new OpenCodeUpdateService(deps({ prepareInstallation: async ({ recheck }) => { rechecks.push(recheck === true) } }))\n await service.getStatus()\n await service.getStatus({ recheck: true })\n await service.upgrade()\n assert.deepEqual(rechecks.slice(0, 2), [false, true])\n assert.ok(rechecks.slice(2).every(recheck => !recheck), \"installation and its follow-up reads never force a probe\")\n})\n\ntest(\"an unusable foreign command still offers OpenCode 2 beside it, never a repair\", async () => {\n let installed = false\n const foreignInstallation = { path: \"C:/winget/Links/opencode.exe\", source: \"winget\" as const, packageId: \"SST.opencode\" }\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => installed ? { path: \"managed\", label: \"OpenCode\", source: \"managed\" } : { path: foreignInstallation.path, label: \"OpenCode\", source: \"path\" },\n probeBinary: path => path === \"managed\" ? { valid: true, version: minimum } : { valid: false, error: \"not a valid application\" },\n inspectInstallation: () => ({ foreignInstallation }),\n upgradeBinary: async (_binary, target, options) => {\n assert.deepEqual(options, {})\n installed = true\n return { success: true, version: target }\n },\n }))\n const status = await service.getStatus()\n assert.equal(status.state, \"error\")\n assert.equal(status.canUpgrade, true)\n assert.deepEqual(status.foreignInstallation, foreignInstallation)\n assert.deepEqual(await service.upgrade(), { success: true, version: minimum })\n const after = await service.getStatus()\n assert.equal(after.installationSource, \"managed\")\n assert.equal(after.canUpgrade, false)\n assert.deepEqual(after.foreignInstallation, foreignInstallation, \"the untouched older command remains reported\")\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.1.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), /cannot safely replace/)\n})\n\ntest(\"optional upgrades retain explicit activation for an admitted but older daemon\", async () => {\n let installed = minimum, daemon = minimum, 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.1.3\",\n upgradeBinary: async () => { installed = \"2.1.3\"; 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(\"same-version troubleshooting restart is explicit for host and WSL; reload never restarts\", async () => {\n for (const binaryPath of [\"/fixture/opencode\", \"\\\\\\\\wsl.localhost\\\\Ubuntu\\\\usr\\\\bin\\\\opencode\"]) {\n let pid = 123, restarts = 0, reloads = 0, reconnects = 0\n const endpoint = () => {\n const value: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(value, { version: minimum, pid, discovery: \"info\" })\n return value\n }\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: binaryPath, label: \"Fixture\" }),\n probeBinary: () => ({ valid: true, version: minimum }), resolveLatestVersion: async () => minimum,\n lifecycle: async () => ({ discover: async () => endpoint(), ensure: async () => { assert.fail(\"retain the running daemon\") },\n restart: async () => { restarts++; pid++; return endpoint() } }),\n upgradeBinary: async () => { assert.fail(\"restart must not install a version\") },\n reload: async () => { reloads++ }, reconnect: async () => { reconnects++ },\n }))\n const status = await service.getStatus()\n assert.equal(status.serviceState, \"ready\")\n assert.equal(status.updateAvailable, false)\n assert.equal(status.canRestart, true)\n assert.equal(status.canReload, true)\n await service.start()\n await service.reload()\n assert.equal(restarts, 0)\n assert.equal(pid, 123, \"configuration reload preserves the process\")\n assert.equal(reloads, 1)\n const restarted = await service.start(true)\n assert.equal(restarts, 1)\n assert.equal(pid, 124)\n assert.equal(reconnects, 2)\n assert.equal(restarted.serviceState, \"ready\")\n assert.equal(restarted.canRestart, true, \"troubleshooting stays available after a restart\")\n }\n})\n\ntest(\"troubleshooting restart refuses unknown identity/builds and a newer daemon\", async () => {\n for (const version of [undefined, \"custom-build\", \"2.1.3\"]) {\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n if (version) rememberRuntime(endpoint, { version, pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: minimum }),\n lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => { assert.fail(\"no fallback start\") },\n restart: async () => { assert.fail(\"must not stop an unverified or newer daemon\") } }),\n }))\n assert.equal((await service.getStatus()).canRestart, false)\n await assert.rejects(service.start(true), /cannot safely replace/)\n }\n})\n\ntest(\"same-version restart coalesces, excludes reload, and never retries a failed mutation\", async () => {\n let restarts = 0, reconnects = 0\n let release!: () => void, entered!: () => void\n const gate = new Promise<void>(resolve => { release = resolve })\n const reached = new Promise<void>(resolve => { entered = resolve })\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version: minimum, pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: minimum }),\n lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => { assert.fail(\"no fallback start\") },\n restart: async () => { restarts++; entered(); await gate; throw new Error(\"restart failed\") } }),\n reconnect: async () => { reconnects++ },\n }))\n const first = service.start(true)\n assert.equal(service.start(true), first)\n await reached\n await assert.rejects(service.reload(), /action is in progress/)\n assert.equal(restarts, 1)\n release()\n await assert.rejects(first, /restart failed/)\n assert.equal(restarts, 1)\n assert.equal(reconnects, 0)\n})\n\ntest(\"a lifecycle without restart cannot expose or silently emulate it\", async () => {\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version: minimum, pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: minimum }),\n lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => { assert.fail(\"no fallback start\") } }),\n }))\n assert.equal((await service.getStatus()).canRestart, false)\n await assert.rejects(service.start(true), /restart unavailable/)\n})\n\ntest(\"explicit configuration reload is admitted, fenced and serialized with service actions\", async () => {\n let selected = \"/fixture/opencode\", version = minimum, 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: minimum }),\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: minimum, pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: selected, label: \"Fixture\" }),\n probeBinary: () => ({ valid: true, version: \"2.1.3\" }),\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(\"the native contract floor admits current and newer runtimes without a tested-version allowlist\", async () => {\n for (const version of [\"2.1.2\", \"2.1.3\", \"2.2.0\", \"3.0.0\"]) {\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.1.3\",\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.1.2\")\n assert.equal(status.recommendedVersion, \"2.1.3\")\n assert.equal(status.state, \"ready\")\n assert.equal(status.serviceState, \"ready\")\n assert.equal(status.versionAssessment, version === \"2.1.3\" ? \"tested\" : \"untested\", \"only the current recommendation is release-qualified\")\n assert.equal(status.incompatibilityReason, undefined)\n assert.equal(status.canUpgrade, version === \"2.1.2\", \"offer an optional upgrade below the target; never downgrade current or newer runtimes\")\n assert.equal(status.canRestart, false)\n }\n})\n\ntest(\"older daemons require native replay and correct Code Mode ordering without being started or replaced\", async () => {\n for (const version of [\"2.0.27\", \"2.0.32\", \"2.1.0\", \"2.1.1\"]) {\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 () => minimum,\n lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => { throw new Error(\"must retain daemon\") } }),\n }))\n const status = await service.getStatus()\n assert.equal(status.state, \"update_required\")\n assert.equal(status.incompatibilityReason, \"native_contract\")\n assert.equal(status.versionAssessment, \"incompatible\")\n // Admission refuses the daemon itself; it is never started, restarted or replaced implicitly.\n await assert.rejects(service.start(), /opencode_update_required.*Code Mode job ordering fixed in 2.1.2/)\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: recommended, 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.1.2+custom-build\\n\", \"2.1.2+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": "1.0.0-dev-20261022-f8763d7d",
3
+ "version": "1.0.0-dev-20261022-aa9bbc14",
4
4
  "description": "CodeNomad Server",
5
5
  "license": "MIT",
6
6
  "author": {
Binary file