@dsh-enhanced/lark-channel 0.1.64 → 0.1.66

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 (155) hide show
  1. package/README.md +20 -6
  2. package/cordis.patch.yml +1 -0
  3. package/docs/operations.md +1 -1
  4. package/docs/progress-security.md +3 -0
  5. package/docs/rsi-setup.md +11 -7
  6. package/docs/setup.md +2 -1
  7. package/lib/adapter.d.ts +8 -0
  8. package/lib/adapter.d.ts.map +1 -1
  9. package/lib/adapter.js +34 -2
  10. package/lib/adapter.js.map +1 -1
  11. package/lib/config.d.ts +4 -0
  12. package/lib/config.d.ts.map +1 -1
  13. package/lib/config.js +52 -8
  14. package/lib/config.js.map +1 -1
  15. package/lib/index.d.ts +5 -0
  16. package/lib/index.d.ts.map +1 -1
  17. package/lib/index.js +24 -1
  18. package/lib/index.js.map +1 -1
  19. package/lib/progress.d.ts +11 -1
  20. package/lib/progress.d.ts.map +1 -1
  21. package/lib/progress.js +13 -1
  22. package/lib/progress.js.map +1 -1
  23. package/lib/rsi-authority-runtime.d.ts +1 -0
  24. package/lib/rsi-authority-runtime.d.ts.map +1 -1
  25. package/lib/rsi-authority-runtime.js +121 -18
  26. package/lib/rsi-authority-runtime.js.map +1 -1
  27. package/lib/rsi-bootstrap-manifest.d.ts +12 -5
  28. package/lib/rsi-bootstrap-manifest.d.ts.map +1 -1
  29. package/lib/rsi-bootstrap-manifest.js +63 -9
  30. package/lib/rsi-bootstrap-manifest.js.map +1 -1
  31. package/lib/rsi-bootstrap.js +3 -3
  32. package/lib/rsi-bootstrap.js.map +1 -1
  33. package/lib/rsi-build.d.ts +12 -0
  34. package/lib/rsi-build.d.ts.map +1 -1
  35. package/lib/rsi-build.js +55 -5
  36. package/lib/rsi-build.js.map +1 -1
  37. package/lib/rsi-creation-build.d.ts +3 -0
  38. package/lib/rsi-creation-build.d.ts.map +1 -1
  39. package/lib/rsi-creation-build.js +45 -0
  40. package/lib/rsi-creation-build.js.map +1 -1
  41. package/lib/rsi-host-update.d.ts +51 -0
  42. package/lib/rsi-host-update.d.ts.map +1 -1
  43. package/lib/rsi-host-update.js +61 -1
  44. package/lib/rsi-host-update.js.map +1 -1
  45. package/lib/rsi-install.d.ts +10 -3
  46. package/lib/rsi-install.d.ts.map +1 -1
  47. package/lib/rsi-install.js +65 -15
  48. package/lib/rsi-install.js.map +1 -1
  49. package/lib/rsi-linux-cgroup-roots.d.ts +3 -0
  50. package/lib/rsi-linux-cgroup-roots.d.ts.map +1 -0
  51. package/lib/rsi-linux-cgroup-roots.js +3 -0
  52. package/lib/rsi-linux-cgroup-roots.js.map +1 -0
  53. package/lib/rsi-linux-creation-build.d.ts +36 -0
  54. package/lib/rsi-linux-creation-build.d.ts.map +1 -0
  55. package/lib/rsi-linux-creation-build.js +213 -0
  56. package/lib/rsi-linux-creation-build.js.map +1 -0
  57. package/lib/rsi-linux-native-materialize.d.ts +31 -0
  58. package/lib/rsi-linux-native-materialize.d.ts.map +1 -0
  59. package/lib/rsi-linux-native-materialize.js +162 -0
  60. package/lib/rsi-linux-native-materialize.js.map +1 -0
  61. package/lib/rsi-linux-native-relocation.d.ts +120 -0
  62. package/lib/rsi-linux-native-relocation.d.ts.map +1 -0
  63. package/lib/rsi-linux-native-relocation.js +1555 -0
  64. package/lib/rsi-linux-native-relocation.js.map +1 -0
  65. package/lib/rsi-linux-native-resources.d.ts +97 -0
  66. package/lib/rsi-linux-native-resources.d.ts.map +1 -0
  67. package/lib/rsi-linux-native-resources.js +521 -0
  68. package/lib/rsi-linux-native-resources.js.map +1 -0
  69. package/lib/rsi-linux-repository-bootstrap.d.ts +17 -0
  70. package/lib/rsi-linux-repository-bootstrap.d.ts.map +1 -0
  71. package/lib/rsi-linux-repository-bootstrap.js +317 -0
  72. package/lib/rsi-linux-repository-bootstrap.js.map +1 -0
  73. package/lib/rsi-linux-runner-states.d.ts +20 -0
  74. package/lib/rsi-linux-runner-states.d.ts.map +1 -0
  75. package/lib/rsi-linux-runner-states.js +70 -0
  76. package/lib/rsi-linux-runner-states.js.map +1 -0
  77. package/lib/rsi-linux-runtime-bootstrap.d.ts +10 -0
  78. package/lib/rsi-linux-runtime-bootstrap.d.ts.map +1 -0
  79. package/lib/rsi-linux-runtime-bootstrap.js +38 -0
  80. package/lib/rsi-linux-runtime-bootstrap.js.map +1 -0
  81. package/lib/rsi-linux-source-build.d.ts +28 -0
  82. package/lib/rsi-linux-source-build.d.ts.map +1 -0
  83. package/lib/rsi-linux-source-build.js +43 -0
  84. package/lib/rsi-linux-source-build.js.map +1 -0
  85. package/lib/rsi-local-install.d.ts +2 -0
  86. package/lib/rsi-local-install.d.ts.map +1 -1
  87. package/lib/rsi-local-install.js +42 -1
  88. package/lib/rsi-local-install.js.map +1 -1
  89. package/lib/rsi-local-pair-install.d.ts +15 -0
  90. package/lib/rsi-local-pair-install.d.ts.map +1 -1
  91. package/lib/rsi-local-pair-install.js +21 -6
  92. package/lib/rsi-local-pair-install.js.map +1 -1
  93. package/lib/rsi-local-resources.d.ts +2 -2
  94. package/lib/rsi-local-resources.d.ts.map +1 -1
  95. package/lib/rsi-local-resources.js +5 -0
  96. package/lib/rsi-local-resources.js.map +1 -1
  97. package/lib/rsi-local-update-build.d.ts +25 -6
  98. package/lib/rsi-local-update-build.d.ts.map +1 -1
  99. package/lib/rsi-local-update-build.js +46 -7
  100. package/lib/rsi-local-update-build.js.map +1 -1
  101. package/lib/rsi-local-update.d.ts +5 -2
  102. package/lib/rsi-local-update.d.ts.map +1 -1
  103. package/lib/rsi-local-update.js +6 -5
  104. package/lib/rsi-local-update.js.map +1 -1
  105. package/lib/rsi-plugin-creation.d.ts +16 -1
  106. package/lib/rsi-plugin-creation.d.ts.map +1 -1
  107. package/lib/rsi-plugin-creation.js +60 -14
  108. package/lib/rsi-plugin-creation.js.map +1 -1
  109. package/lib/rsi-plugin-revision.d.ts +35 -0
  110. package/lib/rsi-plugin-revision.d.ts.map +1 -0
  111. package/lib/rsi-plugin-revision.js +200 -0
  112. package/lib/rsi-plugin-revision.js.map +1 -0
  113. package/lib/rsi-profile.d.ts +8 -0
  114. package/lib/rsi-profile.d.ts.map +1 -1
  115. package/lib/rsi-profile.js +55 -2
  116. package/lib/rsi-profile.js.map +1 -1
  117. package/lib/rsi-release-build.d.ts +24 -8
  118. package/lib/rsi-release-build.d.ts.map +1 -1
  119. package/lib/rsi-release-build.js +89 -37
  120. package/lib/rsi-release-build.js.map +1 -1
  121. package/lib/rsi-scanner-retirement-config.d.ts +34 -0
  122. package/lib/rsi-scanner-retirement-config.d.ts.map +1 -0
  123. package/lib/rsi-scanner-retirement-config.js +272 -0
  124. package/lib/rsi-scanner-retirement-config.js.map +1 -0
  125. package/lib/rsi-scanner-retirement-runtime.d.ts +23 -0
  126. package/lib/rsi-scanner-retirement-runtime.d.ts.map +1 -0
  127. package/lib/rsi-scanner-retirement-runtime.js +98 -0
  128. package/lib/rsi-scanner-retirement-runtime.js.map +1 -0
  129. package/lib/rsi-scanner-retirement-stage.d.ts +55 -0
  130. package/lib/rsi-scanner-retirement-stage.d.ts.map +1 -0
  131. package/lib/rsi-scanner-retirement-stage.js +183 -0
  132. package/lib/rsi-scanner-retirement-stage.js.map +1 -0
  133. package/lib/rsi-scanner-retirement-transition.d.ts +57 -0
  134. package/lib/rsi-scanner-retirement-transition.d.ts.map +1 -0
  135. package/lib/rsi-scanner-retirement-transition.js +320 -0
  136. package/lib/rsi-scanner-retirement-transition.js.map +1 -0
  137. package/lib/rsi-setup.d.ts +20 -0
  138. package/lib/rsi-setup.d.ts.map +1 -1
  139. package/lib/rsi-setup.js +102 -5
  140. package/lib/rsi-setup.js.map +1 -1
  141. package/lib/rsi-source-maintenance.d.ts +9 -1
  142. package/lib/rsi-source-maintenance.d.ts.map +1 -1
  143. package/lib/rsi-source-maintenance.js +64 -5
  144. package/lib/rsi-source-maintenance.js.map +1 -1
  145. package/lib/rsi-source-update.js +2 -2
  146. package/lib/rsi-source-update.js.map +1 -1
  147. package/lib/service.d.ts.map +1 -1
  148. package/lib/service.js +1 -0
  149. package/lib/service.js.map +1 -1
  150. package/lib/setup-profile.d.ts.map +1 -1
  151. package/lib/setup-profile.js +1 -0
  152. package/lib/setup-profile.js.map +1 -1
  153. package/lib/version.d.ts +1 -1
  154. package/lib/version.js +1 -1
  155. package/package.json +21 -21
