agl 1.0.17 → 21.0.2

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 (277) hide show
  1. package/.smartconfig.json +55 -0
  2. package/changelog.md +1026 -0
  3. package/cli.js +14 -0
  4. package/dist_serve/bundle.js +44778 -0
  5. package/dist_serve/index.html +13 -0
  6. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  7. package/dist_ts/00_commitinfo_data.js +9 -0
  8. package/dist_ts/classes.authmodels.d.ts +126 -0
  9. package/dist_ts/classes.authmodels.js +1422 -0
  10. package/dist_ts/classes.authstore.d.ts +160 -0
  11. package/dist_ts/classes.authstore.js +2483 -0
  12. package/dist_ts/classes.browserresourcehost.d.ts +85 -0
  13. package/dist_ts/classes.browserresourcehost.js +912 -0
  14. package/dist_ts/classes.cli.d.ts +21 -0
  15. package/dist_ts/classes.cli.js +1082 -0
  16. package/dist_ts/classes.config.d.ts +23 -0
  17. package/dist_ts/classes.config.js +267 -0
  18. package/dist_ts/classes.controller.d.ts +523 -0
  19. package/dist_ts/classes.controller.js +10611 -0
  20. package/dist_ts/classes.controllermanagement.d.ts +32 -0
  21. package/dist_ts/classes.controllermanagement.js +222 -0
  22. package/dist_ts/classes.draftmanager.d.ts +30 -0
  23. package/dist_ts/classes.draftmanager.js +179 -0
  24. package/dist_ts/classes.embeddeddb.d.ts +30 -0
  25. package/dist_ts/classes.embeddeddb.js +159 -0
  26. package/dist_ts/classes.flexframedtransport.d.ts +56 -0
  27. package/dist_ts/classes.flexframedtransport.js +275 -0
  28. package/dist_ts/classes.flexmodels.private.d.ts +231 -0
  29. package/dist_ts/classes.flexmodels.private.js +985 -0
  30. package/dist_ts/classes.flexmodels.public.d.ts +207 -0
  31. package/dist_ts/classes.flexmodels.public.js +885 -0
  32. package/dist_ts/classes.flexprojectionreader.d.ts +89 -0
  33. package/dist_ts/classes.flexprojectionreader.js +580 -0
  34. package/dist_ts/classes.flexservice.d.ts +196 -0
  35. package/dist_ts/classes.flexservice.js +3704 -0
  36. package/dist_ts/classes.flexstore.d.ts +174 -0
  37. package/dist_ts/classes.flexstore.js +3400 -0
  38. package/dist_ts/classes.flexsupervisor.d.ts +105 -0
  39. package/dist_ts/classes.flexsupervisor.js +1191 -0
  40. package/dist_ts/classes.gitreversion.d.ts +431 -0
  41. package/dist_ts/classes.gitreversion.js +10592 -0
  42. package/dist_ts/classes.harnessoperationmanager.d.ts +113 -0
  43. package/dist_ts/classes.harnessoperationmanager.js +602 -0
  44. package/dist_ts/classes.opencodeclient.d.ts +146 -0
  45. package/dist_ts/classes.opencodeclient.js +3003 -0
  46. package/dist_ts/classes.opencodesupervisor.d.ts +60 -0
  47. package/dist_ts/classes.opencodesupervisor.js +1003 -0
  48. package/dist_ts/classes.passkeymanager.d.ts +34 -0
  49. package/dist_ts/classes.passkeymanager.js +456 -0
  50. package/dist_ts/classes.processinspection.d.ts +50 -0
  51. package/dist_ts/classes.processinspection.js +484 -0
  52. package/dist_ts/classes.resourcecoordinator.d.ts +64 -0
  53. package/dist_ts/classes.resourcecoordinator.js +294 -0
  54. package/dist_ts/classes.sessionintelligencereader.d.ts +13 -0
  55. package/dist_ts/classes.sessionintelligencereader.js +40 -0
  56. package/dist_ts/classes.systemmetricssampler.d.ts +53 -0
  57. package/dist_ts/classes.systemmetricssampler.js +168 -0
  58. package/dist_ts/classes.terminalmanager.d.ts +95 -0
  59. package/dist_ts/classes.terminalmanager.js +981 -0
  60. package/dist_ts/classes.terminalresourcehost.d.ts +20 -0
  61. package/dist_ts/classes.terminalresourcehost.js +84 -0
  62. package/dist_ts/classes.upgradecoordinator.d.ts +244 -0
  63. package/dist_ts/classes.upgradecoordinator.js +2155 -0
  64. package/dist_ts/classes.upgradetransaction.d.ts +92 -0
  65. package/dist_ts/classes.upgradetransaction.js +2125 -0
  66. package/dist_ts/classes.uploadmanager.d.ts +24 -0
  67. package/dist_ts/classes.uploadmanager.js +210 -0
  68. package/dist_ts/classes.validation.d.ts +91 -0
  69. package/dist_ts/classes.validation.js +1087 -0
  70. package/dist_ts/flexharness.child.d.ts +1 -0
  71. package/dist_ts/flexharness.child.js +28 -0
  72. package/dist_ts/functions.canonicaldirectory.d.ts +21 -0
  73. package/dist_ts/functions.canonicaldirectory.js +144 -0
  74. package/dist_ts/functions.controllerdataroot.d.ts +15 -0
  75. package/dist_ts/functions.controllerdataroot.js +76 -0
  76. package/dist_ts/functions.embeddeddb.d.ts +2 -0
  77. package/dist_ts/functions.embeddeddb.js +21 -0
  78. package/dist_ts/functions.flexcredentialstore.d.ts +16 -0
  79. package/dist_ts/functions.flexcredentialstore.js +93 -0
  80. package/dist_ts/functions.opencodeauth.d.ts +3 -0
  81. package/dist_ts/functions.opencodeauth.js +31 -0
  82. package/dist_ts/functions.runtimeenvironment.d.ts +2 -0
  83. package/dist_ts/functions.runtimeenvironment.js +79 -0
  84. package/dist_ts/functions.upgradefollower.d.ts +3 -0
  85. package/dist_ts/functions.upgradefollower.js +95 -0
  86. package/dist_ts/index.d.ts +24 -0
  87. package/dist_ts/index.js +25 -0
  88. package/dist_ts/interfaces.auth.d.ts +181 -0
  89. package/dist_ts/interfaces.auth.js +82 -0
  90. package/dist_ts/interfaces.config.d.ts +34 -0
  91. package/dist_ts/interfaces.config.js +2 -0
  92. package/dist_ts/interfaces.flexipc.d.ts +939 -0
  93. package/dist_ts/interfaces.flexipc.js +1492 -0
  94. package/dist_ts/interfaces.gitreversion.d.ts +246 -0
  95. package/dist_ts/interfaces.gitreversion.js +2 -0
  96. package/dist_ts/interfaces.lifecycle.d.ts +37 -0
  97. package/dist_ts/interfaces.lifecycle.js +2 -0
  98. package/dist_ts/interfaces.opencode.d.ts +101 -0
  99. package/dist_ts/interfaces.opencode.js +3 -0
  100. package/dist_ts/interfaces.projects.d.ts +156 -0
  101. package/dist_ts/interfaces.projects.js +5 -0
  102. package/dist_ts/plugins.d.ts +36 -0
  103. package/dist_ts/plugins.js +40 -0
  104. package/dist_ts_interfaces/index.d.ts +2 -0
  105. package/dist_ts_interfaces/index.js +3 -0
  106. package/dist_ts_interfaces/interfaces.d.ts +747 -0
  107. package/dist_ts_interfaces/interfaces.js +47 -0
  108. package/dist_ts_interfaces/plugins.d.ts +4 -0
  109. package/dist_ts_interfaces/plugins.js +3 -0
  110. package/dist_ts_interfaces/requests.d.ts +806 -0
  111. package/dist_ts_interfaces/requests.js +2 -0
  112. package/dist_ts_migration/classes.documentmigrationrunner.d.ts +8 -0
  113. package/dist_ts_migration/classes.documentmigrationrunner.js +24 -0
  114. package/dist_ts_migration/classes.flexmigrationrunner.d.ts +11 -0
  115. package/dist_ts_migration/classes.flexmigrationrunner.js +25 -0
  116. package/dist_ts_migration/classes.flexpostharnessmigrationrunner.d.ts +10 -0
  117. package/dist_ts_migration/classes.flexpostharnessmigrationrunner.js +15 -0
  118. package/dist_ts_migration/classes.migrationrunner.d.ts +8 -0
  119. package/dist_ts_migration/classes.migrationrunner.js +34 -0
  120. package/dist_ts_migration/index.d.ts +12 -0
  121. package/dist_ts_migration/index.js +13 -0
  122. package/dist_ts_migration/v10_flexharnessv3migration.d.ts +11 -0
  123. package/dist_ts_migration/v10_flexharnessv3migration.js +23 -0
  124. package/dist_ts_migration/v13_flexprojectionorder.d.ts +11 -0
  125. package/dist_ts_migration/v13_flexprojectionorder.js +23 -0
  126. package/dist_ts_migration/v16_flexprovidercredentials.d.ts +22 -0
  127. package/dist_ts_migration/v16_flexprovidercredentials.js +149 -0
  128. package/dist_ts_migration/v18_resourcelayout.d.ts +22 -0
  129. package/dist_ts_migration/v18_resourcelayout.js +23 -0
  130. package/dist_ts_migration/v18_resourcelayoutmigration.d.ts +6 -0
  131. package/dist_ts_migration/v18_resourcelayoutmigration.js +61 -0
  132. package/dist_ts_migration/v19_flexprojectmanagement.d.ts +11 -0
  133. package/dist_ts_migration/v19_flexprojectmanagement.js +21 -0
  134. package/dist_ts_migration/v1_embeddeddatabaselocation.d.ts +28 -0
  135. package/dist_ts_migration/v1_embeddeddatabaselocation.js +415 -0
  136. package/dist_ts_migration/v22_projectfilesystemidentitymigration.d.ts +7 -0
  137. package/dist_ts_migration/v22_projectfilesystemidentitymigration.js +105 -0
  138. package/dist_ts_migration/v2_controllerdataroot.d.ts +130 -0
  139. package/dist_ts_migration/v2_controllerdataroot.js +1887 -0
  140. package/dist_ts_migration/v6_protocoldocumentmigration.d.ts +7 -0
  141. package/dist_ts_migration/v6_protocoldocumentmigration.js +100 -0
  142. package/dist_ts_migration/v6_protocoldocuments.d.ts +7 -0
  143. package/dist_ts_migration/v6_protocoldocuments.js +138 -0
  144. package/html/index.html +13 -0
  145. package/{LICENSE → license.md} +2 -2
  146. package/package.json +86 -48
  147. package/readme.md +480 -0
  148. package/readme.plan.md +188 -0
  149. package/ts/00_commitinfo_data.ts +8 -0
  150. package/ts/classes.authmodels.ts +1245 -0
  151. package/ts/classes.authstore.ts +3274 -0
  152. package/ts/classes.browserresourcehost.ts +1205 -0
  153. package/ts/classes.cli.ts +1254 -0
  154. package/ts/classes.config.ts +351 -0
  155. package/ts/classes.controller.ts +14426 -0
  156. package/ts/classes.controllermanagement.ts +330 -0
  157. package/ts/classes.draftmanager.ts +232 -0
  158. package/ts/classes.embeddeddb.ts +166 -0
  159. package/ts/classes.flexframedtransport.ts +283 -0
  160. package/ts/classes.flexmodels.private.ts +823 -0
  161. package/ts/classes.flexmodels.public.ts +732 -0
  162. package/ts/classes.flexprojectionreader.ts +816 -0
  163. package/ts/classes.flexservice.ts +4302 -0
  164. package/ts/classes.flexstore.ts +4565 -0
  165. package/ts/classes.flexsupervisor.ts +1453 -0
  166. package/ts/classes.gitreversion.ts +13353 -0
  167. package/ts/classes.harnessoperationmanager.ts +870 -0
  168. package/ts/classes.opencodeclient.ts +4110 -0
  169. package/ts/classes.opencodesupervisor.ts +1280 -0
  170. package/ts/classes.passkeymanager.ts +570 -0
  171. package/ts/classes.processinspection.ts +623 -0
  172. package/ts/classes.resourcecoordinator.ts +436 -0
  173. package/ts/classes.sessionintelligencereader.ts +52 -0
  174. package/ts/classes.systemmetricssampler.ts +215 -0
  175. package/ts/classes.terminalmanager.ts +1207 -0
  176. package/ts/classes.terminalresourcehost.ts +122 -0
  177. package/ts/classes.upgradecoordinator.ts +2675 -0
  178. package/ts/classes.upgradetransaction.ts +2900 -0
  179. package/ts/classes.uploadmanager.ts +240 -0
  180. package/ts/classes.validation.ts +1409 -0
  181. package/ts/flexharness.child.ts +35 -0
  182. package/ts/functions.canonicaldirectory.ts +213 -0
  183. package/ts/functions.controllerdataroot.ts +107 -0
  184. package/ts/functions.embeddeddb.ts +22 -0
  185. package/ts/functions.flexcredentialstore.ts +128 -0
  186. package/ts/functions.opencodeauth.ts +34 -0
  187. package/ts/functions.runtimeenvironment.ts +90 -0
  188. package/ts/functions.upgradefollower.ts +115 -0
  189. package/ts/index.ts +36 -6
  190. package/ts/interfaces.auth.ts +316 -0
  191. package/ts/interfaces.config.ts +37 -0
  192. package/ts/interfaces.flexipc.ts +2586 -0
  193. package/ts/interfaces.gitreversion.ts +336 -0
  194. package/ts/interfaces.lifecycle.ts +46 -0
  195. package/ts/interfaces.opencode.ts +153 -0
  196. package/ts/interfaces.projects.ts +182 -0
  197. package/ts/plugins.ts +64 -0
  198. package/ts_interfaces/index.ts +2 -0
  199. package/ts_interfaces/interfaces.ts +827 -0
  200. package/ts_interfaces/plugins.ts +15 -0
  201. package/ts_interfaces/requests.ts +1186 -0
  202. package/ts_migration/classes.documentmigrationrunner.ts +32 -0
  203. package/ts_migration/classes.flexmigrationrunner.ts +33 -0
  204. package/ts_migration/classes.flexpostharnessmigrationrunner.ts +22 -0
  205. package/ts_migration/classes.migrationrunner.ts +40 -0
  206. package/ts_migration/index.ts +12 -0
  207. package/ts_migration/v10_flexharnessv3migration.ts +35 -0
  208. package/ts_migration/v13_flexprojectionorder.ts +33 -0
  209. package/ts_migration/v16_flexprovidercredentials.ts +196 -0
  210. package/ts_migration/v18_resourcelayout.ts +55 -0
  211. package/ts_migration/v18_resourcelayoutmigration.ts +68 -0
  212. package/ts_migration/v19_flexprojectmanagement.ts +28 -0
  213. package/ts_migration/v1_embeddeddatabaselocation.ts +560 -0
  214. package/ts_migration/v22_projectfilesystemidentitymigration.ts +121 -0
  215. package/ts_migration/v2_controllerdataroot.ts +2349 -0
  216. package/ts_migration/v6_protocoldocumentmigration.ts +144 -0
  217. package/ts_migration/v6_protocoldocuments.ts +198 -0
  218. package/ts_web/00_commitinfo_data.ts +8 -0
  219. package/ts_web/classes.controllersocketclient.ts +517 -0
  220. package/ts_web/classes.sessiondraftsync.ts +390 -0
  221. package/ts_web/elements.harnesscontrollerapp.ts +11494 -0
  222. package/ts_web/index.ts +2 -0
  223. package/ts_web/plugins.ts +31 -0
  224. package/.gitlab-ci.yml +0 -71
  225. package/.npmignore +0 -5
  226. package/README.md +0 -40
  227. package/dist/cli.js +0 -2
  228. package/dist/index.d.ts +0 -0
  229. package/dist/index.js +0 -9
  230. package/dist/mod_bundle/index.d.ts +0 -1
  231. package/dist/mod_bundle/index.js +0 -18
  232. package/dist/mod_bundle/mod.plugins.d.ts +0 -4
  233. package/dist/mod_bundle/mod.plugins.js +0 -11
  234. package/dist/mod_install/index.d.ts +0 -4
  235. package/dist/mod_install/index.js +0 -21
  236. package/dist/mod_install/mod.plugins.d.ts +0 -1
  237. package/dist/mod_install/mod.plugins.js +0 -7
  238. package/dist/mod_standard/index.d.ts +0 -4
  239. package/dist/mod_standard/index.js +0 -21
  240. package/dist/mod_standard/mod.browser.d.ts +0 -6
  241. package/dist/mod_standard/mod.browser.js +0 -14
  242. package/dist/mod_standard/mod.clean.d.ts +0 -4
  243. package/dist/mod_standard/mod.clean.js +0 -12
  244. package/dist/mod_standard/mod.compile.d.ts +0 -4
  245. package/dist/mod_standard/mod.compile.js +0 -21
  246. package/dist/mod_standard/mod.plugins.d.ts +0 -8
  247. package/dist/mod_standard/mod.plugins.js +0 -19
  248. package/dist/mod_standard/mod.test.d.ts +0 -4
  249. package/dist/mod_standard/mod.test.js +0 -12
  250. package/dist/plr.cli.d.ts +0 -3
  251. package/dist/plr.cli.js +0 -57
  252. package/dist/plr.config.d.ts +0 -11
  253. package/dist/plr.config.js +0 -26
  254. package/dist/plr.mods.d.ts +0 -17
  255. package/dist/plr.mods.js +0 -17
  256. package/dist/plr.paths.d.ts +0 -19
  257. package/dist/plr.paths.js +0 -26
  258. package/dist/plr.plugins.d.ts +0 -8
  259. package/dist/plr.plugins.js +0 -16
  260. package/npmextra.json +0 -10
  261. package/ts/mod_bundle/index.ts +0 -20
  262. package/ts/mod_bundle/mod.plugins.ts +0 -9
  263. package/ts/mod_install/index.ts +0 -20
  264. package/ts/mod_install/mod.plugins.ts +0 -1
  265. package/ts/mod_standard/index.ts +0 -23
  266. package/ts/mod_standard/mod.browser.ts +0 -17
  267. package/ts/mod_standard/mod.clean.ts +0 -13
  268. package/ts/mod_standard/mod.compile.ts +0 -23
  269. package/ts/mod_standard/mod.plugins.ts +0 -17
  270. package/ts/mod_standard/mod.test.ts +0 -13
  271. package/ts/plr.cli.ts +0 -60
  272. package/ts/plr.config.ts +0 -36
  273. package/ts/plr.mods.ts +0 -25
  274. package/ts/plr.paths.ts +0 -29
  275. package/ts/plr.plugins.ts +0 -17
  276. package/tslint.json +0 -3
  277. package/yarn.lock +0 -3464
