@dsh-enhanced/plugin-control-plane 0.1.32 → 0.1.34

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 (199) hide show
  1. package/README.md +352 -4
  2. package/bin/dsh-local-release-adapter.js +80 -16
  3. package/bin/dsh-npm-registry-adapter.js +613 -0
  4. package/bin/dsh-source-adoption-authority.js +12 -0
  5. package/bin/dsh-source-approval-authority.js +16 -0
  6. package/bin/dsh-source-release-authority.js +12 -0
  7. package/bin/dsh-systemd-host-attestor.js +707 -0
  8. package/bin/dsh-task-observation-authority.js +15 -0
  9. package/lib/adapter-process.d.ts +23 -0
  10. package/lib/adapter-process.d.ts.map +1 -0
  11. package/lib/adapter-process.js +305 -0
  12. package/lib/adapter-process.js.map +1 -0
  13. package/lib/adoption-coordinator.d.ts +63 -0
  14. package/lib/adoption-coordinator.d.ts.map +1 -0
  15. package/lib/adoption-coordinator.js +241 -0
  16. package/lib/adoption-coordinator.js.map +1 -0
  17. package/lib/adoption-handoff.d.ts +16 -0
  18. package/lib/adoption-handoff.d.ts.map +1 -0
  19. package/lib/adoption-handoff.js +11 -0
  20. package/lib/adoption-handoff.js.map +1 -0
  21. package/lib/attestation.d.ts.map +1 -1
  22. package/lib/attestation.js +49 -1
  23. package/lib/attestation.js.map +1 -1
  24. package/lib/catalog.d.ts.map +1 -1
  25. package/lib/catalog.js +29 -2
  26. package/lib/catalog.js.map +1 -1
  27. package/lib/cli.d.ts +33 -9
  28. package/lib/cli.d.ts.map +1 -1
  29. package/lib/cli.js +624 -178
  30. package/lib/cli.js.map +1 -1
  31. package/lib/deployment-readiness.d.ts +38 -0
  32. package/lib/deployment-readiness.d.ts.map +1 -0
  33. package/lib/deployment-readiness.js +154 -0
  34. package/lib/deployment-readiness.js.map +1 -0
  35. package/lib/effect-blocked-replay.d.ts +81 -0
  36. package/lib/effect-blocked-replay.d.ts.map +1 -0
  37. package/lib/effect-blocked-replay.js +259 -0
  38. package/lib/effect-blocked-replay.js.map +1 -0
  39. package/lib/errors.d.ts +6 -0
  40. package/lib/errors.d.ts.map +1 -0
  41. package/lib/errors.js +9 -0
  42. package/lib/errors.js.map +1 -0
  43. package/lib/foreground-deployment-runtime.d.ts +20 -0
  44. package/lib/foreground-deployment-runtime.d.ts.map +1 -0
  45. package/lib/foreground-deployment-runtime.js +79 -0
  46. package/lib/foreground-deployment-runtime.js.map +1 -0
  47. package/lib/foreground-deployment.d.ts +17 -0
  48. package/lib/foreground-deployment.d.ts.map +1 -0
  49. package/lib/foreground-deployment.js +43 -0
  50. package/lib/foreground-deployment.js.map +1 -0
  51. package/lib/host-attestor.d.ts +1 -1
  52. package/lib/host-attestor.d.ts.map +1 -1
  53. package/lib/host-attestor.js +51 -57
  54. package/lib/host-attestor.js.map +1 -1
  55. package/lib/index.d.ts +25 -2
  56. package/lib/index.d.ts.map +1 -1
  57. package/lib/index.js +11 -2
  58. package/lib/index.js.map +1 -1
  59. package/lib/npm-publish.d.ts +25 -0
  60. package/lib/npm-publish.d.ts.map +1 -0
  61. package/lib/npm-publish.js +280 -0
  62. package/lib/npm-publish.js.map +1 -0
  63. package/lib/owner-task-gap-types.d.ts +21 -0
  64. package/lib/owner-task-gap-types.d.ts.map +1 -0
  65. package/lib/owner-task-gap-types.js +2 -0
  66. package/lib/owner-task-gap-types.js.map +1 -0
  67. package/lib/owner-task-gaps.d.ts +24 -0
  68. package/lib/owner-task-gaps.d.ts.map +1 -0
  69. package/lib/owner-task-gaps.js +74 -0
  70. package/lib/owner-task-gaps.js.map +1 -0
  71. package/lib/post-activation.d.ts +33 -0
  72. package/lib/post-activation.d.ts.map +1 -0
  73. package/lib/post-activation.js +219 -0
  74. package/lib/post-activation.js.map +1 -0
  75. package/lib/registry-fetch.d.ts +50 -0
  76. package/lib/registry-fetch.d.ts.map +1 -0
  77. package/lib/registry-fetch.js +267 -0
  78. package/lib/registry-fetch.js.map +1 -0
  79. package/lib/release.d.ts +4 -4
  80. package/lib/release.d.ts.map +1 -1
  81. package/lib/release.js +142 -56
  82. package/lib/release.js.map +1 -1
  83. package/lib/replay-endpoint-protocol.d.ts +65 -0
  84. package/lib/replay-endpoint-protocol.d.ts.map +1 -0
  85. package/lib/replay-endpoint-protocol.js +183 -0
  86. package/lib/replay-endpoint-protocol.js.map +1 -0
  87. package/lib/replay-endpoint.d.ts +7 -0
  88. package/lib/replay-endpoint.d.ts.map +1 -0
  89. package/lib/replay-endpoint.js +193 -0
  90. package/lib/replay-endpoint.js.map +1 -0
  91. package/lib/replay-grant.d.ts +62 -0
  92. package/lib/replay-grant.d.ts.map +1 -0
  93. package/lib/replay-grant.js +208 -0
  94. package/lib/replay-grant.js.map +1 -0
  95. package/lib/replay-journal.d.ts +25 -0
  96. package/lib/replay-journal.d.ts.map +1 -0
  97. package/lib/replay-journal.js +275 -0
  98. package/lib/replay-journal.js.map +1 -0
  99. package/lib/runtime-observer-protocol.d.ts +63 -0
  100. package/lib/runtime-observer-protocol.d.ts.map +1 -0
  101. package/lib/runtime-observer-protocol.js +280 -0
  102. package/lib/runtime-observer-protocol.js.map +1 -0
  103. package/lib/runtime-observer.d.ts +8 -0
  104. package/lib/runtime-observer.d.ts.map +1 -0
  105. package/lib/runtime-observer.js +182 -0
  106. package/lib/runtime-observer.js.map +1 -0
  107. package/lib/service.d.ts +145 -1
  108. package/lib/service.d.ts.map +1 -1
  109. package/lib/service.js +734 -6
  110. package/lib/service.js.map +1 -1
  111. package/lib/source-adoption-authority.d.ts +65 -0
  112. package/lib/source-adoption-authority.d.ts.map +1 -0
  113. package/lib/source-adoption-authority.js +271 -0
  114. package/lib/source-adoption-authority.js.map +1 -0
  115. package/lib/source-adoption-runner.d.ts +28 -0
  116. package/lib/source-adoption-runner.d.ts.map +1 -0
  117. package/lib/source-adoption-runner.js +197 -0
  118. package/lib/source-adoption-runner.js.map +1 -0
  119. package/lib/source-approval-authority.d.ts +50 -0
  120. package/lib/source-approval-authority.d.ts.map +1 -0
  121. package/lib/source-approval-authority.js +412 -0
  122. package/lib/source-approval-authority.js.map +1 -0
  123. package/lib/source-approval-client.d.ts +32 -0
  124. package/lib/source-approval-client.d.ts.map +1 -0
  125. package/lib/source-approval-client.js +175 -0
  126. package/lib/source-approval-client.js.map +1 -0
  127. package/lib/source-build.d.ts +60 -0
  128. package/lib/source-build.d.ts.map +1 -0
  129. package/lib/source-build.js +311 -0
  130. package/lib/source-build.js.map +1 -0
  131. package/lib/source-context.d.ts +24 -0
  132. package/lib/source-context.d.ts.map +1 -0
  133. package/lib/source-context.js +99 -0
  134. package/lib/source-context.js.map +1 -0
  135. package/lib/source-job-types.d.ts +87 -0
  136. package/lib/source-job-types.d.ts.map +1 -0
  137. package/lib/source-job-types.js +2 -0
  138. package/lib/source-job-types.js.map +1 -0
  139. package/lib/source-jobs.d.ts +113 -0
  140. package/lib/source-jobs.d.ts.map +1 -0
  141. package/lib/source-jobs.js +535 -0
  142. package/lib/source-jobs.js.map +1 -0
  143. package/lib/source-release-authority.d.ts +35 -0
  144. package/lib/source-release-authority.d.ts.map +1 -0
  145. package/lib/source-release-authority.js +271 -0
  146. package/lib/source-release-authority.js.map +1 -0
  147. package/lib/source-release-client.d.ts +10 -0
  148. package/lib/source-release-client.d.ts.map +1 -0
  149. package/lib/source-release-client.js +24 -0
  150. package/lib/source-release-client.js.map +1 -0
  151. package/lib/source-release-runner.d.ts +31 -0
  152. package/lib/source-release-runner.d.ts.map +1 -0
  153. package/lib/source-release-runner.js +125 -0
  154. package/lib/source-release-runner.js.map +1 -0
  155. package/lib/source-versioning.d.ts +24 -0
  156. package/lib/source-versioning.d.ts.map +1 -0
  157. package/lib/source-versioning.js +213 -0
  158. package/lib/source-versioning.js.map +1 -0
  159. package/lib/source-workspace.d.ts +117 -0
  160. package/lib/source-workspace.d.ts.map +1 -0
  161. package/lib/source-workspace.js +458 -0
  162. package/lib/source-workspace.js.map +1 -0
  163. package/lib/sqlite.d.ts +1 -1
  164. package/lib/sqlite.d.ts.map +1 -1
  165. package/lib/sqlite.js +509 -7
  166. package/lib/sqlite.js.map +1 -1
  167. package/lib/store.d.ts +229 -6
  168. package/lib/store.d.ts.map +1 -1
  169. package/lib/store.js +2431 -383
  170. package/lib/store.js.map +1 -1
  171. package/lib/task-observation-authority.d.ts +29 -0
  172. package/lib/task-observation-authority.d.ts.map +1 -0
  173. package/lib/task-observation-authority.js +370 -0
  174. package/lib/task-observation-authority.js.map +1 -0
  175. package/lib/task-observation-client.d.ts +4 -0
  176. package/lib/task-observation-client.d.ts.map +1 -0
  177. package/lib/task-observation-client.js +20 -0
  178. package/lib/task-observation-client.js.map +1 -0
  179. package/lib/task-observation-runtime.d.ts +59 -0
  180. package/lib/task-observation-runtime.d.ts.map +1 -0
  181. package/lib/task-observation-runtime.js +331 -0
  182. package/lib/task-observation-runtime.js.map +1 -0
  183. package/lib/task-observation-store.d.ts +17 -0
  184. package/lib/task-observation-store.d.ts.map +1 -0
  185. package/lib/task-observation-store.js +115 -0
  186. package/lib/task-observation-store.js.map +1 -0
  187. package/lib/task-observation-types.d.ts +67 -0
  188. package/lib/task-observation-types.d.ts.map +1 -0
  189. package/lib/task-observation-types.js +2 -0
  190. package/lib/task-observation-types.js.map +1 -0
  191. package/lib/trust.d.ts +3 -0
  192. package/lib/trust.d.ts.map +1 -1
  193. package/lib/trust.js +0 -0
  194. package/lib/trust.js.map +1 -1
  195. package/lib/types.d.ts +275 -8
  196. package/lib/types.d.ts.map +1 -1
  197. package/lib/version.d.ts +1 -1
  198. package/lib/version.js +1 -1
  199. package/package.json +40 -5
