@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
@@ -0,0 +1,164 @@
1
+ import { createPublicKey, verify } from 'node:crypto';
2
+ import { isAbsolute, resolve } from 'node:path';
3
+ import { controlPlaneDigest, ControlPlaneStoreError } from './store.js';
4
+ const ID = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,159}$/u;
5
+ const DIGEST = /^[a-f0-9]{64}$/u;
6
+ const SIGNATURE = /^[A-Za-z0-9+/]+={0,2}$/u;
7
+ const FIELDS = ['schemaVersion', 'kind', 'id', 'digest', 'lane', 'configDigest', 'trustDigest', 'planId', 'planDigest',
8
+ 'installationId', 'profilePath', 'owner', 'terms', 'activationId', 'fence', 'startedAt', 'deadlineAt',
9
+ 'readinessDigest', 'hostGeneration', 'votes', 'createdAt', 'expiresAt'];
10
+ const RECEIPT_FIELDS = ['schemaVersion', 'kind', 'receiptId', 'authority', 'keyId', 'batchId', 'batchDigest',
11
+ 'planId', 'planDigest', 'activationId', 'fence', 'hostGeneration', 'disposition', 'observedAt', 'expiresAt', 'signature'];
12
+ function fail(message) { throw new ControlPlaneStoreError('invalid-input', message); }
13
+ function object(value) {
14
+ if (!value || typeof value !== 'object' || Array.isArray(value))
15
+ fail('live qualification object is invalid');
16
+ return value;
17
+ }
18
+ function exact(value, fields) {
19
+ if (Object.keys(value).sort().join('\0') !== [...fields].sort().join('\0'))
20
+ fail('live qualification fields differ');
21
+ }
22
+ function integer(value, minimum, maximum = Number.MAX_SAFE_INTEGER) {
23
+ return Number.isSafeInteger(value) && Number(value) >= minimum && Number(value) <= maximum;
24
+ }
25
+ function text(value) {
26
+ return typeof value === 'string' && value.length > 0 && Buffer.byteLength(value) <= 4096
27
+ && value.normalize('NFC').trim() === value && !/[\p{Cc}]/u.test(value);
28
+ }
29
+ function path(value) { return text(value) && isAbsolute(value) && resolve(value) === value; }
30
+ function owner(value) {
31
+ const item = object(value);
32
+ exact(item, ['authorityId', 'authorityHash', 'principalId', 'principalRecordId', 'principalVersion', 'workspace', 'agentPreset']);
33
+ return [item.authorityId, item.principalId, item.principalRecordId, item.agentPreset].every(text)
34
+ && typeof item.authorityHash === 'string' && DIGEST.test(item.authorityHash)
35
+ && path(item.workspace) && integer(item.principalVersion, 1);
36
+ }
37
+ export function validateLiveQualificationTerms(value) {
38
+ const item = object(value);
39
+ exact(item, ['protocol', 'maximumWindowMs', 'minimumTasks', 'authority', 'keyId']);
40
+ if (item.protocol !== 'dsh-bounded-live/v1' || !integer(item.maximumWindowMs, 60_000, 86_400_000)
41
+ || !integer(item.minimumTasks, 1, 32) || typeof item.authority !== 'string' || !ID.test(item.authority)
42
+ || typeof item.keyId !== 'string' || !ID.test(item.keyId))
43
+ fail('live qualification terms are invalid');
44
+ }
45
+ /** Content identity excludes the creation clock, as with task observation. */
46
+ export function liveQualificationId(batch) {
47
+ return `live-qualification-${controlPlaneDigest({ lane: batch.lane, configDigest: batch.configDigest,
48
+ trustDigest: batch.trustDigest, planId: batch.planId, planDigest: batch.planDigest,
49
+ installationId: batch.installationId, profilePath: batch.profilePath, owner: batch.owner, terms: batch.terms,
50
+ activationId: batch.activationId, fence: batch.fence, startedAt: batch.startedAt,
51
+ deadlineAt: batch.deadlineAt, readinessDigest: batch.readinessDigest,
52
+ hostGeneration: batch.hostGeneration, votes: batch.votes })}`;
53
+ }
54
+ export function liveQualificationDigest(batch) {
55
+ const { digest: _digest, ...unsigned } = batch;
56
+ return controlPlaneDigest(unsigned);
57
+ }
58
+ export function assertLiveQualificationBatch(value) {
59
+ const item = object(value);
60
+ exact(item, FIELDS);
61
+ validateLiveQualificationTerms(item.terms);
62
+ const batch = item;
63
+ if (batch.schemaVersion !== 1 || batch.kind !== 'dsh-live-qualification'
64
+ || !/^live-qualification-[a-f0-9]{64}$/u.test(batch.id) || !DIGEST.test(batch.digest)
65
+ || !DIGEST.test(batch.lane) || !DIGEST.test(batch.configDigest) || !DIGEST.test(batch.trustDigest)
66
+ || !ID.test(batch.planId) || !DIGEST.test(batch.planDigest) || !text(batch.installationId)
67
+ || !path(batch.profilePath) || !owner(batch.owner) || !ID.test(batch.activationId)
68
+ || !integer(batch.fence, 1) || !integer(batch.startedAt, 1) || !integer(batch.deadlineAt, batch.startedAt + 1)
69
+ || batch.deadlineAt - batch.startedAt > batch.terms.maximumWindowMs || !DIGEST.test(batch.readinessDigest)
70
+ || !integer(batch.hostGeneration, 1) || !Array.isArray(batch.votes)
71
+ || !integer(batch.createdAt, batch.startedAt, batch.deadlineAt - 1)
72
+ || !integer(batch.expiresAt, batch.createdAt + 1)
73
+ || Buffer.byteLength(JSON.stringify(batch)) > 262_144)
74
+ fail('live qualification batch is invalid');
75
+ const seen = new Set();
76
+ for (const vote of batch.votes) {
77
+ if (!vote || !text(vote.inboxId) || !text(vote.outcomeId) || !DIGEST.test(vote.sourceDigest)
78
+ || !DIGEST.test(vote.deploymentDigest) || !['achieved', 'not-achieved'].includes(vote.status)
79
+ || !integer(vote.completedAt, batch.startedAt, Math.min(batch.createdAt, batch.deadlineAt - 1))
80
+ || !vote.projection || vote.projection.subjectKind !== 'foreground-turn'
81
+ || vote.projection.subjectRef !== vote.inboxId || vote.projection.disposition !== 'upsert'
82
+ || !integer(vote.projection.version, 1) || !DIGEST.test(vote.projection.digest)
83
+ || seen.has(vote.inboxId))
84
+ fail('live qualification vote is invalid');
85
+ seen.add(vote.inboxId);
86
+ }
87
+ const failed = batch.votes.some(vote => vote.status === 'not-achieved');
88
+ if (failed ? batch.votes.length < 1 : batch.votes.length < batch.terms.minimumTasks) {
89
+ fail('live qualification lacks the required task or failure evidence');
90
+ }
91
+ if (batch.id !== liveQualificationId(batch) || batch.digest !== liveQualificationDigest(batch))
92
+ fail('live qualification digest differs');
93
+ }
94
+ function receiptIdentity(receipt) {
95
+ return `live-qualification-receipt-${controlPlaneDigest(receipt)}`;
96
+ }
97
+ export function parseLiveQualificationReceipt(value) {
98
+ const item = object(value);
99
+ exact(item, RECEIPT_FIELDS);
100
+ const receipt = item;
101
+ if (receipt.schemaVersion !== 1 || receipt.kind !== 'dsh-live-qualification-receipt'
102
+ || !/^live-qualification-receipt-[a-f0-9]{64}$/u.test(receipt.receiptId)
103
+ || !ID.test(receipt.authority) || !ID.test(receipt.keyId)
104
+ || !/^live-qualification-[a-f0-9]{64}$/u.test(receipt.batchId) || !DIGEST.test(receipt.batchDigest)
105
+ || !ID.test(receipt.planId) || !DIGEST.test(receipt.planDigest) || !ID.test(receipt.activationId)
106
+ || !integer(receipt.fence, 1) || !integer(receipt.hostGeneration, 1)
107
+ || !['qualified', 'failed'].includes(receipt.disposition)
108
+ || !integer(receipt.observedAt, 1) || !integer(receipt.expiresAt, receipt.observedAt + 1)
109
+ || typeof receipt.signature !== 'string' || receipt.signature.length > 512
110
+ || !SIGNATURE.test(receipt.signature)
111
+ || Buffer.byteLength(JSON.stringify(receipt)) > 16_384)
112
+ fail('live qualification receipt is invalid');
113
+ const { receiptId: _receiptId, signature: _signature, ...identity } = receipt;
114
+ if (receipt.receiptId !== receiptIdentity(identity))
115
+ fail('live qualification receipt identity differs');
116
+ return receipt;
117
+ }
118
+ /** Domain-separated canonical signing payload; never valid as a Host phase receipt. */
119
+ export function liveQualificationSigningPayload(receipt) {
120
+ const { receiptId: _receiptId, ...identity } = receipt;
121
+ if (receipt.receiptId !== receiptIdentity(identity))
122
+ fail('live qualification receipt identity differs');
123
+ return `dsh-bounded-live/v1\n${controlPlaneCanonical(receipt)}`;
124
+ }
125
+ function controlPlaneCanonical(value) {
126
+ if (Array.isArray(value))
127
+ return `[${value.map(controlPlaneCanonical).join(',')}]`;
128
+ if (value !== null && typeof value === 'object')
129
+ return `{${Object.entries(value).sort(([a], [b]) => a.localeCompare(b))
130
+ .map(([key, part]) => `${JSON.stringify(key)}:${controlPlaneCanonical(part)}`).join(',')}}`;
131
+ return JSON.stringify(value);
132
+ }
133
+ export function verifyLiveQualificationReceipt(receiptInput, batchInput, publicKeyPem, now = Date.now()) {
134
+ assertLiveQualificationBatch(batchInput);
135
+ const batch = batchInput;
136
+ const receipt = parseLiveQualificationReceipt(receiptInput);
137
+ const failed = batch.votes.some(vote => vote.status === 'not-achieved');
138
+ if (receipt.authority !== batch.terms.authority || receipt.keyId !== batch.terms.keyId
139
+ || receipt.batchId !== batch.id || receipt.batchDigest !== batch.digest || receipt.planId !== batch.planId
140
+ || receipt.planDigest !== batch.planDigest || receipt.activationId !== batch.activationId
141
+ || receipt.fence !== batch.fence || receipt.hostGeneration !== batch.hostGeneration
142
+ || receipt.disposition !== (failed ? 'failed' : 'qualified')
143
+ || receipt.observedAt < batch.createdAt || receipt.observedAt >= batch.deadlineAt
144
+ || receipt.observedAt > now || now >= receipt.expiresAt
145
+ || receipt.expiresAt > batch.expiresAt || !integer(now, 1))
146
+ fail('live qualification receipt context differs');
147
+ const { signature, ...unsigned } = receipt;
148
+ let key;
149
+ try {
150
+ key = createPublicKey(publicKeyPem);
151
+ }
152
+ catch {
153
+ return fail('live qualification public key is invalid');
154
+ }
155
+ if (key.asymmetricKeyType !== 'ed25519' || !verify(null, Buffer.from(liveQualificationSigningPayload(unsigned)), key, Buffer.from(signature, 'base64'))) {
156
+ fail('live qualification signature is invalid');
157
+ }
158
+ return receipt;
159
+ }
160
+ /** Shared exact identity constructor for the independent authority. */
161
+ export function liveQualificationReceiptId(receipt) {
162
+ return receiptIdentity(receipt);
163
+ }
164
+ //# sourceMappingURL=live-qualification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-qualification.js","sourceRoot":"","sources":["../src/live-qualification.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,8 @@ export declare class OwnerTaskFailureGaps {
18
18
  record(source: OwnerForegroundLearningTask): import("./types.js").StoredCapabilityGap;
