@dsh-enhanced/lark-channel 0.1.48 → 0.1.53

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 (205) hide show
  1. package/README.md +20 -8
  2. package/docs/rsi-setup.md +145 -12
  3. package/docs/setup.md +29 -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/launchd-control.d.ts +24 -0
  22. package/lib/launchd-control.d.ts.map +1 -0
  23. package/lib/launchd-control.js +68 -0
  24. package/lib/launchd-control.js.map +1 -0
  25. package/lib/launchd-identity.d.ts +34 -0
  26. package/lib/launchd-identity.d.ts.map +1 -0
  27. package/lib/launchd-identity.js +184 -0
  28. package/lib/launchd-identity.js.map +1 -0
  29. package/lib/launchd-target-lock.d.ts +6 -0
  30. package/lib/launchd-target-lock.d.ts.map +1 -0
  31. package/lib/launchd-target-lock.js +48 -0
  32. package/lib/launchd-target-lock.js.map +1 -0
  33. package/lib/launchd.d.ts +18 -0
  34. package/lib/launchd.d.ts.map +1 -1
  35. package/lib/launchd.js +211 -54
  36. package/lib/launchd.js.map +1 -1
  37. package/lib/rsi-authority-config.d.ts +29 -0
  38. package/lib/rsi-authority-config.d.ts.map +1 -0
  39. package/lib/rsi-authority-config.js +233 -0
  40. package/lib/rsi-authority-config.js.map +1 -0
  41. package/lib/rsi-authority-resources.d.ts +36 -0
  42. package/lib/rsi-authority-resources.d.ts.map +1 -0
  43. package/lib/rsi-authority-resources.js +139 -0
  44. package/lib/rsi-authority-resources.js.map +1 -0
  45. package/lib/rsi-authority-runtime.d.ts +50 -0
  46. package/lib/rsi-authority-runtime.d.ts.map +1 -0
  47. package/lib/rsi-authority-runtime.js +393 -0
  48. package/lib/rsi-authority-runtime.js.map +1 -0
  49. package/lib/rsi-bootstrap-manifest.d.ts +39 -0
  50. package/lib/rsi-bootstrap-manifest.d.ts.map +1 -0
  51. package/lib/rsi-bootstrap-manifest.js +345 -0
  52. package/lib/rsi-bootstrap-manifest.js.map +1 -0
  53. package/lib/rsi-bootstrap.d.ts +30 -0
  54. package/lib/rsi-bootstrap.d.ts.map +1 -0
  55. package/lib/rsi-bootstrap.js +363 -0
  56. package/lib/rsi-bootstrap.js.map +1 -0
  57. package/lib/rsi-build.d.ts +54 -0
  58. package/lib/rsi-build.d.ts.map +1 -0
  59. package/lib/rsi-build.js +478 -0
  60. package/lib/rsi-build.js.map +1 -0
  61. package/lib/rsi-creation-build.d.ts +48 -0
  62. package/lib/rsi-creation-build.d.ts.map +1 -0
  63. package/lib/rsi-creation-build.js +363 -0
  64. package/lib/rsi-creation-build.js.map +1 -0
  65. package/lib/rsi-host-authorities.d.ts +18 -0
  66. package/lib/rsi-host-authorities.d.ts.map +1 -0
  67. package/lib/rsi-host-authorities.js +129 -0
  68. package/lib/rsi-host-authorities.js.map +1 -0
  69. package/lib/rsi-host-update.d.ts +113 -0
  70. package/lib/rsi-host-update.d.ts.map +1 -0
  71. package/lib/rsi-host-update.js +316 -0
  72. package/lib/rsi-host-update.js.map +1 -0
  73. package/lib/rsi-install-inputs.d.ts +43 -0
  74. package/lib/rsi-install-inputs.d.ts.map +1 -0
  75. package/lib/rsi-install-inputs.js +342 -0
  76. package/lib/rsi-install-inputs.js.map +1 -0
  77. package/lib/rsi-install.d.ts +54 -0
  78. package/lib/rsi-install.d.ts.map +1 -0
  79. package/lib/rsi-install.js +404 -0
  80. package/lib/rsi-install.js.map +1 -0
  81. package/lib/rsi-local-activation.d.ts +78 -0
  82. package/lib/rsi-local-activation.d.ts.map +1 -0
  83. package/lib/rsi-local-activation.js +485 -0
  84. package/lib/rsi-local-activation.js.map +1 -0
  85. package/lib/rsi-local-cohort.d.ts +70 -0
  86. package/lib/rsi-local-cohort.d.ts.map +1 -0
  87. package/lib/rsi-local-cohort.js +781 -0
  88. package/lib/rsi-local-cohort.js.map +1 -0
  89. package/lib/rsi-local-install.d.ts +68 -0
  90. package/lib/rsi-local-install.d.ts.map +1 -0
  91. package/lib/rsi-local-install.js +322 -0
  92. package/lib/rsi-local-install.js.map +1 -0
  93. package/lib/rsi-local-pair-install.d.ts +38 -0
  94. package/lib/rsi-local-pair-install.d.ts.map +1 -0
  95. package/lib/rsi-local-pair-install.js +200 -0
  96. package/lib/rsi-local-pair-install.js.map +1 -0
  97. package/lib/rsi-local-profile-update.d.ts +25 -0
  98. package/lib/rsi-local-profile-update.d.ts.map +1 -0
  99. package/lib/rsi-local-profile-update.js +226 -0
  100. package/lib/rsi-local-profile-update.js.map +1 -0
  101. package/lib/rsi-local-resources.d.ts +37 -0
  102. package/lib/rsi-local-resources.d.ts.map +1 -0
  103. package/lib/rsi-local-resources.js +184 -0
  104. package/lib/rsi-local-resources.js.map +1 -0
  105. package/lib/rsi-local-roots-extension.d.ts +11 -0
  106. package/lib/rsi-local-roots-extension.d.ts.map +1 -0
  107. package/lib/rsi-local-roots-extension.js +31 -0
  108. package/lib/rsi-local-roots-extension.js.map +1 -0
  109. package/lib/rsi-local-update-build.d.ts +18 -0
  110. package/lib/rsi-local-update-build.d.ts.map +1 -0
  111. package/lib/rsi-local-update-build.js +37 -0
  112. package/lib/rsi-local-update-build.js.map +1 -0
  113. package/lib/rsi-local-update.d.ts +39 -0
  114. package/lib/rsi-local-update.d.ts.map +1 -0
  115. package/lib/rsi-local-update.js +205 -0
  116. package/lib/rsi-local-update.js.map +1 -0
  117. package/lib/rsi-memory-learning.d.ts +30 -0
  118. package/lib/rsi-memory-learning.d.ts.map +1 -0
  119. package/lib/rsi-memory-learning.js +104 -0
  120. package/lib/rsi-memory-learning.js.map +1 -0
  121. package/lib/rsi-native-install.d.ts +38 -0
  122. package/lib/rsi-native-install.d.ts.map +1 -0
  123. package/lib/rsi-native-install.js +254 -0
  124. package/lib/rsi-native-install.js.map +1 -0
  125. package/lib/rsi-native-launchd.d.ts +7 -0
  126. package/lib/rsi-native-launchd.d.ts.map +1 -0
  127. package/lib/rsi-native-launchd.js +49 -0
  128. package/lib/rsi-native-launchd.js.map +1 -0
  129. package/lib/rsi-native-profile.d.ts +64 -0
  130. package/lib/rsi-native-profile.d.ts.map +1 -0
  131. package/lib/rsi-native-profile.js +283 -0
  132. package/lib/rsi-native-profile.js.map +1 -0
  133. package/lib/rsi-native-runtime-bootstrap.d.ts +35 -0
  134. package/lib/rsi-native-runtime-bootstrap.d.ts.map +1 -0
  135. package/lib/rsi-native-runtime-bootstrap.js +385 -0
  136. package/lib/rsi-native-runtime-bootstrap.js.map +1 -0
  137. package/lib/rsi-owner-profile.d.ts +37 -0
  138. package/lib/rsi-owner-profile.d.ts.map +1 -0
  139. package/lib/rsi-owner-profile.js +178 -0
  140. package/lib/rsi-owner-profile.js.map +1 -0
  141. package/lib/rsi-plugin-creation.d.ts +32 -0
  142. package/lib/rsi-plugin-creation.d.ts.map +1 -0
  143. package/lib/rsi-plugin-creation.js +189 -0
  144. package/lib/rsi-plugin-creation.js.map +1 -0
  145. package/lib/rsi-profile.d.ts +23 -0
  146. package/lib/rsi-profile.d.ts.map +1 -1
  147. package/lib/rsi-profile.js +154 -43
  148. package/lib/rsi-profile.js.map +1 -1
  149. package/lib/rsi-release-build.d.ts +41 -0
  150. package/lib/rsi-release-build.d.ts.map +1 -0
  151. package/lib/rsi-release-build.js +223 -0
  152. package/lib/rsi-release-build.js.map +1 -0
  153. package/lib/rsi-service-environment.d.ts +6 -0
  154. package/lib/rsi-service-environment.d.ts.map +1 -0
  155. package/lib/rsi-service-environment.js +113 -0
  156. package/lib/rsi-service-environment.js.map +1 -0
  157. package/lib/rsi-service-setup.d.ts +10 -0
  158. package/lib/rsi-service-setup.d.ts.map +1 -0
  159. package/lib/rsi-service-setup.js +34 -0
  160. package/lib/rsi-service-setup.js.map +1 -0
  161. package/lib/rsi-setup.d.ts +35 -2
  162. package/lib/rsi-setup.d.ts.map +1 -1
  163. package/lib/rsi-setup.js +475 -32
  164. package/lib/rsi-setup.js.map +1 -1
  165. package/lib/rsi-source-maintenance.d.ts +25 -0
  166. package/lib/rsi-source-maintenance.d.ts.map +1 -0
  167. package/lib/rsi-source-maintenance.js +348 -0
  168. package/lib/rsi-source-maintenance.js.map +1 -0
  169. package/lib/rsi-source-update.d.ts +26 -0
  170. package/lib/rsi-source-update.d.ts.map +1 -0
  171. package/lib/rsi-source-update.js +276 -0
  172. package/lib/rsi-source-update.js.map +1 -0
  173. package/lib/rsi-source.d.ts +34 -0
  174. package/lib/rsi-source.d.ts.map +1 -0
  175. package/lib/rsi-source.js +487 -0
  176. package/lib/rsi-source.js.map +1 -0
  177. package/lib/rsi-systemd-bootstrap.d.ts +46 -0
  178. package/lib/rsi-systemd-bootstrap.d.ts.map +1 -0
  179. package/lib/rsi-systemd-bootstrap.js +271 -0
  180. package/lib/rsi-systemd-bootstrap.js.map +1 -0
  181. package/lib/sdk.d.ts.map +1 -1
  182. package/lib/sdk.js +26 -1
  183. package/lib/sdk.js.map +1 -1
  184. package/lib/setup-business.d.ts +49 -0
  185. package/lib/setup-business.d.ts.map +1 -0
  186. package/lib/setup-business.js +335 -0
  187. package/lib/setup-business.js.map +1 -0
  188. package/lib/setup-profile.d.ts +1 -1
  189. package/lib/setup-profile.d.ts.map +1 -1
  190. package/lib/setup-profile.js +25 -2
  191. package/lib/setup-profile.js.map +1 -1
  192. package/lib/setup.d.ts +12 -1
  193. package/lib/setup.d.ts.map +1 -1
  194. package/lib/setup.js +265 -48
  195. package/lib/setup.js.map +1 -1
  196. package/lib/systemd.d.ts +10 -0
  197. package/lib/systemd.d.ts.map +1 -1
  198. package/lib/systemd.js +23 -6
  199. package/lib/systemd.js.map +1 -1
  200. package/lib/types.d.ts +7 -0
  201. package/lib/types.d.ts.map +1 -1
  202. package/lib/types.js.map +1 -1
  203. package/lib/version.d.ts +1 -1
  204. package/lib/version.js +1 -1
  205. package/package.json +33 -20
