@forgezero/agent 0.1.95 → 0.1.97

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.
@@ -917,7 +917,7 @@ async function postSignedNode(options, path, body) {
917
917
  }
918
918
 
919
919
  // src/version.ts
920
- var VERSION3 = "0.1.95";
920
+ var VERSION3 = "0.1.97";
921
921
 
922
922
  // src/agent-heartbeat.ts
923
923
  function readAgentHostMetrics() {
package/dist/bootstrap.js CHANGED
@@ -1420,7 +1420,7 @@ var UPDATE_RETRY_BASE_MS = 5 * 60000;
1420
1420
  var UPDATE_RETRY_MAX_MS = 24 * 60 * 60000;
1421
1421
 
1422
1422
  // src/version.ts
1423
- var VERSION = "0.1.95";
1423
+ var VERSION = "0.1.97";
1424
1424
 
1425
1425
  // src/software.ts
1426
1426
  var PINNED_BUN_VERSION = "1.3.14";
@@ -3090,7 +3090,7 @@ var httpsOrigin = (name, raw) => {
3090
3090
  };
3091
3091
  var agentTelemetryOrigin = (raw) => raw === "http://127.0.0.1:4318" ? raw : httpsOrigin("agentOtlpEndpoint", raw);
3092
3092
  function validatePlatformInitialInventory(value) {
3093
- if (!value || typeof value !== "object" || Array.isArray(value) || Object.keys(value).some((key) => !["metalHostname", "region", "computes", "deployment"].includes(key)) || !/^[A-Za-z0-9][A-Za-z0-9.-]{1,252}$/.test(value.metalHostname) || !value.region || typeof value.region !== "object" || Array.isArray(value.region) || Object.keys(value.region).some((key) => !["key", "label", "country", "city", "confidentialCapable"].includes(key)) || !/^[a-z0-9][a-z0-9-]{0,62}$/.test(value.region.key) || !/^[A-Z]{2}$/.test(value.region.country) || value.region.confidentialCapable !== true || !Array.isArray(value.computes)) {
3093
+ if (!value || typeof value !== "object" || Array.isArray(value) || Object.keys(value).some((key) => !["metalHostname", "region", "computes", "attestation", "deployment"].includes(key)) || !/^[A-Za-z0-9][A-Za-z0-9.-]{1,252}$/.test(value.metalHostname) || !value.region || typeof value.region !== "object" || Array.isArray(value.region) || Object.keys(value.region).some((key) => !["key", "label", "country", "city", "confidentialCapable"].includes(key)) || !/^[a-z0-9][a-z0-9-]{0,62}$/.test(value.region.key) || !/^[A-Z]{2}$/.test(value.region.country) || value.region.confidentialCapable !== true || !Array.isArray(value.computes)) {
3094
3094
  throw new Error("initial platform inventory coordinates are invalid");
3095
3095
  }
3096
3096
  safeAtom("initialInventory.region.label", value.region.label);
@@ -3098,6 +3098,8 @@ function validatePlatformInitialInventory(value) {
3098
3098
  safeAtom("initialInventory.region.city", value.region.city);
3099
3099
  if (value.deployment !== undefined && (!value.deployment || typeof value.deployment !== "object" || Array.isArray(value.deployment) || Object.keys(value.deployment).some((key) => !["source", "branch", "revision", "bundleSha256"].includes(key)) || value.deployment.source !== "bootstrap-bundle" || !["dev", "main"].includes(value.deployment.branch) || !/^[a-f0-9]{40}$/.test(value.deployment.revision) || !/^[a-f0-9]{64}$/.test(value.deployment.bundleSha256)))
3100
3100
  throw new Error("initial platform deployment evidence is invalid");
3101
+ if (value.attestation !== undefined && (!value.attestation || typeof value.attestation !== "object" || Array.isArray(value.attestation) || Object.keys(value.attestation).some((key) => !["measurement", "tcbFloor"].includes(key)) || !/^[a-f0-9]{96}$/.test(value.attestation.measurement) || !value.attestation.tcbFloor || typeof value.attestation.tcbFloor !== "object" || Array.isArray(value.attestation.tcbFloor) || Object.keys(value.attestation.tcbFloor).some((key) => !["bootLoader", "tee", "snp", "microcode"].includes(key)) || Object.values(value.attestation.tcbFloor).some((component) => !Number.isSafeInteger(component) || component < 0 || component > 255)))
3102
+ throw new Error("initial platform attestation evidence is invalid");
3101
3103
  const computes = validatePlatformGenesisGuests(value.computes.map((compute) => {
3102
3104
  if (!compute || typeof compute !== "object" || Array.isArray(compute) || Object.keys(compute).some((key) => ![
3103
3105
  "name",
@@ -3133,6 +3135,9 @@ function validatePlatformInitialInventory(value) {
3133
3135
  databaseAgency: compute.databaseAgency,
3134
3136
  confidential: true
3135
3137
  })),
3138
+ ...value.attestation ? {
3139
+ attestation: { measurement: value.attestation.measurement, tcbFloor: { ...value.attestation.tcbFloor } }
3140
+ } : {},
3136
3141
  ...value.deployment ? { deployment: { ...value.deployment } } : {}
3137
3142
  };
3138
3143
  }
@@ -5108,7 +5113,7 @@ function planBootstrapAgentInstall(config, phase, context) {
5108
5113
  lifecycleProfilePath: bound && config.kind === "platform" ? LIFECYCLE_PROFILE : undefined,
5109
5114
  enforceEgress: true,
5110
5115
  runnerLoopbackPorts: config.kind === "platform" ? [config.runtime.environment.publicApiPort, config.runtime.bluePort, config.runtime.greenPort] : [],
5111
- agentLoopbackPorts: config.kind === "platform" ? [config.runtime.environment.publicApiPort] : [],
5116
+ agentLoopbackPorts: config.kind === "platform" ? [config.runtime.environment.publicApiPort, 4318] : [4318],
5112
5117
  nodeHostname: config.nodeHostname,
5113
5118
  telemetryEndpoint: config.kind === "platform" ? config.runtime.environment.otlpEndpoint : "http://127.0.0.1:4318",
5114
5119
  binPath: "/usr/local/lib/forgezero/agent/fz-agent",
package/dist/fz-agent.js CHANGED
@@ -9496,7 +9496,7 @@ async function writeAndCloseProcessInput(input, value) {
9496
9496
  }
9497
9497
 
9498
9498
  // src/version.ts
9499
- var VERSION2 = "0.1.95";
9499
+ var VERSION2 = "0.1.97";
9500
9500
 
9501
9501
  // src/ssh-bootstrap.ts
9502
9502
  class SshBootstrapError extends Error {
@@ -16710,7 +16710,7 @@ function planBootstrapAgentInstall(config, phase, context) {
16710
16710
  lifecycleProfilePath: bound && config.kind === "platform" ? LIFECYCLE_PROFILE : undefined,
16711
16711
  enforceEgress: true,
16712
16712
  runnerLoopbackPorts: config.kind === "platform" ? [config.runtime.environment.publicApiPort, config.runtime.bluePort, config.runtime.greenPort] : [],
16713
- agentLoopbackPorts: config.kind === "platform" ? [config.runtime.environment.publicApiPort] : [],
16713
+ agentLoopbackPorts: config.kind === "platform" ? [config.runtime.environment.publicApiPort, 4318] : [4318],
16714
16714
  nodeHostname: config.nodeHostname,
16715
16715
  telemetryEndpoint: config.kind === "platform" ? config.runtime.environment.otlpEndpoint : "http://127.0.0.1:4318",
16716
16716
  binPath: "/usr/local/lib/forgezero/agent/fz-agent",
package/dist/fz.js CHANGED
@@ -4841,7 +4841,7 @@ var UPDATE_RETRY_BASE_MS = 5 * 60000;
4841
4841
  var UPDATE_RETRY_MAX_MS = 24 * 60 * 60000;
4842
4842
 
4843
4843
  // src/version.ts
4844
- var VERSION2 = "0.1.95";
4844
+ var VERSION2 = "0.1.97";
4845
4845
 
4846
4846
  // src/software.ts
4847
4847
  var PINNED_BUN_VERSION = "1.3.14";
@@ -12239,7 +12239,7 @@ var httpsOrigin = (name, raw) => {
12239
12239
  };
12240
12240
  var agentTelemetryOrigin = (raw) => raw === "http://127.0.0.1:4318" ? raw : httpsOrigin("agentOtlpEndpoint", raw);
12241
12241
  function validatePlatformInitialInventory(value) {
12242
- if (!value || typeof value !== "object" || Array.isArray(value) || Object.keys(value).some((key) => !["metalHostname", "region", "computes", "deployment"].includes(key)) || !/^[A-Za-z0-9][A-Za-z0-9.-]{1,252}$/.test(value.metalHostname) || !value.region || typeof value.region !== "object" || Array.isArray(value.region) || Object.keys(value.region).some((key) => !["key", "label", "country", "city", "confidentialCapable"].includes(key)) || !/^[a-z0-9][a-z0-9-]{0,62}$/.test(value.region.key) || !/^[A-Z]{2}$/.test(value.region.country) || value.region.confidentialCapable !== true || !Array.isArray(value.computes)) {
12242
+ if (!value || typeof value !== "object" || Array.isArray(value) || Object.keys(value).some((key) => !["metalHostname", "region", "computes", "attestation", "deployment"].includes(key)) || !/^[A-Za-z0-9][A-Za-z0-9.-]{1,252}$/.test(value.metalHostname) || !value.region || typeof value.region !== "object" || Array.isArray(value.region) || Object.keys(value.region).some((key) => !["key", "label", "country", "city", "confidentialCapable"].includes(key)) || !/^[a-z0-9][a-z0-9-]{0,62}$/.test(value.region.key) || !/^[A-Z]{2}$/.test(value.region.country) || value.region.confidentialCapable !== true || !Array.isArray(value.computes)) {
12243
12243
  throw new Error("initial platform inventory coordinates are invalid");
12244
12244
  }
12245
12245
  safeAtom("initialInventory.region.label", value.region.label);
@@ -12247,6 +12247,8 @@ function validatePlatformInitialInventory(value) {
12247
12247
  safeAtom("initialInventory.region.city", value.region.city);
12248
12248
  if (value.deployment !== undefined && (!value.deployment || typeof value.deployment !== "object" || Array.isArray(value.deployment) || Object.keys(value.deployment).some((key) => !["source", "branch", "revision", "bundleSha256"].includes(key)) || value.deployment.source !== "bootstrap-bundle" || !["dev", "main"].includes(value.deployment.branch) || !/^[a-f0-9]{40}$/.test(value.deployment.revision) || !/^[a-f0-9]{64}$/.test(value.deployment.bundleSha256)))
12249
12249
  throw new Error("initial platform deployment evidence is invalid");
12250
+ if (value.attestation !== undefined && (!value.attestation || typeof value.attestation !== "object" || Array.isArray(value.attestation) || Object.keys(value.attestation).some((key) => !["measurement", "tcbFloor"].includes(key)) || !/^[a-f0-9]{96}$/.test(value.attestation.measurement) || !value.attestation.tcbFloor || typeof value.attestation.tcbFloor !== "object" || Array.isArray(value.attestation.tcbFloor) || Object.keys(value.attestation.tcbFloor).some((key) => !["bootLoader", "tee", "snp", "microcode"].includes(key)) || Object.values(value.attestation.tcbFloor).some((component2) => !Number.isSafeInteger(component2) || component2 < 0 || component2 > 255)))
12251
+ throw new Error("initial platform attestation evidence is invalid");
12250
12252
  const computes = validatePlatformGenesisGuests(value.computes.map((compute) => {
12251
12253
  if (!compute || typeof compute !== "object" || Array.isArray(compute) || Object.keys(compute).some((key) => ![
12252
12254
  "name",
@@ -12282,6 +12284,9 @@ function validatePlatformInitialInventory(value) {
12282
12284
  databaseAgency: compute.databaseAgency,
12283
12285
  confidential: true
12284
12286
  })),
12287
+ ...value.attestation ? {
12288
+ attestation: { measurement: value.attestation.measurement, tcbFloor: { ...value.attestation.tcbFloor } }
12289
+ } : {},
12285
12290
  ...value.deployment ? { deployment: { ...value.deployment } } : {}
12286
12291
  };
12287
12292
  }
@@ -15493,7 +15498,7 @@ function planBootstrapAgentInstall(config, phase, context) {
15493
15498
  lifecycleProfilePath: bound && config.kind === "platform" ? LIFECYCLE_PROFILE : undefined,
15494
15499
  enforceEgress: true,
15495
15500
  runnerLoopbackPorts: config.kind === "platform" ? [config.runtime.environment.publicApiPort, config.runtime.bluePort, config.runtime.greenPort] : [],
15496
- agentLoopbackPorts: config.kind === "platform" ? [config.runtime.environment.publicApiPort] : [],
15501
+ agentLoopbackPorts: config.kind === "platform" ? [config.runtime.environment.publicApiPort, 4318] : [4318],
15497
15502
  nodeHostname: config.nodeHostname,
15498
15503
  telemetryEndpoint: config.kind === "platform" ? config.runtime.environment.otlpEndpoint : "http://127.0.0.1:4318",
15499
15504
  binPath: "/usr/local/lib/forgezero/agent/fz-agent",
@@ -17856,7 +17861,7 @@ async function applyAttendedPlatformBootstrap(fleetRequest, cloudflareRequest, a
17856
17861
  }
17857
17862
 
17858
17863
  // src/platform-genesis-config.ts
17859
- function platformGenesisBootstrapConfigs(template, guests, nodes, metalHostname, region, deployment) {
17864
+ function platformGenesisBootstrapConfigs(template, guests, nodes, metalHostname, region, deployment, attestation) {
17860
17865
  const fleet = validatePlatformGenesisGuests(guests);
17861
17866
  if (!/^[A-Za-z0-9][A-Za-z0-9.-]{1,252}$/.test(metalHostname)) {
17862
17867
  throw new Error("platform genesis requires the reviewed metal hostname");
@@ -17885,6 +17890,7 @@ function platformGenesisBootstrapConfigs(template, guests, nodes, metalHostname,
17885
17890
  databaseRole: index === 0 ? "master" : "joiner",
17886
17891
  databaseAgency: "member"
17887
17892
  })),
17893
+ ...attestation ? { attestation } : {},
17888
17894
  ...deployment ? { deployment } : {}
17889
17895
  };
17890
17896
  return fleet.map((guest, index) => {
@@ -17940,7 +17946,11 @@ var PROFILES = {
17940
17946
  seedSyncEpoch: "development-23c19168773d69ea",
17941
17947
  collectorExport: LOCAL_DEBUG_OTEL_EXPORT,
17942
17948
  agentOtlpEndpoint: "http://127.0.0.1:4318",
17943
- privateCidrs: ["10.42.0.0/24"]
17949
+ privateCidrs: ["10.42.0.0/24"],
17950
+ attestation: {
17951
+ measurement: "2d4e66719b19f00c13560e286b1e32ab724ee35d5422473fb183b7dc48a425a9afea74e6625e26911eefbbfbda59b55e",
17952
+ tcbFloor: { bootLoader: 4, tee: 0, snp: 29, microcode: 222 }
17953
+ }
17944
17954
  },
17945
17955
  production: {
17946
17956
  environment: "production",
@@ -19510,7 +19520,7 @@ function writePlatformGenesisFleet(directory, preset) {
19510
19520
  branch: preset.profile.branch,
19511
19521
  revision: preset.bundle.manifest.revision,
19512
19522
  bundleSha256: preset.bundle.manifest.sha256
19513
- } : undefined).map((config) => {
19523
+ } : undefined, preset?.profile.attestation).map((config) => {
19514
19524
  const path = `${output}/${config.computeReference}-platform.json`;
19515
19525
  if (preset)
19516
19526
  writeDerivedLaunchFile(path, (temporary) => writeBootstrapConfig(temporary, config));
@@ -366,7 +366,7 @@ function systemdAgentEgressDirectives(loopbackTcpPorts = []) {
366
366
  }
367
367
 
368
368
  // src/version.ts
369
- var VERSION = "0.1.95";
369
+ var VERSION = "0.1.97";
370
370
 
371
371
  // src/otel-collector.ts
372
372
  var FORGEZERO_OTEL_COLLECTOR_UNIT = "forgezero-otel-collector.service";
@@ -1420,7 +1420,7 @@ var UPDATE_RETRY_BASE_MS = 5 * 60000;
1420
1420
  var UPDATE_RETRY_MAX_MS = 24 * 60 * 60000;
1421
1421
 
1422
1422
  // src/version.ts
1423
- var VERSION = "0.1.95";
1423
+ var VERSION = "0.1.97";
1424
1424
 
1425
1425
  // src/software.ts
1426
1426
  var PINNED_BUN_VERSION = "1.3.14";
@@ -3090,7 +3090,7 @@ var httpsOrigin = (name, raw) => {
3090
3090
  };
3091
3091
  var agentTelemetryOrigin = (raw) => raw === "http://127.0.0.1:4318" ? raw : httpsOrigin("agentOtlpEndpoint", raw);
3092
3092
  function validatePlatformInitialInventory(value) {
3093
- if (!value || typeof value !== "object" || Array.isArray(value) || Object.keys(value).some((key) => !["metalHostname", "region", "computes", "deployment"].includes(key)) || !/^[A-Za-z0-9][A-Za-z0-9.-]{1,252}$/.test(value.metalHostname) || !value.region || typeof value.region !== "object" || Array.isArray(value.region) || Object.keys(value.region).some((key) => !["key", "label", "country", "city", "confidentialCapable"].includes(key)) || !/^[a-z0-9][a-z0-9-]{0,62}$/.test(value.region.key) || !/^[A-Z]{2}$/.test(value.region.country) || value.region.confidentialCapable !== true || !Array.isArray(value.computes)) {
3093
+ if (!value || typeof value !== "object" || Array.isArray(value) || Object.keys(value).some((key) => !["metalHostname", "region", "computes", "attestation", "deployment"].includes(key)) || !/^[A-Za-z0-9][A-Za-z0-9.-]{1,252}$/.test(value.metalHostname) || !value.region || typeof value.region !== "object" || Array.isArray(value.region) || Object.keys(value.region).some((key) => !["key", "label", "country", "city", "confidentialCapable"].includes(key)) || !/^[a-z0-9][a-z0-9-]{0,62}$/.test(value.region.key) || !/^[A-Z]{2}$/.test(value.region.country) || value.region.confidentialCapable !== true || !Array.isArray(value.computes)) {
3094
3094
  throw new Error("initial platform inventory coordinates are invalid");
3095
3095
  }
3096
3096
  safeAtom("initialInventory.region.label", value.region.label);
@@ -3098,6 +3098,8 @@ function validatePlatformInitialInventory(value) {
3098
3098
  safeAtom("initialInventory.region.city", value.region.city);
3099
3099
  if (value.deployment !== undefined && (!value.deployment || typeof value.deployment !== "object" || Array.isArray(value.deployment) || Object.keys(value.deployment).some((key) => !["source", "branch", "revision", "bundleSha256"].includes(key)) || value.deployment.source !== "bootstrap-bundle" || !["dev", "main"].includes(value.deployment.branch) || !/^[a-f0-9]{40}$/.test(value.deployment.revision) || !/^[a-f0-9]{64}$/.test(value.deployment.bundleSha256)))
3100
3100
  throw new Error("initial platform deployment evidence is invalid");
3101
+ if (value.attestation !== undefined && (!value.attestation || typeof value.attestation !== "object" || Array.isArray(value.attestation) || Object.keys(value.attestation).some((key) => !["measurement", "tcbFloor"].includes(key)) || !/^[a-f0-9]{96}$/.test(value.attestation.measurement) || !value.attestation.tcbFloor || typeof value.attestation.tcbFloor !== "object" || Array.isArray(value.attestation.tcbFloor) || Object.keys(value.attestation.tcbFloor).some((key) => !["bootLoader", "tee", "snp", "microcode"].includes(key)) || Object.values(value.attestation.tcbFloor).some((component) => !Number.isSafeInteger(component) || component < 0 || component > 255)))
3102
+ throw new Error("initial platform attestation evidence is invalid");
3101
3103
  const computes = validatePlatformGenesisGuests(value.computes.map((compute) => {
3102
3104
  if (!compute || typeof compute !== "object" || Array.isArray(compute) || Object.keys(compute).some((key) => ![
3103
3105
  "name",
@@ -3133,6 +3135,9 @@ function validatePlatformInitialInventory(value) {
3133
3135
  databaseAgency: compute.databaseAgency,
3134
3136
  confidential: true
3135
3137
  })),
3138
+ ...value.attestation ? {
3139
+ attestation: { measurement: value.attestation.measurement, tcbFloor: { ...value.attestation.tcbFloor } }
3140
+ } : {},
3136
3141
  ...value.deployment ? { deployment: { ...value.deployment } } : {}
3137
3142
  };
3138
3143
  }
@@ -5108,7 +5113,7 @@ function planBootstrapAgentInstall(config, phase, context) {
5108
5113
  lifecycleProfilePath: bound && config.kind === "platform" ? LIFECYCLE_PROFILE : undefined,
5109
5114
  enforceEgress: true,
5110
5115
  runnerLoopbackPorts: config.kind === "platform" ? [config.runtime.environment.publicApiPort, config.runtime.bluePort, config.runtime.greenPort] : [],
5111
- agentLoopbackPorts: config.kind === "platform" ? [config.runtime.environment.publicApiPort] : [],
5116
+ agentLoopbackPorts: config.kind === "platform" ? [config.runtime.environment.publicApiPort, 4318] : [4318],
5112
5117
  nodeHostname: config.nodeHostname,
5113
5118
  telemetryEndpoint: config.kind === "platform" ? config.runtime.environment.otlpEndpoint : "http://127.0.0.1:4318",
5114
5119
  binPath: "/usr/local/lib/forgezero/agent/fz-agent",
@@ -31,6 +31,16 @@ export interface PlatformInitialInventory {
31
31
  PlatformInitialInventoryCompute,
32
32
  PlatformInitialInventoryCompute
33
33
  ];
34
+ /** Reviewed evidence for the exact confidential image used by this fleet. */
35
+ attestation?: {
36
+ measurement: string;
37
+ tcbFloor: {
38
+ bootLoader: number;
39
+ tee: number;
40
+ snp: number;
41
+ microcode: number;
42
+ };
43
+ };
34
44
  /** Generation-one release evidence; external Git automation is connected after custody opens Vault. */
35
45
  deployment?: {
36
46
  source: 'bootstrap-bundle';
@@ -730,7 +730,7 @@ var httpsOrigin = (name, raw) => {
730
730
  };
731
731
  var agentTelemetryOrigin = (raw) => raw === "http://127.0.0.1:4318" ? raw : httpsOrigin("agentOtlpEndpoint", raw);
732
732
  function validatePlatformInitialInventory(value) {
733
- if (!value || typeof value !== "object" || Array.isArray(value) || Object.keys(value).some((key) => !["metalHostname", "region", "computes", "deployment"].includes(key)) || !/^[A-Za-z0-9][A-Za-z0-9.-]{1,252}$/.test(value.metalHostname) || !value.region || typeof value.region !== "object" || Array.isArray(value.region) || Object.keys(value.region).some((key) => !["key", "label", "country", "city", "confidentialCapable"].includes(key)) || !/^[a-z0-9][a-z0-9-]{0,62}$/.test(value.region.key) || !/^[A-Z]{2}$/.test(value.region.country) || value.region.confidentialCapable !== true || !Array.isArray(value.computes)) {
733
+ if (!value || typeof value !== "object" || Array.isArray(value) || Object.keys(value).some((key) => !["metalHostname", "region", "computes", "attestation", "deployment"].includes(key)) || !/^[A-Za-z0-9][A-Za-z0-9.-]{1,252}$/.test(value.metalHostname) || !value.region || typeof value.region !== "object" || Array.isArray(value.region) || Object.keys(value.region).some((key) => !["key", "label", "country", "city", "confidentialCapable"].includes(key)) || !/^[a-z0-9][a-z0-9-]{0,62}$/.test(value.region.key) || !/^[A-Z]{2}$/.test(value.region.country) || value.region.confidentialCapable !== true || !Array.isArray(value.computes)) {
734
734
  throw new Error("initial platform inventory coordinates are invalid");
735
735
  }
736
736
  safeAtom("initialInventory.region.label", value.region.label);
@@ -738,6 +738,8 @@ function validatePlatformInitialInventory(value) {
738
738
  safeAtom("initialInventory.region.city", value.region.city);
739
739
  if (value.deployment !== undefined && (!value.deployment || typeof value.deployment !== "object" || Array.isArray(value.deployment) || Object.keys(value.deployment).some((key) => !["source", "branch", "revision", "bundleSha256"].includes(key)) || value.deployment.source !== "bootstrap-bundle" || !["dev", "main"].includes(value.deployment.branch) || !/^[a-f0-9]{40}$/.test(value.deployment.revision) || !/^[a-f0-9]{64}$/.test(value.deployment.bundleSha256)))
740
740
  throw new Error("initial platform deployment evidence is invalid");
741
+ if (value.attestation !== undefined && (!value.attestation || typeof value.attestation !== "object" || Array.isArray(value.attestation) || Object.keys(value.attestation).some((key) => !["measurement", "tcbFloor"].includes(key)) || !/^[a-f0-9]{96}$/.test(value.attestation.measurement) || !value.attestation.tcbFloor || typeof value.attestation.tcbFloor !== "object" || Array.isArray(value.attestation.tcbFloor) || Object.keys(value.attestation.tcbFloor).some((key) => !["bootLoader", "tee", "snp", "microcode"].includes(key)) || Object.values(value.attestation.tcbFloor).some((component) => !Number.isSafeInteger(component) || component < 0 || component > 255)))
742
+ throw new Error("initial platform attestation evidence is invalid");
741
743
  const computes = validatePlatformGenesisGuests(value.computes.map((compute) => {
742
744
  if (!compute || typeof compute !== "object" || Array.isArray(compute) || Object.keys(compute).some((key) => ![
743
745
  "name",
@@ -773,6 +775,9 @@ function validatePlatformInitialInventory(value) {
773
775
  databaseAgency: compute.databaseAgency,
774
776
  confidential: true
775
777
  })),
778
+ ...value.attestation ? {
779
+ attestation: { measurement: value.attestation.measurement, tcbFloor: { ...value.attestation.tcbFloor } }
780
+ } : {},
776
781
  ...value.deployment ? { deployment: { ...value.deployment } } : {}
777
782
  };
778
783
  }
@@ -2908,7 +2908,7 @@ function requestSoftware(requirements, socketPath = DEFAULT_SOFTWARE_HELPER_SOCK
2908
2908
  }
2909
2909
 
2910
2910
  // src/version.ts
2911
- var VERSION3 = "0.1.95";
2911
+ var VERSION3 = "0.1.97";
2912
2912
 
2913
2913
  // src/egress-policy.ts
2914
2914
  import { realpathSync as realpathSync3 } from "node:fs";
@@ -4142,7 +4142,7 @@ var httpsOrigin = (name, raw) => {
4142
4142
  };
4143
4143
  var agentTelemetryOrigin = (raw) => raw === "http://127.0.0.1:4318" ? raw : httpsOrigin("agentOtlpEndpoint", raw);
4144
4144
  function validatePlatformInitialInventory(value) {
4145
- if (!value || typeof value !== "object" || Array.isArray(value) || Object.keys(value).some((key) => !["metalHostname", "region", "computes", "deployment"].includes(key)) || !/^[A-Za-z0-9][A-Za-z0-9.-]{1,252}$/.test(value.metalHostname) || !value.region || typeof value.region !== "object" || Array.isArray(value.region) || Object.keys(value.region).some((key) => !["key", "label", "country", "city", "confidentialCapable"].includes(key)) || !/^[a-z0-9][a-z0-9-]{0,62}$/.test(value.region.key) || !/^[A-Z]{2}$/.test(value.region.country) || value.region.confidentialCapable !== true || !Array.isArray(value.computes)) {
4145
+ if (!value || typeof value !== "object" || Array.isArray(value) || Object.keys(value).some((key) => !["metalHostname", "region", "computes", "attestation", "deployment"].includes(key)) || !/^[A-Za-z0-9][A-Za-z0-9.-]{1,252}$/.test(value.metalHostname) || !value.region || typeof value.region !== "object" || Array.isArray(value.region) || Object.keys(value.region).some((key) => !["key", "label", "country", "city", "confidentialCapable"].includes(key)) || !/^[a-z0-9][a-z0-9-]{0,62}$/.test(value.region.key) || !/^[A-Z]{2}$/.test(value.region.country) || value.region.confidentialCapable !== true || !Array.isArray(value.computes)) {
4146
4146
  throw new Error("initial platform inventory coordinates are invalid");
4147
4147
  }
4148
4148
  safeAtom("initialInventory.region.label", value.region.label);
@@ -4150,6 +4150,8 @@ function validatePlatformInitialInventory(value) {
4150
4150
  safeAtom("initialInventory.region.city", value.region.city);
4151
4151
  if (value.deployment !== undefined && (!value.deployment || typeof value.deployment !== "object" || Array.isArray(value.deployment) || Object.keys(value.deployment).some((key) => !["source", "branch", "revision", "bundleSha256"].includes(key)) || value.deployment.source !== "bootstrap-bundle" || !["dev", "main"].includes(value.deployment.branch) || !/^[a-f0-9]{40}$/.test(value.deployment.revision) || !/^[a-f0-9]{64}$/.test(value.deployment.bundleSha256)))
4152
4152
  throw new Error("initial platform deployment evidence is invalid");
4153
+ if (value.attestation !== undefined && (!value.attestation || typeof value.attestation !== "object" || Array.isArray(value.attestation) || Object.keys(value.attestation).some((key) => !["measurement", "tcbFloor"].includes(key)) || !/^[a-f0-9]{96}$/.test(value.attestation.measurement) || !value.attestation.tcbFloor || typeof value.attestation.tcbFloor !== "object" || Array.isArray(value.attestation.tcbFloor) || Object.keys(value.attestation.tcbFloor).some((key) => !["bootLoader", "tee", "snp", "microcode"].includes(key)) || Object.values(value.attestation.tcbFloor).some((component) => !Number.isSafeInteger(component) || component < 0 || component > 255)))
4154
+ throw new Error("initial platform attestation evidence is invalid");
4153
4155
  const computes = validatePlatformGenesisGuests(value.computes.map((compute) => {
4154
4156
  if (!compute || typeof compute !== "object" || Array.isArray(compute) || Object.keys(compute).some((key) => ![
4155
4157
  "name",
@@ -4185,6 +4187,9 @@ function validatePlatformInitialInventory(value) {
4185
4187
  databaseAgency: compute.databaseAgency,
4186
4188
  confidential: true
4187
4189
  })),
4190
+ ...value.attestation ? {
4191
+ attestation: { measurement: value.attestation.measurement, tcbFloor: { ...value.attestation.tcbFloor } }
4192
+ } : {},
4188
4193
  ...value.deployment ? { deployment: { ...value.deployment } } : {}
4189
4194
  };
4190
4195
  }
@@ -5353,7 +5358,7 @@ function planBootstrapAgentInstall(config, phase, context) {
5353
5358
  lifecycleProfilePath: bound && config.kind === "platform" ? LIFECYCLE_PROFILE : undefined,
5354
5359
  enforceEgress: true,
5355
5360
  runnerLoopbackPorts: config.kind === "platform" ? [config.runtime.environment.publicApiPort, config.runtime.bluePort, config.runtime.greenPort] : [],
5356
- agentLoopbackPorts: config.kind === "platform" ? [config.runtime.environment.publicApiPort] : [],
5361
+ agentLoopbackPorts: config.kind === "platform" ? [config.runtime.environment.publicApiPort, 4318] : [4318],
5357
5362
  nodeHostname: config.nodeHostname,
5358
5363
  telemetryEndpoint: config.kind === "platform" ? config.runtime.environment.otlpEndpoint : "http://127.0.0.1:4318",
5359
5364
  binPath: "/usr/local/lib/forgezero/agent/fz-agent",
@@ -15,4 +15,4 @@ export declare function platformGenesisBootstrapConfigs(template: PlatformBootst
15
15
  branch: 'dev' | 'main';
16
16
  revision: string;
17
17
  bundleSha256: string;
18
- }): readonly PlatformBootstrapConfig[];
18
+ }, attestation?: import('./platform-bootstrap-runtime').PlatformInitialInventory['attestation']): readonly PlatformBootstrapConfig[];
@@ -20,6 +20,16 @@ export interface ForgeZeroLaunchProfile {
20
20
  agentOtlpEndpoint: string;
21
21
  seedSyncEpoch: string;
22
22
  privateCidrs: readonly string[];
23
+ /** Owner-observed, AMD-verified evidence for this exact reviewed launch image. */
24
+ attestation?: {
25
+ measurement: string;
26
+ tcbFloor: {
27
+ bootLoader: number;
28
+ tee: number;
29
+ snp: number;
30
+ microcode: number;
31
+ };
32
+ };
23
33
  nodeHostname(nodeIndex: number): string;
24
34
  }
25
35
  export interface ForgeZeroLaunchOwnerInput {
package/dist/provision.js CHANGED
@@ -2908,7 +2908,7 @@ function requestSoftware(requirements, socketPath = DEFAULT_SOFTWARE_HELPER_SOCK
2908
2908
  }
2909
2909
 
2910
2910
  // src/version.ts
2911
- var VERSION3 = "0.1.95";
2911
+ var VERSION3 = "0.1.97";
2912
2912
 
2913
2913
  // src/egress-policy.ts
2914
2914
  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.95";
2
+ export declare const VERSION = "0.1.97";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forgezero/agent",
3
- "version": "0.1.95",
3
+ "version": "0.1.97",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "check": "tsc --noEmit",