@neuralnomads/codenomad-dev 0.20.0-dev-20261004-04654996 → 0.20.0-dev-20261006-68e4d2a4

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 (88) hide show
  1. package/dist/opencode-update/service.js +12 -4
  2. package/dist/opencode-update/service.js.map +1 -1
  3. package/dist/opencode-update/service.test.js +82 -1
  4. package/dist/opencode-update/service.test.js.map +1 -1
  5. package/package.json +1 -1
  6. package/public/assets/App-C6RRPQjw.js +60 -0
  7. package/public/assets/App-C6RRPQjw.js.map +1 -0
  8. package/public/assets/{FilesPanel-Bg9Ev8Cx.js → FilesPanel-D3Tv6ikU.js} +4 -4
  9. package/public/assets/{FilesPanel-Bg9Ev8Cx.js.map → FilesPanel-D3Tv6ikU.js.map} +1 -1
  10. package/public/assets/{StatusTab-NcOoprrt.js → StatusTab-CEicS950.js} +2 -2
  11. package/public/assets/{StatusTab-NcOoprrt.js.map → StatusTab-CEicS950.js.map} +1 -1
  12. package/public/assets/{bundle-full-D8FTV41e.js → bundle-full-c_hJgr0i.js} +2 -2
  13. package/public/assets/{bundle-full-D8FTV41e.js.map → bundle-full-c_hJgr0i.js.map} +1 -1
  14. package/public/assets/{client-state-DEqau4Dz.js → client-state-CQmOn9Rh.js} +2 -2
  15. package/public/assets/{client-state-DEqau4Dz.js.map → client-state-CQmOn9Rh.js.map} +1 -1
  16. package/public/assets/{diff-viewer-BbHJUNvB.js → diff-viewer-Dd6A7Puj.js} +2 -2
  17. package/public/assets/{diff-viewer-BbHJUNvB.js.map → diff-viewer-Dd6A7Puj.js.map} +1 -1
  18. package/public/assets/index-6B9npBDe.js +2 -0
  19. package/public/assets/index-6B9npBDe.js.map +1 -0
  20. package/public/assets/index-B0wYpJej.js +2 -0
  21. package/public/assets/{index-CZNpuSQW.js.map → index-B0wYpJej.js.map} +1 -1
  22. package/public/assets/index-CD_VBvSQ.js +2 -0
  23. package/public/assets/index-CD_VBvSQ.js.map +1 -0
  24. package/public/assets/index-CKTHs8VA.css +1 -0
  25. package/public/assets/index-CeZVJftZ.js +3 -0
  26. package/public/assets/index-CeZVJftZ.js.map +1 -0
  27. package/public/assets/index-Chx8aDRv.js +2 -0
  28. package/public/assets/index-Chx8aDRv.js.map +1 -0
  29. package/public/assets/index-Cq0Fe7Qt.js +2 -0
  30. package/public/assets/index-Cq0Fe7Qt.js.map +1 -0
  31. package/public/assets/{index-B0djNrWY.js → index-Dw3a2-TZ.js} +2 -2
  32. package/public/assets/{index-B0djNrWY.js.map → index-Dw3a2-TZ.js.map} +1 -1
  33. package/public/assets/index-M2Ql6ytj.js +2 -0
  34. package/public/assets/index-M2Ql6ytj.js.map +1 -0
  35. package/public/assets/index-RIsDXCgx.js +2 -0
  36. package/public/assets/index-RIsDXCgx.js.map +1 -0
  37. package/public/assets/index-WBIVP_eD.js +2 -0
  38. package/public/assets/index-WBIVP_eD.js.map +1 -0
  39. package/public/assets/index-c9M7DomZ.js +2 -0
  40. package/public/assets/index-c9M7DomZ.js.map +1 -0
  41. package/public/assets/index-m-KTpmpF.js +2 -0
  42. package/public/assets/index-m-KTpmpF.js.map +1 -0
  43. package/public/assets/{loading-AGi3Qn1M.js → loading-I_lkQL9B.js} +2 -2
  44. package/public/assets/{loading-AGi3Qn1M.js.map → loading-I_lkQL9B.js.map} +1 -1
  45. package/public/assets/main-zZdX3SZd.js +43 -0
  46. package/public/assets/main-zZdX3SZd.js.map +1 -0
  47. package/public/assets/{markdown-B3IPZgpj.js → markdown-CTb8hMQW.js} +4 -4
  48. package/public/assets/{markdown-B3IPZgpj.js.map → markdown-CTb8hMQW.js.map} +1 -1
  49. package/public/assets/{monaco-viewer-DJNtcp6e.js → monaco-viewer-K1ArMlV1.js} +2 -2
  50. package/public/assets/{monaco-viewer-DJNtcp6e.js.map → monaco-viewer-K1ArMlV1.js.map} +1 -1
  51. package/public/assets/{startup-state-settings-card-DxQTf968.js → startup-state-settings-card-BSqEp863.js} +2 -2
  52. package/public/assets/{startup-state-settings-card-DxQTf968.js.map → startup-state-settings-card-BSqEp863.js.map} +1 -1
  53. package/public/assets/{terminal-square-BZB08aj1.js → terminal-square-LJhOVYBY.js} +2 -2
  54. package/public/assets/{terminal-square-BZB08aj1.js.map → terminal-square-LJhOVYBY.js.map} +1 -1
  55. package/public/assets/{tool-call-cERLajbL.js → tool-call-B0m_rXBP.js} +4 -4
  56. package/public/assets/{tool-call-cERLajbL.js.map → tool-call-B0m_rXBP.js.map} +1 -1
  57. package/public/assets/{unified-picker-DXjAYq1E.js → unified-picker-DhVSh8Ee.js} +2 -2
  58. package/public/assets/{unified-picker-DXjAYq1E.js.map → unified-picker-DhVSh8Ee.js.map} +1 -1
  59. package/public/index.html +4 -4
  60. package/public/loading.html +4 -4
  61. package/public/sw.js +1 -1
  62. package/public/sw.js.map +1 -1
  63. package/public/assets/App-CHtzrtYl.js +0 -60
  64. package/public/assets/App-CHtzrtYl.js.map +0 -1
  65. package/public/assets/index-BJmMiBzi.js +0 -2
  66. package/public/assets/index-BJmMiBzi.js.map +0 -1
  67. package/public/assets/index-Bg8zhM7M.js +0 -2
  68. package/public/assets/index-Bg8zhM7M.js.map +0 -1
  69. package/public/assets/index-CFv0kC-c.js +0 -2
  70. package/public/assets/index-CFv0kC-c.js.map +0 -1
  71. package/public/assets/index-CZNpuSQW.js +0 -2
  72. package/public/assets/index-D2u30fvq.js +0 -2
  73. package/public/assets/index-D2u30fvq.js.map +0 -1
  74. package/public/assets/index-DLAqD_-0.js +0 -2
  75. package/public/assets/index-DLAqD_-0.js.map +0 -1
  76. package/public/assets/index-DLcK6r44.js +0 -2
  77. package/public/assets/index-DLcK6r44.js.map +0 -1
  78. package/public/assets/index-DYl6Agtg.js +0 -2
  79. package/public/assets/index-DYl6Agtg.js.map +0 -1
  80. package/public/assets/index-Dcwfvmx7.js +0 -2
  81. package/public/assets/index-Dcwfvmx7.js.map +0 -1
  82. package/public/assets/index-DuxCmr22.js +0 -2
  83. package/public/assets/index-DuxCmr22.js.map +0 -1
  84. package/public/assets/index-lWqguURF.css +0 -1
  85. package/public/assets/index-wJBJOVOC.js +0 -3
  86. package/public/assets/index-wJBJOVOC.js.map +0 -1
  87. package/public/assets/main-CmyWOck6.js +0 -43
  88. package/public/assets/main-CmyWOck6.js.map +0 -1
@@ -80,7 +80,8 @@ export class OpenCodeUpdateService {
80
80
  }
81
81
  }
82
82
  status.canRestart = Boolean(lifecycle.restart) && state === "ready"
83
- && (status.serviceState === "restart_required" || status.serviceState === "restart_available");
83
+ && (status.serviceState === "ready" || status.serviceState === "restart_required" || status.serviceState === "restart_available")
84
+ && canReplaceDaemon(currentVersion, identity?.version);
84
85
  }
