@dsh-enhanced/lark-channel 0.1.47 → 0.1.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/README.md +19 -8
  2. package/docs/rsi-setup.md +123 -11
  3. package/docs/setup.md +27 -14
  4. package/docs/supervised-growth.md +2 -0
  5. package/lib/adapter.d.ts +6 -0
  6. package/lib/adapter.d.ts.map +1 -1
  7. package/lib/adapter.js +79 -8
  8. package/lib/adapter.js.map +1 -1
  9. package/lib/business-cli-install.d.ts +9 -0
  10. package/lib/business-cli-install.d.ts.map +1 -0
  11. package/lib/business-cli-install.js +367 -0
  12. package/lib/business-cli-install.js.map +1 -0
  13. package/lib/business-environment.d.ts +2 -0
  14. package/lib/business-environment.d.ts.map +1 -0
  15. package/lib/business-environment.js +16 -0
  16. package/lib/business-environment.js.map +1 -0
  17. package/lib/business-skill.d.ts +32 -0
  18. package/lib/business-skill.d.ts.map +1 -0
  19. package/lib/business-skill.js +202 -0
  20. package/lib/business-skill.js.map +1 -0
  21. package/lib/rsi-authority-config.d.ts +29 -0
  22. package/lib/rsi-authority-config.d.ts.map +1 -0
  23. package/lib/rsi-authority-config.js +233 -0
  24. package/lib/rsi-authority-config.js.map +1 -0
  25. package/lib/rsi-authority-resources.d.ts +36 -0
  26. package/lib/rsi-authority-resources.d.ts.map +1 -0
  27. package/lib/rsi-authority-resources.js +139 -0
  28. package/lib/rsi-authority-resources.js.map +1 -0
  29. package/lib/rsi-authority-runtime.d.ts +50 -0
  30. package/lib/rsi-authority-runtime.d.ts.map +1 -0
  31. package/lib/rsi-authority-runtime.js +393 -0
  32. package/lib/rsi-authority-runtime.js.map +1 -0
  33. package/lib/rsi-bootstrap-manifest.d.ts +39 -0
  34. package/lib/rsi-bootstrap-manifest.d.ts.map +1 -0
  35. package/lib/rsi-bootstrap-manifest.js +366 -0
  36. package/lib/rsi-bootstrap-manifest.js.map +1 -0
  37. package/lib/rsi-bootstrap.d.ts +30 -0
  38. package/lib/rsi-bootstrap.d.ts.map +1 -0
  39. package/lib/rsi-bootstrap.js +363 -0
  40. package/lib/rsi-bootstrap.js.map +1 -0
  41. package/lib/rsi-build.d.ts +45 -0
  42. package/lib/rsi-build.d.ts.map +1 -0
  43. package/lib/rsi-build.js +404 -0
  44. package/lib/rsi-build.js.map +1 -0
  45. package/lib/rsi-creation-build.d.ts +47 -0
  46. package/lib/rsi-creation-build.d.ts.map +1 -0
  47. package/lib/rsi-creation-build.js +333 -0
  48. package/lib/rsi-creation-build.js.map +1 -0
  49. package/lib/rsi-host-authorities.d.ts +18 -0
  50. package/lib/rsi-host-authorities.d.ts.map +1 -0
  51. package/lib/rsi-host-authorities.js +129 -0
  52. package/lib/rsi-host-authorities.js.map +1 -0
  53. package/lib/rsi-host-update.d.ts +113 -0
  54. package/lib/rsi-host-update.d.ts.map +1 -0
  55. package/lib/rsi-host-update.js +316 -0
  56. package/lib/rsi-host-update.js.map +1 -0
  57. package/lib/rsi-install-inputs.d.ts +43 -0
  58. package/lib/rsi-install-inputs.d.ts.map +1 -0
  59. package/lib/rsi-install-inputs.js +342 -0
  60. package/lib/rsi-install-inputs.js.map +1 -0
  61. package/lib/rsi-install.d.ts +54 -0
  62. package/lib/rsi-install.d.ts.map +1 -0
  63. package/lib/rsi-install.js +404 -0
  64. package/lib/rsi-install.js.map +1 -0
  65. package/lib/rsi-local-activation.d.ts +78 -0
  66. package/lib/rsi-local-activation.d.ts.map +1 -0
  67. package/lib/rsi-local-activation.js +485 -0
  68. package/lib/rsi-local-activation.js.map +1 -0
  69. package/lib/rsi-local-cohort.d.ts +70 -0
  70. package/lib/rsi-local-cohort.d.ts.map +1 -0
  71. package/lib/rsi-local-cohort.js +781 -0
  72. package/lib/rsi-local-cohort.js.map +1 -0
  73. package/lib/rsi-local-install.d.ts +40 -0
  74. package/lib/rsi-local-install.d.ts.map +1 -0
  75. package/lib/rsi-local-install.js +221 -0
  76. package/lib/rsi-local-install.js.map +1 -0
  77. package/lib/rsi-local-pair-install.d.ts +38 -0
  78. package/lib/rsi-local-pair-install.d.ts.map +1 -0
  79. package/lib/rsi-local-pair-install.js +200 -0
  80. package/lib/rsi-local-pair-install.js.map +1 -0
  81. package/lib/rsi-local-profile-update.d.ts +25 -0
  82. package/lib/rsi-local-profile-update.d.ts.map +1 -0
  83. package/lib/rsi-local-profile-update.js +226 -0
  84. package/lib/rsi-local-profile-update.js.map +1 -0
  85. package/lib/rsi-local-resources.d.ts +37 -0
  86. package/lib/rsi-local-resources.d.ts.map +1 -0
  87. package/lib/rsi-local-resources.js +184 -0
  88. package/lib/rsi-local-resources.js.map +1 -0
  89. package/lib/rsi-local-roots-extension.d.ts +11 -0
  90. package/lib/rsi-local-roots-extension.d.ts.map +1 -0
  91. package/lib/rsi-local-roots-extension.js +31 -0
  92. package/lib/rsi-local-roots-extension.js.map +1 -0
  93. package/lib/rsi-local-update-build.d.ts +18 -0
  94. package/lib/rsi-local-update-build.d.ts.map +1 -0
  95. package/lib/rsi-local-update-build.js +37 -0
  96. package/lib/rsi-local-update-build.js.map +1 -0
  97. package/lib/rsi-local-update.d.ts +39 -0
  98. package/lib/rsi-local-update.d.ts.map +1 -0
  99. package/lib/rsi-local-update.js +205 -0
  100. package/lib/rsi-local-update.js.map +1 -0
  101. package/lib/rsi-memory-learning.d.ts +22 -0
  102. package/lib/rsi-memory-learning.d.ts.map +1 -0
  103. package/lib/rsi-memory-learning.js +76 -0
  104. package/lib/rsi-memory-learning.js.map +1 -0
  105. package/lib/rsi-owner-profile.d.ts +37 -0
  106. package/lib/rsi-owner-profile.d.ts.map +1 -0
  107. package/lib/rsi-owner-profile.js +178 -0
  108. package/lib/rsi-owner-profile.js.map +1 -0
  109. package/lib/rsi-plugin-creation.d.ts +31 -0
  110. package/lib/rsi-plugin-creation.d.ts.map +1 -0
  111. package/lib/rsi-plugin-creation.js +179 -0
  112. package/lib/rsi-plugin-creation.js.map +1 -0
  113. package/lib/rsi-profile.d.ts +23 -0
  114. package/lib/rsi-profile.d.ts.map +1 -1
  115. package/lib/rsi-profile.js +154 -43
  116. package/lib/rsi-profile.js.map +1 -1
  117. package/lib/rsi-release-build.d.ts +41 -0
  118. package/lib/rsi-release-build.d.ts.map +1 -0
  119. package/lib/rsi-release-build.js +223 -0
  120. package/lib/rsi-release-build.js.map +1 -0
  121. package/lib/rsi-service-environment.d.ts +6 -0
  122. package/lib/rsi-service-environment.d.ts.map +1 -0
  123. package/lib/rsi-service-environment.js +113 -0
  124. package/lib/rsi-service-environment.js.map +1 -0
  125. package/lib/rsi-service-setup.d.ts +10 -0
  126. package/lib/rsi-service-setup.d.ts.map +1 -0
  127. package/lib/rsi-service-setup.js +34 -0
  128. package/lib/rsi-service-setup.js.map +1 -0
  129. package/lib/rsi-setup.d.ts +35 -2
  130. package/lib/rsi-setup.d.ts.map +1 -1
  131. package/lib/rsi-setup.js +459 -32
  132. package/lib/rsi-setup.js.map +1 -1
  133. package/lib/rsi-source-maintenance.d.ts +25 -0
  134. package/lib/rsi-source-maintenance.d.ts.map +1 -0
  135. package/lib/rsi-source-maintenance.js +348 -0
  136. package/lib/rsi-source-maintenance.js.map +1 -0
  137. package/lib/rsi-source-update.d.ts +26 -0
  138. package/lib/rsi-source-update.d.ts.map +1 -0
  139. package/lib/rsi-source-update.js +276 -0
  140. package/lib/rsi-source-update.js.map +1 -0
  141. package/lib/rsi-source.d.ts +34 -0
  142. package/lib/rsi-source.d.ts.map +1 -0
  143. package/lib/rsi-source.js +375 -0
  144. package/lib/rsi-source.js.map +1 -0
  145. package/lib/rsi-systemd-bootstrap.d.ts +46 -0
  146. package/lib/rsi-systemd-bootstrap.d.ts.map +1 -0
  147. package/lib/rsi-systemd-bootstrap.js +271 -0
  148. package/lib/rsi-systemd-bootstrap.js.map +1 -0
  149. package/lib/sdk.d.ts.map +1 -1
  150. package/lib/sdk.js +26 -1
  151. package/lib/sdk.js.map +1 -1
  152. package/lib/setup-business.d.ts +49 -0
  153. package/lib/setup-business.d.ts.map +1 -0
  154. package/lib/setup-business.js +335 -0
  155. package/lib/setup-business.js.map +1 -0
  156. package/lib/setup-profile.d.ts +1 -1
  157. package/lib/setup-profile.d.ts.map +1 -1
  158. package/lib/setup-profile.js +25 -2
  159. package/lib/setup-profile.js.map +1 -1
  160. package/lib/setup.d.ts +12 -1
  161. package/lib/setup.d.ts.map +1 -1
  162. package/lib/setup.js +138 -34
  163. package/lib/setup.js.map +1 -1
  164. package/lib/systemd.d.ts +10 -0
  165. package/lib/systemd.d.ts.map +1 -1
  166. package/lib/systemd.js +23 -6
  167. package/lib/systemd.js.map +1 -1
  168. package/lib/types.d.ts +7 -0
  169. package/lib/types.d.ts.map +1 -1
  170. package/lib/types.js.map +1 -1
  171. package/lib/version.d.ts +1 -1
  172. package/lib/version.js +1 -1
  173. package/package.json +32 -20
