@dsh-enhanced/plugin-control-plane 0.1.31 → 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,35 @@
1
+ import { type SourceAuthorityWorktreeGrant } from './source-approval-authority.js';
2
+ import type { SourceJobOwnerReceipt } from './source-job-types.js';
3
+ import type { SourceReleaseAuthorization, SourceReleasePolicy } from './types.js';
4
+ type PolicyConfig = Omit<SourceReleasePolicy, 'packageVersion' | 'registryReference'>;
5
+ export interface SourceReleaseAuthorityRequest {
6
+ protocol: 'dsh-source-release-authorization/v1';
7
+ planId: string;
8
+ planDigest: string;
9
+ sourceReferenceDigest: string;
10
+ }
11
+ export interface SourceReleaseAuthorityConfig {
12
+ schemaVersion: 1;
13
+ authority: string;
14
+ keyId: string;
15
+ keyPath: string;
16
+ statePath: string;
17
+ controlDatabasePath: string;
18
+ grant: SourceAuthorityWorktreeGrant & {
19
+ id: string;
20
+ expiresAt: number;
21
+ maxReleases: number;
22
+ owner: Pick<SourceJobOwnerReceipt, 'authorityId' | 'authorityHash' | 'principalId' | 'principalRecordId' | 'principalVersion' | 'workspace' | 'agentPreset'>;
23
+ receiptTtlMs: number;
24
+ versioning: 'patch';
25
+ policies: readonly PolicyConfig[];
26
+ };
27
+ }
28
+ export declare class SourceReleaseAuthorityError extends Error {
29
+ constructor(message?: string);
30
+ }
31
+ export declare function validateSourceReleaseAuthorityConfig(value: unknown): asserts value is SourceReleaseAuthorityConfig;
32
+ export declare function authorizePreparedSourceRelease(configInput: SourceReleaseAuthorityConfig, requestInput: SourceReleaseAuthorityRequest): Promise<SourceReleaseAuthorization>;
33
+ export declare function runSourceReleaseAuthority(argv?: string[]): Promise<void>;
34
+ export {};
35
+ //# sourceMappingURL=source-release-authority.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-release-authority.d.ts","sourceRoot":"","sources":["../src/source-release-authority.ts"],"names":[],"mappings":"AAMA,OAAO,EAEwD,KAAK,4BAA4B,EAC/F,MAAM,gCAAgC,CAAA;AAIvC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAClE,OAAO,KAAK,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAKjF,KAAK,YAAY,GAAG,IAAI,CAAC,mBAAmB,EAAE,gBAAgB,GAAG,mBAAmB,CAAC,CAAA;AAErF,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,qCAAqC,CAAA;IAC/C,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,qBAAqB,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,WAAW,4BAA4B;IAC3C,aAAa,EAAE,CAAC,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,KAAK,EAAE,4BAA4B,GAAG;QACpC,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;QAClD,KAAK,EAAE,IAAI,CAAC,qBAAqB,EAAE,aAAa,GAAG,eAAe,GAAG,aAAa,GAAG,mBAAmB,GAAG,kBAAkB,GAAG,WAAW,GAAG,aAAa,CAAC,CAAA;QAC5J,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAA;KAC7E,CAAA;CACF;AAED,qBAAa,2BAA4B,SAAQ,KAAK;gBACxC,OAAO,SAAiD;CACrE;AAiCD,wBAAgB,oCAAoC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,4BAA4B,CAclH;AA0CD,wBAAsB,8BAA8B,CAAC,WAAW,EAAE,4BAA4B,EAAE,YAAY,EAAE,6BAA6B,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAyChL;AAED,wBAAsB,yBAAyB,CAAC,IAAI,WAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAO3F"}
@@ -0,0 +1,271 @@
1
+ /** Owner-operated finite signer for a checked local source release authorization. It never executes a release phase. */
2
+ import { createHash, createPrivateKey, sign } from 'node:crypto';
3
+ import { join, resolve } from 'node:path';
4
+ import { DatabaseSync } from 'node:sqlite';
5
+ import { fileURLToPath, pathToFileURL } from 'node:url';
6
+ import { parseSourceReleaseAuthorization, sourceReleaseAuthorizationSigningPayload } from './release.js';
7
+ import { sourceAuthorityCanonicalSafePath, sourceAuthorityReadSafeFile, sourceAuthorityValidatePrepared, sourceAuthorityValidateWorktree, sourceAuthorityEnvironment, } from './source-approval-authority.js';
8
+ import { controlPlaneDigest, readOwnerPreparedSourcePlan } from './store.js';
9
+ import { verifyManagedPatchVersion } from './source-versioning.js';
10
+ import { PROTECTED_PLUGIN_DENYLIST } from './source-workspace.js';
11
+ const ID = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,159}$/u;
12
+ const DIGEST = /^[a-f0-9]{64}$/u;
13
+ const MAX_CONFIG_BYTES = 65_536;
14
+ const MAX_REQUEST_BYTES = 8_192;
15
+ const MAX_KEY_BYTES = 32_768;
16
+ export class SourceReleaseAuthorityError extends Error {
17
+ constructor(message = 'source release authority refused the request') { super(message); this.name = 'SourceReleaseAuthorityError'; }
18
+ }
19
+ function fail() { throw new SourceReleaseAuthorityError(); }
20
+ function object(value) { if (!value || typeof value !== 'object' || Array.isArray(value))
21
+ fail(); return value; }
22
+ function keys(value, expected) { if (Object.keys(value).sort().join('\0') !== [...expected].sort().join('\0'))
23
+ fail(); }
24
+ function text(value, pattern = ID, max = 4096) { if (typeof value !== 'string' || value.normalize('NFC').trim() !== value || !pattern.test(value) || Buffer.byteLength(value) > max || /[\p{Cc}]/u.test(value))
25
+ fail(); return value; }
26
+ function integer(value, min, max = Number.MAX_SAFE_INTEGER) { if (!Number.isSafeInteger(value) || Number(value) < min || Number(value) > max)
27
+ fail(); return Number(value); }
28
+ function path(value) { const result = text(value, /^[\s\S]+$/u); if (!result.startsWith('/') || resolve(result) !== result)
29
+ fail(); return result; }
30
+ function sameOwner(left, right) {
31
+ return left.authorityId === right.authorityId && left.authorityHash === right.authorityHash && left.principalId === right.principalId
32
+ && left.principalRecordId === right.principalRecordId && left.principalVersion === right.principalVersion
33
+ && left.workspace === right.workspace && left.agentPreset === right.agentPreset;
34
+ }
35
+ function policy(value, plugins) {
36
+ const item = object(value);
37
+ const fields = ['targetBranch', 'candidateId', 'packageName', 'packagePath', 'dshBaseline', 'capabilities', 'authorities', 'requires', 'registryId', 'registryLocator', 'catalogId', 'catalogPath', 'minimumReproducibleBuilds'];
38
+ keys(item, fields);
39
+ const candidateId = text(item.candidateId, /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/u, 64);
40
+ if (!plugins.includes(candidateId) || item.packageName !== `@dsh-enhanced/${candidateId}` || item.packagePath !== `plugins/${candidateId}`)
41
+ fail();
42
+ const locator = text(item.registryLocator, /^[\s\S]+$/u);
43
+ registryRoot(locator);
44
+ sourceAuthorityCanonicalSafePath(path(item.catalogPath), 'file');
45
+ // Parse a complete envelope through the production policy parser now. The
46
+ // two deliberately dynamic fields are replaced before the real signature.
47
+ const envelope = { schemaVersion: 1, kind: 'dsh-source-release-authorization', authorizationId: 'config-policy', authority: 'config', keyId: 'config',
48
+ planId: 'config-plan', planDigest: 'a'.repeat(64), baseCommit: 'b'.repeat(40), checkedTreeDigest: 'c'.repeat(64), checkedPatchDigest: 'd'.repeat(64),
49
+ scope: [`plugins/${candidateId}`], releasePolicy: { ...item, packageVersion: '0.0.1', registryReference: 'file:///configured-reference' },
50
+ authorizedAt: 1, expiresAt: 2, signature: Buffer.alloc(64).toString('base64') };
51
+ try {
52
+ const parsed = parseSourceReleaseAuthorization(envelope);
53
+ const { packageVersion: _version, registryReference: _reference, ...staticPolicy } = parsed.releasePolicy;
54
+ return Object.freeze(staticPolicy);
55
+ }
56
+ catch {
57
+ fail();
58
+ }
59
+ }
60
+ export function validateSourceReleaseAuthorityConfig(value) {
61
+ const item = object(value);
62
+ keys(item, ['schemaVersion', 'authority', 'keyId', 'keyPath', 'statePath', 'controlDatabasePath', 'grant']);
63
+ if (item.schemaVersion !== 1)
64
+ fail();
65
+ text(item.authority);
66
+ text(item.keyId);
67
+ const keyPath = path(item.keyPath);
68
+ const statePath = path(item.statePath);
69
+ const control = path(item.controlDatabasePath);
70
+ if (new Set([keyPath, statePath, control]).size !== 3)
71
+ fail();
72
+ const grant = object(item.grant);
73
+ keys(grant, ['id', 'expiresAt', 'maxReleases', 'repository', 'worktreeRoot', 'owner', 'plugins', 'maxChangedFiles', 'maxChangedBytes', 'receiptTtlMs', 'versioning', 'policies']);
74
+ text(grant.id);
75
+ integer(grant.expiresAt, 1);
76
+ integer(grant.maxReleases, 1, 10_000);
77
+ path(grant.repository);
78
+ path(grant.worktreeRoot);
79
+ integer(grant.maxChangedFiles, 1, 256);
80
+ integer(grant.maxChangedBytes, 1, 16 * 1024 * 1024);
81
+ integer(grant.receiptTtlMs, 1_000, 86_400_000);
82
+ if (grant.versioning !== 'patch' || !Array.isArray(grant.plugins) || grant.plugins.length === 0 || grant.plugins.length > 32)
83
+ fail();
84
+ const plugins = grant.plugins.map(value => text(value, /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/u, 64));
85
+ if (new Set(plugins).size !== plugins.length || plugins.some(value => PROTECTED_PLUGIN_DENYLIST.has(value)))
86
+ fail();
87
+ const owner = object(grant.owner);
88
+ keys(owner, ['authorityId', 'authorityHash', 'principalId', 'principalRecordId', 'principalVersion', 'workspace', 'agentPreset']);
89
+ text(owner.authorityId);
90
+ text(owner.authorityHash, DIGEST, 64);
91
+ text(owner.principalId, /^[\s\S]+$/u, 512);
92
+ text(owner.principalRecordId, /^[\s\S]+$/u, 512);
93
+ integer(owner.principalVersion, 1);
94
+ path(owner.workspace);
95
+ text(owner.agentPreset);
96
+ if (!Array.isArray(grant.policies) || grant.policies.length !== plugins.length)
97
+ fail();
98
+ const policies = grant.policies.map(value => policy(value, plugins));
99
+ if (new Set(policies.map(value => value.candidateId)).size !== policies.length)
100
+ fail();
101
+ }
102
+ function request(value) {
103
+ const item = object(value);
104
+ keys(item, ['protocol', 'planId', 'planDigest', 'sourceReferenceDigest']);
105
+ if (item.protocol !== 'dsh-source-release-authorization/v1')
106
+ fail();
107
+ return Object.freeze({ protocol: 'dsh-source-release-authorization/v1', planId: text(item.planId), planDigest: text(item.planDigest, DIGEST, 64), sourceReferenceDigest: text(item.sourceReferenceDigest, DIGEST, 64) });
108
+ }
109
+ function registryRoot(locator) {
110
+ let raw;
111
+ try {
112
+ raw = fileURLToPath(locator);
113
+ }
114
+ catch {
115
+ fail();
116
+ }
117
+ const canonical = sourceAuthorityCanonicalSafePath(raw, 'directory');
118
+ if (pathToFileURL(canonical).href !== locator)
119
+ fail();
120
+ return canonical;
121
+ }
122
+ function releaseAuthorization(config, plan, policyInput, version, privateKey, now, expiresAt) {
123
+ const root = registryRoot(policyInput.registryLocator);
124
+ sourceAuthorityCanonicalSafePath(policyInput.catalogPath, 'file');
125
+ const packageName = `@dsh-enhanced/${plan.name}`;
126
+ const registryReference = pathToFileURL(join(root, 'packages', encodeURIComponent(packageName), version, 'package.tgz')).href;
127
+ const releasePolicy = { ...policyInput, candidateId: plan.name, packageName, packagePath: `plugins/${plan.name}`, packageVersion: version, registryReference };
128
+ const unsigned = { schemaVersion: 1, kind: 'dsh-source-release-authorization',
129
+ authorizationId: `source-release-${controlPlaneDigest({ grant: config.grant.id, plan: plan.id, version }).slice(0, 40)}`,
130
+ authority: config.authority, keyId: config.keyId, planId: plan.id, planDigest: plan.digest, baseCommit: plan.baseCommit,
131
+ checkedTreeDigest: plan.sourceCheck.treeDigest, checkedPatchDigest: plan.sourceCheck.patchDigest, scope: plan.scope,
132
+ releasePolicy, authorizedAt: now, expiresAt };
133
+ const authorization = { ...unsigned, signature: sign(null, Buffer.from(sourceReleaseAuthorizationSigningPayload(unsigned)), privateKey).toString('base64') };
134
+ try {
135
+ return parseSourceReleaseAuthorization(authorization);
136
+ }
137
+ catch {
138
+ fail();
139
+ }
140
+ }
141
+ function ledger(path) {
142
+ sourceAuthorityCanonicalSafePath(path, 'file', true);
143
+ const db = new DatabaseSync(path);
144
+ db.exec(`PRAGMA busy_timeout = 5000; PRAGMA journal_mode = WAL; PRAGMA synchronous = FULL;
145
+ CREATE TABLE IF NOT EXISTS source_release_grants (grant_id TEXT PRIMARY KEY, config_digest TEXT NOT NULL, key_fingerprint TEXT NOT NULL) STRICT;
146
+ CREATE TABLE IF NOT EXISTS source_release_receipts (request_digest TEXT PRIMARY KEY, grant_id TEXT NOT NULL, config_digest TEXT NOT NULL, plan_id TEXT NOT NULL UNIQUE, plan_digest TEXT NOT NULL, receipt_json TEXT NOT NULL, receipt_digest TEXT NOT NULL) STRICT;`);
147
+ return db;
148
+ }
149
+ export async function authorizePreparedSourceRelease(configInput, requestInput) {
150
+ try {
151
+ validateSourceReleaseAuthorityConfig(configInput);
152
+ const config = configInput;
153
+ const requested = request(requestInput);
154
+ const now = Date.now();
155
+ if (now >= config.grant.expiresAt)
156
+ fail();
157
+ const keyBytes = sourceAuthorityReadSafeFile(config.keyPath, MAX_KEY_BYTES);
158
+ let privateKey;
159
+ try {
160
+ privateKey = createPrivateKey(keyBytes);
161
+ }
162
+ catch {
163
+ fail();
164
+ }
165
+ ;
166
+ if (privateKey.asymmetricKeyType !== 'ed25519')
167
+ fail();
168
+ const configDigest = controlPlaneDigest(config);
169
+ const keyFingerprint = createHash('sha256').update(keyBytes).digest('hex');
170
+ const control = new DatabaseSync(sourceAuthorityCanonicalSafePath(config.controlDatabasePath, 'file'), { readOnly: true });
171
+ let source;
172
+ let version;
173
+ try {
174
+ control.exec('PRAGMA query_only = ON;');
175
+ source = readOwnerPreparedSourcePlan(control, requested.planId);
176
+ if (source.plan.digest !== requested.planDigest || controlPlaneDigest(source.source) !== requested.sourceReferenceDigest || !sameOwner(source.source.owner, config.grant.owner))
177
+ fail();
178
+ if (source.plan.approval === undefined || source.plan.approval.decision !== 'approved')
179
+ fail();
180
+ sourceAuthorityValidatePrepared(source.plan, now, 'ready-for-human-review');
181
+ await sourceAuthorityValidateWorktree(source.plan, config.grant);
182
+ version = (await verifyManagedPatchVersion({ worktree: source.plan.worktree, baseCommit: source.plan.baseCommit, name: source.plan.name,
183
+ environment: sourceAuthorityEnvironment() })).version;
184
+ if (source.plan.preparedEvidence.pack.version !== version)
185
+ fail();
186
+ const final = readOwnerPreparedSourcePlan(control, requested.planId);
187
+ if (final.plan.status !== 'ready-for-human-review' || final.plan.digest !== source.plan.digest || controlPlaneDigest(final.source) !== controlPlaneDigest(source.source))
188
+ fail();
189
+ }
190
+ finally {
191
+ control.close();
192
+ }
193
+ const selected = config.grant.policies.find(value => value.candidateId === source.plan.name);
194
+ if (!selected)
195
+ fail();
196
+ const state = ledger(config.statePath);
197
+ try {
198
+ state.exec('BEGIN IMMEDIATE');
199
+ try {
200
+ const current = Date.now();
201
+ if (current >= config.grant.expiresAt)
202
+ fail();
203
+ sourceAuthorityValidatePrepared(source.plan, current, 'ready-for-human-review');
204
+ const expiresAt = Math.min(current + config.grant.receiptTtlMs, config.grant.expiresAt, source.plan.expiresAt);
205
+ if (expiresAt <= current)
206
+ fail();
207
+ const grant = state.prepare('SELECT config_digest, key_fingerprint FROM source_release_grants WHERE grant_id = ?').get(config.grant.id);
208
+ if (!grant)
209
+ state.prepare('INSERT INTO source_release_grants (grant_id, config_digest, key_fingerprint) VALUES (?, ?, ?)').run(config.grant.id, configDigest, keyFingerprint);
210
+ else if (grant.config_digest !== configDigest || grant.key_fingerprint !== keyFingerprint)
211
+ fail();
212
+ const digest = controlPlaneDigest(requested);
213
+ const prior = state.prepare('SELECT * FROM source_release_receipts WHERE request_digest = ?').get(digest);
214
+ if (prior) {
215
+ if (prior.grant_id !== config.grant.id || prior.config_digest !== configDigest || prior.plan_id !== requested.planId || prior.plan_digest !== requested.planDigest || prior.receipt_digest !== controlPlaneDigest(prior.receipt_json))
216
+ fail();
217
+ const replay = parseSourceReleaseAuthorization(JSON.parse(prior.receipt_json));
218
+ if (replay.expiresAt <= current || replay.authority !== config.authority || replay.keyId !== config.keyId)
219
+ fail();
220
+ state.exec('COMMIT');
221
+ return replay;
222
+ }
223
+ if (state.prepare('SELECT 1 FROM source_release_receipts WHERE plan_id = ?').get(requested.planId) || state.prepare('SELECT COUNT(*) AS count FROM source_release_receipts WHERE grant_id = ?').get(config.grant.id).count >= config.grant.maxReleases)
224
+ fail();
225
+ const authorization = releaseAuthorization(config, source.plan, selected, version, privateKey, current, expiresAt);
226
+ const json = JSON.stringify(authorization);
227
+ state.prepare('INSERT INTO source_release_receipts (request_digest, grant_id, config_digest, plan_id, plan_digest, receipt_json, receipt_digest) VALUES (?, ?, ?, ?, ?, ?, ?)')
228
+ .run(digest, config.grant.id, configDigest, requested.planId, requested.planDigest, json, controlPlaneDigest(json));
229
+ state.exec('COMMIT');
230
+ return authorization;
231
+ }
232
+ catch (error) {
233
+ try {
234
+ state.exec('ROLLBACK');
235
+ }
236
+ catch { }
237
+ throw error;
238
+ }
239
+ }
240
+ finally {
241
+ state.close();
242
+ }
243
+ }
244
+ catch (error) {
245
+ if (error instanceof SourceReleaseAuthorityError)
246
+ throw error;
247
+ throw new SourceReleaseAuthorityError();
248
+ }
249
+ }
250
+ export async function runSourceReleaseAuthority(argv = process.argv.slice(2)) {
251
+ try {
252
+ if (argv.length !== 2 || argv[0] !== '--config')
253
+ fail();
254
+ const bytes = sourceAuthorityReadSafeFile(path(argv[1]), MAX_CONFIG_BYTES);
255
+ const chunks = [];
256
+ let size = 0;
257
+ for await (const chunk of process.stdin) {
258
+ const value = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
259
+ if ((size += value.length) > MAX_REQUEST_BYTES)
260
+ fail();
261
+ chunks.push(value);
262
+ }
263
+ const config = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(bytes));
264
+ const input = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(Buffer.concat(chunks)));
265
+ process.stdout.write(`${JSON.stringify(await authorizePreparedSourceRelease(config, input))}\n`);
266
+ }
267
+ catch {
268
+ throw new SourceReleaseAuthorityError();
269
+ }
270
+ }
271
+ //# sourceMappingURL=source-release-authority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-release-authority.js","sourceRoot":"","sources":["../src/source-release-authority.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type SourceApprovalClientConfig, type SourceAuthorityRequest } from './source-approval-client.js';
2
+ import type { SourceReleaseAuthorization } from './types.js';
3
+ export type SourceReleaseClientConfig = SourceApprovalClientConfig;
4
+ export declare function validateSourceReleaseClientConfig(value: unknown): asserts value is SourceReleaseClientConfig;
5
+ export interface SourceReleaseAuthorizationRequest extends Omit<SourceAuthorityRequest, 'protocol'> {
6
+ protocol: 'dsh-source-release-authorization/v1';
7
+ }
8
+ /** Uses the existing owned subprocess transport; this helper cannot run release phases. */
9
+ export declare function requestSourceReleaseAuthorization(config: SourceReleaseClientConfig, request: SourceReleaseAuthorizationRequest, signal?: AbortSignal): Promise<SourceReleaseAuthorization>;
10
+ //# sourceMappingURL=source-release-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-release-client.d.ts","sourceRoot":"","sources":["../src/source-release-client.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,0BAA0B,EAAE,KAAK,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AACnG,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAA;AAE5D,MAAM,MAAM,yBAAyB,GAAG,0BAA0B,CAAA;AAClE,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,yBAAyB,CAE5G;AACD,MAAM,WAAW,iCAAkC,SAAQ,IAAI,CAAC,sBAAsB,EAAE,UAAU,CAAC;IACjG,QAAQ,EAAE,qCAAqC,CAAA;CAChD;AAED,2FAA2F;AAC3F,wBAAsB,iCAAiC,CAAC,MAAM,EAAE,yBAAyB,EAAE,OAAO,EAAE,iCAAiC,EACnI,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAY3D"}
@@ -0,0 +1,24 @@
1
+ import { parseSourceReleaseAuthorization } from './release.js';
2
+ import { requestSourceAuthorityReceipt, SourceApprovalClientError, validateSourceApprovalClientConfig } from './source-approval-client.js';
3
+ export function validateSourceReleaseClientConfig(value) {
4
+ validateSourceApprovalClientConfig(value);
5
+ }
6
+ /** Uses the existing owned subprocess transport; this helper cannot run release phases. */
7
+ export async function requestSourceReleaseAuthorization(config, request, signal) {
8
+ if (request?.protocol !== 'dsh-source-release-authorization/v1')
9
+ throw new SourceApprovalClientError('FAILED', 'source release request protocol is invalid');
10
+ return requestSourceAuthorityReceipt(config, request, value => {
11
+ let authorization;
12
+ try {
13
+ authorization = parseSourceReleaseAuthorization(value);
14
+ }
15
+ catch {
16
+ throw new SourceApprovalClientError('FAILED', 'source release authority returned an invalid authorization');
17
+ }
18
+ if (authorization.planId !== request.planId || authorization.planDigest !== request.planDigest) {
19
+ throw new SourceApprovalClientError('FAILED', 'source release authorization targets another plan');
20
+ }
21
+ return authorization;
22
+ }, signal);
23
+ }
24
+ //# sourceMappingURL=source-release-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-release-client.js","sourceRoot":"","sources":["../src/source-release-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAA;AAC9D,OAAO,EAAE,6BAA6B,EAAE,yBAAyB,EAAE,kCAAkC,EACrC,MAAM,6BAA6B,CAAA;AAInG,MAAM,UAAU,iCAAiC,CAAC,KAAc;IAC9D,kCAAkC,CAAC,KAAK,CAAC,CAAA;AAC3C,CAAC;AAKD,2FAA2F;AAC3F,MAAM,CAAC,KAAK,UAAU,iCAAiC,CAAC,MAAiC,EAAE,OAA0C,EACnI,MAAoB;IACpB,IAAI,OAAO,EAAE,QAAQ,KAAK,qCAAqC;QAAE,MAAM,IAAI,yBAAyB,CAAC,QAAQ,EAAE,4CAA4C,CAAC,CAAA;IAC5J,OAAO,6BAA6B,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE;QAC5D,IAAI,aAAyC,CAAA;QAC7C,IAAI,CAAC;YAAC,aAAa,GAAG,+BAA+B,CAAC,KAAK,CAAC,CAAA;QAAC,CAAC;QAAC,MAAM,CAAC;YACpE,MAAM,IAAI,yBAAyB,CAAC,QAAQ,EAAE,4DAA4D,CAAC,CAAA;QAC7G,CAAC;QACD,IAAI,aAAa,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC,UAAU,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC;YAC/F,MAAM,IAAI,yBAAyB,CAAC,QAAQ,EAAE,mDAAmD,CAAC,CAAA;QACpG,CAAC;QACD,OAAO,aAAa,CAAA;IACtB,CAAC,EAAE,MAAM,CAAC,CAAA;AACZ,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { Ed25519SourceReleaseAuthority } from './release.js';
2
+ import { type ControlPlaneStore } from './store.js';
3
+ import { type PluginControlTrustConfig } from './trust.js';
4
+ import type { PluginSourcePlan, SourceReleaseAuthorization, SourceReleaseReceipt, SourceReleaseRequest } from './types.js';
5
+ export interface SourceReleaseExecutionConfig {
6
+ /** Independently produced decisions consumed by the configured local review adapter. */
7
+ reviewDecisionRoot: string;
8
+ timeoutMs: number;
9
+ /** Ask the independently configured Host Verifier to produce a missing decision. */
10
+ independentReview?: boolean;
11
+ }
12
+ export declare function validateSourceReleaseExecutionConfig(value: SourceReleaseExecutionConfig): void;
13
+ export declare function sourceReleaseAuthorities(trust: PluginControlTrustConfig): {
14
+ authorize: (value: SourceReleaseAuthorization) => {
15
+ verify: (authorization: SourceReleaseAuthorization, plan: PluginSourcePlan) => Promise<import("./types.js").VerifiedSourceReleaseAuthorization>;
16
+ };
17
+ authority: (value: SourceReleaseReceipt) => Ed25519SourceReleaseAuthority;
18
+ };
19
+ export declare function advanceSourceRelease(options: {
20
+ store: ControlPlaneStore;
21
+ planId: string;
22
+ trust: PluginControlTrustConfig;
23
+ config: SourceReleaseExecutionConfig;
24
+ signal: AbortSignal;
25
+ assertCurrent: () => Promise<void>;
26
+ withSourceFence: <T>(callback: () => T) => T;
27
+ review?: (request: Extract<SourceReleaseRequest, {
28
+ phase: 'review';
29
+ }>, plan: PluginSourcePlan) => Promise<void>;
30
+ }): Promise<PluginSourcePlan>;
31
+ //# sourceMappingURL=source-release-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-release-runner.d.ts","sourceRoot":"","sources":["../src/source-release-runner.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,6BAA6B,EAA0E,MAAM,cAAc,CAAA;AAEpI,OAAO,EAA6C,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC9F,OAAO,EAAmB,KAAK,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAC3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAE1H,MAAM,WAAW,4BAA4B;IAC3C,wFAAwF;IACxF,kBAAkB,EAAE,MAAM,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,oFAAoF;IACpF,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAC5B;AACD,wBAAgB,oCAAoC,CAAC,KAAK,EAAE,4BAA4B,GAAG,IAAI,CAU9F;AAoBD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,wBAAwB;uBAC5C,0BAA0B;gCAGjB,0BAA0B,QAAQ,gBAAgB;;uBAK3D,oBAAoB;EAQ/C;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAE;IAClD,KAAK,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,wBAAwB,CAAC;IAAC,MAAM,EAAE,4BAA4B,CAAA;IAC/G,MAAM,EAAE,WAAW,CAAC;IAAC,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,eAAe,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IACrG,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,oBAAoB,EAAE;QAAE,KAAK,EAAE,QAAQ,CAAA;KAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAChH,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqD5B"}
@@ -0,0 +1,125 @@
1
+ /** Host continuation of the existing release phases. No scheduler or review authority. */
2
+ import { lstatSync } from 'node:fs';
3
+ import { isAbsolute, join, resolve } from 'node:path';
4
+ import { loadCatalogWithMetadata, previewCatalogAdmission } from './catalog.js';
5
+ import { Ed25519SourceReleaseAuthority, Ed25519SourceReleaseAuthorizationAuthority, invokeSourceReleaseAdapter } from './release.js';
6
+ import { sourceAuthorityCanonicalSafePath, sourceAuthorityReadSafeFile } from './source-approval-authority.js';
7
+ import { controlPlaneDigest, expectedSourceRelease } from './store.js';
8
+ import { resolveTrustKey } from './trust.js';
9
+ export function validateSourceReleaseExecutionConfig(value) {
10
+ if (!value || typeof value !== 'object' || Array.isArray(value)
11
+ || Object.keys(value).some(key => !['reviewDecisionRoot', 'timeoutMs', 'independentReview'].includes(key))
12
+ || (value.independentReview !== undefined && typeof value.independentReview !== 'boolean')
13
+ || typeof value.reviewDecisionRoot !== 'string' || !isAbsolute(value.reviewDecisionRoot)
14
+ || resolve(value.reviewDecisionRoot) !== value.reviewDecisionRoot
15
+ || !Number.isSafeInteger(value.timeoutMs) || value.timeoutMs < 1000 || value.timeoutMs > 1_800_000) {
16
+ throw new Error('plugin-control-plane: invalid sourceReleaseExecution config');
17
+ }
18
+ sourceAuthorityCanonicalSafePath(value.reviewDecisionRoot, 'directory');
19
+ }
20
+ /** A missing decision is a normal wait, never an attempted or self-approved review. */
21
+ function hasIndependentReview(request, root) {
22
+ if (request.phase !== 'review')
23
+ return true;
24
+ sourceAuthorityCanonicalSafePath(root, 'directory');
25
+ const path = join(root, `${request.input.prId}.json`);
26
+ try {
27
+ lstatSync(path);
28
+ }
29
+ catch (error) {
30
+ if (error.code === 'ENOENT')
31
+ return false;
32
+ throw error;
33
+ }
34
+ const decision = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(sourceAuthorityReadSafeFile(path, 8192)));
35
+ const expected = { schemaVersion: 1, kind: 'dsh-local-review-decision', prId: request.input.prId,
36
+ baseCommit: request.input.baseCommit, headCommit: request.input.headCommit, prEvidenceDigest: request.input.prEvidenceDigest,
37
+ decision: 'approved', reviewerPrincipal: decision?.reviewerPrincipal };
38
+ if (typeof expected.reviewerPrincipal !== 'string' || expected.reviewerPrincipal.trim() === '' || expected.reviewerPrincipal.length > 500
39
+ || controlPlaneDigest(decision) !== controlPlaneDigest(expected))
40
+ throw new Error('independent review decision does not match the current release');
41
+ return true;
42
+ }
43
+ export function sourceReleaseAuthorities(trust) {
44
+ const authorize = (value) => {
45
+ const key = resolveTrustKey(trust, 'release-authorization', value.authority, value.keyId);
46
+ const verifier = new Ed25519SourceReleaseAuthorizationAuthority(key.publicKeyPem, key.authority, key.keyId);
47
+ return { verify: (authorization, plan) => {
48
+ const { signatureDigest: _digest, ...signed } = authorization;
49
+ return verifier.verify(signed, plan);
50
+ } };
51
+ };
52
+ const authority = (value) => {
53
+ const key = resolveTrustKey(trust, 'release', value.authority, value.keyId);
54
+ return new Ed25519SourceReleaseAuthority(key.publicKeyPem, key.authority, key.keyId, Date.now, (id, keyId) => {
55
+ const verifier = trust.releaseAdapters?.['registry-verify'];
56
+ return verifier?.authority === id && verifier.keyId === keyId ? resolveTrustKey(trust, 'release', id, keyId).publicKeyPem : undefined;
57
+ });
58
+ };
59
+ return { authorize, authority };
60
+ }
61
+ export async function advanceSourceRelease(options) {
62
+ const { store, trust, signal, withSourceFence } = options;
63
+ if (trust.schemaVersion !== 4 || !trust.releaseRegistry?.locator.startsWith('file:'))
64
+ throw new Error('source release execution requires local schema-v4 trust');
65
+ const { authorize, authority } = sourceReleaseAuthorities(trust);
66
+ // Exactly the existing eight phases, with state/receipt recovery from the Store.
67
+ for (let step = 0; step < 8; step++) {
68
+ await options.assertCurrent();
69
+ signal.throwIfAborted();
70
+ const plan = store.getSourcePlan(options.planId), expected = expectedSourceRelease(plan.status);
71
+ if (!expected)
72
+ return plan;
73
+ if (!plan.release || !plan.releaseAuthorization)
74
+ throw new Error('source release has no authorization');
75
+ const adapter = trust.releaseAdapters?.[expected.phase];
76
+ if (!adapter)
77
+ throw new Error(`source release adapter missing: ${expected.phase}`);
78
+ if (plan.releaseAuthorization.releasePolicy.registryId !== trust.releaseRegistry.id
79
+ || plan.releaseAuthorization.releasePolicy.registryLocator !== trust.releaseRegistry.locator
80
+ || plan.releaseAuthorization.releasePolicy.catalogId !== trust.catalog.id
81
+ || plan.releaseAuthorization.releasePolicy.catalogPath !== trust.catalog.path)
82
+ throw new Error('source release trust changed');
83
+ let operation = store.findSourceReleaseOperation(plan.id, expected.phase, plan.release.fence);
84
+ if (!operation) {
85
+ let catalog = { id: trust.catalog.id, path: trust.catalog.path };
86
+ if (expected.phase === 'catalog-admission') {
87
+ const loaded = await loadCatalogWithMetadata(trust.catalog.path);
88
+ const preview = previewCatalogAdmission(loaded.catalog, store.previewSourceReleaseCandidate(plan.id));
89
+ catalog = { ...catalog, expectedBeforeDigest: preview.beforeCatalogDigest, expectedAfterDigest: preview.afterCatalogDigest };
90
+ }
91
+ await options.assertCurrent();
92
+ operation = await store.prepareSourceReleaseOperation({ planId: plan.id, expectedRevision: plan.revision, expectedFence: plan.release.fence,
93
+ installationId: trust.installationId, ledger: trust.ledger, registry: { id: trust.releaseRegistry.id, locator: trust.releaseRegistry.locator }, catalog,
94
+ adapter: { id: adapter.id, version: adapter.version, path: adapter.path, sha256: adapter.sha256, interpreter: adapter.interpreter, authority: adapter.authority, keyId: adapter.keyId },
95
+ receiptTtlMs: trust.releaseReceiptTtlMs, resolveAuthorizationAuthority: authorize, withSourceFence });
96
+ }
97
+ else if (controlPlaneDigest(operation.request.adapter) !== controlPlaneDigest({ id: adapter.id, version: adapter.version,
98
+ path: adapter.path, sha256: adapter.sha256, interpreter: adapter.interpreter, authority: adapter.authority, keyId: adapter.keyId })) {
99
+ throw new Error('source release adapter changed since preparation');
100
+ }
101
+ // A completed signed receipt can be applied even if the decision file was
102
+ // subsequently removed. Store still rechecks its exact request and source.
103
+ if (!operation.receipt && !hasIndependentReview(operation.request, options.config.reviewDecisionRoot)) {
104
+ if (options.config.independentReview && options.review && operation.request.phase === 'review') {
105
+ await options.assertCurrent();
106
+ signal.throwIfAborted();
107
+ await options.review(operation.request, plan);
108
+ await options.assertCurrent();
109
+ signal.throwIfAborted();
110
+ }
111
+ if (!hasIndependentReview(operation.request, options.config.reviewDecisionRoot))
112
+ return plan;
113
+ }
114
+ await options.assertCurrent();
115
+ const receipt = await store.runSourceReleaseOperation({ operationId: operation.operationId, expectedRevision: plan.revision,
116
+ expectedFence: plan.release.fence, resolveAuthority: authority, resolveAuthorizationAuthority: authorize, withSourceFence,
117
+ execute: async (request) => { await options.assertCurrent(); signal.throwIfAborted(); return invokeSourceReleaseAdapter(trust, request, signal); } });
118
+ await options.assertCurrent();
119
+ await store.applySourceRelease({ planId: plan.id, expectedRevision: plan.revision, expectedFence: plan.release.fence, receipt,
120
+ resolveAuthority: authority, idempotencyKey: `source-release:${operation.operationId}`, withSourceFence });
121
+ }
122
+ await options.assertCurrent();
123
+ return store.getSourcePlan(options.planId);
124
+ }
125
+ //# sourceMappingURL=source-release-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-release-runner.js","sourceRoot":"","sources":["../src/source-release-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { type ScopedPluginFile } from './source-workspace.js';
2
+ export interface ManagedPatchVersionInput {
3
+ worktree: string;
4
+ baseCommit: string;
5
+ name: string;
6
+ environment: NodeJS.ProcessEnv;
7
+ signal?: AbortSignal;
8
+ assertCurrent?: () => void | Promise<void>;
9
+ }
10
+ export interface ManagedPatchVersionFiles {
11
+ baseVersion: string;
12
+ version: string;
13
+ files: readonly ScopedPluginFile[];
14
+ }
15
+ /** Derive, but never write, the Host-reserved patch-version file contents. */
16
+ export declare function managedPatchVersionFiles(input: ManagedPatchVersionInput): Promise<ManagedPatchVersionFiles>;
17
+ /** Re-read current files and prove that only the Host-reserved version fields changed. */
18
+ export declare function verifyManagedPatchVersion(input: ManagedPatchVersionInput): Promise<{
19
+ baseVersion: string;
20
+ version: string;
21
+ }>;
22
+ /** Candidate source files may never replace Host-reserved version fields. */
23
+ export declare function assertManagedVersionPaths(files: readonly ScopedPluginFile[]): void;
24
+ //# sourceMappingURL=source-versioning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-versioning.d.ts","sourceRoot":"","sources":["../src/source-versioning.ts"],"names":[],"mappings":"AAIA,OAAO,EAA+F,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAO1J,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAC,UAAU,CAAA;IAC9B,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3C;AAED,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAA;CACnC;AAoID,8EAA8E;AAC9E,wBAAsB,wBAAwB,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAOjH;AAED,0FAA0F;AAC1F,wBAAsB,yBAAyB,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAkBlI;AAED,6EAA6E;AAC7E,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,GAAG,IAAI,CAWlF"}