85
86
  catch {
86
87
  status.serviceState = "error";
@@ -131,14 +132,15 @@ export class OpenCodeUpdateService {
131
132
  const lifecycle = await this.deps.lifecycle?.(binary);
132
133
  if (!lifecycle)
133
134
  throw new Error("OpenCode service lifecycle unavailable");
135
+ if (restart && !lifecycle.restart)
136
+ throw new Error("OpenCode service restart unavailable");
134
137
  const previous = await lifecycle.discover();
135
138
  if (!previous || restart)
136
139
  assertSupportedOpenCode(installedVersion);
137
140
  if (restart && previous) {
138
141
  const identity = runtimeIdentity(previous);
139
- if (!identity || !comparableVersion(identity.version) || !comparableVersion(installedVersion)
140
- || compareOpenCodeVersionStrings(installedVersion, identity.version) <= 0) {
141
- throw new Error("The shared daemon is not an older runtime eligible for this update");
142
+ if (!canReplaceDaemon(installedVersion, identity?.version)) {
143
+ throw new Error("The selected OpenCode executable cannot safely replace the running daemon");
142
144
  }
143
145
  }
144
146
  const assertCurrent = () => {
@@ -283,6 +285,12 @@ export function createOpenCodeUpdateService(settings, workspaceManager) {
283
285
  reload: (binary, assertCurrent) => workspaceManager.reloadConfigurationAfterSetup(binary.path, assertCurrent),
284
286
  });
285
287
  }
288
+ // Explicit troubleshooting can replace the same release, but must retain the
289
+ // update path's authenticated-version fence against downgrades/unknown builds.
290
+ function canReplaceDaemon(installed, running) {
291
+ return Boolean(installed && running && comparableVersion(installed) && comparableVersion(running)
292
+ && compareOpenCodeVersionStrings(installed, running) >= 0);
293
+ }
286
294
  function comparableVersion(version) {
287
295
  return /^\d+\.\d+\.\d+$/.test(version) || /^0\.0\.0-beta-\d+$/.test(version);
288
296
  }
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/opencode-update/service.ts"],"names":[],"mappings":"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","sourcesContent":["import { fetch } from \"undici\"\nimport type { OpenCodeUpdateResponse, OpenCodeUpdateStatus } from \"../api-types\"\nimport type { SettingsService } from \"../settings/service\"\nimport { BinaryResolver, type ResolvedBinary } from \"../settings/binaries\"\nimport type { WorkspaceManager } from \"../workspaces/manager\"\nimport { probeBinaryVersion, probeBinaryVersionAsync } from \"../workspaces/spawn\"\nimport { compareVersionStrings, stripTagPrefix } from \"../releases/release-monitor\"\nimport { assertSupportedOpenCode, isBelowOpenCodeMinimum, MINIMUM_OPENCODE_VERSION, RECOMMENDED_OPENCODE_VERSION, UnsupportedOpenCodeError } from \"../opencode/runtime-support\"\nimport { contractProfile, runtimeIdentity } from \"../opencode/compatibility/runtime\"\nimport { createRuntimeTransport } from \"../opencode/compatibility/transport\"\nimport type { Endpoint } from \"@opencode/client/service\"\nimport { bundledNpm } from \"./npm-runtime\"\nimport { isRetiredInstallation } from \"./retired-installation\"\nimport { installSharedOpenCode, sharedInstallPrefix } from \"./shared-installation\"\nimport { InstallationBusyError } from \"./installation-lock\"\nimport type { OpenCodeServiceLifecycle } from \"../workspaces/opencode-service\"\nimport { parseWslUncPath } from \"../workspaces/spawn\"\n\nconst OPENCODE_REGISTRY_URL = \"https://registry.npmjs.org/-/package/%40opencode%2Fcli/dist-tags\"\nexport const TARGET_OPENCODE_CHANNEL = \"latest\"\nconst inFlightUpgrades = new Map<string, Promise<OpenCodeUpdateResponse>>()\ntype ServiceAction = \"start\" | \"restart\" | \"reload\"\n\ntype UpgradeResult = { success: true; version: string } | { success: false; error: string }\n\nexport interface OpenCodeUpdateServiceDeps {\n resolveBinary: () => ResolvedBinary\n probeBinary: (path: string) => ReturnType<typeof probeBinaryVersion> | Promise<ReturnType<typeof probeBinaryVersion>>\n resolveLatestVersion: () => Promise<string>\n canUpgradeBinary: (binary: ResolvedBinary) => boolean\n upgradeBinary: (binary: ResolvedBinary, target: string) => Promise<UpgradeResult>\n lifecycle?: (binary: ResolvedBinary) => Promise<OpenCodeServiceLifecycle>\n reconnect?: (binary: ResolvedBinary) => Promise<void>\n admitActivation?: (binary: ResolvedBinary) => void\n reload?: (binary: ResolvedBinary, assertCurrent: () => void) => Promise<void>\n inspectRuntime?: (endpoint: Endpoint) => Promise<{ reload: boolean }>\n}\n\nexport class OpenCodeUpdateError extends Error {\n constructor(\n readonly code:\n | \"binary_unavailable\"\n | \"unsupported_binary\"\n | \"update_check_failed\"\n | \"upgrade_failed\"\n | \"upgrade_verification_failed\",\n message: string,\n ) {\n super(message)\n this.name = \"OpenCodeUpdateError\"\n }\n}\n\nexport class OpenCodeUpdateService {\n private activation?: { binaryPath: string; action: ServiceAction; pending: Promise<OpenCodeUpdateStatus> }\n\n constructor(private readonly deps: OpenCodeUpdateServiceDeps) {}\n\n async getStatus(): Promise<OpenCodeUpdateStatus> {\n const binary = this.deps.resolveBinary()\n let currentVersion: string | null = null\n let missing = false\n let invalid = false\n const probe = await this.deps.probeBinary(binary.path)\n try { currentVersion = await this.readCurrentVersion(binary.path, probe) }\n catch { missing = probe.missing === true; invalid = !missing }\n let latestVersion: string | null = null\n try { latestVersion = await this.readLatestVersion() } catch { /* Local admission remains available offline. */ }\n const state = invalid ? \"error\" : missing ? \"missing\"\n : currentVersion && !isBelowOpenCodeMinimum(currentVersion) ? \"ready\" : \"update_required\"\n const updateAvailable = latestVersion && (!currentVersion || comparableVersion(currentVersion))\n ? !currentVersion || compareOpenCodeVersionStrings(latestVersion, currentVersion) > 0 : null\n const status: OpenCodeUpdateStatus = {\n currentVersion, latestVersion, updateAvailable,\n canUpgrade: !invalid && Boolean(updateAvailable || needsSharedInstallation(binary)) && Boolean(latestVersion && !isBelowOpenCodeMinimum(latestVersion)) && this.deps.canUpgradeBinary(binary),\n minimumVersion: MINIMUM_OPENCODE_VERSION, recommendedVersion: RECOMMENDED_OPENCODE_VERSION,\n versionAssessment: \"untested\", state, binaryPath: binary.path,\n installationSource: binary.source, needsSharedInstallation: needsSharedInstallation(binary),\n target: parseWslUncPath(binary.path) ? \"wsl\" : \"host\", canRestart: false,\n ...(!latestVersion ? { checkError: \"update_check_failed\" as const } : {}),\n }\n if (!missing && !invalid && this.deps.lifecycle) {\n try {\n const lifecycle = await this.deps.lifecycle(binary)\n const endpoint = await lifecycle.discover()\n const identity = endpoint && runtimeIdentity(endpoint)\n status.daemonVersion = identity?.version\n const olderDaemon = identity && currentVersion && comparableVersion(identity.version) && comparableVersion(currentVersion)\n && compareOpenCodeVersionStrings(currentVersion, identity.version) > 0\n status.serviceState = \"stopped\"\n if (endpoint) {\n try {\n const capabilities = await this.inspectRuntime(endpoint)\n status.serviceState = olderDaemon ? \"restart_available\" : \"ready\"\n // The running daemon, not an older discovery CLI, serves requests.\n status.state = \"ready\"\n status.canReload = Boolean(this.deps.reload) && capabilities.reload\n } catch (error) {\n if (!(error instanceof UnsupportedOpenCodeError)) throw error\n status.incompatibilityReason = error.reason\n status.serviceState = olderDaemon ? \"restart_required\" : \"incompatible\"\n }\n }\n status.canRestart = Boolean(lifecycle.restart) && state === \"ready\"\n && (status.serviceState === \"restart_required\" || status.serviceState === \"restart_available\")\n } catch { status.serviceState = \"error\"; status.serviceError = \"service_check_failed\" }\n }\n const effectiveVersion = status.daemonVersion ?? currentVersion\n if (!status.incompatibilityReason && effectiveVersion && isBelowOpenCodeMinimum(effectiveVersion)) status.incompatibilityReason = \"step_timestamp\"\n status.versionAssessment = status.incompatibilityReason ? \"incompatible\"\n : effectiveVersion === RECOMMENDED_OPENCODE_VERSION ? \"tested\" : \"untested\"\n return status\n }\n\n private async inspectRuntime(endpoint: Endpoint): Promise<{ reload: boolean }> {\n const identity = runtimeIdentity(endpoint)\n if (!identity) throw new Error(\"OpenCode did not report an authenticated runtime version\")\n assertSupportedOpenCode(identity.version)\n if (this.deps.inspectRuntime) return this.deps.inspectRuntime(endpoint)\n await createRuntimeTransport(endpoint).profile()\n return { reload: identity.contract?.reload ?? contractProfile(identity) === \"modern\" }\n }\n\n start(restart = false): Promise<OpenCodeUpdateStatus> {\n return this.runServiceAction(restart ? \"restart\" : \"start\")\n }\n\n reload(): Promise<OpenCodeUpdateStatus> {\n return this.runServiceAction(\"reload\")\n }\n\n private runServiceAction(action: ServiceAction): Promise<OpenCodeUpdateStatus> {\n const binary = this.deps.resolveBinary()\n // One updater owns one manager/shared-service authority. Executable selection\n // is mutable and cannot be the lock key for daemon-wide operations.\n const existing = this.activation\n if (existing) return existing.action === action && existing.binaryPath === binary.path\n ? existing.pending : Promise.reject(new Error(\"Another OpenCode service action is in progress\"))\n const pending = this.activate(binary, action).finally(() => {\n if (this.activation?.pending === pending) this.activation = undefined\n })\n this.activation = { binaryPath: binary.path, action, pending }\n return pending\n }\n\n private async activate(binary: ResolvedBinary, action: ServiceAction): Promise<OpenCodeUpdateStatus> {\n const restart = action === \"restart\"\n const installedVersion = await this.readCurrentVersion(binary.path)\n const lifecycle = await this.deps.lifecycle?.(binary)\n if (!lifecycle) throw new Error(\"OpenCode service lifecycle unavailable\")\n const previous = await lifecycle.discover()\n if (!previous || restart) assertSupportedOpenCode(installedVersion)\n if (restart && previous) {\n const identity = runtimeIdentity(previous)\n if (!identity || !comparableVersion(identity.version) || !comparableVersion(installedVersion)\n || compareOpenCodeVersionStrings(installedVersion, identity.version) <= 0) {\n throw new Error(\"The shared daemon is not an older runtime eligible for this update\")\n }\n }\n const assertCurrent = () => {\n if (this.deps.resolveBinary().path !== binary.path) throw new Error(\"OpenCode selection changed during activation\")\n this.deps.admitActivation?.(binary)\n }\n assertCurrent()\n if (action === \"reload\") {\n const identity = previous && runtimeIdentity(previous)\n if (!identity || !this.deps.reload) throw new Error(\"OpenCode configuration reload unavailable\")\n const capabilities = await this.inspectRuntime(previous!)\n if (!capabilities.reload) throw new Error(\"OpenCode does not expose configuration reload\")\n assertCurrent()\n // Explicit daemon-wide mutation: never use this as an automatic watcher\n // fallback, because native reload cancels pending Forms and permissions.\n await this.deps.reload(binary, assertCurrent)\n assertCurrent()\n return this.getStatus()\n }\n const endpoint = restart && previous ? await lifecycle.restart?.() : previous ?? await lifecycle.ensure()\n const identity = endpoint && runtimeIdentity(endpoint)\n if (!identity) throw new Error(\"OpenCode did not report an authenticated runtime version\")\n await this.inspectRuntime(endpoint!)\n if (this.deps.resolveBinary().path !== binary.path) throw new Error(\"OpenCode selection changed during activation\")\n await this.deps.reconnect?.(binary)\n return this.getStatus()\n }\n\n upgrade(): Promise<OpenCodeUpdateResponse> {\n const binary = this.deps.resolveBinary()\n const existing = inFlightUpgrades.get(binary.path)\n if (existing) return existing\n\n const pending = this.performUpgrade(binary).finally(() => {\n if (inFlightUpgrades.get(binary.path) === pending) inFlightUpgrades.delete(binary.path)\n })\n inFlightUpgrades.set(binary.path, pending)\n return pending\n }\n\n private async performUpgrade(binary: ResolvedBinary): Promise<OpenCodeUpdateResponse> {\n const probe = await this.deps.probeBinary(binary.path)\n const currentVersion = probe.missing ? null : await this.readCurrentVersion(binary.path, probe)\n const latestVersion = await this.readLatestVersion()\n assertSupportedOpenCode(latestVersion)\n\n if (currentVersion && !comparableVersion(currentVersion)) {\n throw new OpenCodeUpdateError(\"unsupported_binary\", \"Cannot order this custom OpenCode version for an automatic update\")\n }\n\n if (currentVersion && compareOpenCodeVersionStrings(latestVersion, currentVersion) <= 0 && !needsSharedInstallation(binary)) {\n return { success: true, version: currentVersion }\n }\n\n if (!this.deps.canUpgradeBinary(binary)) {\n throw new OpenCodeUpdateError(\n \"unsupported_binary\",\n \"Automatic updates require the default command and a writable npm installation\",\n )\n }\n\n try {\n const targetVersion = currentVersion && compareOpenCodeVersionStrings(currentVersion, latestVersion) > 0 ? currentVersion : latestVersion\n const result = await this.deps.upgradeBinary(binary, targetVersion)\n if (!result.success) {\n throw new OpenCodeUpdateError(\"upgrade_failed\", result.error)\n }\n const installedVersion = await this.readCurrentVersion(this.deps.resolveBinary().path)\n if (isBelowOpenCodeMinimum(installedVersion) || !/^\\d+\\.\\d+\\.\\d+$/.test(installedVersion) || compareOpenCodeVersionStrings(installedVersion, targetVersion) < 0) {\n throw new OpenCodeUpdateError(\n \"upgrade_verification_failed\",\n `OpenCode reported ${result.version}, but the configured binary is ${installedVersion} instead of ${latestVersion}`,\n )\n }\n return { success: true, version: installedVersion }\n } catch (error) {\n if (error instanceof OpenCodeUpdateError || error instanceof InstallationBusyError) throw error\n throw new OpenCodeUpdateError(\n \"upgrade_failed\",\n error instanceof Error ? error.message : \"OpenCode upgrade failed\",\n )\n }\n }\n\n private async readCurrentVersion(binaryPath: string, probe?: ReturnType<typeof probeBinaryVersion>): Promise<string> {\n if (process.platform === \"win32\" && /[\"\\r\\n]/.test(binaryPath)) {\n throw new OpenCodeUpdateError(\"binary_unavailable\", \"The configured OpenCode binary path is invalid\")\n }\n const result = probe ?? await this.deps.probeBinary(binaryPath)\n if (!result.valid) {\n throw new OpenCodeUpdateError(\"binary_unavailable\", result.error ?? \"Unable to read OpenCode version\")\n }\n // Successful unknown/empty labels are diagnostic information. Admission is\n // established against the authenticated daemon, not inferred from this label.\n return result.version?.trim() || \"unknown\"\n }\n\n private async readLatestVersion(): Promise<string> {\n try {\n const version = stripTagPrefix(await this.deps.resolveLatestVersion())\n if (!version) throw new Error(`The ${TARGET_OPENCODE_CHANNEL} channel did not resolve to a version`)\n return version\n } catch (error) {\n throw new OpenCodeUpdateError(\n \"update_check_failed\",\n error instanceof Error ? error.message : \"Unable to resolve the latest stable OpenCode release\",\n )\n }\n }\n}\n\nexport function compareOpenCodeVersionStrings(left: string, right: string): number {\n const leftBeta = stripTagPrefix(left)?.match(/^0\\.0\\.0-beta-(\\d+)$/)\n const rightBeta = stripTagPrefix(right)?.match(/^0\\.0\\.0-beta-(\\d+)$/)\n if (leftBeta && rightBeta) return Number(leftBeta[1]) - Number(rightBeta[1])\n return compareVersionStrings(left, right)\n}\n\ntype RegistryFetch = (\n url: string,\n init: Parameters<typeof fetch>[1],\n) => Promise<Pick<Awaited<ReturnType<typeof fetch>>, \"ok\" | \"status\" | \"json\">>\n\nexport async function resolveLatestOpenCodeVersion(fetchRegistry: RegistryFetch = fetch): Promise<string> {\n const response = await fetchRegistry(OPENCODE_REGISTRY_URL, {\n headers: { Accept: \"application/json\" },\n signal: AbortSignal.timeout(10_000),\n })\n if (!response.ok) throw new Error(`OpenCode registry responded with ${response.status}`)\n\n const metadata = (await response.json()) as Record<string, unknown>\n const version = metadata[TARGET_OPENCODE_CHANNEL]\n if (typeof version !== \"string\" || !/^\\d+\\.\\d+\\.\\d+$/.test(version)) {\n throw new Error(`The ${TARGET_OPENCODE_CHANNEL} channel did not resolve to a valid version`)\n }\n return version\n}\n\nexport function createOpenCodeUpdateService(\n settings: SettingsService,\n workspaceManager: WorkspaceManager,\n): OpenCodeUpdateService {\n const binaryResolver = new BinaryResolver(settings)\n return new OpenCodeUpdateService({\n resolveBinary: () => {\n const binary = binaryResolver.resolveDefault()\n return { ...binary, path: workspaceManager.resolveBinaryPath(binary.path) }\n },\n probeBinary: probeBinaryVersionAsync,\n resolveLatestVersion: resolveLatestOpenCodeVersion,\n canUpgradeBinary: binary => {\n const configured = settings.getOwner(\"config\", \"server\").opencodeBinary\n return !parseWslUncPath(binary.path) && (!configured || configured === \"opencode\" || configured === \"opencode2\" || (typeof configured === \"string\" && isRetiredInstallation(configured))) && Boolean(bundledNpm()) && Boolean(sharedInstallPrefix())\n },\n upgradeBinary: async (_binary, version) => {\n await installSharedOpenCode(version)\n return { success: true, version }\n },\n lifecycle: binary => workspaceManager.setupServiceOptions(binary.path).then(options => options.lifecycle),\n reconnect: binary => workspaceManager.reconnectAfterSetup(binary.path),\n admitActivation: binary => workspaceManager.assertSetupExecutionHost(binary.path),\n reload: (binary, assertCurrent) => workspaceManager.reloadConfigurationAfterSetup(binary.path, assertCurrent),\n })\n}\n\nfunction comparableVersion(version: string): boolean {\n return /^\\d+\\.\\d+\\.\\d+$/.test(version) || /^0\\.0\\.0-beta-\\d+$/.test(version)\n}\n\nfunction needsSharedInstallation(binary: ResolvedBinary): boolean {\n return binary.source === \"user\"\n}\n"]}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/opencode-update/service.ts"],"names":[],"mappings":"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","sourcesContent":["import { fetch } from \"undici\"\nimport type { OpenCodeUpdateResponse, OpenCodeUpdateStatus } from \"../api-types\"\nimport type { SettingsService } from \"../settings/service\"\nimport { BinaryResolver, type ResolvedBinary } from \"../settings/binaries\"\nimport type { WorkspaceManager } from \"../workspaces/manager\"\nimport { probeBinaryVersion, probeBinaryVersionAsync } from \"../workspaces/spawn\"\nimport { compareVersionStrings, stripTagPrefix } from \"../releases/release-monitor\"\nimport { assertSupportedOpenCode, isBelowOpenCodeMinimum, MINIMUM_OPENCODE_VERSION, RECOMMENDED_OPENCODE_VERSION, UnsupportedOpenCodeError } from \"../opencode/runtime-support\"\nimport { contractProfile, runtimeIdentity } from \"../opencode/compatibility/runtime\"\nimport { createRuntimeTransport } from \"../opencode/compatibility/transport\"\nimport type { Endpoint } from \"@opencode/client/service\"\nimport { bundledNpm } from \"./npm-runtime\"\nimport { isRetiredInstallation } from \"./retired-installation\"\nimport { installSharedOpenCode, sharedInstallPrefix } from \"./shared-installation\"\nimport { InstallationBusyError } from \"./installation-lock\"\nimport type { OpenCodeServiceLifecycle } from \"../workspaces/opencode-service\"\nimport { parseWslUncPath } from \"../workspaces/spawn\"\n\nconst OPENCODE_REGISTRY_URL = \"https://registry.npmjs.org/-/package/%40opencode%2Fcli/dist-tags\"\nexport const TARGET_OPENCODE_CHANNEL = \"latest\"\nconst inFlightUpgrades = new Map<string, Promise<OpenCodeUpdateResponse>>()\ntype ServiceAction = \"start\" | \"restart\" | \"reload\"\n\ntype UpgradeResult = { success: true; version: string } | { success: false; error: string }\n\nexport interface OpenCodeUpdateServiceDeps {\n resolveBinary: () => ResolvedBinary\n probeBinary: (path: string) => ReturnType<typeof probeBinaryVersion> | Promise<ReturnType<typeof probeBinaryVersion>>\n resolveLatestVersion: () => Promise<string>\n canUpgradeBinary: (binary: ResolvedBinary) => boolean\n upgradeBinary: (binary: ResolvedBinary, target: string) => Promise<UpgradeResult>\n lifecycle?: (binary: ResolvedBinary) => Promise<OpenCodeServiceLifecycle>\n reconnect?: (binary: ResolvedBinary) => Promise<void>\n admitActivation?: (binary: ResolvedBinary) => void\n reload?: (binary: ResolvedBinary, assertCurrent: () => void) => Promise<void>\n inspectRuntime?: (endpoint: Endpoint) => Promise<{ reload: boolean }>\n}\n\nexport class OpenCodeUpdateError extends Error {\n constructor(\n readonly code:\n | \"binary_unavailable\"\n | \"unsupported_binary\"\n | \"update_check_failed\"\n | \"upgrade_failed\"\n | \"upgrade_verification_failed\",\n message: string,\n ) {\n super(message)\n this.name = \"OpenCodeUpdateError\"\n }\n}\n\nexport class OpenCodeUpdateService {\n private activation?: { binaryPath: string; action: ServiceAction; pending: Promise<OpenCodeUpdateStatus> }\n\n constructor(private readonly deps: OpenCodeUpdateServiceDeps) {}\n\n async getStatus(): Promise<OpenCodeUpdateStatus> {\n const binary = this.deps.resolveBinary()\n let currentVersion: string | null = null\n let missing = false\n let invalid = false\n const probe = await this.deps.probeBinary(binary.path)\n try { currentVersion = await this.readCurrentVersion(binary.path, probe) }\n catch { missing = probe.missing === true; invalid = !missing }\n let latestVersion: string | null = null\n try { latestVersion = await this.readLatestVersion() } catch { /* Local admission remains available offline. */ }\n const state = invalid ? \"error\" : missing ? \"missing\"\n : currentVersion && !isBelowOpenCodeMinimum(currentVersion) ? \"ready\" : \"update_required\"\n const updateAvailable = latestVersion && (!currentVersion || comparableVersion(currentVersion))\n ? !currentVersion || compareOpenCodeVersionStrings(latestVersion, currentVersion) > 0 : null\n const status: OpenCodeUpdateStatus = {\n currentVersion, latestVersion, updateAvailable,\n canUpgrade: !invalid && Boolean(updateAvailable || needsSharedInstallation(binary)) && Boolean(latestVersion && !isBelowOpenCodeMinimum(latestVersion)) && this.deps.canUpgradeBinary(binary),\n minimumVersion: MINIMUM_OPENCODE_VERSION, recommendedVersion: RECOMMENDED_OPENCODE_VERSION,\n versionAssessment: \"untested\", state, binaryPath: binary.path,\n installationSource: binary.source, needsSharedInstallation: needsSharedInstallation(binary),\n target: parseWslUncPath(binary.path) ? \"wsl\" : \"host\", canRestart: false,\n ...(!latestVersion ? { checkError: \"update_check_failed\" as const } : {}),\n }\n if (!missing && !invalid && this.deps.lifecycle) {\n try {\n const lifecycle = await this.deps.lifecycle(binary)\n const endpoint = await lifecycle.discover()\n const identity = endpoint && runtimeIdentity(endpoint)\n status.daemonVersion = identity?.version\n const olderDaemon = identity && currentVersion && comparableVersion(identity.version) && comparableVersion(currentVersion)\n && compareOpenCodeVersionStrings(currentVersion, identity.version) > 0\n status.serviceState = \"stopped\"\n if (endpoint) {\n try {\n const capabilities = await this.inspectRuntime(endpoint)\n status.serviceState = olderDaemon ? \"restart_available\" : \"ready\"\n // The running daemon, not an older discovery CLI, serves requests.\n status.state = \"ready\"\n status.canReload = Boolean(this.deps.reload) && capabilities.reload\n } catch (error) {\n if (!(error instanceof UnsupportedOpenCodeError)) throw error\n status.incompatibilityReason = error.reason\n status.serviceState = olderDaemon ? \"restart_required\" : \"incompatible\"\n }\n }\n status.canRestart = Boolean(lifecycle.restart) && state === \"ready\"\n && (status.serviceState === \"ready\" || status.serviceState === \"restart_required\" || status.serviceState === \"restart_available\")\n && canReplaceDaemon(currentVersion, identity?.version)\n } catch { status.serviceState = \"error\"; status.serviceError = \"service_check_failed\" }\n }\n const effectiveVersion = status.daemonVersion ?? currentVersion\n if (!status.incompatibilityReason && effectiveVersion && isBelowOpenCodeMinimum(effectiveVersion)) status.incompatibilityReason = \"step_timestamp\"\n status.versionAssessment = status.incompatibilityReason ? \"incompatible\"\n : effectiveVersion === RECOMMENDED_OPENCODE_VERSION ? \"tested\" : \"untested\"\n return status\n }\n\n private async inspectRuntime(endpoint: Endpoint): Promise<{ reload: boolean }> {\n const identity = runtimeIdentity(endpoint)\n if (!identity) throw new Error(\"OpenCode did not report an authenticated runtime version\")\n assertSupportedOpenCode(identity.version)\n if (this.deps.inspectRuntime) return this.deps.inspectRuntime(endpoint)\n await createRuntimeTransport(endpoint).profile()\n return { reload: identity.contract?.reload ?? contractProfile(identity) === \"modern\" }\n }\n\n start(restart = false): Promise<OpenCodeUpdateStatus> {\n return this.runServiceAction(restart ? \"restart\" : \"start\")\n }\n\n reload(): Promise<OpenCodeUpdateStatus> {\n return this.runServiceAction(\"reload\")\n }\n\n private runServiceAction(action: ServiceAction): Promise<OpenCodeUpdateStatus> {\n const binary = this.deps.resolveBinary()\n // One updater owns one manager/shared-service authority. Executable selection\n // is mutable and cannot be the lock key for daemon-wide operations.\n const existing = this.activation\n if (existing) return existing.action === action && existing.binaryPath === binary.path\n ? existing.pending : Promise.reject(new Error(\"Another OpenCode service action is in progress\"))\n const pending = this.activate(binary, action).finally(() => {\n if (this.activation?.pending === pending) this.activation = undefined\n })\n this.activation = { binaryPath: binary.path, action, pending }\n return pending\n }\n\n private async activate(binary: ResolvedBinary, action: ServiceAction): Promise<OpenCodeUpdateStatus> {\n const restart = action === \"restart\"\n const installedVersion = await this.readCurrentVersion(binary.path)\n const lifecycle = await this.deps.lifecycle?.(binary)\n if (!lifecycle) throw new Error(\"OpenCode service lifecycle unavailable\")\n if (restart && !lifecycle.restart) throw new Error(\"OpenCode service restart unavailable\")\n const previous = await lifecycle.discover()\n if (!previous || restart) assertSupportedOpenCode(installedVersion)\n if (restart && previous) {\n const identity = runtimeIdentity(previous)\n if (!canReplaceDaemon(installedVersion, identity?.version)) {\n throw new Error(\"The selected OpenCode executable cannot safely replace the running daemon\")\n }\n }\n const assertCurrent = () => {\n if (this.deps.resolveBinary().path !== binary.path) throw new Error(\"OpenCode selection changed during activation\")\n this.deps.admitActivation?.(binary)\n }\n assertCurrent()\n if (action === \"reload\") {\n const identity = previous && runtimeIdentity(previous)\n if (!identity || !this.deps.reload) throw new Error(\"OpenCode configuration reload unavailable\")\n const capabilities = await this.inspectRuntime(previous!)\n if (!capabilities.reload) throw new Error(\"OpenCode does not expose configuration reload\")\n assertCurrent()\n // Explicit daemon-wide mutation: never use this as an automatic watcher\n // fallback, because native reload cancels pending Forms and permissions.\n await this.deps.reload(binary, assertCurrent)\n assertCurrent()\n return this.getStatus()\n }\n const endpoint = restart && previous ? await lifecycle.restart?.() : previous ?? await lifecycle.ensure()\n const identity = endpoint && runtimeIdentity(endpoint)\n if (!identity) throw new Error(\"OpenCode did not report an authenticated runtime version\")\n await this.inspectRuntime(endpoint!)\n if (this.deps.resolveBinary().path !== binary.path) throw new Error(\"OpenCode selection changed during activation\")\n await this.deps.reconnect?.(binary)\n return this.getStatus()\n }\n\n upgrade(): Promise<OpenCodeUpdateResponse> {\n const binary = this.deps.resolveBinary()\n const existing = inFlightUpgrades.get(binary.path)\n if (existing) return existing\n\n const pending = this.performUpgrade(binary).finally(() => {\n if (inFlightUpgrades.get(binary.path) === pending) inFlightUpgrades.delete(binary.path)\n })\n inFlightUpgrades.set(binary.path, pending)\n return pending\n }\n\n private async performUpgrade(binary: ResolvedBinary): Promise<OpenCodeUpdateResponse> {\n const probe = await this.deps.probeBinary(binary.path)\n const currentVersion = probe.missing ? null : await this.readCurrentVersion(binary.path, probe)\n const latestVersion = await this.readLatestVersion()\n assertSupportedOpenCode(latestVersion)\n\n if (currentVersion && !comparableVersion(currentVersion)) {\n throw new OpenCodeUpdateError(\"unsupported_binary\", \"Cannot order this custom OpenCode version for an automatic update\")\n }\n\n if (currentVersion && compareOpenCodeVersionStrings(latestVersion, currentVersion) <= 0 && !needsSharedInstallation(binary)) {\n return { success: true, version: currentVersion }\n }\n\n if (!this.deps.canUpgradeBinary(binary)) {\n throw new OpenCodeUpdateError(\n \"unsupported_binary\",\n \"Automatic updates require the default command and a writable npm installation\",\n )\n }\n\n try {\n const targetVersion = currentVersion && compareOpenCodeVersionStrings(currentVersion, latestVersion) > 0 ? currentVersion : latestVersion\n const result = await this.deps.upgradeBinary(binary, targetVersion)\n if (!result.success) {\n throw new OpenCodeUpdateError(\"upgrade_failed\", result.error)\n }\n const installedVersion = await this.readCurrentVersion(this.deps.resolveBinary().path)\n if (isBelowOpenCodeMinimum(installedVersion) || !/^\\d+\\.\\d+\\.\\d+$/.test(installedVersion) || compareOpenCodeVersionStrings(installedVersion, targetVersion) < 0) {\n throw new OpenCodeUpdateError(\n \"upgrade_verification_failed\",\n `OpenCode reported ${result.version}, but the configured binary is ${installedVersion} instead of ${latestVersion}`,\n )\n }\n return { success: true, version: installedVersion }\n } catch (error) {\n if (error instanceof OpenCodeUpdateError || error instanceof InstallationBusyError) throw error\n throw new OpenCodeUpdateError(\n \"upgrade_failed\",\n error instanceof Error ? error.message : \"OpenCode upgrade failed\",\n )\n }\n }\n\n private async readCurrentVersion(binaryPath: string, probe?: ReturnType<typeof probeBinaryVersion>): Promise<string> {\n if (process.platform === \"win32\" && /[\"\\r\\n]/.test(binaryPath)) {\n throw new OpenCodeUpdateError(\"binary_unavailable\", \"The configured OpenCode binary path is invalid\")\n }\n const result = probe ?? await this.deps.probeBinary(binaryPath)\n if (!result.valid) {\n throw new OpenCodeUpdateError(\"binary_unavailable\", result.error ?? \"Unable to read OpenCode version\")\n }\n // Successful unknown/empty labels are diagnostic information. Admission is\n // established against the authenticated daemon, not inferred from this label.\n return result.version?.trim() || \"unknown\"\n }\n\n private async readLatestVersion(): Promise<string> {\n try {\n const version = stripTagPrefix(await this.deps.resolveLatestVersion())\n if (!version) throw new Error(`The ${TARGET_OPENCODE_CHANNEL} channel did not resolve to a version`)\n return version\n } catch (error) {\n throw new OpenCodeUpdateError(\n \"update_check_failed\",\n error instanceof Error ? error.message : \"Unable to resolve the latest stable OpenCode release\",\n )\n }\n }\n}\n\nexport function compareOpenCodeVersionStrings(left: string, right: string): number {\n const leftBeta = stripTagPrefix(left)?.match(/^0\\.0\\.0-beta-(\\d+)$/)\n const rightBeta = stripTagPrefix(right)?.match(/^0\\.0\\.0-beta-(\\d+)$/)\n if (leftBeta && rightBeta) return Number(leftBeta[1]) - Number(rightBeta[1])\n return compareVersionStrings(left, right)\n}\n\ntype RegistryFetch = (\n url: string,\n init: Parameters<typeof fetch>[1],\n) => Promise<Pick<Awaited<ReturnType<typeof fetch>>, \"ok\" | \"status\" | \"json\">>\n\nexport async function resolveLatestOpenCodeVersion(fetchRegistry: RegistryFetch = fetch): Promise<string> {\n const response = await fetchRegistry(OPENCODE_REGISTRY_URL, {\n headers: { Accept: \"application/json\" },\n signal: AbortSignal.timeout(10_000),\n })\n if (!response.ok) throw new Error(`OpenCode registry responded with ${response.status}`)\n\n const metadata = (await response.json()) as Record<string, unknown>\n const version = metadata[TARGET_OPENCODE_CHANNEL]\n if (typeof version !== \"string\" || !/^\\d+\\.\\d+\\.\\d+$/.test(version)) {\n throw new Error(`The ${TARGET_OPENCODE_CHANNEL} channel did not resolve to a valid version`)\n }\n return version\n}\n\nexport function createOpenCodeUpdateService(\n settings: SettingsService,\n workspaceManager: WorkspaceManager,\n): OpenCodeUpdateService {\n const binaryResolver = new BinaryResolver(settings)\n return new OpenCodeUpdateService({\n resolveBinary: () => {\n const binary = binaryResolver.resolveDefault()\n return { ...binary, path: workspaceManager.resolveBinaryPath(binary.path) }\n },\n probeBinary: probeBinaryVersionAsync,\n resolveLatestVersion: resolveLatestOpenCodeVersion,\n canUpgradeBinary: binary => {\n const configured = settings.getOwner(\"config\", \"server\").opencodeBinary\n return !parseWslUncPath(binary.path) && (!configured || configured === \"opencode\" || configured === \"opencode2\" || (typeof configured === \"string\" && isRetiredInstallation(configured))) && Boolean(bundledNpm()) && Boolean(sharedInstallPrefix())\n },\n upgradeBinary: async (_binary, version) => {\n await installSharedOpenCode(version)\n return { success: true, version }\n },\n lifecycle: binary => workspaceManager.setupServiceOptions(binary.path).then(options => options.lifecycle),\n reconnect: binary => workspaceManager.reconnectAfterSetup(binary.path),\n admitActivation: binary => workspaceManager.assertSetupExecutionHost(binary.path),\n reload: (binary, assertCurrent) => workspaceManager.reloadConfigurationAfterSetup(binary.path, assertCurrent),\n })\n}\n\n// Explicit troubleshooting can replace the same release, but must retain the\n// update path's authenticated-version fence against downgrades/unknown builds.\nfunction canReplaceDaemon(installed: string | null, running?: string): boolean {\n return Boolean(installed && running && comparableVersion(installed) && comparableVersion(running)\n && compareOpenCodeVersionStrings(installed, running) >= 0)\n}\n\nfunction comparableVersion(version: string): boolean {\n return /^\\d+\\.\\d+\\.\\d+$/.test(version) || /^0\\.0\\.0-beta-\\d+$/.test(version)\n}\n\nfunction needsSharedInstallation(binary: ResolvedBinary): boolean {\n return binary.source === \"user\"\n}\n"]}
@@ -175,7 +175,7 @@ test("an unverified newer major is not blocked but cannot be downgraded by resta
175
175
  assert.equal((await service.getStatus()).canRestart, false);
176
176
  assert.equal((await service.start()).serviceState, "ready");
177
177
  assert.equal((await service.getStatus()).versionAssessment, "untested");
178
- await assert.rejects(service.start(true), /not an older runtime/);
178
+ await assert.rejects(service.start(true), /cannot safely replace/);
179
179
  });