@@ -0,0 +1,2125 @@
1
+ import * as plugins from './plugins.js';
2
+ import { commitinfo } from './00_commitinfo_data.js';
3
+ import { controllerPackageName, controllerProtocolVersion, controllerUpgradeManagementVersion, } from '../dist_ts_interfaces/index.js';
4
+ import { controllerDataDirectory } from './classes.config.js';
5
+ import { isLoopbackPortListening, queryControllerStatus, requestControllerUpgradeFinalize, requestControllerUpgradePrepareBegin, stopVerifiedController, } from './classes.controllermanagement.js';
6
+ import { inspectControllerProcess, listControllerDataWriterProcessesForCli, listControllerProcessesForCli, processIdentityHasCliCommand, readControllerProcessIdentity, readProcessGroupMemberPids, } from './classes.processinspection.js';
7
+ import { createUpgradeToken, UpgradeCoordinator, upgradeCoordinationVersion, upgradePackageTransitionTransactionVersion, upgradePackageTransitionSource, upgradePackageTransitionTarget, upgradeTokenEnvironmentVariable, serializeUpgradeWorkerPayload, } from './classes.upgradecoordinator.js';
8
+ const npmRegistryUrl = 'https://registry.npmjs.org/';
9
+ const commandOutputByteLimit = 1024 * 1024;
10
+ const loggedCommandOutputByteLimit = 16 * 1024 * 1024;
11
+ const packageManagerTimeoutMs = 10 * 60 * 1000;
12
+ const controllerRestartTimeoutMs = 90_000;
13
+ const commandGroupDrainTimeoutMs = 5_000;
14
+ const candidateCleanupRetryIntervalMs = 250;
15
+ const retainedUpgradeLogCount = 10;
16
+ const minimumPrunableUpgradeLogAgeMs = 30 * 60 * 1000;
17
+ const upgradePreparationPollMs = 250;
18
+ const upgradePreparationSourceCheckMs = 500;
19
+ const upgradePreparationAcceptanceReconciliationMs = 5_000;
20
+ const upgradePreparationCleanupAllowanceMs = 60_000;
21
+ const upgradeLogPattern = /^upgrade-[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{6}\.[0-9]{3}Z-[A-Za-z0-9_-]{10}\.log$/;
22
+ const semverPattern = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/;
23
+ let upgradeWorkerCliPath;
24
+ const currentPackageIdentity = String(controllerPackageName)
25
+ === upgradePackageTransitionSource.packageName
26
+ ? upgradePackageTransitionSource
27
+ : upgradePackageTransitionTarget;
28
+ const currentCliName = currentPackageIdentity.cliName;
29
+ const packageManagerEnvironmentAllowlist = new Set([
30
+ 'CI',
31
+ 'COREPACK_HOME',
32
+ 'FORCE_COLOR',
33
+ 'HOME',
34
+ 'HTTP_PROXY',
35
+ 'HTTPS_PROXY',
36
+ 'LANG',
37
+ 'LOGNAME',
38
+ 'NODE_EXTRA_CA_CERTS',
39
+ 'NO_PROXY',
40
+ 'NPM_CONFIG_REGISTRY',
41
+ 'NPM_CONFIG_USERCONFIG',
42
+ 'PATH',
43
+ 'PNPM_HOME',
44
+ 'SHELL',
45
+ 'SSL_CERT_DIR',
46
+ 'SSL_CERT_FILE',
47
+ 'TEMP',
48
+ 'TERM',
49
+ 'TMP',
50
+ 'TMPDIR',
51
+ 'TZ',
52
+ 'USER',
53
+ 'XDG_CACHE_HOME',
54
+ 'XDG_CONFIG_HOME',
55
+ 'XDG_DATA_HOME',
56
+ 'XDG_RUNTIME_DIR',
57
+ 'XDG_STATE_HOME',
58
+ ]);
59
+ class UpgradeCommandCleanupError extends Error {
60
+ }
61
+ const proxyEnvironmentValueIsSafe = (valueArg) => {
62
+ try {
63
+ const parsed = new URL(valueArg);
64
+ return parsed.username.length === 0 && parsed.password.length === 0;
65
+ }
66
+ catch {
67
+ return false;
68
+ }
69
+ };
70
+ export const createPackageManagerEnvironment = (sourceArg = process.env) => {
71
+ const environment = {};
72
+ for (const [name, value] of Object.entries(sourceArg)) {
73
+ if (value === undefined)
74
+ continue;
75
+ const normalizedName = name.toUpperCase();
76
+ if (!packageManagerEnvironmentAllowlist.has(normalizedName)
77
+ && !normalizedName.startsWith('LC_'))
78
+ continue;
79
+ if ((normalizedName === 'HTTP_PROXY' || normalizedName === 'HTTPS_PROXY')
80
+ && !proxyEnvironmentValueIsSafe(value))
81
+ continue;
82
+ environment[name] = value;
83
+ }
84
+ return environment;
85
+ };
86
+ const findExecutable = async (nameArg, environmentArg) => {
87
+ const pathValue = environmentArg.PATH;
88
+ if (!pathValue)
89
+ throw new Error(`Unable to locate ${nameArg}: PATH is empty.`);
90
+ for (const directory of pathValue.split(plugins.path.delimiter)) {
91
+ if (!directory)
92
+ continue;
93
+ const candidate = plugins.path.join(directory, nameArg);
94
+ try {
95
+ await plugins.fs.promises.access(candidate, plugins.fs.constants.X_OK);
96
+ return await plugins.fs.promises.realpath(candidate);
97
+ }
98
+ catch {
99
+ continue;
100
+ }
101
+ }
102
+ throw new Error(`Unable to locate ${nameArg} on PATH.`);
103
+ };
104
+ const prepareManagedCommand = async (optionsArg) => {
105
+ const workerIdentity = await readControllerProcessIdentity(process.pid);
106
+ if (!workerIdentity)
107
+ throw new Error('Unable to establish upgrade command ownership.');
108
+ const ownsWorkerProcessGroup = workerIdentity.processGroupLeader
109
+ && await processIdentityHasCliCommand(workerIdentity, upgradeWorkerCliPath ?? await resolveCurrentCliPath(), '__upgrade-worker', { allowMissingAbsolutePath: true });
110
+ return {
111
+ ...optionsArg,
112
+ cwd: plugins.os.homedir(),
113
+ workerIdentity,
114
+ ownsWorkerProcessGroup,
115
+ };
116
+ };
117
+ const runPreparedManagedCommand = async (optionsArg) => {
118
+ const child = plugins.childProcess.spawn(optionsArg.executable, optionsArg.arguments, {
119
+ cwd: optionsArg.cwd,
120
+ detached: !optionsArg.ownsWorkerProcessGroup,
121
+ env: optionsArg.environment,
122
+ shell: false,
123
+ stdio: ['ignore', 'pipe', 'pipe'],
124
+ });
125
+ const outcomePromise = new Promise((resolve) => {
126
+ child.once('error', (errorArg) => resolve({ code: null, signal: null, error: errorArg }));
127
+ child.once('close', (codeArg, signalArg) => resolve({ code: codeArg, signal: signalArg }));
128
+ });
129
+ const commandProcessGroupId = optionsArg.ownsWorkerProcessGroup
130
+ ? optionsArg.workerIdentity.processGroupId
131
+ : child.pid;
132
+ let stdout = '';
133
+ let stderr = '';
134
+ let outputBytes = 0;
135
+ let outputError;
136
+ const recordOutput = (streamArg, chunkArg, sourceArg) => {
137
+ outputBytes += chunkArg.byteLength;
138
+ if (outputBytes > (optionsArg.outputByteLimit ?? commandOutputByteLimit)) {
139
+ outputError ??= new Error('Upgrade command output exceeded its size limit.');
140
+ return;
141
+ }
142
+ if (optionsArg.captureOutput) {
143
+ if (streamArg === 'stdout')
144
+ stdout += chunkArg.toString('utf8');
145
+ else
146
+ stderr += chunkArg.toString('utf8');
147
+ return;
148
+ }
149
+ const destination = streamArg === 'stdout' ? process.stdout : process.stderr;
150
+ if (!destination.write(chunkArg) && sourceArg && 'pause' in sourceArg && 'resume' in sourceArg) {
151
+ sourceArg.pause();
152
+ destination.once('drain', () => sourceArg.resume());
153
+ }
154
+ };
155
+ child.stdout?.on('data', (chunkArg) => recordOutput('stdout', chunkArg, child.stdout));
156
+ child.stderr?.on('data', (chunkArg) => recordOutput('stderr', chunkArg, child.stderr));
157
+ const listCommandPids = async () => {
158
+ if (!commandProcessGroupId) {
159
+ return child.pid && child.exitCode === null && child.signalCode === null ? [child.pid] : [];
160
+ }
161
+ const members = await readProcessGroupMemberPids(commandProcessGroupId);
162
+ return optionsArg.ownsWorkerProcessGroup
163
+ ? members.filter((processIdArg) => processIdArg !== process.pid)
164
+ : members;
165
+ };
166
+ const signalDirectChild = (signalArg) => {
167
+ if (!child.pid || child.exitCode !== null || child.signalCode !== null)
168
+ return;
169
+ try {
170
+ process.kill(child.pid, signalArg);
171
+ }
172
+ catch (errorArg) {
173
+ if (errorArg.code !== 'ESRCH')
174
+ throw errorArg;
175
+ }
176
+ };
177
+ const signalCommand = async (signalArg) => {
178
+ let processIds;
179
+ try {
180
+ processIds = await listCommandPids();
181
+ }
182
+ catch (errorArg) {
183
+ signalDirectChild(signalArg);
184
+ throw errorArg;
185
+ }
186
+ for (const processId of processIds) {
187
+ try {
188
+ process.kill(processId, signalArg);
189
+ }
190
+ catch (errorArg) {
191
+ if (errorArg.code !== 'ESRCH')
192
+ throw errorArg;
193
+ }
194
+ }
195
+ };
196
+ const waitForCommandDrain = async (timeoutMsArg) => {
197
+ const deadline = Date.now() + timeoutMsArg;
198
+ while (Date.now() < deadline) {
199
+ if ((await listCommandPids()).length === 0)
200
+ return true;
201
+ await new Promise((resolve) => setTimeout(resolve, 50));
202
+ }
203
+ return (await listCommandPids()).length === 0;
204
+ };
205
+ let interruption;
206
+ let terminating;
207
+ let terminationError;
208
+ const terminate = () => {
209
+ if (terminating)
210
+ return terminating;
211
+ terminating = (async () => {
212
+ try {
213
+ await signalCommand('SIGTERM');
214
+ if (await waitForCommandDrain(commandGroupDrainTimeoutMs))
215
+ return;
216
+ await signalCommand('SIGKILL');
217
+ if (!await waitForCommandDrain(commandGroupDrainTimeoutMs)) {
218
+ throw new Error('The upgrade command process group did not terminate.');
219
+ }
220
+ }
221
+ catch (errorArg) {
222
+ terminationError = errorArg;
223
+ signalDirectChild('SIGKILL');
224
+ throw errorArg;
225
+ }
226
+ })();
227
+ return terminating;
228
+ };
229
+ const beginTermination = (reasonArg) => {
230
+ interruption ??= reasonArg;
231
+ void terminate().catch(() => undefined);
232
+ };
233
+ const onSigint = () => beginTermination('SIGINT');
234
+ const onSigterm = () => beginTermination('SIGTERM');
235
+ process.on('SIGINT', onSigint);
236
+ process.on('SIGTERM', onSigterm);
237
+ const timeout = setTimeout(() => beginTermination('timeout'), optionsArg.timeoutMs);
238
+ const outputLimitPoll = setInterval(() => {
239
+ if (outputError)
240
+ beginTermination('output limit');
241
+ }, 25);
242
+ try {
243
+ const outcome = await outcomePromise;
244
+ try {
245
+ if (!await waitForCommandDrain(2_000)) {
246
+ beginTermination('surviving child processes');
247
+ }
248
+ }
249
+ catch (errorArg) {
250
+ terminationError = errorArg;
251
+ signalDirectChild('SIGKILL');
252
+ }
253
+ if (terminating)
254
+ await terminating.catch(() => undefined);
255
+ if (terminationError) {
256
+ throw new UpgradeCommandCleanupError('Upgrade command cleanup failed.', {
257
+ cause: terminationError,
258
+ });
259
+ }
260
+ if (interruption) {
261
+ throw new Error(`${plugins.path.basename(optionsArg.executable)} was interrupted by ${interruption}.`);
262
+ }
263
+ if (outputError)
264
+ throw outputError;
265
+ if (outcome.error)
266
+ throw outcome.error;
267
+ if (outcome.code !== 0) {
268
+ throw new Error(`${plugins.path.basename(optionsArg.executable)} exited with ${outcome.signal ?? outcome.code ?? 'an unknown result'}${stderr.trim() ? `: ${stderr.trim()}` : '.'}`);
269
+ }
270
+ return { stdout, stderr };
271
+ }
272
+ finally {
273
+ clearTimeout(timeout);
274
+ clearInterval(outputLimitPoll);
275
+ process.removeListener('SIGINT', onSigint);
276
+ process.removeListener('SIGTERM', onSigterm);
277
+ }
278
+ };
279
+ const runManagedCommand = async (optionsArg) => await runPreparedManagedCommand(await prepareManagedCommand(optionsArg));
280
+ const runCapturedCommand = async (executableArg, argumentsArg, environmentArg, timeoutMsArg = 30_000, outputByteLimitArg = commandOutputByteLimit) => {
281
+ const result = await runManagedCommand({
282
+ executable: executableArg,
283
+ arguments: argumentsArg,
284
+ environment: environmentArg,
285
+ timeoutMs: timeoutMsArg,
286
+ captureOutput: true,
287
+ outputByteLimit: outputByteLimitArg,
288
+ });
289
+ return result.stdout;
290
+ };
291
+ const assertSingleLineAbsolutePath = async (valueArg, nameArg) => {
292
+ const value = valueArg.trim();
293
+ if (!value || value.includes('\n') || !plugins.path.isAbsolute(value)) {
294
+ throw new Error(`${nameArg} did not return one absolute path.`);
295
+ }
296
+ return await plugins.fs.promises.realpath(value);
297
+ };
298
+ const readGlobalListDependency = (outputArg, packageNameArg) => {
299
+ let value;
300
+ try {
301
+ value = JSON.parse(outputArg);
302
+ }
303
+ catch {
304
+ throw new Error('pnpm list --global returned malformed JSON.');
305
+ }
306
+ if (!Array.isArray(value)) {
307
+ throw new Error('pnpm list --global returned an unexpected result.');
308
+ }
309
+ const dependencies = value.flatMap((entryArg) => {
310
+ if (!entryArg || typeof entryArg !== 'object' || Array.isArray(entryArg))
311
+ return [];
312
+ const entry = entryArg;
313
+ const dependency = entry.dependencies?.[packageNameArg];
314
+ return dependency ? [dependency] : [];
315
+ });
316
+ if (dependencies.length !== 1) {
317
+ throw new Error(`Expected exactly one pnpm-global installation of ${packageNameArg}.`);
318
+ }
319
+ const dependency = dependencies[0];
320
+ if (typeof dependency.version !== 'string'
321
+ || typeof dependency.path !== 'string'
322
+ || !plugins.path.isAbsolute(dependency.path)) {
323
+ throw new Error('pnpm reported invalid global package metadata.');
324
+ }
325
+ return { version: dependency.version, path: dependency.path };
326
+ };
327
+ export const resolvePnpmGlobalInstallation = async () => {
328
+ if (process.platform !== 'linux' && process.platform !== 'darwin') {
329
+ throw new Error(`${currentCliName} upgrade is currently supported on Linux and macOS only.`);
330
+ }
331
+ const environment = createPackageManagerEnvironment();
332
+ const packageManagerPath = await findExecutable('pnpm', environment);
333
+ const globalRootOutput = await runCapturedCommand(packageManagerPath, ['root', '--global'], environment);
334
+ const globalBinOutput = await runCapturedCommand(packageManagerPath, ['bin', '--global'], environment);
335
+ const listOutput = await runCapturedCommand(packageManagerPath, ['list', '--global', controllerPackageName, '--depth=0', '--json'], environment);
336
+ const globalRoot = await assertSingleLineAbsolutePath(globalRootOutput, 'pnpm root --global');
337
+ const globalBinDirectory = await assertSingleLineAbsolutePath(globalBinOutput, 'pnpm bin --global');
338
+ const dependency = readGlobalListDependency(listOutput, controllerPackageName);
339
+ const dependencyRelativePath = plugins.path.relative(globalRoot, dependency.path);
340
+ if (dependencyRelativePath.startsWith(`..${plugins.path.sep}`)
341
+ || dependencyRelativePath === '..'
342
+ || plugins.path.isAbsolute(dependencyRelativePath)) {
343
+ throw new Error('pnpm reported a global package path outside its global root.');
344
+ }
345
+ const packageDirectory = await plugins.fs.promises.realpath(dependency.path);
346
+ const packageJsonPath = plugins.path.join(packageDirectory, 'package.json');
347
+ const packageJsonStats = await plugins.fs.promises.stat(packageJsonPath);
348
+ if (!packageJsonStats.isFile() || packageJsonStats.size < 2 || packageJsonStats.size > 64 * 1024) {
349
+ throw new Error(`The pnpm-global ${controllerPackageName} package metadata is not a bounded file.`);
350
+ }
351
+ const packageJson = JSON.parse(await plugins.fs.promises.readFile(packageJsonPath, 'utf8'));
352
+ const currentIdentity = currentPackageIdentity;
353
+ if (packageJson.name !== controllerPackageName
354
+ || packageJson.version !== dependency.version
355
+ || packageJson.controllerUpgradeManagementVersion !== currentIdentity.managementVersion
356
+ || Number(controllerUpgradeManagementVersion) !== currentIdentity.managementVersion
357
+ || !packageJson.bin
358
+ || typeof packageJson.bin !== 'object'
359
+ || Array.isArray(packageJson.bin)
360
+ || !Object.keys(packageJson.bin).length
361
+ || Object.keys(packageJson.bin).length !== 1
362
+ || packageJson.bin[currentIdentity.cliName] !== './cli.js') {
363
+ throw new Error(`The pnpm-global ${controllerPackageName} package metadata is incompatible.`);
364
+ }
365
+ const cliPath = await plugins.fs.promises.realpath(plugins.path.join(packageDirectory, 'cli.js'));
366
+ if (!(await plugins.fs.promises.stat(cliPath)).isFile()) {
367
+ throw new Error('The pnpm-global controller direct CLI is not a file.');
368
+ }
369
+ return {
370
+ packageManagerPath,
371
+ globalRoot,
372
+ globalBinDirectory,
373
+ packageDirectory,
374
+ cliPath,
375
+ packageVersion: dependency.version,
376
+ };
377
+ };
378
+ const parseGlobalListDependencies = (outputArg) => {
379
+ let value;
380
+ try {
381
+ value = JSON.parse(outputArg);
382
+ }
383
+ catch {
384
+ throw new Error('pnpm list --global returned malformed JSON.');
385
+ }
386
+ if (!Array.isArray(value) || value.length !== 1) {
387
+ throw new Error('pnpm list --global returned an unexpected package-transition result.');
388
+ }
389
+ const entry = value[0];
390
+ if (!entry || typeof entry !== 'object' || Array.isArray(entry)) {
391
+ throw new Error('pnpm list --global returned invalid package-transition metadata.');
392
+ }
393
+ const raw = entry;
394
+ if (typeof raw.path !== 'string' || !plugins.path.isAbsolute(raw.path)) {
395
+ throw new Error('pnpm list --global omitted its global package root.');
396
+ }
397
+ const dependencies = {};
398
+ for (const packageName of [
399
+ upgradePackageTransitionSource.packageName,
400
+ upgradePackageTransitionTarget.packageName,
401
+ ]) {
402
+ const dependency = raw.dependencies?.[packageName];
403
+ if (!dependency)
404
+ continue;
405
+ if (typeof dependency.version !== 'string'
406
+ || typeof dependency.path !== 'string'
407
+ || !plugins.path.isAbsolute(dependency.path))
408
+ throw new Error(`pnpm reported invalid global metadata for ${packageName}.`);
409
+ dependencies[packageName] = {
410
+ version: dependency.version,
411
+ path: dependency.path,
412
+ };
413
+ }
414
+ return { path: raw.path, dependencies };
415
+ };
416
+ const packageGroupDirectory = (globalRootArg, packagePathArg, packageNameArg) => {
417
+ const relative = plugins.path.relative(globalRootArg, packagePathArg);
418
+ if (!relative
419
+ || relative === '..'
420
+ || relative.startsWith(`..${plugins.path.sep}`)
421
+ || plugins.path.isAbsolute(relative))
422
+ throw new Error(`pnpm reported ${packageNameArg} outside its global root.`);
423
+ const expectedSuffix = plugins.path.join('node_modules', ...packageNameArg.split('/'));
424
+ const suffix = `${plugins.path.sep}${expectedSuffix}`;
425
+ if (!relative.endsWith(suffix)) {
426
+ throw new Error(`pnpm reported an unexpected global path for ${packageNameArg}.`);
427
+ }
428
+ const groupRelativePath = relative.slice(0, -suffix.length);
429
+ if (!groupRelativePath || groupRelativePath.includes(plugins.path.sep)) {
430
+ throw new Error(`pnpm reported an invalid isolated group for ${packageNameArg}.`);
431
+ }
432
+ return plugins.path.join(globalRootArg, groupRelativePath);
433
+ };
434
+ const readExactGlobalPackage = async (contextArg, dependencyArg, identityArg) => {
435
+ if (dependencyArg.version !== identityArg.version) {
436
+ throw new Error(`The pnpm-global ${identityArg.packageName} version is ${dependencyArg.version}, not ${identityArg.version}.`);
437
+ }
438
+ const groupDirectory = packageGroupDirectory(contextArg.globalRoot, dependencyArg.path, identityArg.packageName);
439
+ const packageDirectory = await plugins.fs.promises.realpath(dependencyArg.path);
440
+ const packageJsonPath = plugins.path.join(packageDirectory, 'package.json');
441
+ const packageJsonStats = await plugins.fs.promises.stat(packageJsonPath);
442
+ if (!packageJsonStats.isFile() || packageJsonStats.size < 2 || packageJsonStats.size > 64 * 1024) {
443
+ throw new Error(`The pnpm-global ${identityArg.packageName} metadata is not a bounded file.`);
444
+ }
445
+ let packageJson;
446
+ try {
447
+ packageJson = JSON.parse(await plugins.fs.promises.readFile(packageJsonPath, 'utf8'));
448
+ }
449
+ catch (errorArg) {
450
+ throw new Error(`The pnpm-global ${identityArg.packageName} metadata is malformed.`, {
451
+ cause: errorArg,
452
+ });
453
+ }
454
+ if (!packageJson || typeof packageJson !== 'object' || Array.isArray(packageJson)) {
455
+ throw new Error(`The pnpm-global ${identityArg.packageName} metadata is invalid.`);
456
+ }
457
+ const manifest = packageJson;
458
+ const bin = manifest.bin;
459
+ if (manifest.name !== identityArg.packageName
460
+ || manifest.version !== identityArg.version
461
+ || manifest.controllerUpgradeManagementVersion !== identityArg.managementVersion
462
+ || !bin
463
+ || typeof bin !== 'object'
464
+ || Array.isArray(bin)
465
+ || Object.keys(bin).length !== 1
466
+ || bin[identityArg.cliName] !== identityArg.cliRelativePath)
467
+ throw new Error(`The pnpm-global ${identityArg.packageName} identity is incompatible.`);
468
+ const cliPath = await plugins.fs.promises.realpath(plugins.path.join(packageDirectory, identityArg.cliRelativePath));
469
+ if (!(await plugins.fs.promises.stat(cliPath)).isFile()) {
470
+ throw new Error(`The pnpm-global ${identityArg.packageName} direct CLI is not a file.`);
471
+ }
472
+ return {
473
+ packageManagerPath: contextArg.packageManagerPath,
474
+ globalRoot: contextArg.globalRoot,
475
+ globalBinDirectory: contextArg.globalBinDirectory,
476
+ packageDirectory,
477
+ cliPath,
478
+ packageVersion: identityArg.version,
479
+ packageName: identityArg.packageName,
480
+ cliName: identityArg.cliName,
481
+ cliRelativePath: identityArg.cliRelativePath,
482
+ listedPackagePath: dependencyArg.path,
483
+ groupDirectory,
484
+ };
485
+ };
486
+ const readGlobalShimTarget = async (binDirectoryArg, cliNameArg) => {
487
+ const shimPath = plugins.path.join(binDirectoryArg, cliNameArg);
488
+ let stats;
489
+ try {
490
+ stats = await plugins.fs.promises.lstat(shimPath);
491
+ }
492
+ catch (errorArg) {
493
+ if (errorArg.code === 'ENOENT')
494
+ return undefined;
495
+ throw errorArg;
496
+ }
497
+ if (!stats.isFile()
498
+ || stats.isSymbolicLink()
499
+ || stats.size < 2
500
+ || stats.size > 1024 * 1024
501
+ || (stats.mode & 0o111) === 0)
502
+ throw new Error(`The pnpm-global ${cliNameArg} shim is not a bounded executable file.`);
503
+ const contents = await plugins.fs.promises.readFile(shimPath, 'utf8');
504
+ const markers = [...contents.matchAll(/^# cmd-shim-target=(.+)$/gm)];
505
+ if (markers.length !== 1 || !plugins.path.isAbsolute(markers[0][1])) {
506
+ throw new Error(`The pnpm-global ${cliNameArg} shim has no exact ownership marker.`);
507
+ }
508
+ try {
509
+ return await plugins.fs.promises.realpath(markers[0][1]);
510
+ }
511
+ catch (errorArg) {
512
+ throw new Error(`The pnpm-global ${cliNameArg} shim target is unavailable.`, {
513
+ cause: errorArg,
514
+ });
515
+ }
516
+ };
517
+ const assertGlobalShimOwnership = async (binDirectoryArg, cliNameArg, cliPathArg) => {
518
+ const markerTarget = await readGlobalShimTarget(binDirectoryArg, cliNameArg);
519
+ if (markerTarget === undefined) {
520
+ if (cliPathArg === undefined)
521
+ return;
522
+ throw new Error(`The pnpm-global ${cliNameArg} shim is missing.`);
523
+ }
524
+ if (cliPathArg === undefined) {
525
+ throw new Error(`The pnpm-global ${cliNameArg} shim survived without its owning package.`);
526
+ }
527
+ if (markerTarget !== cliPathArg) {
528
+ throw new Error(`The pnpm-global ${cliNameArg} shim is owned by a different package.`);
529
+ }
530
+ };
531
+ const maximumPnpmGlobalGroups = 1_024;
532
+ const findExactGlobalPackageLink = async (globalRootArg, packageNameArg, packageDirectoryArg) => {
533
+ const entries = await plugins.fs.promises.readdir(globalRootArg, { withFileTypes: true });
534
+ if (entries.length > maximumPnpmGlobalGroups) {
535
+ throw new Error('The pnpm global root exceeds the recovery scan bound.');
536
+ }
537
+ const matches = [];
538
+ for (const entry of entries) {
539
+ if (!entry.isDirectory())
540
+ continue;
541
+ const candidate = plugins.path.join(globalRootArg, entry.name, 'node_modules', ...packageNameArg.split('/'));
542
+ try {
543
+ if (await plugins.fs.promises.realpath(candidate) === packageDirectoryArg) {
544
+ matches.push(candidate);
545
+ }
546
+ }
547
+ catch (errorArg) {
548
+ const code = errorArg.code;
549
+ if (code !== 'ENOENT' && code !== 'ENOTDIR')
550
+ throw errorArg;
551
+ }
552
+ }
553
+ if (matches.length !== 1) {
554
+ throw new Error(`Expected exactly one filesystem-owned installation of ${packageNameArg}.`);
555
+ }
556
+ return {
557
+ listedPackagePath: matches[0],
558
+ groupDirectory: packageGroupDirectory(globalRootArg, matches[0], packageNameArg),
559
+ };
560
+ };
561
+ const resolveAuthoritativeRecoveryInstallation = async (transactionArg, capturedInstallationArg) => {
562
+ const [globalRoot, globalBinDirectory, packageManagerPath] = await Promise.all([
563
+ plugins.fs.promises.realpath(capturedInstallationArg.globalRoot),
564
+ plugins.fs.promises.realpath(capturedInstallationArg.globalBinDirectory),
565
+ plugins.fs.promises.realpath(capturedInstallationArg.packageManagerPath),
566
+ ]);
567
+ if (globalRoot !== capturedInstallationArg.globalRoot
568
+ || globalBinDirectory !== capturedInstallationArg.globalBinDirectory
569
+ || packageManagerPath !== capturedInstallationArg.packageManagerPath)
570
+ throw new Error('The captured pnpm recovery paths changed unexpectedly.');
571
+ await plugins.fs.promises.access(packageManagerPath, plugins.fs.constants.X_OK);
572
+ const currentIdentity = transactionArg.version === upgradePackageTransitionTransactionVersion
573
+ ? (() => {
574
+ const identity = transactionArg.targetPackageCommitStarted === true
575
+ ? upgradePackageTransitionTarget
576
+ : upgradePackageTransitionSource;
577
+ return {
578
+ packageName: identity.packageName,
579
+ versions: [identity.version],
580
+ managementVersion: identity.managementVersion,
581
+ cliName: identity.cliName,
582
+ cliRelativePath: identity.cliRelativePath,
583
+ };
584
+ })()
585
+ : (() => {
586
+ const identity = String(controllerPackageName) === upgradePackageTransitionTarget.packageName
587
+ ? upgradePackageTransitionTarget
588
+ : upgradePackageTransitionSource;
589
+ return {
590
+ packageName: String(controllerPackageName),
591
+ versions: [
592
+ transactionArg.sourceVersion,
593
+ ...(transactionArg.targetVersion ? [transactionArg.targetVersion] : []),
594
+ ],
595
+ managementVersion: Number(controllerUpgradeManagementVersion),
596
+ cliName: identity.cliName,
597
+ cliRelativePath: identity.cliRelativePath,
598
+ };
599
+ })();
600
+ const cliPath = await readGlobalShimTarget(globalBinDirectory, currentIdentity.cliName);
601
+ if (!cliPath) {
602
+ throw new Error(`The authoritative pnpm-global ${currentIdentity.cliName} shim is missing.`);
603
+ }
604
+ const packageDirectory = plugins.path.dirname(cliPath);
605
+ if (await plugins.fs.promises.realpath(plugins.path.join(packageDirectory, currentIdentity.cliRelativePath)) !== cliPath)
606
+ throw new Error('The authoritative recovery CLI path is incompatible.');
607
+ const packageJsonPath = plugins.path.join(packageDirectory, 'package.json');
608
+ const packageJsonStats = await plugins.fs.promises.stat(packageJsonPath);
609
+ if (!packageJsonStats.isFile() || packageJsonStats.size < 2 || packageJsonStats.size > 64 * 1024) {
610
+ throw new Error('The authoritative recovery package metadata is not a bounded file.');
611
+ }
612
+ let packageJson;
613
+ try {
614
+ packageJson = JSON.parse(await plugins.fs.promises.readFile(packageJsonPath, 'utf8'));
615
+ }
616
+ catch (errorArg) {
617
+ throw new Error('The authoritative recovery package metadata is malformed.', {
618
+ cause: errorArg,
619
+ });
620
+ }
621
+ if (!packageJson || typeof packageJson !== 'object' || Array.isArray(packageJson)) {
622
+ throw new Error('The authoritative recovery package metadata is invalid.');
623
+ }
624
+ const manifest = packageJson;
625
+ const bin = manifest.bin;
626
+ if (manifest.name !== currentIdentity.packageName
627
+ || typeof manifest.version !== 'string'
628
+ || !currentIdentity.versions.includes(manifest.version)
629
+ || manifest.controllerUpgradeManagementVersion !== currentIdentity.managementVersion
630
+ || !bin
631
+ || typeof bin !== 'object'
632
+ || Array.isArray(bin)
633
+ || Object.keys(bin).length !== 1
634
+ || bin[currentIdentity.cliName]
635
+ !== currentIdentity.cliRelativePath)
636
+ throw new Error('The authoritative recovery package identity is incompatible.');
637
+ if (!(await plugins.fs.promises.stat(cliPath)).isFile()) {
638
+ throw new Error('The authoritative recovery CLI is not a file.');
639
+ }
640
+ await findExactGlobalPackageLink(globalRoot, currentIdentity.packageName, packageDirectory);
641
+ return {
642
+ packageManagerPath,
643
+ globalRoot,
644
+ globalBinDirectory,
645
+ packageDirectory,
646
+ cliPath,
647
+ packageVersion: manifest.version,
648
+ };
649
+ };
650
+ const verifyPackageTransitionTopology = async (contextArg, expectedArg) => {
651
+ const output = await runCapturedCommand(contextArg.packageManagerPath, [
652
+ 'list',
653
+ '--global',
654
+ upgradePackageTransitionSource.packageName,
655
+ upgradePackageTransitionTarget.packageName,
656
+ '--depth=0',
657
+ '--json',
658
+ ], createPackageManagerEnvironment());
659
+ const listed = parseGlobalListDependencies(output);
660
+ if (await plugins.fs.promises.realpath(listed.path) !== contextArg.globalRoot) {
661
+ throw new Error('The pnpm global root changed during the package transition.');
662
+ }
663
+ const sourceDependency = listed.dependencies[upgradePackageTransitionSource.packageName];
664
+ const targetDependency = listed.dependencies[upgradePackageTransitionTarget.packageName];
665
+ const sourceExpected = expectedArg !== 'target-only';
666
+ const targetExpected = expectedArg !== 'source-only';
667
+ if (Boolean(sourceDependency) !== sourceExpected || Boolean(targetDependency) !== targetExpected) {
668
+ throw new Error(`The pnpm-global package topology is not ${expectedArg}.`);
669
+ }
670
+ const [source, target] = await Promise.all([
671
+ sourceDependency
672
+ ? readExactGlobalPackage(contextArg, sourceDependency, upgradePackageTransitionSource)
673
+ : undefined,
674
+ targetDependency
675
+ ? readExactGlobalPackage(contextArg, targetDependency, upgradePackageTransitionTarget)
676
+ : undefined,
677
+ ]);
678
+ if (expectedArg === 'grouped' && source?.groupDirectory !== target?.groupDirectory) {
679
+ throw new Error('The source and target packages are not installed in one pnpm group.');
680
+ }
681
+ await Promise.all([
682
+ assertGlobalShimOwnership(contextArg.globalBinDirectory, upgradePackageTransitionSource.cliName, source?.cliPath),
683
+ assertGlobalShimOwnership(contextArg.globalBinDirectory, upgradePackageTransitionTarget.cliName, target?.cliPath),
684
+ ]);
685
+ return {
686
+ ...(source ? { source } : {}),
687
+ ...(target ? { target } : {}),
688
+ };
689
+ };
690
+ const resolvePackageManagerContext = async () => {
691
+ if (process.platform !== 'linux' && process.platform !== 'darwin') {
692
+ throw new Error(`${currentCliName} upgrade is currently supported on Linux and macOS only.`);
693
+ }
694
+ const environment = createPackageManagerEnvironment();
695
+ const packageManagerPath = await findExecutable('pnpm', environment);
696
+ const globalRoot = await assertSingleLineAbsolutePath(await runCapturedCommand(packageManagerPath, ['root', '--global'], environment), 'pnpm root --global');
697
+ const globalBinDirectory = await assertSingleLineAbsolutePath(await runCapturedCommand(packageManagerPath, ['bin', '--global'], environment), 'pnpm bin --global');
698
+ return { packageManagerPath, globalRoot, globalBinDirectory };
699
+ };
700
+ export const resolveInheritedUpgradeTargetInstallation = async (transactionArg) => {
701
+ if (transactionArg.version === upgradeCoordinationVersion) {
702
+ return await resolvePnpmGlobalInstallation();
703
+ }
704
+ const topology = await verifyPackageTransitionTopology(await resolvePackageManagerContext(), 'target-only');
705
+ if (!topology.target)
706
+ throw new Error('The committed target package is unavailable.');
707
+ return topology.target;
708
+ };
709
+ export const resolveCurrentCliPath = async () => {
710
+ return await plugins.fs.promises.realpath(plugins.url.fileURLToPath(new URL('../cli.js', import.meta.url)));
711
+ };
712
+ const currentPackageIsDevelopmentCheckout = async () => {
713
+ const packageRoot = plugins.path.dirname(await resolveCurrentCliPath());
714
+ try {
715
+ const stats = await plugins.fs.promises.lstat(plugins.path.join(packageRoot, '.git'));
716
+ return stats.isDirectory() || stats.isFile();
717
+ }
718
+ catch (errorArg) {
719
+ if (errorArg.code === 'ENOENT')
720
+ return false;
721
+ throw errorArg;
722
+ }
723
+ };
724
+ export const resolveCurrentPnpmGlobalInstallation = async () => {
725
+ const [installation, cliPath] = await Promise.all([
726
+ resolvePnpmGlobalInstallation(),
727
+ resolveCurrentCliPath(),
728
+ ]);
729
+ if (installation.cliPath !== cliPath || installation.packageVersion !== commitinfo.version) {
730
+ throw new Error(`${currentCliName} upgrade must be run from the active pnpm-global installation.`);
731
+ }
732
+ return installation;
733
+ };
734
+ export const tryResolveCurrentPnpmGlobalInstallation = async () => {
735
+ if (await currentPackageIsDevelopmentCheckout())
736
+ return undefined;
737
+ return await resolveCurrentPnpmGlobalInstallation();
738
+ };
739
+ const parseSemver = (valueArg) => {
740
+ const match = semverPattern.exec(valueArg);
741
+ if (!match)
742
+ throw new Error(`Invalid semantic version: ${valueArg}`);
743
+ const prerelease = match[4]?.split('.') ?? [];
744
+ if (prerelease.some((identifierArg) => /^\d+$/.test(identifierArg)
745
+ && identifierArg.length > 1
746
+ && identifierArg.startsWith('0'))) {
747
+ throw new Error(`Invalid semantic version: ${valueArg}`);
748
+ }
749
+ return {
750
+ major: match[1],
751
+ minor: match[2],
752
+ patch: match[3],
753
+ prerelease,
754
+ };
755
+ };
756
+ const compareNumericStrings = (leftArg, rightArg) => {
757
+ if (leftArg.length !== rightArg.length)
758
+ return leftArg.length < rightArg.length ? -1 : 1;
759
+ return leftArg === rightArg ? 0 : leftArg < rightArg ? -1 : 1;
760
+ };
761
+ export const compareSemver = (leftArg, rightArg) => {
762
+ const left = parseSemver(leftArg);
763
+ const right = parseSemver(rightArg);
764
+ for (const key of ['major', 'minor', 'patch']) {
765
+ const comparison = compareNumericStrings(left[key], right[key]);
766
+ if (comparison !== 0)
767
+ return comparison;
768
+ }
769
+ if (left.prerelease.length === 0 || right.prerelease.length === 0) {
770
+ if (left.prerelease.length === right.prerelease.length)
771
+ return 0;
772
+ return left.prerelease.length === 0 ? 1 : -1;
773
+ }
774
+ const identifierCount = Math.max(left.prerelease.length, right.prerelease.length);
775
+ for (let index = 0; index < identifierCount; index++) {
776
+ const leftIdentifier = left.prerelease[index];
777
+ const rightIdentifier = right.prerelease[index];
778
+ if (leftIdentifier === undefined || rightIdentifier === undefined) {
779
+ return leftIdentifier === rightIdentifier ? 0 : leftIdentifier === undefined ? -1 : 1;
780
+ }
781
+ if (leftIdentifier === rightIdentifier)
782
+ continue;
783
+ const leftNumeric = /^\d+$/.test(leftIdentifier);
784
+ const rightNumeric = /^\d+$/.test(rightIdentifier);
785
+ if (leftNumeric && rightNumeric) {
786
+ return compareNumericStrings(leftIdentifier, rightIdentifier);
787
+ }
788
+ if (leftNumeric !== rightNumeric)
789
+ return leftNumeric ? -1 : 1;
790
+ return leftIdentifier < rightIdentifier ? -1 : 1;
791
+ }
792
+ return 0;
793
+ };
794
+ const readLatestVersion = async (installationArg) => {
795
+ const output = await runCapturedCommand(installationArg.packageManagerPath, [
796
+ 'view',
797
+ controllerPackageName,
798
+ 'dist-tags.latest',
799
+ `--registry=${npmRegistryUrl}`,
800
+ '--json',
801
+ ], createPackageManagerEnvironment());
802
+ let version;
803
+ try {
804
+ version = JSON.parse(output);
805
+ }
806
+ catch {
807
+ throw new Error('pnpm view returned malformed JSON for the npm latest tag.');
808
+ }
809
+ if (typeof version !== 'string') {
810
+ throw new Error('The npm latest tag did not resolve to one package version.');
811
+ }
812
+ parseSemver(version);
813
+ return version;
814
+ };
815
+ const assertInternalRegistryUrl = (valueArg) => {
816
+ let parsed;
817
+ try {
818
+ parsed = new URL(valueArg);
819
+ }
820
+ catch (errorArg) {
821
+ throw new Error('The internal upgrade registry URL is invalid.', { cause: errorArg });
822
+ }
823
+ if ((parsed.protocol !== 'https:' && parsed.protocol !== 'http:')
824
+ || parsed.username.length > 0
825
+ || parsed.password.length > 0)
826
+ throw new Error('The internal upgrade registry URL is unsafe.');
827
+ return parsed.toString();
828
+ };
829
+ const resolveExactPackageTransitionTarget = async (contextArg, registryUrlArg) => {
830
+ const output = await runCapturedCommand(contextArg.packageManagerPath, [
831
+ 'view',
832
+ `${upgradePackageTransitionTarget.packageName}@${upgradePackageTransitionTarget.version}`,
833
+ `--registry=${registryUrlArg}`,
834
+ '--json',
835
+ ], createPackageManagerEnvironment());
836
+ let metadata;
837
+ try {
838
+ metadata = JSON.parse(output);
839
+ }
840
+ catch (errorArg) {
841
+ throw new Error('pnpm view returned malformed target package metadata.', { cause: errorArg });
842
+ }
843
+ if (!metadata || typeof metadata !== 'object' || Array.isArray(metadata)) {
844
+ throw new Error('pnpm view returned invalid target package metadata.');
845
+ }
846
+ const manifest = metadata;
847
+ const bin = manifest.bin;
848
+ if (manifest.name !== upgradePackageTransitionTarget.packageName
849
+ || manifest.version !== upgradePackageTransitionTarget.version
850
+ || manifest.controllerUpgradeManagementVersion
851
+ !== upgradePackageTransitionTarget.managementVersion
852
+ || !bin
853
+ || typeof bin !== 'object'
854
+ || Array.isArray(bin)
855
+ || Object.keys(bin).length !== 1
856
+ || bin[upgradePackageTransitionTarget.cliName]
857
+ !== upgradePackageTransitionTarget.cliRelativePath)
858
+ throw new Error('The exact target package metadata is incompatible.');
859
+ };
860
+ const openUpgradeLog = async (tokenArg) => {
861
+ const directory = controllerDataDirectory();
862
+ await plugins.fs.promises.mkdir(directory, { recursive: true, mode: 0o700 });
863
+ const directoryStats = await plugins.fs.promises.lstat(directory);
864
+ if (!directoryStats.isDirectory()
865
+ || directoryStats.isSymbolicLink()
866
+ || (typeof process.getuid === 'function' && directoryStats.uid !== process.getuid())
867
+ || (directoryStats.mode & 0o077) !== 0) {
868
+ throw new Error(`The ${currentCliName} upgrade log directory is unsafe: ${directory}`);
869
+ }
870
+ const existingLogs = [];
871
+ for (const entry of await plugins.fs.promises.readdir(directory, { withFileTypes: true })) {
872
+ if (!entry.isFile() || !upgradeLogPattern.test(entry.name))
873
+ continue;
874
+ const existingPath = plugins.path.join(directory, entry.name);
875
+ const stats = await plugins.fs.promises.lstat(existingPath);
876
+ if (!stats.isFile()
877
+ || stats.isSymbolicLink()
878
+ || (typeof process.getuid === 'function' && stats.uid !== process.getuid())
879
+ || (stats.mode & 0o077) !== 0) {
880
+ throw new Error(`An existing ${currentCliName} upgrade log is unsafe: ${existingPath}`);
881
+ }
882
+ existingLogs.push({ path: existingPath, mtimeMs: stats.mtimeMs });
883
+ }
884
+ existingLogs.sort((leftArg, rightArg) => rightArg.mtimeMs - leftArg.mtimeMs);
885
+ for (const staleLog of existingLogs.slice(retainedUpgradeLogCount - 1)) {
886
+ if (Date.now() - staleLog.mtimeMs < minimumPrunableUpgradeLogAgeMs)
887
+ continue;
888
+ await plugins.fs.promises.unlink(staleLog.path).catch((errorArg) => {
889
+ if (errorArg.code !== 'ENOENT')
890
+ throw errorArg;
891
+ });
892
+ }
893
+ const filePath = plugins.path.join(directory, `upgrade-${new Date().toISOString().replaceAll(':', '')}-${plugins.crypto
894
+ .createHash('sha256')
895
+ .update(tokenArg, 'utf8')
896
+ .digest('hex')
897
+ .slice(0, 10)}.log`);
898
+ const handle = await plugins.fs.promises.open(filePath, plugins.fs.constants.O_WRONLY
899
+ | plugins.fs.constants.O_APPEND
900
+ | plugins.fs.constants.O_CREAT
901
+ | plugins.fs.constants.O_EXCL
902
+ | plugins.fs.constants.O_NOFOLLOW, 0o600);
903
+ return { handle, path: filePath };
904
+ };
905
+ const serializeUpgradeRecoveryWorkerContext = (contextArg) => Buffer.from(JSON.stringify(contextArg), 'utf8').toString('base64url');
906
+ const parseUpgradeRecoveryWorkerContext = (valueArg) => {
907
+ if (typeof valueArg !== 'string' || valueArg.length < 16 || valueArg.length > 16 * 1024) {
908
+ throw new Error('The internal upgrade recovery worker context is invalid.');
909
+ }
910
+ let parsed;
911
+ try {
912
+ parsed = JSON.parse(Buffer.from(valueArg, 'base64url').toString('utf8'));
913
+ }
914
+ catch (errorArg) {
915
+ throw new Error('The internal upgrade recovery worker context is malformed.', {
916
+ cause: errorArg,
917
+ });
918
+ }
919
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
920
+ throw new Error('The internal upgrade recovery worker context is malformed.');
921
+ }
922
+ const context = parsed;
923
+ if (Object.keys(context).length !== 6
924
+ || ![
925
+ 'version',
926
+ 'mode',
927
+ 'canonicalGlobalRoot',
928
+ 'packageManagerPath',
929
+ 'globalBinDirectory',
930
+ 'cliPath',
931
+ ].every((keyArg) => Object.hasOwn(context, keyArg))
932
+ || context.version !== 1
933
+ || context.mode !== 'recovery'
934
+ || typeof context.canonicalGlobalRoot !== 'string'
935
+ || typeof context.packageManagerPath !== 'string'
936
+ || typeof context.globalBinDirectory !== 'string'
937
+ || typeof context.cliPath !== 'string'
938
+ || !plugins.path.isAbsolute(context.canonicalGlobalRoot)
939
+ || !plugins.path.isAbsolute(context.packageManagerPath)
940
+ || !plugins.path.isAbsolute(context.globalBinDirectory)
941
+ || !plugins.path.isAbsolute(context.cliPath))
942
+ throw new Error('The internal upgrade recovery worker context is incompatible.');
943
+ return context;
944
+ };
945
+ const waitForProcessGroupDrain = async (processGroupIdArg, timeoutMsArg) => {
946
+ const deadline = Date.now() + timeoutMsArg;
947
+ while (Date.now() < deadline) {
948
+ if ((await readProcessGroupMemberPids(processGroupIdArg)).length === 0)
949
+ return true;
950
+ await new Promise((resolve) => setTimeout(resolve, 50));
951
+ }
952
+ return (await readProcessGroupMemberPids(processGroupIdArg)).length === 0;
953
+ };
954
+ const terminateSpawnedDetachedWorker = async (processIdArg) => {
955
+ const signal = (signalArg) => {
956
+ try {
957
+ process.kill(-processIdArg, signalArg);
958
+ }
959
+ catch (errorArg) {
960
+ if (errorArg.code !== 'ESRCH')
961
+ throw errorArg;
962
+ }
963
+ };
964
+ signal('SIGTERM');
965
+ if (await waitForProcessGroupDrain(processIdArg, commandGroupDrainTimeoutMs))
966
+ return;
967
+ signal('SIGKILL');
968
+ if (!await waitForProcessGroupDrain(processIdArg, commandGroupDrainTimeoutMs)) {
969
+ throw new Error('The detached upgrade worker candidate group did not terminate.');
970
+ }
971
+ };
972
+ const retryCandidateCleanupUntilDrained = async (cleanupArg, dependenciesArg = {}, processIdArg) => {
973
+ const delay = dependenciesArg.delay
974
+ ?? (async (millisecondsArg) => new Promise((resolve) => (setTimeout(resolve, millisecondsArg))));
975
+ while (true) {
976
+ try {
977
+ await dependenciesArg.beforeAttempt?.(processIdArg);
978
+ await cleanupArg();
979
+ return;
980
+ }
981
+ catch {
982
+ await delay(candidateCleanupRetryIntervalMs);
983
+ }
984
+ }
985
+ };
986
+ const launchDetachedUpgradeWorkerProcess = async (optionsArg, dependenciesArg = {}) => {
987
+ if (process.platform !== 'linux' && process.platform !== 'darwin') {
988
+ throw new Error(`${currentCliName} upgrade is currently supported on Linux and macOS only.`);
989
+ }
990
+ const log = await openUpgradeLog(optionsArg.payload.token);
991
+ let child;
992
+ let logClosed = false;
993
+ try {
994
+ const launchedChild = plugins.childProcess.spawn(process.execPath, [
995
+ optionsArg.installation.cliPath,
996
+ '__upgrade-worker',
997
+ serializeUpgradeWorkerPayload(optionsArg.payload),
998
+ ...(optionsArg.internalArguments ?? []),
999
+ ], {
1000
+ cwd: plugins.os.homedir(),
1001
+ detached: true,
1002
+ env: {
1003
+ ...(optionsArg.environment ?? process.env),
1004
+ [upgradeTokenEnvironmentVariable]: optionsArg.payload.token,
1005
+ },
1006
+ shell: false,
1007
+ stdio: ['ignore', log.handle.fd, log.handle.fd],
1008
+ });
1009
+ child = launchedChild;
1010
+ await new Promise((resolve, reject) => {
1011
+ launchedChild.once('spawn', resolve);
1012
+ launchedChild.once('error', reject);
1013
+ });
1014
+ await log.handle.close();
1015
+ logClosed = true;
1016
+ if (!launchedChild.pid) {
1017
+ throw new Error(`The detached ${currentCliName} upgrade worker has no process ID.`);
1018
+ }
1019
+ const identity = await (dependenciesArg.readProcessIdentity
1020
+ ?? readControllerProcessIdentity)(launchedChild.pid);
1021
+ if (!identity
1022
+ || !identity.processGroupLeader
1023
+ || identity.processGroupId !== launchedChild.pid
1024
+ || !await (dependenciesArg.processHasCliCommand ?? processIdentityHasCliCommand)(identity, optionsArg.installation.cliPath, '__upgrade-worker'))
1025
+ throw new Error('The detached upgrade worker candidate identity is invalid.');
1026
+ launchedChild.unref();
1027
+ return {
1028
+ pid: identity.pid,
1029
+ processGroupId: identity.processGroupId,
1030
+ fingerprint: identity.fingerprint,
1031
+ cliPath: optionsArg.installation.cliPath,
1032
+ logFilePath: log.path,
1033
+ };
1034
+ }
1035
+ catch (errorArg) {
1036
+ const errors = [errorArg];
1037
+ if (!logClosed) {
1038
+ try {
1039
+ await log.handle.close();
1040
+ logClosed = true;
1041
+ }
1042
+ catch (logCleanupErrorArg) {
1043
+ errors.push(logCleanupErrorArg);
1044
+ }
1045
+ }
1046
+ if (child?.pid) {
1047
+ await retryCandidateCleanupUntilDrained(async () => terminateSpawnedDetachedWorker(child.pid), dependenciesArg.candidateCleanup, child.pid);
1048
+ }
1049
+ if (errors.length > 1) {
1050
+ throw new AggregateError(errors, 'The detached upgrade worker launch and log cleanup both failed.');
1051
+ }
1052
+ throw errorArg;
1053
+ }
1054
+ };
1055
+ export async function launchDetachedUpgradeWorker(optionsArg, dependenciesArg = {}) {
1056
+ return await launchDetachedUpgradeWorkerProcess(optionsArg, dependenciesArg);
1057
+ }
1058
+ const launchDetachedRecoveryWorker = async (optionsArg) => await launchDetachedUpgradeWorkerProcess({
1059
+ ...optionsArg,
1060
+ internalArguments: [serializeUpgradeRecoveryWorkerContext({
1061
+ version: 1,
1062
+ mode: 'recovery',
1063
+ canonicalGlobalRoot: optionsArg.installation.globalRoot,
1064
+ packageManagerPath: optionsArg.installation.packageManagerPath,
1065
+ globalBinDirectory: optionsArg.installation.globalBinDirectory,
1066
+ cliPath: optionsArg.installation.cliPath,
1067
+ })],
1068
+ });
1069
+ const runLoggedCommand = async (optionsArg) => {
1070
+ await runManagedCommand({
1071
+ ...optionsArg,
1072
+ captureOutput: false,
1073
+ outputByteLimit: loggedCommandOutputByteLimit,
1074
+ });
1075
+ };
1076
+ const installVersion = async (installationArg, versionArg) => {
1077
+ await runLoggedCommand({
1078
+ executable: installationArg.packageManagerPath,
1079
+ arguments: [
1080
+ 'add',
1081
+ '--global',
1082
+ '--save-exact',
1083
+ '--yes',
1084
+ '--reporter=append-only',
1085
+ '--allow-build=node-pty',
1086
+ '--allow-build=fs-ext-extra-prebuilt',
1087
+ `--registry=${npmRegistryUrl}`,
1088
+ `${controllerPackageName}@${versionArg}`,
1089
+ ],
1090
+ environment: createPackageManagerEnvironment(),
1091
+ timeoutMs: packageManagerTimeoutMs,
1092
+ });
1093
+ };
1094
+ const packageAddArguments = (packageSpecArg, registryUrlArg) => [
1095
+ 'add',
1096
+ '--global',
1097
+ '--save-exact',
1098
+ '--yes',
1099
+ '--reporter=append-only',
1100
+ '--allow-build=node-pty',
1101
+ '--allow-build=fs-ext-extra-prebuilt',
1102
+ `--registry=${registryUrlArg}`,
1103
+ packageSpecArg,
1104
+ ];
1105
+ const preparePackageAdd = async (contextArg, packageSpecArg, registryUrlArg) => await prepareManagedCommand({
1106
+ executable: contextArg.packageManagerPath,
1107
+ arguments: packageAddArguments(packageSpecArg, registryUrlArg),
1108
+ environment: createPackageManagerEnvironment(),
1109
+ timeoutMs: packageManagerTimeoutMs,
1110
+ captureOutput: false,
1111
+ outputByteLimit: loggedCommandOutputByteLimit,
1112
+ });
1113
+ const addExactPackage = async (contextArg, packageSpecArg, registryUrlArg) => {
1114
+ await runPreparedManagedCommand(await preparePackageAdd(contextArg, packageSpecArg, registryUrlArg));
1115
+ };
1116
+ const assertExpectedController = (statusArg, expectedArg) => {
1117
+ if (statusArg.controllerPid !== expectedArg.pid
1118
+ || statusArg.processGroupId !== expectedArg.processGroupId
1119
+ || statusArg.processFingerprint !== expectedArg.processFingerprint
1120
+ || statusArg.lifecycleState !== 'ready') {
1121
+ throw new Error('The running controller changed after the upgrade request was authorized.');
1122
+ }
1123
+ };
1124
+ const prepareControllerStart = async (installationArg, portArg, tokenArg) => await prepareManagedCommand({
1125
+ executable: process.execPath,
1126
+ arguments: [installationArg.cliPath, 'start', '--port', String(portArg)],
1127
+ environment: {
1128
+ ...process.env,
1129
+ [upgradeTokenEnvironmentVariable]: tokenArg,
1130
+ },
1131
+ timeoutMs: controllerRestartTimeoutMs,
1132
+ captureOutput: false,
1133
+ outputByteLimit: loggedCommandOutputByteLimit,
1134
+ });
1135
+ const startController = async (installationArg, portArg, tokenArg) => await runPreparedManagedCommand(await prepareControllerStart(installationArg, portArg, tokenArg)).then(() => undefined);
1136
+ const retainedTargetTransactionMatches = (transactionArg, installationArg) => Boolean(!transactionArg.terminal
1137
+ && transactionArg.controllerWasRunning
1138
+ && transactionArg.targetStartupInvoked === true
1139
+ && (transactionArg.version === upgradeCoordinationVersion
1140
+ || transactionArg.targetPackageCommitted === true)
1141
+ && (transactionArg.phase === 'restarting' || transactionArg.phase === 'continuing')
1142
+ && transactionArg.targetVersion === installationArg.packageVersion
1143
+ && transactionArg.controller?.command === '__serve'
1144
+ && transactionArg.controller.cliPath === installationArg.cliPath
1145
+ && transactionArg.controller.pid === transactionArg.controller.processGroupId
1146
+ && /^linux:[1-9][0-9]*:[1-9][0-9]*$/.test(transactionArg.controller.fingerprint));
1147
+ export const retainedUpgradeTargetIsAuthoritative = async (optionsArg, dependenciesArg = {}) => {
1148
+ if ((dependenciesArg.platform ?? process.platform) !== 'linux')
1149
+ return false;
1150
+ const resolveInstallation = dependenciesArg.resolveInstallation
1151
+ ?? resolveInheritedUpgradeTargetInstallation;
1152
+ const inspectProcess = dependenciesArg.inspectProcess ?? inspectControllerProcess;
1153
+ const transaction = await optionsArg.coordinator.readTransaction(optionsArg.token);
1154
+ const installation = await resolveInstallation(transaction);
1155
+ if (!retainedTargetTransactionMatches(transaction, installation))
1156
+ return false;
1157
+ const controller = transaction.controller;
1158
+ const identity = await inspectProcess({
1159
+ pid: controller.pid,
1160
+ cliPath: controller.cliPath,
1161
+ port: transaction.port,
1162
+ expectedProcessGroupId: controller.processGroupId,
1163
+ expectedFingerprint: controller.fingerprint,
1164
+ command: controller.command,
1165
+ });
1166
+ if (!identity?.processGroupLeader || identity.fingerprint !== controller.fingerprint)
1167
+ return false;
1168
+ const currentTransaction = await optionsArg.coordinator.readTransaction(optionsArg.token);
1169
+ const currentInstallation = await resolveInstallation(currentTransaction);
1170
+ if (!retainedTargetTransactionMatches(currentTransaction, currentInstallation)
1171
+ || currentTransaction.controller.pid !== controller.pid
1172
+ || currentTransaction.controller.processGroupId !== controller.processGroupId
1173
+ || currentTransaction.controller.fingerprint !== controller.fingerprint
1174
+ || currentTransaction.controller.cliPath !== controller.cliPath)
1175
+ return false;
1176
+ const currentIdentity = await inspectProcess({
1177
+ pid: currentTransaction.controller.pid,
1178
+ cliPath: currentTransaction.controller.cliPath,
1179
+ port: currentTransaction.port,
1180
+ expectedProcessGroupId: currentTransaction.controller.processGroupId,
1181
+ expectedFingerprint: currentTransaction.controller.fingerprint,
1182
+ command: currentTransaction.controller.command,
1183
+ });
1184
+ return Boolean(currentIdentity?.processGroupLeader
1185
+ && currentIdentity.fingerprint === currentTransaction.controller.fingerprint);
1186
+ };
1187
+ const updateWorkerProgress = async (coordinatorArg, tokenArg, phaseArg, messageArg) => coordinatorArg.mutateTransaction(tokenArg, (current) => ({
1188
+ ...current,
1189
+ phase: phaseArg,
1190
+ message: messageArg,
1191
+ }));
1192
+ const grantControllerAction = async (coordinatorArg, tokenArg, statusArg, actionArg, modeArg) => coordinatorArg.createControllerActionGrant({
1193
+ token: tokenArg,
1194
+ action: actionArg,
1195
+ ...(modeArg === undefined ? {} : { mode: modeArg }),
1196
+ packageVersion: statusArg.packageVersion,
1197
+ controller: {
1198
+ pid: statusArg.controllerPid,
1199
+ processGroupId: statusArg.processGroupId,
1200
+ processFingerprint: statusArg.processFingerprint,
1201
+ },
1202
+ });
1203
+ const queryUpgradeManagedController = async (portArg, identityArg) => queryControllerStatus(portArg, {
1204
+ packageName: identityArg.packageName,
1205
+ packageVersion: identityArg.packageVersion,
1206
+ upgradeManagementVersion: identityArg.managementVersion,
1207
+ });
1208
+ const finalizeControllerUpgrade = async (coordinatorArg, tokenArg, statusArg, modeArg) => {
1209
+ await grantControllerAction(coordinatorArg, tokenArg, statusArg, 'finalize', modeArg);
1210
+ let response;
1211
+ try {
1212
+ response = await requestControllerUpgradeFinalize(statusArg.controllerPid > 0
1213
+ ? (await coordinatorArg.readTransaction(tokenArg)).port
1214
+ : 0, tokenArg, modeArg);
1215
+ }
1216
+ finally {
1217
+ await coordinatorArg.removeControllerActionGrant('finalize', tokenArg);
1218
+ }
1219
+ if (response.failed > 0) {
1220
+ throw new Error(`${response.failed} paused session${response.failed === 1 ? '' : 's'} could not be continued.`);
1221
+ }
1222
+ };
1223
+ export const waitForControllerUpgradePreparation = async (optionsArg) => {
1224
+ const now = optionsArg.now ?? Date.now;
1225
+ const delay = optionsArg.delay
1226
+ ?? (async (millisecondsArg) => new Promise((resolve) => (setTimeout(resolve, millisecondsArg))));
1227
+ const acceptanceReconciliationDeadline = now()
1228
+ + upgradePreparationAcceptanceReconciliationMs;
1229
+ let nextSourceCheckAt = 0;
1230
+ while (true) {
1231
+ const currentTime = now();
1232
+ if (currentTime >= nextSourceCheckAt) {
1233
+ if (!await optionsArg.controllerIsLive()) {
1234
+ throw new Error('The source controller exited before upgrade preparation completed.');
1235
+ }
1236
+ nextSourceCheckAt = currentTime + upgradePreparationSourceCheckMs;
1237
+ }
1238
+ const transaction = await optionsArg.coordinator.readTransaction(optionsArg.token);
1239
+ if (transaction.terminal) {
1240
+ throw new Error(transaction.terminal.error
1241
+ ?? transaction.message
1242
+ ?? 'The source controller rejected upgrade preparation.');
1243
+ }
1244
+ if (transaction.preparationAcceptedAt === undefined
1245
+ || transaction.preparationDeadlineAt === undefined) {
1246
+ if (currentTime >= acceptanceReconciliationDeadline) {
1247
+ throw new Error('The source controller did not durably accept upgrade preparation.');
1248
+ }
1249
+ await delay(upgradePreparationPollMs);
1250
+ continue;
1251
+ }
1252
+ if (transaction.targetVersion !== optionsArg.targetVersion
1253
+ || transaction.gracePeriodMs !== optionsArg.gracePeriodMs
1254
+ || transaction.preparationDeadlineAt
1255
+ !== transaction.preparationAcceptedAt + optionsArg.gracePeriodMs)
1256
+ throw new Error('The durable upgrade preparation does not match the worker request.');
1257
+ if (transaction.phase === 'stopping') {
1258
+ if (transaction.preparationCompletedAt === undefined
1259
+ || transaction.preparationCompletedAt < transaction.preparationAcceptedAt
1260
+ || transaction.preparationCompletedAt > transaction.preparationDeadlineAt)
1261
+ throw new Error('The durable upgrade preparation completion is invalid.');
1262
+ return transaction;
1263
+ }
1264
+ if (currentTime > transaction.preparationDeadlineAt + upgradePreparationCleanupAllowanceMs) {
1265
+ throw new Error('Timed out waiting for upgrade preparation cleanup to settle.');
1266
+ }
1267
+ await delay(upgradePreparationPollMs);
1268
+ }
1269
+ };
1270
+ export const prepareAndStopRunningController = async (optionsArg, dependenciesArg = {}) => {
1271
+ await updateWorkerProgress(optionsArg.coordinator, optionsArg.token, 'preparing', `Preparing sessions for ${optionsArg.currentInstallation.packageVersion} to ${optionsArg.targetVersion}.`);
1272
+ await grantControllerAction(optionsArg.coordinator, optionsArg.token, optionsArg.runningStatus, 'prepare');
1273
+ let beginError;
1274
+ try {
1275
+ await (dependenciesArg.requestPrepareBegin ?? requestControllerUpgradePrepareBegin)(optionsArg.port, optionsArg.token, optionsArg.targetVersion, optionsArg.gracePeriodMs);
1276
+ }
1277
+ catch (errorArg) {
1278
+ beginError = errorArg;
1279
+ }
1280
+ finally {
1281
+ await optionsArg.coordinator.removeControllerActionGrant('prepare', optionsArg.token);
1282
+ }
1283
+ try {
1284
+ await waitForControllerUpgradePreparation({
1285
+ coordinator: optionsArg.coordinator,
1286
+ token: optionsArg.token,
1287
+ targetVersion: optionsArg.targetVersion,
1288
+ gracePeriodMs: optionsArg.gracePeriodMs,
1289
+ controllerIsLive: dependenciesArg.controllerIsLive ?? (async () => Boolean(await inspectControllerProcess({
1290
+ pid: optionsArg.runningStatus.controllerPid,
1291
+ cliPath: optionsArg.currentInstallation.cliPath,
1292
+ port: optionsArg.port,
1293
+ expectedProcessGroupId: optionsArg.runningStatus.processGroupId,
1294
+ expectedFingerprint: optionsArg.runningStatus.processFingerprint,
1295
+ command: optionsArg.runningStatus.processMode === 'detached' ? '__serve' : 'foreground',
1296
+ }))),
1297
+ ...(dependenciesArg.now ? { now: dependenciesArg.now } : {}),
1298
+ ...(dependenciesArg.delay ? { delay: dependenciesArg.delay } : {}),
1299
+ });
1300
+ }
1301
+ catch (errorArg) {
1302
+ if (beginError === undefined)
1303
+ throw errorArg;
1304
+ throw new AggregateError([beginError, errorArg], 'The source controller did not complete asynchronous upgrade preparation.');
1305
+ }
1306
+ await (dependenciesArg.stopController ?? stopVerifiedController)({
1307
+ status: optionsArg.runningStatus,
1308
+ cliPath: optionsArg.currentInstallation.cliPath,
1309
+ port: optionsArg.port,
1310
+ });
1311
+ };
1312
+ const restorePreviousInstallation = async (installationArg) => {
1313
+ try {
1314
+ const current = await resolvePnpmGlobalInstallation();
1315
+ if (current.packageVersion === installationArg.packageVersion)
1316
+ return current;
1317
+ }
1318
+ catch (errorArg) {
1319
+ if (errorContainsCommandCleanupFailure(errorArg))
1320
+ throw errorArg;
1321
+ // Reinstalling the exact prior version is the authoritative rollback.
1322
+ }
1323
+ await installVersion(installationArg, installationArg.packageVersion);
1324
+ const restored = await resolvePnpmGlobalInstallation();
1325
+ if (restored.packageVersion !== installationArg.packageVersion) {
1326
+ throw new Error('The previous pnpm-global package version was not restored.');
1327
+ }
1328
+ return restored;
1329
+ };
1330
+ const errorContainsCommandCleanupFailure = (errorArg) => {
1331
+ if (errorArg instanceof UpgradeCommandCleanupError)
1332
+ return true;
1333
+ if (errorArg instanceof AggregateError) {
1334
+ return errorArg.errors.some((nestedErrorArg) => (errorContainsCommandCleanupFailure(nestedErrorArg)));
1335
+ }
1336
+ return errorArg instanceof Error
1337
+ && errorArg.cause !== undefined
1338
+ && errorContainsCommandCleanupFailure(errorArg.cause);
1339
+ };
1340
+ const sourceControllerIdentity = (transactionArg) => transactionArg.version === upgradeCoordinationVersion
1341
+ ? {
1342
+ packageName: controllerPackageName,
1343
+ packageVersion: transactionArg.sourceVersion,
1344
+ managementVersion: controllerUpgradeManagementVersion,
1345
+ }
1346
+ : {
1347
+ packageName: transactionArg.sourcePackageName,
1348
+ packageVersion: transactionArg.sourceVersion,
1349
+ managementVersion: transactionArg.sourceManagementVersion,
1350
+ };
1351
+ const requirePackageTransitionTransaction = (transactionArg) => {
1352
+ if (transactionArg.version !== upgradePackageTransitionTransactionVersion) {
1353
+ throw new Error('The package-transition transaction changed format.');
1354
+ }
1355
+ return transactionArg;
1356
+ };
1357
+ const targetControllerIdentity = (transactionArg) => transactionArg.version === upgradeCoordinationVersion
1358
+ ? {
1359
+ packageName: controllerPackageName,
1360
+ packageVersion: transactionArg.targetVersion
1361
+ ?? (() => { throw new Error('The upgrade target version is unavailable.'); })(),
1362
+ managementVersion: controllerUpgradeManagementVersion,
1363
+ }
1364
+ : {
1365
+ packageName: transactionArg.targetPackageName,
1366
+ packageVersion: transactionArg.targetVersion,
1367
+ managementVersion: transactionArg.targetManagementVersion,
1368
+ };
1369
+ export const assertInheritedUpgradeTransaction = (transactionArg, currentIdentityArg) => {
1370
+ if (!transactionArg.controllerWasRunning
1371
+ || transactionArg.targetStartupInvoked !== true
1372
+ || transactionArg.targetVersion !== currentIdentityArg.packageVersion)
1373
+ throw new Error('The inherited upgrade transaction did not authorize target startup.');
1374
+ if (transactionArg.version === upgradeCoordinationVersion) {
1375
+ if (currentIdentityArg.packageName !== String(controllerPackageName)
1376
+ || currentIdentityArg.managementVersion !== controllerUpgradeManagementVersion)
1377
+ throw new Error('The inherited v2 upgrade target identity is incompatible.');
1378
+ return;
1379
+ }
1380
+ if (transactionArg.targetPackageCommitted !== true
1381
+ || transactionArg.targetPackageName !== currentIdentityArg.packageName
1382
+ || transactionArg.targetManagementVersion !== currentIdentityArg.managementVersion
1383
+ || transactionArg.targetCliName !== currentIdentityArg.cliName
1384
+ || transactionArg.targetCliRelativePath !== currentIdentityArg.cliRelativePath)
1385
+ throw new Error('The inherited v3 upgrade target identity is incompatible.');
1386
+ };
1387
+ const runPackageTransitionUpgradeWorker = async (optionsArg) => {
1388
+ const { coordinator, payload, transaction: initialTransaction, currentInstallation, registryUrl, } = optionsArg;
1389
+ if (commitinfo.name !== initialTransaction.sourcePackageName
1390
+ || commitinfo.version !== initialTransaction.sourceVersion
1391
+ || currentInstallation.packageVersion !== initialTransaction.sourceVersion)
1392
+ throw new Error('The package-transition worker is not running from the exact bridge package.');
1393
+ const context = {
1394
+ packageManagerPath: currentInstallation.packageManagerPath,
1395
+ globalRoot: currentInstallation.globalRoot,
1396
+ globalBinDirectory: currentInstallation.globalBinDirectory,
1397
+ };
1398
+ // Registry validation is deliberately complete before controller preparation or package mutation.
1399
+ await resolveExactPackageTransitionTarget(context, registryUrl);
1400
+ await coordinator.mutateTransaction(payload.token, (current) => {
1401
+ if (current.version !== upgradePackageTransitionTransactionVersion) {
1402
+ throw new Error('The package-transition transaction changed format.');
1403
+ }
1404
+ return {
1405
+ ...current,
1406
+ phase: 'checking',
1407
+ message: `Resolved exact target ${current.targetPackageName}@${current.targetVersion}.`,
1408
+ };
1409
+ });
1410
+ process.stdout.write(`${initialTransaction.sourceCliName} upgrade: resolved ${initialTransaction.targetPackageName}@${initialTransaction.targetVersion}.\n`);
1411
+ const controllerProcesses = await listControllerProcessesForCli(currentInstallation.cliPath);
1412
+ let runningStatus;
1413
+ if (payload.expectedController) {
1414
+ runningStatus = await queryControllerStatus(payload.port, {
1415
+ packageName: initialTransaction.sourcePackageName,
1416
+ packageVersion: initialTransaction.sourceVersion,
1417
+ protocolVersion: controllerProtocolVersion,
1418
+ upgradeManagementVersion: initialTransaction.sourceManagementVersion,
1419
+ });
1420
+ assertExpectedController(runningStatus, payload.expectedController);
1421
+ if (controllerProcesses.length !== 1
1422
+ || controllerProcesses[0].identity.pid !== runningStatus.controllerPid
1423
+ || controllerProcesses[0].port !== payload.port)
1424
+ throw new Error('Additional or mismatched pnpm-global controller instances prevent upgrade.');
1425
+ }
1426
+ else if (controllerProcesses.length > 0) {
1427
+ throw new Error('A pnpm-global controller started after the upgrade request; upgrade aborted.');
1428
+ }
1429
+ else if (await isLoopbackPortListening(payload.port)) {
1430
+ throw new Error(`The requested controller port became occupied while ${initialTransaction.sourceCliName} upgrade was starting.`);
1431
+ }
1432
+ if (runningStatus) {
1433
+ await prepareAndStopRunningController({
1434
+ coordinator,
1435
+ token: payload.token,
1436
+ port: payload.port,
1437
+ targetVersion: initialTransaction.targetVersion,
1438
+ gracePeriodMs: payload.gracePeriodMs,
1439
+ currentInstallation,
1440
+ runningStatus,
1441
+ });
1442
+ process.stdout.write(`${initialTransaction.sourceCliName} upgrade: bridge controller stopped cleanly.\n`);
1443
+ }
1444
+ let targetInstallation;
1445
+ try {
1446
+ await updateWorkerProgress(coordinator, payload.token, 'installing', `Transitioning ${initialTransaction.sourcePackageName} to ${initialTransaction.targetPackageName}.`);
1447
+ if (await isLoopbackPortListening(payload.port)) {
1448
+ throw new Error('The controller port became occupied before package replacement.');
1449
+ }
1450
+ const sourceDataWriters = await listControllerDataWriterProcessesForCli(currentInstallation.cliPath);
1451
+ if (sourceDataWriters.length > 0) {
1452
+ const writer = sourceDataWriters[0];
1453
+ throw new Error(`Package replacement is blocked by ${writer.kind} source writer PID ${writer.identity.pid}.`);
1454
+ }
1455
+ const sourceSpec = `${initialTransaction.sourcePackageName}@${initialTransaction.sourceVersion}`;
1456
+ const targetSpec = `${initialTransaction.targetPackageName}@${initialTransaction.targetVersion}`;
1457
+ const groupedSpec = `${sourceSpec},${targetSpec}`;
1458
+ let current = requirePackageTransitionTransaction(await coordinator.readTransaction(payload.token));
1459
+ if (current.targetPackageCommitStarted !== true) {
1460
+ if (current.groupedTargetVerified !== true) {
1461
+ if (current.packageTransitionStarted === true) {
1462
+ await addExactPackage(context, sourceSpec, registryUrl);
1463
+ await verifyPackageTransitionTopology(context, 'source-only');
1464
+ }
1465
+ const groupedAdd = await preparePackageAdd(context, groupedSpec, registryUrl);
1466
+ if (current.packageTransitionStarted !== true) {
1467
+ current = requirePackageTransitionTransaction(await coordinator.mutateTransaction(payload.token, (transaction) => {
1468
+ if (transaction.version !== upgradePackageTransitionTransactionVersion) {
1469
+ throw new Error('The package-transition transaction changed format.');
1470
+ }
1471
+ return {
1472
+ ...transaction,
1473
+ packageTransitionStarted: true,
1474
+ message: `Installing grouped ${sourceSpec},${targetSpec}.`,
1475
+ };
1476
+ }));
1477
+ }
1478
+ await runPreparedManagedCommand(groupedAdd);
1479
+ await verifyPackageTransitionTopology(context, 'grouped');
1480
+ current = requirePackageTransitionTransaction(await coordinator.mutateTransaction(payload.token, (transaction) => {
1481
+ if (transaction.version !== upgradePackageTransitionTransactionVersion) {
1482
+ throw new Error('The package-transition transaction changed format.');
1483
+ }
1484
+ return {
1485
+ ...transaction,
1486
+ groupedTargetVerified: true,
1487
+ message: 'Verified the grouped bridge and target package topology.',
1488
+ };
1489
+ }));
1490
+ }
1491
+ else {
1492
+ await verifyPackageTransitionTopology(context, 'grouped');
1493
+ }
1494
+ const targetAdd = await preparePackageAdd(context, targetSpec, registryUrl);
1495
+ current = requirePackageTransitionTransaction(await coordinator.mutateTransaction(payload.token, (transaction) => {
1496
+ if (transaction.version !== upgradePackageTransitionTransactionVersion) {
1497
+ throw new Error('The package-transition transaction changed format.');
1498
+ }
1499
+ return {
1500
+ ...transaction,
1501
+ targetPackageCommitStarted: true,
1502
+ message: `Committing exact target ${targetSpec}.`,
1503
+ };
1504
+ }));
1505
+ await runPreparedManagedCommand(targetAdd);
1506
+ }
1507
+ else if (current.targetPackageCommitted !== true) {
1508
+ await addExactPackage(context, targetSpec, registryUrl);
1509
+ }
1510
+ if (current.targetPackageCommitted !== true) {
1511
+ const topology = await verifyPackageTransitionTopology(context, 'target-only');
1512
+ if (!topology.target)
1513
+ throw new Error('The exact target package installation is unavailable.');
1514
+ targetInstallation = topology.target;
1515
+ await coordinator.mutateTransaction(payload.token, (transaction) => {
1516
+ if (transaction.version !== upgradePackageTransitionTransactionVersion) {
1517
+ throw new Error('The package-transition transaction changed format.');
1518
+ }
1519
+ return {
1520
+ ...transaction,
1521
+ targetPackageCommitted: true,
1522
+ message: `Committed exact target ${targetSpec}.`,
1523
+ };
1524
+ });
1525
+ }
1526
+ else {
1527
+ const topology = await verifyPackageTransitionTopology(context, 'target-only');
1528
+ if (!topology.target)
1529
+ throw new Error('The exact target package installation is unavailable.');
1530
+ targetInstallation = topology.target;
1531
+ }
1532
+ }
1533
+ catch (upgradeErrorArg) {
1534
+ if (errorContainsCommandCleanupFailure(upgradeErrorArg))
1535
+ throw upgradeErrorArg;
1536
+ const current = await coordinator.readTransaction(payload.token);
1537
+ if (current.version === upgradePackageTransitionTransactionVersion
1538
+ && current.targetPackageCommitStarted === true)
1539
+ throw upgradeErrorArg;
1540
+ const recoveryErrors = [upgradeErrorArg];
1541
+ try {
1542
+ const sourceSpec = `${initialTransaction.sourcePackageName}@${initialTransaction.sourceVersion}`;
1543
+ if (current.version === upgradePackageTransitionTransactionVersion
1544
+ && current.packageTransitionStarted === true)
1545
+ await addExactPackage(context, sourceSpec, registryUrl);
1546
+ const sourceTopology = await verifyPackageTransitionTopology(context, 'source-only');
1547
+ if (!sourceTopology.source)
1548
+ throw new Error('The exact bridge package was not restored.');
1549
+ if (runningStatus) {
1550
+ await startController(sourceTopology.source, payload.port, payload.token);
1551
+ const restoredStatus = await queryUpgradeManagedController(payload.port, sourceControllerIdentity(initialTransaction));
1552
+ await finalizeControllerUpgrade(coordinator, payload.token, restoredStatus, 'compensate');
1553
+ process.stdout.write(`${initialTransaction.sourceCliName} upgrade: bridge package restored and restarted.\n`);
1554
+ }
1555
+ }
1556
+ catch (recoveryErrorArg) {
1557
+ recoveryErrors.push(recoveryErrorArg);
1558
+ }
1559
+ throw new AggregateError(recoveryErrors, `${initialTransaction.sourceCliName} upgrade failed before target package commit began.`);
1560
+ }
1561
+ process.stdout.write(`${initialTransaction.sourceCliName} upgrade: committed ${initialTransaction.targetPackageName}@${initialTransaction.targetVersion}.\n`);
1562
+ if (runningStatus) {
1563
+ await updateWorkerProgress(coordinator, payload.token, 'restarting', `Restarting ${initialTransaction.targetPackageName} ${initialTransaction.targetVersion}.`);
1564
+ const preparedTargetStart = await prepareControllerStart(targetInstallation, payload.port, payload.token);
1565
+ await coordinator.mutateTransaction(payload.token, (current) => {
1566
+ if (current.version !== upgradePackageTransitionTransactionVersion) {
1567
+ throw new Error('The package-transition transaction changed format.');
1568
+ }
1569
+ return {
1570
+ ...current,
1571
+ targetStartupInvoked: true,
1572
+ message: `Invoking ${current.targetPackageName} ${current.targetVersion}.`,
1573
+ };
1574
+ });
1575
+ await runPreparedManagedCommand(preparedTargetStart);
1576
+ const targetStatus = await queryUpgradeManagedController(payload.port, targetControllerIdentity(initialTransaction));
1577
+ await updateWorkerProgress(coordinator, payload.token, payload.continueSessions ? 'continuing' : 'restarting', payload.continueSessions
1578
+ ? 'Continuing sessions paused for the upgrade.'
1579
+ : 'Reopening harness prompt admission.');
1580
+ await finalizeControllerUpgrade(coordinator, payload.token, targetStatus, payload.continueSessions ? 'continue' : 'reopen');
1581
+ process.stdout.write(`${initialTransaction.sourceCliName} upgrade: target controller restarted on port ${payload.port}.\n`);
1582
+ }
1583
+ await coordinator.finishTransaction(payload.token, true, `Upgrade to ${initialTransaction.targetPackageName}@${initialTransaction.targetVersion} completed.`);
1584
+ };
1585
+ const runRecoveryUpgradeWorker = async (payloadArg, internalOptionsArg) => {
1586
+ const context = parseUpgradeRecoveryWorkerContext(internalOptionsArg.recoveryContext);
1587
+ const coordinator = new UpgradeCoordinator(context.canonicalGlobalRoot);
1588
+ let lock;
1589
+ let releaseLock = true;
1590
+ try {
1591
+ await coordinator.waitForWorkerAcknowledgement(payloadArg.token, 10_000);
1592
+ lock = await coordinator.acquireUpgradeLock({
1593
+ token: payloadArg.token,
1594
+ cliPath: context.cliPath,
1595
+ });
1596
+ await coordinator.waitForStartLeasesToDrain(lock);
1597
+ const transaction = await coordinator.readTransaction(payloadArg.token);
1598
+ if (transaction.terminal)
1599
+ return;
1600
+ if (transaction.port !== payloadArg.port
1601
+ || transaction.gracePeriodMs !== payloadArg.gracePeriodMs
1602
+ || transaction.continueSessions !== payloadArg.continueSessions)
1603
+ throw new Error('The recovery worker payload does not match its upgrade transaction.');
1604
+ const identity = await readControllerProcessIdentity(process.pid);
1605
+ if (!identity
1606
+ || !identity.processGroupLeader
1607
+ || identity.processGroupId !== process.pid
1608
+ || transaction.worker?.pid !== identity.pid
1609
+ || transaction.worker.processGroupId !== identity.processGroupId
1610
+ || transaction.worker.fingerprint !== identity.fingerprint
1611
+ || transaction.worker.cliPath !== context.cliPath)
1612
+ throw new Error('The recovery worker transaction identity is incompatible.');
1613
+ const installation = await resolveAuthoritativeRecoveryInstallation(transaction, {
1614
+ packageManagerPath: context.packageManagerPath,
1615
+ globalRoot: context.canonicalGlobalRoot,
1616
+ globalBinDirectory: context.globalBinDirectory,
1617
+ packageDirectory: plugins.path.dirname(context.cliPath),
1618
+ cliPath: context.cliPath,
1619
+ packageVersion: '',
1620
+ });
1621
+ if (installation.cliPath !== context.cliPath) {
1622
+ throw new Error('The authoritative recovery CLI changed during handoff.');
1623
+ }
1624
+ upgradeWorkerCliPath = installation.cliPath;
1625
+ await (internalOptionsArg.recoveryBody ?? recoverStalledUpgradeUnderLock)({
1626
+ coordinator,
1627
+ token: payloadArg.token,
1628
+ transaction,
1629
+ installation,
1630
+ });
1631
+ }
1632
+ catch (errorArg) {
1633
+ const cleanupFailed = (internalOptionsArg.isCommandCleanupFailure
1634
+ ?? errorContainsCommandCleanupFailure)(errorArg);
1635
+ if (cleanupFailed)
1636
+ releaseLock = false;
1637
+ await coordinator.mutateTransaction(payloadArg.token, (current) => ({
1638
+ ...current,
1639
+ message: errorArg instanceof Error ? errorArg.message : String(errorArg),
1640
+ })).catch(() => undefined);
1641
+ throw errorArg;
1642
+ }
1643
+ finally {
1644
+ if (releaseLock)
1645
+ await lock?.release();
1646
+ }
1647
+ };
1648
+ export async function runUpgradeWorker(payloadArg, internalOptionsArg = {}) {
1649
+ const environmentToken = process.env[upgradeTokenEnvironmentVariable];
1650
+ if (environmentToken !== payloadArg.token) {
1651
+ throw new Error(`The detached ${currentCliName} upgrade worker token binding is invalid.`);
1652
+ }
1653
+ delete process.env[upgradeTokenEnvironmentVariable];
1654
+ if (internalOptionsArg.recoveryContext !== undefined) {
1655
+ await runRecoveryUpgradeWorker(payloadArg, internalOptionsArg);
1656
+ return;
1657
+ }
1658
+ const installation = await resolveCurrentPnpmGlobalInstallation();
1659
+ upgradeWorkerCliPath = installation.cliPath;
1660
+ const coordinator = new UpgradeCoordinator(installation.globalRoot);
1661
+ let lock;
1662
+ let releaseLock = true;
1663
+ try {
1664
+ await coordinator.registerWorker(payloadArg.token, installation.cliPath);
1665
+ await coordinator.waitForWorkerAcknowledgement(payloadArg.token, 10_000);
1666
+ lock = await coordinator.acquireUpgradeLock({
1667
+ token: payloadArg.token,
1668
+ cliPath: installation.cliPath,
1669
+ });
1670
+ await coordinator.waitForStartLeasesToDrain(lock);
1671
+ const currentInstallation = await resolveCurrentPnpmGlobalInstallation();
1672
+ if (currentInstallation.globalRoot !== installation.globalRoot) {
1673
+ throw new Error(`The pnpm global root changed while ${currentCliName} upgrade was starting.`);
1674
+ }
1675
+ const transaction = await coordinator.readTransaction(payloadArg.token);
1676
+ if (transaction.version === upgradePackageTransitionTransactionVersion) {
1677
+ await runPackageTransitionUpgradeWorker({
1678
+ coordinator,
1679
+ payload: payloadArg,
1680
+ transaction,
1681
+ currentInstallation,
1682
+ registryUrl: assertInternalRegistryUrl(internalOptionsArg.registryUrl ?? npmRegistryUrl),
1683
+ });
1684
+ return;
1685
+ }
1686
+ const latestVersion = await readLatestVersion(currentInstallation);
1687
+ await coordinator.mutateTransaction(payloadArg.token, (current) => {
1688
+ if (current.version !== upgradeCoordinationVersion) {
1689
+ throw new Error('The same-package upgrade transaction changed format.');
1690
+ }
1691
+ return {
1692
+ ...current,
1693
+ targetVersion: latestVersion,
1694
+ phase: 'checking',
1695
+ message: `Installed ${currentInstallation.packageVersion}; npm latest is ${latestVersion}.`,
1696
+ };
1697
+ });
1698
+ const versionComparison = compareSemver(latestVersion, currentInstallation.packageVersion);
1699
+ process.stdout.write(`${currentCliName} upgrade: installed ${currentInstallation.packageVersion}, npm latest ${latestVersion}.\n`);
1700
+ if (versionComparison <= 0) {
1701
+ process.stdout.write(versionComparison === 0
1702
+ ? `${currentCliName} upgrade: already up to date.\n`
1703
+ : `${currentCliName} upgrade: installed version is newer than npm latest; refusing to downgrade.\n`);
1704
+ await coordinator.finishTransaction(payloadArg.token, true, versionComparison === 0
1705
+ ? 'Already up to date.'
1706
+ : 'Installed version is newer than npm latest; no downgrade was performed.');
1707
+ return;
1708
+ }
1709
+ const controllerProcesses = await listControllerProcessesForCli(currentInstallation.cliPath);
1710
+ let runningStatus;
1711
+ if (payloadArg.expectedController) {
1712
+ runningStatus = await queryControllerStatus(payloadArg.port, {
1713
+ packageName: controllerPackageName,
1714
+ packageVersion: currentInstallation.packageVersion,
1715
+ protocolVersion: controllerProtocolVersion,
1716
+ upgradeManagementVersion: controllerUpgradeManagementVersion,
1717
+ });
1718
+ assertExpectedController(runningStatus, payloadArg.expectedController);
1719
+ if (controllerProcesses.length !== 1
1720
+ || controllerProcesses[0].identity.pid !== runningStatus.controllerPid
1721
+ || controllerProcesses[0].port !== payloadArg.port) {
1722
+ throw new Error('Additional or mismatched pnpm-global controller instances prevent upgrade.');
1723
+ }
1724
+ }
1725
+ else if (controllerProcesses.length > 0) {
1726
+ throw new Error('A pnpm-global controller started after the upgrade request; upgrade aborted.');
1727
+ }
1728
+ else if (await isLoopbackPortListening(payloadArg.port)) {
1729
+ throw new Error(`The requested controller port became occupied while ${currentCliName} upgrade was starting.`);
1730
+ }
1731
+ if (runningStatus) {
1732
+ await prepareAndStopRunningController({
1733
+ coordinator,
1734
+ token: payloadArg.token,
1735
+ port: payloadArg.port,
1736
+ targetVersion: latestVersion,
1737
+ gracePeriodMs: payloadArg.gracePeriodMs,
1738
+ currentInstallation,
1739
+ runningStatus,
1740
+ });
1741
+ process.stdout.write(`${currentCliName} upgrade: previous controller stopped cleanly.\n`);
1742
+ }
1743
+ let upgradedInstallation;
1744
+ try {
1745
+ await updateWorkerProgress(coordinator, payloadArg.token, 'installing', `Installing ${controllerPackageName} ${latestVersion}.`);
1746
+ if (await isLoopbackPortListening(payloadArg.port)) {
1747
+ throw new Error('The controller port became occupied before package replacement.');
1748
+ }
1749
+ const sourceDataWriters = await listControllerDataWriterProcessesForCli(currentInstallation.cliPath);
1750
+ if (sourceDataWriters.length > 0) {
1751
+ const writer = sourceDataWriters[0];
1752
+ throw new Error(`Package replacement is blocked by ${writer.kind} source writer PID ${writer.identity.pid}.`);
1753
+ }
1754
+ await installVersion(currentInstallation, latestVersion);
1755
+ upgradedInstallation = await resolvePnpmGlobalInstallation();
1756
+ if (upgradedInstallation.packageVersion !== latestVersion) {
1757
+ throw new Error('pnpm completed without installing the requested npm latest version.');
1758
+ }
1759
+ }
1760
+ catch (upgradeErrorArg) {
1761
+ if (errorContainsCommandCleanupFailure(upgradeErrorArg))
1762
+ throw upgradeErrorArg;
1763
+ const recoveryErrors = [upgradeErrorArg];
1764
+ try {
1765
+ const restored = await restorePreviousInstallation(currentInstallation);
1766
+ if (runningStatus) {
1767
+ await startController(restored, payloadArg.port, payloadArg.token);
1768
+ const restoredStatus = await queryUpgradeManagedController(payloadArg.port, {
1769
+ packageName: controllerPackageName,
1770
+ packageVersion: restored.packageVersion,
1771
+ managementVersion: controllerUpgradeManagementVersion,
1772
+ });
1773
+ await finalizeControllerUpgrade(coordinator, payloadArg.token, restoredStatus, 'compensate');
1774
+ process.stdout.write(`${currentCliName} upgrade: previous controller version restored and restarted.\n`);
1775
+ }
1776
+ }
1777
+ catch (recoveryErrorArg) {
1778
+ recoveryErrors.push(recoveryErrorArg);
1779
+ }
1780
+ throw new AggregateError(recoveryErrors, `${currentCliName} upgrade failed before the new controller started.`);
1781
+ }
1782
+ process.stdout.write(`${currentCliName} upgrade: installed ${latestVersion}.\n`);
1783
+ if (runningStatus) {
1784
+ // From this point onward rollback is unsafe: startup may run data migrations.
1785
+ await updateWorkerProgress(coordinator, payloadArg.token, 'restarting', `Restarting ${controllerPackageName} ${latestVersion}.`);
1786
+ await coordinator.mutateTransaction(payloadArg.token, (current) => ({
1787
+ ...current,
1788
+ targetStartupInvoked: true,
1789
+ message: `Invoking ${controllerPackageName} ${latestVersion}.`,
1790
+ }));
1791
+ await startController(upgradedInstallation, payloadArg.port, payloadArg.token);
1792
+ const upgradedStatus = await queryUpgradeManagedController(payloadArg.port, {
1793
+ packageName: controllerPackageName,
1794
+ packageVersion: latestVersion,
1795
+ managementVersion: controllerUpgradeManagementVersion,
1796
+ });
1797
+ await updateWorkerProgress(coordinator, payloadArg.token, payloadArg.continueSessions ? 'continuing' : 'restarting', payloadArg.continueSessions
1798
+ ? 'Continuing sessions paused for the upgrade.'
1799
+ : 'Reopening harness prompt admission.');
1800
+ await finalizeControllerUpgrade(coordinator, payloadArg.token, upgradedStatus, payloadArg.continueSessions ? 'continue' : 'reopen');
1801
+ process.stdout.write(`${currentCliName} upgrade: controller restarted on port ${payloadArg.port}.\n`);
1802
+ }
1803
+ await coordinator.finishTransaction(payloadArg.token, true, `Upgrade to ${latestVersion} completed.`);
1804
+ }
1805
+ catch (errorArg) {
1806
+ if (errorContainsCommandCleanupFailure(errorArg))
1807
+ releaseLock = false;
1808
+ const failedTransaction = await coordinator.readTransaction(payloadArg.token).catch(() => undefined);
1809
+ if ((failedTransaction?.version === upgradePackageTransitionTransactionVersion
1810
+ ? failedTransaction.targetPackageCommitStarted === true
1811
+ : failedTransaction?.targetStartupInvoked === true)
1812
+ || errorContainsCommandCleanupFailure(errorArg)) {
1813
+ await coordinator.mutateTransaction(payloadArg.token, (current) => ({
1814
+ ...current,
1815
+ message: errorArg instanceof Error ? errorArg.message : String(errorArg),
1816
+ })).catch(() => undefined);
1817
+ throw errorArg;
1818
+ }
1819
+ await coordinator.finishTransaction(payloadArg.token, false, 'Upgrade failed.', errorArg instanceof Error ? errorArg.message : String(errorArg)).catch(() => undefined);
1820
+ throw errorArg;
1821
+ }
1822
+ finally {
1823
+ if (releaseLock)
1824
+ await lock?.release();
1825
+ }
1826
+ }
1827
+ const recoverPackageTransition = async (optionsArg) => {
1828
+ const context = {
1829
+ packageManagerPath: optionsArg.installation.packageManagerPath,
1830
+ globalRoot: optionsArg.installation.globalRoot,
1831
+ globalBinDirectory: optionsArg.installation.globalBinDirectory,
1832
+ };
1833
+ const registryUrl = assertInternalRegistryUrl(npmRegistryUrl);
1834
+ const transaction = optionsArg.transaction;
1835
+ if (transaction.targetPackageCommitStarted === true) {
1836
+ const targetSpec = `${transaction.targetPackageName}@${transaction.targetVersion}`;
1837
+ let targetTopology;
1838
+ if (transaction.targetPackageCommitted === true) {
1839
+ try {
1840
+ targetTopology = await verifyPackageTransitionTopology(context, 'target-only');
1841
+ }
1842
+ catch (verificationErrorArg) {
1843
+ try {
1844
+ await addExactPackage(context, targetSpec, registryUrl);
1845
+ targetTopology = await verifyPackageTransitionTopology(context, 'target-only');
1846
+ }
1847
+ catch (normalizationErrorArg) {
1848
+ throw new AggregateError([verificationErrorArg, normalizationErrorArg], 'The committed target package could not be normalized without restoring the bridge.');
1849
+ }
1850
+ }
1851
+ }
1852
+ else {
1853
+ await addExactPackage(context, targetSpec, registryUrl);
1854
+ targetTopology = await verifyPackageTransitionTopology(context, 'target-only');
1855
+ await optionsArg.coordinator.mutateTransaction(optionsArg.token, (current) => {
1856
+ if (current.version !== upgradePackageTransitionTransactionVersion) {
1857
+ throw new Error('The package-transition transaction changed format.');
1858
+ }
1859
+ return {
1860
+ ...current,
1861
+ targetPackageCommitted: true,
1862
+ message: `Committed exact target ${targetSpec} during bounded recovery.`,
1863
+ };
1864
+ });
1865
+ }
1866
+ const targetInstallation = targetTopology.target;
1867
+ if (!targetInstallation)
1868
+ throw new Error('The exact target package is unavailable.');
1869
+ let current = requirePackageTransitionTransaction(await optionsArg.coordinator.readTransaction(optionsArg.token));
1870
+ if (current.controllerWasRunning) {
1871
+ if (current.targetStartupInvoked !== true) {
1872
+ const candidates = (await listControllerProcessesForCli(targetInstallation.cliPath))
1873
+ .filter((candidateArg) => candidateArg.port === current.port);
1874
+ if (candidates.length > 0 || await isLoopbackPortListening(current.port)) {
1875
+ throw new Error('A target controller exists before its durable startup marker; refusing to adopt it.');
1876
+ }
1877
+ const preparedTargetStart = await prepareControllerStart(targetInstallation, current.port, optionsArg.token);
1878
+ current = requirePackageTransitionTransaction(await optionsArg.coordinator.mutateTransaction(optionsArg.token, (candidate) => {
1879
+ if (candidate.version !== upgradePackageTransitionTransactionVersion) {
1880
+ throw new Error('The package-transition transaction changed format.');
1881
+ }
1882
+ return {
1883
+ ...candidate,
1884
+ phase: 'restarting',
1885
+ targetStartupInvoked: true,
1886
+ message: `Invoking ${candidate.targetPackageName} during bounded recovery.`,
1887
+ };
1888
+ }));
1889
+ await runPreparedManagedCommand(preparedTargetStart);
1890
+ }
1891
+ let status = await queryControllerStatus(current.port, {
1892
+ packageName: current.targetPackageName,
1893
+ packageVersion: current.targetVersion,
1894
+ upgradeManagementVersion: current.targetManagementVersion,
1895
+ }).catch(() => undefined);
1896
+ if (!status) {
1897
+ if (await retainedUpgradeTargetIsAuthoritative({
1898
+ coordinator: optionsArg.coordinator,
1899
+ token: optionsArg.token,
1900
+ }))
1901
+ return false;
1902
+ const targetCandidates = (await listControllerProcessesForCli(targetInstallation.cliPath))
1903
+ .filter((candidateArg) => candidateArg.port === current.port);
1904
+ if (targetCandidates.length > 0 || await isLoopbackPortListening(current.port)) {
1905
+ throw new Error('A target controller is already starting or listening but cannot be adopted safely; refusing to launch a replacement.');
1906
+ }
1907
+ await startController(targetInstallation, current.port, optionsArg.token);
1908
+ status = await queryUpgradeManagedController(current.port, targetControllerIdentity(current));
1909
+ }
1910
+ await finalizeControllerUpgrade(optionsArg.coordinator, optionsArg.token, status, current.continueSessions ? 'continue' : 'reopen');
1911
+ }
1912
+ await optionsArg.coordinator.finishTransaction(optionsArg.token, true, `Upgrade to ${current.targetPackageName}@${current.targetVersion} completed during bounded recovery.`);
1913
+ return true;
1914
+ }
1915
+ const sourceSpec = `${transaction.sourcePackageName}@${transaction.sourceVersion}`;
1916
+ let sourceTopology;
1917
+ if (transaction.packageTransitionStarted === true) {
1918
+ await addExactPackage(context, sourceSpec, registryUrl);
1919
+ sourceTopology = await verifyPackageTransitionTopology(context, 'source-only');
1920
+ }
1921
+ else {
1922
+ sourceTopology = await verifyPackageTransitionTopology(context, 'source-only');
1923
+ }
1924
+ const sourceInstallation = sourceTopology.source;
1925
+ if (!sourceInstallation)
1926
+ throw new Error('The exact bridge package is unavailable.');
1927
+ if (transaction.controllerWasRunning) {
1928
+ let status = await queryControllerStatus(transaction.port, {
1929
+ packageName: transaction.sourcePackageName,
1930
+ packageVersion: transaction.sourceVersion,
1931
+ upgradeManagementVersion: transaction.sourceManagementVersion,
1932
+ }).catch(() => undefined);
1933
+ if (!status) {
1934
+ await startController(sourceInstallation, transaction.port, optionsArg.token);
1935
+ status = await queryUpgradeManagedController(transaction.port, sourceControllerIdentity(transaction));
1936
+ }
1937
+ await finalizeControllerUpgrade(optionsArg.coordinator, optionsArg.token, status, 'compensate');
1938
+ }
1939
+ await optionsArg.coordinator.finishTransaction(optionsArg.token, false, 'The stalled package transition restored the exact bridge package.', `The upgrade stopped making progress during phase ${transaction.phase}.`);
1940
+ return true;
1941
+ };
1942
+ const recoverStalledUpgradeUnderLock = async (optionsArg) => {
1943
+ const transaction = optionsArg.transaction;
1944
+ if (transaction.terminal)
1945
+ return true;
1946
+ if (transaction.targetStartupInvoked === true && await retainedUpgradeTargetIsAuthoritative({
1947
+ coordinator: optionsArg.coordinator,
1948
+ token: optionsArg.token,
1949
+ }, {
1950
+ resolveInstallation: async () => optionsArg.installation,
1951
+ }))
1952
+ return false;
1953
+ if (transaction.version === upgradePackageTransitionTransactionVersion) {
1954
+ return await recoverPackageTransition({
1955
+ coordinator: optionsArg.coordinator,
1956
+ token: optionsArg.token,
1957
+ transaction,
1958
+ installation: optionsArg.installation,
1959
+ });
1960
+ }
1961
+ const afterTargetStartupBoundary = transaction.targetStartupInvoked === true;
1962
+ if (afterTargetStartupBoundary) {
1963
+ if (!transaction.targetVersion) {
1964
+ throw new Error('The stalled upgrade has no retained target version.');
1965
+ }
1966
+ const targetInstallation = await resolvePnpmGlobalInstallation();
1967
+ if (targetInstallation.packageVersion !== transaction.targetVersion) {
1968
+ throw new Error('The package installation does not match the retained post-startup upgrade target.');
1969
+ }
1970
+ if (transaction.controllerWasRunning) {
1971
+ let status = await queryControllerStatus(transaction.port, {
1972
+ packageName: controllerPackageName,
1973
+ packageVersion: targetInstallation.packageVersion,
1974
+ upgradeManagementVersion: controllerUpgradeManagementVersion,
1975
+ }).catch(() => undefined);
1976
+ if (!status) {
1977
+ if (await retainedUpgradeTargetIsAuthoritative({
1978
+ coordinator: optionsArg.coordinator,
1979
+ token: optionsArg.token,
1980
+ }))
1981
+ return false;
1982
+ const targetCandidates = (await listControllerProcessesForCli(targetInstallation.cliPath))
1983
+ .filter((candidateArg) => candidateArg.port === transaction.port);
1984
+ if (targetCandidates.length > 0 || await isLoopbackPortListening(transaction.port)) {
1985
+ throw new Error('A target controller is already starting or listening but cannot be adopted safely; refusing to launch a replacement.');
1986
+ }
1987
+ await startController(targetInstallation, transaction.port, optionsArg.token);
1988
+ status = await queryUpgradeManagedController(transaction.port, {
1989
+ packageName: controllerPackageName,
1990
+ packageVersion: targetInstallation.packageVersion,
1991
+ managementVersion: controllerUpgradeManagementVersion,
1992
+ });
1993
+ }
1994
+ await finalizeControllerUpgrade(optionsArg.coordinator, optionsArg.token, status, transaction.continueSessions ? 'continue' : 'reopen');
1995
+ }
1996
+ await optionsArg.coordinator.finishTransaction(optionsArg.token, true, `Upgrade to ${transaction.targetVersion} completed during bounded recovery.`);
1997
+ return true;
1998
+ }
1999
+ const sourceInstallation = await restorePreviousInstallation({
2000
+ ...optionsArg.installation,
2001
+ packageVersion: transaction.sourceVersion,
2002
+ });
2003
+ if (transaction.controllerWasRunning) {
2004
+ let status = await queryControllerStatus(transaction.port, {
2005
+ packageName: controllerPackageName,
2006
+ packageVersion: sourceInstallation.packageVersion,
2007
+ upgradeManagementVersion: controllerUpgradeManagementVersion,
2008
+ }).catch(() => undefined);
2009
+ if (!status) {
2010
+ await startController(sourceInstallation, transaction.port, optionsArg.token);
2011
+ status = await queryUpgradeManagedController(transaction.port, {
2012
+ packageName: controllerPackageName,
2013
+ packageVersion: sourceInstallation.packageVersion,
2014
+ managementVersion: controllerUpgradeManagementVersion,
2015
+ });
2016
+ }
2017
+ await finalizeControllerUpgrade(optionsArg.coordinator, optionsArg.token, status, 'compensate');
2018
+ }
2019
+ await optionsArg.coordinator.finishTransaction(optionsArg.token, false, 'The stalled upgrade restored the source package.', `The upgrade stopped making progress during phase ${transaction.phase}.`);
2020
+ return true;
2021
+ };
2022
+ export async function recoverStalledUpgrade(optionsArg, dependenciesArg = {}) {
2023
+ await optionsArg.coordinator.terminateTransactionWorker(optionsArg.transaction);
2024
+ let lock;
2025
+ try {
2026
+ lock = await optionsArg.coordinator.acquireUpgradeLock({
2027
+ token: optionsArg.token,
2028
+ cliPath: optionsArg.installation.cliPath,
2029
+ command: optionsArg.command,
2030
+ });
2031
+ }
2032
+ catch (errorArg) {
2033
+ if (errorArg instanceof Error
2034
+ && (errorArg.message.includes('already running')
2035
+ || errorArg.message.includes('initializing')))
2036
+ return false;
2037
+ throw errorArg;
2038
+ }
2039
+ let candidate;
2040
+ let lockTransferred = false;
2041
+ try {
2042
+ const transaction = await optionsArg.coordinator.readTransaction(optionsArg.token);
2043
+ if (transaction.terminal) {
2044
+ await lock.release();
2045
+ return true;
2046
+ }
2047
+ const recoveryInstallation = await resolveAuthoritativeRecoveryInstallation(transaction, optionsArg.installation);
2048
+ const payload = {
2049
+ version: upgradeCoordinationVersion,
2050
+ token: optionsArg.token,
2051
+ port: transaction.port,
2052
+ gracePeriodMs: transaction.gracePeriodMs,
2053
+ continueSessions: transaction.continueSessions,
2054
+ };
2055
+ candidate = await (dependenciesArg.launchRecoveryWorker ?? launchDetachedRecoveryWorker)({
2056
+ installation: recoveryInstallation,
2057
+ payload,
2058
+ });
2059
+ const launchedTransaction = await optionsArg.coordinator.recordWorkerLaunch(optionsArg.token, candidate.pid, candidate.cliPath, candidate.logFilePath);
2060
+ const worker = launchedTransaction.worker;
2061
+ if (!worker
2062
+ || worker.pid !== candidate.pid
2063
+ || worker.processGroupId !== candidate.processGroupId
2064
+ || worker.fingerprint !== candidate.fingerprint
2065
+ || worker.cliPath !== candidate.cliPath
2066
+ || worker.logFilePath !== candidate.logFilePath)
2067
+ throw new Error('The recovery worker launch identity was not retained exactly.');
2068
+ await optionsArg.coordinator.transferUpgradeLockToWorker({
2069
+ lock,
2070
+ token: optionsArg.token,
2071
+ worker,
2072
+ });
2073
+ lockTransferred = true;
2074
+ await optionsArg.coordinator.acknowledgeWorker(optionsArg.token);
2075
+ return true;
2076
+ }
2077
+ catch (errorArg) {
2078
+ const errors = [errorArg];
2079
+ if (candidate) {
2080
+ await retryCandidateCleanupUntilDrained(async () => await (dependenciesArg.terminateWorkerCandidate
2081
+ ?? ((candidateArg) => optionsArg.coordinator.terminateUpgradeWorkerCandidate(candidateArg)))(candidate), dependenciesArg.candidateCleanup, candidate.pid);
2082
+ }
2083
+ try {
2084
+ if (!lockTransferred) {
2085
+ try {
2086
+ await lock.release();
2087
+ }
2088
+ catch {
2089
+ const replacementLock = await optionsArg.coordinator.acquireUpgradeLock({
2090
+ token: optionsArg.token,
2091
+ cliPath: optionsArg.installation.cliPath,
2092
+ command: optionsArg.command,
2093
+ });
2094
+ await replacementLock.release();
2095
+ }
2096
+ }
2097
+ else {
2098
+ const replacementLock = await optionsArg.coordinator.acquireUpgradeLock({
2099
+ token: optionsArg.token,
2100
+ cliPath: optionsArg.installation.cliPath,
2101
+ command: optionsArg.command,
2102
+ });
2103
+ await replacementLock.release();
2104
+ }
2105
+ }
2106
+ catch (lockCleanupErrorArg) {
2107
+ errors.push(lockCleanupErrorArg);
2108
+ }
2109
+ if (errors.length > 1) {
2110
+ throw new AggregateError(errors, 'Stalled upgrade recovery handoff failed and cleanup was incomplete.');
2111
+ }
2112
+ throw errorArg;
2113
+ }
2114
+ }
2115
+ export const createUpgradeWorkerPayload = (optionsArg) => ({
2116
+ version: upgradeCoordinationVersion,
2117
+ token: createUpgradeToken(),
2118
+ port: optionsArg.port,
2119
+ gracePeriodMs: optionsArg.gracePeriodMs,
2120
+ continueSessions: optionsArg.continueSessions,
2121
+ ...(optionsArg.expectedController
2122
+ ? { expectedController: optionsArg.expectedController }
2123
+ : {}),
2124
+ });
2125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy51cGdyYWRldHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jbGFzc2VzLnVwZ3JhZGV0cmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckQsT0FBTyxFQUNMLHFCQUFxQixFQUNyQix5QkFBeUIsRUFDekIsa0NBQWtDLEdBRW5DLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUQsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixxQkFBcUIsRUFDckIsZ0NBQWdDLEVBQ2hDLG9DQUFvQyxFQUNwQyxzQkFBc0IsR0FDdkIsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLHVDQUF1QyxFQUN2Qyw2QkFBNkIsRUFDN0IsNEJBQTRCLEVBQzVCLDZCQUE2QixFQUM3QiwwQkFBMEIsR0FDM0IsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQ0wsa0JBQWtCLEVBS2xCLGtCQUFrQixFQUNsQiwwQkFBMEIsRUFDMUIsMENBQTBDLEVBQzFDLDhCQUE4QixFQUM5Qiw4QkFBOEIsRUFDOUIsK0JBQStCLEVBQy9CLDZCQUE2QixHQUM5QixNQUFNLGlDQUFpQyxDQUFDO0FBRXpDLE1BQU0sY0FBYyxHQUFHLDZCQUE2QixDQUFDO0FBQ3JELE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUMzQyxNQUFNLDRCQUE0QixHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3RELE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDL0MsTUFBTSwwQkFBMEIsR0FBRyxNQUFNLENBQUM7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