@dsh-enhanced/lark-channel 0.1.48 → 0.1.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/README.md +19 -8
  2. package/docs/rsi-setup.md +123 -11
  3. package/docs/setup.md +27 -14
  4. package/docs/supervised-growth.md +2 -0
  5. package/lib/adapter.d.ts +6 -0
  6. package/lib/adapter.d.ts.map +1 -1
  7. package/lib/adapter.js +79 -8
  8. package/lib/adapter.js.map +1 -1
  9. package/lib/business-cli-install.d.ts +9 -0
  10. package/lib/business-cli-install.d.ts.map +1 -0
  11. package/lib/business-cli-install.js +367 -0
  12. package/lib/business-cli-install.js.map +1 -0
  13. package/lib/business-environment.d.ts +2 -0
  14. package/lib/business-environment.d.ts.map +1 -0
  15. package/lib/business-environment.js +16 -0
  16. package/lib/business-environment.js.map +1 -0
  17. package/lib/business-skill.d.ts +32 -0
  18. package/lib/business-skill.d.ts.map +1 -0
  19. package/lib/business-skill.js +202 -0
  20. package/lib/business-skill.js.map +1 -0
  21. package/lib/rsi-authority-config.d.ts +29 -0
  22. package/lib/rsi-authority-config.d.ts.map +1 -0
  23. package/lib/rsi-authority-config.js +233 -0
  24. package/lib/rsi-authority-config.js.map +1 -0
  25. package/lib/rsi-authority-resources.d.ts +36 -0
  26. package/lib/rsi-authority-resources.d.ts.map +1 -0
  27. package/lib/rsi-authority-resources.js +139 -0
  28. package/lib/rsi-authority-resources.js.map +1 -0
  29. package/lib/rsi-authority-runtime.d.ts +50 -0
  30. package/lib/rsi-authority-runtime.d.ts.map +1 -0
  31. package/lib/rsi-authority-runtime.js +393 -0
  32. package/lib/rsi-authority-runtime.js.map +1 -0
  33. package/lib/rsi-bootstrap-manifest.d.ts +39 -0
  34. package/lib/rsi-bootstrap-manifest.d.ts.map +1 -0
  35. package/lib/rsi-bootstrap-manifest.js +366 -0
  36. package/lib/rsi-bootstrap-manifest.js.map +1 -0
  37. package/lib/rsi-bootstrap.d.ts +30 -0
  38. package/lib/rsi-bootstrap.d.ts.map +1 -0
  39. package/lib/rsi-bootstrap.js +363 -0
  40. package/lib/rsi-bootstrap.js.map +1 -0
  41. package/lib/rsi-build.d.ts +45 -0
  42. package/lib/rsi-build.d.ts.map +1 -0
  43. package/lib/rsi-build.js +404 -0
  44. package/lib/rsi-build.js.map +1 -0
  45. package/lib/rsi-creation-build.d.ts +47 -0
  46. package/lib/rsi-creation-build.d.ts.map +1 -0
  47. package/lib/rsi-creation-build.js +333 -0
  48. package/lib/rsi-creation-build.js.map +1 -0
  49. package/lib/rsi-host-authorities.d.ts +18 -0
  50. package/lib/rsi-host-authorities.d.ts.map +1 -0
  51. package/lib/rsi-host-authorities.js +129 -0
  52. package/lib/rsi-host-authorities.js.map +1 -0
  53. package/lib/rsi-host-update.d.ts +113 -0
  54. package/lib/rsi-host-update.d.ts.map +1 -0
  55. package/lib/rsi-host-update.js +316 -0
  56. package/lib/rsi-host-update.js.map +1 -0
  57. package/lib/rsi-install-inputs.d.ts +43 -0
  58. package/lib/rsi-install-inputs.d.ts.map +1 -0
  59. package/lib/rsi-install-inputs.js +342 -0
  60. package/lib/rsi-install-inputs.js.map +1 -0
  61. package/lib/rsi-install.d.ts +54 -0
  62. package/lib/rsi-install.d.ts.map +1 -0
  63. package/lib/rsi-install.js +404 -0
  64. package/lib/rsi-install.js.map +1 -0
  65. package/lib/rsi-local-activation.d.ts +78 -0
  66. package/lib/rsi-local-activation.d.ts.map +1 -0
  67. package/lib/rsi-local-activation.js +485 -0
  68. package/lib/rsi-local-activation.js.map +1 -0
  69. package/lib/rsi-local-cohort.d.ts +70 -0
  70. package/lib/rsi-local-cohort.d.ts.map +1 -0
  71. package/lib/rsi-local-cohort.js +781 -0
  72. package/lib/rsi-local-cohort.js.map +1 -0
  73. package/lib/rsi-local-install.d.ts +40 -0
  74. package/lib/rsi-local-install.d.ts.map +1 -0
  75. package/lib/rsi-local-install.js +221 -0
  76. package/lib/rsi-local-install.js.map +1 -0
  77. package/lib/rsi-local-pair-install.d.ts +38 -0
  78. package/lib/rsi-local-pair-install.d.ts.map +1 -0
  79. package/lib/rsi-local-pair-install.js +200 -0
  80. package/lib/rsi-local-pair-install.js.map +1 -0
  81. package/lib/rsi-local-profile-update.d.ts +25 -0
  82. package/lib/rsi-local-profile-update.d.ts.map +1 -0
  83. package/lib/rsi-local-profile-update.js +226 -0
  84. package/lib/rsi-local-profile-update.js.map +1 -0
  85. package/lib/rsi-local-resources.d.ts +37 -0
  86. package/lib/rsi-local-resources.d.ts.map +1 -0
  87. package/lib/rsi-local-resources.js +184 -0
  88. package/lib/rsi-local-resources.js.map +1 -0
  89. package/lib/rsi-local-roots-extension.d.ts +11 -0
  90. package/lib/rsi-local-roots-extension.d.ts.map +1 -0
  91. package/lib/rsi-local-roots-extension.js +31 -0
  92. package/lib/rsi-local-roots-extension.js.map +1 -0
  93. package/lib/rsi-local-update-build.d.ts +18 -0
  94. package/lib/rsi-local-update-build.d.ts.map +1 -0
  95. package/lib/rsi-local-update-build.js +37 -0
  96. package/lib/rsi-local-update-build.js.map +1 -0
  97. package/lib/rsi-local-update.d.ts +39 -0
  98. package/lib/rsi-local-update.d.ts.map +1 -0
  99. package/lib/rsi-local-update.js +205 -0
  100. package/lib/rsi-local-update.js.map +1 -0
  101. package/lib/rsi-memory-learning.d.ts +22 -0
  102. package/lib/rsi-memory-learning.d.ts.map +1 -0
  103. package/lib/rsi-memory-learning.js +76 -0
  104. package/lib/rsi-memory-learning.js.map +1 -0
  105. package/lib/rsi-owner-profile.d.ts +37 -0
  106. package/lib/rsi-owner-profile.d.ts.map +1 -0
  107. package/lib/rsi-owner-profile.js +178 -0
  108. package/lib/rsi-owner-profile.js.map +1 -0
  109. package/lib/rsi-plugin-creation.d.ts +31 -0
  110. package/lib/rsi-plugin-creation.d.ts.map +1 -0
  111. package/lib/rsi-plugin-creation.js +179 -0
  112. package/lib/rsi-plugin-creation.js.map +1 -0
  113. package/lib/rsi-profile.d.ts +23 -0
  114. package/lib/rsi-profile.d.ts.map +1 -1
  115. package/lib/rsi-profile.js +154 -43
  116. package/lib/rsi-profile.js.map +1 -1
  117. package/lib/rsi-release-build.d.ts +41 -0
  118. package/lib/rsi-release-build.d.ts.map +1 -0
  119. package/lib/rsi-release-build.js +223 -0
  120. package/lib/rsi-release-build.js.map +1 -0
  121. package/lib/rsi-service-environment.d.ts +6 -0
  122. package/lib/rsi-service-environment.d.ts.map +1 -0
  123. package/lib/rsi-service-environment.js +113 -0
  124. package/lib/rsi-service-environment.js.map +1 -0
  125. package/lib/rsi-service-setup.d.ts +10 -0
  126. package/lib/rsi-service-setup.d.ts.map +1 -0
  127. package/lib/rsi-service-setup.js +34 -0
  128. package/lib/rsi-service-setup.js.map +1 -0
  129. package/lib/rsi-setup.d.ts +35 -2
  130. package/lib/rsi-setup.d.ts.map +1 -1
  131. package/lib/rsi-setup.js +459 -32
  132. package/lib/rsi-setup.js.map +1 -1
  133. package/lib/rsi-source-maintenance.d.ts +25 -0
  134. package/lib/rsi-source-maintenance.d.ts.map +1 -0
  135. package/lib/rsi-source-maintenance.js +348 -0
  136. package/lib/rsi-source-maintenance.js.map +1 -0
  137. package/lib/rsi-source-update.d.ts +26 -0
  138. package/lib/rsi-source-update.d.ts.map +1 -0
  139. package/lib/rsi-source-update.js +276 -0
  140. package/lib/rsi-source-update.js.map +1 -0
  141. package/lib/rsi-source.d.ts +34 -0
  142. package/lib/rsi-source.d.ts.map +1 -0
  143. package/lib/rsi-source.js +375 -0
  144. package/lib/rsi-source.js.map +1 -0
  145. package/lib/rsi-systemd-bootstrap.d.ts +46 -0
  146. package/lib/rsi-systemd-bootstrap.d.ts.map +1 -0
  147. package/lib/rsi-systemd-bootstrap.js +271 -0
  148. package/lib/rsi-systemd-bootstrap.js.map +1 -0
  149. package/lib/sdk.d.ts.map +1 -1
  150. package/lib/sdk.js +26 -1
  151. package/lib/sdk.js.map +1 -1
  152. package/lib/setup-business.d.ts +49 -0
  153. package/lib/setup-business.d.ts.map +1 -0
  154. package/lib/setup-business.js +335 -0
  155. package/lib/setup-business.js.map +1 -0
  156. package/lib/setup-profile.d.ts +1 -1
  157. package/lib/setup-profile.d.ts.map +1 -1
  158. package/lib/setup-profile.js +25 -2
  159. package/lib/setup-profile.js.map +1 -1
  160. package/lib/setup.d.ts +12 -1
  161. package/lib/setup.d.ts.map +1 -1
  162. package/lib/setup.js +138 -34
  163. package/lib/setup.js.map +1 -1
  164. package/lib/systemd.d.ts +10 -0
  165. package/lib/systemd.d.ts.map +1 -1
  166. package/lib/systemd.js +23 -6
  167. package/lib/systemd.js.map +1 -1
  168. package/lib/types.d.ts +7 -0
  169. package/lib/types.d.ts.map +1 -1
  170. package/lib/types.js.map +1 -1
  171. package/lib/version.d.ts +1 -1
  172. package/lib/version.js +1 -1
  173. package/package.json +32 -20
