@forgezero/agent 0.1.146 → 0.1.148

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.
@@ -264,32 +264,49 @@ function switchAgentSocketRoute(route, backend) {
264
264
  }
265
265
  function probeAgentCandidate(expected, socketPath = DEFAULT_AGENT_CANDIDATE_READY_SOCKET, timeoutMs = 5000) {
266
266
  return new Promise((resolve2) => {
267
- const socket = connect(socketPath);
268
- let buffer = "";
269
267
  let settled = false;
268
+ let socket;
269
+ const deadline = Date.now() + timeoutMs;
270
270
  const finish = (value) => {
271
271
  if (settled)
272
272
  return;
273
273
  settled = true;
274
- clearTimeout(timer);
275
- socket.destroy();
274
+ socket?.destroy();
276
275
  resolve2(value);
277
276
  };
278
- const timer = setTimeout(() => finish(false), timeoutMs);
279
- socket.on("data", (chunk) => {
280
- buffer += chunk.toString("utf8");
281
- const newline = buffer.indexOf(`
282
- `);
283
- if (newline < 0)
284
- return;
285
- try {
286
- const value = JSON.parse(buffer.slice(0, newline));
287
- finish(value.version === expected.version && value.nodeKey === expected.nodeKey && value.bound === expected.bound && expected.vault.includes(value.vault));
288
- } catch {
289
- finish(false);
277
+ const attempt = () => {
278
+ if (settled || Date.now() >= deadline)
279
+ return finish(false);
280
+ if (!existsSync2(socketPath)) {
281
+ const remaining = deadline - Date.now();
282
+ return setTimeout(attempt, Math.min(100, remaining));
290
283
  }
291
- });
292
- socket.on("error", () => finish(false));
284
+ let buffer = "";
285
+ const candidate = connect(socketPath);
286
+ socket = candidate;
287
+ candidate.on("data", (chunk) => {
288
+ buffer += chunk.toString("utf8");
289
+ const newline = buffer.indexOf(`
290
+ `);
291
+ if (newline < 0)
292
+ return;
293
+ try {
294
+ const value = JSON.parse(buffer.slice(0, newline));
295
+ finish(value.version === expected.version && value.nodeKey === expected.nodeKey && value.bound === expected.bound && expected.vault.includes(value.vault));
296
+ } catch {
297
+ finish(false);
298
+ }
299
+ });
300
+ candidate.once("error", () => {
301
+ candidate.destroy();
302
+ const remaining = deadline - Date.now();
303
+ if (remaining <= 0)
304
+ finish(false);
305
+ else
306
+ setTimeout(attempt, Math.min(100, remaining));
307
+ });
308
+ };
309
+ attempt();
293
310
  });
294
311
  }
295
312
 
@@ -300,7 +317,6 @@ var AGENT_UPDATE_JOURNAL = "/var/lib/forgezero/agent-update.json";
300
317
  var AGENT_UPDATE_RECEIPT = "/var/lib/forgezero/agent-update-receipt.json";
301
318
  var MAX_REQUEST_BYTES = 8 * 1024;
302
319
  var COMPUTE_HELPER_UNITS = [
303
- "forgezero-agent-egress.service",
304
320
  "forgezero-deploy-runner.service",
305
321
  "forgezero-lifecycle-helper.service",
306
322
  "forgezero-software-helper.service"
@@ -606,9 +622,9 @@ async function activateAgentRelease(staged, options = {}) {
606
622
  restoreAgentRelease(staged);
607
623
  restored = true;
608
624
  await restartAgent(target, run);
609
- rollbackHealthy = await probe();
610
- if (rollbackHealthy && target === "compute")
625
+ if (target === "compute")
611
626
  switchAgentSocketRoute(paths.route, paths.active);
627
+ rollbackHealthy = await probe();
612
628
  } catch {
613
629
  rollbackHealthy = false;
614
630
  }
@@ -917,7 +933,7 @@ async function postSignedNode(options, path, body) {
917
933
  }
918
934
 
919
935
  // src/version.ts
920
- var VERSION3 = "0.1.146";
936
+ var VERSION3 = "0.1.148";
921
937
 
922
938
  // src/agent-heartbeat.ts
923
939
  function readAgentHostMetrics() {
@@ -264,32 +264,49 @@ function switchAgentSocketRoute(route, backend) {
264
264
  }
265
265
  function probeAgentCandidate(expected, socketPath = DEFAULT_AGENT_CANDIDATE_READY_SOCKET, timeoutMs = 5000) {
266
266
  return new Promise((resolve2) => {
267
- const socket = connect(socketPath);
268
- let buffer = "";
269
267
  let settled = false;
268
+ let socket;
269
+ const deadline = Date.now() + timeoutMs;
270
270
  const finish = (value) => {
271
271
  if (settled)
272
272
  return;
273
273
  settled = true;
274
- clearTimeout(timer);
275
- socket.destroy();
274
+ socket?.destroy();
276
275
  resolve2(value);
277
276
  };
278
- const timer = setTimeout(() => finish(false), timeoutMs);
279
- socket.on("data", (chunk) => {
280
- buffer += chunk.toString("utf8");
281
- const newline = buffer.indexOf(`
282
- `);
283
- if (newline < 0)
284
- return;
285
- try {
286
- const value = JSON.parse(buffer.slice(0, newline));
287
- finish(value.version === expected.version && value.nodeKey === expected.nodeKey && value.bound === expected.bound && expected.vault.includes(value.vault));
288
- } catch {
289
- finish(false);
277
+ const attempt = () => {
278
+ if (settled || Date.now() >= deadline)
279
+ return finish(false);
280
+ if (!existsSync2(socketPath)) {
281
+ const remaining = deadline - Date.now();
282
+ return setTimeout(attempt, Math.min(100, remaining));
290
283
  }
291
- });
292
- socket.on("error", () => finish(false));
284
+ let buffer = "";
285
+ const candidate = connect(socketPath);
286
+ socket = candidate;
287
+ candidate.on("data", (chunk) => {
288
+ buffer += chunk.toString("utf8");
289
+ const newline = buffer.indexOf(`
290
+ `);
291
+ if (newline < 0)
292
+ return;
293
+ try {
294
+ const value = JSON.parse(buffer.slice(0, newline));
295
+ finish(value.version === expected.version && value.nodeKey === expected.nodeKey && value.bound === expected.bound && expected.vault.includes(value.vault));
296
+ } catch {
297
+ finish(false);
298
+ }
299
+ });
300
+ candidate.once("error", () => {
301
+ candidate.destroy();
302
+ const remaining = deadline - Date.now();
303
+ if (remaining <= 0)
304
+ finish(false);
305
+ else
306
+ setTimeout(attempt, Math.min(100, remaining));
307
+ });
308
+ };
309
+ attempt();
293
310
  });
294
311
  }
295
312
 
@@ -300,7 +317,6 @@ var AGENT_UPDATE_JOURNAL = "/var/lib/forgezero/agent-update.json";
300
317
  var AGENT_UPDATE_RECEIPT = "/var/lib/forgezero/agent-update-receipt.json";
301
318
  var MAX_REQUEST_BYTES = 8 * 1024;
302
319
  var COMPUTE_HELPER_UNITS = [
303
- "forgezero-agent-egress.service",
304
320
  "forgezero-deploy-runner.service",
305
321
  "forgezero-lifecycle-helper.service",
306
322
  "forgezero-software-helper.service"
@@ -606,9 +622,9 @@ async function activateAgentRelease(staged, options = {}) {
606
622
  restoreAgentRelease(staged);
607
623
  restored = true;
608
624
  await restartAgent(target, run);
609
- rollbackHealthy = await probe();
610
- if (rollbackHealthy && target === "compute")
625
+ if (target === "compute")
611
626
  switchAgentSocketRoute(paths.route, paths.active);
627
+ rollbackHealthy = await probe();
612
628
  } catch {
613
629
  rollbackHealthy = false;
614
630
  }
package/dist/bootstrap.js CHANGED
@@ -1460,7 +1460,7 @@ var UPDATE_RETRY_BASE_MS = 5 * 60000;
1460
1460
  var UPDATE_RETRY_MAX_MS = 24 * 60 * 60000;
1461
1461
 
1462
1462
  // src/version.ts
1463
- var VERSION = "0.1.146";
1463
+ var VERSION = "0.1.148";
1464
1464
 
1465
1465
  // src/software.ts
1466
1466
  var PINNED_BUN_VERSION = "1.3.14";
package/dist/fz-agent.js CHANGED
@@ -11632,7 +11632,7 @@ async function writeAndCloseProcessInput(input, value) {
11632
11632
  }
11633
11633
 
11634
11634
  // src/version.ts
11635
- var VERSION2 = "0.1.146";
11635
+ var VERSION2 = "0.1.148";
11636
11636
 
11637
11637
  // src/ssh-bootstrap.ts
11638
11638
  function deriveMetalAdmissionProvisioning(lscpu) {
@@ -14423,32 +14423,49 @@ function startAgentCandidateReady(ready, socketPath = DEFAULT_AGENT_CANDIDATE_RE
14423
14423
  }
14424
14424
  function probeAgentCandidate(expected, socketPath = DEFAULT_AGENT_CANDIDATE_READY_SOCKET, timeoutMs = 5000) {
14425
14425
  return new Promise((resolve3) => {
14426
- const socket = connect5(socketPath);
14427
- let buffer = "";
14428
14426
  let settled = false;
14427
+ let socket;
14428
+ const deadline = Date.now() + timeoutMs;
14429
14429
  const finish = (value) => {
14430
14430
  if (settled)
14431
14431
  return;
14432
14432
  settled = true;
14433
- clearTimeout(timer);
14434
- socket.destroy();
14433
+ socket?.destroy();
14435
14434
  resolve3(value);
14436
14435
  };
14437
- const timer = setTimeout(() => finish(false), timeoutMs);
14438
- socket.on("data", (chunk) => {
14439
- buffer += chunk.toString("utf8");
14440
- const newline = buffer.indexOf(`
14441
- `);
14442
- if (newline < 0)
14443
- return;
14444
- try {
14445
- const value = JSON.parse(buffer.slice(0, newline));
14446
- finish(value.version === expected.version && value.nodeKey === expected.nodeKey && value.bound === expected.bound && expected.vault.includes(value.vault));
14447
- } catch {
14448
- finish(false);
14436
+ const attempt = () => {
14437
+ if (settled || Date.now() >= deadline)
14438
+ return finish(false);
14439
+ if (!existsSync13(socketPath)) {
14440
+ const remaining = deadline - Date.now();
14441
+ return setTimeout(attempt, Math.min(100, remaining));
14449
14442
  }
14450
- });
14451
- socket.on("error", () => finish(false));
14443
+ let buffer = "";
14444
+ const candidate = connect5(socketPath);
14445
+ socket = candidate;
14446
+ candidate.on("data", (chunk) => {
14447
+ buffer += chunk.toString("utf8");
14448
+ const newline = buffer.indexOf(`
14449
+ `);
14450
+ if (newline < 0)
14451
+ return;
14452
+ try {
14453
+ const value = JSON.parse(buffer.slice(0, newline));
14454
+ finish(value.version === expected.version && value.nodeKey === expected.nodeKey && value.bound === expected.bound && expected.vault.includes(value.vault));
14455
+ } catch {
14456
+ finish(false);
14457
+ }
14458
+ });
14459
+ candidate.once("error", () => {
14460
+ candidate.destroy();
14461
+ const remaining = deadline - Date.now();
14462
+ if (remaining <= 0)
14463
+ finish(false);
14464
+ else
14465
+ setTimeout(attempt, Math.min(100, remaining));
14466
+ });
14467
+ };
14468
+ attempt();
14452
14469
  });
14453
14470
  }
14454
14471
 
@@ -14459,7 +14476,6 @@ var AGENT_UPDATE_JOURNAL = "/var/lib/forgezero/agent-update.json";
14459
14476
  var AGENT_UPDATE_RECEIPT = "/var/lib/forgezero/agent-update-receipt.json";
14460
14477
  var MAX_REQUEST_BYTES5 = 8 * 1024;
14461
14478
  var COMPUTE_HELPER_UNITS = [
14462
- "forgezero-agent-egress.service",
14463
14479
  "forgezero-deploy-runner.service",
14464
14480
  "forgezero-lifecycle-helper.service",
14465
14481
  "forgezero-software-helper.service"
@@ -14765,9 +14781,9 @@ async function activateAgentRelease(staged, options = {}) {
14765
14781
  restoreAgentRelease(staged);
14766
14782
  restored = true;
14767
14783
  await restartAgent(target2, run2);
14768
- rollbackHealthy = await probe();
14769
- if (rollbackHealthy && target2 === "compute")
14784
+ if (target2 === "compute")
14770
14785
  switchAgentSocketRoute(paths.route, paths.active);
14786
+ rollbackHealthy = await probe();
14771
14787
  } catch {
14772
14788
  rollbackHealthy = false;
14773
14789
  }
@@ -20898,6 +20914,8 @@ if (import.meta.main) {
20898
20914
  };
20899
20915
  if (initialAttestationVerified)
20900
20916
  await activateVaultReplica();
20917
+ if (binding?.realm === "platform" && initialAttestationVerified)
20918
+ initialVaultState = "ready";
20901
20919
  if (handoverCandidate) {
20902
20920
  const ready = startAgentCandidateReady({
20903
20921
  version: VERSION2,
package/dist/fz.js CHANGED
@@ -8058,7 +8058,7 @@ var UPDATE_RETRY_BASE_MS = 5 * 60000;
8058
8058
  var UPDATE_RETRY_MAX_MS = 24 * 60 * 60000;
8059
8059
 
8060
8060
  // src/version.ts
8061
- var VERSION2 = "0.1.146";
8061
+ var VERSION2 = "0.1.148";
8062
8062
 
8063
8063
  // src/software.ts
8064
8064
  var PINNED_BUN_VERSION = "1.3.14";
@@ -366,7 +366,7 @@ function systemdAgentEgressDirectives(loopbackTcpPorts = []) {
366
366
  }
367
367
 
368
368
  // src/version.ts
369
- var VERSION = "0.1.146";
369
+ var VERSION = "0.1.148";
370
370
 
371
371
  // src/otel-collector.ts
372
372
  var FORGEZERO_OTEL_COLLECTOR_UNIT = "forgezero-otel-collector.service";
@@ -1460,7 +1460,7 @@ var UPDATE_RETRY_BASE_MS = 5 * 60000;
1460
1460
  var UPDATE_RETRY_MAX_MS = 24 * 60 * 60000;
1461
1461
 
1462
1462
  // src/version.ts
1463
- var VERSION = "0.1.146";
1463
+ var VERSION = "0.1.148";
1464
1464
 
1465
1465
  // src/software.ts
1466
1466
  var PINNED_BUN_VERSION = "1.3.14";
@@ -264,32 +264,49 @@ function switchAgentSocketRoute(route, backend) {
264
264
  }
265
265
  function probeAgentCandidate(expected, socketPath = DEFAULT_AGENT_CANDIDATE_READY_SOCKET, timeoutMs = 5000) {
266
266
  return new Promise((resolve2) => {
267
- const socket = connect(socketPath);
268
- let buffer = "";
269
267
  let settled = false;
268
+ let socket;
269
+ const deadline = Date.now() + timeoutMs;
270
270
  const finish = (value) => {
271
271
  if (settled)
272
272
  return;
273
273
  settled = true;
274
- clearTimeout(timer);
275
- socket.destroy();
274
+ socket?.destroy();
276
275
  resolve2(value);
277
276
  };
278
- const timer = setTimeout(() => finish(false), timeoutMs);
279
- socket.on("data", (chunk) => {
280
- buffer += chunk.toString("utf8");
281
- const newline = buffer.indexOf(`
282
- `);
283
- if (newline < 0)
284
- return;
285
- try {
286
- const value = JSON.parse(buffer.slice(0, newline));
287
- finish(value.version === expected.version && value.nodeKey === expected.nodeKey && value.bound === expected.bound && expected.vault.includes(value.vault));
288
- } catch {
289
- finish(false);
277
+ const attempt = () => {
278
+ if (settled || Date.now() >= deadline)
279
+ return finish(false);
280
+ if (!existsSync2(socketPath)) {
281
+ const remaining = deadline - Date.now();
282
+ return setTimeout(attempt, Math.min(100, remaining));
290
283
  }
291
- });
292
- socket.on("error", () => finish(false));
284
+ let buffer = "";
285
+ const candidate = connect(socketPath);
286
+ socket = candidate;
287
+ candidate.on("data", (chunk) => {
288
+ buffer += chunk.toString("utf8");
289
+ const newline = buffer.indexOf(`
290
+ `);
291
+ if (newline < 0)
292
+ return;
293
+ try {
294
+ const value = JSON.parse(buffer.slice(0, newline));
295
+ finish(value.version === expected.version && value.nodeKey === expected.nodeKey && value.bound === expected.bound && expected.vault.includes(value.vault));
296
+ } catch {
297
+ finish(false);
298
+ }
299
+ });
300
+ candidate.once("error", () => {
301
+ candidate.destroy();
302
+ const remaining = deadline - Date.now();
303
+ if (remaining <= 0)
304
+ finish(false);
305
+ else
306
+ setTimeout(attempt, Math.min(100, remaining));
307
+ });
308
+ };
309
+ attempt();
293
310
  });
294
311
  }
295
312
 
@@ -300,7 +317,6 @@ var AGENT_UPDATE_JOURNAL = "/var/lib/forgezero/agent-update.json";
300
317
  var AGENT_UPDATE_RECEIPT = "/var/lib/forgezero/agent-update-receipt.json";
301
318
  var MAX_REQUEST_BYTES = 8 * 1024;
302
319
  var COMPUTE_HELPER_UNITS = [
303
- "forgezero-agent-egress.service",
304
320
  "forgezero-deploy-runner.service",
305
321
  "forgezero-lifecycle-helper.service",
306
322
  "forgezero-software-helper.service"
@@ -606,9 +622,9 @@ async function activateAgentRelease(staged, options = {}) {
606
622
  restoreAgentRelease(staged);
607
623
  restored = true;
608
624
  await restartAgent(target, run);
609
- rollbackHealthy = await probe();
610
- if (rollbackHealthy && target === "compute")
625
+ if (target === "compute")
611
626
  switchAgentSocketRoute(paths.route, paths.active);
627
+ rollbackHealthy = await probe();
612
628
  } catch {
613
629
  rollbackHealthy = false;
614
630
  }
@@ -3050,7 +3066,7 @@ function requestSoftware(requirements, socketPath = DEFAULT_SOFTWARE_HELPER_SOCK
3050
3066
  }
3051
3067
 
3052
3068
  // src/version.ts
3053
- var VERSION3 = "0.1.146";
3069
+ var VERSION3 = "0.1.148";
3054
3070
 
3055
3071
  // src/egress-policy.ts
3056
3072
  import { realpathSync as realpathSync3 } from "node:fs";
package/dist/provision.js CHANGED
@@ -264,32 +264,49 @@ function switchAgentSocketRoute(route, backend) {
264
264
  }
265
265
  function probeAgentCandidate(expected, socketPath = DEFAULT_AGENT_CANDIDATE_READY_SOCKET, timeoutMs = 5000) {
266
266
  return new Promise((resolve2) => {
267
- const socket = connect(socketPath);
268
- let buffer = "";
269
267
  let settled = false;
268
+ let socket;
269
+ const deadline = Date.now() + timeoutMs;
270
270
  const finish = (value) => {
271
271
  if (settled)
272
272
  return;
273
273
  settled = true;
274
- clearTimeout(timer);
275
- socket.destroy();
274
+ socket?.destroy();
276
275
  resolve2(value);
277
276
  };
278
- const timer = setTimeout(() => finish(false), timeoutMs);
279
- socket.on("data", (chunk) => {
280
- buffer += chunk.toString("utf8");
281
- const newline = buffer.indexOf(`
282
- `);
283
- if (newline < 0)
284
- return;
285
- try {
286
- const value = JSON.parse(buffer.slice(0, newline));
287
- finish(value.version === expected.version && value.nodeKey === expected.nodeKey && value.bound === expected.bound && expected.vault.includes(value.vault));
288
- } catch {
289
- finish(false);
277
+ const attempt = () => {
278
+ if (settled || Date.now() >= deadline)
279
+ return finish(false);
280
+ if (!existsSync2(socketPath)) {
281
+ const remaining = deadline - Date.now();
282
+ return setTimeout(attempt, Math.min(100, remaining));
290
283
  }
291
- });
292
- socket.on("error", () => finish(false));
284
+ let buffer = "";
285
+ const candidate = connect(socketPath);
286
+ socket = candidate;
287
+ candidate.on("data", (chunk) => {
288
+ buffer += chunk.toString("utf8");
289
+ const newline = buffer.indexOf(`
290
+ `);
291
+ if (newline < 0)
292
+ return;
293
+ try {
294
+ const value = JSON.parse(buffer.slice(0, newline));
295
+ finish(value.version === expected.version && value.nodeKey === expected.nodeKey && value.bound === expected.bound && expected.vault.includes(value.vault));
296
+ } catch {
297
+ finish(false);
298
+ }
299
+ });
300
+ candidate.once("error", () => {
301
+ candidate.destroy();
302
+ const remaining = deadline - Date.now();
303
+ if (remaining <= 0)
304
+ finish(false);
305
+ else
306
+ setTimeout(attempt, Math.min(100, remaining));
307
+ });
308
+ };
309
+ attempt();
293
310
  });
294
311
  }
295
312
 
@@ -300,7 +317,6 @@ var AGENT_UPDATE_JOURNAL = "/var/lib/forgezero/agent-update.json";
300
317
  var AGENT_UPDATE_RECEIPT = "/var/lib/forgezero/agent-update-receipt.json";
301
318
  var MAX_REQUEST_BYTES = 8 * 1024;
302
319
  var COMPUTE_HELPER_UNITS = [
303
- "forgezero-agent-egress.service",
304
320
  "forgezero-deploy-runner.service",
305
321
  "forgezero-lifecycle-helper.service",
306
322
  "forgezero-software-helper.service"
@@ -606,9 +622,9 @@ async function activateAgentRelease(staged, options = {}) {
606
622
  restoreAgentRelease(staged);
607
623
  restored = true;
608
624
  await restartAgent(target, run);
609
- rollbackHealthy = await probe();
610
- if (rollbackHealthy && target === "compute")
625
+ if (target === "compute")
611
626
  switchAgentSocketRoute(paths.route, paths.active);
627
+ rollbackHealthy = await probe();
612
628
  } catch {
613
629
  rollbackHealthy = false;
614
630
  }
@@ -3050,7 +3066,7 @@ function requestSoftware(requirements, socketPath = DEFAULT_SOFTWARE_HELPER_SOCK
3050
3066
  }
3051
3067
 
3052
3068
  // src/version.ts
3053
- var VERSION3 = "0.1.146";
3069
+ var VERSION3 = "0.1.148";
3054
3070
 
3055
3071
  // src/egress-policy.ts
3056
3072
  import { realpathSync as realpathSync3 } from "node:fs";
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  /** One package version shared by both public binaries. Pinned to package.json by tests. */
2
- export declare const VERSION = "0.1.146";
2
+ export declare const VERSION = "0.1.148";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forgezero/agent",
3
- "version": "0.1.146",
3
+ "version": "0.1.148",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "check": "tsc --noEmit",