@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,412 @@
1
+ /**
2
+ * Owner-operated, finite source-approval boundary.
3
+ *
4
+ * This module has no Cordis service and never executes a candidate. It can
5
+ * only sign one pending, owner-bound prepared source plan after independently
6
+ * re-reading the control database and the checked Git worktree.
7
+ */
8
+ import { createHash, createPrivateKey, sign } from 'node:crypto';
9
+ import { constants as fsConstants, closeSync, fstatSync, lstatSync, openSync, readFileSync, realpathSync } from 'node:fs';
10
+ import { dirname, isAbsolute, relative, resolve, sep } from 'node:path';
11
+ import { DatabaseSync } from 'node:sqlite';
12
+ import { approvalSigningPayload, parseApprovalReceipt } from './approval.js';
13
+ import { PREPARED_SOURCE_BUILD_SCRIPT } from './source-build.js';
14
+ import { controlPlaneDigest, readOwnerPreparedSourcePlan } from './store.js';
15
+ import { PROTECTED_PLUGIN_DENYLIST, changedSourcePaths, checkedSourceSnapshot, runLocalCommand } from './source-workspace.js';
16
+ import { verifyManagedPatchVersion } from './source-versioning.js';
17
+ const ID = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,159}$/u;
18
+ const DIGEST = /^[a-f0-9]{64}$/u;
19
+ const COMMIT = /^[a-f0-9]{40}$/u;
20
+ const SOURCE_FILE = /^plugins\/([a-z][a-z0-9]*(?:-[a-z0-9]+)*)\/src\/.+\.(?:ts|js|mts|mjs)$/u;
21
+ const SOURCE_TEST_PATH = /(?:^|\/)(?:__tests__|test|tests)(?:\/|$)|\.(?:spec|test)\.(?:ts|js|mts|mjs)$/u;
22
+ const MAX_CONFIG_BYTES = 32_768;
23
+ const MAX_REQUEST_BYTES = 8_192;
24
+ const MAX_KEY_BYTES = 32_768;
25
+ class SourceApprovalAuthorityError extends Error {
26
+ constructor(message = 'source approval authority refused the request') { super(message); this.name = 'SourceApprovalAuthorityError'; }
27
+ }
28
+ function fail() { throw new SourceApprovalAuthorityError(); }
29
+ function record(value) {
30
+ if (typeof value !== 'object' || value === null || Array.isArray(value))
31
+ fail();
32
+ return value;
33
+ }
34
+ function exactKeys(value, expected) {
35
+ if (Object.keys(value).sort().join('\0') !== [...expected].sort().join('\0'))
36
+ fail();
37
+ }
38
+ function text(value, pattern = ID, maximum = 160) {
39
+ if (typeof value !== 'string' || value.normalize('NFC').trim() !== value || !pattern.test(value)
40
+ || Buffer.byteLength(value) > maximum || /[\p{Cc}]/u.test(value))
41
+ fail();
42
+ return value;
43
+ }
44
+ function pathText(value) {
45
+ const path = text(value, /^[\s\S]+$/u, 4_096);
46
+ if (!isAbsolute(path) || path === '/' || resolve(path) !== path)
47
+ fail();
48
+ return path;
49
+ }
50
+ function integer(value, minimum, maximum = Number.MAX_SAFE_INTEGER) {
51
+ if (!Number.isSafeInteger(value) || value < minimum || value > maximum)
52
+ fail();
53
+ return value;
54
+ }
55
+ export function sourceAuthorityCanonicalSafePath(path, kind, createFile = false) {
56
+ const uid = process.getuid?.();
57
+ const parent = dirname(path);
58
+ let parentStat;
59
+ try {
60
+ parentStat = lstatSync(parent);
61
+ }
62
+ catch {
63
+ fail();
64
+ }
65
+ if (!parentStat.isDirectory() || parentStat.isSymbolicLink()
66
+ || (kind === 'file' && ((parentStat.mode & 0o077) !== 0 || (uid !== undefined && parentStat.uid !== uid))))
67
+ fail();
68
+ if (createFile) {
69
+ try {
70
+ const created = openSync(path, fsConstants.O_CREAT | fsConstants.O_EXCL | fsConstants.O_RDWR, 0o600);
71
+ closeSync(created);
72
+ }
73
+ catch (error) {
74
+ if (!(error instanceof Error) || !('code' in error) || error.code !== 'EEXIST')
75
+ fail();
76
+ }
77
+ }
78
+ let stat;
79
+ try {
80
+ stat = lstatSync(path);
81
+ }
82
+ catch {
83
+ fail();
84
+ }
85
+ if ((kind === 'file' ? !stat.isFile() : !stat.isDirectory()) || stat.isSymbolicLink() || (kind === 'file' && stat.nlink !== 1)
86
+ || (stat.mode & 0o077) !== 0 || (uid !== undefined && stat.uid !== uid) || realpathSync(path) !== path)
87
+ fail();
88
+ return path;
89
+ }
90
+ export function sourceAuthorityCanonicalRepository(path) {
91
+ const uid = process.getuid?.();
92
+ let stat;
93
+ try {
94
+ stat = lstatSync(path);
95
+ }
96
+ catch {
97
+ fail();
98
+ }
99
+ if (!stat.isDirectory() || stat.isSymbolicLink() || (stat.mode & 0o022) !== 0
100
+ || (uid !== undefined && stat.uid !== uid) || realpathSync(path) !== path)
101
+ fail();
102
+ return path;
103
+ }
104
+ export function sourceAuthorityReadSafeFile(path, maximum) {
105
+ sourceAuthorityCanonicalSafePath(path, 'file');
106
+ const fd = openSync(path, fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW);
107
+ try {
108
+ const before = fstatSync(fd, { bigint: true });
109
+ const named = lstatSync(path, { bigint: true });
110
+ if (!before.isFile() || before.nlink !== 1n || before.size > BigInt(maximum) || before.dev !== named.dev || before.ino !== named.ino)
111
+ fail();
112
+ const bytes = readFileSync(fd);
113
+ const after = fstatSync(fd, { bigint: true });
114
+ const namedAfter = lstatSync(path, { bigint: true });
115
+ if (bytes.length > maximum || before.dev !== after.dev || before.ino !== after.ino || after.dev !== namedAfter.dev || after.ino !== namedAfter.ino)
116
+ fail();
117
+ return bytes;
118
+ }
119
+ finally {
120
+ closeSync(fd);
121
+ }
122
+ }
123
+ function equivalentOwner(left, right) {
124
+ return left.authorityId === right.authorityId && left.authorityHash === right.authorityHash
125
+ && left.principalId === right.principalId && left.principalRecordId === right.principalRecordId
126
+ && left.principalVersion === right.principalVersion && left.workspace === right.workspace && left.agentPreset === right.agentPreset;
127
+ }
128
+ export function sourceAuthorityEnvironment() {
129
+ const path = process.env.PATH;
130
+ if (path === undefined || path === '')
131
+ fail();
132
+ return Object.freeze({ PATH: path, LANG: 'C', LC_ALL: 'C', GIT_CONFIG_NOSYSTEM: '1', GIT_CONFIG_GLOBAL: '/dev/null',
133
+ GIT_OPTIONAL_LOCKS: '0', GIT_TERMINAL_PROMPT: '0', HOME: '/nonexistent' });
134
+ }
135
+ function validateRequest(value) {
136
+ const item = record(value);
137
+ exactKeys(item, ['protocol', 'planId', 'planDigest', 'sourceReferenceDigest']);
138
+ if (item.protocol !== 'dsh-source-approval/v1')
139
+ fail();
140
+ const planId = text(item.planId);
141
+ const planDigest = text(item.planDigest, DIGEST, 64);
142
+ const sourceReferenceDigest = text(item.sourceReferenceDigest, DIGEST, 64);
143
+ return Object.freeze({ protocol: 'dsh-source-approval/v1', planId, planDigest, sourceReferenceDigest });
144
+ }
145
+ export function validateSourceApprovalAuthorityConfig(value) {
146
+ const item = record(value);
147
+ exactKeys(item, ['schemaVersion', 'authority', 'keyId', 'keyPath', 'statePath', 'controlDatabasePath', 'grant']);
148
+ if (item.schemaVersion !== 1)
149
+ fail();
150
+ const grant = record(item.grant);
151
+ exactKeys(grant, ['id', 'expiresAt', 'maxApprovals', 'repository', 'worktreeRoot', 'owner', 'plugins', 'maxChangedFiles', 'maxChangedBytes', 'receiptTtlMs',
152
+ ...(Object.hasOwn(grant, 'versioning') ? ['versioning'] : [])]);
153
+ if (Object.hasOwn(grant, 'versioning') && grant.versioning !== 'patch')
154
+ fail();
155
+ text(item.authority);
156
+ text(item.keyId);
157
+ const keyPath = pathText(item.keyPath);
158
+ const statePath = pathText(item.statePath);
159
+ const controlDatabasePath = pathText(item.controlDatabasePath);
160
+ if (new Set([keyPath, statePath, controlDatabasePath]).size !== 3)
161
+ fail();
162
+ text(grant.id);
163
+ integer(grant.expiresAt, 1);
164
+ integer(grant.maxApprovals, 1, 10_000);
165
+ pathText(grant.repository);
166
+ pathText(grant.worktreeRoot);
167
+ const owner = record(grant.owner);
168
+ exactKeys(owner, ['authorityId', 'authorityHash', 'principalId', 'principalRecordId', 'principalVersion', 'workspace', 'agentPreset']);
169
+ text(owner.authorityId);
170
+ text(owner.authorityHash, DIGEST, 64);
171
+ text(owner.principalId, /^[\s\S]+$/u, 512);
172
+ text(owner.principalRecordId, /^[\s\S]+$/u, 512);
173
+ integer(owner.principalVersion, 1);
174
+ pathText(owner.workspace);
175
+ text(owner.agentPreset);
176
+ if (!Array.isArray(grant.plugins) || grant.plugins.length === 0 || grant.plugins.length > 32)
177
+ fail();
178
+ const plugins = grant.plugins.map(plugin => text(plugin, /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/u, 64));
179
+ if (new Set(plugins).size !== plugins.length || plugins.some(plugin => PROTECTED_PLUGIN_DENYLIST.has(plugin)))
180
+ fail();
181
+ integer(grant.maxChangedFiles, 1, 256);
182
+ integer(grant.maxChangedBytes, 1, 16 * 1024 * 1024);
183
+ integer(grant.receiptTtlMs, 1_000, 86_400_000);
184
+ }
185
+ export function sourceAuthorityValidatePrepared(plan, now, status = 'pending-approval') {
186
+ if (plan.status !== status || plan.mode !== 'modify' || plan.sourceCheck === undefined || plan.preparedEvidence === undefined
187
+ || now > plan.expiresAt || plan.preparedEvidence.preparedAt > plan.sourceCheck.checkedAt || plan.sourceCheck.checkedAt > plan.createdAt
188
+ || plan.preparedEvidence.preparedAt > now || plan.preparedEvidence.environment.npmConfigIgnoreScripts !== true
189
+ || plan.preparedEvidence.environment.frozenLockfile !== true || plan.preparedEvidence.environment.offline !== true
190
+ || plan.preparedEvidence.commands.length !== 1)
191
+ fail();
192
+ const command = plan.preparedEvidence.commands[0];
193
+ const pairs = (left, right) => command.args.some((value, index) => value === left && command.args[index + 1] === right);
194
+ if (command.command !== 'docker' || command.args[0] !== 'run' || command.args[1] !== '-i' || command.args[2] !== '--pull'
195
+ || command.args[3] !== 'never' || !pairs('--network', 'none') || !command.args.includes('--read-only')
196
+ || !pairs('--cap-drop', 'ALL') || !pairs('--user', '65534:65534') || !pairs('--entrypoint', '/bin/sh')
197
+ || !pairs('--env', `PLUGIN_ROOT=plugins/${plan.name}`) || command.args.at(-2) !== '-ceu'
198
+ || command.args.at(-1) !== PREPARED_SOURCE_BUILD_SCRIPT)
199
+ fail();
200
+ }
201
+ export async function sourceAuthorityValidateWorktree(plan, grant) {
202
+ if (!COMMIT.test(plan.baseCommit) || PROTECTED_PLUGIN_DENYLIST.has(plan.name) || !grant.plugins.includes(plan.name))
203
+ fail();
204
+ const repository = sourceAuthorityCanonicalRepository(grant.repository);
205
+ const worktreeRoot = sourceAuthorityCanonicalSafePath(grant.worktreeRoot, 'directory');
206
+ const worktree = sourceAuthorityCanonicalSafePath(plan.worktree, 'directory');
207
+ const worktreeRelative = relative(worktreeRoot, worktree);
208
+ if (plan.repository !== repository || worktreeRelative === '' || worktreeRelative === '..' || worktreeRelative.startsWith(`..${sep}`) || isAbsolute(worktreeRelative))
209
+ fail();
210
+ const environment = sourceAuthorityEnvironment();
211
+ const head = (await runLocalCommand('git', ['rev-parse', '--verify', 'HEAD^{commit}'], worktree, environment, { capture: true })).trim();
212
+ if (head !== plan.baseCommit)
213
+ fail();
214
+ const repositoryCommon = (await runLocalCommand('git', ['rev-parse', '--path-format=absolute', '--git-common-dir'], repository, environment, { capture: true })).trim();
215
+ const worktreeCommon = (await runLocalCommand('git', ['rev-parse', '--path-format=absolute', '--git-common-dir'], worktree, environment, { capture: true })).trim();
216
+ if (!isAbsolute(repositoryCommon) || !isAbsolute(worktreeCommon) || realpathSync(repositoryCommon) !== realpathSync(worktreeCommon))
217
+ fail();
218
+ const paths = await changedSourcePaths(worktree, plan.baseCommit, environment);
219
+ if (paths.length === 0 || paths.length > grant.maxChangedFiles)
220
+ fail();
221
+ const manifestPath = `plugins/${plan.name}/package.json`;
222
+ if (grant.versioning === 'patch') {
223
+ if (!paths.includes(manifestPath) || !paths.includes(`plugins/${plan.name}/src/version.ts`))
224
+ fail();
225
+ const managed = await verifyManagedPatchVersion({ worktree, baseCommit: plan.baseCommit, name: plan.name, environment });
226
+ if (plan.preparedEvidence?.pack.version !== managed.version)
227
+ fail();
228
+ }
229
+ let bytes = 0;
230
+ for (const path of paths) {
231
+ const match = SOURCE_FILE.exec(path);
232
+ const managedManifest = grant.versioning === 'patch' && path === manifestPath;
233
+ if (!managedManifest && (!match || match[1] !== plan.name || SOURCE_TEST_PATH.test(path)))
234
+ fail();
235
+ const target = resolve(worktree, path);
236
+ if (relative(worktree, target).startsWith(`..${sep}`) || target === worktree)
237
+ fail();
238
+ let stat;
239
+ try {
240
+ stat = lstatSync(target);
241
+ }
242
+ catch {
243
+ fail();
244
+ }
245
+ if (!stat.isFile() || stat.isSymbolicLink() || realpathSync(target) !== target)
246
+ fail();
247
+ bytes += stat.size;
248
+ if (bytes > grant.maxChangedBytes)
249
+ fail();
250
+ }
251
+ const checked = await checkedSourceSnapshot(worktree, plan.baseCommit, plan.scope, environment);
252
+ if (checked.checkedTreeDigest !== plan.sourceCheck.treeDigest || checked.checkedPatchDigest !== plan.sourceCheck.patchDigest)
253
+ fail();
254
+ }
255
+ function openLedger(path) {
256
+ sourceAuthorityCanonicalSafePath(path, 'file', true);
257
+ const database = new DatabaseSync(path);
258
+ database.exec(`PRAGMA busy_timeout = 5000; PRAGMA journal_mode = WAL; PRAGMA synchronous = FULL;
259
+ CREATE TABLE IF NOT EXISTS source_approval_grants (
260
+ grant_id TEXT PRIMARY KEY, config_digest TEXT NOT NULL, key_fingerprint TEXT NOT NULL, created_at INTEGER NOT NULL
261
+ ) STRICT;
262
+ CREATE TABLE IF NOT EXISTS source_approval_receipts (
263
+ 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,
264
+ receipt_json TEXT NOT NULL, receipt_digest TEXT NOT NULL, created_at INTEGER NOT NULL
265
+ ) STRICT;`);
266
+ return database;
267
+ }
268
+ function receiptFor(config, request, privateKey, now, expiresAt) {
269
+ const unsigned = { schemaVersion: 1,
270
+ approvalId: `source-approval-${controlPlaneDigest({ grant: config.grant.id, request }).slice(0, 40)}`,
271
+ authority: config.authority, keyId: config.keyId, planId: request.planId, planDigest: request.planDigest,
272
+ decision: 'approved', principal: config.grant.owner.principalId, decidedAt: now, expiresAt };
273
+ return Object.freeze({ ...unsigned, signature: sign(null, Buffer.from(approvalSigningPayload(unsigned)), privateKey).toString('base64') });
274
+ }
275
+ /** Sign a finite, freshly rechecked source approval. It cannot approve a release or activation. */
276
+ export async function authorizePreparedSource(configInput, requestInput) {
277
+ try {
278
+ validateSourceApprovalAuthorityConfig(configInput);
279
+ const config = configInput;
280
+ const request = validateRequest(requestInput);
281
+ if (Date.now() >= config.grant.expiresAt)
282
+ fail();
283
+ const sourcePath = sourceAuthorityCanonicalSafePath(config.controlDatabasePath, 'file');
284
+ const keyBytes = sourceAuthorityReadSafeFile(config.keyPath, MAX_KEY_BYTES);
285
+ let privateKey;
286
+ try {
287
+ privateKey = createPrivateKey(keyBytes);
288
+ }
289
+ catch {
290
+ fail();
291
+ }
292
+ if (privateKey.asymmetricKeyType !== 'ed25519')
293
+ fail();
294
+ const keyFingerprint = createHash('sha256').update(keyBytes).digest('hex');
295
+ const configDigest = controlPlaneDigest(config);
296
+ const database = new DatabaseSync(sourcePath, { readOnly: true });
297
+ let source;
298
+ try {
299
+ database.exec('PRAGMA query_only = ON;');
300
+ source = readOwnerPreparedSourcePlan(database, request.planId);
301
+ if (source.plan.digest !== request.planDigest || controlPlaneDigest(source.source) !== request.sourceReferenceDigest
302
+ || !equivalentOwner(source.source.owner, config.grant.owner))
303
+ fail();
304
+ sourceAuthorityValidatePrepared(source.plan, Date.now());
305
+ await sourceAuthorityValidateWorktree(source.plan, config.grant);
306
+ const final = readOwnerPreparedSourcePlan(database, request.planId);
307
+ if (final.plan.digest !== source.plan.digest || controlPlaneDigest(final.source) !== controlPlaneDigest(source.source) || final.plan.status !== 'pending-approval')
308
+ fail();
309
+ }
310
+ finally {
311
+ database.close();
312
+ }
313
+ const requestDigest = controlPlaneDigest(request);
314
+ const ledger = openLedger(config.statePath);
315
+ try {
316
+ ledger.exec('BEGIN IMMEDIATE');
317
+ try {
318
+ const now = Date.now();
319
+ if (now >= config.grant.expiresAt)
320
+ fail();
321
+ sourceAuthorityValidatePrepared(source.plan, now);
322
+ const receiptExpiry = Math.min(now + config.grant.receiptTtlMs, config.grant.expiresAt, source.plan.expiresAt);
323
+ if (receiptExpiry <= now)
324
+ fail();
325
+ const grant = ledger.prepare('SELECT config_digest, key_fingerprint FROM source_approval_grants WHERE grant_id = ?').get(config.grant.id);
326
+ if (grant === undefined)
327
+ ledger.prepare('INSERT INTO source_approval_grants (grant_id, config_digest, key_fingerprint, created_at) VALUES (?, ?, ?, ?)')
328
+ .run(config.grant.id, configDigest, keyFingerprint, now);
329
+ else if (grant.config_digest !== configDigest || grant.key_fingerprint !== keyFingerprint)
330
+ fail();
331
+ const existing = ledger.prepare('SELECT request_digest, grant_id, config_digest, plan_id, plan_digest, receipt_json, receipt_digest FROM source_approval_receipts WHERE request_digest = ?')
332
+ .get(requestDigest);
333
+ if (existing !== undefined) {
334
+ if (existing.grant_id !== config.grant.id || existing.config_digest !== configDigest || existing.plan_id !== request.planId
335
+ || existing.plan_digest !== request.planDigest || existing.receipt_digest !== controlPlaneDigest(existing.receipt_json))
336
+ fail();
337
+ const receipt = parseApprovalReceipt(JSON.parse(existing.receipt_json));
338
+ if (receipt.expiresAt <= now || receipt.authority !== config.authority || receipt.keyId !== config.keyId)
339
+ fail();
340
+ ledger.exec('COMMIT');
341
+ return receipt;
342
+ }
343
+ if (ledger.prepare('SELECT request_digest FROM source_approval_receipts WHERE plan_id = ?').get(request.planId) !== undefined)
344
+ fail();
345
+ const used = ledger.prepare('SELECT COUNT(*) AS count FROM source_approval_receipts WHERE grant_id = ?').get(config.grant.id);
346
+ if (used.count >= config.grant.maxApprovals)
347
+ fail();
348
+ const receipt = receiptFor(config, request, privateKey, now, receiptExpiry);
349
+ const receiptJson = JSON.stringify(receipt);
350
+ ledger.prepare('INSERT INTO source_approval_receipts (request_digest, grant_id, config_digest, plan_id, plan_digest, receipt_json, receipt_digest, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)')
351
+ .run(requestDigest, config.grant.id, configDigest, request.planId, request.planDigest, receiptJson, controlPlaneDigest(receiptJson), now);
352
+ ledger.exec('COMMIT');
353
+ return receipt;
354
+ }
355
+ catch (error) {
356
+ try {
357
+ ledger.exec('ROLLBACK');
358
+ }
359
+ catch { /* no transaction after a failed commit */ }
360
+ throw error;
361
+ }
362
+ }
363
+ finally {
364
+ ledger.close();
365
+ }
366
+ }
367
+ catch (error) {
368
+ if (error instanceof SourceApprovalAuthorityError)
369
+ throw error;
370
+ throw new SourceApprovalAuthorityError();
371
+ }
372
+ }
373
+ async function readOneRequest() {
374
+ const chunks = [];
375
+ let size = 0;
376
+ for await (const chunk of process.stdin) {
377
+ const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
378
+ size += bytes.length;
379
+ if (size > MAX_REQUEST_BYTES)
380
+ fail();
381
+ chunks.push(bytes);
382
+ }
383
+ try {
384
+ return JSON.parse(Buffer.concat(chunks).toString('utf8'));
385
+ }
386
+ catch {
387
+ fail();
388
+ }
389
+ }
390
+ /** CLI entrypoint: exactly --config <absolute-path>, one bounded JSON request on stdin, one receipt on stdout. */
391
+ export async function runSourceApprovalAuthority(argv = process.argv.slice(2)) {
392
+ try {
393
+ if (argv.length !== 2 || argv[0] !== '--config')
394
+ fail();
395
+ const configPath = pathText(argv[1]);
396
+ const configBytes = sourceAuthorityReadSafeFile(configPath, MAX_CONFIG_BYTES);
397
+ let config;
398
+ try {
399
+ config = JSON.parse(configBytes.toString('utf8'));
400
+ }
401
+ catch {
402
+ fail();
403
+ }
404
+ const request = await readOneRequest();
405
+ const receipt = await authorizePreparedSource(config, request);
406
+ process.stdout.write(`${JSON.stringify(receipt)}\n`);
407
+ }
408
+ catch {
409
+ throw new SourceApprovalAuthorityError();
410
+ }
411
+ }
412
+ //# sourceMappingURL=source-approval-authority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-approval-authority.js","sourceRoot":"","sources":["../src/source-approval-authority.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { ApprovalReceipt } from './types.js';
2
+ export interface SourceApprovalClientConfig {
3
+ executable: {
4
+ path: string;
5
+ sha256: string;
6
+ };
7
+ interpreter?: {
8
+ path: string;
9
+ sha256: string;
10
+ };
11
+ configPath: string;
12
+ timeoutMs: number;
13
+ }
14
+ export interface SourceApprovalRequest {
15
+ protocol: 'dsh-source-approval/v1';
16
+ planId: string;
17
+ planDigest: string;
18
+ sourceReferenceDigest: string;
19
+ }
20
+ export type SourceApprovalClientErrorCode = 'ABORTED' | 'EXECUTABLE_CHANGED' | 'FAILED' | 'INVALID_CONFIG' | 'OUTPUT_LIMIT' | 'TIMEOUT';
21
+ export declare class SourceApprovalClientError extends Error {
22
+ readonly code: SourceApprovalClientErrorCode;
23
+ constructor(code: SourceApprovalClientErrorCode, message: string);
24
+ }
25
+ export declare function validateSourceApprovalClientConfig(value: unknown): asserts value is SourceApprovalClientConfig;
26
+ export interface SourceAuthorityRequest extends Omit<SourceApprovalRequest, 'protocol'> {
27
+ protocol: 'dsh-source-approval/v1' | 'dsh-source-release-authorization/v1' | 'dsh-source-adoption/v1';
28
+ }
29
+ export declare function requestSourceAuthorityReceipt<T>(config: SourceApprovalClientConfig, request: SourceAuthorityRequest, parseReceipt: (value: unknown) => T, signal?: AbortSignal): Promise<T>;
30
+ export declare function requestPinnedAuthorityReceipt<T>(config: SourceApprovalClientConfig, request: unknown, parseReceipt: (value: unknown) => T, signal?: AbortSignal): Promise<T>;
31
+ export declare function requestSourceApproval(config: SourceApprovalClientConfig, request: SourceApprovalRequest, signal?: AbortSignal): Promise<ApprovalReceipt>;
32
+ //# sourceMappingURL=source-approval-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-approval-client.d.ts","sourceRoot":"","sources":["../src/source-approval-client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAOjD,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5C,WAAW,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9C,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,wBAAwB,CAAA;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,qBAAqB,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,MAAM,6BAA6B,GAAG,SAAS,GAAG,oBAAoB,GAAG,QAAQ,GAAG,gBAAgB,GAAG,cAAc,GAAG,SAAS,CAAA;AAEvI,qBAAa,yBAA0B,SAAQ,KAAK;IACtC,QAAQ,CAAC,IAAI,EAAE,6BAA6B;gBAAnC,IAAI,EAAE,6BAA6B,EAAE,OAAO,EAAE,MAAM;CAI1E;AAmCD,wBAAgB,kCAAkC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,0BAA0B,CAY9G;AAED,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAAC,qBAAqB,EAAE,UAAU,CAAC;IACrF,QAAQ,EAAE,wBAAwB,GAAG,qCAAqC,GAAG,wBAAwB,CAAA;CACtG;AA8CD,wBAAsB,6BAA6B,CAAC,CAAC,EAAE,MAAM,EAAE,0BAA0B,EAAE,OAAO,EAAE,sBAAsB,EACxH,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAGvE;AAED,wBAAsB,6BAA6B,CAAC,CAAC,EAAE,MAAM,EAAE,0BAA0B,EAAE,OAAO,EAAE,OAAO,EACzG,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CA4BvE;AAGD,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,0BAA0B,EAAE,OAAO,EAAE,qBAAqB,EAC5G,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,CAYhD"}