@@ -0,0 +1,213 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { chmod, lstat, mkdir, mkdtemp, readdir, rm, stat } from 'node:fs/promises';
3
+ import { createRequire } from 'node:module';
4
+ import { isAbsolute, join, resolve } from 'node:path';
5
+ import { isDeepStrictEqual } from 'node:util';
6
+ import { linuxRuntimeDigest } from '@dsh-enhanced/assistant-isolation';
7
+ import { rsiBuildResources as io } from './rsi-build.js';
8
+ import { discoverLinuxCgroupRoots, RsiLinuxCgroupUnavailableError } from './rsi-linux-cgroup-roots.js';
9
+ import { prepareLinuxRsiRepositoryRuntime, readLinuxRsiRepositoryRuntime } from './rsi-linux-repository-bootstrap.js';
10
+ import { LinuxRsiRuntimeUnavailableError } from './rsi-linux-runtime-bootstrap.js';
11
+ /** Missing host prerequisites (cgroup delegation, user-namespace subordinate
12
+ * allocations, the C compiler, the fixed runtime) stop installation as
13
+ * not-ready. Integrity and identity failures stay hard Error failures. */
14
+ export class RsiLinuxCreationBuildUnavailableError extends Error {
15
+ code = 'rsi-linux-creation-build-unavailable';
16
+ constructor(message) { super(`rsi Linux creation build unavailable: ${message}`); }
17
+ }
18
+ const PROFILE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/u;
19
+ const COMMIT = /^[a-f0-9]{40}$/u;
20
+ const PEER_SPECIFIER = '@dsh-enhanced/assistant-verifier/linux-behavior-runtime';
21
+ const SUBORDINATE_PATTERN = /^subordinate \S+ allocation is unavailable$/u;
22
+ // Sorted exact receipt content (everything except receiptDigest itself).
23
+ const CONTENT_KEYS = ['backend', 'behavior', 'behaviorDigest', 'buildRuntimeDigest', 'cgroupRoots', 'dshHome',
24
+ 'lockSha256', 'preparationDigest', 'profile', 'repositoryRuntimeDigest', 'schemaVersion', 'sourceCommit',
25
+ 'systemSnapshotDigest', 'userNamespaceDigest'].sort();
26
+ const sha = (value) => createHash('sha256').update(value).digest('hex');
27
+ const digest = (value) => sha(JSON.stringify(value));
28
+ const canonical = (value) => isAbsolute(value) && resolve(value) === value && !value.includes('\0');
29
+ function fail(message) { throw new Error(`rsi Linux creation build: ${message}`); }
30
+ async function exists(path) {
31
+ try {
32
+ await lstat(path);
33
+ return true;
34
+ }
35
+ catch (error) {
36
+ if (error.code === 'ENOENT')
37
+ return false;
38
+ throw error;
39
+ }
40
+ }
41
+ const requirePeer = createRequire(import.meta.url);
42
+ /** The verifier behavior runtime is an optional peer loaded only when Linux
43
+ * native creation is actually prepared; a missing peer is a fatal opt-in gap,
44
+ * not an environment not-ready condition. */
45
+ function behaviorPeer() {
46
+ try {
47
+ requirePeer.resolve(PEER_SPECIFIER);
48
+ }
49
+ catch (error) {
50
+ if (error.code === 'MODULE_NOT_FOUND'
51
+ || error.code === 'ERR_MODULE_NOT_FOUND') {
52
+ fail(`opted-in Linux plugin creation requires installed peer ${PEER_SPECIFIER}`);
53
+ }
54
+ throw error;
55
+ }
56
+ const peer = requirePeer(PEER_SPECIFIER);
57
+ if (typeof peer.prepareLinuxPluginBehaviorRuntime !== 'function'
58
+ || typeof peer.readLinuxPluginBehaviorDeploymentPreparation !== 'function'
59
+ || typeof peer.linuxPluginBehaviorRuntimeDigest !== 'function') {
60
+ fail('installed Linux behavior runtime peer is unavailable; update the assistant-verifier peer');
61
+ }
62
+ return peer;
63
+ }
64
+ /** Map missing host prerequisites to the not-ready error. Abort reasons,
65
+ * cgroup/runtime unavailable errors and integrity failures pass through. */
66
+ async function environmentGap(label, signal, operation) {
67
+ try {
68
+ return await operation();
69
+ }
70
+ catch (error) {
71
+ if (error instanceof RsiLinuxCgroupUnavailableError || error instanceof LinuxRsiRuntimeUnavailableError)
72
+ throw error;
73
+ if (signal.aborted)
74
+ throw error;
75
+ const code = error.code;
76
+ const message = error.message ?? '';
77
+ if (code === 'ENOENT' || SUBORDINATE_PATTERN.test(message)) {
78
+ throw new RsiLinuxCreationBuildUnavailableError(`${label}: ${message}`);
79
+ }
80
+ throw error;
81
+ }
82
+ }
83
+ function project(receipt) {
84
+ return { schemaVersion: 3, backend: 'linux-native', sourceCommit: receipt.sourceCommit,
85
+ behavior: receipt.behavior, cgroupRoots: receipt.cgroupRoots, buildRuntimeDigest: receipt.buildRuntimeDigest };
86
+ }
87
+ async function validateIdentity(input) {
88
+ input.signal?.throwIfAborted();
89
+ if (!canonical(input.dshHome) || !PROFILE.test(input.profile) || !canonical(input.stateRoot)
90
+ || input.stateRoot === '/' || input.source.schemaVersion !== 1
91
+ || !COMMIT.test(input.source.sourceCommit))
92
+ fail('invalid creation bootstrap identity');
93
+ await io.directory(input.dshHome);
94
+ await io.directory(input.stateRoot);
95
+ }
96
+ async function replayExisting(input, final, repository, cgroupRoots, peer, signal) {
97
+ await io.directory(final);
98
+ if (!isDeepStrictEqual(await readdir(final), ['bootstrap.json']))
99
+ fail('behavior workspace incomplete or unexpected');
100
+ const receipt = JSON.parse((await io.readStable(join(final, 'bootstrap.json'), 65_536, true)).toString('utf8'));
101
+ const { receiptDigest, ...content } = receipt;
102
+ if (Object.keys(content).sort().join() !== CONTENT_KEYS.join()
103
+ || digest(content) !== receiptDigest || receipt.schemaVersion !== 3 || receipt.backend !== 'linux-native'
104
+ || receipt.dshHome !== input.dshHome || receipt.profile !== input.profile
105
+ || receipt.sourceCommit !== input.source.sourceCommit || receipt.lockSha256 !== repository.lockSha256
106
+ || !isDeepStrictEqual(receipt.cgroupRoots, cgroupRoots))
107
+ fail('Linux creation receipt differs');
108
+ const runtimeDigest = linuxRuntimeDigest(repository.runtime);
109
+ // The deployment reopen binds the retained observer even when the build-time
110
+ // base receipt is later retired; it never invokes the compiler or Docker.
111
+ const deployment = await environmentGap('reopen Linux behavior preparation', signal, () => peer.readLinuxPluginBehaviorDeploymentPreparation({ runtime: receipt.behavior, signal }));
112
+ if (receipt.repositoryRuntimeDigest !== runtimeDigest
113
+ || receipt.systemSnapshotDigest !== digest(repository.systemSnapshot)
114
+ || receipt.userNamespaceDigest !== digest(repository.userNamespace)
115
+ || receipt.buildRuntimeDigest !== deployment.baseRuntimeDigest
116
+ || receipt.buildRuntimeDigest !== runtimeDigest
117
+ || receipt.preparationDigest !== deployment.preparationDigest
118
+ || !isDeepStrictEqual(receipt.behavior, deployment.descriptor)
119
+ || receipt.behaviorDigest !== peer.linuxPluginBehaviorRuntimeDigest(deployment.descriptor)) {
120
+ fail('Linux creation receipt differs from the prepared repository or behavior runtime');
121
+ }
122
+ signal.throwIfAborted();
123
+ return project(receipt);
124
+ }
125
+ /** Caller holds the DSH_HOME lifecycle lock. Prepare or replay the immutable
126
+ * Linux native behavior runtime used for creation review and adoption. */
127
+ export async function prepareLinuxRsiCreationBuildEnvironment(input) {
128
+ await validateIdentity(input);
129
+ const peer = behaviorPeer();
130
+ const behaviorRoot = join(input.stateRoot, 'linux-creation-behavior');
131
+ const parent = join(input.dshHome, 'rsi-linux-creation-builds');
132
+ try {
133
+ await mkdir(parent, { mode: 0o700 });
134
+ }
135
+ catch (error) {
136
+ if (error.code !== 'EEXIST')
137
+ throw error;
138
+ }
139
+ await io.directory(parent);
140
+ const final = join(parent, input.profile);
141
+ const signal = AbortSignal.any([input.signal ?? new AbortController().signal, AbortSignal.timeout(2_400_000)]);
142
+ const stage = await mkdtemp(join(parent, `.${input.profile}-stage-`));
143
+ await chmod(stage, 0o700);
144
+ let claimed;
145
+ try {
146
+ // schema4: fresh readable clone of the schema3 base, npm layout, system
147
+ // snapshot and subordinate user-namespace mapping.
148
+ const repository = await environmentGap('prepare Linux repository runtime', signal, () => prepareLinuxRsiRepositoryRuntime({
149
+ dshHome: input.dshHome, profile: input.profile, source: input.source, signal,
150
+ ...(input.nodeArchivePath ? { nodeArchivePath: input.nodeArchivePath } : {}),
151
+ ...(input.pnpmArchivePath ? { pnpmArchivePath: input.pnpmArchivePath } : {}),
152
+ ...(input.pnpmExeArchivePath ? { pnpmExeArchivePath: input.pnpmExeArchivePath } : {}),
153
+ ...(input.pnpmNativeArchivePath ? { pnpmNativeArchivePath: input.pnpmNativeArchivePath } : {}),
154
+ }));
155
+ const cgroupRoots = await discoverLinuxCgroupRoots({ signal });
156
+ if (await exists(final))
157
+ return await replayExisting(input, final, repository, cgroupRoots, peer, signal);
158
+ // The single shared observer runtime; its sibling lock and rollback live
159
+ // in the verifier peer. A missing /usr/bin/cc is a not-ready host gap.
160
+ const descriptor = await environmentGap('compile Linux behavior runtime', signal, () => peer.prepareLinuxPluginBehaviorRuntime({ runtime: repository.runtime, root: behaviorRoot, signal }));
161
+ const deployment = await peer.readLinuxPluginBehaviorDeploymentPreparation({ runtime: descriptor, signal });
162
+ const runtimeDigest = linuxRuntimeDigest(repository.runtime);
163
+ if (!isDeepStrictEqual(deployment.descriptor, descriptor)
164
+ || deployment.baseRuntimeDigest !== runtimeDigest)
165
+ fail('behavior preparation is not bound to the repository runtime');
166
+ signal.throwIfAborted();
167
+ const content = {
168
+ schemaVersion: 3, backend: 'linux-native', sourceCommit: input.source.sourceCommit,
169
+ behavior: descriptor, cgroupRoots, dshHome: input.dshHome, profile: input.profile,
170
+ lockSha256: repository.lockSha256, buildRuntimeDigest: deployment.baseRuntimeDigest,
171
+ preparationDigest: deployment.preparationDigest,
172
+ behaviorDigest: peer.linuxPluginBehaviorRuntimeDigest(descriptor),
173
+ repositoryRuntimeDigest: runtimeDigest, systemSnapshotDigest: digest(repository.systemSnapshot),
174
+ userNamespaceDigest: digest(repository.userNamespace),
175
+ };
176
+ await mkdir(final, { mode: 0o700 });
177
+ const identity = await stat(final);
178
+ claimed = { dev: identity.dev, ino: identity.ino };
179
+ await io.writeExclusive(join(final, 'bootstrap.json'), Buffer.from(JSON.stringify({ ...content, receiptDigest: digest(content) })));
180
+ await io.syncDirectory(final);
181
+ await io.syncDirectory(parent);
182
+ return project({ ...content, receiptDigest: digest(content) });
183
+ }
184
+ catch (error) {
185
+ if (claimed) {
186
+ const current = await lstat(final).catch(() => undefined);
187
+ if (current?.isDirectory() && current.dev === claimed.dev && current.ino === claimed.ino
188
+ && (await readdir(final)).every(name => name === 'bootstrap.json'))
189
+ await rm(final, { recursive: true, force: true });
190
+ }
191
+ throw error;
192
+ }
193
+ finally {
194
+ await rm(stage, { recursive: true, force: true });
195
+ await io.syncDirectory(parent);
196
+ }
197
+ }
198
+ /** Verify an existing Linux creation family without preparing missing inputs.
199
+ * Fixed runtime integrity probes, read-only cgroup discovery and retained
200
+ * observer verification remain part of reopening the recorded receipts. */
201
+ export async function readLinuxRsiCreationBuildEnvironment(input) {
202
+ await validateIdentity(input);
203
+ const peer = behaviorPeer();
204
+ const parent = join(input.dshHome, 'rsi-linux-creation-builds'), final = join(parent, input.profile);
205
+ const signal = input.signal ?? new AbortController().signal;
206
+ await io.directory(parent);
207
+ const repository = await readLinuxRsiRepositoryRuntime({
208
+ dshHome: input.dshHome, profile: input.profile, source: input.source, signal,
209
+ });
210
+ const cgroupRoots = await discoverLinuxCgroupRoots({ signal });
211
+ return await replayExisting(input, final, repository, cgroupRoots, peer, signal);
212
+ }
213
+ //# sourceMappingURL=rsi-linux-creation-build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsi-linux-creation-build.js","sourceRoot":"","sources":["../src/rsi-linux-creation-build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { RsiLinuxSourceBuildPreparation } from './rsi-linux-source-build.js';
2
+ import { type LinuxRsiNativeRelocatedFamily, type LinuxRsiNativeRelocationProof } from './rsi-linux-native-relocation.js';
3
+ export interface LinuxRsiNativeMaterializeInput {
4
+ /** Home holding the freshly prepared candidate families. */
5
+ candidateHome: string;
6
+ /** Private staged Home that will be renamed onto `logicalHome` later. */
7
+ stagePhysicalHome: string;
8
+ /** Absolute path the staged Home will occupy after the cutover. */
9
+ logicalHome: string;
10
+ /** Set when that path is already occupied by the live Home being cut over
11
+ * in place (the Docker -> Linux-native staging case). It must equal
12
+ * `logicalHome`; the relocation then stages beside the live Home instead of
13
+ * refusing an occupied logical Home. Replay ignores it. */
14
+ existingLogicalHome?: string;
15
+ profile: string;
16
+ /** Sealed proof from an earlier run over the same Homes, when replaying. */
17
+ relocation?: LinuxRsiNativeRelocationProof;
18
+ signal?: AbortSignal;
19
+ }
20
+ export interface LinuxRsiNativeMaterializeOutput {
21
+ relocation: LinuxRsiNativeRelocationProof;
22
+ family: LinuxRsiNativeRelocatedFamily;
23
+ sourceBuild: RsiLinuxSourceBuildPreparation;
24
+ /** Digest of the candidate Home's creation receipt, for equality with the
25
+ * digest the owner-program preparation recorded. */
26
+ candidateReceiptSha256: string;
27
+ /** Digest of the staged creation receipt, recorded in the transaction. */
28
+ receiptSha256: string;
29
+ }
30
+ export declare function materializeLinuxRsiNativeInStage(input: LinuxRsiNativeMaterializeInput): Promise<LinuxRsiNativeMaterializeOutput>;
31
+ //# sourceMappingURL=rsi-linux-native-materialize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsi-linux-native-materialize.d.ts","sourceRoot":"","sources":["../src/rsi-linux-native-materialize.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAA;AACjF,OAAO,EAEL,KAAK,6BAA6B,EAAE,KAAK,6BAA6B,EACvE,MAAM,kCAAkC,CAAA;AAmHzC,MAAM,WAAW,8BAA8B;IAC7C,4DAA4D;IAC5D,aAAa,EAAE,MAAM,CAAA;IACrB,yEAAyE;IACzE,iBAAiB,EAAE,MAAM,CAAA;IACzB,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAA;IACnB;;;+DAG2D;IAC3D,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,4EAA4E;IAC5E,UAAU,CAAC,EAAE,6BAA6B,CAAA;IAC1C,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,MAAM,WAAW,+BAA+B;IAC9C,UAAU,EAAE,6BAA6B,CAAA;IACzC,MAAM,EAAE,6BAA6B,CAAA;IACrC,WAAW,EAAE,8BAA8B,CAAA;IAC3C;wDACoD;IACpD,sBAAsB,EAAE,MAAM,CAAA;IAC9B,0EAA0E;IAC1E,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,wBAAsB,gCAAgC,CACpD,KAAK,EAAE,8BAA8B,GAAG,OAAO,CAAC,+BAA+B,CAAC,CA8BjF"}
@@ -0,0 +1,162 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { constants } from 'node:fs';
3
+ import { lstat, open } from 'node:fs/promises';
4
+ import { isAbsolute, join, resolve } from 'node:path';
5
+ import { openLinuxRsiNativeRelocatedFamily, relocateLinuxRsiNativeFamily, } from './rsi-linux-native-relocation.js';
6
+ /** Compose the relocation primitive into the stage seam the owner-program
7
+ * transaction needs: move the five Linux-native families from a candidate Home
8
+ * into the staged Home, then hand back the typed build environments, the
9
+ * prepared source build and the creation-receipt digests the caller compares
10
+ * against the candidate preparation.
11
+ *
12
+ * This runs strictly before the rename(2) cutover, so it never calls the stock
13
+ * readers (`readLinuxRsiRuntime`, `readLinuxRsiRepositoryRuntime`,
14
+ * `readLinuxRsiCreationBuildEnvironment`, `readRsiReleaseBuildEnvironment`):
15
+ * they probe the host or the logical Home and only accept a Home at its final
16
+ * path. The relocation proof itself is the pre-cutover acceptance gate; the
17
+ * stock readers remain the post-cutover acceptance test.
18
+ *
19
+ * The seam is replayable. A caller that already relocated this pair of Homes in
20
+ * an earlier process passes the sealed proof back in; the proof is re-verified
21
+ * against the staged Home instead of relocating a second time (a second
22
+ * relocation would fail on the existing destinations).
23
+ *
24
+ * When the caller is staging an in-place cutover, the logical Home is the live
25
+ * Home and already exists; `existingLogicalHome` attests that fact so the
26
+ * relocation stages beside it instead of refusing an occupied Home. The staged
27
+ * receipts still record the logical Home and the sealed proof is unchanged.
28
+ *
29
+ * It never cleans up. On any failure — including a crash or abort after the
30
+ * first copy — the staged Home holds an unsealed partial relocation and the
31
+ * sealed proof is gone, so a retry without that proof fails closed on the
32
+ * occupied destinations. The caller owns `stagePhysicalHome` as a disposable
33
+ * directory and must delete and recreate it before retrying. */
34
+ const PROFILE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/u;
35
+ const COMMIT = /^[a-f0-9]{40}$/u;
36
+ const MAX_RECEIPT_BYTES = 4 * 1024 * 1024;
37
+ const stamp = (info) => JSON.stringify([info.dev, info.ino, info.uid, info.mode, info.size,
38
+ info.mtimeMs, info.ctimeMs]);
39
+ function fail(message) { throw new Error(`rsi Linux native materialize: ${message}`); }
40
+ function sha256(bytes) { return createHash('sha256').update(bytes).digest('hex'); }
41
+ function canonicalHome(value, name) {
42
+ if (typeof value !== 'string' || !isAbsolute(value) || value !== resolve(value) || value === '/'
43
+ || [...value].some(character => character.charCodeAt(0) < 32))
44
+ fail(`invalid ${name}`);
45
+ return value;
46
+ }
47
+ function overlap(first, second) {
48
+ return first === second || first.startsWith(`${second}/`) || second.startsWith(`${first}/`);
49
+ }
50
+ function identity(input) {
51
+ const candidateHome = canonicalHome(input.candidateHome, 'candidate Home');
52
+ const stagePhysicalHome = canonicalHome(input.stagePhysicalHome, 'staged Home');
53
+ const logicalHome = canonicalHome(input.logicalHome, 'logical Home');
54
+ if (input.existingLogicalHome !== undefined) {
55
+ canonicalHome(input.existingLogicalHome, 'existing logical Home');
56
+ if (input.existingLogicalHome !== logicalHome)
57
+ fail('existing logical Home is not this logical Home');
58
+ }
59
+ if (typeof input.profile !== 'string' || !PROFILE.test(input.profile))
60
+ fail('invalid profile');
61
+ if (overlap(candidateHome, stagePhysicalHome) || overlap(candidateHome, logicalHome)
62
+ || overlap(stagePhysicalHome, logicalHome))
63
+ fail('candidate, staged and logical Homes must be disjoint');
64
+ }
65
+ /** Read one receipt exactly once, requiring the same owner-private, single-link,
66
+ * no-symlink shape the stock readers accept. Hashing and parsing the same buffer
67
+ * keeps the recorded digest bound to the parsed program identity. */
68
+ async function readReceipt(path) {
69
+ let info;
70
+ try {
71
+ info = await lstat(path);
72
+ }
73
+ catch (error) {
74
+ if (error.code === 'ENOENT')
75
+ fail(`missing creation receipt: ${path}`);
76
+ throw error;
77
+ }
78
+ if (!info.isFile() || info.isSymbolicLink() || info.nlink !== 1 || info.size > MAX_RECEIPT_BYTES
79
+ || info.uid !== process.getuid?.() || info.mode & 0o077 || info.size === 0) {
80
+ fail(`unsafe creation receipt: ${path}`);
81
+ }
82
+ const fd = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
83
+ try {
84
+ if (stamp(await fd.stat()) !== stamp(info))
85
+ fail(`creation receipt changed: ${path}`);
86
+ const bytes = await fd.readFile();
87
+ if (bytes.byteLength !== info.size || stamp(await fd.stat()) !== stamp(info)
88
+ || stamp(await lstat(path)) !== stamp(info))
89
+ fail(`creation receipt changed: ${path}`);
90
+ return { path, bytes, sha256: sha256(bytes) };
91
+ }
92
+ finally {
93
+ await fd.close();
94
+ }
95
+ }
96
+ async function receiptSha256(path) { return (await readReceipt(path)).sha256; }
97
+ /** The candidate receipt names the program being staged; reject a mismatch
98
+ * before spending minutes on the relocation copy. */
99
+ function candidateReceipt(bytes, path, home, profile) {
100
+ let parsed;
101
+ try {
102
+ parsed = JSON.parse(Buffer.from(bytes).toString('utf8'));
103
+ }
104
+ catch {
105
+ fail(`invalid creation receipt: ${path}`);
106
+ }
107
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed))
108
+ fail(`invalid creation receipt: ${path}`);
109
+ const receipt = parsed;
110
+ if (receipt.schemaVersion !== 3 || receipt.backend !== 'linux-native'
111
+ || receipt.dshHome !== home || receipt.profile !== profile)
112
+ fail(`candidate creation receipt differs: ${path}`);
113
+ }
114
+ async function readCandidateReceipt(home, profile) {
115
+ const path = join(home, 'rsi-linux-creation-builds', profile, 'bootstrap.json');
116
+ const receipt = await readReceipt(path);
117
+ candidateReceipt(receipt.bytes, path, home, profile);
118
+ const record = JSON.parse(Buffer.from(receipt.bytes).toString('utf8'));
119
+ if (typeof record.sourceCommit !== 'string' || !COMMIT.test(record.sourceCommit)) {
120
+ fail(`candidate creation receipt lacks a source commit: ${path}`);
121
+ }
122
+ return { path, sha256: receipt.sha256, sourceCommit: record.sourceCommit };
123
+ }
124
+ export async function materializeLinuxRsiNativeInStage(input) {
125
+ identity(input);
126
+ input.signal?.throwIfAborted();
127
+ const { candidateHome, stagePhysicalHome, logicalHome, profile } = input;
128
+ const candidate = await readCandidateReceipt(candidateHome, profile);
129
+ input.signal?.throwIfAborted();
130
+ let relocation = input.relocation;
131
+ if (relocation === undefined) {
132
+ relocation = await relocateLinuxRsiNativeFamily({ sourceHome: candidateHome, physicalHome: stagePhysicalHome,
133
+ logicalHome, profile, ...(input.existingLogicalHome === undefined
134
+ ? {} : { existingLogicalHome: input.existingLogicalHome }),
135
+ ...(input.signal === undefined ? {} : { signal: input.signal }) });
136
+ }
137
+ else {
138
+ proofIdentity(relocation, input);
139
+ }
140
+ const family = await openLinuxRsiNativeRelocatedFamily(relocation);
141
+ input.signal?.throwIfAborted();
142
+ if (family.runtime.sourceCommit !== candidate.sourceCommit)
143
+ fail('staged program differs from candidate');
144
+ const receipt = await receiptSha256(join(stagePhysicalHome, 'rsi-linux-creation-builds', profile, 'bootstrap.json'));
145
+ return {
146
+ relocation,
147
+ family,
148
+ sourceBuild: { backend: 'linux-native', repository: family.repository, cgroupRoots: family.creationBuild.cgroupRoots },
149
+ candidateReceiptSha256: candidate.sha256,
150
+ receiptSha256: receipt,
151
+ };
152
+ }
153
+ function proofIdentity(proof, input) {
154
+ const record = proof;
155
+ if (record.schemaVersion !== 1 || record.backend !== 'linux-native')
156
+ fail('invalid replay relocation proof');
157
+ if (record.sourceHome !== input.candidateHome || record.physicalHome !== input.stagePhysicalHome
158
+ || record.logicalHome !== input.logicalHome || record.profile !== input.profile) {
159
+ fail('replay relocation proof does not describe this Home pair');
160
+ }
161
+ }
162
+ //# sourceMappingURL=rsi-linux-native-materialize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsi-linux-native-materialize.js","sourceRoot":"","sources":["../src/rsi-linux-native-materialize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ import type { LinuxPluginBehaviorRuntime } from '@dsh-enhanced/assistant-verifier/linux-behavior-runtime';
2
+ import type { LinuxRsiCreationBuildEnvironment } from './rsi-linux-creation-build.js';
3
+ import type { LinuxRsiRepositoryBuildEnvironment } from './rsi-linux-repository-bootstrap.js';
4
+ import type { LinuxRsiBuildEnvironment } from './rsi-linux-runtime-bootstrap.js';
5
+ import type { NativeRsiReleaseBuildEnvironment } from './rsi-release-build.js';
6
+ /** Receipt-relocation primitive for moving one prepared Linux-native DSH Home
7
+ * from a Docker volume onto a native filesystem without re-preparing it.
8
+ * Source receipts are authenticated before any byte is copied; the copied
9
+ * trees and the rewritten receipts are bound together in a sealed proof whose
10
+ * logical paths survive the later same-filesystem rename(2). */
11
+ export interface LinuxRsiNativeRelocationInput {
12
+ sourceHome: string;
13
+ physicalHome: string;
14
+ logicalHome: string;
15
+ profile: string;
16
+ /** Attests that `logicalHome` is the live Home already occupying its final
17
+ * path (the in-place Docker -> Linux-native cutover case). It must be the
18
+ * exact `logicalHome` value and resolve to itself; it then substitutes for
19
+ * the "logical Home already exists" refusal instead of weakening any other
20
+ * check, and the relocated receipts still record the logical Home. */
21
+ existingLogicalHome?: string;
22
+ signal?: AbortSignal;
23
+ }
24
+ export interface LinuxRsiNativeRelocationElement {
25
+ name: 'runtime' | 'repository-runtime' | 'system' | 'behavior-runtime' | 'release-toolchain' | 'release-store' | 'release-cache';
26
+ logicalPath: string;
27
+ physicalPath: string;
28
+ dev: number;
29
+ ino: number;
30
+ sha256: string;
31
+ entries: number;
32
+ bytes: number;
33
+ }
34
+ export interface LinuxRsiNativeRelocationProof {
35
+ schemaVersion: 1;
36
+ backend: 'linux-native';
37
+ profile: string;
38
+ sourceHome: string;
39
+ physicalHome: string;
40
+ logicalHome: string;
41
+ behaviorRootRelative: string;
42
+ elements: LinuxRsiNativeRelocationElement[];
43
+ digests: {
44
+ runtime: string;
45
+ repository: string;
46
+ behavior: string;
47
+ creation: string;
48
+ release: string;
49
+ relocation: string;
50
+ };
51
+ }
52
+ /** Relocate one prepared Linux-native DSH Home onto a fresh physical Home.
53
+ * The source is authenticated before copying and never modified. An
54
+ * `existingLogicalHome` attestation only replaces the "logical Home already
55
+ * exists" refusal; every other check and the proof shape stay the same. */
56
+ export declare function relocateLinuxRsiNativeFamily(input: LinuxRsiNativeRelocationInput): Promise<LinuxRsiNativeRelocationProof>;
57
+ /** Re-derive a relocation proof from its physical Home without ever reading the
58
+ * logical Home; the proof must still describe a byte-identical, un-opened copy. */
59
+ export declare function verifyLinuxRsiNativeRelocation(proof: LinuxRsiNativeRelocationProof): Promise<void>;
60
+ /** The prepared families a verified relocation proof stands for, projected back
61
+ * into their typed build-environment shapes. Callers get the same values the
62
+ * stock readers would produce after the rename(2) cutover, without any host
63
+ * probe or logical-Home read (both are only valid post-cutover). */
64
+ export interface LinuxRsiNativeRelocatedFamily {
65
+ runtime: LinuxRsiBuildEnvironment;
66
+ repository: LinuxRsiRepositoryBuildEnvironment;
67
+ behavior: LinuxPluginBehaviorRuntime;
68
+ creationBuild: LinuxRsiCreationBuildEnvironment;
69
+ release: NativeRsiReleaseBuildEnvironment;
70
+ }
71
+ /** Verify a relocation proof and return its typed families in one pass, so the
72
+ * ~585 MB release trees are hashed once instead of twice. */
73
+ export declare function openLinuxRsiNativeRelocatedFamily(proof: LinuxRsiNativeRelocationProof): Promise<LinuxRsiNativeRelocatedFamily>;
74
+ /** Re-open a verified relocation at another physical Home; callers may only
75
+ * supply the proof's own physical Home or its logical Home.
76
+ *
77
+ * The one supported case is the rename(2) cutover: `rename` preserves dev/ino,
78
+ * so the staged trees keep their sealed content identity while their paths move
79
+ * under the live Home. Receipts record logical paths, so only the element and
80
+ * receipt roots change; the proof itself stays the sealed staged record and is
81
+ * never rewritten. */
82
+ export declare function openLinuxRsiNativeRelocatedFamilyAt(proof: LinuxRsiNativeRelocationProof, physicalHome: string): Promise<LinuxRsiNativeRelocatedFamily>;
83
+ /** A resource-only proof; this neither establishes pre-owner eligibility nor
84
+ * reads, creates or migrates owner authority. The outer installer owns that gate. */
85
+ type BaseElementName = 'runtime' | 'release-toolchain' | 'release-store' | 'release-cache';
86
+ export interface LinuxRsiNativeBaseRelocationProof {
87
+ schemaVersion: 1;
88
+ backend: 'linux-native';
89
+ purpose: 'pre-owner-base';
90
+ profile: string;
91
+ sourceHome: string;
92
+ physicalHome: string;
93
+ logicalHome: string;
94
+ elements: (Omit<LinuxRsiNativeRelocationElement, 'name'> & {
95
+ name: BaseElementName;
96
+ })[];
97
+ digests: {
98
+ runtime: string;
99
+ release: string;
100
+ relocation: string;
101
+ };
102
+ }
103
+ export interface LinuxRsiNativeRelocatedBase {
104
+ runtime: LinuxRsiBuildEnvironment;
105
+ release: NativeRsiReleaseBuildEnvironment;
106
+ }
107
+ /** Read existing receipts through their canonical logical Home spelling. Only
108
+ * same-inode moves are supported: ordinary copied runtime roots fail dev/ino.
109
+ * Release schema 2 carries content pins, not historical root inode fields. */
110
+ export declare function inspectLinuxRsiNativeBaseAt(input: {
111
+ logicalHome: string;
112
+ physicalHome: string;
113
+ profile: string;
114
+ signal?: AbortSignal;
115
+ }): Promise<LinuxRsiNativeRelocatedBase>;
116
+ export declare function openLinuxRsiNativeRelocatedBase(proof: LinuxRsiNativeBaseRelocationProof): Promise<LinuxRsiNativeRelocatedBase>;
117
+ export declare function openLinuxRsiNativeRelocatedBaseAt(proof: LinuxRsiNativeBaseRelocationProof, physicalHome: string): Promise<LinuxRsiNativeRelocatedBase>;
118
+ export declare function relocateLinuxRsiNativeBase(input: LinuxRsiNativeRelocationInput): Promise<LinuxRsiNativeBaseRelocationProof>;
119
+ export {};
120
+ //# sourceMappingURL=rsi-linux-native-relocation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsi-linux-native-relocation.d.ts","sourceRoot":"","sources":["../src/rsi-linux-native-relocation.ts"],"names":[],"mappings":"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"}