@@ -0,0 +1,393 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { constants } from 'node:fs';
3
+ import { chmod, lstat, mkdir, mkdtemp, open, readdir, realpath, rename, rm } from 'node:fs/promises';
4
+ import { createRequire } from 'node:module';
5
+ import { basename, dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
6
+ import { pathToFileURL } from 'node:url';
7
+ import { isDeepStrictEqual } from 'node:util';
8
+ import { rsiBuildResources as io } from './rsi-build.js';
9
+ import { version } from './version.js';
10
+ const PHASES = ['pr', 'review', 'merge', 'build', 'sign', 'publish', 'registry-verify', 'catalog-admission'];
11
+ const EXECUTABLES = {
12
+ approval: 'dsh-source-approval-authority.js', release: 'dsh-source-release-authority.js',
13
+ adoption: 'dsh-source-adoption-authority.js', observation: 'dsh-task-observation-authority.js',
14
+ qualification: 'dsh-live-qualification-authority.js', hostAuthority: 'dsh-systemd-host-authority.js',
15
+ hostAttestor: 'dsh-systemd-host-attestor.js',
16
+ };
17
+ const MAX_ENTRIES = 512, MAX_FILE = 160_000_000, MAX_TOTAL = 256_000_000;
18
+ const CONTRACT_PACKAGE = '@dsh-enhanced/assistant-growth-contract';
19
+ const CONTRACT_ROOT = `node_modules/${CONTRACT_PACKAGE}`;
20
+ const RUNTIME_DIRECTORIES = ['bin', 'lib', 'node_modules', 'node_modules/@dsh-enhanced', CONTRACT_ROOT, `${CONTRACT_ROOT}/lib`];
21
+ function fail(message) { throw new Error(`rsi authority runtime: ${message}`); }
22
+ function hash(bytes) { return createHash('sha256').update(bytes).digest('hex'); }
23
+ function exactPath(path) {
24
+ return isAbsolute(path) && resolve(path) === path
25
+ && !path.includes('\0') && !path.includes('\r') && !path.includes('\n');
26
+ }
27
+ function environment(home) { return { PATH: '/usr/bin:/bin', LANG: 'C', LC_ALL: 'C', HOME: home }; }
28
+ function pin(root, path, sha256) { return { path: join(root, path), sha256 }; }
29
+ function result(root, entries) {
30
+ const found = (path) => {
31
+ const item = entries.find(entry => entry.path === path);
32
+ if (!item)
33
+ fail(`missing asset: ${path}`);
34
+ return pin(root, path, item.sha256);
35
+ };
36
+ const executables = {};
37
+ for (const [key, filename] of Object.entries(EXECUTABLES))
38
+ executables[key] = found(`bin/${filename}`);
39
+ const releaseAdapters = {};
40
+ for (const phase of PHASES)
41
+ releaseAdapters[phase] = found(`bin/dsh-local-release-${phase}.js`);
42
+ return { schemaVersion: 1, packageVersion: version, root, node: found('node'), executables, releaseAdapters,
43
+ processHelper: found('lib/adapter-process.js'), observerClient: found('lib/runtime-observer-protocol.js'),
44
+ catalogValidator: found('lib/catalog.js'), catalogInterpreter: found('lib/catalog-interpreter.js') };
45
+ }
46
+ async function asset(path, maximum, signal) {
47
+ signal.throwIfAborted();
48
+ const bytes = await io.readStable(path, maximum, false, true);
49
+ signal.throwIfAborted();
50
+ return bytes;
51
+ }
52
+ async function sourceAssets(packageRoot, nodePath, signal) {
53
+ await io.directory(packageRoot, false);
54
+ await io.directory(join(packageRoot, 'bin'), false);
55
+ await io.directory(join(packageRoot, 'lib'), false);
56
+ const packageBytes = await asset(join(packageRoot, 'package.json'), 65_536, signal);
57
+ const manifest = JSON.parse(packageBytes.toString('utf8'));
58
+ if (manifest.name !== '@dsh-enhanced/plugin-control-plane' || manifest.version !== version || manifest.type !== 'module')
59
+ fail('installed package identity differs');
60
+ if (typeof manifest.dependencies?.[CONTRACT_PACKAGE] !== 'string')
61
+ fail('installed shared contract is not declared');
62
+ const libraries = (await readdir(join(packageRoot, 'lib'))).filter(name => name.endsWith('.js')).sort();
63
+ if (!libraries.length || libraries.length + 19 > MAX_ENTRIES)
64
+ fail('library entry bound exceeded');
65
+ const names = new Map([['package.json', join(packageRoot, 'package.json')], ['node', nodePath]]);
66
+ for (const name of libraries)
67
+ names.set(`lib/${name}`, join(packageRoot, 'lib', name));
68
+ for (const name of Object.values(EXECUTABLES))
69
+ names.set(`bin/${name}`, join(packageRoot, 'bin', name));
70
+ for (const phase of PHASES)
71
+ names.set(`bin/dsh-local-release-${phase}.js`, join(packageRoot, 'bin', 'dsh-local-release-adapter.js'));
72
+ // Resolve through this package's manifest, but accept only its own dependency
73
+ // edge or the adjacent edge in the same pnpm virtual-store node_modules.
74
+ const resolvedContract = createRequire(join(packageRoot, 'package.json')).resolve(`${CONTRACT_PACKAGE}/package.json`);
75
+ const contractRoot = dirname(await realpath(resolvedContract));
76
+ const edges = [join(packageRoot, 'node_modules', CONTRACT_PACKAGE)];
77
+ if (basename(dirname(packageRoot)) === '@dsh-enhanced' && basename(dirname(dirname(packageRoot))) === 'node_modules'
78
+ && basename(dirname(dirname(dirname(dirname(packageRoot))))) === '.pnpm') {
79
+ edges.push(join(dirname(packageRoot), 'assistant-growth-contract'));
80
+ }
81
+ const edgeRoots = await Promise.all(edges.map(async (edge) => realpath(edge).catch(() => undefined)));
82
+ if (!edgeRoots.includes(contractRoot))
83
+ fail('installed shared contract resolved outside its dependency edge');
84
+ await io.directory(contractRoot, false);
85
+ await io.directory(join(contractRoot, 'lib'), false);
86
+ const contractPackageBytes = await asset(join(contractRoot, 'package.json'), 65_536, signal);
87
+ const contractManifest = JSON.parse(contractPackageBytes.toString('utf8'));
88
+ if (contractManifest.name !== CONTRACT_PACKAGE || contractManifest.version !== version || contractManifest.type !== 'module'
89
+ || Object.keys(contractManifest.dependencies ?? {}).length || Object.keys(contractManifest.optionalDependencies ?? {}).length) {
90
+ fail('installed shared contract identity or dependency boundary differs');
91
+ }
92
+ names.set(`${CONTRACT_ROOT}/package.json`, join(contractRoot, 'package.json'));
93
+ const contractLibraries = (await readdir(join(contractRoot, 'lib'))).filter(name => name.endsWith('.js')).sort();
94
+ if (!contractLibraries.includes('index.js') || names.size + contractLibraries.length > MAX_ENTRIES)
95
+ fail('shared contract entry bound exceeded');
96
+ for (const name of contractLibraries)
97
+ names.set(`${CONTRACT_ROOT}/lib/${name}`, join(contractRoot, 'lib', name));
98
+ const files = [];
99
+ let total = 0;
100
+ for (const [path, sourcePath] of names) {
101
+ const bytes = path === 'package.json' ? packageBytes : path === `${CONTRACT_ROOT}/package.json`
102
+ ? contractPackageBytes : await asset(sourcePath, MAX_FILE, signal);
103
+ total += bytes.length;
104
+ if (total > MAX_TOTAL)
105
+ fail('asset byte bound exceeded');
106
+ const sourceMode = (await lstat(sourcePath)).mode & 0o777;
107
+ files.push({ path, sourcePath, bytes, sourceSha256: hash(bytes), sourceMode });
108
+ }
109
+ const node = files.find(file => file.path === 'node').bytes;
110
+ if (!node.subarray(0, 4).equals(Buffer.from([0x7f, 0x45, 0x4c, 0x46])))
111
+ fail('Node interpreter is not native ELF');
112
+ const nodeVersion = await io.command(nodePath, ['--version'], environment(packageRoot), signal, 10_000, 1024);
113
+ const match = /^v(\d+)\.(\d+)\.(\d+)$/u.exec(nodeVersion);
114
+ if (!match || !(Number(match[1]) === 22 && Number(match[2]) >= 19 || Number(match[1]) >= 24))
115
+ fail('Node version is outside package engines');
116
+ return files;
117
+ }
118
+ async function verifySources(files, signal) {
119
+ const seen = new Set();
120
+ for (const file of files) {
121
+ if (seen.has(file.sourcePath))
122
+ continue;
123
+ seen.add(file.sourcePath);
124
+ if (hash(await asset(file.sourcePath, MAX_FILE, signal)) !== file.sourceSha256
125
+ || ((await lstat(file.sourcePath)).mode & 0o777) !== file.sourceMode)
126
+ fail('installed source changed');
127
+ }
128
+ }
129
+ function deployedBytes(file, root) {
130
+ if (file.path === 'package.json')
131
+ return Buffer.from('{"type":"module"}\n');
132
+ if (!file.path.startsWith('bin/'))
133
+ return file.bytes;
134
+ const first = file.bytes.toString('utf8', 0, 128).split('\n', 1)[0] ?? '';
135
+ if (!first.startsWith('#!'))
136
+ fail('CLI has no shebang');
137
+ return Buffer.concat([Buffer.from(`#!${join(root, 'node')}\n`), file.bytes.subarray(Buffer.byteLength(first) + 1)]);
138
+ }
139
+ async function writeFile(path, bytes, mode) {
140
+ const fd = await open(path, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, mode);
141
+ try {
142
+ await fd.writeFile(bytes);
143
+ await fd.chmod(mode);
144
+ await fd.sync();
145
+ }
146
+ finally {
147
+ await fd.close();
148
+ }
149
+ }
150
+ async function verifyTree(root, entries, signal) {
151
+ await io.directory(root);
152
+ const expected = new Map(entries.map(item => [item.path, item]));
153
+ const visit = async (folder, relative = '') => {
154
+ signal.throwIfAborted();
155
+ const names = await readdir(folder);
156
+ for (const name of names) {
157
+ const path = relative ? `${relative}/${name}` : name;
158
+ const full = join(root, path), item = await lstat(full);
159
+ if (item.isSymbolicLink() || item.nlink !== 1 && item.isFile() || process.getuid && item.uid !== process.getuid())
160
+ fail('deployed asset is linked or unowned');
161
+ if (item.isDirectory()) {
162
+ if (!RUNTIME_DIRECTORIES.includes(path) || !entries.some(entry => entry.path.startsWith(`${path}/`))
163
+ || (item.mode & 0o777) !== 0o700)
164
+ fail('unexpected runtime directory');
165
+ await visit(full, path);
166
+ }
167
+ else if (item.isFile()) {
168
+ if (path === 'receipt.json')
169
+ continue;
170
+ const entry = expected.get(path);
171
+ if (!entry || item.size !== entry.size || (item.mode & 0o777) !== entry.mode
172
+ || hash(await asset(full, MAX_FILE, signal)) !== entry.sha256)
173
+ fail(`deployed asset changed: ${path}`);
174
+ expected.delete(path);
175
+ }
176
+ else
177
+ fail('nonregular runtime entry');
178
+ }
179
+ };
180
+ await visit(root);
181
+ if (expected.size)
182
+ fail('deployed asset missing');
183
+ const receipt = await lstat(join(root, 'receipt.json'));
184
+ if (!receipt.isFile() || receipt.nlink !== 1 || (receipt.mode & 0o777) !== 0o600)
185
+ fail('unsafe receipt');
186
+ }
187
+ async function verifyRuntime(runtime, signal) {
188
+ const env = environment(runtime.root);
189
+ const modules = ['source-approval-authority', 'source-release-authority', 'source-adoption-authority',
190
+ 'task-observation-authority', 'live-qualification-authority', 'systemd-host-authority',
191
+ 'runtime-observer-protocol', 'adapter-process'];
192
+ const urls = modules.map(name => pathToFileURL(join(runtime.root, 'lib', `${name}.js`)).href);
193
+ const script = `await Promise.all(${JSON.stringify(urls)}.map(url => import(url)))`;
194
+ await io.command(runtime.node.path, ['--input-type=module', '--eval', script], env, signal, 10_000, 4096);
195
+ for (const [key, spec] of [['hostAttestor', runtime.executables.hostAttestor], ...Object.entries(runtime.releaseAdapters)]) {
196
+ const expected = key === 'hostAttestor' ? 'dsh-systemd-host-attestor-8' : 'dsh-local-release-adapter-1';
197
+ const output = await io.command(runtime.node.path, [spec.path, '--version'], env, signal, 10_000, 4096);
198
+ if (output !== expected)
199
+ fail(`CLI version check failed: ${key}`);
200
+ }
201
+ }
202
+ /** Read a copied runtime receipt through its physical stage path, retaining
203
+ * the logical paths embedded in the original installation. */
204
+ export async function readRsiAuthorityRuntimeReceipt(input) {
205
+ const { logicalHome, physicalHome, profile } = input;
206
+ if (!exactPath(logicalHome) || !exactPath(physicalHome) || !/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/u.test(profile))
207
+ fail('invalid copied runtime binding');
208
+ const root = join(physicalHome, 'rsi-authority-runtimes', profile);
209
+ const source = await io.readStable(join(root, 'receipt.json'), 65_536, true);
210
+ const receipt = JSON.parse(source.toString('utf8'));
211
+ const { digest, ...body } = receipt;
212
+ if (receipt.schemaVersion !== 1 || receipt.root !== join(logicalHome, 'rsi-authority-runtimes', profile)
213
+ || !Array.isArray(receipt.entries) || receipt.entries.length > MAX_ENTRIES
214
+ || !/^[a-f0-9]{64}$/u.test(digest) || hash(JSON.stringify(body)) !== digest)
215
+ fail('copied runtime receipt differs');
216
+ const signal = input.signal ?? new AbortController().signal;
217
+ await verifyTree(root, receipt.entries, signal);
218
+ const { entries: _entries, ...runtime } = body;
219
+ return { runtime, receiptDigest: hash(source) };
220
+ }
221
+ /** Replace only the copied runtime under a stopped Home stage. The receipt and
222
+ * shebangs keep their logical Home paths, so the transaction can rename Home. */
223
+ export async function replaceRsiAuthorityRuntimeInStage(input, options = {}) {
224
+ const previous = await readRsiAuthorityRuntimeReceipt(input);
225
+ const signal = AbortSignal.any([input.signal ?? new AbortController().signal, AbortSignal.timeout(120_000)]);
226
+ const parent = join(input.physicalHome, 'rsi-authority-runtimes');
227
+ await io.directory(parent);
228
+ const final = join(input.logicalHome, 'rsi-authority-runtimes', input.profile);
229
+ if (previous.runtime.root !== final)
230
+ fail('previous runtime root changed');
231
+ const physical = join(parent, input.profile);
232
+ const packageRoot = options.packageRoot ?? dirname(createRequire(import.meta.url).resolve('@dsh-enhanced/plugin-control-plane/package.json'));
233
+ const nodePath = await realpath(options.nodePath ?? process.execPath);
234
+ if (!exactPath(packageRoot) || !exactPath(nodePath))
235
+ fail('source paths must be canonical');
236
+ const files = await sourceAssets(packageRoot, nodePath, signal);
237
+ const logicalSourcePath = (path) => path === input.physicalHome ? input.logicalHome
238
+ : path.startsWith(`${input.physicalHome}${sep}`)
239
+ ? join(input.logicalHome, relative(input.physicalHome, path)) : path;
240
+ const entries = files.map(file => {
241
+ const bytes = deployedBytes(file, final);
242
+ return { path: file.path, sha256: hash(bytes), size: bytes.length,
243
+ mode: file.path === 'node' || file.path.startsWith('bin/') ? 0o700 : 0o600,
244
+ sourcePath: logicalSourcePath(file.sourcePath), sourceSha256: file.sourceSha256,
245
+ sourceSize: file.bytes.length, sourceMode: file.sourceMode };
246
+ }).sort((a, b) => a.path.localeCompare(b.path));
247
+ const runtime = result(final, entries);
248
+ const stage = await mkdtemp(join(parent, `.${input.profile}-update-`));
249
+ const backup = await mkdtemp(join(parent, `.${input.profile}-previous-`));
250
+ await rm(backup, { recursive: true });
251
+ let moved = false;
252
+ try {
253
+ await chmod(stage, 0o700);
254
+ for (const directory of RUNTIME_DIRECTORIES)
255
+ await mkdir(join(stage, directory), { mode: 0o700 });
256
+ for (const file of files) {
257
+ const entry = entries.find(item => item.path === file.path);
258
+ await writeFile(join(stage, file.path), deployedBytes(file, final), entry.mode);
259
+ }
260
+ await verifySources(files, signal);
261
+ const body = { ...runtime, entries };
262
+ await writeFile(join(stage, 'receipt.json'), Buffer.from(JSON.stringify({ ...body, digest: hash(JSON.stringify(body)) })), 0o600);
263
+ await verifyTree(stage, entries, signal);
264
+ for (const directory of [...RUNTIME_DIRECTORIES].reverse())
265
+ await io.syncDirectory(join(stage, directory));
266
+ await io.syncDirectory(stage);
267
+ await rename(physical, backup);
268
+ moved = true;
269
+ try {
270
+ await rename(stage, physical);
271
+ }
272
+ catch (error) {
273
+ await rename(backup, physical);
274
+ moved = false;
275
+ throw error;
276
+ }
277
+ const actual = await readRsiAuthorityRuntimeReceipt(input);
278
+ if (!isDeepStrictEqual(actual.runtime, runtime))
279
+ fail('replacement runtime differs');
280
+ await verifyRuntime({ ...runtime, root: physical, node: { ...runtime.node, path: join(physical, 'node') },
281
+ executables: Object.fromEntries(Object.entries(runtime.executables).map(([key, pin]) => [key, { ...pin, path: join(physical, 'bin', EXECUTABLES[key]) }])),
282
+ releaseAdapters: Object.fromEntries(Object.entries(runtime.releaseAdapters).map(([key, pin]) => [key, { ...pin, path: join(physical, 'bin', `dsh-local-release-${key}.js`) }])) }, signal);
283
+ await rm(backup, { recursive: true });
284
+ return runtime;
285
+ }
286
+ catch (error) {
287
+ if (moved) {
288
+ await rm(physical, { recursive: true, force: true });
289
+ await rename(backup, physical);
290
+ }
291
+ throw error;
292
+ }
293
+ finally {
294
+ await rm(stage, { recursive: true, force: true });
295
+ if (!moved)
296
+ await rm(backup, { recursive: true, force: true });
297
+ }
298
+ }
299
+ /** Caller holds the home lifecycle lock. Only this function's stage/final claim is removed on failure. */
300
+ export async function prepareRsiAuthorityRuntime(input, options = {}) {
301
+ if (!exactPath(input.dshHome) || !/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/u.test(input.profile))
302
+ fail('invalid home or profile');
303
+ if (process.platform !== 'linux')
304
+ fail('Linux is required');
305
+ await io.directory(input.dshHome, false);
306
+ const packageRoot = options.packageRoot ?? dirname(createRequire(import.meta.url).resolve('@dsh-enhanced/plugin-control-plane/package.json'));
307
+ const nodePath = await realpath(options.nodePath ?? process.execPath);
308
+ if (!exactPath(packageRoot) || !exactPath(nodePath))
309
+ fail('source paths must be canonical');
310
+ const parent = join(input.dshHome, 'rsi-authority-runtimes');
311
+ try {
312
+ await mkdir(parent, { mode: 0o700 });
313
+ }
314
+ catch (error) {
315
+ if (error.code !== 'EEXIST')
316
+ throw error;
317
+ }
318
+ await io.directory(parent);
319
+ const final = join(parent, input.profile);
320
+ const signal = AbortSignal.any([input.signal ?? new AbortController().signal, AbortSignal.timeout(120_000)]);
321
+ const files = await sourceAssets(packageRoot, nodePath, signal);
322
+ const entries = files.map(file => {
323
+ const bytes = deployedBytes(file, final);
324
+ return { path: file.path, sha256: hash(bytes), size: bytes.length,
325
+ mode: file.path === 'node' || file.path.startsWith('bin/') ? 0o700 : 0o600,
326
+ sourcePath: file.sourcePath, sourceSha256: file.sourceSha256, sourceSize: file.bytes.length, sourceMode: file.sourceMode };
327
+ }).sort((a, b) => a.path.localeCompare(b.path));
328
+ const runtime = result(final, entries);
329
+ try {
330
+ await lstat(final);
331
+ const receipt = JSON.parse((await io.readStable(join(final, 'receipt.json'), 65_536, true)).toString('utf8'));
332
+ const { digest, ...body } = receipt;
333
+ if (hash(JSON.stringify(body)) !== digest || !isDeepStrictEqual(body, { ...runtime, entries }))
334
+ fail('runtime differs from receipt');
335
+ await verifyTree(final, entries, signal);
336
+ await verifySources(files, signal);
337
+ await verifyRuntime(runtime, signal);
338
+ return runtime;
339
+ }
340
+ catch (error) {
341
+ if (error.code !== 'ENOENT')
342
+ throw error;
343
+ try {
344
+ await lstat(final);
345
+ fail('existing runtime is incomplete');
346
+ }
347
+ catch (found) {
348
+ if (found.code !== 'ENOENT')
349
+ throw found;
350
+ }
351
+ }
352
+ const stage = await mkdtemp(join(parent, `.${input.profile}-stage-`));
353
+ let claimed;
354
+ try {
355
+ await chmod(stage, 0o700);
356
+ for (const directory of RUNTIME_DIRECTORIES)
357
+ await mkdir(join(stage, directory), { mode: 0o700 });
358
+ for (const file of files) {
359
+ signal.throwIfAborted();
360
+ const entry = entries.find(item => item.path === file.path);
361
+ await writeFile(join(stage, file.path), deployedBytes(file, final), entry.mode);
362
+ }
363
+ await verifySources(files, signal);
364
+ const body = { ...runtime, entries };
365
+ await writeFile(join(stage, 'receipt.json'), Buffer.from(JSON.stringify({ ...body, digest: hash(JSON.stringify(body)) })), 0o600);
366
+ for (const directory of [...RUNTIME_DIRECTORIES].reverse())
367
+ await io.syncDirectory(join(stage, directory));
368
+ await io.syncDirectory(stage);
369
+ signal.throwIfAborted();
370
+ await mkdir(final, { mode: 0o700 });
371
+ const identity = await lstat(final);
372
+ claimed = { dev: identity.dev, ino: identity.ino };
373
+ for (const name of ['bin', 'lib', 'node_modules', 'node', 'package.json', 'receipt.json'])
374
+ await rename(join(stage, name), join(final, name));
375
+ await verifyTree(final, entries, signal);
376
+ await verifyRuntime(runtime, signal);
377
+ await io.syncDirectory(parent);
378
+ return runtime;
379
+ }
380
+ catch (error) {
381
+ if (claimed) {
382
+ const current = await lstat(final).catch(() => undefined);
383
+ if (current?.isDirectory() && current.dev === claimed.dev && current.ino === claimed.ino)
384
+ await rm(final, { recursive: true, force: true });
385
+ }
386
+ throw error;
387
+ }
388
+ finally {
389
+ await rm(stage, { recursive: true, force: true });
390
+ await io.syncDirectory(parent);
391
+ }
392
+ }
393
+ //# sourceMappingURL=rsi-authority-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsi-authority-runtime.js","sourceRoot":"","sources":["../src/rsi-authority-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { type ActiveLarkOwnerBinding } from '@dsh-enhanced/assistant-delivery';
2
+ import { type RuntimeObserverTarget } from '@dsh-enhanced/plugin-control-plane';
3
+ import { type Node } from 'yaml';
4
+ import type { RsiAuthorityResources } from './rsi-authority-resources.js';
5
+ import type { Pin, RsiAuthorityRuntime } from './rsi-authority-runtime.js';
6
+ import type { RsiBuildEnvironment } from './rsi-build.js';
7
+ import type { RsiSetupManifest } from './rsi-profile.js';
8
+ import type { RsiSourceWorkspace } from './rsi-source.js';
9
+ import type { RsiCreationBuildEnvironment } from './rsi-creation-build.js';
10
+ export interface RsiBootstrapManifestInput {
11
+ dshHome: string;
12
+ targetProfile: string;
13
+ coordinatorProfile: string;
14
+ /** Exact `dsh --dump-config` YAML of the still unmodified target profile. */
15
+ targetEffective: string;
16
+ owner: ActiveLarkOwnerBinding;
17
+ resources: RsiAuthorityResources;
18
+ runtime: RsiAuthorityRuntime;
19
+ source: RsiSourceWorkspace;
20
+ sourceBuild: RsiBuildEnvironment['sourceBuild'];
21
+ /** Prepared immutable behavior image; absent for legacy manifests. */
22
+ creationBuild?: RsiCreationBuildEnvironment;
23
+ git: Pin;
24
+ now: number;
25
+ expiresAt: number;
26
+ /** Complete installed scope authorized for source repair. */
27
+ plugins: readonly string[];
28
+ /** Loader observations of stable rows that will not be rewritten by the compiler. */
29
+ observerTargets: readonly RuntimeObserverTarget[];
30
+ /** Exact installed profile files that Host will independently pin on activation. */
31
+ hostDeploymentInputs: readonly string[];
32
+ }
33
+ /** Include's entryListSchema keeps !!js as an inert raw `{__jsExpr}` value in
34
+ * Loader Entry.options. Runtime observation hashes that raw value before the
35
+ * Fiber interpolates it. Never evaluate the expression while preparing setup. */
36
+ export declare function rawLoaderConfig(node: Node | string | number | boolean | null | undefined, label: string): unknown;
37
+ /** This only creates a candidate deployment contract. It performs no I/O and issues no authority. */
38
+ export declare function createRsiBootstrapManifest(input: RsiBootstrapManifestInput): RsiSetupManifest;
39
+ //# sourceMappingURL=rsi-bootstrap-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsi-bootstrap-manifest.d.ts","sourceRoot":"","sources":["../src/rsi-bootstrap-manifest.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAC9E,OAAO,EAAgF,KAAK,qBAAqB,EAAE,MAAM,oCAAoC,CAAA;AAC7J,OAAO,EAAkD,KAAK,IAAI,EAAgB,MAAM,MAAM,CAAA;AAE9F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACzE,OAAO,KAAK,EAAE,GAAG,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAC1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAIzD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAA;AAW1E,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,CAAA;IACrB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,6EAA6E;IAC7E,eAAe,EAAE,MAAM,CAAA;IACvB,KAAK,EAAE,sBAAsB,CAAA;IAC7B,SAAS,EAAE,qBAAqB,CAAA;IAChC,OAAO,EAAE,mBAAmB,CAAA;IAC5B,MAAM,EAAE,kBAAkB,CAAA;IAC1B,WAAW,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAA;IAC/C,sEAAsE;IACtE,aAAa,CAAC,EAAE,2BAA2B,CAAA;IAC3C,GAAG,EAAE,GAAG,CAAA;IACR,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,6DAA6D;IAC7D,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IAC1B,qFAAqF;IACrF,eAAe,EAAE,SAAS,qBAAqB,EAAE,CAAA;IACjD,oFAAoF;IACpF,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAA;CACxC;AAsBD;;iFAEiF;AACjF,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CA6BjH;AAED,qGAAqG;AACrG,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,yBAAyB,GAAG,gBAAgB,CA0O7F"}