@dsh-enhanced/plugin-control-plane 0.1.47 → 0.1.49

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 (167) hide show
  1. package/README.md +183 -15
  2. package/bin/dsh-live-qualification-authority.js +15 -0
  3. package/bin/dsh-local-release-adapter.js +328 -8
  4. package/bin/dsh-systemd-host-attestor.js +359 -9
  5. package/bin/dsh-systemd-host-authority.js +12 -0
  6. package/lib/adoption-coordinator.d.ts +3 -1
  7. package/lib/adoption-coordinator.d.ts.map +1 -1
  8. package/lib/adoption-coordinator.js +24 -9
  9. package/lib/adoption-coordinator.js.map +1 -1
  10. package/lib/cli.d.ts.map +1 -1
  11. package/lib/cli.js +33 -14
  12. package/lib/cli.js.map +1 -1
  13. package/lib/creation-capability-feedback.d.ts +23 -0
  14. package/lib/creation-capability-feedback.d.ts.map +1 -0
  15. package/lib/creation-capability-feedback.js +132 -0
  16. package/lib/creation-capability-feedback.js.map +1 -0
  17. package/lib/creation-capability-journal.d.ts +66 -0
  18. package/lib/creation-capability-journal.d.ts.map +1 -0
  19. package/lib/creation-capability-journal.js +751 -0
  20. package/lib/creation-capability-journal.js.map +1 -0
  21. package/lib/creation-capability-runtime.d.ts +63 -0
  22. package/lib/creation-capability-runtime.d.ts.map +1 -0
  23. package/lib/creation-capability-runtime.js +564 -0
  24. package/lib/creation-capability-runtime.js.map +1 -0
  25. package/lib/creation-capability-source.d.ts +37 -0
  26. package/lib/creation-capability-source.d.ts.map +1 -0
  27. package/lib/creation-capability-source.js +328 -0
  28. package/lib/creation-capability-source.js.map +1 -0
  29. package/lib/creation-capability-types.d.ts +252 -0
  30. package/lib/creation-capability-types.d.ts.map +1 -0
  31. package/lib/creation-capability-types.js +2 -0
  32. package/lib/creation-capability-types.js.map +1 -0
  33. package/lib/deployment-readiness.d.ts +16 -0
  34. package/lib/deployment-readiness.d.ts.map +1 -1
  35. package/lib/deployment-readiness.js +48 -1
  36. package/lib/deployment-readiness.js.map +1 -1
  37. package/lib/effect-blocked-replay.js +2 -2
  38. package/lib/effect-blocked-replay.js.map +1 -1
  39. package/lib/foreground-deployment-runtime.d.ts +3 -0
  40. package/lib/foreground-deployment-runtime.d.ts.map +1 -1
  41. package/lib/foreground-deployment-runtime.js +55 -13
  42. package/lib/foreground-deployment-runtime.js.map +1 -1
  43. package/lib/foreground-deployment.d.ts.map +1 -1
  44. package/lib/foreground-deployment.js +5 -0
  45. package/lib/foreground-deployment.js.map +1 -1
  46. package/lib/host-attestor.d.ts +2 -0
  47. package/lib/host-attestor.d.ts.map +1 -1
  48. package/lib/host-attestor.js +8 -1
  49. package/lib/host-attestor.js.map +1 -1
  50. package/lib/host-inputs.d.ts +13 -0
  51. package/lib/host-inputs.d.ts.map +1 -0
  52. package/lib/host-inputs.js +162 -0
  53. package/lib/host-inputs.js.map +1 -0
  54. package/lib/host-maintenance.d.ts +61 -0
  55. package/lib/host-maintenance.d.ts.map +1 -0
  56. package/lib/host-maintenance.js +158 -0
  57. package/lib/host-maintenance.js.map +1 -0
  58. package/lib/host-readiness.d.ts +5 -0
  59. package/lib/host-readiness.d.ts.map +1 -0
  60. package/lib/host-readiness.js +22 -0
  61. package/lib/host-readiness.js.map +1 -0
  62. package/lib/index.d.ts +16 -0
  63. package/lib/index.d.ts.map +1 -1
  64. package/lib/index.js +7 -0
  65. package/lib/index.js.map +1 -1
  66. package/lib/live-qualification-authority.d.ts +32 -0
  67. package/lib/live-qualification-authority.d.ts.map +1 -0
  68. package/lib/live-qualification-authority.js +280 -0
  69. package/lib/live-qualification-authority.js.map +1 -0
  70. package/lib/live-qualification-client.d.ts +4 -0
  71. package/lib/live-qualification-client.d.ts.map +1 -0
  72. package/lib/live-qualification-client.js +22 -0
  73. package/lib/live-qualification-client.js.map +1 -0
  74. package/lib/live-qualification-runtime.d.ts +78 -0
  75. package/lib/live-qualification-runtime.d.ts.map +1 -0
  76. package/lib/live-qualification-runtime.js +367 -0
  77. package/lib/live-qualification-runtime.js.map +1 -0
  78. package/lib/live-qualification.d.ts +73 -0
  79. package/lib/live-qualification.d.ts.map +1 -0
  80. package/lib/live-qualification.js +164 -0
  81. package/lib/live-qualification.js.map +1 -0
  82. package/lib/owner-task-gaps.d.ts +2 -0
  83. package/lib/owner-task-gaps.d.ts.map +1 -1
  84. package/lib/owner-task-gaps.js +9 -1
  85. package/lib/owner-task-gaps.js.map +1 -1
  86. package/lib/runtime-epoch.d.ts +69 -0
  87. package/lib/runtime-epoch.d.ts.map +1 -0
  88. package/lib/runtime-epoch.js +139 -0
  89. package/lib/runtime-epoch.js.map +1 -0
  90. package/lib/runtime-observer.d.ts.map +1 -1
  91. package/lib/runtime-observer.js +42 -6
  92. package/lib/runtime-observer.js.map +1 -1
  93. package/lib/service.d.ts +247 -4
  94. package/lib/service.d.ts.map +1 -1
  95. package/lib/service.js +1332 -27
  96. package/lib/service.js.map +1 -1
  97. package/lib/source-adoption-authority.d.ts +3 -0
  98. package/lib/source-adoption-authority.d.ts.map +1 -1
  99. package/lib/source-adoption-authority.js +13 -3
  100. package/lib/source-adoption-authority.js.map +1 -1
  101. package/lib/source-adoption-runner.d.ts +3 -0
  102. package/lib/source-adoption-runner.d.ts.map +1 -1
  103. package/lib/source-adoption-runner.js +16 -4
  104. package/lib/source-adoption-runner.js.map +1 -1
  105. package/lib/source-baseline.d.ts +37 -0
  106. package/lib/source-baseline.d.ts.map +1 -0
  107. package/lib/source-baseline.js +250 -0
  108. package/lib/source-baseline.js.map +1 -0
  109. package/lib/source-build.d.ts +17 -1
  110. package/lib/source-build.d.ts.map +1 -1
  111. package/lib/source-build.js +501 -7
  112. package/lib/source-build.js.map +1 -1
  113. package/lib/source-context.d.ts +18 -0
  114. package/lib/source-context.d.ts.map +1 -1
  115. package/lib/source-context.js +85 -11
  116. package/lib/source-context.js.map +1 -1
  117. package/lib/source-creation.d.ts +106 -0
  118. package/lib/source-creation.d.ts.map +1 -0
  119. package/lib/source-creation.js +664 -0
  120. package/lib/source-creation.js.map +1 -0
  121. package/lib/source-job-types.d.ts +19 -0
  122. package/lib/source-job-types.d.ts.map +1 -1
  123. package/lib/source-jobs.d.ts +30 -3
  124. package/lib/source-jobs.d.ts.map +1 -1
  125. package/lib/source-jobs.js +382 -40
  126. package/lib/source-jobs.js.map +1 -1
  127. package/lib/source-maintenance.d.ts +66 -0
  128. package/lib/source-maintenance.d.ts.map +1 -0
  129. package/lib/source-maintenance.js +177 -0
  130. package/lib/source-maintenance.js.map +1 -0
  131. package/lib/source-revision.d.ts +57 -0
  132. package/lib/source-revision.d.ts.map +1 -0
  133. package/lib/source-revision.js +175 -0
  134. package/lib/source-revision.js.map +1 -0
  135. package/lib/source-workspace.d.ts +19 -14
  136. package/lib/source-workspace.d.ts.map +1 -1
  137. package/lib/source-workspace.js +90 -17
  138. package/lib/source-workspace.js.map +1 -1
  139. package/lib/sqlite.d.ts +13 -3
  140. package/lib/sqlite.d.ts.map +1 -1
  141. package/lib/sqlite.js +362 -1
  142. package/lib/sqlite.js.map +1 -1
  143. package/lib/store.d.ts +258 -3
  144. package/lib/store.d.ts.map +1 -1
  145. package/lib/store.js +2211 -95
  146. package/lib/store.js.map +1 -1
  147. package/lib/systemd-host-authority.d.ts +68 -0
  148. package/lib/systemd-host-authority.d.ts.map +1 -0
  149. package/lib/systemd-host-authority.js +424 -0
  150. package/lib/systemd-host-authority.js.map +1 -0
  151. package/lib/task-observation-evidence.d.ts +32 -0
  152. package/lib/task-observation-evidence.d.ts.map +1 -0
  153. package/lib/task-observation-evidence.js +62 -0
  154. package/lib/task-observation-evidence.js.map +1 -0
  155. package/lib/task-observation-runtime.d.ts +2 -3
  156. package/lib/task-observation-runtime.d.ts.map +1 -1
  157. package/lib/task-observation-runtime.js +7 -39
  158. package/lib/task-observation-runtime.js.map +1 -1
  159. package/lib/task-observation-store.js +1 -1
  160. package/lib/trust.d.ts.map +1 -1
  161. package/lib/trust.js +0 -0
  162. package/lib/trust.js.map +1 -1
  163. package/lib/types.d.ts +43 -6
  164. package/lib/types.d.ts.map +1 -1
  165. package/lib/version.d.ts +1 -1
  166. package/lib/version.js +1 -1
  167. package/package.json +21 -14