180
180
  test("optional upgrades retain explicit activation for an admitted but older daemon", async () => {
181
181
  let installed = "2.0.11", daemon = "2.0.11", restarts = 0;
@@ -199,6 +199,87 @@ test("optional upgrades retain explicit activation for an admitted but older dae
199
199
  assert.equal((await service.start(true)).serviceState, "ready");
200
200
  assert.equal(restarts, 1);
201
201
  });
202
+ test("same-version troubleshooting restart is explicit for host and WSL; reload never restarts", async () => {
203
+ for (const binaryPath of ["/fixture/opencode", "\\\\wsl.localhost\\Ubuntu\\usr\\bin\\opencode"]) {
204
+ let pid = 123, restarts = 0, reloads = 0, reconnects = 0;
205
+ const endpoint = () => {
206
+ const value = { url: "http://127.0.0.1:9876" };
207
+ rememberRuntime(value, { version: "2.0.22", pid, discovery: "info" });
208
+ return value;
209
+ };
210
+ const service = new OpenCodeUpdateService(deps({
211
+ resolveBinary: () => ({ path: binaryPath, label: "Fixture" }),
212
+ probeBinary: () => ({ valid: true, version: "2.0.22" }), resolveLatestVersion: async () => "2.0.22",
213
+ lifecycle: async () => ({ discover: async () => endpoint(), ensure: async () => { assert.fail("retain the running daemon"); },
214
+ restart: async () => { restarts++; pid++; return endpoint(); } }),
215
+ upgradeBinary: async () => { assert.fail("restart must not install a version"); },
216
+ reload: async () => { reloads++; }, reconnect: async () => { reconnects++; },
217
+ }));
218
+ const status = await service.getStatus();
219
+ assert.equal(status.serviceState, "ready");
220
+ assert.equal(status.updateAvailable, false);
221
+ assert.equal(status.canRestart, true);
222
+ assert.equal(status.canReload, true);
223
+ await service.start();
224
+ await service.reload();
225
+ assert.equal(restarts, 0);
226
+ assert.equal(pid, 123, "configuration reload preserves the process");
227
+ assert.equal(reloads, 1);
228
+ const restarted = await service.start(true);
229
+ assert.equal(restarts, 1);
230
+ assert.equal(pid, 124);
231
+ assert.equal(reconnects, 2);
232
+ assert.equal(restarted.serviceState, "ready");
233
+ assert.equal(restarted.canRestart, true, "troubleshooting stays available after a restart");
234
+ }
235
+ });
236
+ test("troubleshooting restart refuses unknown identity/builds and a newer daemon", async () => {
237
+ for (const version of [undefined, "custom-build", "2.0.23"]) {
238
+ const endpoint = { url: "http://127.0.0.1:9876" };
239
+ if (version)
240
+ rememberRuntime(endpoint, { version, pid: 123, discovery: "info" });
241
+ const service = new OpenCodeUpdateService(deps({
242
+ probeBinary: () => ({ valid: true, version: "2.0.22" }),
243
+ lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => { assert.fail("no fallback start"); },
244
+ restart: async () => { assert.fail("must not stop an unverified or newer daemon"); } }),
245
+ }));
246
+ assert.equal((await service.getStatus()).canRestart, false);
247
+ await assert.rejects(service.start(true), /cannot safely replace/);
248
+ }
249
+ });
250
+ test("same-version restart coalesces, excludes reload, and never retries a failed mutation", async () => {
251
+ let restarts = 0, reconnects = 0;
252
+ let release, entered;
253
+ const gate = new Promise(resolve => { release = resolve; });
254
+ const reached = new Promise(resolve => { entered = resolve; });
255
+ const endpoint = { url: "http://127.0.0.1:9876" };
256
+ rememberRuntime(endpoint, { version: "2.0.22", pid: 123, discovery: "info" });
257
+ const service = new OpenCodeUpdateService(deps({
258
+ probeBinary: () => ({ valid: true, version: "2.0.22" }),
259
+ lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => { assert.fail("no fallback start"); },
260
+ restart: async () => { restarts++; entered(); await gate; throw new Error("restart failed"); } }),
261
+ reconnect: async () => { reconnects++; },
262
+ }));
263
+ const first = service.start(true);
264
+ assert.equal(service.start(true), first);
265
+ await reached;
266
+ await assert.rejects(service.reload(), /action is in progress/);
267
+ assert.equal(restarts, 1);
268
+ release();
269
+ await assert.rejects(first, /restart failed/);
270
+ assert.equal(restarts, 1);
271
+ assert.equal(reconnects, 0);
272
+ });
273
+ test("a lifecycle without restart cannot expose or silently emulate it", async () => {
274
+ const endpoint = { url: "http://127.0.0.1:9876" };
275
+ rememberRuntime(endpoint, { version: "2.0.22", pid: 123, discovery: "info" });
276
+ const service = new OpenCodeUpdateService(deps({
277
+ probeBinary: () => ({ valid: true, version: "2.0.22" }),
278
+ lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => { assert.fail("no fallback start"); } }),
279
+ }));
280
+ assert.equal((await service.getStatus()).canRestart, false);
281
+ await assert.rejects(service.start(true), /restart unavailable/);
282
+ });
202
283
  test("explicit configuration reload is admitted, fenced and serialized with service actions", async () => {
203
284
  let selected = "/fixture/opencode", version = "2.0.11", reloads = 0;
204
285
  let release;
@@ -1 +1 @@
1
- {"version":3,"file":"service.test.js","sourceRoot":"","sources":["../../src/opencode-update/service.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert/strict\"\nimport test from \"node:test\"\nimport { OpenCodeUpdateService, OpenCodeUpdateError,\n resolveLatestOpenCodeVersion, compareOpenCodeVersionStrings,\n type OpenCodeUpdateServiceDeps } from \"./service\"\nimport { MINIMUM_OPENCODE_VERSION as minimum } from \"../opencode/runtime-support\"\nimport { rememberRuntime } from \"../opencode/compatibility/runtime\"\nimport type { Endpoint } from \"@opencode/client/service\"\nimport { probeBinaryVersion } from \"../workspaces/spawn\"\n\nfunction deps(overrides: Partial<OpenCodeUpdateServiceDeps> = {}): OpenCodeUpdateServiceDeps {\n let version = \"0.0.0-beta-19271\"\n return {\n resolveBinary: () => ({ path: \"opencode2\", label: \"OpenCode\" }),\n probeBinary: () => ({ valid: true, version }),\n resolveLatestVersion: async () => minimum,\n canUpgradeBinary: () => true,\n upgradeBinary: async (_binary, target) => { version = target; return { success: true, version: target } },\n inspectRuntime: async () => ({ reload: true }),\n ...overrides,\n }\n}\n\ntest(\"missing installs and old releases use one updater; probe failures are not absence\", async () => {\n for (const initial of [undefined, \"0.0.0-beta-19271\", \"2.0.6\"]) {\n let version = initial\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => version ? { valid: true, version } : { valid: false, missing: true },\n upgradeBinary: async (_binary, target) => { version = target; return { success: true, version: target } },\n }))\n const status = await service.getStatus()\n assert.equal(status.state, initial ? \"update_required\" : \"missing\")\n assert.equal(status.minimumVersion, minimum)\n assert.equal(status.canUpgrade, true)\n assert.deepEqual(await service.upgrade(), { success: true, version: minimum })\n assert.equal((await service.getStatus()).state, \"ready\")\n }\n const invalid = new OpenCodeUpdateService(deps({ probeBinary: () => ({ valid: false, error: \"EACCES\" }) }))\n assert.equal((await invalid.getStatus()).state, \"error\")\n assert.equal((await invalid.getStatus()).canUpgrade, false)\n await assert.rejects(invalid.upgrade(), (error: unknown) => error instanceof OpenCodeUpdateError && error.code === \"binary_unavailable\")\n})\n\ntest(\"offline registry retains local required-update diagnosis\", async () => {\n const service = new OpenCodeUpdateService(deps({ resolveLatestVersion: async () => { throw new Error(\"offline\") } }))\n const status = await service.getStatus()\n assert.equal(status.state, \"update_required\")\n assert.equal(status.checkError, \"update_check_failed\")\n assert.equal(status.canUpgrade, false)\n await assert.rejects(service.upgrade(), (error: unknown) => error instanceof OpenCodeUpdateError && error.code === \"update_check_failed\")\n})\n\ntest(\"custom and WSL executables remain user managed\", async () => {\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: \"\\\\\\\\wsl.localhost\\\\Ubuntu\\\\usr\\\\bin\\\\opencode\", label: \"WSL\" }),\n canUpgradeBinary: () => false,\n }))\n const status = await service.getStatus()\n assert.equal(status.target, \"wsl\")\n assert.equal(status.canUpgrade, false)\n await assert.rejects(service.upgrade(), (error: unknown) => error instanceof OpenCodeUpdateError && error.code === \"unsupported_binary\")\n})\n\ntest(\"installation re-resolves the executable and rejects false success\", async () => {\n let installed = false\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: installed ? \"managed\" : \"opencode2\", label: \"OpenCode\" }),\n probeBinary: path => path === \"managed\" ? { valid: true, version: minimum } : { valid: false, missing: true },\n upgradeBinary: async (_binary, target) => { installed = true; return { success: true, version: target } },\n }))\n assert.equal((await service.upgrade()).version, minimum)\n const wrong = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: \"2.0.6\" }),\n upgradeBinary: async (_binary, target) => ({ success: true, version: target }),\n }))\n await assert.rejects(wrong.upgrade(), (error: unknown) => error instanceof OpenCodeUpdateError && error.code === \"upgrade_verification_failed\")\n})\n\ntest(\"user npm PATH repair remains available without an update and never downgrades\", async () => {\n for (const source of [\"user\"] as const) {\n let migrated = false, installs = 0\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: migrated ? \"common\" : source, label: \"OpenCode\", source: migrated ? \"path\" : source }),\n probeBinary: () => ({ valid: true, version: \"2.0.15\" }),\n resolveLatestVersion: async () => \"2.0.14\",\n upgradeBinary: async (_binary, target) => {\n assert.equal(target, \"2.0.15\")\n installs++; migrated = true\n return { success: true, version: target }\n },\n }))\n assert.equal((await service.getStatus()).canUpgrade, true)\n assert.equal((await service.getStatus()).needsSharedInstallation, true)\n await service.upgrade()\n assert.equal(installs, 1)\n assert.equal((await service.getStatus()).needsSharedInstallation, false)\n assert.equal((await service.getStatus()).canUpgrade, false)\n }\n})\n\ntest(\"coalesces overlapping installations and never downgrades a newer version\", async () => {\n let upgrades = 0\n let version = \"2.0.6\"\n let release!: () => void\n const gate = new Promise<void>(resolve => { release = resolve })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version }),\n upgradeBinary: async (_binary, target) => { upgrades++; await gate; version = target; return { success: true, version: target } },\n }))\n const first = service.upgrade(), second = service.upgrade()\n release()\n await Promise.all([first, second])\n assert.equal(upgrades, 1)\n version = \"2.0.999\"\n assert.equal((await service.getStatus()).updateAvailable, false)\n assert.equal((await service.upgrade()).version, version)\n assert.equal(upgrades, 1)\n})\n\ntest(\"stale daemon needs explicit restart; status and installation never restart it\", async () => {\n let daemonVersion = \"2.0.6\", restarts = 0, reconnects = 0\n const endpoint = () => {\n const value: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(value, { version: daemonVersion, pid: 123, discovery: \"info\" })\n return value\n }\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: minimum }),\n lifecycle: async () => ({ discover: async () => endpoint(), ensure: async () => endpoint(),\n restart: async () => { restarts++; daemonVersion = minimum; return endpoint() } }),\n reconnect: async () => { reconnects++ },\n }))\n assert.equal((await service.getStatus()).serviceState, \"restart_required\")\n assert.equal(restarts, 0)\n await assert.rejects(service.start(), /opencode_update_required/)\n assert.equal(restarts, 0)\n assert.equal(reconnects, 0)\n assert.equal((await service.start(true)).serviceState, \"ready\")\n assert.equal(restarts, 1)\n assert.equal(reconnects, 1)\n})\n\ntest(\"resolves exact stable package versions and rejects malformed/prerelease tags\", async () => {\n assert.equal(await resolveLatestOpenCodeVersion(async (url) => {\n assert.equal(url, \"https://registry.npmjs.org/-/package/%40opencode%2Fcli/dist-tags\")\n return new Response(JSON.stringify({ latest: minimum, beta: \"2.1.0-beta.1\" }))\n }), minimum)\n for (const tags of [{ beta: \"0.0.0-beta-19271\" }, { latest: \"2.1.0-beta.1\" }, { latest: \"2.0.11;whoami\" }]) {\n await assert.rejects(resolveLatestOpenCodeVersion(async () => new Response(JSON.stringify(tags))), /valid version/)\n }\n})\n\ntest(\"activation coalesces repeated clicks and refuses a changed selection before reconnect\", async () => {\n let selected = \"original\", restarts = 0, reconnects = 0\n let release!: () => void\n const gate = new Promise<void>(resolve => { release = resolve })\n const endpoint = (version: string) => {\n const value: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(value, { version, pid: 123, discovery: \"info\" })\n return value\n }\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: selected, label: selected }),\n probeBinary: () => ({ valid: true, version: minimum }),\n lifecycle: async () => ({ discover: async () => endpoint(\"2.0.6\"), ensure: async () => endpoint(minimum),\n restart: async () => { restarts++; await gate; return endpoint(minimum) } }),\n reconnect: async () => { reconnects++ },\n }))\n const first = service.start(true), second = service.start(true)\n assert.equal(first, second)\n selected = \"replacement\"\n release()\n await assert.rejects(first, /selection changed/)\n assert.equal(restarts, 0, \"a stale selection must be refused before stopping its daemon\")\n assert.equal(reconnects, 0)\n})\n\ntest(\"an unverified newer major is not blocked but cannot be downgraded by restart\", async () => {\n const value: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(value, { version: \"3.0.0\", pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: minimum }),\n resolveLatestVersion: async () => minimum,\n lifecycle: async () => ({ discover: async () => value, ensure: async () => value,\n restart: async () => { assert.fail(\"must not restart a newer runtime\") } }),\n }))\n assert.equal((await service.getStatus()).canUpgrade, false)\n assert.equal((await service.getStatus()).canRestart, false)\n assert.equal((await service.start()).serviceState, \"ready\")\n assert.equal((await service.getStatus()).versionAssessment, \"untested\")\n await assert.rejects(service.start(true), /not an older runtime/)\n})\n\ntest(\"optional upgrades retain explicit activation for an admitted but older daemon\", async () => {\n let installed = \"2.0.11\", daemon = \"2.0.11\", restarts = 0\n const endpoint = () => {\n const value: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(value, { version: daemon, pid: 123, discovery: \"info\" })\n return value\n }\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: installed }), resolveLatestVersion: async () => \"2.0.12\",\n upgradeBinary: async () => { installed = \"2.0.12\"; return { success: true, version: installed } },\n lifecycle: async () => ({ discover: async () => endpoint(), ensure: async () => endpoint(),\n restart: async () => { restarts++; daemon = installed; return endpoint() } }),\n }))\n await service.upgrade()\n const available = await service.start()\n assert.equal(available.state, \"ready\")\n assert.equal(available.serviceState, \"restart_available\")\n assert.equal(available.canRestart, true)\n assert.equal(restarts, 0)\n assert.equal((await service.start(true)).serviceState, \"ready\")\n assert.equal(restarts, 1)\n})\n\ntest(\"explicit configuration reload is admitted, fenced and serialized with service actions\", async () => {\n let selected = \"/fixture/opencode\", version = \"2.0.11\", reloads = 0\n let release!: () => void\n let entered!: () => void\n const gate = new Promise<void>(resolve => { release = resolve })\n const reached = new Promise<void>(resolve => { entered = resolve })\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: selected, label: \"Fixture\" }),\n probeBinary: () => ({ valid: true, version: \"2.0.11\" }),\n lifecycle: async () => ({ discover: async () => {\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version, pid: 123, discovery: \"info\" })\n return endpoint\n }, ensure: async () => { throw new Error(\"reload must not start a daemon\") } }),\n reload: async (_binary, assertCurrent) => { entered(); await gate; assertCurrent(); reloads++ },\n }))\n assert.equal((await service.getStatus()).canReload, true)\n assert.equal(reloads, 0)\n const first = service.reload()\n assert.equal(service.reload(), first)\n await reached\n await assert.rejects(service.start(), /action is in progress/)\n selected = \"/replacement/opencode\"\n await assert.rejects(service.start(true), /action is in progress/, \"changing executables cannot overlap the shared-daemon reload\")\n await assert.rejects(service.reload(), /action is in progress/, \"a different selection must not coalesce with the captured one\")\n release()\n await assert.rejects(first, /selection changed/)\n assert.equal(reloads, 0)\n version = \"2.0.6\"\n await assert.rejects(service.reload(), /opencode_update_required/)\n assert.equal(reloads, 0)\n})\n\ntest(\"an in-flight native reload holds shared-service authority across binary changes\", async () => {\n let selected = \"/fixture/a/opencode\", restarts = 0\n let entered!: () => void, release!: () => void\n const reached = new Promise<void>(resolve => { entered = resolve })\n const gate = new Promise<void>(resolve => { release = resolve })\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version: \"2.0.11\", pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: selected, label: \"Fixture\" }),\n probeBinary: () => ({ valid: true, version: \"2.0.12\" }),\n lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => endpoint,\n restart: async () => { restarts++; return endpoint } }),\n reload: async (_binary, assertCurrent) => { assertCurrent(); entered(); await gate },\n }))\n const first = service.reload()\n await reached\n selected = \"/fixture/b/opencode\"\n try {\n await assert.rejects(service.start(true), /action is in progress/)\n await assert.rejects(service.reload(), /action is in progress/)\n assert.equal(restarts, 0)\n } finally { release() }\n await assert.rejects(first, /selection changed/)\n await service.reload()\n})\n\ntest(\"beta version comparison remains numeric\", () => {\n assert.equal(compareOpenCodeVersionStrings(\"0.0.0-beta-10000\", \"0.0.0-beta-9999\") > 0, true)\n})\n\ntest(\"2.0.7 through 2.0.22 remain usable; recommendation only offers an optional update\", async () => {\n for (const version of [\"2.0.7\", \"2.0.8\", \"2.0.9\", \"2.0.10\", \"2.0.11\", \"2.0.12\", \"2.0.13\", \"2.0.14\", \"2.0.15\", \"2.0.16\", \"2.0.17\", \"2.0.18\", \"2.0.19\", \"2.0.20\", \"2.0.21\", \"2.0.22\"]) {\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version, pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version }), resolveLatestVersion: async () => \"2.0.22\",\n lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => { throw new Error(\"must retain daemon\") } }),\n }))\n const status = await service.start()\n assert.equal(status.minimumVersion, \"2.0.7\")\n assert.equal(status.recommendedVersion, \"2.0.22\")\n assert.equal(status.state, \"ready\")\n assert.equal(status.serviceState, \"ready\")\n assert.equal(status.versionAssessment, version === \"2.0.22\" ? \"tested\" : \"untested\", \"only the current recommendation is release-qualified\")\n assert.equal(status.incompatibilityReason, undefined)\n assert.equal(status.canUpgrade, version !== \"2.0.22\")\n assert.equal(status.canRestart, false)\n }\n})\n\ntest(\"a current daemon remains usable through an older selected discovery CLI\", async () => {\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version: \"2.0.22\", pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: \"2.0.3\" }),\n lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => { throw new Error(\"must retain daemon\") } }),\n }))\n assert.equal((await service.start()).state, \"ready\")\n assert.equal((await service.getStatus()).versionAssessment, \"tested\")\n})\n\ntest(\"custom labels are unverified, not an update demand; optional reload follows capabilities\", async () => {\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version: \"custom-build\", pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: \"custom-build\" }),\n inspectRuntime: async () => ({ reload: false }),\n lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => { throw new Error(\"must retain daemon\") } }),\n reload: async () => { throw new Error(\"unavailable operation must not be called\") },\n }))\n const status = await service.start()\n assert.equal(status.state, \"ready\")\n assert.equal(status.serviceState, \"ready\")\n assert.equal(status.versionAssessment, \"untested\")\n assert.equal(status.canReload, false)\n assert.equal(status.canUpgrade, false)\n await assert.rejects(service.upgrade(), /custom OpenCode version/)\n await assert.rejects(service.reload(), /does not expose configuration reload/)\n})\n\ntest(\"production stdout parsing preserves custom labels through discovery and activation\", async () => {\n for (const [stdout, label] of [[\"custom-build\\n\", \"custom-build\"], [\"opencode v2.0.7+custom-build\\n\", \"2.0.7+custom-build\"],\n [\"opencode2 vendor-build\\n\", \"vendor-build\"], [\"\", \"unknown\"]]) {\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version: label!, pid: 123, discovery: \"info\" })\n let discoveries = 0, inspected = 0\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => probeBinaryVersion(process.execPath, () => ({ status: 0, stdout })),\n lifecycle: async () => ({ discover: async () => { discoveries++; return endpoint }, ensure: async () => { throw new Error(\"must retain daemon\") } }),\n inspectRuntime: async () => { inspected++; return { reload: false } },\n }))\n const status = await service.start()\n assert.equal(status.currentVersion, label)\n assert.equal(status.state, \"ready\")\n assert.equal(status.versionAssessment, \"untested\")\n assert.equal(status.canUpgrade, false)\n assert.equal(status.canRestart, false)\n assert.ok(discoveries > 0 && inspected > 0, \"successful custom labels reach authenticated contract inspection\")\n await assert.rejects(service.upgrade(), /custom OpenCode version/)\n }\n})\n"]}
1
+ {"version":3,"file":"service.test.js","sourceRoot":"","sources":["../../src/opencode-update/service.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert/strict\"\nimport test from \"node:test\"\nimport { OpenCodeUpdateService, OpenCodeUpdateError,\n resolveLatestOpenCodeVersion, compareOpenCodeVersionStrings,\n type OpenCodeUpdateServiceDeps } from \"./service\"\nimport { MINIMUM_OPENCODE_VERSION as minimum } from \"../opencode/runtime-support\"\nimport { rememberRuntime } from \"../opencode/compatibility/runtime\"\nimport type { Endpoint } from \"@opencode/client/service\"\nimport { probeBinaryVersion } from \"../workspaces/spawn\"\n\nfunction deps(overrides: Partial<OpenCodeUpdateServiceDeps> = {}): OpenCodeUpdateServiceDeps {\n let version = \"0.0.0-beta-19271\"\n return {\n resolveBinary: () => ({ path: \"opencode2\", label: \"OpenCode\" }),\n probeBinary: () => ({ valid: true, version }),\n resolveLatestVersion: async () => minimum,\n canUpgradeBinary: () => true,\n upgradeBinary: async (_binary, target) => { version = target; return { success: true, version: target } },\n inspectRuntime: async () => ({ reload: true }),\n ...overrides,\n }\n}\n\ntest(\"missing installs and old releases use one updater; probe failures are not absence\", async () => {\n for (const initial of [undefined, \"0.0.0-beta-19271\", \"2.0.6\"]) {\n let version = initial\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => version ? { valid: true, version } : { valid: false, missing: true },\n upgradeBinary: async (_binary, target) => { version = target; return { success: true, version: target } },\n }))\n const status = await service.getStatus()\n assert.equal(status.state, initial ? \"update_required\" : \"missing\")\n assert.equal(status.minimumVersion, minimum)\n assert.equal(status.canUpgrade, true)\n assert.deepEqual(await service.upgrade(), { success: true, version: minimum })\n assert.equal((await service.getStatus()).state, \"ready\")\n }\n const invalid = new OpenCodeUpdateService(deps({ probeBinary: () => ({ valid: false, error: \"EACCES\" }) }))\n assert.equal((await invalid.getStatus()).state, \"error\")\n assert.equal((await invalid.getStatus()).canUpgrade, false)\n await assert.rejects(invalid.upgrade(), (error: unknown) => error instanceof OpenCodeUpdateError && error.code === \"binary_unavailable\")\n})\n\ntest(\"offline registry retains local required-update diagnosis\", async () => {\n const service = new OpenCodeUpdateService(deps({ resolveLatestVersion: async () => { throw new Error(\"offline\") } }))\n const status = await service.getStatus()\n assert.equal(status.state, \"update_required\")\n assert.equal(status.checkError, \"update_check_failed\")\n assert.equal(status.canUpgrade, false)\n await assert.rejects(service.upgrade(), (error: unknown) => error instanceof OpenCodeUpdateError && error.code === \"update_check_failed\")\n})\n\ntest(\"custom and WSL executables remain user managed\", async () => {\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: \"\\\\\\\\wsl.localhost\\\\Ubuntu\\\\usr\\\\bin\\\\opencode\", label: \"WSL\" }),\n canUpgradeBinary: () => false,\n }))\n const status = await service.getStatus()\n assert.equal(status.target, \"wsl\")\n assert.equal(status.canUpgrade, false)\n await assert.rejects(service.upgrade(), (error: unknown) => error instanceof OpenCodeUpdateError && error.code === \"unsupported_binary\")\n})\n\ntest(\"installation re-resolves the executable and rejects false success\", async () => {\n let installed = false\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: installed ? \"managed\" : \"opencode2\", label: \"OpenCode\" }),\n probeBinary: path => path === \"managed\" ? { valid: true, version: minimum } : { valid: false, missing: true },\n upgradeBinary: async (_binary, target) => { installed = true; return { success: true, version: target } },\n }))\n assert.equal((await service.upgrade()).version, minimum)\n const wrong = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: \"2.0.6\" }),\n upgradeBinary: async (_binary, target) => ({ success: true, version: target }),\n }))\n await assert.rejects(wrong.upgrade(), (error: unknown) => error instanceof OpenCodeUpdateError && error.code === \"upgrade_verification_failed\")\n})\n\ntest(\"user npm PATH repair remains available without an update and never downgrades\", async () => {\n for (const source of [\"user\"] as const) {\n let migrated = false, installs = 0\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: migrated ? \"common\" : source, label: \"OpenCode\", source: migrated ? \"path\" : source }),\n probeBinary: () => ({ valid: true, version: \"2.0.15\" }),\n resolveLatestVersion: async () => \"2.0.14\",\n upgradeBinary: async (_binary, target) => {\n assert.equal(target, \"2.0.15\")\n installs++; migrated = true\n return { success: true, version: target }\n },\n }))\n assert.equal((await service.getStatus()).canUpgrade, true)\n assert.equal((await service.getStatus()).needsSharedInstallation, true)\n await service.upgrade()\n assert.equal(installs, 1)\n assert.equal((await service.getStatus()).needsSharedInstallation, false)\n assert.equal((await service.getStatus()).canUpgrade, false)\n }\n})\n\ntest(\"coalesces overlapping installations and never downgrades a newer version\", async () => {\n let upgrades = 0\n let version = \"2.0.6\"\n let release!: () => void\n const gate = new Promise<void>(resolve => { release = resolve })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version }),\n upgradeBinary: async (_binary, target) => { upgrades++; await gate; version = target; return { success: true, version: target } },\n }))\n const first = service.upgrade(), second = service.upgrade()\n release()\n await Promise.all([first, second])\n assert.equal(upgrades, 1)\n version = \"2.0.999\"\n assert.equal((await service.getStatus()).updateAvailable, false)\n assert.equal((await service.upgrade()).version, version)\n assert.equal(upgrades, 1)\n})\n\ntest(\"stale daemon needs explicit restart; status and installation never restart it\", async () => {\n let daemonVersion = \"2.0.6\", restarts = 0, reconnects = 0\n const endpoint = () => {\n const value: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(value, { version: daemonVersion, pid: 123, discovery: \"info\" })\n return value\n }\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: minimum }),\n lifecycle: async () => ({ discover: async () => endpoint(), ensure: async () => endpoint(),\n restart: async () => { restarts++; daemonVersion = minimum; return endpoint() } }),\n reconnect: async () => { reconnects++ },\n }))\n assert.equal((await service.getStatus()).serviceState, \"restart_required\")\n assert.equal(restarts, 0)\n await assert.rejects(service.start(), /opencode_update_required/)\n assert.equal(restarts, 0)\n assert.equal(reconnects, 0)\n assert.equal((await service.start(true)).serviceState, \"ready\")\n assert.equal(restarts, 1)\n assert.equal(reconnects, 1)\n})\n\ntest(\"resolves exact stable package versions and rejects malformed/prerelease tags\", async () => {\n assert.equal(await resolveLatestOpenCodeVersion(async (url) => {\n assert.equal(url, \"https://registry.npmjs.org/-/package/%40opencode%2Fcli/dist-tags\")\n return new Response(JSON.stringify({ latest: minimum, beta: \"2.1.0-beta.1\" }))\n }), minimum)\n for (const tags of [{ beta: \"0.0.0-beta-19271\" }, { latest: \"2.1.0-beta.1\" }, { latest: \"2.0.11;whoami\" }]) {\n await assert.rejects(resolveLatestOpenCodeVersion(async () => new Response(JSON.stringify(tags))), /valid version/)\n }\n})\n\ntest(\"activation coalesces repeated clicks and refuses a changed selection before reconnect\", async () => {\n let selected = \"original\", restarts = 0, reconnects = 0\n let release!: () => void\n const gate = new Promise<void>(resolve => { release = resolve })\n const endpoint = (version: string) => {\n const value: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(value, { version, pid: 123, discovery: \"info\" })\n return value\n }\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: selected, label: selected }),\n probeBinary: () => ({ valid: true, version: minimum }),\n lifecycle: async () => ({ discover: async () => endpoint(\"2.0.6\"), ensure: async () => endpoint(minimum),\n restart: async () => { restarts++; await gate; return endpoint(minimum) } }),\n reconnect: async () => { reconnects++ },\n }))\n const first = service.start(true), second = service.start(true)\n assert.equal(first, second)\n selected = \"replacement\"\n release()\n await assert.rejects(first, /selection changed/)\n assert.equal(restarts, 0, \"a stale selection must be refused before stopping its daemon\")\n assert.equal(reconnects, 0)\n})\n\ntest(\"an unverified newer major is not blocked but cannot be downgraded by restart\", async () => {\n const value: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(value, { version: \"3.0.0\", pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: minimum }),\n resolveLatestVersion: async () => minimum,\n lifecycle: async () => ({ discover: async () => value, ensure: async () => value,\n restart: async () => { assert.fail(\"must not restart a newer runtime\") } }),\n }))\n assert.equal((await service.getStatus()).canUpgrade, false)\n assert.equal((await service.getStatus()).canRestart, false)\n assert.equal((await service.start()).serviceState, \"ready\")\n assert.equal((await service.getStatus()).versionAssessment, \"untested\")\n await assert.rejects(service.start(true), /cannot safely replace/)\n})\n\ntest(\"optional upgrades retain explicit activation for an admitted but older daemon\", async () => {\n let installed = \"2.0.11\", daemon = \"2.0.11\", restarts = 0\n const endpoint = () => {\n const value: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(value, { version: daemon, pid: 123, discovery: \"info\" })\n return value\n }\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: installed }), resolveLatestVersion: async () => \"2.0.12\",\n upgradeBinary: async () => { installed = \"2.0.12\"; return { success: true, version: installed } },\n lifecycle: async () => ({ discover: async () => endpoint(), ensure: async () => endpoint(),\n restart: async () => { restarts++; daemon = installed; return endpoint() } }),\n }))\n await service.upgrade()\n const available = await service.start()\n assert.equal(available.state, \"ready\")\n assert.equal(available.serviceState, \"restart_available\")\n assert.equal(available.canRestart, true)\n assert.equal(restarts, 0)\n assert.equal((await service.start(true)).serviceState, \"ready\")\n assert.equal(restarts, 1)\n})\n\ntest(\"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: \"2.0.22\", pid, discovery: \"info\" })\n return value\n }\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: binaryPath, label: \"Fixture\" }),\n probeBinary: () => ({ valid: true, version: \"2.0.22\" }), resolveLatestVersion: async () => \"2.0.22\",\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.0.23\"]) {\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: \"2.0.22\" }),\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: \"2.0.22\", pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: \"2.0.22\" }),\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: \"2.0.22\", pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: \"2.0.22\" }),\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 = \"2.0.11\", reloads = 0\n let release!: () => void\n let entered!: () => void\n const gate = new Promise<void>(resolve => { release = resolve })\n const reached = new Promise<void>(resolve => { entered = resolve })\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: selected, label: \"Fixture\" }),\n probeBinary: () => ({ valid: true, version: \"2.0.11\" }),\n lifecycle: async () => ({ discover: async () => {\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version, pid: 123, discovery: \"info\" })\n return endpoint\n }, ensure: async () => { throw new Error(\"reload must not start a daemon\") } }),\n reload: async (_binary, assertCurrent) => { entered(); await gate; assertCurrent(); reloads++ },\n }))\n assert.equal((await service.getStatus()).canReload, true)\n assert.equal(reloads, 0)\n const first = service.reload()\n assert.equal(service.reload(), first)\n await reached\n await assert.rejects(service.start(), /action is in progress/)\n selected = \"/replacement/opencode\"\n await assert.rejects(service.start(true), /action is in progress/, \"changing executables cannot overlap the shared-daemon reload\")\n await assert.rejects(service.reload(), /action is in progress/, \"a different selection must not coalesce with the captured one\")\n release()\n await assert.rejects(first, /selection changed/)\n assert.equal(reloads, 0)\n version = \"2.0.6\"\n await assert.rejects(service.reload(), /opencode_update_required/)\n assert.equal(reloads, 0)\n})\n\ntest(\"an in-flight native reload holds shared-service authority across binary changes\", async () => {\n let selected = \"/fixture/a/opencode\", restarts = 0\n let entered!: () => void, release!: () => void\n const reached = new Promise<void>(resolve => { entered = resolve })\n const gate = new Promise<void>(resolve => { release = resolve })\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version: \"2.0.11\", pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n resolveBinary: () => ({ path: selected, label: \"Fixture\" }),\n probeBinary: () => ({ valid: true, version: \"2.0.12\" }),\n lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => endpoint,\n restart: async () => { restarts++; return endpoint } }),\n reload: async (_binary, assertCurrent) => { assertCurrent(); entered(); await gate },\n }))\n const first = service.reload()\n await reached\n selected = \"/fixture/b/opencode\"\n try {\n await assert.rejects(service.start(true), /action is in progress/)\n await assert.rejects(service.reload(), /action is in progress/)\n assert.equal(restarts, 0)\n } finally { release() }\n await assert.rejects(first, /selection changed/)\n await service.reload()\n})\n\ntest(\"beta version comparison remains numeric\", () => {\n assert.equal(compareOpenCodeVersionStrings(\"0.0.0-beta-10000\", \"0.0.0-beta-9999\") > 0, true)\n})\n\ntest(\"2.0.7 through 2.0.22 remain usable; recommendation only offers an optional update\", async () => {\n for (const version of [\"2.0.7\", \"2.0.8\", \"2.0.9\", \"2.0.10\", \"2.0.11\", \"2.0.12\", \"2.0.13\", \"2.0.14\", \"2.0.15\", \"2.0.16\", \"2.0.17\", \"2.0.18\", \"2.0.19\", \"2.0.20\", \"2.0.21\", \"2.0.22\"]) {\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version, pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version }), resolveLatestVersion: async () => \"2.0.22\",\n lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => { throw new Error(\"must retain daemon\") } }),\n }))\n const status = await service.start()\n assert.equal(status.minimumVersion, \"2.0.7\")\n assert.equal(status.recommendedVersion, \"2.0.22\")\n assert.equal(status.state, \"ready\")\n assert.equal(status.serviceState, \"ready\")\n assert.equal(status.versionAssessment, version === \"2.0.22\" ? \"tested\" : \"untested\", \"only the current recommendation is release-qualified\")\n assert.equal(status.incompatibilityReason, undefined)\n assert.equal(status.canUpgrade, version !== \"2.0.22\")\n assert.equal(status.canRestart, false)\n }\n})\n\ntest(\"a current daemon remains usable through an older selected discovery CLI\", async () => {\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version: \"2.0.22\", pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: \"2.0.3\" }),\n lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => { throw new Error(\"must retain daemon\") } }),\n }))\n assert.equal((await service.start()).state, \"ready\")\n assert.equal((await service.getStatus()).versionAssessment, \"tested\")\n})\n\ntest(\"custom labels are unverified, not an update demand; optional reload follows capabilities\", async () => {\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version: \"custom-build\", pid: 123, discovery: \"info\" })\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => ({ valid: true, version: \"custom-build\" }),\n inspectRuntime: async () => ({ reload: false }),\n lifecycle: async () => ({ discover: async () => endpoint, ensure: async () => { throw new Error(\"must retain daemon\") } }),\n reload: async () => { throw new Error(\"unavailable operation must not be called\") },\n }))\n const status = await service.start()\n assert.equal(status.state, \"ready\")\n assert.equal(status.serviceState, \"ready\")\n assert.equal(status.versionAssessment, \"untested\")\n assert.equal(status.canReload, false)\n assert.equal(status.canUpgrade, false)\n await assert.rejects(service.upgrade(), /custom OpenCode version/)\n await assert.rejects(service.reload(), /does not expose configuration reload/)\n})\n\ntest(\"production stdout parsing preserves custom labels through discovery and activation\", async () => {\n for (const [stdout, label] of [[\"custom-build\\n\", \"custom-build\"], [\"opencode v2.0.7+custom-build\\n\", \"2.0.7+custom-build\"],\n [\"opencode2 vendor-build\\n\", \"vendor-build\"], [\"\", \"unknown\"]]) {\n const endpoint: Endpoint = { url: \"http://127.0.0.1:9876\" }\n rememberRuntime(endpoint, { version: label!, pid: 123, discovery: \"info\" })\n let discoveries = 0, inspected = 0\n const service = new OpenCodeUpdateService(deps({\n probeBinary: () => probeBinaryVersion(process.execPath, () => ({ status: 0, stdout })),\n lifecycle: async () => ({ discover: async () => { discoveries++; return endpoint }, ensure: async () => { throw new Error(\"must retain daemon\") } }),\n inspectRuntime: async () => { inspected++; return { reload: false } },\n }))\n const status = await service.start()\n assert.equal(status.currentVersion, label)\n assert.equal(status.state, \"ready\")\n assert.equal(status.versionAssessment, \"untested\")\n assert.equal(status.canUpgrade, false)\n assert.equal(status.canRestart, false)\n assert.ok(discoveries > 0 && inspected > 0, \"successful custom labels reach authenticated contract inspection\")\n await assert.rejects(service.upgrade(), /custom OpenCode version/)\n }\n})\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neuralnomads/codenomad-dev",
3
- "version": "0.20.0-dev-20261004-04654996",
3
+ "version": "0.20.0-dev-20261006-68e4d2a4",
4
4
  "description": "CodeNomad Server",
5
5
  "license": "MIT",
6
6
  "author": {