@agent-link/agent 0.1.298 → 0.1.300

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.
@@ -0,0 +1,538 @@
1
+ import { existsSync, readFileSync, readdirSync, rmSync, statSync, } from 'fs';
2
+ import { createHash } from 'crypto';
3
+ import { execFileSync } from 'child_process';
4
+ import http from 'http';
5
+ import { dirname, join, resolve } from 'path';
6
+ import { clearRuntimePid, isProcessAlive, loadRuntimeState } from './config.js';
7
+ import { getExternalUpgradeEventsPath, getExternalUpgradeJobPath, getUpgradeRoot, isExternalUpgradeTerminal, loadExternalUpgradeJob, markExternalUpgradeRepaired, transitionExternalUpgradeJob, } from './upgrade-job.js';
8
+ import { acquireUpgradeLock, hasUpgradeLock, loadUpgradeLockOwner, reclaimStaleUpgradeLock, } from './upgrade-lock.js';
9
+ import { loadCurrentVersion, loadLastKnownGood, validateVersionInstallation, writeVersionPointer, getCurrentVersionPath, getVersionDirectory, getVersionsRoot, } from './version-store.js';
10
+ import { installStableLauncher, spawnStableLauncher, validateStableLauncher, } from './launcher-manager.js';
11
+ import { lookupProcessStartIdentity, matchProcessStartIdentity, } from './process-identity.js';
12
+ import { computeLaunchSpecDigest, loadLaunchSpec } from './launch-spec.js';
13
+ const JOB_ID = /^[a-zA-Z0-9-]{1,128}$/;
14
+ const MAX_RETAINED_JOBS = 20;
15
+ const JOB_MAX_AGE_MS = 30 * 24 * 60 * 60_000;
16
+ const STAGING_MAX_AGE_MS = 24 * 60 * 60_000;
17
+ function requireJobId(jobId) {
18
+ if (!JOB_ID.test(jobId))
19
+ throw new Error(`Invalid upgrade job ID: ${jobId}`);
20
+ return jobId;
21
+ }
22
+ export function loadUpgradeStatus(jobId) {
23
+ if (jobId)
24
+ return loadExternalUpgradeJob(requireJobId(jobId));
25
+ const latestPath = join(getUpgradeRoot(), 'latest.json');
26
+ const value = JSON.parse(readFileSync(latestPath, 'utf8'));
27
+ if (value.schemaVersion !== 2 || !value.jobId) {
28
+ throw new Error('Latest upgrade is not an external schema-v2 job');
29
+ }
30
+ return loadExternalUpgradeJob(requireJobId(value.jobId));
31
+ }
32
+ export function readUpgradeLog(jobId) {
33
+ const job = loadUpgradeStatus(jobId);
34
+ const files = [
35
+ getExternalUpgradeEventsPath(job.jobId),
36
+ join(dirname(getExternalUpgradeJobPath(job.jobId)), 'worker.log'),
37
+ ];
38
+ return files
39
+ .filter(existsSync)
40
+ .map(file => readFileSync(file, 'utf8'))
41
+ .join('')
42
+ .replace(/Bearer\s+\S+/gi, 'Bearer [REDACTED]')
43
+ .replace(/([#?]\/?\?k=)[^\s"']+/gi, '$1[REDACTED]')
44
+ .replace(/("(?:password|token|e2eKey)"\s*:\s*")[^"]*/gi, '$1[REDACTED]');
45
+ }
46
+ function readLocalStatus(runtime) {
47
+ const discovery = runtime.controlPlane;
48
+ if (!discovery)
49
+ return Promise.reject(new Error('repaired Agent did not publish Local Control'));
50
+ return new Promise((resolveStatus, rejectStatus) => {
51
+ const request = http.request({
52
+ host: '127.0.0.1',
53
+ port: discovery.port,
54
+ path: '/v1/status',
55
+ method: 'GET',
56
+ headers: {
57
+ Host: `127.0.0.1:${discovery.port}`,
58
+ Authorization: `Bearer ${discovery.token}`,
59
+ },
60
+ }, response => {
61
+ const chunks = [];
62
+ response.on('data', chunk => chunks.push(Buffer.from(chunk)));
63
+ response.on('end', () => {
64
+ try {
65
+ const envelope = JSON.parse(Buffer.concat(chunks).toString('utf8'));
66
+ if (response.statusCode !== 200 || !envelope.ok) {
67
+ rejectStatus(new Error(`repaired Agent Local Control failed (${response.statusCode ?? 0})`));
68
+ }
69
+ else {
70
+ resolveStatus(envelope.data);
71
+ }
72
+ }
73
+ catch {
74
+ rejectStatus(new Error('repaired Agent Local Control returned invalid JSON'));
75
+ }
76
+ });
77
+ });
78
+ request.setTimeout(1500, () => request.destroy(new Error('repaired Agent Local Control timed out')));
79
+ request.on('error', rejectStatus);
80
+ request.end();
81
+ });
82
+ }
83
+ async function waitForRepairedHealth(job, timeoutMs = 15_000) {
84
+ const deadline = Date.now() + timeoutMs;
85
+ let lastError = 'repaired Agent did not publish runtime state';
86
+ let observedIdentity = job.repairRuntime ?? null;
87
+ while (Date.now() < deadline) {
88
+ try {
89
+ const runtime = loadRuntimeState();
90
+ if (!runtime?.pid || !runtime.processInstanceId) {
91
+ throw new Error('repaired Agent did not publish its process identity');
92
+ }
93
+ if (!observedIdentity) {
94
+ const lookup = lookupProcessStartIdentity(runtime.pid);
95
+ if (lookup.status !== 'found') {
96
+ throw new Error(`repaired Agent exact process identity is unavailable: ${lookup.status === 'error' ? lookup.error : lookup.status}`);
97
+ }
98
+ observedIdentity = {
99
+ pid: runtime.pid,
100
+ processInstanceId: runtime.processInstanceId,
101
+ processStartIdentity: lookup.identity,
102
+ };
103
+ }
104
+ const identityMatch = matchProcessStartIdentity(observedIdentity.pid, observedIdentity.processStartIdentity);
105
+ if (runtime.pid !== observedIdentity.pid
106
+ || runtime.processInstanceId !== observedIdentity.processInstanceId
107
+ || identityMatch.status !== 'match'
108
+ || !isProcessAlive(runtime.pid)
109
+ || runtime.versionStore?.active !== true
110
+ || runtime.versionStore.selectedVersion !== job.lastKnownGoodSelection.version
111
+ || runtime.versionStore.selectedIntegrity !== job.lastKnownGoodSelection.integrity
112
+ || runtime.upgradeJobId !== job.jobId
113
+ || resolve(runtime.launchSpecPath ?? '') !== resolve(job.launchSpecPath)
114
+ || runtime.launchSpecDigest !== job.launchSpecDigest
115
+ || computeLaunchSpecDigest(loadLaunchSpec(job.launchSpecPath)) !== job.launchSpecDigest) {
116
+ throw new Error('repaired Agent runtime identity contract does not match last-known-good');
117
+ }
118
+ const status = await readLocalStatus(runtime);
119
+ const runtimeSessionHash = createHash('sha256')
120
+ .update(runtime.sessionUrl ?? '')
121
+ .digest('hex');
122
+ const preservedSession = runtime.sessionId === job.oldRuntime.sessionId
123
+ && runtimeSessionHash === job.oldRuntime.sessionUrlHash
124
+ && status.connection?.sessionId === job.oldRuntime.sessionId;
125
+ const registration = runtime.sessionRegistration;
126
+ const registeredReplacement = registration
127
+ && registration.previousSessionId === job.oldRuntime.sessionId
128
+ && registration.sessionId === runtime.sessionId
129
+ && registration.sessionUrlHash === runtimeSessionHash
130
+ && status.connection?.sessionId === runtime.sessionId
131
+ && Number.isFinite(Date.parse(registration.registeredAt));
132
+ if (status.pid !== runtime.pid
133
+ || status.version !== job.lastKnownGoodSelection.version
134
+ || status.shutdown?.phase !== 'idle'
135
+ || status.connection?.acceptingWork !== true
136
+ || status.connection?.backendReady !== true
137
+ || (!preservedSession && !registeredReplacement)) {
138
+ throw new Error('repaired Agent did not become locally healthy');
139
+ }
140
+ job = transitionExternalUpgradeJob(job.jobId, 'repair-starting', {
141
+ repairRuntime: observedIdentity,
142
+ });
143
+ return observedIdentity;
144
+ }
145
+ catch (error) {
146
+ lastError = error.message;
147
+ if (!job.repairRuntime)
148
+ observedIdentity = null;
149
+ }
150
+ await new Promise(resolveWait => setTimeout(resolveWait, 100));
151
+ }
152
+ throw new Error(lastError);
153
+ }
154
+ async function waitForExactIdentity(pid, timeoutMs = 2000) {
155
+ const deadline = Date.now() + timeoutMs;
156
+ let lastError = 'process identity was not found';
157
+ while (Date.now() < deadline) {
158
+ const lookup = lookupProcessStartIdentity(pid);
159
+ if (lookup.status === 'found') {
160
+ return { pid, processStartIdentity: lookup.identity };
161
+ }
162
+ lastError = lookup.status === 'error' ? lookup.error : lookup.status;
163
+ await new Promise(resolveWait => setTimeout(resolveWait, 50));
164
+ }
165
+ throw new Error(`Repair launcher exact identity is unavailable: ${lastError}`);
166
+ }
167
+ function descendantIdentities(rootPid) {
168
+ if (process.platform === 'win32')
169
+ return [];
170
+ const output = execFileSync('/bin/ps', ['-axo', 'pid=,ppid='], {
171
+ encoding: 'utf8',
172
+ timeout: 3000,
173
+ });
174
+ const children = new Map();
175
+ for (const line of output.split(/\r?\n/)) {
176
+ const match = line.trim().match(/^(\d+)\s+(\d+)$/);
177
+ if (!match)
178
+ continue;
179
+ const pid = Number(match[1]);
180
+ const parent = Number(match[2]);
181
+ children.set(parent, [...(children.get(parent) ?? []), pid]);
182
+ }
183
+ const descendants = [];
184
+ const visit = (parent) => {
185
+ for (const pid of children.get(parent) ?? []) {
186
+ visit(pid);
187
+ descendants.push(pid);
188
+ }
189
+ };
190
+ visit(rootPid);
191
+ return descendants.flatMap(pid => {
192
+ const lookup = lookupProcessStartIdentity(pid);
193
+ return lookup.status === 'found'
194
+ ? [{ pid, processStartIdentity: lookup.identity }]
195
+ : [];
196
+ });
197
+ }
198
+ async function terminateExactProcessTree(identity) {
199
+ const match = matchProcessStartIdentity(identity.pid, identity.processStartIdentity);
200
+ if (match.status === 'absent' || match.status === 'mismatch')
201
+ return;
202
+ if (match.status !== 'match') {
203
+ throw new Error(`Cannot safely terminate repair process tree: ${match.error}`);
204
+ }
205
+ if (process.platform === 'win32') {
206
+ try {
207
+ execFileSync('taskkill.exe', ['/pid', String(identity.pid), '/t', '/f'], {
208
+ stdio: 'ignore',
209
+ windowsHide: true,
210
+ timeout: 10_000,
211
+ });
212
+ }
213
+ catch (error) {
214
+ const after = matchProcessStartIdentity(identity.pid, identity.processStartIdentity);
215
+ if (after.status === 'match' || after.status === 'error')
216
+ throw error;
217
+ }
218
+ return;
219
+ }
220
+ const tree = [...descendantIdentities(identity.pid), identity];
221
+ for (const member of tree) {
222
+ if (matchProcessStartIdentity(member.pid, member.processStartIdentity).status !== 'match')
223
+ continue;
224
+ try {
225
+ process.kill(member.pid, 'SIGTERM');
226
+ }
227
+ catch (error) {
228
+ if (error.code !== 'ESRCH')
229
+ throw error;
230
+ }
231
+ }
232
+ await new Promise(resolveWait => setTimeout(resolveWait, 250));
233
+ for (const member of tree) {
234
+ if (matchProcessStartIdentity(member.pid, member.processStartIdentity).status !== 'match')
235
+ continue;
236
+ try {
237
+ process.kill(member.pid, 'SIGKILL');
238
+ }
239
+ catch (error) {
240
+ if (error.code !== 'ESRCH')
241
+ throw error;
242
+ }
243
+ }
244
+ }
245
+ export async function repairExternalUpgrade(deps = {}) {
246
+ let job = loadUpgradeStatus();
247
+ if (job.phase !== 'repair-required' && job.phase !== 'repair-starting') {
248
+ throw new Error(`Upgrade ${job.jobId} is ${job.phase}; repair is not required`);
249
+ }
250
+ const lkg = loadLastKnownGood();
251
+ if (!lkg)
252
+ throw new Error('Last-known-good selection is missing');
253
+ validateVersionInstallation(lkg);
254
+ try {
255
+ validateStableLauncher();
256
+ }
257
+ catch {
258
+ installStableLauncher();
259
+ }
260
+ reclaimStaleUpgradeLock(job.jobId, job.lockNonce);
261
+ const repairLock = acquireUpgradeLock(job.jobId, job.lockNonce);
262
+ try {
263
+ const runtime = loadRuntimeState();
264
+ if (job.phase === 'repair-required') {
265
+ const exactRuntime = runtime?.pid && runtime.processInstanceId
266
+ ? [
267
+ job.oldRuntime,
268
+ job.targetRuntime,
269
+ job.rollbackRuntime,
270
+ job.repairRuntime,
271
+ ].find(identity => identity?.pid === runtime.pid
272
+ && identity?.processInstanceId === runtime.processInstanceId)
273
+ : undefined;
274
+ if (exactRuntime) {
275
+ const state = matchProcessStartIdentity(exactRuntime.pid, exactRuntime.processStartIdentity);
276
+ if (state.status === 'match') {
277
+ throw new Error(`Refusing repair while exact Agent PID ${runtime.pid} is running`);
278
+ }
279
+ if (state.status === 'error') {
280
+ throw new Error(`Cannot determine recorded Agent identity before repair: ${state.error}`);
281
+ }
282
+ }
283
+ if (runtime?.pid) {
284
+ clearRuntimePid(runtime.processInstanceId
285
+ ? { pid: runtime.pid, processInstanceId: runtime.processInstanceId }
286
+ : runtime.pid);
287
+ }
288
+ }
289
+ const previousRepairRuntimeState = job.repairRuntime
290
+ ? matchProcessStartIdentity(job.repairRuntime.pid, job.repairRuntime.processStartIdentity)
291
+ : null;
292
+ const previousRepairLauncherState = job.repairLauncher
293
+ ? matchProcessStartIdentity(job.repairLauncher.pid, job.repairLauncher.processStartIdentity)
294
+ : null;
295
+ for (const state of [previousRepairRuntimeState, previousRepairLauncherState]) {
296
+ if (state?.status === 'error') {
297
+ throw new Error(`Cannot determine interrupted repair identity: ${state.error}`);
298
+ }
299
+ }
300
+ job = transitionExternalUpgradeJob(job.jobId, 'repair-starting', {
301
+ error: null,
302
+ clearRepairRuntime: !!job.repairRuntime
303
+ && previousRepairRuntimeState?.status !== 'match',
304
+ clearRepairLauncher: !!job.repairLauncher
305
+ && previousRepairLauncherState?.status !== 'match',
306
+ });
307
+ writeVersionPointer(getCurrentVersionPath(), lkg);
308
+ let launcherPid = job.repairLauncher?.pid ?? 0;
309
+ const repairRuntimeState = job.repairRuntime
310
+ ? matchProcessStartIdentity(job.repairRuntime.pid, job.repairRuntime.processStartIdentity)
311
+ : null;
312
+ const repairLauncherState = job.repairLauncher
313
+ ? matchProcessStartIdentity(job.repairLauncher.pid, job.repairLauncher.processStartIdentity)
314
+ : null;
315
+ let unpersistedLauncherPid = 0;
316
+ try {
317
+ if (repairRuntimeState?.status !== 'match' && repairLauncherState?.status !== 'match') {
318
+ launcherPid = deps.spawnLauncher
319
+ ? deps.spawnLauncher(job.launchSpecPath)
320
+ : spawnStableLauncher(job.launchSpecPath, {
321
+ upgradeJobId: job.jobId,
322
+ recoveryOwner: 'repair',
323
+ });
324
+ unpersistedLauncherPid = launcherPid;
325
+ const identity = await waitForExactIdentity(launcherPid);
326
+ job = transitionExternalUpgradeJob(job.jobId, 'repair-starting', {
327
+ repairLauncher: identity,
328
+ });
329
+ unpersistedLauncherPid = 0;
330
+ }
331
+ const repairRuntime = await (deps.waitForHealth ?? waitForRepairedHealth)(job);
332
+ if (repairRuntime) {
333
+ job = transitionExternalUpgradeJob(job.jobId, 'repair-starting', { repairRuntime });
334
+ }
335
+ if (!loadExternalUpgradeJob(job.jobId).repairRuntime) {
336
+ throw new Error('Repaired Agent did not publish a durable exact runtime identity');
337
+ }
338
+ }
339
+ catch (error) {
340
+ const failureMessage = `repair failed: ${error.message}`;
341
+ const failedJob = transitionExternalUpgradeJob(job.jobId, 'repair-required', {
342
+ error: failureMessage,
343
+ });
344
+ const terminate = deps.terminateProcessTree ?? terminateExactProcessTree;
345
+ const cleanupErrors = [];
346
+ let unpersistedLauncher;
347
+ if (unpersistedLauncherPid) {
348
+ const lookup = lookupProcessStartIdentity(unpersistedLauncherPid);
349
+ if (lookup.status === 'found') {
350
+ unpersistedLauncher = {
351
+ pid: unpersistedLauncherPid,
352
+ processStartIdentity: lookup.identity,
353
+ };
354
+ }
355
+ else if (lookup.status === 'error') {
356
+ cleanupErrors.push(`cannot identify unpersisted repair launcher ${unpersistedLauncherPid}: ${lookup.error}`);
357
+ }
358
+ }
359
+ for (const identity of [
360
+ failedJob.repairLauncher,
361
+ failedJob.repairRuntime,
362
+ unpersistedLauncher,
363
+ ]) {
364
+ if (!identity)
365
+ continue;
366
+ try {
367
+ await terminate(identity);
368
+ }
369
+ catch (cleanupError) {
370
+ cleanupErrors.push(cleanupError.message);
371
+ }
372
+ }
373
+ if (cleanupErrors.length) {
374
+ transitionExternalUpgradeJob(job.jobId, 'repair-required', {
375
+ error: `${failureMessage}; cleanup failed: ${cleanupErrors.join('; ')}`,
376
+ });
377
+ }
378
+ throw new Error(`Last-known-good failed local health; repair remains required: ${error.message}`);
379
+ }
380
+ const repaired = markExternalUpgradeRepaired(job.jobId);
381
+ return { job: repaired, launcherPid };
382
+ }
383
+ finally {
384
+ repairLock.release();
385
+ }
386
+ }
387
+ export function resumeInterruptedUpgrade(jobId, deps = {}) {
388
+ const job = loadExternalUpgradeJob(requireJobId(jobId));
389
+ const spawnLauncher = deps.spawnLauncher ?? spawnStableLauncher;
390
+ if (isExternalUpgradeTerminal(job.phase)) {
391
+ if (!hasUpgradeLock())
392
+ return 'terminal';
393
+ spawnLauncher(job.launchSpecPath, {
394
+ upgradeJobId: job.jobId,
395
+ });
396
+ return 'started';
397
+ }
398
+ if (job.phase === 'repair-starting') {
399
+ for (const identity of [job.repairRuntime, job.repairLauncher]) {
400
+ if (!identity)
401
+ continue;
402
+ const state = matchProcessStartIdentity(identity.pid, identity.processStartIdentity);
403
+ if (state.status === 'match')
404
+ return 'worker-running';
405
+ if (state.status === 'error') {
406
+ throw new Error(`Cannot determine interrupted repair identity: ${state.error}`);
407
+ }
408
+ }
409
+ spawnLauncher(job.launchSpecPath, {
410
+ upgradeJobId: job.jobId,
411
+ recoveryOwner: 'repair',
412
+ });
413
+ return 'started';
414
+ }
415
+ if (job.worker) {
416
+ const worker = matchProcessStartIdentity(job.worker.pid, job.worker.processStartIdentity);
417
+ if (worker.status === 'match')
418
+ return 'worker-running';
419
+ if (worker.status === 'error') {
420
+ throw new Error(`Cannot determine updater worker identity: ${worker.error}`);
421
+ }
422
+ }
423
+ spawnLauncher(job.launchSpecPath, {
424
+ upgradeJobId: job.jobId,
425
+ });
426
+ return 'started';
427
+ }
428
+ function referencedVersionDirectories(jobs) {
429
+ const keep = new Set();
430
+ for (const pointer of [loadCurrentVersion(), loadLastKnownGood()]) {
431
+ if (pointer)
432
+ keep.add(resolve(getVersionDirectory(pointer.version, pointer.integrity)));
433
+ }
434
+ for (const job of jobs) {
435
+ if (!isExternalUpgradeTerminal(job.phase) || job.phase === 'repair-required') {
436
+ for (const pointer of [
437
+ job.sourceSelection,
438
+ job.targetSelection,
439
+ job.lastKnownGoodSelection,
440
+ ]) {
441
+ keep.add(resolve(getVersionDirectory(pointer.version, pointer.integrity)));
442
+ }
443
+ }
444
+ }
445
+ return keep;
446
+ }
447
+ export function runUpgradeRetention(now = new Date()) {
448
+ const upgradeRoot = getUpgradeRoot();
449
+ const latestPath = join(upgradeRoot, 'latest.json');
450
+ let latestJobId = null;
451
+ let protectAllJobs = false;
452
+ if (existsSync(latestPath)) {
453
+ try {
454
+ const latest = JSON.parse(readFileSync(latestPath, 'utf8'));
455
+ if (latest.schemaVersion === 2
456
+ && typeof latest.jobId === 'string'
457
+ && JOB_ID.test(latest.jobId)) {
458
+ latestJobId = latest.jobId;
459
+ }
460
+ else {
461
+ protectAllJobs = true;
462
+ }
463
+ }
464
+ catch {
465
+ protectAllJobs = true;
466
+ }
467
+ }
468
+ const jobs = existsSync(upgradeRoot)
469
+ ? readdirSync(upgradeRoot, { withFileTypes: true })
470
+ .filter(entry => entry.isDirectory() && JOB_ID.test(entry.name))
471
+ .flatMap(entry => {
472
+ try {
473
+ return [loadExternalUpgradeJob(entry.name)];
474
+ }
475
+ catch {
476
+ return [];
477
+ }
478
+ })
479
+ : [];
480
+ const keepVersions = referencedVersionDirectories(jobs);
481
+ let activeLockJobId = null;
482
+ let protectAllStaging = false;
483
+ if (hasUpgradeLock()) {
484
+ try {
485
+ activeLockJobId = loadUpgradeLockOwner().jobId;
486
+ }
487
+ catch {
488
+ protectAllStaging = true;
489
+ }
490
+ }
491
+ const versionsRoot = getVersionsRoot();
492
+ const removedVersions = [];
493
+ const removedStaging = [];
494
+ if (existsSync(versionsRoot)) {
495
+ const complete = readdirSync(versionsRoot, { withFileTypes: true })
496
+ .filter(entry => entry.isDirectory() && !entry.name.startsWith('.staging-'))
497
+ .map(entry => join(versionsRoot, entry.name))
498
+ .sort((left, right) => statSync(right).mtimeMs - statSync(left).mtimeMs);
499
+ for (const extra of complete.filter(path => !keepVersions.has(resolve(path))).slice(2)) {
500
+ rmSync(extra, { recursive: true, force: true });
501
+ removedVersions.push(extra);
502
+ }
503
+ for (const entry of readdirSync(versionsRoot, { withFileTypes: true })) {
504
+ if (!entry.isDirectory() || !entry.name.startsWith('.staging-'))
505
+ continue;
506
+ const staging = join(versionsRoot, entry.name);
507
+ const jobId = entry.name.slice('.staging-'.length);
508
+ const protectedByJob = jobs.some(job => job.jobId === jobId && (!isExternalUpgradeTerminal(job.phase) || job.phase === 'repair-required'));
509
+ // Existing staging names predate job IDs, so any active upgrade lock must
510
+ // conservatively protect all staging until the transaction finishes.
511
+ const protectedByLock = protectAllStaging || activeLockJobId !== null;
512
+ if (!protectedByJob
513
+ && !protectedByLock
514
+ && now.getTime() - statSync(staging).mtimeMs > STAGING_MAX_AGE_MS) {
515
+ rmSync(staging, { recursive: true, force: true });
516
+ removedStaging.push(staging);
517
+ }
518
+ }
519
+ }
520
+ const removableJobs = jobs
521
+ .filter(job => !protectAllJobs
522
+ && job.jobId !== latestJobId
523
+ && isExternalUpgradeTerminal(job.phase)
524
+ && job.phase !== 'repair-required')
525
+ .sort((left, right) => Date.parse(right.updatedAt) - Date.parse(left.updatedAt));
526
+ const removedJobs = [];
527
+ for (const job of removableJobs) {
528
+ const tooOld = now.getTime() - Date.parse(job.updatedAt) > JOB_MAX_AGE_MS;
529
+ const beyondCount = removableJobs.indexOf(job) >= MAX_RETAINED_JOBS;
530
+ if (tooOld || beyondCount) {
531
+ const directory = dirname(getExternalUpgradeJobPath(job.jobId));
532
+ rmSync(directory, { recursive: true, force: true });
533
+ removedJobs.push(directory);
534
+ }
535
+ }
536
+ return { removedVersions, removedJobs, removedStaging };
537
+ }
538
+ //# sourceMappingURL=upgrade-operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade-operations.js","sourceRoot":"","sources":["../src/upgrade-operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ExternalUpgradeJob } from './upgrade-job.js';
2
+ export type WorkerUpgradeCliStatus = 'completed' | 'pending' | 'failed';
3
+ export interface WorkerUpgradeCliResult {
4
+ status: WorkerUpgradeCliStatus;
5
+ message: string;
6
+ exitCode: number;
7
+ }
8
+ type WorkerUpgradeResultJob = Pick<ExternalUpgradeJob, 'jobId' | 'phase' | 'targetVersion' | 'lastKnownGoodSelection'>;
9
+ export declare function interpretWorkerUpgradeResult(job: WorkerUpgradeResultJob): WorkerUpgradeCliResult;
10
+ export {};
@@ -0,0 +1,38 @@
1
+ export function interpretWorkerUpgradeResult(job) {
2
+ switch (job.phase) {
3
+ case 'completed':
4
+ return {
5
+ status: 'completed',
6
+ message: `External upgrade ${job.jobId} completed target ${job.targetVersion}.`,
7
+ exitCode: 0,
8
+ };
9
+ case 'relay-pending':
10
+ return {
11
+ status: 'pending',
12
+ message: `External upgrade ${job.jobId} passed local health for target `
13
+ + `${job.targetVersion}; relay verification is pending asynchronously.`,
14
+ exitCode: 0,
15
+ };
16
+ case 'rolled-back':
17
+ return {
18
+ status: 'failed',
19
+ message: `External upgrade ${job.jobId} failed and rolled back to `
20
+ + `${job.lastKnownGoodSelection.version}.`,
21
+ exitCode: 1,
22
+ };
23
+ case 'repair-required':
24
+ return {
25
+ status: 'failed',
26
+ message: `External upgrade ${job.jobId} failed and requires repair; `
27
+ + 'run agentlink-client upgrade-repair.',
28
+ exitCode: 1,
29
+ };
30
+ default:
31
+ return {
32
+ status: 'failed',
33
+ message: `External upgrade ${job.jobId} returned unexpected phase ${job.phase}.`,
34
+ exitCode: 1,
35
+ };
36
+ }
37
+ }
38
+ //# sourceMappingURL=worker-upgrade-cli-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-upgrade-cli-result.js","sourceRoot":"","sources":["../src/worker-upgrade-cli-result.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,4BAA4B,CAC1C,GAA2B;IAE3B,QAAQ,GAAG,CAAC,KAAK,EAAE,CAAC;QAClB,KAAK,WAAW;YACd,OAAO;gBACL,MAAM,EAAE,WAAW;gBACnB,OAAO,EAAE,oBAAoB,GAAG,CAAC,KAAK,qBAAqB,GAAG,CAAC,aAAa,GAAG;gBAC/E,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,KAAK,eAAe;YAClB,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE,oBAAoB,GAAG,CAAC,KAAK,kCAAkC;sBACpE,GAAG,GAAG,CAAC,aAAa,iDAAiD;gBACzE,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,KAAK,aAAa;YAChB,OAAO;gBACL,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,oBAAoB,GAAG,CAAC,KAAK,6BAA6B;sBAC/D,GAAG,GAAG,CAAC,sBAAsB,CAAC,OAAO,GAAG;gBAC5C,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,KAAK,iBAAiB;YACpB,OAAO;gBACL,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,oBAAoB,GAAG,CAAC,KAAK,+BAA+B;sBACjE,sCAAsC;gBAC1C,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ;YACE,OAAO;gBACL,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,oBAAoB,GAAG,CAAC,KAAK,8BAA8B,GAAG,CAAC,KAAK,GAAG;gBAChF,QAAQ,EAAE,CAAC;aACZ,CAAC;IACN,CAAC;AACH,CAAC"}