@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,363 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ import { constants } from 'node:fs';
10
+ import { lstat, mkdir, open, readdir, realpath, rmdir, unlink } from 'node:fs/promises';
11
+ import { createHash, randomBytes } from 'node:crypto';
12
+ import { dirname, isAbsolute, join, resolve } from 'node:path';
13
+ import { isDeepStrictEqual } from 'node:util';
14
+ import { pathToFileURL } from 'node:url';
15
+ import { DatabaseSync } from 'node:sqlite';
16
+ import { ControlPlaneStore, controlPlaneSchemaVersion } from '@dsh-enhanced/plugin-control-plane';
17
+ import { compileRsiAuthorityConfigs } from './rsi-authority-config.js';
18
+ import { compileRsiProfiles } from './rsi-profile.js';
19
+ import { validateRsiAuthorities } from './rsi-setup.js';
20
+ import { prepareRsiAuthorityResources } from './rsi-authority-resources.js';
21
+ import { prepareRsiAuthorityRuntime } from './rsi-authority-runtime.js';
22
+ import { readRsiHostUpdateOverlayChain } from './rsi-host-update.js';
23
+ import { readRsiSourceMaintenance } from './rsi-source-maintenance.js';
24
+ import { rsiBuildResources as io } from './rsi-build.js';
25
+ function sameOwnedFile(stat, file) {
26
+ return stat.dev === file.dev && stat.ino === file.ino && stat.size === file.size
27
+ && stat.mtimeNs === file.mtimeNs && stat.ctimeNs === file.ctimeNs;
28
+ }
29
+ const hash = (value) => createHash('sha256').update(value).digest('hex');
30
+ const json = (value) => `${JSON.stringify(value, null, 2)}\n`;
31
+ function fail(message) { throw new Error(`rsi bootstrap: ${message}`); }
32
+ function within(path, root) {
33
+ return isAbsolute(path) && resolve(path) === path && path.startsWith(`${root}/`) && !path.includes('\0') && !/[\r\n]/u.test(path);
34
+ }
35
+ async function exists(path) {
36
+ try {
37
+ await lstat(path);
38
+ return true;
39
+ }
40
+ catch (error) {
41
+ if (error.code === 'ENOENT')
42
+ return false;
43
+ throw error;
44
+ }
45
+ }
46
+ async function privateFile(path, maximum = 2_097_152) {
47
+ if (await realpath(path) !== path)
48
+ fail(`noncanonical file: ${path}`);
49
+ const stat = await lstat(path);
50
+ if (stat.nlink !== 1 || !stat.isFile())
51
+ fail(`unsafe file: ${path}`);
52
+ await io.directory(dirname(path));
53
+ return io.readStable(path, maximum, true);
54
+ }
55
+ async function verifyRepairReceipts(overlay, home, profile) {
56
+ if (hash(await privateFile(join(home, '.rsi-setup-journal.json'))) !== overlay.repair.after.journalDigest
57
+ || hash(await privateFile(join(home, 'rsi-creation-builds', profile, 'bootstrap.json'), 65_536))
58
+ !== overlay.repair.after.creationReceiptDigest)
59
+ fail('signed owner repair receipts changed');
60
+ }
61
+ /** Read-only retry admission before either Host is stopped. */
62
+ export async function inspectRsiOwnerConfiguration(input) {
63
+ input.signal.throwIfAborted();
64
+ const { manifest, resources, patches } = input;
65
+ const manifestPath = join(resources.configRoot, 'manifest.json');
66
+ const bootstrapSource = (await privateFile(join(resources.configRoot, 'bootstrap.json'))).toString('utf8');
67
+ const receipt = JSON.parse(bootstrapSource);
68
+ const home = dirname(dirname(manifest.controlPlane.runtimeObserver.profilePath));
69
+ const overlayPath = join(resources.configRoot, 'host-update-overlays.json');
70
+ const overlay = readRsiHostUpdateOverlayChain({ source: await exists(overlayPath)
71
+ ? (await privateFile(overlayPath)).toString('utf8') : undefined,
72
+ resources, dshHome: home, profile: manifest.targetProfile, bootstrapSource });
73
+ const effective = overlay.latest ?? receipt;
74
+ const expectedResult = { schemaVersion: 1, manifestPath,
75
+ manifestDigest: hash(json(manifest)), targetProfile: manifest.targetProfile,
76
+ coordinatorProfile: manifest.coordinatorProfile };
77
+ if (receipt.schemaVersion !== 1 || !isDeepStrictEqual(effective.result, expectedResult)
78
+ || !effective.files || typeof effective.files !== 'object' || Array.isArray(effective.files)
79
+ || Object.keys(effective.files).length > 512
80
+ || effective.files[manifestPath] !== expectedResult.manifestDigest)
81
+ fail('existing owner receipt differs before stopping Hosts');
82
+ const roots = [resources.configRoot, resources.stateRoot, resources.registry.root];
83
+ for (const [path, digest] of Object.entries(effective.files)) {
84
+ input.signal.throwIfAborted();
85
+ if (!roots.some(root => within(path, root)) || !/^[a-f0-9]{64}$/u.test(digest)
86
+ || hash(await privateFile(path)) !== digest)
87
+ fail('existing configuration changed before stopping Hosts');
88
+ }
89
+ const key = await privateFile(manifest.controlPlane.runtimeObserver.keyPath, 32);
90
+ if (key.length !== 32 || hash(key) !== receipt.observerKeyDigest)
91
+ fail('observer identity changed before stopping Hosts');
92
+ const repair = overlay.records.findLast(record => record.kind === 'rsi-owner-repair-overlay');
93
+ if (repair?.kind === 'rsi-owner-repair-overlay')
94
+ await verifyRepairReceipts(repair, home, manifest.targetProfile);
95
+ if (overlay.latest) {
96
+ const patchDigests = { [manifest.targetProfile]: hash(patches.targetPatch),
97
+ [manifest.coordinatorProfile]: hash(patches.coordinatorPatch) };
98
+ for (const [profile, digest] of Object.entries(overlay.latest.patches)) {
99
+ const path = join(home, 'profiles', profile, 'cordis.patch.yml');
100
+ if (!within(path, join(home, 'profiles')) || hash(await privateFile(path)) !== digest)
101
+ fail('signed owner profile changed before stopping Hosts');
102
+ }
103
+ if (Object.entries(patchDigests).some(([profile, digest]) => overlay.latest?.patches[profile] !== digest)
104
+ || hash(json({ files: effective.files, patches: overlay.latest.patches })) !== overlay.latest.planDigest
105
+ || overlay.latest.runtimeReceiptDigest !== hash(await privateFile(join(home, 'rsi-authority-runtimes', manifest.targetProfile, 'receipt.json'), 65_536)))
106
+ fail('signed owner profiles changed before stopping Hosts');
107
+ }
108
+ else if (hash(json({ files: effective.files, patches })) !== receipt.planDigest) {
109
+ fail('owner receipt digest changed before stopping Hosts');
110
+ }
111
+ input.signal.throwIfAborted();
112
+ }
113
+ /** Prepare runnable owner-bound configurations, without changing either Host.
114
+ * The installer must hold the DSH_HOME lifecycle lock and reread the current
115
+ * owner/profile sources before calling. Configurations and grants are immutable
116
+ * for this preparation; retry never renews a grant or resets a live ledger. */
117
+ export async function prepareRsiOwnerConfiguration(input, context) {
118
+ const signal = AbortSignal.any([context.signal ?? new AbortController().signal, AbortSignal.timeout(120_000)]);
119
+ signal.throwIfAborted();
120
+ const { manifest, resources } = input;
121
+ if (context.binding.status !== 'active' || context.binding.owner.status !== 'active'
122
+ || context.binding.owner.role !== 'owner' || context.binding.conversation.kind !== 'dm'
123
+ || !isDeepStrictEqual(context.binding.principal, context.binding.owner.principal))
124
+ fail('active owner DM binding is required');
125
+ const observer = manifest.controlPlane.runtimeObserver;
126
+ if (!observer)
127
+ fail('runtime observer is required');
128
+ const home = dirname(dirname(observer.profilePath));
129
+ if (observer.profilePath !== join(home, 'profiles', manifest.targetProfile)
130
+ || resources.root !== join(home, 'rsi-authorities', manifest.targetProfile))
131
+ fail('installation paths differ');
132
+ // Revalidate persisted identities and program copies before writing grants.
133
+ // These calls preserve the installation IDs; they do not adopt foreign state.
134
+ const actualResources = await prepareRsiAuthorityResources({ dshHome: home, profile: manifest.targetProfile, signal });
135
+ if (!isDeepStrictEqual(actualResources, resources))
136
+ fail('signing resources differ from the installation');
137
+ const runtime = await prepareRsiAuthorityRuntime({ dshHome: home, profile: manifest.targetProfile, signal });
138
+ if (!isDeepStrictEqual(runtime, input.runtime))
139
+ fail('authority runtime differs from the installation');
140
+ const compiled = compileRsiAuthorityConfigs(input);
141
+ const manifestPath = join(resources.configRoot, 'manifest.json');
142
+ const receiptPath = join(resources.configRoot, 'bootstrap.json');
143
+ const overlayPath = join(resources.configRoot, 'host-update-overlays.json');
144
+ const files = { ...compiled.files };
145
+ if (Object.hasOwn(files, manifestPath) || Object.hasOwn(files, receiptPath) || Object.hasOwn(files, overlayPath))
146
+ fail('reserved configuration path');
147
+ files[manifestPath] = json(manifest);
148
+ if (Object.keys(files).length > 64 || Object.entries(files).some(([path, value]) => !within(path, resources.configRoot) || typeof value !== 'string' || Buffer.byteLength(value) > 2_097_152))
149
+ fail('configuration output exceeds its bounds');
150
+ if (!within(observer.keyPath, resources.configRoot) || Object.hasOwn(files, observer.keyPath)
151
+ || [manifestPath, receiptPath, overlayPath].includes(observer.keyPath))
152
+ fail('observer key must have a separate private configuration path');
153
+ const ledgerPath = join(manifest.controlPlane.statePath, 'control.sqlite');
154
+ if (!within(ledgerPath, resources.stateRoot) || !within(observer.socketPath, resources.stateRoot))
155
+ fail('runtime state must stay in the installation state root');
156
+ const readSourceMaintenance = async () => {
157
+ const path = join(home, 'rsi-sources', manifest.targetProfile, 'maintenance.json');
158
+ if (!await exists(path))
159
+ return [];
160
+ const maintained = await readRsiSourceMaintenance({ logicalHome: home, physicalHome: home,
161
+ profile: manifest.targetProfile, signal });
162
+ if (maintained.workspace.repository !== manifest.controlPlane.sourceJobs?.repository
163
+ || !isDeepStrictEqual(maintained.workspace.baseline, manifest.controlPlane.sourceJobs.baseline)) {
164
+ fail('source maintenance differs from owner configuration');
165
+ }
166
+ return maintained.records;
167
+ };
168
+ const sourceMaintenance = await readSourceMaintenance();
169
+ const directories = [...new Set([...compiled.directories, dirname(ledgerPath), dirname(observer.keyPath),
170
+ ...Object.keys(files).map(dirname)])].sort((left, right) => left.length - right.length || left.localeCompare(right));
171
+ const roots = [resources.configRoot, resources.stateRoot, resources.registry.root];
172
+ if (directories.some(path => !roots.some(root => path === root || within(path, root))))
173
+ fail('generated directory is outside prepared resources');
174
+ const expectedFiles = Object.fromEntries(Object.entries(files).sort(([left], [right]) => left.localeCompare(right)).map(([path, value]) => [path, hash(value)]));
175
+ const result = { schemaVersion: 1, manifestPath, manifestDigest: hash(files[manifestPath]),
176
+ targetProfile: manifest.targetProfile, coordinatorProfile: manifest.coordinatorProfile };
177
+ const verify = async (rememberSqliteSidecars) => {
178
+ signal.throwIfAborted();
179
+ for (const directory of directories)
180
+ await io.directory(directory);
181
+ await privateFile(ledgerPath, 268_435_456);
182
+ const database = new DatabaseSync(ledgerPath, { readOnly: true });
183
+ try {
184
+ const row = database.prepare('PRAGMA user_version').get();
185
+ if (row.user_version !== controlPlaneSchemaVersion)
186
+ fail('control ledger schema differs from the installed runtime');
187
+ const stored = database.prepare('SELECT record_json FROM source_maintenance WHERE repository=? ORDER BY sequence')
188
+ .all(manifest.controlPlane.sourceJobs.repository).map(row => JSON.parse(String(row.record_json)));
189
+ if (!isDeepStrictEqual(stored, sourceMaintenance)
190
+ || !isDeepStrictEqual(await readSourceMaintenance(), sourceMaintenance))
191
+ fail('source maintenance ledger differs from retained history');
192
+ }
193
+ finally {
194
+ database.close();
195
+ await rememberSqliteSidecars?.();
196
+ }
197
+ const patches = await compileRsiProfiles({ manifest, dshHome: home, ...context.profiles, owner: context.binding });
198
+ await validateRsiAuthorities(manifest, context.binding, manifest.serviceEnvironment?.target);
199
+ for (const phase of Object.keys(runtime.releaseAdapters)) {
200
+ signal.throwIfAborted();
201
+ const adapter = await import(__rewriteRelativeImportExtension(pathToFileURL(runtime.releaseAdapters[phase].path).href));
202
+ if (typeof adapter.inspectLocalReleaseAdapterConfiguration !== 'function')
203
+ fail('installed release adapter lacks configuration inspection');
204
+ const actual = adapter.inspectLocalReleaseAdapterConfiguration(manifest.serviceEnvironment.target, phase);
205
+ const expected = compiled.trust.releaseAdapters[phase];
206
+ if (!isDeepStrictEqual(actual, { id: expected.id, phase, executablePath: expected.path,
207
+ authority: expected.authority, keyId: expected.keyId }))
208
+ fail('release adapter configuration differs from trust');
209
+ }
210
+ signal.throwIfAborted();
211
+ return patches;
212
+ };
213
+ if (await exists(receiptPath)) {
214
+ const bootstrapSource = (await privateFile(receiptPath)).toString('utf8');
215
+ const receipt = JSON.parse(bootstrapSource);
216
+ const overlay = readRsiHostUpdateOverlayChain({ source: await exists(overlayPath)
217
+ ? (await privateFile(overlayPath)).toString('utf8') : undefined,
218
+ resources, dshHome: home, profile: manifest.targetProfile, bootstrapSource });
219
+ const effective = overlay.latest ?? receipt;
220
+ if (receipt.schemaVersion !== 1 || !isDeepStrictEqual(effective.files, expectedFiles)
221
+ || !isDeepStrictEqual(effective.result, result))
222
+ fail('existing owner configuration differs; retain it for reconciliation');
223
+ for (const [path, digest] of Object.entries(expectedFiles))
224
+ if (hash(await privateFile(path)) !== digest)
225
+ fail('existing configuration changed');
226
+ const key = await privateFile(observer.keyPath, 32);
227
+ if (key.length !== 32 || hash(key) !== receipt.observerKeyDigest)
228
+ fail('observer identity changed');
229
+ const patches = await verify();
230
+ const repair = overlay.records.findLast(record => record.kind === 'rsi-owner-repair-overlay');
231
+ if (repair?.kind === 'rsi-owner-repair-overlay')
232
+ await verifyRepairReceipts(repair, home, manifest.targetProfile);
233
+ if (overlay.latest) {
234
+ const patchDigests = { [manifest.targetProfile]: hash(patches.targetPatch),
235
+ [manifest.coordinatorProfile]: hash(patches.coordinatorPatch) };
236
+ for (const [profile, digest] of Object.entries(overlay.latest.patches)) {
237
+ const path = join(home, 'profiles', profile, 'cordis.patch.yml');
238
+ if (!within(path, join(home, 'profiles')) || hash(await privateFile(path)) !== digest)
239
+ fail('signed owner profile changed');
240
+ }
241
+ if (Object.entries(patchDigests).some(([profile, digest]) => overlay.latest?.patches[profile] !== digest)
242
+ || hash(json({ files: expectedFiles, patches: overlay.latest.patches })) !== overlay.latest.planDigest
243
+ || overlay.latest.runtimeReceiptDigest !== hash(await privateFile(join(home, 'rsi-authority-runtimes', manifest.targetProfile, 'receipt.json'), 65_536)))
244
+ fail('signed Host update differs from compiled configuration');
245
+ }
246
+ else if (hash(json({ files: expectedFiles, patches })) !== receipt.planDigest)
247
+ fail('owner or compiled profiles changed');
248
+ return result;
249
+ }
250
+ // First preparation must not overwrite an operator's configuration or attach
251
+ // new installation IDs to an existing ledger. A crash leaves inspectable
252
+ // partial resources; it is never interpreted as a fresh installation.
253
+ const sqliteSidecars = [`${ledgerPath}-wal`, `${ledgerPath}-shm`];
254
+ if ((await readdir(resources.configRoot)).length || await exists(ledgerPath)
255
+ || (await Promise.all(sqliteSidecars.map(exists))).some(Boolean))
256
+ fail('unregistered configuration or ledger already exists');
257
+ const ownedFiles = [];
258
+ const ownedDirectories = [];
259
+ const remember = async (path) => {
260
+ const stat = await lstat(path, { bigint: true });
261
+ const digest = hash(await privateFile(path, 268_435_456));
262
+ const after = await lstat(path, { bigint: true });
263
+ if (stat.dev !== after.dev || stat.ino !== after.ino || stat.size !== after.size
264
+ || stat.mtimeNs !== after.mtimeNs || stat.ctimeNs !== after.ctimeNs)
265
+ fail('created file changed while recording cleanup ownership');
266
+ const previous = ownedFiles.find(file => file.path === path);
267
+ if (previous) {
268
+ if (!sameOwnedFile(stat, previous) || digest !== previous.digest)
269
+ fail('created file changed after cleanup ownership was recorded');
270
+ return;
271
+ }
272
+ ownedFiles.push({ path, dev: stat.dev, ino: stat.ino, size: stat.size,
273
+ mtimeNs: stat.mtimeNs, ctimeNs: stat.ctimeNs, digest });
274
+ };
275
+ const rememberSqliteSidecars = async () => {
276
+ for (const path of sqliteSidecars)
277
+ if (await exists(path))
278
+ await remember(path);
279
+ };
280
+ const directory = async (path) => {
281
+ if (roots.includes(path)) {
282
+ await io.directory(path);
283
+ return;
284
+ }
285
+ await directory(dirname(path));
286
+ try {
287
+ await mkdir(path, { mode: 0o700 });
288
+ const stat = await lstat(path);
289
+ ownedDirectories.push({ path, dev: stat.dev, ino: stat.ino });
290
+ }
291
+ catch (error) {
292
+ if (error.code !== 'EEXIST')
293
+ throw error;
294
+ }
295
+ await io.directory(path);
296
+ };
297
+ const write = async (path, bytes) => {
298
+ signal.throwIfAborted();
299
+ const descriptor = await open(path, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, 0o600);
300
+ try {
301
+ await descriptor.writeFile(bytes);
302
+ await descriptor.sync();
303
+ }
304
+ finally {
305
+ await descriptor.close();
306
+ await remember(path);
307
+ }
308
+ };
309
+ try {
310
+ for (const path of directories) {
311
+ signal.throwIfAborted();
312
+ await directory(path);
313
+ }
314
+ await write(observer.keyPath, randomBytes(32));
315
+ // Create the real schema. No empty-file stand-in is accepted as a ledger.
316
+ const store = new ControlPlaneStore({ path: ledgerPath });
317
+ try {
318
+ if (sourceMaintenance.length) {
319
+ const baseline = manifest.controlPlane.sourceJobs?.baseline;
320
+ if (!baseline)
321
+ fail('retained source maintenance requires the original baseline');
322
+ await store.importSourceMaintenanceRecords(sourceMaintenance, { trust: compiled.trust, baseline });
323
+ }
324
+ }
325
+ finally {
326
+ store.close();
327
+ await remember(ledgerPath);
328
+ await rememberSqliteSidecars();
329
+ }
330
+ for (const [path, bytes] of Object.entries(files))
331
+ await write(path, bytes);
332
+ const planDigest = hash(json({ files: expectedFiles, patches: await verify(rememberSqliteSidecars) }));
333
+ const receipt = { schemaVersion: 1, planDigest, files: expectedFiles,
334
+ observerKeyDigest: hash(await privateFile(observer.keyPath, 32)), result };
335
+ await write(receiptPath, json(receipt));
336
+ for (const path of [...directories].reverse())
337
+ await io.syncDirectory(path);
338
+ return result;
339
+ }
340
+ catch (error) {
341
+ // Only remove exact resources created by this invocation. A changed file or
342
+ // nonempty directory survives for reconciliation instead of being erased.
343
+ for (const file of ownedFiles.reverse()) {
344
+ try {
345
+ const stat = await lstat(file.path, { bigint: true });
346
+ if (sameOwnedFile(stat, file) && hash(await privateFile(file.path, 268_435_456)) === file.digest
347
+ && sameOwnedFile(await lstat(file.path, { bigint: true }), file))
348
+ await unlink(file.path);
349
+ }
350
+ catch { }
351
+ }
352
+ for (const entry of ownedDirectories.reverse()) {
353
+ try {
354
+ const stat = await lstat(entry.path);
355
+ if (stat.dev === entry.dev && stat.ino === entry.ino)
356
+ await rmdir(entry.path);
357
+ }
358
+ catch { }
359
+ }
360
+ throw error;
361
+ }
362
+ }
363
+ //# sourceMappingURL=rsi-bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsi-bootstrap.js","sourceRoot":"","sources":["../src/rsi-bootstrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import type { Config as ControlPlaneConfig } from '@dsh-enhanced/plugin-control-plane';
2
+ import { type RsiSourceWorkspace } from './rsi-source.js';
3
+ type SourceBuild = Extract<NonNullable<ControlPlaneConfig['sourceBuild']>, {
4
+ image: string;
5
+ }>;
6
+ export declare class RsiBuildUnavailableError extends Error {
7
+ readonly code = "rsi-build-unavailable";
8
+ constructor(message: string);
9
+ }
10
+ export interface RsiBuildEnvironment {
11
+ schemaVersion: 1;
12
+ sourceCommit: string;
13
+ sourceBuild: SourceBuild;
14
+ }
15
+ declare function directory(path: string, privateMode?: boolean): Promise<void>;
16
+ declare function readStable(path: string, maximum: number, privateMode?: boolean, allowRoot?: boolean): Promise<Buffer>;
17
+ declare function writeExclusive(path: string, bytes: string | Buffer): Promise<void>;
18
+ declare function syncDirectory(path: string): Promise<void>;
19
+ /** Drain a cancelled builder, giving its own finally block time to remove its context. */
20
+ declare function command(executable: string, args: readonly string[], environment: NodeJS.ProcessEnv, signal: AbortSignal, timeoutMs: number, outputLimit?: number): Promise<string>;
21
+ declare function isolatedEnvironment(home: string): NodeJS.ProcessEnv;
22
+ declare function hostPlatform(): 'linux/amd64' | 'darwin/amd64' | 'darwin/arm64';
23
+ declare function localSocket(path?: string): Promise<string>;
24
+ declare function dockerArgs(args: string[], scratch: string, socket?: string): string[];
25
+ export declare const rsiBuildResources: {
26
+ directory: typeof directory;
27
+ readStable: typeof readStable;
28
+ writeExclusive: typeof writeExclusive;
29
+ syncDirectory: typeof syncDirectory;
30
+ command: typeof command;
31
+ isolatedEnvironment: typeof isolatedEnvironment;
32
+ hostPlatform: typeof hostPlatform;
33
+ localSocket: typeof localSocket;
34
+ dockerArgs: typeof dockerArgs;
35
+ };
36
+ /** Read recorded build inputs without creating resources or running Docker.
37
+ * Image availability is checked separately by preparation/execution. */
38
+ export declare function readRsiBuildEnvironment(input: {
39
+ dshHome: string;
40
+ profile: string;
41
+ source: RsiSourceWorkspace;
42
+ signal?: AbortSignal;
43
+ }): Promise<RsiBuildEnvironment>;
44
+ /** Caller holds the DSH_HOME lifecycle lock; no profile or service is changed here. */
45
+ export declare function prepareRsiBuildEnvironment(input: {
46
+ dshHome: string;
47
+ profile: string;
48
+ source: RsiSourceWorkspace;
49
+ dockerPath?: string | undefined;
50
+ socketPath?: string | undefined;
51
+ signal?: AbortSignal;
52
+ }): Promise<RsiBuildEnvironment>;
53
+ export {};
54
+ //# sourceMappingURL=rsi-build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsi-build.d.ts","sourceRoot":"","sources":["../src/rsi-build.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,IAAI,kBAAkB,EAAE,MAAM,oCAAoC,CAAA;AACtF,OAAO,EAA0B,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAEjF,KAAK,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAa7F,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,QAAQ,CAAC,IAAI,2BAA0B;gBAC3B,OAAO,EAAE,MAAM;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,CAAC,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,WAAW,CAAA;CACzB;AA4BD,iBAAe,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAIxE;AACD,iBAAe,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,UAAQ,EAAE,SAAS,UAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAYhH;AACD,iBAAe,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjF;AACD,iBAAe,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGxD;AAED,0FAA0F;AAC1F,iBAAe,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,UAAU,EAChG,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,SAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAoDnF;AAED,iBAAS,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,UAAU,CAG5D;AAED,iBAAS,YAAY,IAAI,aAAa,GAAG,cAAc,GAAG,cAAc,CAKvE;AAED,iBAAe,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBzD;AAED,iBAAS,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAE9E;AAGD,eAAO,MAAM,iBAAiB;;;;;;;;;;CACW,CAAA;AAmJzC;wEACwE;AACxE,wBAAsB,uBAAuB,CAAC,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IACtF,MAAM,EAAE,kBAAkB,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAiBlF;AAED,uFAAuF;AACvF,wBAAsB,0BAA0B,CAAC,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAC;IACrH,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA6DxH"}