@@ -0,0 +1,208 @@
1
+ import { createPublicKey, verify } from 'node:crypto';
2
+ import { isAbsolute, resolve } from 'node:path';
3
+ import { hostAttestationRequestDigest } from './attestation.js';
4
+ import { validateReplayCases } from './effect-blocked-replay.js';
5
+ import { runtimeConfigDigest } from './runtime-observer-protocol.js';
6
+ const ID = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,159}$/u;
7
+ const OPERATION_ID = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,119}$/u;
8
+ 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;
9
+ const DIGEST = /^[a-f0-9]{64}$/u;
10
+ const BASE64 = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/u;
11
+ const DOMAIN = 'dsh-effect-replay-grant/v1';
12
+ function fail(message) { throw new Error(`replay grant: ${message}`); }
13
+ function exact(value, fields, label) {
14
+ if (!value || typeof value !== 'object' || Array.isArray(value)
15
+ || Object.keys(value).sort().join('\0') !== [...fields].sort().join('\0'))
16
+ fail(`${label} has unknown or missing fields`);
17
+ }
18
+ function integer(value, label, minimum = 1) {
19
+ if (!Number.isSafeInteger(value) || typeof value !== 'number' || value < minimum)
20
+ fail(`${label} is invalid`);
21
+ return value;
22
+ }
23
+ function text(value, label, pattern = ID) {
24
+ if (typeof value !== 'string' || !pattern.test(value))
25
+ fail(`${label} is invalid`);
26
+ return value;
27
+ }
28
+ function path(value, label) {
29
+ if (typeof value !== 'string' || value.length < 1 || value.length > 4096 || !isAbsolute(value) || resolve(value) !== value
30
+ || Array.from(value).some(character => character.charCodeAt(0) < 32))
31
+ fail(`${label} is invalid`);
32
+ return value;
33
+ }
34
+ function digest(value, label) { return text(value, label, DIGEST); }
35
+ function assertIssuer(value) {
36
+ if (!value || typeof value !== 'object' || Array.isArray(value))
37
+ fail('request issuer is invalid');
38
+ if (value.mode === 'owner-manual') {
39
+ exact(value, ['mode'], 'request issuer');
40
+ return;
41
+ }
42
+ exact(value, ['mode', 'id', 'version', 'path', 'sha256', 'interpreter', 'authority', 'keyId'], 'request issuer');
43
+ if (value.mode !== 'configured-executable')
44
+ fail('request issuer mode is invalid');
45
+ text(value.id, 'request issuer id');
46
+ text(value.version, 'request issuer version');
47
+ path(value.path, 'request issuer path');
48
+ digest(value.sha256, 'request issuer sha256');
49
+ text(value.authority, 'request issuer authority');
50
+ text(value.keyId, 'request issuer keyId');
51
+ if (value.interpreter === null)
52
+ return;
53
+ exact(value.interpreter, ['path', 'sha256'], 'request issuer interpreter');
54
+ path(value.interpreter.path, 'request issuer interpreter path');
55
+ digest(value.interpreter.sha256, 'request issuer interpreter sha256');
56
+ }
57
+ function assertReplayRequest(value) {
58
+ exact(value, ['schemaVersion', 'kind', 'operationId', 'requestedAt', 'receiptTtlMs', 'installationId', 'ledger', 'plan', 'activation', 'profile', 'issuer', 'phase', 'requirements', 'predecessor'], 'request');
59
+ if (value.schemaVersion !== 2 || value.kind !== 'dsh-host-attestation-request' || value.phase !== 'effect-blocked-replay')
60
+ fail('request schema or phase is invalid');
61
+ text(value.operationId, 'request operationId', OPERATION_ID);
62
+ integer(value.requestedAt, 'request requestedAt');
63
+ integer(value.receiptTtlMs, 'request receiptTtlMs', 1_000);
64
+ if (value.receiptTtlMs > 300_000)
65
+ fail('request receiptTtlMs is invalid');
66
+ text(value.installationId, 'request installationId', UUID);
67
+ exact(value.ledger, ['id', 'path'], 'request ledger');
68
+ text(value.ledger.id, 'request ledger id', UUID);
69
+ path(value.ledger.path, 'request ledger path');
70
+ exact(value.plan, ['id', 'digest'], 'request plan');
71
+ text(value.plan.id, 'request plan id');
72
+ digest(value.plan.digest, 'request plan digest');
73
+ exact(value.activation, ['id', 'fence'], 'request activation');
74
+ text(value.activation.id, 'request activation id');
75
+ integer(value.activation.fence, 'request activation fence');
76
+ exact(value.profile, ['name', 'path'], 'request profile');
77
+ text(value.profile.name, 'request profile name');
78
+ path(value.profile.path, 'request profile path');
79
+ assertIssuer(value.issuer);
80
+ exact(value.requirements, ['kind', 'minimumDeliveryAttempts', 'minimumToolExecutionAttempts', 'maximumExternalEffects'], 'request requirements');
81
+ if (value.requirements.kind !== 'effect-blocked-replay' || value.requirements.maximumExternalEffects !== 0)
82
+ fail('request requirements are invalid');
83
+ integer(value.requirements.minimumDeliveryAttempts, 'request minimumDeliveryAttempts');
84
+ integer(value.requirements.minimumToolExecutionAttempts, 'request minimumToolExecutionAttempts');
85
+ exact(value.predecessor, ['operationId', 'receiptId', 'phase', 'receiptDigest', 'hostGeneration'], 'request predecessor');
86
+ if (value.predecessor.phase !== 'readiness' || value.predecessor.operationId === value.operationId)
87
+ fail('request predecessor is invalid');
88
+ text(value.predecessor.operationId, 'request predecessor operationId', OPERATION_ID);
89
+ text(value.predecessor.receiptId, 'request predecessor receiptId');
90
+ digest(value.predecessor.receiptDigest, 'request predecessor receiptDigest');
91
+ integer(value.predecessor.hostGeneration, 'request predecessor hostGeneration');
92
+ }
93
+ function assertScope(value) {
94
+ exact(value, ['installationId', 'ledger', 'plan', 'activation', 'profile'], 'authority scope');
95
+ text(value.installationId, 'authority installationId', UUID);
96
+ exact(value.ledger, ['id', 'path'], 'authority ledger');
97
+ text(value.ledger.id, 'authority ledger id', UUID);
98
+ path(value.ledger.path, 'authority ledger path');
99
+ exact(value.plan, ['id', 'digest'], 'authority plan');
100
+ text(value.plan.id, 'authority plan id');
101
+ digest(value.plan.digest, 'authority plan digest');
102
+ exact(value.activation, ['id', 'fence'], 'authority activation');
103
+ text(value.activation.id, 'authority activation id');
104
+ integer(value.activation.fence, 'authority activation fence');
105
+ exact(value.profile, ['name', 'path'], 'authority profile');
106
+ text(value.profile.name, 'authority profile name');
107
+ path(value.profile.path, 'authority profile path');
108
+ }
109
+ /** Validates only a public SPKI Ed25519 signer and a bounded authority window. */
110
+ export function validateReplaySignedAuthority(value) {
111
+ runtimeConfigDigest(value);
112
+ exact(value, ['mode', 'authority', 'keyId', 'publicKeyPem', 'scope', 'notBefore', 'expiresAt', 'maximumGrantMs', 'cases'], 'signed authority');
113
+ if (value.mode !== 'signed')
114
+ fail('authority mode is invalid');
115
+ text(value.authority, 'authority');
116
+ text(value.keyId, 'keyId');
117
+ assertScope(value.scope);
118
+ integer(value.notBefore, 'authority notBefore');
119
+ integer(value.expiresAt, 'authority expiresAt');
120
+ if (value.expiresAt <= value.notBefore || value.expiresAt - value.notBefore > 86_400_000)
121
+ fail('authority window is invalid');
122
+ const maximumGrantMs = integer(value.maximumGrantMs, 'maximumGrantMs', 100);
123
+ if (maximumGrantMs > 60_000)
124
+ fail('maximumGrantMs is invalid');
125
+ if (typeof value.publicKeyPem !== 'string')
126
+ fail('publicKeyPem is invalid');
127
+ let key;
128
+ try {
129
+ key = createPublicKey(value.publicKeyPem);
130
+ }
131
+ catch {
132
+ fail('publicKeyPem is invalid');
133
+ }
134
+ if (key.asymmetricKeyType !== 'ed25519' || key.export({ type: 'spki', format: 'pem' }).toString() !== value.publicKeyPem)
135
+ fail('publicKeyPem is not canonical public Ed25519 SPKI');
136
+ validateReplayCases(value.cases);
137
+ }
138
+ export function assertReplayGrant(value) {
139
+ runtimeConfigDigest(value);
140
+ exact(value, ['schemaVersion', 'kind', 'authority', 'keyId', 'request', 'endpointDigest', 'caseDigest', 'processId', 'invocationId', 'notBefore', 'expiresAt', 'signature'], 'grant');
141
+ if (value.schemaVersion !== 1 || value.kind !== 'dsh-effect-replay-grant')
142
+ fail('grant schema is invalid');
143
+ text(value.authority, 'grant authority');
144
+ text(value.keyId, 'grant keyId');
145
+ assertReplayRequest(value.request);
146
+ digest(value.endpointDigest, 'endpointDigest');
147
+ digest(value.caseDigest, 'caseDigest');
148
+ integer(value.processId, 'processId');
149
+ if (value.invocationId !== null)
150
+ text(value.invocationId, 'invocationId', /^[a-f0-9]{32}$/u);
151
+ integer(value.notBefore, 'grant notBefore');
152
+ integer(value.expiresAt, 'grant expiresAt');
153
+ if (value.expiresAt <= value.notBefore)
154
+ fail('grant validity interval is invalid');
155
+ if (typeof value.signature !== 'string' || !BASE64.test(value.signature))
156
+ fail('grant signature is invalid');
157
+ const signature = Buffer.from(value.signature, 'base64');
158
+ if (signature.length !== 64 || signature.toString('base64') !== value.signature)
159
+ fail('grant signature is invalid');
160
+ }
161
+ /** The payload contains a bounded canonical digest, so object access happens only after getter rejection. */
162
+ export function replayGrantSigningPayload(grant) {
163
+ return `${DOMAIN}\n${runtimeConfigDigest(grant)}`;
164
+ }
165
+ export function verifyReplayGrant(grantInput, authorityInput, binding, now) {
166
+ assertReplayGrant(grantInput);
167
+ validateReplaySignedAuthority(authorityInput);
168
+ runtimeConfigDigest(binding);
169
+ exact(binding, ['endpointDigest', 'caseDigest', 'profilePath', 'operationId', 'requestDigest'], 'binding');
170
+ digest(binding.endpointDigest, 'binding endpointDigest');
171
+ digest(binding.caseDigest, 'binding caseDigest');
172
+ path(binding.profilePath, 'binding profilePath');
173
+ text(binding.operationId, 'binding operationId', OPERATION_ID);
174
+ digest(binding.requestDigest, 'binding requestDigest');
175
+ integer(now, 'now');
176
+ const grant = grantInput;
177
+ const authority = authorityInput;
178
+ const requestDigest = hostAttestationRequestDigest(grant.request);
179
+ const replay = validateReplayCases(authority.cases);
180
+ const requirements = grant.request.requirements;
181
+ if (requirements.kind !== 'effect-blocked-replay' || requirements.maximumExternalEffects !== 0)
182
+ fail('grant request requirements are invalid');
183
+ if (grant.authority !== authority.authority || grant.keyId !== authority.keyId || grant.endpointDigest !== binding.endpointDigest
184
+ || grant.caseDigest !== binding.caseDigest || grant.caseDigest !== replay.caseDigest || grant.request.operationId !== binding.operationId
185
+ || requestDigest !== binding.requestDigest || grant.request.profile.path !== binding.profilePath
186
+ || grant.request.installationId !== authority.scope.installationId || grant.request.ledger.id !== authority.scope.ledger.id
187
+ || grant.request.ledger.path !== authority.scope.ledger.path || grant.request.plan.id !== authority.scope.plan.id
188
+ || grant.request.plan.digest !== authority.scope.plan.digest || grant.request.activation.id !== authority.scope.activation.id
189
+ || grant.request.activation.fence !== authority.scope.activation.fence || grant.request.profile.name !== authority.scope.profile.name
190
+ || grant.request.profile.path !== authority.scope.profile.path)
191
+ fail('grant is not bound to authority scope and request');
192
+ const toolCases = replay.cases.filter(item => item.kind === 'tool').length;
193
+ const deliveryCases = replay.cases.filter(item => item.kind === 'delivery').length;
194
+ if (toolCases < requirements.minimumToolExecutionAttempts || deliveryCases < requirements.minimumDeliveryAttempts)
195
+ fail('grant cases do not meet request minimums');
196
+ if (grant.request.requestedAt > grant.notBefore || grant.notBefore < authority.notBefore || grant.expiresAt > authority.expiresAt
197
+ || grant.expiresAt - grant.notBefore > authority.maximumGrantMs || grant.expiresAt - grant.request.requestedAt > grant.request.receiptTtlMs
198
+ || now < grant.notBefore || now >= grant.expiresAt)
199
+ fail('grant is outside its validity interval');
200
+ const unsigned = { schemaVersion: grant.schemaVersion, kind: grant.kind, authority: grant.authority,
201
+ keyId: grant.keyId, request: grant.request, endpointDigest: grant.endpointDigest, caseDigest: grant.caseDigest,
202
+ processId: grant.processId, invocationId: grant.invocationId, notBefore: grant.notBefore, expiresAt: grant.expiresAt };
203
+ const signature = Buffer.from(grant.signature, 'base64');
204
+ if (!verify(null, Buffer.from(replayGrantSigningPayload(unsigned)), createPublicKey(authority.publicKeyPem), signature))
205
+ fail('grant signature is invalid');
206
+ return Object.freeze({ scopeDigest: runtimeConfigDigest(authority.scope), grantDigest: runtimeConfigDigest(grant), expiresAt: grant.expiresAt });
207
+ }
208
+ //# sourceMappingURL=replay-grant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-grant.js","sourceRoot":"","sources":["../src/replay-grant.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { EffectBlockedReplayResult } from './effect-blocked-replay.js';
2
+ export interface ReplayAuthorization {
3
+ scopeDigest: string;
4
+ grantDigest: string;
5
+ }
6
+ /** A reserved operation never regains dispatch authority, including after process death. */
7
+ export declare class ReplayJournal {
8
+ private readonly path;
9
+ private readonly db;
10
+ private readonly fileIdentity;
11
+ constructor(path: string);
12
+ private checkFiles;
13
+ private syncDirectory;
14
+ private operation;
15
+ private grantForOperation;
16
+ private result;
17
+ get(operationId: string, bindingDigest: string, signed?: ReplayAuthorization): {
18
+ status: 'admitted' | 'completed';
19
+ result: EffectBlockedReplayResult | null;
20
+ } | undefined;
21
+ reserve(operationId: string, bindingDigest: string, requestDigest: string, caseDigest: string, signed?: ReplayAuthorization): boolean;
22
+ complete(operationId: string, bindingDigest: string, result: EffectBlockedReplayResult): void;
23
+ close(): void;
24
+ }
25
+ //# sourceMappingURL=replay-journal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-journal.d.ts","sourceRoot":"","sources":["../src/replay-journal.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AAkB3E,MAAM,WAAW,mBAAmB;IAAG,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE;AAajF,4FAA4F;AAC5F,qBAAa,aAAa;IAGZ,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAc;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA8B;gBAC9B,IAAI,EAAE,MAAM;IA8CzC,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,SAAS;IAGjB,OAAO,CAAC,iBAAiB;IAGzB,OAAO,CAAC,MAAM;IAWd,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,mBAAmB,GAAG;QAAE,MAAM,EAAE,UAAU,GAAG,WAAW,CAAC;QAAC,MAAM,EAAE,yBAAyB,GAAG,IAAI,CAAA;KAAE,GAAG,SAAS;IAgBzK,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,mBAAmB,GAAG,OAAO;IAkCrI,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,yBAAyB,GAAG,IAAI;IAuB7F,KAAK,IAAI,IAAI;CACd"}
@@ -0,0 +1,275 @@
1
+ import { constants, closeSync, fstatSync, fsyncSync, lstatSync, openSync, realpathSync } from 'node:fs';
2
+ import { dirname, isAbsolute, resolve } from 'node:path';
3
+ import { DatabaseSync } from 'node:sqlite';
4
+ import { assertReplayEndpointResponse } from './replay-endpoint-protocol.js';
5
+ import { privateRuntimeObserverDirectory, runtimeConfigDigest } from './runtime-observer-protocol.js';
6
+ const APP_ID = 0x44535250;
7
+ function fail() { throw new Error('replay journal: unsafe file, incompatible journal or conflicting operation'); }
8
+ function identity(operationId, bindingDigest) {
9
+ if (!/^[A-Za-z0-9][A-Za-z0-9._:-]{0,119}$/u.test(operationId) || !/^[a-f0-9]{64}$/u.test(bindingDigest))
10
+ fail();
11
+ }
12
+ function checkFile(path) {
13
+ const stat = lstatSync(path);
14
+ if (realpathSync(path) !== path || !stat.isFile() || stat.nlink !== 1 || stat.uid !== process.getuid() || (stat.mode & 0o077) !== 0)
15
+ fail();
16
+ }
17
+ function optionalFile(path) {
18
+ try {
19
+ checkFile(path);
20
+ }
21
+ catch (error) {
22
+ if (error.code !== 'ENOENT')
23
+ throw error;
24
+ }
25
+ }
26
+ function authorization(value) {
27
+ if (value === undefined)
28
+ return undefined;
29
+ if (!value || typeof value !== 'object' || (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null))
30
+ fail();
31
+ const descriptors = Object.getOwnPropertyDescriptors(value);
32
+ if (Reflect.ownKeys(descriptors).length !== 2)
33
+ fail();
34
+ const scope = descriptors.scopeDigest, grant = descriptors.grantDigest;
35
+ if (!scope || !grant || !('value' in scope) || !('value' in grant) || typeof scope.value !== 'string' || typeof grant.value !== 'string')
36
+ fail();
37
+ identity('authorization', scope.value);
38
+ identity('authorization', grant.value);
39
+ return { scopeDigest: scope.value, grantDigest: grant.value };
40
+ }
41
+ /** A reserved operation never regains dispatch authority, including after process death. */
42
+ export class ReplayJournal {
43
+ path;
44
+ db;
45
+ fileIdentity;
46
+ constructor(path) {
47
+ this.path = path;
48
+ if (process.platform !== 'linux' || !isAbsolute(path) || resolve(path) !== path)
49
+ fail();
50
+ privateRuntimeObserverDirectory(dirname(path));
51
+ try {
52
+ const fd = openSync(path, constants.O_CREAT | constants.O_EXCL | constants.O_RDWR | constants.O_NOFOLLOW, 0o600);
53
+ try {
54
+ fsyncSync(fd);
55
+ }
56
+ finally {
57
+ closeSync(fd);
58
+ }
59
+ }
60
+ catch (error) {
61
+ if (error.code !== 'EEXIST')
62
+ throw error;
63
+ }
64
+ const before = lstatSync(path);
65
+ this.fileIdentity = { dev: before.dev, ino: before.ino };
66
+ this.checkFiles();
67
+ this.db = new DatabaseSync(path);
68
+ try {
69
+ this.checkFiles();
70
+ const after = lstatSync(path);
71
+ if (before.dev !== after.dev || before.ino !== after.ino)
72
+ fail();
73
+ this.db.exec('PRAGMA busy_timeout = 1000; PRAGMA synchronous = FULL; BEGIN IMMEDIATE;');
74
+ try {
75
+ const version = this.db.prepare('PRAGMA user_version').get().user_version;
76
+ const app = this.db.prepare('PRAGMA application_id').get().application_id;
77
+ if (version === 0 && app === 0 && this.db.prepare('SELECT name FROM sqlite_master').all().length === 0) {
78
+ this.db.exec(`CREATE TABLE replay_operations (
79
+ operation_id TEXT PRIMARY KEY, binding_digest TEXT NOT NULL, request_digest TEXT NOT NULL, case_digest TEXT NOT NULL,
80
+ result_json TEXT, result_digest TEXT, admission_mode TEXT NOT NULL,
81
+ CHECK((result_json IS NULL AND result_digest IS NULL) OR
82
+ (json_valid(result_json) AND length(result_digest) = 64))
83
+ ) STRICT, WITHOUT ROWID;
84
+ CREATE TABLE replay_grants (
85
+ scope_digest TEXT PRIMARY KEY, grant_digest TEXT NOT NULL, operation_id TEXT NOT NULL UNIQUE,
86
+ FOREIGN KEY(operation_id) REFERENCES replay_operations(operation_id)
87
+ ) STRICT, WITHOUT ROWID;
88
+ PRAGMA application_id = ${APP_ID}; PRAGMA user_version = 2;`);
89
+ }
90
+ else if (version === 1 && app === APP_ID) {
91
+ // Version 1 had only fixed-operation admission. Existing rows remain fixed.
92
+ this.db.exec(`ALTER TABLE replay_operations ADD COLUMN admission_mode TEXT NOT NULL DEFAULT 'fixed';
93
+ CREATE TABLE replay_grants (
94
+ scope_digest TEXT PRIMARY KEY, grant_digest TEXT NOT NULL, operation_id TEXT NOT NULL UNIQUE,
95
+ FOREIGN KEY(operation_id) REFERENCES replay_operations(operation_id)
96
+ ) STRICT, WITHOUT ROWID;
97
+ PRAGMA user_version = 2;`);
98
+ }
99
+ else if (version !== 2 || app !== APP_ID)
100
+ fail();
101
+ this.db.exec('COMMIT; PRAGMA journal_mode = WAL;');
102
+ }
103
+ catch (error) {
104
+ try {
105
+ this.db.exec('ROLLBACK');
106
+ }
107
+ catch { /* A completed commit cannot be rolled back. */ }
108
+ throw error;
109
+ }
110
+ this.checkFiles();
111
+ this.syncDirectory();
112
+ }
113
+ catch (error) {
114
+ this.db.close();
115
+ throw error;
116
+ }
117
+ }
118
+ checkFiles() {
119
+ privateRuntimeObserverDirectory(dirname(this.path));
120
+ checkFile(this.path);
121
+ const current = lstatSync(this.path);
122
+ if (current.dev !== this.fileIdentity.dev || current.ino !== this.fileIdentity.ino)
123
+ fail();
124
+ for (const suffix of ['-wal', '-shm', '-journal'])
125
+ optionalFile(this.path + suffix);
126
+ }
127
+ syncDirectory() {
128
+ this.checkFiles();
129
+ const fd = openSync(dirname(this.path), constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW);
130
+ try {
131
+ if (!fstatSync(fd).isDirectory())
132
+ fail();
133
+ fsyncSync(fd);
134
+ }
135
+ finally {
136
+ closeSync(fd);
137
+ }
138
+ }
139
+ operation(operationId) {
140
+ return this.db.prepare('SELECT binding_digest, request_digest, case_digest, result_json, result_digest, admission_mode FROM replay_operations WHERE operation_id = ?').get(operationId);
141
+ }
142
+ grantForOperation(operationId) {
143
+ return this.db.prepare('SELECT scope_digest, grant_digest, operation_id FROM replay_grants WHERE operation_id = ?').get(operationId);
144
+ }
145
+ result(operationId, row) {
146
+ if (row.result_json === null) {
147
+ if (row.result_digest !== null)
148
+ fail();
149
+ return { status: 'admitted', result: null };
150
+ }
151
+ if (Buffer.byteLength(row.result_json) > 65_536)
152
+ fail();
153
+ const result = JSON.parse(row.result_json);
154
+ assertReplayEndpointResponse({ schemaVersion: 1, challenge: '0'.repeat(64), operationId,
155
+ requestDigest: row.request_digest, status: 'completed', result, observedAt: Date.now() });
156
+ if (runtimeConfigDigest(result) !== row.result_digest || result.operationId !== operationId
157
+ || result.requestDigest !== row.request_digest || result.caseDigest !== row.case_digest
158
+ || result.schemaVersion !== 1 || result.kind !== 'dsh-effect-blocked-replay-observation' || result.quiescent !== true)
159
+ fail();
160
+ return { status: 'completed', result };
161
+ }
162
+ get(operationId, bindingDigest, signed) {
163
+ const auth = authorization(signed);
164
+ identity(operationId, bindingDigest);
165
+ this.checkFiles();
166
+ if (auth) {
167
+ const grant = this.db.prepare('SELECT scope_digest, grant_digest, operation_id FROM replay_grants WHERE scope_digest = ?').get(auth.scopeDigest);
168
+ if (!grant) {
169
+ if (this.operation(operationId))
170
+ fail();
171
+ return;
172
+ }
173
+ if (grant.grant_digest !== auth.grantDigest || grant.operation_id !== operationId)
174
+ fail();
175
+ const row = this.operation(operationId);
176
+ if (!row || row.admission_mode !== 'signed' || row.binding_digest !== bindingDigest)
177
+ fail();
178
+ return this.result(operationId, row);
179
+ }
180
+ const row = this.operation(operationId);
181
+ if (!row)
182
+ return;
183
+ if (row.admission_mode !== 'fixed' || this.grantForOperation(operationId) || row.binding_digest !== bindingDigest)
184
+ fail();
185
+ return this.result(operationId, row);
186
+ }
187
+ reserve(operationId, bindingDigest, requestDigest, caseDigest, signed) {
188
+ const auth = authorization(signed);
189
+ identity(operationId, bindingDigest);
190
+ this.checkFiles();
191
+ identity(operationId, requestDigest);
192
+ identity(operationId, caseDigest);
193
+ this.db.exec('BEGIN IMMEDIATE');
194
+ try {
195
+ if (auth) {
196
+ const grant = this.db.prepare('SELECT scope_digest, grant_digest, operation_id FROM replay_grants WHERE scope_digest = ?').get(auth.scopeDigest);
197
+ if (grant) {
198
+ if (grant.grant_digest !== auth.grantDigest || grant.operation_id !== operationId)
199
+ fail();
200
+ const existing = this.operation(operationId);
201
+ if (!existing || existing.admission_mode !== 'signed' || existing.binding_digest !== bindingDigest
202
+ || existing.request_digest !== requestDigest || existing.case_digest !== caseDigest)
203
+ fail();
204
+ this.db.exec('COMMIT');
205
+ this.syncDirectory();
206
+ return false;
207
+ }
208
+ if (this.operation(operationId))
209
+ fail();
210
+ this.db.prepare("INSERT INTO replay_operations(operation_id, binding_digest, request_digest, case_digest, admission_mode) VALUES (?, ?, ?, ?, 'signed')")
211
+ .run(operationId, bindingDigest, requestDigest, caseDigest);
212
+ this.db.prepare('INSERT INTO replay_grants(scope_digest, grant_digest, operation_id) VALUES (?, ?, ?)').run(auth.scopeDigest, auth.grantDigest, operationId);
213
+ }
214
+ else {
215
+ const existing = this.operation(operationId);
216
+ if (existing) {
217
+ if (existing.admission_mode !== 'fixed' || this.grantForOperation(operationId) || existing.binding_digest !== bindingDigest
218
+ || existing.request_digest !== requestDigest || existing.case_digest !== caseDigest)
219
+ fail();
220
+ this.db.exec('COMMIT');
221
+ this.syncDirectory();
222
+ return false;
223
+ }
224
+ this.db.prepare("INSERT INTO replay_operations(operation_id, binding_digest, request_digest, case_digest, admission_mode) VALUES (?, ?, ?, ?, 'fixed')")
225
+ .run(operationId, bindingDigest, requestDigest, caseDigest);
226
+ }
227
+ this.db.exec('COMMIT');
228
+ this.syncDirectory();
229
+ return true;
230
+ }
231
+ catch (error) {
232
+ try {
233
+ this.db.exec('ROLLBACK');
234
+ }
235
+ catch { /* A completed commit cannot be rolled back. */ }
236
+ throw error;
237
+ }
238
+ }
239
+ complete(operationId, bindingDigest, result) {
240
+ identity(operationId, bindingDigest);
241
+ runtimeConfigDigest(result);
242
+ result = structuredClone(result);
243
+ const digest = runtimeConfigDigest(result);
244
+ if (result.operationId !== operationId || result.kind !== 'dsh-effect-blocked-replay-observation' || result.quiescent !== true)
245
+ fail();
246
+ this.db.exec('BEGIN IMMEDIATE');
247
+ try {
248
+ const pins = this.operation(operationId);
249
+ if (!pins || (pins.admission_mode !== 'fixed' && pins.admission_mode !== 'signed') || pins.binding_digest !== bindingDigest
250
+ || (pins.admission_mode === 'signed' && !this.grantForOperation(operationId))
251
+ || (pins.admission_mode === 'fixed' && this.grantForOperation(operationId))
252
+ || result.requestDigest !== pins.request_digest || result.caseDigest !== pins.case_digest)
253
+ fail();
254
+ assertReplayEndpointResponse({ schemaVersion: 1, challenge: '0'.repeat(64), operationId,
255
+ requestDigest: pins.request_digest, status: 'completed', result, observedAt: Date.now() });
256
+ const prior = this.result(operationId, pins);
257
+ if (prior.result && runtimeConfigDigest(prior.result) !== digest)
258
+ fail();
259
+ if (!prior.result)
260
+ this.db.prepare('UPDATE replay_operations SET result_json = ?, result_digest = ? WHERE operation_id = ? AND result_json IS NULL')
261
+ .run(JSON.stringify(result), digest, operationId);
262
+ this.db.exec('COMMIT');
263
+ this.syncDirectory();
264
+ }
265
+ catch (error) {
266
+ try {
267
+ this.db.exec('ROLLBACK');
268
+ }
269
+ catch { /* A completed commit cannot be rolled back. */ }
270
+ throw error;
271
+ }
272
+ }
273
+ close() { this.db.close(); }
274
+ }
275
+ //# sourceMappingURL=replay-journal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-journal.js","sourceRoot":"","sources":["../src/replay-journal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ export interface RuntimeObserverTarget {
2
+ entryId: string;
3
+ module: string;
4
+ configDigest: string;
5
+ services: string[];
6
+ }
7
+ export interface RuntimeObserverConfig {
8
+ socketPath: string;
9
+ keyPath: string;
10
+ profilePath: string;
11
+ targets: RuntimeObserverTarget[];
12
+ }
13
+ export declare const RUNTIME_OBSERVER_MAX_BYTES = 65536;
14
+ export declare const RUNTIME_OBSERVER_TIMEOUT = 2000;
15
+ export declare function runtimeObserverFail(): never;
16
+ export declare function assertRuntimeObserverExact(value: unknown, fields: string[]): asserts value is Record<string, unknown>;
17
+ export declare function assertRuntimeObserverText(value: unknown, pattern?: RegExp): asserts value is string;
18
+ /** Bounded JSON digest; never invokes a config object's toJSON/getter. */
19
+ export declare function runtimeConfigDigest(value: unknown): string;
20
+ export declare function privateRuntimeObserverDirectory(path: string): void;
21
+ export declare function readPrivateRuntimeObserverKey(path: string): Buffer;
22
+ export declare function validateRuntimeObserverConfig(value: unknown): asserts value is RuntimeObserverConfig;
23
+ export type RuntimeObserverInstance = {
24
+ uid: number;
25
+ epoch: number;
26
+ };
27
+ export interface RuntimeEntryObservation {
28
+ entryId: string;
29
+ module: string | null;
30
+ configDigest: string | null;
31
+ active: boolean;
32
+ instance: RuntimeObserverInstance | null;
33
+ dependencies: Array<{
34
+ name: string;
35
+ instance: RuntimeObserverInstance | null;
36
+ }>;
37
+ services: Array<{
38
+ name: string;
39
+ instance: RuntimeObserverInstance | null;
40
+ }>;
41
+ }
42
+ export interface RuntimeObservation {
43
+ schemaVersion: 1;
44
+ kind: 'dsh-runtime-observation';
45
+ observerId: string;
46
+ observerConfigDigest: string;
47
+ challenge: string;
48
+ processId: number;
49
+ invocationId: string | null;
50
+ profilePath: string;
51
+ observedAt: number;
52
+ entries: RuntimeEntryObservation[];
53
+ }
54
+ export declare function runtimeObserverMac(key: Buffer, domain: string, value: unknown): string;
55
+ export declare function equalRuntimeObserverMac(actual: unknown, expected: string): boolean;
56
+ export declare function assertRuntimeObservation(value: unknown): asserts value is RuntimeObservation;
57
+ /** Owner caller supplies no claimed state; fresh challenge authenticates the observed response. */
58
+ export declare function queryRuntimeObserver(input: {
59
+ socketPath: string;
60
+ keyPath: string;
61
+ signal?: AbortSignal;
62
+ }): Promise<RuntimeObservation>;
63
+ //# sourceMappingURL=runtime-observer-protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-observer-protocol.d.ts","sourceRoot":"","sources":["../src/runtime-observer-protocol.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,qBAAqB,EAAE,CAAA;CACjC;AAID,eAAO,MAAM,0BAA0B,QAAS,CAAA;AAChD,eAAO,MAAM,wBAAwB,OAAQ,CAAA;AAE7C,wBAAgB,mBAAmB,IAAI,KAAK,CAAsG;AAClJ,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAGrH;AACD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,SAAK,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAE/F;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAkC1D;AAED,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAGlE;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAclE;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,qBAAqB,CA2BpG;AAED,MAAM,MAAM,uBAAuB,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AACpE,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,MAAM,EAAE,OAAO,CAAA;IACf,QAAQ,EAAE,uBAAuB,GAAG,IAAI,CAAA;IACxC,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,uBAAuB,GAAG,IAAI,CAAA;KAAE,CAAC,CAAA;IAC/E,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,uBAAuB,GAAG,IAAI,CAAA;KAAE,CAAC,CAAA;CAC5E;AACD,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,CAAC,CAAA;IAChB,IAAI,EAAE,yBAAyB,CAAA;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,uBAAuB,EAAE,CAAA;CACnC;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAEtF;AACD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAElF;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,kBAAkB,CAoC5F;AAED,mGAAmG;AACnG,wBAAsB,oBAAoB,CAAC,KAAK,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAgD5I"}