@almadar/core 10.129.0 → 11.0.0

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 (132) hide show
  1. package/dist/behavior-package.d.ts +49 -11
  2. package/dist/behavior-package.js +1 -1
  3. package/dist/{orbital-CkFdDS9f.d.ts → builders-BhnofAik.d.ts} +5966 -7116
  4. package/dist/builders.d.ts +6 -6
  5. package/dist/builders.js +7 -6
  6. package/dist/{bus-CcbB__oo.d.ts → bus-BrRFWDQK.d.ts} +270 -354
  7. package/dist/chunk-347APWFM.js +286 -0
  8. package/dist/chunk-347APWFM.js.map +1 -0
  9. package/dist/chunk-3URQAGD7.js +98 -0
  10. package/dist/chunk-3URQAGD7.js.map +1 -0
  11. package/dist/chunk-7GHJU5WI.js +39 -0
  12. package/dist/chunk-7GHJU5WI.js.map +1 -0
  13. package/dist/chunk-B4MNHGBP.js +8 -0
  14. package/dist/chunk-B4MNHGBP.js.map +1 -0
  15. package/dist/{chunk-KDMV222Q.js → chunk-F6KHUW7T.js} +304 -373
  16. package/dist/chunk-F6KHUW7T.js.map +1 -0
  17. package/dist/chunk-FGT5OS2Y.js +918 -0
  18. package/dist/chunk-FGT5OS2Y.js.map +1 -0
  19. package/dist/chunk-FQLEAMAB.js +24 -0
  20. package/dist/chunk-FQLEAMAB.js.map +1 -0
  21. package/dist/chunk-HEXOGHQ4.js +3264 -0
  22. package/dist/chunk-HEXOGHQ4.js.map +1 -0
  23. package/dist/chunk-JCD6GLBX.js +412 -0
  24. package/dist/chunk-JCD6GLBX.js.map +1 -0
  25. package/dist/{chunk-QUOTJULD.js → chunk-MGLG2XLD.js} +20 -219
  26. package/dist/chunk-MGLG2XLD.js.map +1 -0
  27. package/dist/chunk-MTBEBSNO.js +1293 -0
  28. package/dist/chunk-MTBEBSNO.js.map +1 -0
  29. package/dist/{chunk-X4SC7FGF.js → chunk-RGACZEYC.js} +99 -96
  30. package/dist/chunk-RGACZEYC.js.map +1 -0
  31. package/dist/{chunk-RYPVOI6H.js → chunk-UZPYYI37.js} +524 -26
  32. package/dist/{chunk-RYPVOI6H.js.map → chunk-UZPYYI37.js.map} +1 -1
  33. package/dist/chunk-VG7BRFUD.js +152 -0
  34. package/dist/chunk-VG7BRFUD.js.map +1 -0
  35. package/dist/chunk-Y2DYZPP5.js +2329 -0
  36. package/dist/chunk-Y2DYZPP5.js.map +1 -0
  37. package/dist/chunk-ZEI7C32D.js +1566 -0
  38. package/dist/chunk-ZEI7C32D.js.map +1 -0
  39. package/dist/{domain-Dz3jP-UM.d.ts → domain-CfKPpXCP.d.ts} +51 -51
  40. package/dist/{effect-result-Bebwu9yT.d.ts → effect-result-DPERsn_v.d.ts} +641 -851
  41. package/dist/{effect-CiEVLsZz.d.ts → effect-wP-IdRt2.d.ts} +236 -443
  42. package/dist/{expression-D0Fs0riG.d.ts → expression-DirYKz-f.d.ts} +5 -13
  43. package/dist/factory/index.d.ts +7 -144
  44. package/dist/factory/index.js +8 -8
  45. package/dist/factory-runtime/index.d.ts +7 -6
  46. package/dist/factory-runtime/index.js +527 -8
  47. package/dist/factory-runtime/index.js.map +1 -1
  48. package/dist/fixtures.d.ts +9 -11
  49. package/dist/fixtures.js +12 -8
  50. package/dist/fixtures.js.map +1 -1
  51. package/dist/i18n/index.d.ts +15 -19
  52. package/dist/i18n/index.js +2 -1
  53. package/dist/{index-BC-Jycqj.d.ts → index-DomgmRBG.d.ts} +29 -729
  54. package/dist/index.d.ts +69 -247
  55. package/dist/index.js +322 -986
  56. package/dist/index.js.map +1 -1
  57. package/dist/kernel-wire.d.ts +3 -3
  58. package/dist/kernel-wire.js +3 -79
  59. package/dist/kernel-wire.js.map +1 -1
  60. package/dist/language/constructs.json +22 -2
  61. package/dist/language/program-types.json +203 -22
  62. package/dist/language/protocols.json +46 -0
  63. package/dist/language/ui-vocabulary.json +1697 -0
  64. package/dist/language/validation-codes.json +1205 -1215
  65. package/dist/language/vocabulary.json +44 -8
  66. package/dist/language-data.d.ts +7 -4
  67. package/dist/language-data.js +20 -14
  68. package/dist/language-data.js.map +1 -1
  69. package/dist/patterns/component-mapping.json +11 -1
  70. package/dist/patterns/definitions.d.ts +2 -2
  71. package/dist/patterns/definitions.js +1 -1
  72. package/dist/patterns/event-contracts.json +1 -15
  73. package/dist/patterns/index.d.ts +24 -120
  74. package/dist/patterns/index.js +3 -3
  75. package/dist/patterns/patterns-registry.json +522 -24
  76. package/dist/patterns/registry.json +522 -24
  77. package/dist/trait-CzG9M89M.d.ts +3519 -0
  78. package/dist/types/index.d.ts +9 -10
  79. package/dist/types/index.js +11 -5
  80. package/dist/{types-DGwrltUF.d.ts → types-BHlTjwWd.d.ts} +3 -3
  81. package/fixtures/events-wire/client-effects-by-trait/response.json +0 -18
  82. package/fixtures/events-wire/client-effects-provenance/response.json +0 -18
  83. package/fixtures/events-wire/effect-results-every-kind/response.json +2 -27
  84. package/fixtures/events-wire/navigate-1/response.json +8 -5
  85. package/fixtures/events-wire/navigate-2/response.json +11 -8
  86. package/fixtures/events-wire/navigate-3/response.json +14 -11
  87. package/fixtures/events-wire/navigate-back/response.json +7 -4
  88. package/fixtures/events-wire/render-ui-3/response.json +12 -9
  89. package/fixtures/events-wire/render-ui-clear/response.json +0 -7
  90. package/fixtures/events-wire/sse-stream/response.json +0 -20
  91. package/fixtures/events-wire/sse-stream/stream.json +0 -20
  92. package/fixtures/events-wire/stateless-traits/response.json +14 -5
  93. package/fixtures/kernel-wire/golden/basic-entity.json +1687 -0
  94. package/fixtures/kernel-wire/golden/entity-rerender.json +743 -0
  95. package/fixtures/kernel-wire/golden/rollback.json +793 -0
  96. package/fixtures/kernel-wire/golden/tick-counter.json +1538 -0
  97. package/fixtures/kernel-wire/golden/two-orbital-chore.json +847 -0
  98. package/fixtures/kernel-wire/golden/two-orbital-task.json +457 -0
  99. package/fixtures/kernel-wire/played-step.json +136 -0
  100. package/fixtures/kernel-wire/scripts/basic-entity.json +28 -0
  101. package/fixtures/kernel-wire/scripts/entity-rerender.json +13 -0
  102. package/fixtures/kernel-wire/scripts/rollback.json +53 -0
  103. package/fixtures/kernel-wire/scripts/tick-counter.json +26 -0
  104. package/fixtures/kernel-wire/scripts/two-orbital-chore.json +9 -0
  105. package/fixtures/kernel-wire/scripts/two-orbital-task.json +9 -0
  106. package/package.json +28 -19
  107. package/dist/builders-DmZE5By0.d.ts +0 -2663
  108. package/dist/chunk-45I2O4SJ.js +0 -4646
  109. package/dist/chunk-45I2O4SJ.js.map +0 -1
  110. package/dist/chunk-6LR43Z5E.js +0 -3061
  111. package/dist/chunk-6LR43Z5E.js.map +0 -1
  112. package/dist/chunk-GIUA3NUJ.js +0 -809
  113. package/dist/chunk-GIUA3NUJ.js.map +0 -1
  114. package/dist/chunk-GTY53NS5.js +0 -1908
  115. package/dist/chunk-GTY53NS5.js.map +0 -1
  116. package/dist/chunk-JOHDVS6J.js +0 -1614
  117. package/dist/chunk-JOHDVS6J.js.map +0 -1
  118. package/dist/chunk-KDMV222Q.js.map +0 -1
  119. package/dist/chunk-QRHJUS3D.js +0 -23
  120. package/dist/chunk-QRHJUS3D.js.map +0 -1
  121. package/dist/chunk-QUOTJULD.js.map +0 -1
  122. package/dist/chunk-V5VNGRVU.js +0 -66
  123. package/dist/chunk-V5VNGRVU.js.map +0 -1
  124. package/dist/chunk-X4SC7FGF.js.map +0 -1
  125. package/dist/entityAccess-BPSz1i2n.d.ts +0 -80
  126. package/dist/mock/index.d.ts +0 -153
  127. package/dist/mock/index.js +0 -190
  128. package/dist/mock/index.js.map +0 -1
  129. package/dist/schema-T5RT5s6H.d.ts +0 -282
  130. package/dist/state-machine/index.d.ts +0 -359
  131. package/dist/state-machine/index.js +0 -3
  132. package/dist/state-machine/index.js.map +0 -1