19
19
  /** Private Host snapshot; objective and actual model never enter the public gap. */
20
20
  snapshot(gapId: string, owner: SourceJobOwnerReceipt): OwnerForegroundLearningTask;
21
+ /** Read-only part of a combined Host acceptance fence; caller owns the Evaluation writer lock. */
22
+ inspectCurrent(gapId: string, owner: SourceJobOwnerReceipt): OwnerForegroundLearningTask;
21
23
  withCurrent<T>(gapId: string, owner: SourceJobCaller | SourceJobOwnerReceipt | undefined, callback: () => T): T;
22
24
  }
23
25
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"owner-task-gaps.d.ts","sourceRoot":"","sources":["../src/owner-task-gaps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAA;AAC7G,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAA;AACpF,OAAO,EAAsB,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAElE,KAAK,KAAK,GAAG;IACX,QAAQ,EAAE,IAAI,CAAC,wBAAwB,EAAE,oCAAoC,CAAC,CAAA;IAC9E,UAAU,EAAE,IAAI,CAAC,0BAA0B,EAAE,oBAAoB,GAAG,qCAAqC,CAAC,CAAA;CAC3G,CAAA;AAED,6EAA6E;AAC7E,qBAAa,oBAAoB;IACnB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAAqB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAhD,KAAK,EAAE,iBAAiB,EAAmB,KAAK,EAAE,MAAM,KAAK;IAE1F,OAAO,CAAC,SAAS;IAcjB,OAAO,CAAC,IAAI;IAUZ,OAAO,CAAC,KAAK;IAeb,MAAM,CAAC,MAAM,EAAE,2BAA2B;IAK1C,oFAAoF;IACpF,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,GAAG,2BAA2B;IAMlF,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,qBAAqB,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC;CAahH"}
1
+ {"version":3,"file":"owner-task-gaps.d.ts","sourceRoot":"","sources":["../src/owner-task-gaps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAA;AAC7G,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAA;AAEpF,OAAO,EAAsB,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAElE,KAAK,KAAK,GAAG;IACX,QAAQ,EAAE,IAAI,CAAC,wBAAwB,EAAE,oCAAoC,CAAC,CAAA;IAC9E,UAAU,EAAE,IAAI,CAAC,0BAA0B,EAAE,oBAAoB,GAAG,qCAAqC,CAAC,CAAA;CAC3G,CAAA;AAED,6EAA6E;AAC7E,qBAAa,oBAAoB;IACnB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAAqB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAhD,KAAK,EAAE,iBAAiB,EAAmB,KAAK,EAAE,MAAM,KAAK;IAE1F,OAAO,CAAC,SAAS;IAcjB,OAAO,CAAC,IAAI;IAUZ,OAAO,CAAC,KAAK;IAeb,MAAM,CAAC,MAAM,EAAE,2BAA2B;IAK1C,oFAAoF;IACpF,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,GAAG,2BAA2B;IAMlF,kGAAkG;IAClG,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,GAAG,2BAA2B;IAMxF,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,qBAAqB,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC;CAahH"}
@@ -1,3 +1,4 @@
1
+ import { isSourceOwnerContinuation } from '@dsh-enhanced/assistant-growth-contract';
1
2
  import { controlPlaneDigest } from './store.js';
2
3
  /** Host-only bridge. A caller's source is an expectation, never evidence. */
3
4
  export class OwnerTaskFailureGaps {
@@ -56,13 +57,20 @@ export class OwnerTaskFailureGaps {
56
57
  throw new Error('task repair source unavailable');
57
58
  return this.withCurrent(gapId, owner, () => structuredClone(this.read(reference, this.ports())));
58
59
  }
60
+ /** Read-only part of a combined Host acceptance fence; caller owns the Evaluation writer lock. */
61
+ inspectCurrent(gapId, owner) {
62
+ const reference = this.store.getOwnerTaskFailureReference(gapId);
63
+ if (!reference || controlPlaneDigest(reference.owner) !== controlPlaneDigest(owner))
64
+ throw new Error('task repair source owner changed');
65
+ return this.read(reference, this.ports());
66
+ }
59
67
  withCurrent(gapId, owner, callback) {
60
68
  const reference = this.store.getOwnerTaskFailureReference(gapId);
61
69
  if (!reference)
62
70
  return callback();
63
71
  const expected = reference.owner;
64
72
  if (!owner || ('receiptVersion' in owner
65
- ? controlPlaneDigest(owner) !== controlPlaneDigest(expected)
73
+ ? !isSourceOwnerContinuation(owner, expected)
66
74
  : owner.ownerRouteId !== expected.authorityId || owner.principalId !== expected.principalId
67
75
  || owner.principalRecordId !== expected.principalRecordId || owner.principalVersion !== expected.principalVersion
68
76
  || owner.workspace !== expected.workspace || owner.preset !== expected.agentPreset)) {
@@ -1 +1 @@
1
- {"version":3,"file":"owner-task-gaps.js","sourceRoot":"","sources":["../src/owner-task-gaps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"owner-task-gaps.js","sourceRoot":"","sources":["../src/owner-task-gaps.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAA;AACnF,OAAO,EAAE,kBAAkB,EAA0B,MAAM,YAAY,CAAA;AAUvE,6EAA6E;AAC7E,MAAM,OAAO,oBAAoB;IACF;IAA2C;IAAxE,YAA6B,KAAwB,EAAmB,KAAkB;QAA7D,UAAK,GAAL,KAAK,CAAmB;QAAmB,UAAK,GAAL,KAAK,CAAa;IAAG,CAAC;IAEtF,SAAS,CAAC,MAAmC;QACnD,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAA;QAC9C,IAAI,MAAM,CAAC,QAAQ,KAAK,iDAAiD;eACpE,CAAC,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;eACtE,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,KAAK,cAAc;eACrD,UAAU,CAAC,WAAW,KAAK,iBAAiB,IAAI,UAAU,CAAC,WAAW,KAAK,QAAQ;eACnF,MAAM,CAAC,MAAM,CAAC,OAAO,KAAK,UAAU,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS;eACtG,MAAM,CAAC,aAAa,EAAE,MAAM,KAAK,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAA;QAC9H,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,gBAAgB;YAC1F,UAAU,EAAE,EAAE,GAAG,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,WAAW,EAAE,QAAQ,EAAE;YACpF,YAAY,EAAE,kBAAkB,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM;gBACjF,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,EAAE,CAAA;IAC3E,CAAC;IAEO,IAAI,CAAC,SAAoC,EAAE,KAAY;QAC7D,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAA;QAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,kCAAkC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW;YAChG,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,CAAA;QAC/H,IAAI,CAAC,OAAO,IAAI,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9F,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;QACxD,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAEO,KAAK,CAAI,SAAoC,EAAE,QAAiB;QACtE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAA;QAC5H,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,mCAAmC,CAAC,EAAE,KAAK;YACzE,cAAc,EAAE,OAAO,CAAC,SAAS,CAAC,cAAc,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE;YACnG,0EAA0E;YAC1E,gEAAgE;YAChE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;YAC3B,OAAO,QAAQ,EAAE,CAAA;QACnB,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;QAClF,OAAO,MAAM,CAAC,KAAK,CAAA;IACrB,CAAC;IAED,MAAM,CAAC,MAAmC;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;QACxC,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAC,CAAA;IACrF,CAAC;IAED,oFAAoF;IACpF,QAAQ,CAAC,KAAa,EAAE,KAA4B;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAA;QAChE,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;QACjE,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;IAClG,CAAC;IAED,kGAAkG;IAClG,cAAc,CAAC,KAAa,EAAE,KAA4B;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAA;QAChE,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,kBAAkB,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;QACxI,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;IAC3C,CAAC;IAED,WAAW,CAAI,KAAa,EAAE,KAA0D,EAAE,QAAiB;QACzG,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAA;QAChE,IAAI,CAAC,SAAS;YAAE,OAAO,QAAQ,EAAE,CAAA;QACjC,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAA;QAChC,IAAI,CAAC,KAAK,IAAI,CAAC,gBAAgB,IAAI,KAAK;YACtC,CAAC,CAAC,CAAC,yBAAyB,CAAC,KAAK,EAAE,QAAQ,CAAC;YAC7C,CAAC,CAAC,KAAK,CAAC,YAAY,KAAK,QAAQ,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,KAAK,QAAQ,CAAC,WAAW;mBACtF,KAAK,CAAC,iBAAiB,KAAK,QAAQ,CAAC,iBAAiB,IAAI,KAAK,CAAC,gBAAgB,KAAK,QAAQ,CAAC,gBAAgB;mBAC9G,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACxF,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;QAClE,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,gCAAgC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAA;IAClG,CAAC;CACF"}
@@ -0,0 +1,69 @@
1
+ import type { PluginControlTrustConfig } from './trust.js';
2
+ import type { HostAttestationRequest } from './types.js';
3
+ export interface RuntimeEpochRequest {
4
+ schemaVersion: 1;
5
+ kind: 'dsh-runtime-epoch-request';
6
+ operationId: string;
7
+ requestedAt: number;
8
+ receiptTtlMs: number;
9
+ installationId: string;
10
+ ledger: {
11
+ id: string;
12
+ path: string;
13
+ };
14
+ plan: {
15
+ id: string;
16
+ digest: string;
17
+ };
18
+ activation: {
19
+ id: string;
20
+ fence: number;
21
+ };
22
+ profile: {
23
+ name: string;
24
+ path: string;
25
+ };
26
+ issuer: Extract<HostAttestationRequest['issuer'], {
27
+ mode: 'configured-executable';
28
+ }>;
29
+ predecessor: {
30
+ operationId: string;
31
+ receiptDigest: string;
32
+ hostGeneration: number;
33
+ };
34
+ sequence: number;
35
+ runtimeIdentityDigest: string;
36
+ }
37
+ export interface RuntimeEpochReceipt {
38
+ schemaVersion: 1;
39
+ kind: 'dsh-runtime-epoch-receipt';
40
+ receiptId: string;
41
+ operationId: string;
42
+ requestDigest: string;
43
+ installationId: string;
44
+ planId: string;
45
+ planDigest: string;
46
+ activationId: string;
47
+ fence: number;
48
+ hostGeneration: number;
49
+ sequence: number;
50
+ runtimeIdentityDigest: string;
51
+ authority: string;
52
+ keyId: string;
53
+ outcome: 'passed' | 'failed';
54
+ observedAt: number;
55
+ expiresAt: number;
56
+ evidence: {
57
+ checks: number;
58
+ failures: number;
59
+ probeDigest: string;
60
+ };
61
+ signature: string;
62
+ }
63
+ export declare function parseRuntimeEpochRequest(value: unknown): RuntimeEpochRequest;
64
+ export declare function parseRuntimeEpochReceipt(value: unknown): RuntimeEpochReceipt;
65
+ export declare function runtimeEpochRequestDigest(request: RuntimeEpochRequest): string;
66
+ export declare function runtimeEpochIdentityDigest(observation: Record<string, unknown>): string;
67
+ export declare function runtimeEpochSigningPayload(receipt: Omit<RuntimeEpochReceipt, 'signature'>): string;
68
+ export declare function verifyRuntimeEpochReceipt(receiptInput: unknown, requestInput: unknown, trust: Pick<PluginControlTrustConfig, 'installationId' | 'hostAttestationKeys'>, now?: number): RuntimeEpochReceipt;
69
+ //# sourceMappingURL=runtime-epoch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-epoch.d.ts","sourceRoot":"","sources":["../src/runtime-epoch.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAC1D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAMxD,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,CAAC,CAAA;IAChB,IAAI,EAAE,2BAA2B,CAAA;IACjC,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACpC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IACpC,UAAU,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IACzC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACvC,MAAM,EAAE,OAAO,CAAC,sBAAsB,CAAC,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,uBAAuB,CAAA;KAAE,CAAC,CAAA;IACpF,WAAW,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAA;IACnF,QAAQ,EAAE,MAAM,CAAA;IAChB,qBAAqB,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,CAAC,CAAA;IAChB,IAAI,EAAE,2BAA2B,CAAA;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC5B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAA;IACnE,SAAS,EAAE,MAAM,CAAA;CAClB;AAkCD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAkC5E;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAyB5E;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAAqD;AACpI,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAGvF;AACD,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,WAAW,CAAC,GAAG,MAAM,CAA8B;AAEjI,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EACpF,KAAK,EAAE,IAAI,CAAC,wBAAwB,EAAE,gBAAgB,GAAG,qBAAqB,CAAC,EAAE,GAAG,SAAa,GAAG,mBAAmB,CAmBxH"}
@@ -0,0 +1,139 @@
1
+ import { createHash, createPublicKey, verify } from 'node:crypto';
2
+ import { isAbsolute, resolve } from 'node:path';
3
+ import { ControlPlaneStoreError } from './store.js';
4
+ const ID = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,159}$/u;
5
+ const DIGEST = /^[a-f0-9]{64}$/u;
6
+ const UUID = /^[a-f0-9]{8}-[a-f0-9]{4}-[1-8][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/u;
7
+ function invalid(message) { throw new ControlPlaneStoreError('invalid-input', `runtime epoch: ${message}`); }
8
+ function conflict(message) { throw new ControlPlaneStoreError('conflict', `runtime epoch: ${message}`); }
9
+ function canonical(value) {
10
+ if (Array.isArray(value))
11
+ return `[${value.map(canonical).join(',')}]`;
12
+ if (value !== null && typeof value === 'object')
13
+ return `{${Object.entries(value)
14
+ .filter(([, item]) => item !== undefined).sort(([a], [b]) => a.localeCompare(b))
15
+ .map(([key, item]) => `${JSON.stringify(key)}:${canonical(item)}`).join(',')}}`;
16
+ return JSON.stringify(value);
17
+ }
18
+ function digest(value) { return createHash('sha256').update(canonical(value)).digest('hex'); }
19
+ function record(value, fields, label) {
20
+ if (value === null || typeof value !== 'object' || Array.isArray(value)
21
+ || Object.keys(value).sort().join('\0') !== [...fields].sort().join('\0'))
22
+ invalid(`${label} fields are invalid`);
23
+ return value;
24
+ }
25
+ function text(value, label, pattern = ID) {
26
+ if (typeof value !== 'string' || !pattern.test(value))
27
+ invalid(`${label} is invalid`);
28
+ return value;
29
+ }
30
+ function integer(value, label, min = 0, max = Number.MAX_SAFE_INTEGER) {
31
+ if (!Number.isSafeInteger(value) || Number(value) < min || Number(value) > max)
32
+ invalid(`${label} is invalid`);
33
+ return Number(value);
34
+ }
35
+ function path(value, label) {
36
+ if (typeof value !== 'string' || !isAbsolute(value) || resolve(value) !== value || value === '/')
37
+ invalid(`${label} is invalid`);
38
+ return value;
39
+ }
40
+ function pin(value, label) {
41
+ const item = record(value, ['path', 'sha256'], label);
42
+ return { path: path(item.path, `${label} path`), sha256: text(item.sha256, `${label} digest`, DIGEST) };
43
+ }
44
+ export function parseRuntimeEpochRequest(value) {
45
+ const item = record(value, ['schemaVersion', 'kind', 'operationId', 'requestedAt', 'receiptTtlMs', 'installationId',
46
+ 'ledger', 'plan', 'activation', 'profile', 'issuer', 'predecessor', 'sequence', 'runtimeIdentityDigest'], 'request');
47
+ if (item.schemaVersion !== 1 || item.kind !== 'dsh-runtime-epoch-request')
48
+ invalid('request version or kind is invalid');
49
+ const ledger = record(item.ledger, ['id', 'path'], 'ledger');
50
+ const plan = record(item.plan, ['id', 'digest'], 'plan');
51
+ const activation = record(item.activation, ['id', 'fence'], 'activation');
52
+ const profile = record(item.profile, ['name', 'path'], 'profile');
53
+ const issuer = record(item.issuer, ['mode', 'id', 'version', 'path', 'sha256', 'interpreter', 'authority', 'keyId'], 'issuer');
54
+ if (issuer.mode !== 'configured-executable')
55
+ invalid('configured issuer is required');
56
+ const predecessor = record(item.predecessor, ['operationId', 'receiptDigest', 'hostGeneration'], 'predecessor');
57
+ const operationId = text(item.operationId, 'operationId');
58
+ if (operationId.length > 152 || predecessor.operationId === operationId)
59
+ invalid('operation lineage is invalid');
60
+ const profileName = text(profile.name, 'profile name', /^[a-z0-9][a-z0-9-]{0,63}$/u);
61
+ const profilePath = path(profile.path, 'profile path');
62
+ if (profilePath.split('/').at(-1) !== profileName || profilePath.split('/').at(-2) !== 'profiles')
63
+ invalid('profile path differs from name');
64
+ return {
65
+ schemaVersion: 1, kind: 'dsh-runtime-epoch-request', operationId,
66
+ requestedAt: integer(item.requestedAt, 'requestedAt'), receiptTtlMs: integer(item.receiptTtlMs, 'receiptTtlMs', 1, 3_600_000),
67
+ installationId: text(item.installationId, 'installationId', UUID),
68
+ ledger: { id: text(ledger.id, 'ledger id'), path: path(ledger.path, 'ledger path') },
69
+ plan: { id: text(plan.id, 'plan id'), digest: text(plan.digest, 'plan digest', DIGEST) },
70
+ activation: { id: text(activation.id, 'activation id'), fence: integer(activation.fence, 'activation fence', 1) },
71
+ profile: { name: profileName, path: profilePath },
72
+ issuer: { mode: 'configured-executable', id: text(issuer.id, 'issuer id'), version: text(issuer.version, 'issuer version', /^[A-Za-z0-9][A-Za-z0-9._+-]{0,63}$/u),
73
+ ...pin({ path: issuer.path, sha256: issuer.sha256 }, 'issuer'),
74
+ interpreter: issuer.interpreter === null ? null : pin(issuer.interpreter, 'issuer interpreter'),
75
+ authority: text(issuer.authority, 'issuer authority'), keyId: text(issuer.keyId, 'issuer keyId') },
76
+ predecessor: { operationId: text(predecessor.operationId, 'predecessor operation'),
77
+ receiptDigest: text(predecessor.receiptDigest, 'predecessor digest', DIGEST),
78
+ hostGeneration: integer(predecessor.hostGeneration, 'predecessor generation', 1) },
79
+ sequence: integer(item.sequence, 'sequence', 1),
80
+ runtimeIdentityDigest: text(item.runtimeIdentityDigest, 'runtime identity digest', DIGEST),
81
+ };
82
+ }
83
+ export function parseRuntimeEpochReceipt(value) {
84
+ const item = record(value, ['schemaVersion', 'kind', 'receiptId', 'operationId', 'requestDigest', 'installationId',
85
+ 'planId', 'planDigest', 'activationId', 'fence', 'hostGeneration', 'sequence', 'runtimeIdentityDigest',
86
+ 'authority', 'keyId', 'outcome', 'observedAt', 'expiresAt', 'evidence', 'signature'], 'receipt');
87
+ if (item.schemaVersion !== 1 || item.kind !== 'dsh-runtime-epoch-receipt'
88
+ || (item.outcome !== 'passed' && item.outcome !== 'failed'))
89
+ invalid('receipt version, kind or outcome is invalid');
90
+ const evidence = record(item.evidence, ['checks', 'failures', 'probeDigest'], 'evidence');
91
+ const checks = integer(evidence.checks, 'checks', 2, 256);
92
+ const failures = integer(evidence.failures, 'failures', 0, checks);
93
+ const signature = text(item.signature, 'signature', /^[A-Za-z0-9+/]+={0,2}$/u);
94
+ if (Buffer.from(signature, 'base64').length !== 64 || Buffer.from(signature, 'base64').toString('base64') !== signature)
95
+ invalid('signature encoding is invalid');
96
+ const receipt = {
97
+ schemaVersion: 1, kind: 'dsh-runtime-epoch-receipt', receiptId: text(item.receiptId, 'receiptId'),
98
+ operationId: text(item.operationId, 'operationId'), requestDigest: text(item.requestDigest, 'requestDigest', DIGEST),
99
+ installationId: text(item.installationId, 'installationId', UUID), planId: text(item.planId, 'planId'),
100
+ planDigest: text(item.planDigest, 'planDigest', DIGEST), activationId: text(item.activationId, 'activationId'),
101
+ fence: integer(item.fence, 'fence', 1), hostGeneration: integer(item.hostGeneration, 'hostGeneration', 1),
102
+ sequence: integer(item.sequence, 'sequence', 1), runtimeIdentityDigest: text(item.runtimeIdentityDigest, 'runtime identity digest', DIGEST),
103
+ authority: text(item.authority, 'authority'), keyId: text(item.keyId, 'keyId'), outcome: item.outcome,
104
+ observedAt: integer(item.observedAt, 'observedAt'), expiresAt: integer(item.expiresAt, 'expiresAt'),
105
+ evidence: { checks, failures, probeDigest: text(evidence.probeDigest, 'probe digest', DIGEST) }, signature,
106
+ };
107
+ if (receipt.expiresAt <= receipt.observedAt || (receipt.outcome === 'passed' && failures !== 0)
108
+ || (receipt.outcome === 'failed' && failures === 0))
109
+ invalid('receipt interval or evidence is invalid');
110
+ return receipt;
111
+ }
112
+ export function runtimeEpochRequestDigest(request) { return digest(parseRuntimeEpochRequest(request)); }
113
+ export function runtimeEpochIdentityDigest(observation) {
114
+ const { challenge: _challenge, observedAt: _observedAt, ...identity } = observation;
115
+ return digest(identity);
116
+ }
117
+ export function runtimeEpochSigningPayload(receipt) { return canonical(receipt); }
118
+ export function verifyRuntimeEpochReceipt(receiptInput, requestInput, trust, now = Date.now()) {
119
+ const request = parseRuntimeEpochRequest(requestInput);
120
+ const receipt = parseRuntimeEpochReceipt(receiptInput);
121
+ if (receipt.receiptId !== `receipt:${request.operationId}` || receipt.operationId !== request.operationId
122
+ || receipt.requestDigest !== runtimeEpochRequestDigest(request) || receipt.installationId !== request.installationId
123
+ || receipt.installationId !== trust.installationId || receipt.planId !== request.plan.id || receipt.planDigest !== request.plan.digest
124
+ || receipt.activationId !== request.activation.id || receipt.fence !== request.activation.fence
125
+ || receipt.hostGeneration !== request.predecessor.hostGeneration || receipt.sequence !== request.sequence
126
+ || receipt.runtimeIdentityDigest !== request.runtimeIdentityDigest
127
+ || receipt.authority !== request.issuer.authority || receipt.keyId !== request.issuer.keyId)
128
+ conflict('receipt differs from the exact request');
129
+ if (receipt.observedAt < request.requestedAt || receipt.observedAt > now || now > receipt.expiresAt
130
+ || receipt.expiresAt - receipt.observedAt > request.receiptTtlMs) {
131
+ throw new ControlPlaneStoreError('expired', 'runtime epoch receipt is outside its validity interval');
132
+ }
133
+ const key = trust.hostAttestationKeys.find(candidate => candidate.authority === receipt.authority && candidate.keyId === receipt.keyId);
134
+ const { signature: _signature, ...unsigned } = receipt;
135
+ if (!key || !verify(null, Buffer.from(runtimeEpochSigningPayload(unsigned)), createPublicKey(key.publicKeyPem), Buffer.from(receipt.signature, 'base64')))
136
+ invalid('receipt signature or authority is invalid');
137
+ return Object.freeze(receipt);
138
+ }
139
+ //# sourceMappingURL=runtime-epoch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-epoch.js","sourceRoot":"","sources":["../src/runtime-epoch.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-observer.d.ts","sourceRoot":"","sources":["../src/runtime-observer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAc,MAAM,qBAAqB,CAAA;AAEzD,OAAO,EAaL,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAE3B,MAAM,gCAAgC,CAAA;AACvC,OAAO,EACL,6BAA6B,EAC7B,oBAAoB,EACpB,mBAAmB,EACnB,6BAA6B,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,GAC3B,MAAM,gCAAgC,CAAA;AAKvC,yFAAyF;AACzF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,qBAAqB,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,kBAAkB,CAoD3H;AAED,mFAAmF;AACnF,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAC/E,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,kBAAkB,KAAK,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CA6ElH"}
1
+ {"version":3,"file":"runtime-observer.d.ts","sourceRoot":"","sources":["../src/runtime-observer.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAc,MAAM,qBAAqB,CAAA;AAEzD,OAAO,EAaL,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAE3B,MAAM,gCAAgC,CAAA;AACvC,OAAO,EACL,6BAA6B,EAC7B,oBAAoB,EACpB,mBAAmB,EACnB,6BAA6B,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,GAC3B,MAAM,gCAAgC,CAAA;AAKvC,yFAAyF;AACzF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,qBAAqB,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,kBAAkB,CA2E3H;AAED,mFAAmF;AACnF,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAC/E,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,kBAAkB,KAAK,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CA6ElH"}
@@ -1,6 +1,8 @@
1
1
  import { randomUUID } from 'node:crypto';
2
2
  import { chmod, lstat, unlink } from 'node:fs/promises';
3
3
  import { createServer } from 'node:net';
4
+ import { join } from 'node:path';
5
+ import { pathToFileURL } from 'node:url';
4
6
  import { Context } from '@deepseek-ai/cordis';
5
7
  import { RUNTIME_OBSERVER_MAX_BYTES, RUNTIME_OBSERVER_TIMEOUT, assertRuntimeObservation, assertRuntimeObserverPlatform, assertRuntimeObserverExact, assertRuntimeObserverText, equalRuntimeObserverMac, readPrivateRuntimeObserverKey, runtimeConfigDigest, runtimeObserverFail, runtimeObserverMac, validateRuntimeObserverConfig, } from './runtime-observer-protocol.js';
6
8
  export { assertRuntimeObserverPlatform, queryRuntimeObserver, runtimeConfigDigest, validateRuntimeObserverConfig, } from './runtime-observer-protocol.js';
@@ -32,6 +34,43 @@ export function createRuntimeSampler(ctx, config) {
32
34
  }
33
35
  return false;
34
36
  };
37
+ const resolveTarget = (loader, entryId) => {
38
+ let root;
39
+ try {
40
+ root = loader.resolve('include');
41
+ }
42
+ catch {
43
+ root = undefined;
44
+ }
45
+ if (root || loader.builtins.include !== undefined) {
46
+ const rootOptions = root && Object.getOwnPropertyDescriptors(root.options);
47
+ const includeConfig = rootOptions?.config && 'value' in rootOptions.config ? rootOptions.config.value : undefined;
48
+ const path = includeConfig && typeof includeConfig === 'object' && !Array.isArray(includeConfig)
49
+ ? Object.getOwnPropertyDescriptors(includeConfig).path : undefined;
50
+ const localId = entryId.startsWith('include:') ? entryId.slice('include:'.length) : entryId;
51
+ if (!root || !rootOptions?.id || !('value' in rootOptions.id) || rootOptions.id.value !== 'include'
52
+ || root.parent !== loader.root || rootOptions.name?.value !== 'cordis:include'
53
+ || !path || !('value' in path) || path.value !== pathToFileURL(join(config.profilePath, 'cordis.yml')).href
54
+ || !root.subtree || root.subtree.ctx.fiber.entry !== root || !instance(root.fiber)
55
+ || !localId || localId.includes(':'))
56
+ return undefined;
57
+ try {
58
+ const entry = loader.resolve(`include:${localId}`);
59
+ const childId = Object.getOwnPropertyDescriptor(entry.options, 'id');
60
+ return childId && 'value' in childId && childId.value === localId
61
+ && entry.parent === root.subtree.root ? entry : undefined;
62
+ }
63
+ catch {
64
+ return undefined;
65
+ }
66
+ }
67
+ try {
68
+ return loader.resolve(entryId);
69
+ }
70
+ catch {
71
+ return undefined;
72
+ }
73
+ };
35
74
  return challenge => {
36
75
  assertRuntimeObserverText(challenge, /^[a-f0-9]{64}$/u);
37
76
  if (ctx.fiber.uid === null || ctx.fiber.state !== ACTIVE)
@@ -39,11 +78,8 @@ export function createRuntimeSampler(ctx, config) {
39
78
  // Resolve the current injected provider on every sample, never cache a proxy.
40
79
  const loader = ctx.loader;
41
80
  const entries = config.targets.map(target => {
42
- let entry;
43
- try {
44
- entry = loader.resolve(target.entryId);
45
- }
46
- catch {
81
+ const entry = resolveTarget(loader, target.entryId);
82
+ if (!entry) {
47
83
  return { entryId: target.entryId, module: null, configDigest: null, active: false, instance: null, dependencies: [], services: [] };
48
84
  }
49
85
  const fiber = entry.fiber;
@@ -60,7 +96,7 @@ export function createRuntimeSampler(ctx, config) {
60
96
  const impl = realm ? fiber?.ctx.reflect.store[realm] : undefined;
61
97
  return { name, instance: impl && fiber && ownedBy(impl.fiber, fiber) && fiber.ctx.get(name) !== undefined ? instance(impl.fiber) : null };
62
98
  });
63
- return { entryId: entry.id, module, configDigest,
99
+ return { entryId: target.entryId, module, configDigest,
64
100
  active: !entry.disabled && module === target.module && configDigest === target.configDigest
65
101
  && current !== null && current.uid > 0 && dependencies.every(item => item.instance !== null) && services.every(item => item.instance !== null),
66
102
  instance: current, dependencies, services };