@@ -0,0 +1,184 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { chmod, cp, lstat, mkdir, readdir, realpath, rename, rm, writeFile } from 'node:fs/promises';
3
+ import { isAbsolute, join, relative, resolve, sep } from 'node:path';
4
+ import { isDeepStrictEqual } from 'node:util';
5
+ import { rsiBuildResources as io } from './rsi-build.js';
6
+ import { readRsiLocalUpdateLocked } from './rsi-local-update.js';
7
+ const kinds = ['rsi-local-cohorts', 'rsi-builds', 'rsi-release-builds'];
8
+ const hash = (value) => createHash('sha256').update(value).digest('hex');
9
+ function fail(message) { throw new Error(`rsi local resources: ${message}`); }
10
+ const inside = (root, path) => path === root || path.startsWith(root + sep);
11
+ const exact = (path) => isAbsolute(path) && resolve(path) === path && !path.includes('\0');
12
+ /** Include modes and directories: matching file bytes alone cannot prove a
13
+ * copied toolchain has retained its executable and private-directory contract. */
14
+ async function inventory(root, signal) {
15
+ let size = 0;
16
+ const entries = [];
17
+ const visit = async (path) => {
18
+ signal.throwIfAborted();
19
+ const item = await lstat(path);
20
+ if (entries.length >= 150_000 || item.isSymbolicLink() || (item.mode & 0o077) !== 0
21
+ || process.getuid && item.uid !== process.getuid())
22
+ fail(`unsafe resource entry: ${path}`);
23
+ if (item.isDirectory()) {
24
+ await io.directory(path);
25
+ entries.push({ path: relative(root, path), mode: item.mode & 0o777, sha256: null });
26
+ for (const name of (await readdir(path)).sort())
27
+ await visit(join(path, name));
28
+ }
29
+ else if (item.isFile() && item.nlink === 1) {
30
+ size += item.size;
31
+ if (item.size > 268_435_456 || size > 4_294_967_296)
32
+ fail('resource tree exceeds size bound');
33
+ entries.push({ path: relative(root, path), mode: item.mode & 0o777,
34
+ sha256: hash(await io.readStable(path, 268_435_456, true)) });
35
+ }
36
+ else
37
+ fail(`resource is not a private regular file or directory: ${path}`);
38
+ };
39
+ await visit(root);
40
+ return entries;
41
+ }
42
+ function receipt(bytes) {
43
+ const value = JSON.parse(bytes.toString('utf8'));
44
+ if (!value || typeof value !== 'object' || Array.isArray(value))
45
+ fail('invalid resource receipt');
46
+ const { receiptDigest, ...body } = value;
47
+ if (receiptDigest !== hash(JSON.stringify(body)))
48
+ fail('resource receipt digest differs');
49
+ return body;
50
+ }
51
+ function encode(body) { return JSON.stringify({ ...body, receiptDigest: hash(JSON.stringify(body)) }); }
52
+ /** Caller owns the Home lifecycle lock and has stopped all Home writers. Only
53
+ * these three trees in the disposable stage are changed; source, profiles,
54
+ * owner authority and ledger still require the enclosing activation transaction.
55
+ * A crash requires discarding/recovering that stage, never reusing it as live. */
56
+ export async function stageRsiLocalUpdateResources(input) {
57
+ const signal = AbortSignal.any([input.signal ?? new AbortController().signal, AbortSignal.timeout(600_000)]);
58
+ const { logicalHome, stagePhysicalHome, profile } = input;
59
+ if (!exact(logicalHome) || !exact(stagePhysicalHome) || !/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/u.test(profile)
60
+ || await realpath(logicalHome) !== logicalHome || await realpath(stagePhysicalHome) !== stagePhysicalHome
61
+ || inside(logicalHome, stagePhysicalHome) || inside(stagePhysicalHome, logicalHome))
62
+ fail('stage must be a distinct canonical stopped Home');
63
+ await io.directory(stagePhysicalHome);
64
+ const prepared = await readRsiLocalUpdateLocked({ dshHome: logicalHome, profile, root: input.preparationRoot, signal });
65
+ if (!prepared.build || inside(stagePhysicalHome, prepared.root) || inside(prepared.root, stagePhysicalHome))
66
+ fail('stage overlaps preparation');
67
+ const original = {}, candidate = {};
68
+ for (const kind of kinds) {
69
+ await io.directory(join(logicalHome, kind));
70
+ await io.directory(join(stagePhysicalHome, kind));
71
+ await io.directory(join(prepared.candidateHome, kind));
72
+ original[kind] = await inventory(join(logicalHome, kind, profile), signal);
73
+ if (!isDeepStrictEqual(original[kind], await inventory(join(stagePhysicalHome, kind, profile), signal)))
74
+ fail(`copied original differs: ${kind}`);
75
+ candidate[kind] = await inventory(join(prepared.candidateHome, kind, profile), signal);
76
+ }
77
+ const cohortRoot = join(logicalHome, kinds[0], profile);
78
+ const originalCohort = receipt(await io.readStable(join(cohortRoot, 'receipt.json'), 20_971_520, true));
79
+ if (hash(JSON.stringify(originalCohort)) !== prepared.originalCohortDigest
80
+ || typeof originalCohort.sourceRepository !== 'string' || !exact(originalCohort.sourceRepository))
81
+ fail('original cohort source differs');
82
+ if (inside(originalCohort.sourceRepository, stagePhysicalHome)
83
+ || inside(stagePhysicalHome, originalCohort.sourceRepository))
84
+ fail('stage overlaps upstream source repository');
85
+ const { receiptDigest: _oldDigest, ...cohortBody } = prepared.cohort;
86
+ const cohort = JSON.parse(encode({ ...cohortBody, root: cohortRoot,
87
+ sourceRepository: originalCohort.sourceRepository,
88
+ packages: prepared.cohort.packages.map(item => ({ ...item, tarball: join(cohortRoot, 'artifacts', `${item.name.split('/')[1]}.tgz`) })) }));
89
+ const buildBody = receipt(await io.readStable(join(prepared.candidateHome, kinds[1], profile, 'bootstrap.json'), 65_536, true));
90
+ const sourceBuild = { ...prepared.build.sourceBuild, sourceBuild: {
91
+ ...prepared.build.sourceBuild.sourceBuild,
92
+ repositorySandbox: { ...prepared.build.sourceBuild.sourceBuild.repositorySandbox,
93
+ seccompPath: join(logicalHome, kinds[1], profile, 'seccomp.json') },
94
+ } };
95
+ const releaseRoot = join(logicalHome, kinds[2], profile);
96
+ const oldReleaseRoot = join(prepared.candidateHome, kinds[2], profile);
97
+ const releaseBuild = { ...prepared.build.releaseBuild,
98
+ releaseBuild: Object.fromEntries(Object.entries(prepared.build.releaseBuild.releaseBuild).map(([key, pin]) => [key,
99
+ inside(oldReleaseRoot, pin.path) ? { ...pin, path: join(releaseRoot, relative(oldReleaseRoot, pin.path)) } : pin,
100
+ ])) };
101
+ const releaseBody = receipt(await io.readStable(join(prepared.candidateHome, kinds[2], profile, 'bootstrap.json'), 65_536, true));
102
+ const receipts = {
103
+ 'rsi-local-cohorts': { name: 'receipt.json', source: JSON.stringify(cohort) },
104
+ 'rsi-builds': { name: 'bootstrap.json', source: encode({ ...buildBody, dshHome: logicalHome,
105
+ repository: join(logicalHome, 'rsi-sources', profile, 'checkout'), sourceBuild: sourceBuild.sourceBuild }) },
106
+ 'rsi-release-builds': { name: 'bootstrap.json', source: encode({ ...releaseBody, dshHome: logicalHome,
107
+ releaseBuild: releaseBuild.releaseBuild }) },
108
+ };
109
+ const scratch = join(stagePhysicalHome, `.rsi-local-resources-${randomUUID()}`);
110
+ await mkdir(scratch, { mode: 0o700 });
111
+ const moved = [], installed = [];
112
+ let verified = false;
113
+ try {
114
+ // Build all replacement trees and verify them before replacing any stage resource.
115
+ for (const kind of kinds) {
116
+ const next = join(scratch, kind), source = join(prepared.candidateHome, kind, profile);
117
+ await cp(source, next, { recursive: true, dereference: false, verbatimSymlinks: true, errorOnExist: true, force: false });
118
+ if (!isDeepStrictEqual(await inventory(next, signal), candidate[kind]))
119
+ fail(`resource changed during copy: ${kind}`);
120
+ const update = receipts[kind], entry = candidate[kind].find(item => item.path === update.name);
121
+ if (!entry || entry.sha256 === null)
122
+ fail('resource receipt is missing from inventory');
123
+ await writeFile(join(next, update.name), update.source, { mode: entry.mode });
124
+ await chmod(join(next, update.name), entry.mode);
125
+ candidate[kind] = candidate[kind].map(item => item.path === update.name ? { ...item, sha256: hash(update.source) } : item);
126
+ if (!isDeepStrictEqual(await inventory(next, signal), candidate[kind]))
127
+ fail(`rebased resource differs: ${kind}`);
128
+ }
129
+ // Revalidate the preparation and originals after copying, before stage mutation.
130
+ if (!isDeepStrictEqual(await readRsiLocalUpdateLocked({ dshHome: logicalHome, profile, root: input.preparationRoot, signal }), prepared))
131
+ fail('preparation changed during copy');
132
+ for (const kind of kinds) {
133
+ if (!isDeepStrictEqual(await inventory(join(logicalHome, kind, profile), signal), original[kind])
134
+ || !isDeepStrictEqual(await inventory(join(stagePhysicalHome, kind, profile), signal), original[kind]))
135
+ fail(`original resource changed: ${kind}`);
136
+ }
137
+ for (const kind of kinds) {
138
+ signal.throwIfAborted();
139
+ await rename(join(stagePhysicalHome, kind, profile), join(scratch, `old-${kind}`));
140
+ moved.push(kind);
141
+ await rename(join(scratch, kind), join(stagePhysicalHome, kind, profile));
142
+ installed.push(kind);
143
+ await io.syncDirectory(join(stagePhysicalHome, kind));
144
+ }
145
+ const proof = { schemaVersion: 1, dshHome: logicalHome, profile,
146
+ preparationDigest: prepared.receiptDigest,
147
+ original: Object.fromEntries(kinds.map(kind => [kind, hash(JSON.stringify(original[kind]))])),
148
+ candidate: Object.fromEntries(kinds.map(kind => [kind, hash(JSON.stringify(candidate[kind]))])) };
149
+ await verifyRsiLocalUpdateResources({ physicalHome: stagePhysicalHome, proof, signal });
150
+ verified = true;
151
+ await rm(scratch, { recursive: true });
152
+ return { cohort, sourceBuild, releaseBuild, proof };
153
+ }
154
+ catch (error) {
155
+ // Once backup cleanup begins, an incomplete cleanup is not permission to
156
+ // restore from backups that may already have been removed.
157
+ if (verified)
158
+ throw error;
159
+ // A failed restore deliberately keeps the scratch tree and surfaces the error.
160
+ for (const kind of moved.reverse()) {
161
+ if (installed.includes(kind))
162
+ await rm(join(stagePhysicalHome, kind, profile), { recursive: true });
163
+ await rename(join(scratch, `old-${kind}`), join(stagePhysicalHome, kind, profile));
164
+ await io.syncDirectory(join(stagePhysicalHome, kind));
165
+ }
166
+ await rm(scratch, { recursive: true });
167
+ throw error;
168
+ }
169
+ }
170
+ export async function verifyRsiLocalUpdateResources(input) {
171
+ const { proof, physicalHome } = input;
172
+ if (proof.schemaVersion !== 1 || !exact(physicalHome) || await realpath(physicalHome) !== physicalHome
173
+ || !exact(proof.dshHome) || !/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/u.test(proof.profile)
174
+ || !/^[a-f0-9]{64}$/u.test(proof.preparationDigest))
175
+ fail('invalid resource proof binding');
176
+ const signal = input.signal ?? new AbortController().signal;
177
+ for (const kind of kinds) {
178
+ await io.directory(join(physicalHome, kind));
179
+ if (hash(JSON.stringify(await inventory(join(physicalHome, kind, proof.profile), signal)))
180
+ !== (input.original ? proof.original : proof.candidate)[kind])
181
+ fail(`resource proof differs: ${kind}`);
182
+ }
183
+ }
184
+ //# sourceMappingURL=rsi-local-resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsi-local-resources.js","sourceRoot":"","sources":["../src/rsi-local-resources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export type RsiLocalRootExtension = 'memory-learning';
2
+ /** The only supported change to a pre-owner frozen profile's selected roots. */
3
+ export declare function rsiLocalUpdateBundles(original: readonly string[], extension?: RsiLocalRootExtension): string[];
4
+ /** Matches the learner bundle's published cordis.patch.yml initial row. */
5
+ export declare const rsiMemoryLearningInitialRow: Readonly<{
6
+ id: "dsh-enhanced-assistant-memory-learning";
7
+ name: "@dsh-enhanced/assistant-memory-learning";
8
+ disabled: true;
9
+ inject: readonly string[];
10
+ }>;
11
+ //# sourceMappingURL=rsi-local-roots-extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsi-local-roots-extension.d.ts","sourceRoot":"","sources":["../src/rsi-local-roots-extension.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG,iBAAiB,CAAA;AAMrD,gFAAgF;AAChF,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,qBAAqB,GAAG,MAAM,EAAE,CAU9G;AAED,2EAA2E;AAC3E,eAAO,MAAM,2BAA2B;;;;;EAQtC,CAAA"}
@@ -0,0 +1,31 @@
1
+ const learner = 'assistant-memory-learning';
2
+ const required = ['personal-assistant', 'assistant-delivery', 'assistant-evaluation', 'assistant-verifier'];
3
+ const slug = /^[a-z0-9]+(?:-[a-z0-9]+)*$/u;
4
+ /** The only supported change to a pre-owner frozen profile's selected roots. */
5
+ export function rsiLocalUpdateBundles(original, extension) {
6
+ if (!Array.isArray(original) || !original.length || original.some(value => typeof value !== 'string' || !slug.test(value))
7
+ || new Set(original).size !== original.length)
8
+ throw new Error('rsi local roots extension: invalid original roots');
9
+ if (extension === undefined)
10
+ return [...original].sort();
11
+ if (extension !== 'memory-learning')
12
+ throw new Error('rsi local roots extension: unsupported extension');
13
+ if (original.includes(learner))
14
+ throw new Error('rsi local roots extension: learner root already installed');
15
+ for (const value of required)
16
+ if (!original.includes(value)) {
17
+ throw new Error(`rsi local roots extension: required provider root is missing: ${value}`);
18
+ }
19
+ return [...original, learner].sort();
20
+ }
21
+ /** Matches the learner bundle's published cordis.patch.yml initial row. */
22
+ export const rsiMemoryLearningInitialRow = Object.freeze({
23
+ id: 'dsh-enhanced-assistant-memory-learning',
24
+ name: '@dsh-enhanced/assistant-memory-learning',
25
+ disabled: true,
26
+ inject: Object.freeze([
27
+ 'assistantDelivery', 'assistantEvaluation', 'assistantAutomations', 'personalMemory', 'assistantVerifier',
28
+ 'assistantPolicy', 'agents', 'sessions', 'tools', 'llm', 'systemPrompt',
29
+ ]),
30
+ });
31
+ //# sourceMappingURL=rsi-local-roots-extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsi-local-roots-extension.js","sourceRoot":"","sources":["../src/rsi-local-roots-extension.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,GAAG,2BAA2B,CAAA;AAC3C,MAAM,QAAQ,GAAG,CAAC,oBAAoB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,oBAAoB,CAAC,CAAA;AAC3G,MAAM,IAAI,GAAG,6BAA6B,CAAA;AAE1C,gFAAgF;AAChF,MAAM,UAAU,qBAAqB,CAAC,QAA2B,EAAE,SAAiC;IAClG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;WACrH,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;IACrH,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAA;IACxD,IAAI,SAAS,KAAK,iBAAiB;QAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;IACxG,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAA;IAC5G,KAAK,MAAM,KAAK,IAAI,QAAQ;QAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,KAAK,CAAC,iEAAiE,KAAK,EAAE,CAAC,CAAA;QAC3F,CAAC;IACD,OAAO,CAAC,GAAG,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;AACtC,CAAC;AAED,2EAA2E;AAC3E,MAAM,CAAC,MAAM,2BAA2B,GAAG,MAAM,CAAC,MAAM,CAAC;IACvD,EAAE,EAAE,wCAAwC;IAC5C,IAAI,EAAE,yCAAyC;IAC/C,QAAQ,EAAE,IAAI;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;QACpB,mBAAmB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,mBAAmB;QACzG,iBAAiB,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc;KACxE,CAAC;CACH,CAAC,CAAA"}
@@ -0,0 +1,18 @@
1
+ import type { RsiSourceWorkspace } from './rsi-source.js';
2
+ import type { RsiLocalCohortPorts } from './rsi-local-cohort.js';
3
+ /** Only the digest-pinned manifest/image preparation runs on the host. Updated
4
+ * repository build/pack scripts run with the release adapter's existing offline
5
+ * bwrap mounts, without the live Home, source Git directories or credentials. */
6
+ export declare function prepareRsiLocalUpdateBuild(input: {
7
+ dshHome: string;
8
+ profile: string;
9
+ source: RsiSourceWorkspace;
10
+ signal: AbortSignal;
11
+ }): Promise<{
12
+ ports: RsiLocalCohortPorts;
13
+ evidence: {
14
+ sourceBuild: import("./rsi-build.js").RsiBuildEnvironment;
15
+ releaseBuild: import("./rsi-release-build.js").RsiReleaseBuildEnvironment;
16
+ };
17
+ }>;
18
+ //# sourceMappingURL=rsi-local-update-build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsi-local-update-build.d.ts","sourceRoot":"","sources":["../src/rsi-local-update-build.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAEhE;;iFAEiF;AACjF,wBAAsB,0BAA0B,CAAC,KAAK,EAAE;IACtD,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAClF;;;;;;GAmBA"}
@@ -0,0 +1,37 @@
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 { createRequire } from 'node:module';
10
+ import { dirname, join } from 'node:path';
11
+ import { pathToFileURL } from 'node:url';
12
+ import { prepareRsiBuildEnvironment, rsiBuildResources as io } from './rsi-build.js';
13
+ import { prepareRsiReleaseBuildEnvironment } from './rsi-release-build.js';
14
+ /** Only the digest-pinned manifest/image preparation runs on the host. Updated
15
+ * repository build/pack scripts run with the release adapter's existing offline
16
+ * bwrap mounts, without the live Home, source Git directories or credentials. */
17
+ export async function prepareRsiLocalUpdateBuild(input) {
18
+ const require = createRequire(import.meta.url);
19
+ const packageRoot = dirname(require.resolve('@dsh-enhanced/plugin-control-plane/package.json'));
20
+ const adapterPath = join(packageRoot, 'bin', 'dsh-local-release-adapter.js');
21
+ const adapter = await import(__rewriteRelativeImportExtension(pathToFileURL(adapterPath).href));
22
+ if (typeof adapter.buildLocalUpdateCohort !== 'function')
23
+ throw new Error('rsi local update: Control Plane lacks isolated cohort preparation');
24
+ const build = await prepareRsiBuildEnvironment(input);
25
+ const release = await prepareRsiReleaseBuildEnvironment({ ...input, build });
26
+ const ports = { build: async (workspace, output, packagePaths, signal) => {
27
+ // Keep the synchronous adapter in a separate, bounded process so cancel and
28
+ // timeout can drain its bwrap child through --die-with-parent.
29
+ // The adapter also has a CLI entry guard. Clear this eval process's argv
30
+ // after capturing the data so importing it cannot be mistaken for its CLI.
31
+ const program = "const [url,source]=process.argv.slice(1);process.argv.length=1;const m=await import(url);m.buildLocalUpdateCohort(JSON.parse(source));";
32
+ await io.command(process.execPath, ['--input-type=module', '--eval', program,
33
+ pathToFileURL(adapterPath).href, JSON.stringify({ build: release.releaseBuild, workspace, output, packagePaths })], { PATH: '/usr/bin:/bin', HOME: '/nonexistent', LANG: 'C', LC_ALL: 'C', TZ: 'UTC' }, signal, 1_800_000, 2_097_152);
34
+ } };
35
+ return { ports, evidence: { sourceBuild: build, releaseBuild: release } };
36
+ }
37
+ //# sourceMappingURL=rsi-local-update-build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsi-local-update-build.js","sourceRoot":"","sources":["../src/rsi-local-update-build.ts"],"names":[],"mappings":";;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,IAAI,EAAE,EAAE,MAAM,gBAAgB,CAAA;AACpF,OAAO,EAAE,iCAAiC,EAAE,MAAM,wBAAwB,CAAA;AAI1E;;iFAEiF;AACjF,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,KAEhD;IACC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC9C,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,iDAAiD,CAAC,CAAC,CAAA;IAC/F,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,8BAA8B,CAAC,CAAA;IAC5E,MAAM,OAAO,GAAG,MAAM,MAAM,kCAAC,aAAa,CAAC,WAAW,CAAC,CAAC,IAAI,EAAyC,CAAA;IACrG,IAAI,OAAO,OAAO,CAAC,sBAAsB,KAAK,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAA;IAC9I,MAAM,KAAK,GAAG,MAAM,0BAA0B,CAAC,KAAK,CAAC,CAAA;IACrD,MAAM,OAAO,GAAG,MAAM,iCAAiC,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;IAC5E,MAAM,KAAK,GAAwB,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE;YAC5F,4EAA4E;YAC5E,+DAA+D;YAC/D,yEAAyE;YACzE,2EAA2E;YAC3E,MAAM,OAAO,GAAG,wIAAwI,CAAA;YACxJ,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,qBAAqB,EAAE,QAAQ,EAAE,OAAO;gBAC1E,aAAa,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,EACpH,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAA;QACnH,CAAC,EAAE,CAAA;IACH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,CAAA;AAC3E,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { type RsiLocalCohort, type RsiLocalCohortPorts } from './rsi-local-cohort.js';
2
+ import { type RsiSourceUpdateCandidate } from './rsi-source-update.js';
3
+ import { prepareRsiLocalUpdateBuild } from './rsi-local-update-build.js';
4
+ export interface RsiLocalUpdateInput {
5
+ dshHome: string;
6
+ profile: string;
7
+ sourceRepository: string;
8
+ rootExtension?: 'memory-learning';
9
+ signal?: AbortSignal;
10
+ }
11
+ export interface RsiLocalUpdatePreparation {
12
+ schemaVersion: 1 | 2;
13
+ mode: 'prepared';
14
+ /** Schema 2 explicitly binds the only supported pre-owner root addition. */
15
+ extension?: 'memory-learning';
16
+ dshHome: string;
17
+ profile: string;
18
+ root: string;
19
+ candidateHome: string;
20
+ originalCohortDigest: string;
21
+ source: RsiSourceUpdateCandidate;
22
+ cohort: RsiLocalCohort;
23
+ build: Awaited<ReturnType<typeof prepareRsiLocalUpdateBuild>>['evidence'] | null;
24
+ receiptDigest: string;
25
+ }
26
+ /** Caller owns the original Home lifecycle lock. Reading a completed candidate
27
+ * never creates missing resources and does not run candidate build scripts. */
28
+ export declare function readRsiLocalUpdateLocked(input: {
29
+ dshHome: string;
30
+ profile: string;
31
+ root: string;
32
+ signal?: AbortSignal;
33
+ }): Promise<RsiLocalUpdatePreparation>;
34
+ export declare function readRsiLocalUpdate(input: Parameters<typeof readRsiLocalUpdateLocked>[0]): Promise<RsiLocalUpdatePreparation>;
35
+ /** Build a reusable update candidate without stopping or changing the installed
36
+ * Agent. Activation must separately reconcile signed history and migrate the
37
+ * candidate into a stopped Home transaction; this receipt does not authorize it. */
38
+ export declare function prepareRsiLocalUpdate(input: RsiLocalUpdateInput, ports?: RsiLocalCohortPorts): Promise<RsiLocalUpdatePreparation>;
39
+ //# sourceMappingURL=rsi-local-update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsi-local-update.d.ts","sourceRoot":"","sources":["../src/rsi-local-update.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,KAAK,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAE9E,OAAO,EAA+C,KAAK,wBAAwB,EAAE,MAAM,wBAAwB,CAAA;AAEnH,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAA;AAMxE,MAAM,WAAW,mBAAmB;IAAG,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAChG,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE;AAC3D,MAAM,WAAW,yBAAyB;IACxC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAA;IACpB,IAAI,EAAE,UAAU,CAAA;IAChB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,iBAAiB,CAAA;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,MAAM,CAAA;IACrB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,MAAM,EAAE,wBAAwB,CAAA;IAChC,MAAM,EAAE,cAAc,CAAA;IACtB,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI,CAAA;IAChF,aAAa,EAAE,MAAM,CAAA;CACtB;AAED;+EAC+E;AAC/E,wBAAsB,wBAAwB,CAAC,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IACrG,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAiD5D;AAgBD,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAElI;AAqBD;;oFAEoF;AACpF,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,mBAAmB,EACpE,KAAK,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CA+DjE"}
@@ -0,0 +1,205 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { lstat, mkdir, readdir, realpath } from 'node:fs/promises';
3
+ import { dirname, isAbsolute, join, resolve } from 'node:path';
4
+ import { isDeepStrictEqual } from 'node:util';
5
+ import { rsiBuildResources as io, readRsiBuildEnvironment } from './rsi-build.js';
6
+ import { readRsiReleaseBuildEnvironment } from './rsi-release-build.js';
7
+ import { prepareRsiLocalCohort, readRsiLocalCohort, verifyRsiLocalInstalledPackages } from './rsi-local-cohort.js';
8
+ import { prepareRsiSourceWorkspace, readRsiSourceWorkspace } from './rsi-source.js';
9
+ import { prepareRsiSourceUpdate, readRsiSourceUpdate } from './rsi-source-update.js';
10
+ import { withDshHomeLifecycleLock } from './setup.js';
11
+ import { prepareRsiLocalUpdateBuild } from './rsi-local-update-build.js';
12
+ import { rsiLocalUpdateBundles } from './rsi-local-roots-extension.js';
13
+ const hash = (value) => createHash('sha256').update(value).digest('hex');
14
+ const fail = (message) => { throw new Error(`rsi local update: ${message}`); };
15
+ const profileName = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/u;
16
+ /** Caller owns the original Home lifecycle lock. Reading a completed candidate
17
+ * never creates missing resources and does not run candidate build scripts. */
18
+ export async function readRsiLocalUpdateLocked(input) {
19
+ if (process.platform !== 'linux' || !profileName.test(input.profile)
20
+ || !isAbsolute(input.dshHome) || resolve(input.dshHome) !== input.dshHome
21
+ || !isAbsolute(input.root) || resolve(input.root) !== input.root
22
+ || await realpath(input.dshHome) !== input.dshHome || await realpath(input.root) !== input.root)
23
+ fail('invalid preparation identity');
24
+ await io.directory(input.dshHome, false);
25
+ const parent = join(dirname(input.dshHome), `.dsh-rsi-local-updates-${hash(input.dshHome).slice(0, 16)}`);
26
+ if (dirname(input.root) !== parent)
27
+ fail('preparation is outside its bound parent');
28
+ await io.directory(parent);
29
+ await io.directory(input.root);
30
+ const signal = AbortSignal.any([input.signal ?? new AbortController().signal, AbortSignal.timeout(180_000)]);
31
+ signal.throwIfAborted();
32
+ const raw = await io.readStable(join(input.root, 'receipt.json'), 20_971_520, true);
33
+ const saved = JSON.parse(raw.toString('utf8'));
34
+ const extended = saved?.schemaVersion === 2;
35
+ if (!saved || typeof saved !== 'object' || Array.isArray(saved)
36
+ || !isDeepStrictEqual(Object.keys(saved).sort(), ['schemaVersion', 'mode', 'dshHome', 'profile', 'root',
37
+ 'candidateHome', 'originalCohortDigest', 'source', 'cohort', 'build', 'receiptDigest',
38
+ ...(extended ? ['extension'] : [])].sort()))
39
+ fail('prepared update receipt is invalid');
40
+ const { receiptDigest, ...body } = saved;
41
+ if (receiptDigest !== hash(JSON.stringify(body)) || ![1, 2].includes(saved.schemaVersion)
42
+ || extended && saved.extension !== 'memory-learning' || saved.mode !== 'prepared'
43
+ || saved.dshHome !== input.dshHome || saved.profile !== input.profile || saved.root !== input.root
44
+ || saved.candidateHome !== join(input.root, 'home') || !saved.build)
45
+ fail('prepared update receipt binding differs');
46
+ if (!isDeepStrictEqual((await readdir(input.root)).sort(), ['home', 'receipt.json', 'source']))
47
+ fail('unexpected preparation contents');
48
+ const original = await readRsiLocalCohort(input);
49
+ if (saved.originalCohortDigest !== original.receiptDigest)
50
+ fail('prepared update no longer matches installed cohort');
51
+ const expectedBundles = rsiLocalUpdateBundles(original.bundles, saved.extension);
52
+ if (!isDeepStrictEqual(saved.cohort.bundles, expectedBundles))
53
+ fail('prepared bundle selection differs');
54
+ if (extended)
55
+ await assertPreOwner(input, signal);
56
+ const sourceInput = { dshHome: input.dshHome, profile: input.profile, sourceRepository: original.sourceRepository,
57
+ candidateRoot: join(input.root, 'source'), signal };
58
+ const source = await readRsiSourceUpdate(sourceInput);
59
+ const identity = preparationIdentity({ ...input, original, upstreamCommit: source.upstreamCommit,
60
+ repairCommit: source.repairCommit, ...(saved.extension ? { rootExtension: saved.extension } : {}) });
61
+ if (join(parent, identity) !== input.root || !isDeepStrictEqual(saved.source, source))
62
+ fail('prepared source differs');
63
+ const workspace = await readRsiSourceWorkspace({ dshHome: saved.candidateHome, profile: input.profile,
64
+ sourceRepository: source.repository, signal });
65
+ if (workspace.sourceCommit !== source.sourceCommit || workspace.version !== source.version)
66
+ fail('candidate workspace differs from prepared source');
67
+ const cohort = await readRsiLocalCohort({ dshHome: saved.candidateHome, profile: input.profile, source: workspace });
68
+ const sourceBuild = await readRsiBuildEnvironment({ dshHome: saved.candidateHome, profile: input.profile, source: workspace, signal });
69
+ const releaseBuild = await readRsiReleaseBuildEnvironment({ dshHome: saved.candidateHome, profile: input.profile, build: sourceBuild, signal });
70
+ if (!isDeepStrictEqual(saved.cohort, cohort) || !isDeepStrictEqual(saved.build, { sourceBuild, releaseBuild }))
71
+ fail('prepared build or cohort differs');
72
+ await verifyRsiLocalInstalledPackages({ cohort: original, profilePath: join(input.dshHome, 'profiles', input.profile) });
73
+ if (!isDeepStrictEqual(await readRsiSourceUpdate(sourceInput), source)
74
+ || !isDeepStrictEqual(await readRsiLocalCohort(input), original)
75
+ || !(await io.readStable(join(input.root, 'receipt.json'), 20_971_520, true)).equals(raw))
76
+ fail('preparation or original changed during verification');
77
+ signal.throwIfAborted();
78
+ if (extended)
79
+ await assertPreOwner(input, signal);
80
+ return saved;
81
+ }
82
+ function preparationIdentity(input) {
83
+ return hash(JSON.stringify({ preparation: input.rootExtension ? 'isolated-build-v2' : 'isolated-build-v1',
84
+ home: input.dshHome, profile: input.profile, original: input.original.receiptDigest,
85
+ upstreamCommit: input.upstreamCommit, repairCommit: input.repairCommit,
86
+ ...(input.rootExtension ? { extension: input.rootExtension } : {}) }));
87
+ }
88
+ async function assertPreOwner(input, signal) {
89
+ const { assertRsiPreOwnerInstallation } = await import('./rsi-local-activation.js');
90
+ await assertRsiPreOwnerInstallation({ logicalHome: input.dshHome, physicalHome: input.dshHome,
91
+ profile: input.profile, signal });
92
+ }
93
+ export async function readRsiLocalUpdate(input) {
94
+ return withDshHomeLifecycleLock(input.dshHome, () => readRsiLocalUpdateLocked(input));
95
+ }
96
+ async function privateDirectory(path) {
97
+ try {
98
+ await mkdir(path, { mode: 0o700 });
99
+ }
100
+ catch (error) {
101
+ if (error.code !== 'EEXIST')
102
+ throw error;
103
+ }
104
+ await io.directory(path);
105
+ }
106
+ async function exists(path) {
107
+ try {
108
+ await lstat(path);
109
+ return true;
110
+ }
111
+ catch (error) {
112
+ if (error.code === 'ENOENT')
113
+ return false;
114
+ throw error;
115
+ }
116
+ }
117
+ async function commit(repository, ref, signal) {
118
+ const value = await io.command('/usr/bin/git', ['-c', 'core.hooksPath=/dev/null', '-c', 'protocol.allow=never',
119
+ '-C', repository, 'rev-parse', '--verify', `${ref}^{commit}`], { PATH: '/usr/bin:/bin', HOME: '/nonexistent', LANG: 'C', LC_ALL: 'C', GIT_CONFIG_NOSYSTEM: '1',
120
+ GIT_CONFIG_GLOBAL: '/dev/null', GIT_CONFIG_SYSTEM: '/dev/null', GIT_CONFIG_COUNT: '0', GIT_NO_REPLACE_OBJECTS: '1',
121
+ GIT_NO_LAZY_FETCH: '1', GIT_TERMINAL_PROMPT: '0' }, signal, 15_000, 1024);
122
+ if (!/^[a-f0-9]{40}$/u.test(value))
123
+ fail('source ref is not an exact commit');
124
+ return value;
125
+ }
126
+ /** Build a reusable update candidate without stopping or changing the installed
127
+ * Agent. Activation must separately reconcile signed history and migrate the
128
+ * candidate into a stopped Home transaction; this receipt does not authorize it. */
129
+ export async function prepareRsiLocalUpdate(input, ports) {
130
+ if (process.platform !== 'linux' || !profileName.test(input.profile)
131
+ || !isAbsolute(input.dshHome) || resolve(input.dshHome) !== input.dshHome
132
+ || !isAbsolute(input.sourceRepository) || resolve(input.sourceRepository) !== input.sourceRepository
133
+ || await realpath(input.dshHome) !== input.dshHome
134
+ || await realpath(input.sourceRepository) !== input.sourceRepository)
135
+ fail('invalid local update identity');
136
+ await io.directory(input.dshHome, false);
137
+ const signal = AbortSignal.any([input.signal ?? new AbortController().signal, AbortSignal.timeout(2_400_000)]);
138
+ return withDshHomeLifecycleLock(input.dshHome, async () => {
139
+ const original = await readRsiLocalCohort(input);
140
+ if (original.sourceRepository !== input.sourceRepository)
141
+ fail('update source differs from installed cohort');
142
+ const bundles = rsiLocalUpdateBundles(original.bundles, input.rootExtension);
143
+ if (input.rootExtension)
144
+ await assertPreOwner(input, signal);
145
+ const profilePath = join(input.dshHome, 'profiles', input.profile);
146
+ await verifyRsiLocalInstalledPackages({ cohort: original, profilePath });
147
+ const upstreamCommit = await commit(input.sourceRepository, 'HEAD', signal);
148
+ const repository = join(input.dshHome, 'rsi-sources', input.profile, 'checkout');
149
+ const repairCommit = await commit(repository, 'refs/dsh-source/repairs', signal);
150
+ const identity = preparationIdentity({ ...input, original, upstreamCommit, repairCommit });
151
+ // Outside Home so preparing/building never changes an active Agent's input
152
+ // tree. Each exact upstream/repair pair has a distinct immutable directory.
153
+ const parent = join(dirname(input.dshHome), `.dsh-rsi-local-updates-${hash(input.dshHome).slice(0, 16)}`);
154
+ if (parent === input.sourceRepository || parent.startsWith(input.sourceRepository + '/'))
155
+ fail('preparation directory would modify the source repository');
156
+ await privateDirectory(parent);
157
+ const root = join(parent, identity);
158
+ await privateDirectory(root);
159
+ const candidateHome = join(root, 'home'), receiptPath = join(root, 'receipt.json');
160
+ const sourceInput = { ...input, candidateRoot: join(root, 'source'), signal };
161
+ const source = await prepareRsiSourceUpdate(sourceInput);
162
+ if (source.upstreamCommit !== upstreamCommit || source.repairCommit !== repairCommit)
163
+ fail('source changed during preparation');
164
+ await privateDirectory(candidateHome);
165
+ const workspace = await prepareRsiSourceWorkspace({ dshHome: candidateHome, profile: input.profile,
166
+ version: source.version, sourceRepository: source.repository, signal });
167
+ if (workspace.sourceCommit !== source.sourceCommit)
168
+ fail('candidate checkout differs from merged source');
169
+ const builder = ports ? undefined : await prepareRsiLocalUpdateBuild({ dshHome: candidateHome,
170
+ profile: input.profile, source: workspace, signal });
171
+ const cohort = await prepareRsiLocalCohort({ dshHome: candidateHome, profile: input.profile,
172
+ source: workspace, bundles, signal }, ports ?? builder.ports);
173
+ const verifyOriginal = async () => {
174
+ if (!isDeepStrictEqual(await readRsiSourceUpdate(sourceInput), source)
175
+ || !isDeepStrictEqual(await readRsiLocalCohort(input), original))
176
+ fail('installed source or cohort changed during build');
177
+ await verifyRsiLocalInstalledPackages({ cohort: original, profilePath });
178
+ if (input.rootExtension)
179
+ await assertPreOwner(input, signal);
180
+ signal.throwIfAborted();
181
+ };
182
+ await verifyOriginal();
183
+ const content = { schemaVersion: input.rootExtension ? 2 : 1,
184
+ ...(input.rootExtension ? { extension: input.rootExtension } : {}), mode: 'prepared', dshHome: input.dshHome,
185
+ profile: input.profile, root, candidateHome, originalCohortDigest: original.receiptDigest, source, cohort,
186
+ build: builder?.evidence ?? null };
187
+ const result = { ...content, receiptDigest: hash(JSON.stringify(content)) };
188
+ if (await exists(receiptPath)) {
189
+ const existing = JSON.parse((await io.readStable(receiptPath, 20_971_520, true)).toString('utf8'));
190
+ if (!isDeepStrictEqual(existing, result))
191
+ fail('prepared update receipt differs');
192
+ }
193
+ else {
194
+ await io.writeExclusive(receiptPath, JSON.stringify(result));
195
+ await io.syncDirectory(root);
196
+ }
197
+ if (!isDeepStrictEqual((await readdir(root)).sort(), ['home', 'receipt.json', 'source']))
198
+ fail('unexpected preparation contents');
199
+ // The caller may inspect a completed receipt, but a stale candidate can
200
+ // never be treated as permission to overwrite newer source or task state.
201
+ await verifyOriginal();
202
+ return result;
203
+ });
204
+ }
205
+ //# sourceMappingURL=rsi-local-update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsi-local-update.js","sourceRoot":"","sources":["../src/rsi-local-update.ts"],"names":[],"mappings":"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"}