@@ -1,17 +1,15 @@
1
1
  import * as nodeCrypto from 'crypto';
2
2
  import * as nodeChildProcess from 'child_process';
3
3
  import * as nodeFs from 'fs';
4
- import * as nodeModule from 'module';
5
4
  import * as nodeOs from 'os';
6
5
  import * as nodePath from 'path';
7
6
  import { z } from 'zod';
8
7
 
9
8
  // src/behavior-package.ts
10
9
  var { createHash } = nodeCrypto;
11
- var { copyFileSync, existsSync, mkdirSync, readdirSync: readdirSync2, readFileSync, realpathSync, renameSync, rmSync, statSync, writeFileSync } = nodeFs;
12
- var { createRequire } = nodeModule;
10
+ var { copyFileSync, existsSync, mkdirSync, readdirSync: readdirSync2, readFileSync, realpathSync, renameSync, rmSync, statSync, utimesSync, writeFileSync } = nodeFs;
13
11
  var { homedir } = nodeOs;
14
- var { dirname, isAbsolute, join: join2, relative: relative2, resolve, sep } = nodePath;
12
+ var { dirname, isAbsolute, join: join2, relative: relative2, resolve } = nodePath;
15
13
  var BehaviorPackageOrbBlockSchema = z.object({
16
14
  prefix: z.string().min(1),
17
15
  /** A materialized tree of lowered `.orb` programs (a published package). */
@@ -19,7 +17,8 @@ var BehaviorPackageOrbBlockSchema = z.object({
19
17
  /** The `.lolo` sources, lowered on read when no `registry` is declared (a workspace package). */
20
18
  source: z.string().min(1).optional(),
21
19
  vectors: z.string().min(1).optional(),
22
- compiler: z.string().min(1)
20
+ /** The language versions the package is written for (`@almadar/core`'s `orbLanguage.version`). */
21
+ language: z.string().min(1)
23
22
  }).refine((orb) => orb.registry !== void 0 || orb.source !== void 0, {
24
23
  message: "declares neither `registry` (materialized) nor `source` (live)"
25
24
  });
@@ -143,7 +142,6 @@ async function ensureDeclaredPath(pkg, relPath, options = {}) {
143
142
  function userStoreDir() {
144
143
  return join2(homedir(), ".orb");
145
144
  }
146
- var BEHAVIOR_BLOCK_FIELDS = ["prefix", "registry", "source"];
147
145
  function packageDirs(nodeModules) {
148
146
  if (!existsSync(nodeModules)) return [];
149
147
  const out = [];
@@ -158,11 +156,6 @@ function packageDirs(nodeModules) {
158
156
  }
159
157
  return out.sort((a, b) => a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0).map(([, path]) => path);
160
158
  }
161
- function isBehaviorManifest(manifestPath) {
162
- const manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
163
- const orb = manifest.orb;
164
- return orb !== void 0 && orb !== null && typeof orb === "object" && BEHAVIOR_BLOCK_FIELDS.some((field) => field in orb);
165
- }
166
159
  function installedPackageDirs(startDir, userStore = userStoreDir()) {
167
160
  const rungs = [];
168
161
  for (let dir = resolve(startDir); ; dir = dirname(dir)) {
@@ -179,29 +172,46 @@ function installedPackageDirs(startDir, userStore = userStoreDir()) {
179
172
  }
180
173
  return out;
181
174
  }
182
- function discoverBehaviorPackages(startDir, userStore = userStoreDir()) {
183
- const found = [];
184
- const seen = /* @__PURE__ */ new Set();
185
- for (const dir of installedPackageDirs(startDir, userStore)) {
186
- if (!isBehaviorManifest(join2(dir, "package.json"))) continue;
187
- const pkg = readBehaviorPackage(dir);
188
- if (seen.has(pkg.name)) continue;
189
- seen.add(pkg.name);
190
- found.push(pkg);
191
- }
192
- const byPrefix = /* @__PURE__ */ new Map();
193
- for (const pkg of found) {
194
- const other = byPrefix.get(pkg.orb.prefix);
195
- if (other && other.name !== pkg.name) {
196
- throw new BehaviorPackageError(`prefix \`${pkg.orb.prefix}\` is claimed by ${other.name} (${other.root}) and ${pkg.name} (${pkg.root})`);
197
- }
198
- byPrefix.set(pkg.orb.prefix, pkg);
199
- }
200
- return found;
175
+ var DiscoveredRowSchema = z.object({
176
+ name: z.string(),
177
+ version: z.string(),
178
+ root: z.string(),
179
+ prefix: z.string().min(1),
180
+ registry: z.string().min(1).optional(),
181
+ source: z.string().min(1).optional(),
182
+ vectors: z.string().min(1).optional(),
183
+ language: z.string().min(1),
184
+ lock: SidecarLockSchema.optional()
185
+ });
186
+ function discoverBehaviorPackages(startDir, options = {}) {
187
+ const start = resolve(startDir);
188
+ const orbBin = options.orbBin ?? resolveOrbBinary(start);
189
+ const run = nodeChildProcess.spawnSync(orbBin, ["list", "--json", "--ancestors"], {
190
+ cwd: start,
191
+ encoding: "utf8",
192
+ maxBuffer: 1024 * 1024 * 64,
193
+ env: options.home !== void 0 ? { ...process.env, HOME: options.home } : process.env
194
+ });
195
+ if (run.error !== void 0) throw new BehaviorPackageError(`${orbBin} list --ancestors: ${run.error.message}`);
196
+ if (run.status !== 0) throw new BehaviorPackageError(`${orbBin} list --ancestors exited ${run.status}: ${run.stderr.trim()}`);
197
+ return DiscoveredRowSchema.array().parse(JSON.parse(run.stdout)).map((row) => ({
198
+ name: row.name,
199
+ version: row.version,
200
+ root: row.root,
201
+ orb: {
202
+ prefix: row.prefix,
203
+ language: row.language,
204
+ ...row.registry !== void 0 ? { registry: row.registry } : {},
205
+ ...row.source !== void 0 ? { source: row.source } : {},
206
+ ...row.vectors !== void 0 ? { vectors: row.vectors } : {}
207
+ },
208
+ lock: row.lock ?? null
209
+ }));
201
210
  }
202
211
  function findInstalledBehaviorPackage(name, fromDir) {
203
- const req = createRequire(join2(resolve(fromDir), "noop.js"));
204
- return readBehaviorPackage(dirname(req.resolve(`${name}/package.json`)));
212
+ const found = discoverBehaviorPackages(fromDir).find((pkg) => pkg.name === name);
213
+ if (found === void 0) throw new BehaviorPackageError(`${name} is not an installed behavior package from ${resolve(fromDir)}`);
214
+ return found;
205
215
  }
206
216
  function resolveDeclaredFile(pkg, key, options = {}) {
207
217
  const declared = pkg.orb[key];
@@ -258,25 +268,14 @@ function lowererKey(orbBin, pkgRoot) {
258
268
  if (!coreRoot) return hash.update("\0no-core").digest("hex");
259
269
  const manifest = JSON.parse(readFileSync(join2(coreRoot, "package.json"), "utf8"));
260
270
  for (const [field, rel] of Object.entries(manifest.orbLanguage ?? {}).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0)) {
271
+ if (field === "version" || field === "sources") continue;
272
+ if (typeof rel !== "string") throw new BehaviorPackageError(`${coreRoot}/package.json: \`orbLanguage.${field}\` is not a file path`);
261
273
  const path = join2(coreRoot, rel);
262
- if (field === "compiler" || !existsSync(path) || !statSync(path).isFile()) continue;
274
+ if (!existsSync(path) || !statSync(path).isFile()) continue;
263
275
  hash.update(`\0${field}\0${fileHash(path)}`);
264
276
  }
265
277
  return hash.digest("hex");
266
278
  }
267
- function filesWithExtension(dir, extension) {
268
- if (!existsSync(dir)) return [];
269
- const out = [];
270
- for (const entry of readdirSync2(dir, { withFileTypes: true })) {
271
- const path = join2(dir, entry.name);
272
- if (entry.isDirectory()) out.push(...filesWithExtension(path, extension));
273
- else if (entry.name.endsWith(extension)) out.push(path);
274
- }
275
- return out.sort();
276
- }
277
- function mirrorPath(rel) {
278
- return rel.replace(/\.lolo$/, ".orb");
279
- }
280
279
  function mirrorDir(pkg, orbBin, cacheDir) {
281
280
  const key = createHash("sha256").update(`${resolve(pkg.root)}\0${lowererKey(orbBin, pkg.root)}`).digest("hex").slice(0, 32);
282
281
  return join2(cacheDir ?? derivedCacheDir(), "registry", key);
@@ -295,6 +294,22 @@ function pruneRegistryMirrors(keep, options = {}) {
295
294
  }
296
295
  return removed.sort();
297
296
  }
297
+ var REGISTRY_MIRROR_LIMIT = 6;
298
+ var mirrorsInUse = /* @__PURE__ */ new Set();
299
+ function evictOldMirrors(registryRoot, protectedDirs, limit = REGISTRY_MIRROR_LIMIT) {
300
+ if (!existsSync(registryRoot)) return [];
301
+ const mirrors = readdirSync2(registryRoot, { withFileTypes: true }).filter((entry) => entry.isDirectory()).map((entry) => {
302
+ const dir = join2(registryRoot, entry.name);
303
+ return { dir, name: entry.name, used: statSync(dir).mtimeMs };
304
+ }).sort((a, b) => b.used - a.used || (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
305
+ const removed = [];
306
+ for (const mirror of mirrors.slice(limit)) {
307
+ if (protectedDirs.has(mirror.dir)) continue;
308
+ rmSync(mirror.dir, { recursive: true, force: true });
309
+ removed.push(mirror.dir);
310
+ }
311
+ return removed.sort();
312
+ }
298
313
  function behaviorSourceTree(pkg) {
299
314
  if (pkg.orb.registry !== void 0) {
300
315
  return { dir: resolveDeclaredPath(pkg, pkg.orb.registry, {}, "orb.registry"), extension: ".orb" };
@@ -302,61 +317,47 @@ function behaviorSourceTree(pkg) {
302
317
  if (pkg.orb.source === void 0) throw new BehaviorPackageError(`${pkg.name}: declares neither \`orb.registry\` nor \`orb.source\``);
303
318
  return { dir: packageFile(pkg, pkg.orb.source, "orb.source"), extension: ".lolo" };
304
319
  }
320
+ var MaterializeAnswerSchema = z.object({
321
+ dir: z.string().min(1),
322
+ failures: z.array(z.object({ rel: z.string(), error: z.string() }))
323
+ });
305
324
  function behaviorRegistryDir(pkg, options = {}) {
306
- if (pkg.orb.registry !== void 0) return resolveDeclaredPath(pkg, pkg.orb.registry, {}, "orb.registry");
325
+ return behaviorRegistry(pkg, options).dir;
326
+ }
327
+ function assertImportable(pkg, registry, rel) {
328
+ const lolo = rel.replace(/\.orb$/, ".lolo");
329
+ const failed = registry.failures.find((f) => f.rel === lolo);
330
+ if (failed !== void 0) throw new BehaviorPackageError(`${pkg.name}: ${failed.rel} does not lower: ${failed.error}`);
331
+ }
332
+ function behaviorRegistry(pkg, options = {}) {
333
+ if (pkg.orb.registry !== void 0) return { dir: resolveDeclaredPath(pkg, pkg.orb.registry, {}, "orb.registry"), failures: [] };
307
334
  const sourceRel = pkg.orb.source;
308
335
  if (sourceRel === void 0) throw new BehaviorPackageError(`${pkg.name}: declares neither \`orb.registry\` nor \`orb.source\``);
309
336
  const source = packageFile(pkg, sourceRel, "orb.source");
310
337
  const orbBin = options.orbBin ?? resolveOrbBinary();
311
338
  const out = mirrorDir(pkg, orbBin, options.cacheDir);
312
- const hashesPath = join2(out, ".hashes.json");
313
- const previous = existsSync(hashesPath) ? JSON.parse(readFileSync(hashesPath, "utf8")) : {};
314
- const current = {};
315
- const stale = [];
316
- const staleCatalogs = [];
317
- const catalogs = filesWithExtension(source, ".json").filter((file) => relative2(source, file).split(sep).includes("locales"));
318
- for (const file of [...filesWithExtension(source, ".lolo"), ...catalogs]) {
319
- const rel = relative2(source, file);
320
- const { mtimeMs, size } = statSync(file);
321
- const before = previous[rel];
322
- const sha256 = before && before.mtimeMs === mtimeMs && before.size === size ? before.sha256 : createHash("sha256").update(readFileSync(file)).digest("hex");
323
- current[rel] = { sha256, mtimeMs, size };
324
- if (before?.sha256 === sha256 && existsSync(join2(out, mirrorPath(rel)))) continue;
325
- if (rel.endsWith(".lolo")) stale.push(file);
326
- else staleCatalogs.push(file);
327
- }
328
- const batch = options.batch ?? 200;
329
- for (let i = 0; i < stale.length; i += batch) {
330
- const files = stale.slice(i, i + batch);
331
- const run = nodeChildProcess.spawnSync(orbBin, ["lower", ...files], { cwd: pkg.root, encoding: "utf8", maxBuffer: 1024 * 1024 * 1024 });
332
- if (run.status !== 0) throw new BehaviorPackageError(`${pkg.name}: \`orb lower\` failed: ${run.stderr}`);
333
- for (const line of run.stdout.split("\n").filter((l) => l.trim() !== "")) {
334
- const lowered = JSON.parse(line);
335
- if (lowered.error !== void 0 || lowered.orb === void 0) {
336
- throw new BehaviorPackageError(`${pkg.name}: ${lowered.path} does not lower: ${lowered.error ?? "no program"}`);
337
- }
338
- const target = join2(out, mirrorPath(relative2(source, lowered.path)));
339
- mkdirSync(dirname(target), { recursive: true });
340
- const temp = `${target}.${process.pid}.tmp`;
341
- writeFileSync(temp, JSON.stringify(lowered.orb));
342
- renameSync(temp, target);
343
- }
344
- }
345
- for (const file of staleCatalogs) {
346
- const target = join2(out, relative2(source, file));
347
- mkdirSync(dirname(target), { recursive: true });
348
- copyFileSync(file, target);
349
- }
350
- for (const rel of Object.keys(previous)) {
351
- if (!(rel in current)) rmSync(join2(out, mirrorPath(rel)), { force: true });
352
- }
353
339
  mkdirSync(out, { recursive: true });
354
- const stamps = JSON.stringify(current);
355
- if (stale.length > 0 || staleCatalogs.length > 0 || stamps !== JSON.stringify(previous)) writeFileSync(hashesPath, stamps);
356
- return out;
340
+ const usedAt = /* @__PURE__ */ new Date();
341
+ utimesSync(out, usedAt, usedAt);
342
+ mirrorsInUse.add(out);
343
+ evictOldMirrors(dirname(out), mirrorsInUse);
344
+ const cache = options.cacheDir ?? derivedCacheDir();
345
+ const run = nodeChildProcess.spawnSync(orbBin, ["materialize", "--json", relative2(cache, out)], {
346
+ cwd: source,
347
+ encoding: "utf8",
348
+ maxBuffer: 1024 * 1024 * 64,
349
+ env: { ...process.env, ALMADAR_DERIVED_CACHE: cache }
350
+ });
351
+ if (run.error !== void 0) throw new BehaviorPackageError(`${pkg.name}: ${orbBin} materialize: ${run.error.message}`);
352
+ if (run.status !== 0) throw new BehaviorPackageError(`${pkg.name}: \`orb materialize\` failed: ${run.stderr.trim()}`);
353
+ const answer = MaterializeAnswerSchema.safeParse(JSON.parse(run.stdout));
354
+ if (!answer.success) throw new BehaviorPackageError(`${pkg.name}: \`orb materialize --json\` answered an unreadable body: ${answer.error.message}`);
355
+ return { dir: out, failures: answer.data.failures };
357
356
  }
358
357
  function behaviorProgramFiles(pkg, options = {}) {
359
- const root = behaviorRegistryDir(pkg, options);
358
+ const registry = behaviorRegistry(pkg, options);
359
+ const root = registry.dir;
360
+ for (const failed of registry.failures) assertImportable(pkg, registry, failed.rel);
360
361
  const files = /* @__PURE__ */ new Map();
361
362
  const walk = (dir) => {
362
363
  for (const entry of nodeFs.readdirSync(dir, { withFileTypes: true })) {
@@ -393,7 +394,9 @@ function materializeRegistry(pkg, options = {}) {
393
394
  const sourceRel = pkg.orb.source;
394
395
  if (sourceRel === void 0) throw new BehaviorPackageError(`${pkg.name}: declares no \`orb.source\``);
395
396
  const orbBin = options.orbBin ?? resolveOrbBinary();
396
- const mirror = behaviorRegistryDir(pkg, { ...options, orbBin });
397
+ const registry = behaviorRegistry(pkg, { ...options, orbBin });
398
+ for (const failed of registry.failures) throw new BehaviorPackageError(`${pkg.name}: ${failed.rel} does not lower: ${failed.error}`);
399
+ const mirror = registry.dir;
397
400
  const targetRel = options.target ?? "behaviors/registry";
398
401
  const target = join2(pkg.root, targetRel);
399
402
  const source = packageFile(pkg, sourceRel, "orb.source");
@@ -412,6 +415,6 @@ function materializeRegistry(pkg, options = {}) {
412
415
  return { ...pkg.orb, registry: targetRel };
413
416
  }
414
417
 
415
- export { BUILD_INPUTS_LOCK_FILE, BehaviorPackageError, BehaviorPackageOrbBlockSchema, SIDECAR_LOCK_FILE, SidecarLockSchema, behaviorProgramFiles, behaviorRegistryDir, behaviorSourceTree, derivedCacheDir, discoverBehaviorPackages, ensureDeclaredPath, ensureLockEntry, findInstalledBehaviorPackage, installedPackageDirs, materializeRegistry, pruneRegistryMirrors, readBehaviorPackage, readLockFile, resolveDeclaredFile, resolveDeclaredPath, resolveOrbBinary, sidecarCacheDir, userStoreDir };
416
- //# sourceMappingURL=chunk-X4SC7FGF.js.map
417
- //# sourceMappingURL=chunk-X4SC7FGF.js.map
418
+ export { BUILD_INPUTS_LOCK_FILE, BehaviorPackageError, BehaviorPackageOrbBlockSchema, MaterializeAnswerSchema, REGISTRY_MIRROR_LIMIT, SIDECAR_LOCK_FILE, SidecarLockSchema, assertImportable, behaviorProgramFiles, behaviorRegistry, behaviorRegistryDir, behaviorSourceTree, derivedCacheDir, discoverBehaviorPackages, ensureDeclaredPath, ensureLockEntry, evictOldMirrors, findInstalledBehaviorPackage, installedPackageDirs, materializeRegistry, pruneRegistryMirrors, readBehaviorPackage, readLockFile, resolveDeclaredFile, resolveDeclaredPath, resolveOrbBinary, sidecarCacheDir, userStoreDir };
419
+ //# sourceMappingURL=chunk-RGACZEYC.js.map
420
+ //# sourceMappingURL=chunk-RGACZEYC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/behavior-package.ts"],"names":["readdirSync","join","relative"],"mappings":"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","file":"chunk-RGACZEYC.js","sourcesContent":["/**\n * The `orb` block a behavior package declares in its `package.json`\n * (`docs/Almadar_Behavior_Packages.md` §3) and the one resolver for the files it\n * declares. Readers resolve sidecars through these declared paths, never through\n * a hardcoded package layout. The walk over installed packages is `orb list --json --ancestors` (`orbital_core::behavior_packages::discover`).\n *\n * Node-only (reads `package.json` with `node:fs`): exported from the\n * `@almadar/core/behavior-package` subpath only, never the main entry, so browser\n * bundles never pull in `node:fs` (the `@almadar/core/fixtures` precedent).\n *\n * @packageDocumentation\n */\n// Namespace imports: a browser bundle that reaches this Node-only module through a\n// dynamic import (the runtime's external loader) can still link it against the\n// bundler's empty builtin stubs — named imports would fail to bind.\nimport * as nodeCrypto from 'node:crypto';\nimport * as nodeChildProcess from 'node:child_process';\nimport * as nodeFs from 'node:fs';\nimport * as nodeOs from 'node:os';\nimport * as nodePath from 'node:path';\nimport { z } from 'zod';\n\nconst { createHash } = nodeCrypto;\nconst { copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync, realpathSync, renameSync, rmSync, statSync, utimesSync, writeFileSync } = nodeFs;\nconst { homedir } = nodeOs;\nconst { dirname, isAbsolute, join, relative, resolve } = nodePath;\n\nexport const BehaviorPackageOrbBlockSchema = z\n .object({\n prefix: z.string().min(1),\n /** A materialized tree of lowered `.orb` programs (a published package). */\n registry: z.string().min(1).optional(),\n /** The `.lolo` sources, lowered on read when no `registry` is declared (a workspace package). */\n source: z.string().min(1).optional(),\n vectors: z.string().min(1).optional(),\n /** The language versions the package is written for (`@almadar/core`'s `orbLanguage.version`). */\n language: z.string().min(1),\n })\n .refine((orb) => orb.registry !== undefined || orb.source !== undefined, {\n message: 'declares neither `registry` (materialized) nor `source` (live)',\n });\n\nexport type BehaviorPackageOrbBlock = z.infer<typeof BehaviorPackageOrbBlockSchema>;\n\nconst PackageManifestSchema = z.object({\n name: z.string().default(''),\n version: z.string().default(''),\n orb: BehaviorPackageOrbBlockSchema.optional(),\n});\n\n/** `sidecars.lock.json` — package-relative paths whose content lives in the sidecar store (§13). */\nexport const SidecarLockSchema = z.object({\n version: z.literal(1),\n files: z.record(\n z.string(),\n z.object({\n sha256: z.string().regex(/^[0-9a-f]{64}$/),\n bytes: z.number().int().nonnegative(),\n url: z.string().url(),\n }),\n ),\n});\n\nexport type SidecarLock = z.infer<typeof SidecarLockSchema>;\nexport type SidecarLockEntry = SidecarLock['files'][string];\n\nexport type DeclaredFileKey = 'vectors';\n\nexport interface BehaviorPackage {\n name: string;\n version: string;\n root: string;\n orb: BehaviorPackageOrbBlock;\n /** The package's `sidecars.lock.json`, or `null` when it ships none. */\n lock: SidecarLock | null;\n}\n\n/** Fetches a lock entry's url and returns its (decoded) bytes. Injected in tests. */\nexport type SidecarFetch = (url: string) => Promise<Uint8Array>;\n\nexport interface SidecarOptions {\n /** Default: `ALMADAR_SIDECAR_CACHE`, else `~/.almadar/sidecars`. */\n cacheDir?: string;\n fetch?: SidecarFetch;\n}\n\nexport class BehaviorPackageError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'BehaviorPackageError';\n }\n}\n\n/** Read the behavior package rooted at `root`; refuses a `package.json` with no `orb` block. */\nexport function readBehaviorPackage(root: string): BehaviorPackage {\n const manifest = join(root, 'package.json');\n const result = PackageManifestSchema.safeParse(JSON.parse(readFileSync(manifest, 'utf8')));\n if (!result.success) {\n throw new BehaviorPackageError(`${manifest}: malformed \\`orb\\` block — ${result.error.message}`);\n }\n const { name, version, orb } = result.data;\n if (!orb) {\n throw new BehaviorPackageError(`${manifest} declares no \\`orb\\` block — not a behavior package`);\n }\n return { name, version, root, orb, lock: readSidecarLock(root) };\n}\n\n/** Runtime sidecars: shipped, resolved on demand. */\nexport const SIDECAR_LOCK_FILE = 'sidecars.lock.json';\n/** Build inputs: committed, not shipped; restored into the package before a build. */\nexport const BUILD_INPUTS_LOCK_FILE = 'build-inputs.lock.json';\n\n/** Read a package lock file (`SIDECAR_LOCK_FILE` or `BUILD_INPUTS_LOCK_FILE`); `null` when the package has none. */\nexport function readLockFile(root: string, lockFile: string = SIDECAR_LOCK_FILE): SidecarLock | null {\n const lockPath = join(root, lockFile);\n if (!existsSync(lockPath)) return null;\n const result = SidecarLockSchema.safeParse(JSON.parse(readFileSync(lockPath, 'utf8')));\n if (!result.success) {\n throw new BehaviorPackageError(`${lockPath}: malformed ${lockFile} — ${result.error.message}`);\n }\n return result.data;\n}\n\nfunction readSidecarLock(root: string): SidecarLock | null {\n return readLockFile(root, SIDECAR_LOCK_FILE);\n}\n\nexport function sidecarCacheDir(): string {\n return process.env['ALMADAR_SIDECAR_CACHE'] || join(homedir(), '.almadar', 'sidecars');\n}\n\nconst defaultFetch: SidecarFetch = async (url) => {\n const response = await fetch(url);\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n return new Uint8Array(await response.arrayBuffer());\n};\n\nfunction urlHost(url: string): string {\n return new URL(url).host;\n}\n\nfunction hashMismatch(pkg: Pick<BehaviorPackage, 'name' | 'version'>, relPath: string, entry: SidecarLockEntry, detail: string): BehaviorPackageError {\n return new BehaviorPackageError(\n `ORB_SIDECAR_HASH_MISMATCH: ${pkg.name}@${pkg.version} ${relPath} — expected sha256 ${entry.sha256} (${entry.bytes} bytes), ${detail}`,\n );\n}\n\nfunction packageFile(pkg: BehaviorPackage, relPath: string, label: string): string {\n const absolute = resolve(pkg.root, relPath);\n const rel = relative(pkg.root, absolute);\n if (rel.startsWith('..') || isAbsolute(rel)) {\n throw new BehaviorPackageError(`${pkg.name}: ${label} = \"${relPath}\" points outside the package`);\n }\n if (!existsSync(absolute)) {\n throw new BehaviorPackageError(`${pkg.name}@${pkg.version}: ${label} declares \"${relPath}\", which is not in the package`);\n }\n return absolute;\n}\n\n/**\n * Sync resolution of a declared path (§13 rule): a lock-declared path resolves to its cache\n * file and fails with ORB_SIDECAR_NOT_CACHED when absent; any other path is read from the package.\n */\nexport function resolveDeclaredPath(pkg: BehaviorPackage, relPath: string, options: SidecarOptions = {}, label = 'declared path'): string {\n const entry = pkg.lock?.files[relPath];\n if (!entry) return packageFile(pkg, relPath, label);\n const cached = join(options.cacheDir ?? sidecarCacheDir(), entry.sha256);\n if (!existsSync(cached)) {\n throw new BehaviorPackageError(\n `ORB_SIDECAR_NOT_CACHED: ${pkg.name}@${pkg.version} ${relPath} (sha256 ${entry.sha256}) is not in the sidecar cache — resolve it with ensureDeclaredPath or \\`npx @almadar/db sidecars pull\\``,\n );\n }\n if (statSync(cached).size !== entry.bytes) throw hashMismatch(pkg, relPath, entry, `cached file has ${statSync(cached).size} bytes`);\n return cached;\n}\n\n/** Ensures one lock entry is in the cache (downloading and verifying it on a miss) and returns the cache file. */\nexport async function ensureLockEntry(\n pkg: Pick<BehaviorPackage, 'name' | 'version'>,\n relPath: string,\n entry: SidecarLockEntry,\n options: SidecarOptions = {},\n): Promise<string> {\n const cacheDir = options.cacheDir ?? sidecarCacheDir();\n const cached = join(cacheDir, entry.sha256);\n if (existsSync(cached)) {\n if (statSync(cached).size !== entry.bytes) throw hashMismatch(pkg, relPath, entry, `cached file has ${statSync(cached).size} bytes`);\n return cached;\n }\n let bytes: Uint8Array;\n try {\n bytes = await (options.fetch ?? defaultFetch)(entry.url);\n } catch (error) {\n throw new BehaviorPackageError(\n `ORB_SIDECAR_FETCH_FAILED: ${pkg.name}@${pkg.version} ${relPath} (sha256 ${entry.sha256}) from ${urlHost(entry.url)} — ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n const actual = createHash('sha256').update(bytes).digest('hex');\n if (actual !== entry.sha256 || bytes.byteLength !== entry.bytes) {\n throw hashMismatch(pkg, relPath, entry, `downloaded ${bytes.byteLength} bytes with sha256 ${actual}`);\n }\n mkdirSync(cacheDir, { recursive: true });\n const temp = `${cached}.${process.pid}.tmp`;\n writeFileSync(temp, bytes);\n renameSync(temp, cached);\n return cached;\n}\n\n/** Async resolution of a declared path: a lock-declared path is downloaded and verified into the cache on a miss. */\nexport async function ensureDeclaredPath(pkg: BehaviorPackage, relPath: string, options: SidecarOptions = {}): Promise<string> {\n const entry = pkg.lock?.files[relPath];\n if (!entry) return packageFile(pkg, relPath, 'declared path');\n return ensureLockEntry(pkg, relPath, entry, options);\n}\n\n/** The user store (`~/.orb`): the last rung of discovery, after every ancestor `node_modules`. */\nexport function userStoreDir(): string {\n return join(homedir(), '.orb');\n}\n\nfunction packageDirs(nodeModules: string): string[] {\n if (!existsSync(nodeModules)) return [];\n const out: Array<[string, string]> = [];\n for (const entry of readdirSync(nodeModules)) {\n const path = join(nodeModules, entry);\n if (entry.startsWith('@')) {\n if (!existsSync(path) || !statSync(path).isDirectory()) continue;\n for (const sub of readdirSync(path)) out.push([`${entry}/${sub}`, join(path, sub)]);\n } else {\n out.push([entry, path]);\n }\n }\n return out.sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0)).map(([, path]) => path);\n}\n\n/**\n * Every installed package directory, the node-style rule `orb` uses\n * (`orbital-core` `behavior_packages`): each ancestor `node_modules` of\n * `startDir`, nearest first, then the user store's; scoped and unscoped; only\n * directories holding a `package.json`. Real paths; a package name may repeat\n * across rungs (callers keep the nearest).\n */\nexport function installedPackageDirs(startDir: string, userStore: string = userStoreDir()): string[] {\n const rungs: string[] = [];\n for (let dir = resolve(startDir); ; dir = dirname(dir)) {\n rungs.push(join(dir, 'node_modules'));\n if (dirname(dir) === dir) break;\n }\n rungs.push(join(userStore, 'node_modules'));\n const out: string[] = [];\n for (const nodeModules of rungs) {\n for (const dir of packageDirs(nodeModules)) {\n if (!existsSync(join(dir, 'package.json')) || !statSync(dir).isDirectory()) continue;\n out.push(realpathSync(dir));\n }\n }\n return out;\n}\n\n/** One row of `orb list --json --ancestors`: an installed behavior package, as the kernel's discovery reads it. */\nconst DiscoveredRowSchema = z.object({\n name: z.string(),\n version: z.string(),\n root: z.string(),\n prefix: z.string().min(1),\n registry: z.string().min(1).optional(),\n source: z.string().min(1).optional(),\n vectors: z.string().min(1).optional(),\n language: z.string().min(1),\n lock: SidecarLockSchema.optional(),\n});\n\nexport interface DiscoverOptions {\n /** The `orb` binary; default {@link resolveOrbBinary} from `startDir`. */\n orbBin?: string;\n /** The home whose `.orb` is the user store (the last rung); default the process's. */\n home?: string;\n}\n\n/**\n * Every installed behavior package, as `orb` discovers them (`orbital-core` `behavior_packages::discover`, the std\n * `orb list --json --ancestors` command): each ancestor `node_modules` of `startDir`, nearest first, then the user\n * store's; nearest wins per name; two packages claiming one prefix is an error.\n */\nexport function discoverBehaviorPackages(startDir: string, options: DiscoverOptions = {}): BehaviorPackage[] {\n const start = resolve(startDir);\n const orbBin = options.orbBin ?? resolveOrbBinary(start);\n const run = nodeChildProcess.spawnSync(orbBin, ['list', '--json', '--ancestors'], {\n cwd: start,\n encoding: 'utf8',\n maxBuffer: 1024 * 1024 * 64,\n env: options.home !== undefined ? { ...process.env, HOME: options.home } : process.env,\n });\n if (run.error !== undefined) throw new BehaviorPackageError(`${orbBin} list --ancestors: ${run.error.message}`);\n if (run.status !== 0) throw new BehaviorPackageError(`${orbBin} list --ancestors exited ${run.status}: ${run.stderr.trim()}`);\n return DiscoveredRowSchema.array()\n .parse(JSON.parse(run.stdout))\n .map((row) => ({\n name: row.name,\n version: row.version,\n root: row.root,\n orb: {\n prefix: row.prefix,\n language: row.language,\n ...(row.registry !== undefined ? { registry: row.registry } : {}),\n ...(row.source !== undefined ? { source: row.source } : {}),\n ...(row.vectors !== undefined ? { vectors: row.vectors } : {}),\n },\n lock: row.lock ?? null,\n }));\n}\n\n/** Resolve an installed behavior package by name, node-style, from `fromDir`. */\nexport function findInstalledBehaviorPackage(name: string, fromDir: string): BehaviorPackage {\n const found = discoverBehaviorPackages(fromDir).find((pkg) => pkg.name === name);\n if (found === undefined) throw new BehaviorPackageError(`${name} is not an installed behavior package from ${resolve(fromDir)}`);\n return found;\n}\n\n/** The absolute path of a file (or the registry directory) the package declares. Fails when it is missing. */\nexport function resolveDeclaredFile(pkg: BehaviorPackage, key: DeclaredFileKey, options: SidecarOptions = {}): string {\n const declared = pkg.orb[key];\n if (declared === undefined) {\n throw new BehaviorPackageError(`${pkg.name}@${pkg.version}: orb.${key} is not declared`);\n }\n return resolveDeclaredPath(pkg, declared, options, `orb.${key}`);\n}\n\n/** The `bin` entry of an installed `@almadar/orb` manifest: a string, or a map whose first entry is the CLI. */\nconst OrbPackageManifest = z.object({ bin: z.union([z.string(), z.record(z.string(), z.string())]).optional() });\n\n/**\n * The `orb` binary, the one rule every TS host uses (G-CROSS-261; the editor's language server too, G-EXTENSIONS-004),\n * from exactly two explicit sources: `ORB_BIN` (a set path must exist: it is refused by name, never skipped), else the\n * binary the `@almadar/orb` installed for `from` declares. Nothing on PATH, in `~/bin` or elsewhere is consulted.\n */\nexport function resolveOrbBinary(from: string = process.cwd()): string {\n const configured = process.env['ORB_BIN'];\n if (configured) {\n if (!existsSync(configured)) throw new BehaviorPackageError(`ORB_BIN is set to ${configured}, which does not exist`);\n return configured;\n }\n const installed = installedOrbBin(from);\n if (installed !== undefined) return installed;\n throw new BehaviorPackageError('no `orb` binary: set ORB_BIN or install @almadar/orb');\n}\n\n/** The CLI the nearest `node_modules/@almadar/orb` walking up from `from` declares in its manifest `bin`. */\nfunction installedOrbBin(from: string): string | undefined {\n for (let dir = resolve(from); ; dir = dirname(dir)) {\n const manifestPath = join(dir, 'node_modules', '@almadar', 'orb', 'package.json');\n if (existsSync(manifestPath)) {\n const parsed = OrbPackageManifest.safeParse(JSON.parse(readFileSync(manifestPath, 'utf8')));\n const bin = !parsed.success || parsed.data.bin === undefined ? undefined : typeof parsed.data.bin === 'string' ? parsed.data.bin : Object.values(parsed.data.bin)[0];\n const path = bin === undefined ? undefined : resolve(dirname(manifestPath), bin);\n return path !== undefined && existsSync(path) ? path : undefined;\n }\n if (dirname(dir) === dir) return undefined;\n }\n}\n\n/** Default: `ALMADAR_DERIVED_CACHE`, else `~/.almadar/derived`. */\nexport function derivedCacheDir(): string {\n return process.env['ALMADAR_DERIVED_CACHE'] || join(homedir(), '.almadar', 'derived');\n}\n\nexport interface RegistryDirOptions {\n orbBin?: string;\n cacheDir?: string;\n}\n\nconst fileHashes = new Map<string, string>();\n\n/** sha256 of a file's bytes, memoized by path, size and mtime. */\nfunction fileHash(path: string): string {\n const stat = statSync(path);\n const memo = `${path}\\0${stat.size}\\0${stat.mtimeMs}`;\n const known = fileHashes.get(memo);\n if (known) return known;\n const hash = createHash('sha256').update(readFileSync(path)).digest('hex');\n fileHashes.set(memo, hash);\n return hash;\n}\n\n/**\n * What a lowering depends on besides the source: the `orb` binary's bytes (a\n * rebuilt binary keeps its version string) and the language data files the\n * `@almadar/core` that `orb` resolves from `pkgRoot` declares (`orbLanguage`,\n * same walk as `orb`: ancestor `node_modules`, then the user store).\n */\nfunction lowererKey(orbBin: string, pkgRoot: string): string {\n const hash = createHash('sha256').update(fileHash(orbBin));\n const rungs: string[] = [];\n for (let dir = resolve(pkgRoot); ; dir = dirname(dir)) {\n rungs.push(join(dir, 'node_modules'));\n if (dirname(dir) === dir) break;\n }\n rungs.push(join(userStoreDir(), 'node_modules'));\n const coreRoot = rungs.map((nm) => join(nm, '@almadar', 'core')).find((dir) => existsSync(join(dir, 'package.json')));\n if (!coreRoot) return hash.update('\\0no-core').digest('hex');\n const manifest = JSON.parse(readFileSync(join(coreRoot, 'package.json'), 'utf8')) as { orbLanguage?: Record<string, string | string[]> };\n for (const [field, rel] of Object.entries(manifest.orbLanguage ?? {}).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))) {\n if (field === 'version' || field === 'sources') continue;\n if (typeof rel !== 'string') throw new BehaviorPackageError(`${coreRoot}/package.json: \\`orbLanguage.${field}\\` is not a file path`);\n const path = join(coreRoot, rel);\n if (!existsSync(path) || !statSync(path).isFile()) continue;\n hash.update(`\\0${field}\\0${fileHash(path)}`);\n }\n return hash.digest('hex');\n}\n\n/** Where a live package's mirror lives: keyed by its root and what lowers it ({@link lowererKey}). */\nfunction mirrorDir(pkg: BehaviorPackage, orbBin: string, cacheDir: string | undefined): string {\n const key = createHash('sha256').update(`${resolve(pkg.root)}\\0${lowererKey(orbBin, pkg.root)}`).digest('hex').slice(0, 32);\n return join(cacheDir ?? derivedCacheDir(), 'registry', key);\n}\n\n/**\n * Delete every live-package mirror under the derived cache except those of\n * `keep` (as the current `orb` keys them) — a new `orb` binary, new language data or a moved\n * checkout leaves the old ones behind. Returns the removed directories.\n * Explicit and total: it removes every mirror not in `keep`. Reading a mirror\n * ({@link behaviorRegistryDir}) separately keeps only the newest\n * {@link REGISTRY_MIRROR_LIMIT}.\n */\nexport function pruneRegistryMirrors(keep: readonly BehaviorPackage[], options: RegistryDirOptions = {}): string[] {\n const orbBin = options.orbBin ?? resolveOrbBinary();\n const kept = new Set(keep.filter((pkg) => pkg.orb.registry === undefined).map((pkg) => mirrorDir(pkg, orbBin, options.cacheDir)));\n const root = join(options.cacheDir ?? derivedCacheDir(), 'registry');\n if (!existsSync(root)) return [];\n const removed: string[] = [];\n for (const entry of readdirSync(root, { withFileTypes: true })) {\n const dir = join(root, entry.name);\n if (!entry.isDirectory() || kept.has(dir)) continue;\n rmSync(dir, { recursive: true, force: true });\n removed.push(dir);\n }\n return removed.sort();\n}\n\n/**\n * The directory of lowered `.orb` programs for `pkg`. A declared `orb.registry`\n * (a published package) is that directory. A live package (`orb.source`, no\n * `registry`) gets a content-addressed mirror under `derivedCacheDir()`, keyed by\n * the package root, the `orb` binary and the installed language data: each `.lolo` whose content hash changed\n * since the last call is re-lowered with `orb lower`, a removed one is pruned, and\n * an unchanged one is never touched; each behavior's `locales/<locale>/<name>.json`\n * catalog is copied beside its program. Same tree layout as a materialized registry,\n * so every reader of `.orb` files works unchanged. A lowering error fails the call,\n * naming the file.\n */\n/**\n * How many live-package mirrors the derived cache keeps. One mirror is a package's full lowered registry\n * (170-360 MB for std), keyed by package root, `orb` binary and language data, so every rebuilt `orb` and every\n * checkout adds one per package. Six holds the current and the previous binary of the two packages a checkout\n * mounts (std, behaviors) plus a second checkout's current pair, and bounds the cache near 2 GB.\n */\nexport const REGISTRY_MIRROR_LIMIT = 6;\n\nconst mirrorsInUse = new Set<string>();\n\n/**\n * Evict the mirrors under `registryRoot` beyond the `limit` most recently used (directory modification time,\n * newest first, ties broken by name), always keeping every directory in `protectedDirs`. Returns the removed\n * directories, sorted.\n */\nexport function evictOldMirrors(registryRoot: string, protectedDirs: ReadonlySet<string>, limit: number = REGISTRY_MIRROR_LIMIT): string[] {\n if (!existsSync(registryRoot)) return [];\n const mirrors = readdirSync(registryRoot, { withFileTypes: true })\n .filter((entry) => entry.isDirectory())\n .map((entry) => {\n const dir = join(registryRoot, entry.name);\n return { dir, name: entry.name, used: statSync(dir).mtimeMs };\n })\n .sort((a, b) => b.used - a.used || (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));\n const removed: string[] = [];\n for (const mirror of mirrors.slice(limit)) {\n if (protectedDirs.has(mirror.dir)) continue;\n rmSync(mirror.dir, { recursive: true, force: true });\n removed.push(mirror.dir);\n }\n return removed.sort();\n}\n\n/**\n * The files a package authors its behaviors in, without lowering anything: a\n * live package's `.lolo` source tree, or a published package's declared registry\n * of `.orb` programs. For tools that read behavior text (a class scanner, a\n * file watcher); a reader of lowered programs uses {@link behaviorRegistryDir}.\n */\nexport function behaviorSourceTree(pkg: BehaviorPackage): { dir: string; extension: '.lolo' | '.orb' } {\n if (pkg.orb.registry !== undefined) {\n return { dir: resolveDeclaredPath(pkg, pkg.orb.registry, {}, 'orb.registry'), extension: '.orb' };\n }\n if (pkg.orb.source === undefined) throw new BehaviorPackageError(`${pkg.name}: declares neither \\`orb.registry\\` nor \\`orb.source\\``);\n return { dir: packageFile(pkg, pkg.orb.source, 'orb.source'), extension: '.lolo' };\n}\n\nexport const MaterializeAnswerSchema = z.object({\n dir: z.string().min(1),\n failures: z.array(z.object({ rel: z.string(), error: z.string() })),\n});\nexport type MaterializeFailure = z.infer<typeof MaterializeAnswerSchema>['failures'][number];\n\nexport interface BehaviorRegistry {\n dir: string;\n /** Sources that did not lower; the rest of the mirror is current. Empty for a materialized registry. */\n failures: MaterializeFailure[];\n}\n\n/** The registry mirror's directory; use {@link behaviorRegistry} to see which sources failed to lower. */\nexport function behaviorRegistryDir(pkg: BehaviorPackage, options: RegistryDirOptions = {}): string {\n return behaviorRegistry(pkg, options).dir;\n}\n\n/**\n * Throws naming the file and its lower error when `rel` (a `.lolo` path relative to the source tree, or its `.orb`\n * twin) is one of the registry's failures.\n */\nexport function assertImportable(pkg: BehaviorPackage, registry: BehaviorRegistry, rel: string): void {\n const lolo = rel.replace(/\\.orb$/, '.lolo');\n const failed = registry.failures.find((f) => f.rel === lolo);\n if (failed !== undefined) throw new BehaviorPackageError(`${pkg.name}: ${failed.rel} does not lower: ${failed.error}`);\n}\n\nexport function behaviorRegistry(pkg: BehaviorPackage, options: RegistryDirOptions = {}): BehaviorRegistry {\n if (pkg.orb.registry !== undefined) return { dir: resolveDeclaredPath(pkg, pkg.orb.registry, {}, 'orb.registry'), failures: [] };\n const sourceRel = pkg.orb.source;\n if (sourceRel === undefined) throw new BehaviorPackageError(`${pkg.name}: declares neither \\`orb.registry\\` nor \\`orb.source\\``);\n const source = packageFile(pkg, sourceRel, 'orb.source');\n const orbBin = options.orbBin ?? resolveOrbBinary();\n const out = mirrorDir(pkg, orbBin, options.cacheDir);\n mkdirSync(out, { recursive: true });\n const usedAt = new Date();\n utimesSync(out, usedAt, usedAt);\n mirrorsInUse.add(out);\n evictOldMirrors(dirname(out), mirrorsInUse);\n const cache = options.cacheDir ?? derivedCacheDir();\n const run = nodeChildProcess.spawnSync(orbBin, ['materialize', '--json', relative(cache, out)], {\n cwd: source,\n encoding: 'utf8',\n maxBuffer: 1024 * 1024 * 64,\n env: { ...process.env, ALMADAR_DERIVED_CACHE: cache },\n });\n if (run.error !== undefined) throw new BehaviorPackageError(`${pkg.name}: ${orbBin} materialize: ${run.error.message}`);\n if (run.status !== 0) throw new BehaviorPackageError(`${pkg.name}: \\`orb materialize\\` failed: ${run.stderr.trim()}`);\n const answer = MaterializeAnswerSchema.safeParse(JSON.parse(run.stdout));\n if (!answer.success) throw new BehaviorPackageError(`${pkg.name}: \\`orb materialize --json\\` answered an unreadable body: ${answer.error.message}`);\n return { dir: out, failures: answer.data.failures };\n}\n\n/**\n * Every behavior program in the package's registry, by behavior name: each `.orb` under the\n * registry tree, named by its basename (the rule `orb` indexes by). Two programs with one name\n * are refused.\n */\nexport function behaviorProgramFiles(pkg: BehaviorPackage, options: RegistryDirOptions = {}): Map<string, string> {\n const registry = behaviorRegistry(pkg, options);\n const root = registry.dir;\n for (const failed of registry.failures) assertImportable(pkg, registry, failed.rel);\n const files = new Map<string, string>();\n const walk = (dir: string): void => {\n for (const entry of nodeFs.readdirSync(dir, { withFileTypes: true })) {\n const full = nodePath.join(dir, entry.name);\n if (entry.isDirectory()) walk(full);\n else if (entry.isFile() && entry.name.endsWith('.orb')) {\n const name = entry.name.slice(0, -'.orb'.length);\n const seen = files.get(name);\n if (seen !== undefined) {\n throw new BehaviorPackageError(`${pkg.name}: two programs named \"${name}\": ${nodePath.relative(root, seen)} and ${nodePath.relative(root, full)}`);\n }\n files.set(name, full);\n }\n }\n };\n walk(root);\n return files;\n}\n\nexport interface MaterializeOptions extends RegistryDirOptions {\n /** Package-relative directory the programs are written into. Default `behaviors/registry`. */\n target?: string;\n}\n\nfunction treeFiles(dir: string): string[] {\n if (!existsSync(dir)) return [];\n const out: string[] = [];\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (entry.name.startsWith('.')) continue;\n const path = join(dir, entry.name);\n if (entry.isDirectory()) out.push(...treeFiles(path));\n else out.push(path);\n }\n return out.sort();\n}\n\n/**\n * Publish-time materialization of a live package (`orb.source`, no\n * `orb.registry`): copies its lowered programs and their catalogs from\n * {@link behaviorRegistryDir} into `target` inside the package, re-emits each\n * program that declares `locales` through `orb emit orb --output` so its merged\n * `<stem>.<locale>.json` catalogs ship beside it, and returns the `orb` block the\n * published manifest declares (`registry` set, `source` kept). Files already in\n * `target` that are not programs are\n * left alone.\n */\nexport function materializeRegistry(pkg: BehaviorPackage, options: MaterializeOptions = {}): BehaviorPackageOrbBlock {\n if (pkg.orb.registry !== undefined) {\n throw new BehaviorPackageError(`${pkg.name}: already declares \\`orb.registry\\` (${pkg.orb.registry}) — only a live package is materialized`);\n }\n const sourceRel = pkg.orb.source;\n if (sourceRel === undefined) throw new BehaviorPackageError(`${pkg.name}: declares no \\`orb.source\\``);\n const orbBin = options.orbBin ?? resolveOrbBinary();\n const registry = behaviorRegistry(pkg, { ...options, orbBin });\n for (const failed of registry.failures) throw new BehaviorPackageError(`${pkg.name}: ${failed.rel} does not lower: ${failed.error}`);\n const mirror = registry.dir;\n const targetRel = options.target ?? 'behaviors/registry';\n const target = join(pkg.root, targetRel);\n const source = packageFile(pkg, sourceRel, 'orb.source');\n for (const file of treeFiles(mirror)) {\n const rel = relative(mirror, file);\n const dest = join(target, rel);\n mkdirSync(dirname(dest), { recursive: true });\n copyFileSync(file, dest);\n if (!rel.endsWith('.orb')) continue;\n const program = JSON.parse(readFileSync(file, 'utf8')) as { locales?: string[] };\n if (program.locales === undefined || program.locales.length === 0) continue;\n const lolo = join(source, rel.replace(/\\.orb$/, '.lolo'));\n const run = nodeChildProcess.spawnSync(orbBin, ['emit', 'orb', lolo, '--output', dest], { cwd: pkg.root, encoding: 'utf8', maxBuffer: 1024 * 1024 * 1024 });\n if (run.status !== 0) throw new BehaviorPackageError(`${pkg.name}: \\`orb emit orb ${rel}\\` failed: ${run.stderr}`);\n }\n return { ...pkg.orb, registry: targetRel };\n}\n"]}