@@ -6,7 +6,7 @@ import { basename, dirname, isAbsolute, join, resolve } from 'node:path'
6
6
  import { DatabaseSync } from 'node:sqlite'
7
7
  import { fileURLToPath } from 'node:url'
8
8
 
9
- export const SYSTEMD_HOST_ATTESTOR_VERSION = 'dsh-systemd-host-attestor-5'
9
+ export const SYSTEMD_HOST_ATTESTOR_VERSION = 'dsh-systemd-host-attestor-8'
10
10
  const DIGEST = /^[a-f0-9]{64}$/u
11
11
  const ID = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,159}$/u
12
12
  const UNIT_PROPERTIES = ['FragmentPath', 'DropInPaths', 'ExecStart', 'Environment', 'WorkingDirectory', 'User', 'Group', 'Type', 'KillMode']
@@ -104,8 +104,7 @@ function validateReadiness(ready, profilePath, withReload) {
104
104
  if (new Set(ready.deploymentFiles.map(spec => spec.path)).size !== ready.deploymentFiles.length) fail('duplicate deployment pin')
105
105
  if (ready.observer?.profilePath !== profilePath) fail('observer profile differs')
106
106
  }
107
- function loadConfig(environment, request) {
108
- const config = parseJson(readSafe(environment.DSH_SYSTEMD_HOST_ATTESTOR_CONFIG, 65536, true), 'config')
107
+ function loadConfig(environment, request, config) {
109
108
  object(config, ['schemaVersion', 'authority', 'keyId', 'privateKeyPath', 'stateRoot', 'executable', 'interpreter', 'processHelper',
110
109
  'systemctl', 'scope', 'unit', 'unitProperties', 'profileFiles', 'authorization', 'timeoutMs', 'stableWindowMs', 'pollIntervalMs',
111
110
  ...([2, 3].includes(config.schemaVersion) ? ['readiness'] : [])], 'config')
@@ -207,6 +206,135 @@ function loadConfig(environment, request) {
207
206
  assertCurrent(config, request)
208
207
  return { config, privateKey }
209
208
  }
209
+
210
+ const TEMPLATE_FIELDS = ['authority', 'keyId', 'privateKeyPath', 'stateRoot', 'executable', 'interpreter', 'processHelper',
211
+ 'systemctl', 'scope', 'unit', 'unitProperties', 'timeoutMs', 'stableWindowMs', 'pollIntervalMs', 'readiness', 'recoveryReadiness']
212
+
213
+ async function processRunner(spec) {
214
+ const bytes = readSafe(spec.path, 1048576)
215
+ if (hash(bytes) !== spec.sha256) fail('process helper changed')
216
+ const { executeControlledProcess } = await import(`data:text/javascript;base64,${bytes.toString('base64')}`)
217
+ if (typeof executeControlledProcess !== 'function') fail('process helper contract is unavailable')
218
+ return executeControlledProcess
219
+ }
220
+
221
+ /** A pinned independent resolver authorizes each durable operation from its standing grant. */
222
+ async function resolveStandingConfig(wrapper, request) {
223
+ object(wrapper, ['schemaVersion', 'template', 'resolver'], 'standing config')
224
+ const template = object(wrapper.template, TEMPLATE_FIELDS, 'standing template')
225
+ pin(template.executable, 'attestor executable', true); pin(template.interpreter, 'attestor interpreter', true)
226
+ pin(template.processHelper, 'process helper')
227
+ if (runningHash(process.argv[1]) !== template.executable.sha256 || runningHash(process.execPath) !== template.interpreter.sha256) fail('running attestor identity differs')
228
+ const resolver = object(wrapper.resolver, ['executable', 'interpreter', 'configPath', 'configSha256', 'timeoutMs'], 'authorization resolver')
229
+ pin(resolver.executable, 'resolver executable', true)
230
+ if (resolver.interpreter !== null) pin(resolver.interpreter, 'resolver interpreter', true)
231
+ integer(resolver.timeoutMs, 'resolver timeout', 1000, 60000)
232
+ text(resolver.configSha256, 'resolver config digest', DIGEST)
233
+ const configBytes = readSafe(resolver.configPath, 65536, true)
234
+ if (hash(configBytes) !== resolver.configSha256) fail('resolver config changed')
235
+ const authorityConfig = parseJson(configBytes, 'resolver config')
236
+ if (canonical(authorityConfig.template) !== canonical(template)) fail('resolver template differs from standing config')
237
+ const execute = await processRunner(template.processHelper)
238
+ const specs = [resolver.executable, ...(resolver.interpreter ? [resolver.interpreter] : [])], descriptors = []
239
+ try {
240
+ for (const spec of specs) {
241
+ const fd = openSync(spec.path, F.O_RDONLY | F.O_NOFOLLOW); descriptors.push(fd)
242
+ const bytes = descriptorBytes(fd, 268435456)
243
+ if (hash(bytes) !== spec.sha256) fail('resolver inode changed')
244
+ if ((resolver.interpreter === null || spec === resolver.interpreter)
245
+ && !bytes.subarray(0, 4).equals(Buffer.from([0x7f, 0x45, 0x4c, 0x46]))) fail('script resolver requires a pinned interpreter with native ELF identity')
246
+ }
247
+ const result = await execute({ command: descriptors.length === 2 ? '/proc/self/fd/4' : '/proc/self/fd/3',
248
+ args: [...(descriptors.length === 2 ? ['/proc/self/fd/3'] : []), '--config', resolver.configPath],
249
+ env: { LANG: 'C', LC_ALL: 'C' }, stdio: ['pipe', 'pipe', 'ignore', ...descriptors],
250
+ stdin: `${JSON.stringify(request)}\n`, maximumOutput: 524288, timeoutMs: resolver.timeoutMs })
251
+ for (let index = 0; index < descriptors.length; index++) if (hash(descriptorBytes(descriptors[index], 268435456)) !== specs[index].sha256) fail('resolver mutated')
252
+ if (hash(readSafe(resolver.configPath, 65536, true)) !== resolver.configSha256) fail('resolver config changed during authorization')
253
+ const derived = parseJson(Buffer.from(result), 'resolved config')
254
+ for (const field of TEMPLATE_FIELDS.filter(field => field !== 'readiness' && field !== 'recoveryReadiness')) {
255
+ if (canonical(derived[field]) !== canonical(template[field])) fail('resolved static authority differs')
256
+ }
257
+ const expectedSchema = request.kind === 'dsh-runtime-epoch-request' ? (derived.maintenance === undefined ? 5 : 6)
258
+ : request.phase === 'reload' ? 1 : request.phase === 'readiness' ? 2 : 3
259
+ if (derived.schemaVersion !== expectedSchema || derived.authorization?.requestDigest !== digest(request)) fail('resolver did not authorize the exact phase and request')
260
+ if (expectedSchema !== 1) {
261
+ if (request.phase === 'rollback' && request.requirements?.action === 'stop') {
262
+ if (derived.readiness !== null) fail('resolved stop readiness differs')
263
+ } else {
264
+ const expected = request.phase === 'rollback' ? template.recoveryReadiness : template.readiness
265
+ if (canonical(derived.readiness?.client) !== canonical(expected?.client)
266
+ || canonical(derived.readiness?.observer) !== canonical(expected?.observer)) fail('resolved observer authority differs')
267
+ }
268
+ }
269
+ return derived
270
+ } finally { for (const fd of descriptors.reverse()) closeSync(fd) }
271
+ }
272
+ function loadEpochConfig(environment, request, config) {
273
+ object(config, ['schemaVersion', 'authority', 'keyId', 'privateKeyPath', 'stateRoot', 'executable', 'interpreter', 'processHelper',
274
+ 'systemctl', 'scope', 'unit', 'unitProperties', 'profileFiles', 'authorization', 'timeoutMs', 'stableWindowMs', 'pollIntervalMs',
275
+ 'readiness', ...(config.schemaVersion === 6 ? ['maintenance'] : [])], 'epoch config')
276
+ if (![5, 6].includes(config.schemaVersion)) fail('runtime epoch requires config schema 5 or 6')
277
+ if (config.schemaVersion === 6 && (!Array.isArray(config.maintenance) || !config.maintenance.length
278
+ || config.maintenance.length > 256 || Buffer.byteLength(JSON.stringify(config.maintenance)) > 450000)) fail('maintenance chain exceeds bounds')
279
+ text(config.authority, 'authority', ID); text(config.keyId, 'keyId', ID)
280
+ integer(config.timeoutMs, 'timeout', 1000, 60000); integer(config.stableWindowMs, 'stable window', 50, 10000)
281
+ integer(config.pollIntervalMs, 'poll interval', 25, 1000)
282
+ if (config.stableWindowMs + config.pollIntervalMs >= config.timeoutMs || !['user', 'system'].includes(config.scope)) fail('epoch observation bounds are invalid')
283
+ const auth = object(config.authorization, ['installationId', 'ledger', 'profile', 'plan', 'activation', 'hostGeneration', 'requestDigest', 'notBefore', 'expiresAt'], 'epoch authorization')
284
+ text(auth.requestDigest, 'request digest', DIGEST)
285
+ if (digest(request) !== auth.requestDigest) fail('exact epoch request is not authorized')
286
+ object(auth.ledger, ['id', 'path'], 'ledger'); object(auth.profile, ['name', 'path'], 'profile')
287
+ object(auth.plan, ['id', 'digest'], 'plan'); object(auth.activation, ['id', 'fence'], 'activation')
288
+ text(auth.installationId, 'installation', /^[a-f0-9]{8}-[a-f0-9]{4}-[1-8][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/u)
289
+ for (const value of [auth.ledger.id, auth.plan.id, auth.activation.id]) text(value, 'identity', ID)
290
+ text(auth.plan.digest, 'plan digest', DIGEST); text(auth.profile.name, 'profile name', /^[a-z0-9][a-z0-9-]{0,63}$/u)
291
+ canonicalPath(auth.profile.path, 'profile'); canonicalPath(auth.ledger.path, 'ledger')
292
+ if (basename(auth.profile.path) !== auth.profile.name || basename(dirname(auth.profile.path)) !== 'profiles') fail('profile path and name differ')
293
+ integer(auth.activation.fence, 'fence', 1); integer(auth.hostGeneration, 'host generation', 1)
294
+ integer(auth.notBefore, 'authorization start'); integer(auth.expiresAt, 'authorization expiry', auth.notBefore + 1)
295
+ if (config.unit !== `dsh-profile-${auth.profile.name}.service`) fail('unit does not bind the profile')
296
+ object(config.unitProperties, UNIT_PROPERTIES, 'unit properties')
297
+ for (const property of UNIT_PROPERTIES) text(config.unitProperties[property], property)
298
+ if (!['simple', 'exec', 'notify'].includes(config.unitProperties.Type) || config.unitProperties.KillMode !== 'control-group') fail('unsupported unit lifecycle')
299
+ if (!Array.isArray(config.profileFiles) || config.profileFiles.length < 3 || config.profileFiles.length > 32) fail('profile pins are invalid')
300
+ const paths = config.profileFiles.map(spec => {
301
+ pin(spec, 'profile file')
302
+ if (!within(auth.profile.path, spec.path)) fail('profile pin is outside profile')
303
+ return spec.path
304
+ })
305
+ if (new Set(paths).size !== paths.length || !['package.json', 'pnpm-lock.yaml', 'cordis.patch.yml'].every(name => paths.includes(join(auth.profile.path, name)))) fail('profile manifest, lockfile and patch pins are required')
306
+ privateDirectory(config.stateRoot)
307
+ for (const path of [environment.DSH_SYSTEMD_HOST_ATTESTOR_CONFIG, config.privateKeyPath, config.stateRoot]) {
308
+ if (within(auth.profile.path, path)) fail('attestor authority must be outside the candidate profile')
309
+ }
310
+ const privateKey = createPrivateKey(readSafe(config.privateKeyPath, 16384, true))
311
+ if (privateKey.asymmetricKeyType !== 'ed25519') fail('signing key must be Ed25519')
312
+ pin(config.executable, 'attestor executable', true); pin(config.interpreter, 'attestor interpreter', true); pin(config.processHelper, 'process helper')
313
+ if (runningHash(process.argv[1]) !== config.executable.sha256 || runningHash(process.execPath) !== config.interpreter.sha256) fail('running attestor identity differs')
314
+ object(config.systemctl, ['path', 'sha256', 'interpreter'], 'systemctl')
315
+ pin({ path: config.systemctl.path, sha256: config.systemctl.sha256 }, 'systemctl', true)
316
+ if (config.systemctl.interpreter !== null) pin(config.systemctl.interpreter, 'systemctl interpreter', true)
317
+ object(request, ['schemaVersion', 'kind', 'operationId', 'requestedAt', 'receiptTtlMs', 'installationId', 'ledger', 'plan',
318
+ 'activation', 'profile', 'issuer', 'predecessor', 'sequence', 'runtimeIdentityDigest'], 'epoch request')
319
+ if (request.schemaVersion !== 1 || request.kind !== 'dsh-runtime-epoch-request') fail('epoch request version or kind is invalid')
320
+ text(request.operationId, 'operation', ID); if (request.operationId.length > 152) fail('operation is too long for receipt identity')
321
+ integer(request.requestedAt, 'requestedAt'); integer(request.receiptTtlMs, 'receipt TTL', 1, 3600000)
322
+ integer(request.sequence, 'epoch sequence', 1); text(request.runtimeIdentityDigest, 'runtime identity digest', DIGEST)
323
+ const prior = object(request.predecessor, ['operationId', 'receiptDigest', 'hostGeneration'], 'epoch predecessor')
324
+ text(prior.operationId, 'predecessor operation', ID); text(prior.receiptDigest, 'predecessor digest', DIGEST)
325
+ integer(prior.hostGeneration, 'predecessor generation', 1)
326
+ if (prior.operationId === request.operationId || prior.hostGeneration !== auth.hostGeneration) fail('epoch predecessor is invalid')
327
+ for (const field of ['installationId', 'ledger', 'profile', 'plan', 'activation']) if (canonical(request[field]) !== canonical(auth[field])) fail(`${field} is not authorized`)
328
+ object(request.issuer, ['mode', 'id', 'version', 'path', 'sha256', 'interpreter', 'authority', 'keyId'], 'issuer')
329
+ text(request.issuer.id, 'issuer ID', ID)
330
+ if (request.issuer.mode !== 'configured-executable' || request.issuer.version !== SYSTEMD_HOST_ATTESTOR_VERSION
331
+ || request.issuer.path !== config.executable.path || request.issuer.sha256 !== config.executable.sha256
332
+ || canonical(request.issuer.interpreter) !== canonical(config.interpreter)
333
+ || request.issuer.authority !== config.authority || request.issuer.keyId !== config.keyId) fail('issuer differs from owner configuration')
334
+ validateReadiness(config.readiness, auth.profile.path, false)
335
+ assertCurrent(config, request)
336
+ return { config, privateKey }
337
+ }
210
338
  function assertCurrent(config, request) {
211
339
  const now = Date.now(); const auth = config.authorization
212
340
  if (request.requestedAt < auth.notBefore || request.requestedAt > now || now > auth.expiresAt) fail('authorization expired or not yet valid')
@@ -618,11 +746,226 @@ async function attestRollback(request, config, privateKey, db, execute, deadline
618
746
  return cachedReceipt(db.prepare('SELECT * FROM reloads WHERE operation_id = ?').get(request.operationId), request, config, privateKey)
619
747
  })
620
748
  }
749
+ function retainedSignedReceipt(row, privateKey, label) {
750
+ if (!row?.receipt || !row.observation) fail(`${label} is unresolved`)
751
+ const receipt = parseJson(Buffer.from(row.receipt), `${label} receipt`)
752
+ const observation = parseJson(Buffer.from(row.observation), `${label} observation`)
753
+ const { signature, ...unsigned } = receipt
754
+ if (receipt.operationId !== row.operation_id || receipt.requestDigest !== row.request_digest
755
+ || receipt.evidenceDigest !== digest(receipt.evidence) || receipt.evidence.probeDigest !== digest(observation)
756
+ || typeof signature !== 'string' || !verify(null, Buffer.from(canonical(unsigned)), createPublicKey(privateKey), Buffer.from(signature, 'base64'))) {
757
+ fail(`${label} signed evidence is invalid`)
758
+ }
759
+ // A prior passed readiness is durable history even after its short live TTL.
760
+ return { receipt, observation }
761
+ }
762
+ function boundEpochPredecessor(db, request, config, privateKey) {
763
+ const scopeId = digest({ installation: request.installationId })
764
+ const reload = db.prepare('SELECT * FROM reloads WHERE scope_id = ? ORDER BY generation DESC LIMIT 1').get(scopeId)
765
+ if (!reload || reload.generation !== config.authorization.hostGeneration || !reload.request || !reload.config) fail('latest Host generation is unresolved or superseded')
766
+ const priorRequest = parseJson(Buffer.from(reload.request), 'historical reload request')
767
+ const priorConfig = parseJson(Buffer.from(reload.config), 'historical reload config')
768
+ if (reload.request_digest !== digest(priorRequest) || reload.config_digest !== digest(priorConfig)) fail('historical reload context changed')
769
+ for (const field of ['installationId', 'ledger', 'profile', 'plan', 'activation']) {
770
+ if (canonical(priorRequest[field]) !== canonical(request[field])) fail('historical reload context differs')
771
+ }
772
+ for (const field of ['authority', 'keyId', 'privateKeyPath', 'stateRoot', 'scope', 'unit', 'unitProperties', 'profileFiles', 'systemctl']) {
773
+ if (config.schemaVersion === 6 && ['unitProperties', 'profileFiles'].includes(field)) continue
774
+ if (canonical(priorConfig[field]) !== canonical(config[field])) fail('historical deployment differs')
775
+ }
776
+ const signedReload = retainedSignedReceipt(reload, privateKey, 'historical reload')
777
+ if (priorRequest.phase !== 'reload' || signedReload.receipt.phase !== 'reload' || signedReload.receipt.outcome !== 'passed'
778
+ || signedReload.receipt.hostGeneration !== reload.generation || signedReload.receipt.authority !== config.authority
779
+ || signedReload.receipt.keyId !== config.keyId || signedReload.receipt.evidence.reloaded !== true
780
+ || signedReload.receipt.evidence.currentHostGeneration !== reload.generation
781
+ || signedReload.observation.requestDigest !== reload.request_digest || signedReload.observation.configDigest !== reload.config_digest) fail('historical reload is invalid')
782
+ const readiness = db.prepare('SELECT * FROM readiness WHERE reload_id = ?').get(reload.operation_id)
783
+ const signedReady = retainedSignedReceipt(readiness, privateKey, 'historical readiness')
784
+ const ready = signedReady.receipt
785
+ if (readiness.reload_id !== reload.operation_id || ready.phase !== 'readiness' || ready.outcome !== 'passed'
786
+ || ready.hostGeneration !== reload.generation || ready.installationId !== request.installationId
787
+ || ready.planId !== request.plan.id || ready.planDigest !== request.plan.digest
788
+ || ready.activationId !== request.activation.id || ready.fence !== request.activation.fence
789
+ || ready.authority !== config.authority || ready.keyId !== config.keyId || ready.evidence.kind !== 'readiness'
790
+ || ready.evidence.checks < 2 || ready.evidence.failures !== 0
791
+ || signedReady.observation.reload?.operationId !== reload.operation_id
792
+ || signedReady.observation.reload?.receiptDigest !== digest(signedReload.receipt)
793
+ || signedReady.observation.reload?.generation !== reload.generation
794
+ || request.predecessor.operationId !== ready.operationId || request.predecessor.receiptDigest !== digest(ready)
795
+ || request.predecessor.hostGeneration !== ready.hostGeneration) fail('runtime epoch predecessor is not the applied signed readiness')
796
+ if (config.schemaVersion === 6) verifyEpochMaintenance(config, request, priorConfig, ready, privateKey)
797
+ return { reloadOperationId: reload.operation_id, readinessOperationId: ready.operationId,
798
+ readinessReceiptDigest: digest(ready), hostGeneration: reload.generation }
799
+ }
800
+ function verifyEpochMaintenance(config, request, original, ready, privateKey) {
801
+ const key = createPublicKey(privateKey), publicKeyPem = key.export({ type: 'spki', format: 'pem' }).toString()
802
+ let prior
803
+ for (const record of config.maintenance) {
804
+ object(record, ['schemaVersion', 'kind', 'transactionId', 'installationId', 'ledger', 'profile', 'plan', 'activation',
805
+ 'predecessor', 'sequence', 'previousDigest', 'before', 'after', 'issuedAt', 'authority', 'keyId', 'publicKeyPem', 'signature'], 'maintenance record')
806
+ const { signature, ...unsigned } = record
807
+ if (record.schemaVersion !== 1 || record.kind !== 'dsh-host-maintenance'
808
+ || record.publicKeyPem !== publicKeyPem || record.authority !== config.authority || record.keyId !== config.keyId
809
+ || typeof signature !== 'string' || !verify(null, Buffer.from(canonical(unsigned)), key, Buffer.from(signature, 'base64'))
810
+ || record.sequence !== (prior?.sequence ?? 0) + 1 || record.previousDigest !== (prior ? digest(prior) : null)
811
+ || !Number.isSafeInteger(record.issuedAt) || record.issuedAt < (prior?.issuedAt ?? ready.observedAt)
812
+ || record.issuedAt > Date.now() || canonical(record.predecessor) !== canonical(request.predecessor)) fail('maintenance signature or chain differs')
813
+ for (const field of ['installationId', 'ledger', 'profile', 'plan', 'activation']) {
814
+ if (canonical(record[field]) !== canonical(request[field])) fail('maintenance deployment identity differs')
815
+ }
816
+ for (const snapshot of [record.before, record.after]) object(snapshot,
817
+ ['executor', 'profileFiles', 'baselineFiles', 'deploymentFiles', 'baselineDeploymentFiles', 'unitProperties'], 'maintenance snapshot')
818
+ if (prior ? canonical(record.before) !== canonical(prior.after)
819
+ : canonical(record.before.profileFiles) !== canonical(original.profileFiles)
820
+ || canonical(record.before.unitProperties) !== canonical(original.unitProperties)) fail('maintenance predecessor deployment differs')
821
+ prior = record
822
+ }
823
+ if (!prior || canonical(prior.after.profileFiles) !== canonical(config.profileFiles)
824
+ || canonical(prior.after.unitProperties) !== canonical(config.unitProperties)
825
+ || canonical(prior.after.deploymentFiles.map(({ path, sha256 }) => ({ path, sha256 }))) !== canonical(config.readiness.deploymentFiles)) fail('maintenance current deployment differs')
826
+ }
827
+ function epochJournal(config) {
828
+ const path = join(config.stateRoot, 'runtime-epochs.sqlite')
829
+ for (const suffix of ['', '-wal', '-shm', '-journal']) if (existsSync(path + suffix)) readSafe(path + suffix, 67108864, true)
830
+ const oldMask = process.umask(0o077); let db
831
+ try { db = new DatabaseSync(path) } finally { process.umask(oldMask) }
832
+ try {
833
+ db.exec(`PRAGMA busy_timeout=1000; PRAGMA journal_mode=WAL; PRAGMA synchronous=FULL;
834
+ CREATE TABLE IF NOT EXISTS runtime_epochs (
835
+ operation_id TEXT PRIMARY KEY, request_digest TEXT NOT NULL, config_digest TEXT NOT NULL,
836
+ scope_id TEXT NOT NULL, host_generation INTEGER NOT NULL, sequence INTEGER NOT NULL,
837
+ runtime_identity_digest TEXT NOT NULL, predecessor_digest TEXT NOT NULL,
838
+ observation TEXT, receipt TEXT,
839
+ UNIQUE(scope_id, host_generation, sequence));`)
840
+ syncDirectory(config.stateRoot)
841
+ return db
842
+ } catch { db.close(); fail('private runtime epoch journal could not be opened') }
843
+ }
844
+ function epochCachedReceipt(row, request, config, privateKey) {
845
+ if (row.request_digest !== digest(request) || row.config_digest !== digest(config)
846
+ || row.runtime_identity_digest !== request.runtimeIdentityDigest
847
+ || row.predecessor_digest !== request.predecessor.receiptDigest) fail('runtime epoch operation identity changed')
848
+ if (row.receipt === null) return undefined
849
+ if (row.observation === null) fail('runtime epoch receipt lacks observation')
850
+ const receipt = parseJson(Buffer.from(row.receipt), 'runtime epoch receipt')
851
+ const observation = parseJson(Buffer.from(row.observation), 'runtime epoch observation')
852
+ const { signature, ...unsigned } = receipt
853
+ if (receipt.requestDigest !== row.request_digest || receipt.runtimeIdentityDigest !== request.runtimeIdentityDigest
854
+ || receipt.sequence !== request.sequence || receipt.hostGeneration !== request.predecessor.hostGeneration
855
+ || receipt.evidence?.probeDigest !== digest(observation)
856
+ || typeof signature !== 'string' || !verify(null, Buffer.from(canonical(unsigned)), createPublicKey(privateKey), Buffer.from(signature, 'base64'))) fail('cached runtime epoch receipt is invalid')
857
+ if (Date.now() > receipt.expiresAt) fail('cached runtime epoch receipt expired; owner reconciliation required')
858
+ return { receipt, observation }
859
+ }
860
+ async function attestEpoch(request, config, privateKey) {
861
+ const execute = await processRunner(config.processHelper)
862
+ const deadline = performance.now() + config.timeoutMs
863
+ const oldPath = join(config.stateRoot, 'reload.sqlite')
864
+ readSafe(oldPath, 67108864, true)
865
+ const historical = new DatabaseSync(oldPath, { readOnly: true })
866
+ const epochs = epochJournal(config)
867
+ try {
868
+ const binding = boundEpochPredecessor(historical, request, config, privateKey)
869
+ const scopeId = digest({ installation: request.installationId })
870
+ const row = transaction(epochs, () => {
871
+ const existing = epochs.prepare('SELECT * FROM runtime_epochs WHERE operation_id = ?').get(request.operationId)
872
+ const latest = epochs.prepare('SELECT * FROM runtime_epochs WHERE scope_id = ? AND host_generation = ? ORDER BY sequence DESC LIMIT 1').get(scopeId, binding.hostGeneration)
873
+ if (existing) {
874
+ if (latest?.sequence !== existing.sequence) fail('runtime epoch operation was superseded')
875
+ epochCachedReceipt(existing, request, config, privateKey)
876
+ return existing
877
+ }
878
+ if (request.sequence <= (latest?.sequence ?? 0)) fail('runtime epoch sequence is stale')
879
+ epochs.prepare(`INSERT INTO runtime_epochs(operation_id, request_digest, config_digest, scope_id, host_generation,
880
+ sequence, runtime_identity_digest, predecessor_digest) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`)
881
+ .run(request.operationId, digest(request), digest(config), scopeId, binding.hostGeneration,
882
+ request.sequence, request.runtimeIdentityDigest, request.predecessor.receiptDigest)
883
+ return epochs.prepare('SELECT * FROM runtime_epochs WHERE operation_id = ?').get(request.operationId)
884
+ })
885
+ const cached = epochCachedReceipt(row, request, config, privateKey)
886
+ const retained = cached?.observation
887
+ const ready = config.readiness
888
+ const bytes = readSafe(ready.client.path, 1048576)
889
+ if (hash(bytes) !== ready.client.sha256) fail('observer client changed')
890
+ const client = await import(`data:text/javascript;base64,${bytes.toString('base64')}`)
891
+ client.validateRuntimeObserverConfig(ready.observer)
892
+ const observerDigest = client.runtimeConfigDigest(ready.observer)
893
+ const channelDigest = hash(readSafe(ready.observer.keyPath, 32, true))
894
+ let stable; let supervisor; let started; let failures = 0
895
+ const samples = [], challenges = new Set()
896
+ for (;;) {
897
+ assertCurrent(config, request); remaining(deadline)
898
+ if (canonical(boundEpochPredecessor(historical, request, config, privateKey)) !== canonical(binding)) fail('Host generation changed during runtime epoch')
899
+ const before = await observe(config, execute, deadline)
900
+ if (!active(before)) fail('target service is not active for runtime epoch')
901
+ if (supervisor === undefined) supervisor = before
902
+ else if (canonical(supervisor) !== canonical(before)) fail('supervisor changed during runtime epoch')
903
+ if (hash(readSafe(ready.observer.keyPath, 32, true)) !== channelDigest) fail('observer key changed')
904
+ const queriedAt = Date.now()
905
+ const sample = await client.queryRuntimeObserver({ ...ready.observer, signal: AbortSignal.timeout(remaining(deadline)) })
906
+ if (sample.profilePath !== request.profile.path || sample.observerConfigDigest !== observerDigest
907
+ || sample.processId !== before.MainPID || sample.invocationId !== before.InvocationID
908
+ || sample.observedAt < queriedAt || sample.observedAt > Date.now() || challenges.has(sample.challenge)
909
+ || sample.entries.length !== ready.observer.targets.length) fail('observer identity or freshness differs')
910
+ challenges.add(sample.challenge)
911
+ let sampleFailed = false
912
+ for (const target of ready.observer.targets) {
913
+ const entry = sample.entries.find(item => item.entryId === target.entryId)
914
+ if (!entry || entry.module !== target.module || entry.configDigest !== target.configDigest
915
+ || canonical(entry.services.map(service => service.name).sort()) !== canonical([...target.services].sort())) fail('candidate identity differs')
916
+ if (entry.active === true) {
917
+ if (!entry.instance || [...entry.dependencies, ...entry.services].some(service => !service.instance)) fail('active candidate is not ready')
918
+ } else if (entry.active === false) sampleFailed = true
919
+ else fail('candidate active state is invalid')
920
+ }
921
+ const { challenge: _challenge, observedAt: _observedAt, ...identity } = sample
922
+ if (digest(identity) !== request.runtimeIdentityDigest) fail('runtime identity differs from requested epoch')
923
+ if (stable === undefined) { stable = identity; started = performance.now() }
924
+ else if (canonical(stable) !== canonical(identity)) fail('runtime instance changed during epoch')
925
+ if (retained && (canonical(identity) !== canonical(retained.runtime)
926
+ || canonical(before) !== canonical(retained.supervisor) || channelDigest !== retained.channelDigest)) fail('cached runtime epoch identity changed')
927
+ if (sampleFailed) failures++
928
+ samples.push({ challenge: sample.challenge, observedAt: sample.observedAt, digest: digest(sample) })
929
+ const after = await observe(config, execute, deadline)
930
+ if (canonical(after) !== canonical(before)) fail('supervisor changed during runtime query')
931
+ if (samples.length >= 2 && performance.now() - started >= config.stableWindowMs) break
932
+ if (samples.length >= 256) fail('runtime epoch sample limit exceeded')
933
+ await new Promise(resolveDelay => setTimeout(resolveDelay, Math.min(config.pollIntervalMs, remaining(deadline))))
934
+ }
935
+ assertCurrent(config, request); assertProfile(config); remaining(deadline)
936
+ if (hash(readSafe(ready.observer.keyPath, 32, true)) !== channelDigest) fail('observer key changed')
937
+ const observation = { schemaVersion: 1, requestDigest: digest(request), configDigest: digest(config), binding,
938
+ channelDigest, supervisor, runtime: stable, samples, stableWindowMs: config.stableWindowMs, observedAt: Date.now() }
939
+ const evidence = { checks: samples.length, failures, probeDigest: digest(observation) }
940
+ const unsigned = { schemaVersion: 1, kind: 'dsh-runtime-epoch-receipt', receiptId: `receipt:${request.operationId}`,
941
+ operationId: request.operationId, requestDigest: digest(request), installationId: request.installationId,
942
+ planId: request.plan.id, planDigest: request.plan.digest, activationId: request.activation.id, fence: request.activation.fence,
943
+ hostGeneration: binding.hostGeneration, sequence: request.sequence, runtimeIdentityDigest: request.runtimeIdentityDigest,
944
+ authority: config.authority, keyId: config.keyId, outcome: failures === 0 ? 'passed' : 'failed',
945
+ observedAt: observation.observedAt, expiresAt: Math.min(observation.observedAt + request.receiptTtlMs, config.authorization.expiresAt), evidence }
946
+ if (unsigned.expiresAt <= unsigned.observedAt) fail('authorization expired before signing')
947
+ return transaction(epochs, () => {
948
+ assertCurrent(config, request); remaining(deadline)
949
+ if (canonical(boundEpochPredecessor(historical, request, config, privateKey)) !== canonical(binding)) fail('Host generation changed before epoch signing')
950
+ const current = epochs.prepare('SELECT * FROM runtime_epochs WHERE operation_id = ?').get(request.operationId)
951
+ const latest = epochs.prepare('SELECT operation_id FROM runtime_epochs WHERE scope_id = ? AND host_generation = ? ORDER BY sequence DESC LIMIT 1')
952
+ .get(scopeId, binding.hostGeneration)
953
+ if (latest?.operation_id !== request.operationId) fail('runtime epoch operation was superseded before signing')
954
+ const replay = epochCachedReceipt(current, request, config, privateKey)
955
+ if (replay) {
956
+ if (canonical(replay.observation.runtime) !== canonical(stable)
957
+ || canonical(replay.observation.supervisor) !== canonical(supervisor)) fail('concurrent epoch identity differs')
958
+ return replay.receipt
959
+ }
960
+ const receipt = { ...unsigned, signature: sign(null, Buffer.from(canonical(unsigned)), privateKey).toString('base64') }
961
+ epochs.prepare('UPDATE runtime_epochs SET observation = ?, receipt = ? WHERE operation_id = ? AND receipt IS NULL')
962
+ .run(canonical(observation), canonical(receipt), request.operationId)
963
+ return epochCachedReceipt(epochs.prepare('SELECT * FROM runtime_epochs WHERE operation_id = ?').get(request.operationId), request, config, privateKey).receipt
964
+ })
965
+ } finally { epochs.close(); historical.close() }
966
+ }
621
967
  async function attest(request, config, privateKey) {
622
- const helperBytes = readSafe(config.processHelper.path, 1048576)
623
- if (hash(helperBytes) !== config.processHelper.sha256) fail('process helper changed')
624
- const { executeControlledProcess: execute } = await import(`data:text/javascript;base64,${helperBytes.toString('base64')}`)
625
- if (typeof execute !== 'function') fail('process helper contract is unavailable')
968
+ const execute = await processRunner(config.processHelper)
626
969
  const deadline = performance.now() + config.timeoutMs
627
970
  const db = journal(config)
628
971
  try {
@@ -693,8 +1036,15 @@ export async function runSystemdHostAttestor(argv = process.argv.slice(2), envir
693
1036
  let bytes = 0; const chunks = []
694
1037
  for await (const chunk of process.stdin) { bytes += chunk.length; if (bytes > 65536) fail('request exceeds byte limit'); chunks.push(chunk) }
695
1038
  const request = parseJson(Buffer.concat(chunks), 'request')
696
- if (!['reload', 'readiness', 'rollback'].includes(request?.phase)) fail('only reload, readiness and rollback requests are supported')
697
- const { config, privateKey } = loadConfig(environment, request)
1039
+ const epoch = request?.kind === 'dsh-runtime-epoch-request'
1040
+ if (!epoch && !['reload', 'readiness', 'rollback'].includes(request?.phase)) fail('only reload, readiness, rollback and runtime epoch requests are supported')
1041
+ let input = parseJson(readSafe(environment.DSH_SYSTEMD_HOST_ATTESTOR_CONFIG, 65536, true), 'config')
1042
+ if (input.schemaVersion === 4) input = await resolveStandingConfig(input, request)
1043
+ if (epoch) {
1044
+ const { config, privateKey } = loadEpochConfig(environment, request, input)
1045
+ return attestEpoch(request, config, privateKey)
1046
+ }
1047
+ const { config, privateKey } = loadConfig(environment, request, input)
698
1048
  return attest(request, config, privateKey)
699
1049
  }
700
1050
  if (process.argv[1] && (/^\/proc\/self\/fd\/\d+$/u.test(process.argv[1]) || realpathSync(process.argv[1]) === fileURLToPath(import.meta.url))) {
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ import { realpathSync } from 'node:fs'
3
+ import { dirname, join } from 'node:path'
4
+ import { pathToFileURL } from 'node:url'
5
+ try {
6
+ const wrapper = realpathSync(process.argv[1])
7
+ const { runSystemdHostAuthority } = await import(pathToFileURL(join(dirname(wrapper), '../lib/systemd-host-authority.js')).href)
8
+ await runSystemdHostAuthority()
9
+ } catch {
10
+ process.stderr.write('systemd Host authority refused the request\n')
11
+ process.exitCode = 1
12
+ }
@@ -48,7 +48,9 @@ export declare class AdoptionCoordinatorRuntime {
48
48
  assertCurrent: () => void;
49
49
  });
50
50
  start(): void;
51
- close(): Promise<void>;
51
+ close(options?: {
52
+ skipPause?: boolean;
53
+ }): Promise<void>;
52
54
  health: () => {
53
55
  connected: boolean;
54
56
  lastError: string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"adoption-coordinator.d.ts","sourceRoot":"","sources":["../src/adoption-coordinator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,2BAA2B,EAAuF,MAAM,qCAAqC,CAAA;AAE3K,OAAO,EAAsB,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACvE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAUtD,MAAM,WAAW,yBAAyB;IACxC,aAAa,EAAE,MAAM,CAAA;IACrB,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;IACvF,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,yBAAyB,CAkB5G;AAKD;;;GAGG;AACH,wBAAsB,yBAAyB,CAAC,OAAO,EAAE;IACvD,KAAK,EAAE,iBAAiB,CAAA;IACxB,KAAK,EAAE,wBAAwB,CAAA;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3C,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAmEhC;AAED,KAAK,WAAW,GAAG,IAAI,CAAC,2BAA2B,EAAE,sBAAsB,GAAG,iBAAiB,GAAG,8BAA8B,CAAC,CAAA;AAGjI,yFAAyF;AACzF,qBAAa,0BAA0B;IAWzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAVpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwB;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;IAC1C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAQ;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,UAAU,CAAC,CAAY;IAC/B,OAAO,CAAC,OAAO,CAAC,CAAe;IAC/B,OAAO,CAAC,SAAS,CAAsB;gBACV,OAAO,EAAE;QAAE,MAAM,EAAE,yBAAyB,CAAC;QAAC,KAAK,EAAE,iBAAiB,CAAC;QAAC,KAAK,EAAE,wBAAwB,CAAC;QAAC,WAAW,EAAE,WAAW,CAAC;QAAC,aAAa,EAAE,MAAM,IAAI,CAAA;KAAE;IAO3L,KAAK,IAAI,IAAI;IAmBb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBtB,MAAM;;;MAAgE;IAEtE,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,QAAQ;YAGF,OAAO;CA8BtB"}
1
+ {"version":3,"file":"adoption-coordinator.d.ts","sourceRoot":"","sources":["../src/adoption-coordinator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,2BAA2B,EAAuF,MAAM,qCAAqC,CAAA;AAE3K,OAAO,EAAsB,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACvE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAWtD,MAAM,WAAW,yBAAyB;IACxC,aAAa,EAAE,MAAM,CAAA;IACrB,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;IACvF,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,yBAAyB,CAkB5G;AAKD;;;GAGG;AACH,wBAAsB,yBAAyB,CAAC,OAAO,EAAE;IACvD,KAAK,EAAE,iBAAiB,CAAA;IACxB,KAAK,EAAE,wBAAwB,CAAA;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3C,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAqEhC;AAED,KAAK,WAAW,GAAG,IAAI,CAAC,2BAA2B,EAAE,sBAAsB,GAAG,iBAAiB,GAAG,8BAA8B,CAAC,CAAA;AAGjI,yFAAyF;AACzF,qBAAa,0BAA0B;IAWzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAVpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwB;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;IAC1C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAQ;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,UAAU,CAAC,CAAY;IAC/B,OAAO,CAAC,OAAO,CAAC,CAAe;IAC/B,OAAO,CAAC,SAAS,CAAsB;gBACV,OAAO,EAAE;QAAE,MAAM,EAAE,yBAAyB,CAAC;QAAC,KAAK,EAAE,iBAAiB,CAAC;QAAC,KAAK,EAAE,wBAAwB,CAAC;QAAC,WAAW,EAAE,WAAW,CAAC;QAAC,aAAa,EAAE,MAAM,IAAI,CAAA;KAAE;IAO3L,KAAK,IAAI,IAAI;IAmBb,KAAK,CAAC,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB3D,MAAM;;;MAAgE;IAEtE,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,QAAQ;YAGF,OAAO;CAsCtB"}
@@ -2,6 +2,7 @@ import { randomUUID } from 'node:crypto';
2
2
  import { isAbsolute, resolve } from 'node:path';
3
3
  import { activatePluginPlan, probePluginPlan } from './cli.js';
4
4
  import { controlPlaneDigest } from './store.js';
5
+ import { invokeConfiguredRuntimeEpochAttestor } from './host-attestor.js';
5
6
  const OWNER = 'plugin-control-plane-adoption-coordinator';
6
7
  const EXECUTOR = 'plugin-control-plane-adoption-coordinator-v1';
7
8
  const CATALOG = controlPlaneDigest({ executor: EXECUTOR, version: 1, operation: 'advance-adoption-handoff' });
@@ -30,7 +31,7 @@ export function validateAdoptionCoordinatorConfig(value) {
30
31
  }
31
32
  }
32
33
  function terminal(plan) { return plan.status === 'activated' || plan.status === 'rolled-back'; }
33
- function exposed(plan) { return plan.status === 'staging' || plan.status === 'commit-pending' || AWAITING.has(plan.status); }
34
+ function exposed(plan) { return plan.status === 'staging' || plan.status === 'commit-pending' || plan.status === 'awaiting-live-tasks' || AWAITING.has(plan.status); }
34
35
  /**
35
36
  * Advance an already signed source handoff only through Host attestation.
36
37
  * This Host deliberately leaves `commit-pending` for the target Host.
@@ -63,14 +64,14 @@ export async function coordinateAdoptionHandoff(options) {
63
64
  }
64
65
  return restored;
65
66
  };
66
- const recoverExpired = async (plan) => {
67
+ const recoverExpired = async (plan, failureCode = 'adoption-handoff-expired') => {
67
68
  if (plan.status === 'rollback-pending')
68
69
  return finishRollback(plan);
69
70
  if (!exposed(plan) || plan.activation === undefined)
70
71
  return plan;
71
72
  await current();
72
73
  const rollback = options.store.requestActivationRollback({ planId: plan.id, expectedRevision: plan.revision,
73
- fence: plan.activation.fence, failureCode: 'adoption-handoff-expired' });
74
+ fence: plan.activation.fence, failureCode });
74
75
  return finishRollback(rollback);
75
76
  };
76
77
  for (let phase = 0; phase < 16; phase++) {
@@ -93,6 +94,9 @@ export async function coordinateAdoptionHandoff(options) {
93
94
  throw error;
94
95
  }
95
96
  await current();
97
+ const liveDeadline = options.store.getLiveQualificationDeadline(plan.id);
98
+ if (liveDeadline !== undefined && liveDeadline <= Date.now())
99
+ return recoverExpired(plan, 'live-qualification-expired');
96
100
  const before = { status: plan.status, revision: plan.revision, fence: plan.activation?.fence };
97
101
  if (plan.status === 'approved' || plan.status === 'staging') {
98
102
  options.store.assertAdoptionHandoff(plan.id);
@@ -161,14 +165,16 @@ export class AdoptionCoordinatorRuntime {
161
165
  throw error;
162
166
  }
163
167
  }
164
- close() {
168
+ close(options = {}) {
165
169
  return this.closing ??= (async () => {
166
170
  this.active = false;
167
171
  try {
168
- const registration = this.options.automations.inspectSystemOwnedActivation({ owner: OWNER, automationId: this.automationId });
169
- if (registration?.activationNonce === this.activationNonce)
170
- this.options.automations.reconcileSystem({ owner: OWNER,
171
- automationId: this.automationId, idempotencyKey: `${this.automationId}:${this.generation}:pause`, desiredStatus: 'paused', definition: this.definition() });
172
+ if (!options.skipPause) {
173
+ const registration = this.options.automations.inspectSystemOwnedActivation({ owner: OWNER, automationId: this.automationId });
174
+ if (registration?.activationNonce === this.activationNonce)
175
+ this.options.automations.reconcileSystem({ owner: OWNER,
176
+ automationId: this.automationId, idempotencyKey: `${this.automationId}:${this.generation}:pause`, desiredStatus: 'paused', definition: this.definition() });
177
+ }
172
178
  }
173
179
  finally {
174
180
  this.abort.abort();
@@ -221,8 +227,17 @@ export class AdoptionCoordinatorRuntime {
221
227
  }
222
228
  const signal = AbortSignal.any([this.abort.signal, input.signal, AbortSignal.timeout(this.options.config.timeoutMs)]);
223
229
  this.current(signal);
230
+ const epochs = this.options.store.pendingRuntimeEpochs(this.options.config.coordinatorId);
224
231
  const handoffs = this.handoffs();
225
- if (handoffs.length) {
232
+ // Runtime continuity uses the same native Automation budget and lifetime as adoption.
233
+ if (epochs.length && (this.cursor++ % 2 === 0 || !handoffs.length)) {
234
+ const epoch = this.options.store.claimRuntimeEpoch(epochs[0].request.operationId, this.options.config.coordinatorId);
235
+ began = true;
236
+ const receipt = await invokeConfiguredRuntimeEpochAttestor(this.options.trust, epoch.request, signal);
237
+ this.current(signal);
238
+ this.options.store.applyRuntimeEpoch(receipt, this.options.trust);
239
+ }
240
+ else if (handoffs.length) {
226
241
  const handoff = handoffs[this.cursor++ % handoffs.length];
227
242
  began = true;
228
243
  await coordinateAdoptionHandoff({ store: this.options.store, trust: this.options.trust, planId: handoff.planId, signal,
@@ -1 +1 @@
1
- {"version":3,"file":"adoption-coordinator.js","sourceRoot":"","sources":["../src/adoption-coordinator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adoption-coordinator.js","sourceRoot":"","sources":["../src/adoption-coordinator.ts"],"names":[],"mappings":"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"}
package/lib/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,iBAAiB,EAA6C,MAAM,YAAY,CAAA;AAGzF,OAAO,EAAsB,qBAAqB,EAA+F,MAAM,uBAAuB,CAAA;AAC9K,OAAO,EACuB,KAAK,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAC/E,OAAO,KAAK,EACE,oBAAoB,EAC2F,MAAM,YAAY,CAAA;AAwB/I,OAAO,EAAE,qBAAqB,EAAE,CAAA;AA8uBhC;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,wBAAwB,CAAC;IAC3G,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA2BvE;AAuCD,wBAAsB,kBAAkB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,wBAAwB,CAAC;IAC1G,MAAM,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAkFjG;AA0FD,wBAAsB,eAAe,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,wBAAwB,CAAC;IACvG,MAAM,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAE/I;AAqWD,wBAAsB,gBAAgB,CAAC,IAAI,WAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmClF"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,iBAAiB,EAA6C,MAAM,YAAY,CAAA;AAGzF,OAAO,EAAsB,qBAAqB,EAA+F,MAAM,uBAAuB,CAAA;AAC9K,OAAO,EACuB,KAAK,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAC/E,OAAO,KAAK,EACE,oBAAoB,EAC2F,MAAM,YAAY,CAAA;AAwB/I,OAAO,EAAE,qBAAqB,EAAE,CAAA;AA+uBhC;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,wBAAwB,CAAC;IAC3G,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA2BvE;AAuCD,wBAAsB,kBAAkB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,wBAAwB,CAAC;IAC1G,MAAM,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAkGjG;AA0FD,wBAAsB,eAAe,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,wBAAwB,CAAC;IACvG,MAAM,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAE/I;AAqWD,wBAAsB,gBAAgB,CAAC,IAAI,WAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmClF"}