@@ -0,0 +1,333 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { chmod, lstat, mkdir, mkdtemp, readdir, rename, rm, stat } from 'node:fs/promises';
3
+ import { dirname, isAbsolute, join, resolve } from 'node:path';
4
+ import { isDeepStrictEqual } from 'node:util';
5
+ import { rsiBuildResources as io, readRsiBuildEnvironment } from './rsi-build.js';
6
+ const COMMIT = /^[a-f0-9]{40}$/u;
7
+ const IMAGE = /^sha256:[a-f0-9]{64}$/u;
8
+ const PROFILE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/u;
9
+ const PACKAGE_MANAGER = 'pnpm@11.7.0';
10
+ const FIXED = {
11
+ 'scripts/isolation/build-plugin-verifier-image.mjs': 'ae615696e51f88be9ad1e5f1b2a8769b951d8f0632b13547fcfa8f23ab837802',
12
+ 'scripts/isolation/plugin-verifier.Dockerfile': 'e3d4aad5d1a1fda8c1a01d080f32aceb9d6438954169b412ed96e8dde2fd22b2',
13
+ 'scripts/isolation/plugin-observer-launcher.c': '90bb335432a74778d442e2fcab50a19fc4441191343eaa76beed09287515b0ce',
14
+ 'plugins/assistant-verifier/src/plugin-behavior-runner.ts': '1a7f5d9a686cc8615e403a9f5536701d759fc40ef9fa5fe7c29cbddb2891c187',
15
+ };
16
+ const WORKER_SHA = '0394f3974410fe00538fbd99e643a86672a7dfad7a1471af7280dce36668eef4';
17
+ const CANDIDATE_SHA = '051e76a0e45c50e434be757913f89a2be0ee5cac6941797924fb13b316695109';
18
+ function fail(message) { throw new Error(`rsi creation build: ${message}`); }
19
+ function digest(value) { return createHash('sha256').update(value).digest('hex'); }
20
+ function validPath(value) { return isAbsolute(value) && resolve(value) === value && !value.includes('\0'); }
21
+ async function base(input) {
22
+ if (!validPath(input.dshHome) || !PROFILE.test(input.profile)
23
+ || input.source.schemaVersion !== 1 || !COMMIT.test(input.source.sourceCommit)
24
+ || input.build.schemaVersion !== 1 || input.build.sourceCommit !== input.source.sourceCommit
25
+ || !IMAGE.test(input.build.sourceBuild?.image ?? ''))
26
+ fail('invalid source build binding');
27
+ input.signal?.throwIfAborted();
28
+ const recorded = await readRsiBuildEnvironment({ dshHome: input.dshHome, profile: input.profile,
29
+ source: input.source, ...(input.signal ? { signal: input.signal } : {}) });
30
+ if (!isDeepStrictEqual(recorded, input.build))
31
+ fail('source build differs from recorded approved environment');
32
+ return recorded;
33
+ }
34
+ async function inputs(source) {
35
+ await io.directory(source.repository);
36
+ const contextFiles = ['package.json', 'pnpm-lock.yaml', 'pnpm-workspace.yaml',
37
+ 'scripts/isolation/plugin-verifier.Dockerfile', 'scripts/isolation/plugin-observer-launcher.c'];
38
+ for (const folder of ['plugins', 'packages']) {
39
+ await io.directory(join(source.repository, folder), false);
40
+ for (const entry of await readdir(join(source.repository, folder), { withFileTypes: true })) {
41
+ if (!entry.isDirectory() || entry.isSymbolicLink())
42
+ continue;
43
+ const packageDirectory = join(source.repository, folder, entry.name);
44
+ await io.directory(packageDirectory, false);
45
+ const name = `${folder}/${entry.name}/package.json`;
46
+ try {
47
+ await lstat(join(source.repository, name));
48
+ contextFiles.push(name);
49
+ }
50
+ catch (error) {
51
+ if (error.code !== 'ENOENT')
52
+ throw error;
53
+ }
54
+ }
55
+ }
56
+ contextFiles.sort();
57
+ if (contextFiles.length > 256)
58
+ fail('manifest count exceeds bound');
59
+ const files = new Map();
60
+ for (const name of [...contextFiles, ...Object.keys(FIXED)]) {
61
+ await io.directory(dirname(join(source.repository, name)), false);
62
+ files.set(name, await io.readStable(join(source.repository, name), 4_194_304));
63
+ }
64
+ for (const [name, expected] of Object.entries(FIXED)) {
65
+ if (digest(files.get(name)) !== expected)
66
+ fail(`trusted asset changed: ${name}`);
67
+ }
68
+ const manifest = JSON.parse(files.get('package.json').toString('utf8'));
69
+ if (manifest.name !== 'dsh-enhanced' || manifest.version !== source.version
70
+ || manifest.packageManager !== PACKAGE_MANAGER)
71
+ fail('root manifest differs from source cohort');
72
+ const raw = files.get('plugins/assistant-verifier/src/plugin-behavior-runner.ts').toString('utf8');
73
+ const fixedAsset = (name) => {
74
+ const begin = `/* DSH_PLUGIN_VERIFIER_${name}_START\n`;
75
+ const end = `\nDSH_PLUGIN_VERIFIER_${name}_END */`;
76
+ const first = raw.indexOf(begin), last = raw.indexOf(end, first + begin.length);
77
+ if (first < 0 || last < 0 || raw.indexOf(begin, first + 1) >= 0 || raw.indexOf(end, last + 1) >= 0)
78
+ fail(`fixed ${name.toLowerCase()} markers invalid`);
79
+ const content = raw.slice(first + begin.length, last) + '\n';
80
+ if (Buffer.byteLength(content) > 32_768)
81
+ fail(`fixed ${name.toLowerCase()} exceeds bound`);
82
+ return content;
83
+ };
84
+ const worker = fixedAsset('WORKER'), candidate = fixedAsset('CANDIDATE');
85
+ if (digest(worker) !== WORKER_SHA || digest(candidate) !== CANDIDATE_SHA)
86
+ fail('fixed worker content changed');
87
+ // The approved builder extracts marker bodies from this file. Keep the
88
+ // snapshot limited to those bodies, without the surrounding app source.
89
+ const extraction = (name, body) => `/* DSH_PLUGIN_VERIFIER_${name}_START\n${body.trimEnd()}\nDSH_PLUGIN_VERIFIER_${name}_END */\n`;
90
+ files.set('plugins/assistant-verifier/src/plugin-behavior-runner.ts', Buffer.from(extraction('WORKER', worker) + extraction('CANDIDATE', candidate)));
91
+ const hashes = Object.fromEntries([...files].map(([name, bytes]) => [name, digest(bytes)]));
92
+ const lockSha256 = digest(files.get('pnpm-lock.yaml'));
93
+ const contextDigest = digest(JSON.stringify({ contextFiles, hashes, lockSha256, workerSha256: WORKER_SHA, candidateSha256: CANDIDATE_SHA }));
94
+ return { files, hashes, contextFiles, contextDigest, lockSha256 };
95
+ }
96
+ async function snapshot(root, files) {
97
+ for (const [name, bytes] of files) {
98
+ const path = join(root, name);
99
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
100
+ await io.writeExclusive(path, bytes);
101
+ }
102
+ }
103
+ function parseOutput(raw, expected, sourceImage) {
104
+ if (Buffer.byteLength(raw) > 16_384)
105
+ fail('builder output exceeds bound');
106
+ const value = JSON.parse(raw);
107
+ if (!value || typeof value !== 'object' || Array.isArray(value)
108
+ || !isDeepStrictEqual(Object.keys(value).sort(), ['image', 'tag', 'sourceImage', 'lockSha256',
109
+ 'workerSha256', 'candidateSha256', 'launcherSourceSha256', 'dockerfileSha256', 'contextFiles'].sort())
110
+ || typeof value.image !== 'string' || !IMAGE.test(value.image)
111
+ || value.sourceImage !== sourceImage || value.lockSha256 !== expected.lockSha256
112
+ || value.workerSha256 !== WORKER_SHA || value.candidateSha256 !== CANDIDATE_SHA
113
+ || value.launcherSourceSha256 !== FIXED['scripts/isolation/plugin-observer-launcher.c']
114
+ || value.dockerfileSha256 !== FIXED['scripts/isolation/plugin-verifier.Dockerfile']
115
+ || !isDeepStrictEqual(value.contextFiles, [...expected.contextFiles, 'worker.mjs', 'candidate.mjs'].sort()))
116
+ fail('builder output differs from frozen source inputs');
117
+ return value.image;
118
+ }
119
+ async function imageExists(dockerPath, image, scratch, signal) {
120
+ const actual = await io.command(dockerPath, ['image', 'inspect', '--format', '{{.Id}}', image], io.isolatedEnvironment(scratch), signal, 30_000, 4096);
121
+ if (actual !== image)
122
+ fail('Docker image content ID differs from receipt');
123
+ }
124
+ async function replay(final, input, expected, dockerSha256, scratch, signal) {
125
+ await io.directory(final);
126
+ if (!isDeepStrictEqual(await readdir(final), ['bootstrap.json']))
127
+ fail('behavior workspace incomplete or unexpected');
128
+ const value = JSON.parse((await io.readStable(join(final, 'bootstrap.json'), 65_536, true)).toString('utf8'));
129
+ const { receiptDigest, ...content } = value;
130
+ if (!isDeepStrictEqual(Object.keys(content).sort(), ['schemaVersion', 'sourceCommit', 'sourceImage', 'image',
131
+ 'dockerPath', 'dshHome', 'profile', 'dockerSha256', 'inputHashes', 'contextFiles', 'contextDigest', 'lockSha256'].sort())
132
+ || value.schemaVersion !== 1 || digest(JSON.stringify(content)) !== receiptDigest
133
+ || value.dshHome !== input.dshHome || value.profile !== input.profile
134
+ || value.sourceCommit !== input.source.sourceCommit || value.sourceImage !== input.build.sourceBuild.image
135
+ || !IMAGE.test(value.image) || value.dockerPath !== input.build.sourceBuild.dockerPath
136
+ || value.dockerSha256 !== dockerSha256 || !isDeepStrictEqual(value.inputHashes, expected.hashes)
137
+ || !isDeepStrictEqual(value.contextFiles, expected.contextFiles)
138
+ || value.contextDigest !== expected.contextDigest || value.lockSha256 !== expected.lockSha256)
139
+ fail('behavior receipt differs from approved source, assets, or Docker client');
140
+ if (scratch && signal) {
141
+ await imageExists(value.dockerPath, value.sourceImage, scratch, signal);
142
+ await imageExists(value.dockerPath, value.image, scratch, signal);
143
+ }
144
+ signal?.throwIfAborted();
145
+ return { schemaVersion: 1, sourceCommit: value.sourceCommit, sourceImage: value.sourceImage,
146
+ image: value.image, dockerPath: value.dockerPath };
147
+ }
148
+ /** Verify frozen local inputs only. This reader never invokes Docker. */
149
+ export async function readRsiCreationBuildEnvironment(input) {
150
+ await base(input);
151
+ const expected = await inputs(input.source);
152
+ const dockerSha256 = digest(await io.readStable(input.build.sourceBuild.dockerPath, 100_000_000, false, true));
153
+ const parent = join(input.dshHome, 'rsi-creation-builds'), final = join(parent, input.profile);
154
+ await io.directory(parent);
155
+ return replay(final, input, expected, dockerSha256, undefined, input.signal);
156
+ }
157
+ export async function readRsiCreationBuildInStage(input) {
158
+ if (!validPath(input.logicalHome) || !validPath(input.stagePhysicalHome)
159
+ || input.logicalHome === input.stagePhysicalHome || !PROFILE.test(input.profile)
160
+ || input.stagedSource.repository !== join(input.logicalHome, 'rsi-sources', input.profile, 'checkout')
161
+ || input.stagedSource.sourceCommit !== input.stagedBuild.sourceCommit) {
162
+ fail('staged creation binding differs');
163
+ }
164
+ const expected = await inputs({ ...input.stagedSource,
165
+ repository: join(input.stagePhysicalHome, 'rsi-sources', input.profile, 'checkout') });
166
+ const dockerSha256 = digest(await io.readStable(input.stagedBuild.sourceBuild.dockerPath, 100_000_000, false, true));
167
+ return replay(join(input.stagePhysicalHome, 'rsi-creation-builds', input.profile), { dshHome: input.logicalHome, profile: input.profile, source: input.stagedSource,
168
+ build: input.stagedBuild, ...(input.signal ? { signal: input.signal } : {}) }, expected, dockerSha256, undefined, input.signal);
169
+ }
170
+ /** Bind a freshly built candidate image to a stopped, copied Home. The old
171
+ * logical Home and the candidate receipt are never written by this operation. */
172
+ export async function materializeRsiCreationBuildInStage(input) {
173
+ const { candidateHome, stagePhysicalHome, logicalHome, profile, signal } = input;
174
+ if (!validPath(candidateHome) || !validPath(stagePhysicalHome) || !validPath(logicalHome)
175
+ || !PROFILE.test(profile) || candidateHome === stagePhysicalHome || candidateHome === logicalHome
176
+ || stagePhysicalHome === logicalHome || input.candidateSource.sourceCommit !== input.stagedSource.sourceCommit
177
+ || input.candidateBuild.sourceCommit !== input.stagedBuild.sourceCommit
178
+ || input.stagedSource.repository !== join(logicalHome, 'rsi-sources', profile, 'checkout')) {
179
+ fail('staged creation binding differs from new candidate');
180
+ }
181
+ const candidateSeccompPath = join(candidateHome, 'rsi-builds', profile, 'seccomp.json');
182
+ const stagedSeccompPath = join(logicalHome, 'rsi-builds', profile, 'seccomp.json');
183
+ if (input.candidateBuild.sourceBuild.repositorySandbox?.seccompPath !== candidateSeccompPath
184
+ || input.stagedBuild.sourceBuild.repositorySandbox?.seccompPath !== stagedSeccompPath
185
+ || !isDeepStrictEqual(input.stagedBuild.sourceBuild, { ...input.candidateBuild.sourceBuild,
186
+ repositorySandbox: { ...input.candidateBuild.sourceBuild.repositorySandbox, seccompPath: stagedSeccompPath } })) {
187
+ fail('staged creation build differs outside the approved seccomp relocation');
188
+ }
189
+ const candidateBuildPath = join(candidateHome, 'rsi-builds', profile, 'bootstrap.json');
190
+ const candidateBuildBytes = await io.readStable(candidateBuildPath, 65_536, true);
191
+ const candidateSeccompBytes = await io.readStable(candidateSeccompPath, 65_536, true);
192
+ const candidateInput = { dshHome: candidateHome, profile, source: input.candidateSource,
193
+ build: input.candidateBuild, ...(signal ? { signal } : {}) };
194
+ const creationBuild = await readRsiCreationBuildEnvironment(candidateInput);
195
+ const stageBuildPath = join(stagePhysicalHome, 'rsi-builds', profile, 'bootstrap.json');
196
+ if (!candidateBuildBytes.equals(await io.readStable(candidateBuildPath, 65_536, true))
197
+ || !candidateSeccompBytes.equals(await io.readStable(candidateSeccompPath, 65_536, true))) {
198
+ fail('verified candidate build changed during relocation');
199
+ }
200
+ const candidateBuildReceipt = JSON.parse(candidateBuildBytes.toString('utf8'));
201
+ const stagedBuildReceipt = JSON.parse((await io.readStable(stageBuildPath, 65_536, true)).toString('utf8'));
202
+ const { receiptDigest: _candidateDigest, ...candidateBuildBody } = candidateBuildReceipt;
203
+ const expectedBuildBody = { ...candidateBuildBody, dshHome: logicalHome,
204
+ repository: input.stagedSource.repository, sourceBuild: input.stagedBuild.sourceBuild };
205
+ if (!isDeepStrictEqual(stagedBuildReceipt, { ...expectedBuildBody,
206
+ receiptDigest: digest(JSON.stringify(expectedBuildBody)) })
207
+ || !candidateSeccompBytes.equals(await io.readStable(join(stagePhysicalHome, 'rsi-builds', profile, 'seccomp.json'), 65_536, true))) {
208
+ fail('staged build receipt or seccomp differs from verified candidate');
209
+ }
210
+ const candidatePath = join(candidateHome, 'rsi-creation-builds', profile, 'bootstrap.json');
211
+ const candidateBytes = await io.readStable(candidatePath, 65_536, true);
212
+ const candidateReceipt = JSON.parse(candidateBytes.toString('utf8'));
213
+ const expected = await inputs({ ...input.stagedSource,
214
+ repository: join(stagePhysicalHome, 'rsi-sources', profile, 'checkout') });
215
+ if (!isDeepStrictEqual(expected.hashes, candidateReceipt.inputHashes)
216
+ || expected.contextDigest !== candidateReceipt.contextDigest
217
+ || expected.lockSha256 !== candidateReceipt.lockSha256
218
+ || !isDeepStrictEqual(expected.contextFiles, candidateReceipt.contextFiles)) {
219
+ fail('staged source inputs differ from freshly built behavior image');
220
+ }
221
+ const dockerSha256 = digest(await io.readStable(creationBuild.dockerPath, 100_000_000, false, true));
222
+ if (dockerSha256 !== candidateReceipt.dockerSha256)
223
+ fail('candidate Docker client changed');
224
+ const scratch = await mkdtemp(join(stagePhysicalHome, '.rsi-creation-verify-'));
225
+ try {
226
+ await chmod(scratch, 0o700);
227
+ await mkdir(join(scratch, 'docker-config'), { mode: 0o700 });
228
+ const deadline = AbortSignal.any([signal ?? new AbortController().signal, AbortSignal.timeout(120_000)]);
229
+ await imageExists(creationBuild.dockerPath, creationBuild.sourceImage, scratch, deadline);
230
+ await imageExists(creationBuild.dockerPath, creationBuild.image, scratch, deadline);
231
+ }
232
+ finally {
233
+ await rm(scratch, { recursive: true, force: true });
234
+ }
235
+ const content = { ...creationBuild, dshHome: logicalHome, profile, dockerSha256,
236
+ inputHashes: expected.hashes, contextFiles: expected.contextFiles,
237
+ contextDigest: expected.contextDigest, lockSha256: expected.lockSha256 };
238
+ const bytes = JSON.stringify({ ...content, receiptDigest: digest(JSON.stringify(content)) });
239
+ const directory = join(stagePhysicalHome, 'rsi-creation-builds', profile);
240
+ await io.directory(directory);
241
+ const oldPath = join(directory, 'bootstrap.json');
242
+ await io.readStable(oldPath, 65_536, true);
243
+ const temporary = join(directory, `.bootstrap-${process.pid}-${Date.now()}.json`);
244
+ try {
245
+ await io.writeExclusive(temporary, bytes);
246
+ await rename(temporary, oldPath);
247
+ await io.syncDirectory(directory);
248
+ }
249
+ finally {
250
+ await rm(temporary, { force: true });
251
+ }
252
+ if (!isDeepStrictEqual(await readRsiCreationBuildInStage({ logicalHome, stagePhysicalHome, profile,
253
+ stagedSource: input.stagedSource, stagedBuild: input.stagedBuild, ...(signal ? { signal } : {}) }), creationBuild)) {
254
+ fail('materialized behavior image did not replay in the stopped stage');
255
+ }
256
+ return { creationBuild, candidateReceiptSha256: digest(candidateBytes), receiptSha256: digest(bytes) };
257
+ }
258
+ /** Caller holds the DSH_HOME lifecycle lock. Build or replay an immutable image. */
259
+ export async function prepareRsiCreationBuildEnvironment(input) {
260
+ if (process.platform !== 'linux' || process.arch !== 'x64')
261
+ fail('Linux x64 is required');
262
+ await base(input);
263
+ const expected = await inputs(input.source);
264
+ const dockerPath = input.build.sourceBuild.dockerPath;
265
+ const dockerSha256 = digest(await io.readStable(dockerPath, 100_000_000, false, true));
266
+ const parent = join(input.dshHome, 'rsi-creation-builds');
267
+ try {
268
+ await mkdir(parent, { mode: 0o700 });
269
+ }
270
+ catch (error) {
271
+ if (error.code !== 'EEXIST')
272
+ throw error;
273
+ }
274
+ await io.directory(parent);
275
+ const final = join(parent, input.profile);
276
+ const signal = AbortSignal.any([input.signal ?? new AbortController().signal, AbortSignal.timeout(1_860_000)]);
277
+ const stage = await mkdtemp(join(parent, `.${input.profile}-stage-`));
278
+ await chmod(stage, 0o700);
279
+ let claimed;
280
+ try {
281
+ await mkdir(join(stage, 'docker-config'), { mode: 0o700 });
282
+ const version = await io.command(dockerPath, ['version', '--format', '{{.Server.Version}}/{{.Server.Os}}/{{.Server.Arch}}'], io.isolatedEnvironment(stage), signal, 10_000, 4096);
283
+ if (version !== '29.4.1/linux/amd64')
284
+ fail('Docker runtime version differs from approved runtime');
285
+ const present = await lstat(final).then(() => true, error => {
286
+ if (error.code === 'ENOENT')
287
+ return false;
288
+ throw error;
289
+ });
290
+ if (present)
291
+ return await replay(final, input, expected, dockerSha256, stage, signal);
292
+ await imageExists(dockerPath, input.build.sourceBuild.image, stage, signal);
293
+ const context = join(stage, 'source');
294
+ await mkdir(context, { mode: 0o700 });
295
+ await snapshot(context, expected.files);
296
+ const builder = join(context, 'scripts/isolation/build-plugin-verifier-image.mjs');
297
+ const raw = await io.command(process.execPath, [builder, '--docker-path', dockerPath,
298
+ '--source-image', input.build.sourceBuild.image, '--timeout-ms', '1800000'], { ...io.isolatedEnvironment(stage), TMPDIR: stage }, signal, 1_810_000);
299
+ const image = parseOutput(raw, expected, input.build.sourceBuild.image);
300
+ await imageExists(dockerPath, image, stage, signal);
301
+ await base(input);
302
+ const fresh = await inputs(input.source);
303
+ if (!isDeepStrictEqual(fresh.hashes, expected.hashes) || fresh.contextDigest !== expected.contextDigest)
304
+ fail('source inputs changed during behavior image build');
305
+ signal.throwIfAborted();
306
+ await mkdir(final, { mode: 0o700 });
307
+ const identity = await stat(final);
308
+ claimed = { dev: identity.dev, ino: identity.ino };
309
+ const result = { schemaVersion: 1, sourceCommit: input.source.sourceCommit,
310
+ sourceImage: input.build.sourceBuild.image, image, dockerPath };
311
+ const content = { ...result, dshHome: input.dshHome, profile: input.profile, dockerSha256,
312
+ inputHashes: expected.hashes, contextFiles: expected.contextFiles,
313
+ contextDigest: expected.contextDigest, lockSha256: expected.lockSha256 };
314
+ await io.writeExclusive(join(final, 'bootstrap.json'), JSON.stringify({ ...content, receiptDigest: digest(JSON.stringify(content)) }));
315
+ await io.syncDirectory(final);
316
+ await io.syncDirectory(parent);
317
+ return result;
318
+ }
319
+ catch (error) {
320
+ if (claimed) {
321
+ const current = await lstat(final).catch(() => undefined);
322
+ if (current?.isDirectory() && current.dev === claimed.dev && current.ino === claimed.ino
323
+ && (await readdir(final)).every(name => name === 'bootstrap.json'))
324
+ await rm(final, { recursive: true, force: true });
325
+ }
326
+ throw error;
327
+ }
328
+ finally {
329
+ await rm(stage, { recursive: true, force: true });
330
+ await io.syncDirectory(parent);
331
+ }
332
+ }
333
+ //# sourceMappingURL=rsi-creation-build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsi-creation-build.js","sourceRoot":"","sources":["../src/rsi-creation-build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type PluginControlTrustConfig, type SourceAdoptionAuthorityConfig, type SystemdHostAuthorityConfig } from '@dsh-enhanced/plugin-control-plane';
2
+ /** Read-only preflight for the standing Host grant. The CP validator owns its schema. */
3
+ export declare function validateRsiHostAuthorities(input: {
4
+ trust: PluginControlTrustConfig;
5
+ adoption: SourceAdoptionAuthorityConfig;
6
+ owner: SystemdHostAuthorityConfig['grant']['owner'];
7
+ ledgerPath: string;
8
+ trustPath: string;
9
+ targetProfile: string;
10
+ liveQualification: unknown;
11
+ hostDeploymentInputs: unknown;
12
+ handoff: {
13
+ coordinatorId: string;
14
+ } | undefined;
15
+ environment?: NodeJS.ProcessEnv;
16
+ readPrivate(path: string): Promise<string>;
17
+ }): Promise<void>;
18
+ //# sourceMappingURL=rsi-host-authorities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsi-host-authorities.d.ts","sourceRoot":"","sources":["../src/rsi-host-authorities.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,wBAAwB,EAAE,KAAK,6BAA6B,EAAE,KAAK,0BAA0B,EAAE,MAAM,oCAAoC,CAAA;AA6BhJ,yFAAyF;AACzF,wBAAsB,0BAA0B,CAAC,KAAK,EAAE;IACtD,KAAK,EAAE,wBAAwB,CAAA;IAC/B,QAAQ,EAAE,6BAA6B,CAAA;IACvC,KAAK,EAAE,0BAA0B,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAA;IACnD,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,oBAAoB,EAAE,OAAO,CAAA;IAC7B,OAAO,EAAE;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAA;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IAC/B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CAC3C,GAAG,OAAO,CAAC,IAAI,CAAC,CA4EhB"}
@@ -0,0 +1,129 @@
1
+ import { createHash, createPrivateKey, createPublicKey } from 'node:crypto';
2
+ import { spawnSync } from 'node:child_process';
3
+ import { readFile, realpath, lstat } from 'node:fs/promises';
4
+ import { dirname, join } from 'node:path';
5
+ import { isDeepStrictEqual } from 'node:util';
6
+ import { inspectTrustedExecutable, resolveTrustKey, validateSystemdHostAuthorityConfig } from '@dsh-enhanced/plugin-control-plane';
7
+ function fail(detail) { throw new Error(`rsi setup: systemd Host authority ${detail}`); }
8
+ function exactFields(value, fields) {
9
+ if (!value || typeof value !== 'object' || Array.isArray(value)
10
+ || !isDeepStrictEqual(Object.keys(value).sort(), [...fields].sort()))
11
+ fail('wrapper fields differ from runtime contract');
12
+ }
13
+ function hash(bytes) { return createHash('sha256').update(bytes).digest('hex'); }
14
+ async function pinned(spec) {
15
+ await inspectTrustedExecutable(spec.path, spec.sha256);
16
+ return readFile(spec.path);
17
+ }
18
+ async function regularPin(spec, maximum = 268_435_456) {
19
+ if (await realpath(spec.path) !== spec.path)
20
+ fail('pinned file is not canonical');
21
+ const stat = await lstat(spec.path);
22
+ if (!stat.isFile() || stat.nlink !== 1 || stat.size > maximum || (stat.mode & 0o022) !== 0
23
+ || (stat.uid !== 0 && stat.uid !== process.getuid?.()) || hash(await readFile(spec.path)) !== spec.sha256)
24
+ fail('pinned file changed');
25
+ }
26
+ async function privateDirectory(path) {
27
+ if (await realpath(path) !== path)
28
+ fail('directory is not canonical');
29
+ const stat = await lstat(path);
30
+ if (!stat.isDirectory() || stat.uid !== process.getuid?.() || (stat.mode & 0o077) !== 0)
31
+ fail('directory is not owner-private');
32
+ }
33
+ /** Read-only preflight for the standing Host grant. The CP validator owns its schema. */
34
+ export async function validateRsiHostAuthorities(input) {
35
+ const attestor = input.trust.hostAttestor;
36
+ const configPath = (input.environment ?? process.env).DSH_SYSTEMD_HOST_ATTESTOR_CONFIG;
37
+ const allowed = attestor.environmentAllowlist.includes('DSH_SYSTEMD_HOST_ATTESTOR_CONFIG');
38
+ if (!allowed)
39
+ return; // Existing owner-provisioned explicit request configs remain valid.
40
+ if (!configPath)
41
+ fail('config path is missing');
42
+ const wrapperSource = await input.readPrivate(configPath);
43
+ if (Buffer.byteLength(wrapperSource) > 65_536)
44
+ fail('wrapper config exceeds runtime limit');
45
+ const wrapper = JSON.parse(wrapperSource);
46
+ if ([1, 2, 3].includes(wrapper.schemaVersion))
47
+ return; // Existing explicit request configurations.
48
+ if (wrapper.schemaVersion !== 4)
49
+ fail('unknown wrapper schema');
50
+ exactFields(wrapper, ['schemaVersion', 'template', 'resolver']);
51
+ exactFields(wrapper.template, ['authority', 'keyId', 'privateKeyPath', 'stateRoot', 'executable', 'interpreter', 'processHelper',
52
+ 'systemctl', 'scope', 'unit', 'unitProperties', 'timeoutMs', 'stableWindowMs', 'pollIntervalMs', 'readiness', 'recoveryReadiness']);
53
+ exactFields(wrapper.resolver, ['executable', 'interpreter', 'configPath', 'configSha256', 'timeoutMs']);
54
+ exactFields(wrapper.resolver.executable, ['path', 'sha256']);
55
+ if (wrapper.resolver.interpreter !== null)
56
+ exactFields(wrapper.resolver.interpreter, ['path', 'sha256']);
57
+ if (attestor.version !== 'dsh-systemd-host-attestor-8' || attestor.interpreter === null)
58
+ fail('trust does not select the standing wrapper');
59
+ const resolver = wrapper.resolver;
60
+ if (!Number.isSafeInteger(resolver.timeoutMs) || resolver.timeoutMs < 1000 || resolver.timeoutMs > 60_000
61
+ || resolver.timeoutMs + wrapper.template.timeoutMs >= attestor.timeoutMs)
62
+ fail('timeouts cannot cover resolver and Host operation');
63
+ const template = wrapper.template;
64
+ if (!isDeepStrictEqual({ authority: template.authority, keyId: template.keyId, executable: template.executable, interpreter: template.interpreter }, { authority: attestor.authority, keyId: attestor.keyId, executable: { path: attestor.path, sha256: attestor.sha256 }, interpreter: attestor.interpreter }))
65
+ fail('wrapper differs from trusted attestor');
66
+ if (template.unit !== `dsh-profile-${input.targetProfile}.service`)
67
+ fail('wrapper unit differs from target');
68
+ const wrapperBytes = await pinned(template.executable);
69
+ const nodeBytes = await pinned(template.interpreter);
70
+ if (!wrapperBytes.subarray(0, 2).equals(Buffer.from('#!')) || !nodeBytes.subarray(0, 4).equals(Buffer.from([0x7f, 0x45, 0x4c, 0x46]))
71
+ || wrapperBytes.toString('utf8', 0, 512).split('\n', 1)[0] !== `#!${template.interpreter.path}`)
72
+ fail('attestor interpreter cannot run pinned wrapper');
73
+ const version = spawnSync(template.interpreter.path, [template.executable.path, '--version'], { encoding: 'utf8', env: { LANG: 'C', LC_ALL: 'C' }, timeout: 5000, maxBuffer: 1024 });
74
+ if (version.error || version.status !== 0 || version.stdout.trim() !== attestor.version)
75
+ fail('pinned wrapper version cannot run');
76
+ await regularPin(template.processHelper, 1_048_576);
77
+ await pinned({ path: template.systemctl.path, sha256: template.systemctl.sha256 });
78
+ if (template.systemctl.interpreter)
79
+ await pinned(template.systemctl.interpreter);
80
+ await regularPin(template.readiness.client);
81
+ await regularPin(template.recoveryReadiness.client);
82
+ await pinned(resolver.executable);
83
+ const interpreterBytes = resolver.interpreter ? await pinned(resolver.interpreter) : await readFile(resolver.executable.path);
84
+ if (!interpreterBytes.subarray(0, 4).equals(Buffer.from([0x7f, 0x45, 0x4c, 0x46])))
85
+ fail('resolver requires a native pinned interpreter');
86
+ // The shipped script has a relative compiled import. Inspect it when selected,
87
+ // while preserving the runtime's native/custom resolver contract.
88
+ if (resolver.executable.path.endsWith('/bin/dsh-systemd-host-authority.js')) {
89
+ if (!resolver.interpreter)
90
+ fail('shipped resolver requires a native interpreter');
91
+ const node = spawnSync(resolver.interpreter.path, ['--input-type=module', '--eval', 'process.stdout.write(process.versions.node)'], { encoding: 'utf8', env: { LANG: 'C', LC_ALL: 'C' }, timeout: 5000, maxBuffer: 1024 });
92
+ if (node.error || node.status !== 0 || !/^\d+\.\d+\.\d+$/u.test(node.stdout))
93
+ fail('pinned interpreter cannot run shipped resolver');
94
+ const syntax = spawnSync(resolver.interpreter.path, ['--check', resolver.executable.path], { encoding: 'utf8', env: { LANG: 'C', LC_ALL: 'C' }, timeout: 5000, maxBuffer: 1024 });
95
+ if (syntax.error || syntax.status !== 0)
96
+ fail('pinned interpreter cannot parse shipped resolver');
97
+ const resolverModule = join(dirname(resolver.executable.path), '../lib/systemd-host-authority.js');
98
+ if (await realpath(resolverModule) !== resolverModule || !(await lstat(resolverModule)).isFile())
99
+ fail('resolver module is unavailable');
100
+ }
101
+ await privateDirectory(dirname(configPath));
102
+ await privateDirectory(dirname(resolver.configPath));
103
+ const bytes = await input.readPrivate(resolver.configPath);
104
+ if (Buffer.byteLength(bytes) > 65_536)
105
+ fail('resolver config exceeds runtime limit');
106
+ if (hash(bytes) !== resolver.configSha256)
107
+ fail('resolver config pin changed');
108
+ const config = JSON.parse(bytes);
109
+ validateSystemdHostAuthorityConfig(config);
110
+ if (!isDeepStrictEqual(config.template, template) || config.trustPath !== input.trustPath
111
+ || config.controlDatabasePath !== input.ledgerPath || config.grant.profile.name !== input.targetProfile
112
+ || config.grant.profile.path !== input.adoption.grant.target.profilePath
113
+ || !isDeepStrictEqual(config.grant.owner, input.owner)
114
+ || !isDeepStrictEqual([...config.grant.packages].sort(), input.adoption.grant.policies.map(policy => policy.packageName).sort())
115
+ || config.grant.coordinatorId !== input.handoff?.coordinatorId
116
+ || !isDeepStrictEqual(config.grant.liveQualification, input.liveQualification)
117
+ || !isDeepStrictEqual(config.grant.hostDeploymentInputs, input.hostDeploymentInputs)
118
+ || !isDeepStrictEqual(config.grant.hostDeploymentInputs, input.adoption.grant.hostDeploymentInputs)
119
+ || config.grant.expiresAt <= Date.now()
120
+ || config.grant.notBefore > Date.now())
121
+ fail('grant deployment terms differ');
122
+ const trusted = resolveTrustKey(input.trust, 'host-attestation', template.authority, template.keyId);
123
+ const key = createPublicKey(createPrivateKey(await input.readPrivate(template.privateKeyPath))).export({ type: 'spki', format: 'der' });
124
+ if (!key.equals(createPublicKey(trusted.publicKeyPem).export({ type: 'spki', format: 'der' })))
125
+ fail('signing key differs from trust');
126
+ await privateDirectory(template.stateRoot);
127
+ await privateDirectory(dirname(config.statePath));
128
+ }
129
+ //# sourceMappingURL=rsi-host-authorities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsi-host-authorities.js","sourceRoot":"","sources":["../src/rsi-host-authorities.ts"],"names":[],"mappings":"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"}