@elaraai/e3 1.0.30 → 1.0.32

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.
@@ -3,6 +3,24 @@
3
3
  * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
4
  */
5
5
  import { type EnvironmentDecl } from './environment.js';
6
+ /**
7
+ * Derive an EnvironmentSpec from a task/function's RUNNER platform references,
8
+ * for tasks that declare no explicit `environment`. Resolves each `{ custom }`
9
+ * platform name to its local workspace member and captures the union of their
10
+ * closures — so a project split into packages gets per-package change-detection
11
+ * granularity with zero `environment` boilerplate. The `environment` field
12
+ * remains the explicit override (and the only way to reach `tools` / `image`,
13
+ * which are never auto-derived).
14
+ *
15
+ * @param runtime - The runner runtime tag (e.g. `east-py`, `east-node`)
16
+ * @param customNames - The `{ custom: X }` platform names declared on the runner
17
+ * @param anchorDir - Directory the workspace is resolved from (the export cwd)
18
+ * @param owner - The declaring task/function name, for error messages
19
+ * @param addBlob - Stores a blob in the bundle's object store, returning its hash
20
+ * @returns The beast2-encoded EnvironmentSpec, or null when nothing local is
21
+ * referenced (no workspace, or every platform is a registry/first-party package)
22
+ */
23
+ export declare function captureAutoEnvironment(runtime: string, customNames: string[], anchorDir: string, owner: string, addBlob: (data: Buffer) => string): Uint8Array | null;
6
24
  /**
7
25
  * Resolves an environment declaration to an encoded {@link EnvironmentSpec}
8
26
  * at package export time.
@@ -1 +1 @@
1
- {"version":3,"file":"environment-capture.d.ts","sourceRoot":"","sources":["../../src/environment-capture.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyBH,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AA6CjF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAChC,UAAU,CA6CZ"}
1
+ {"version":3,"file":"environment-capture.d.ts","sourceRoot":"","sources":["../../src/environment-capture.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA0BH,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAwSjF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EAAE,EACrB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAChC,UAAU,GAAG,IAAI,CAQnB;AAmMD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAChC,UAAU,CA4EZ"}
@@ -21,10 +21,126 @@ import * as fs from 'node:fs';
21
21
  import * as os from 'node:os';
22
22
  import * as path from 'node:path';
23
23
  import { execFileSync } from 'node:child_process';
24
- import { variant, encodeBeast2For } from '@elaraai/east';
24
+ import { parse as parseToml } from 'smol-toml';
25
+ import { variant, none, encodeBeast2For } from '@elaraai/east';
25
26
  import { EnvironmentSpecType } from '@elaraai/e3-types';
26
27
  import { validateEnvironmentDecl } from './environment.js';
27
28
  const encodeEnvironmentSpec = encodeBeast2For(EnvironmentSpecType);
29
+ /** Canonicalize a path for identity comparison — realpath when it exists,
30
+ * case-folded on win32 (uv.lock stores portable forward-slash relatives). */
31
+ function canonicalPath(p) {
32
+ let r = p;
33
+ try {
34
+ r = fs.realpathSync(p);
35
+ }
36
+ catch { /* may not exist yet */ }
37
+ return process.platform === 'win32' ? r.toLowerCase() : r;
38
+ }
39
+ /** The on-disk directory a lock `source` points at, with its kind — or null
40
+ * for registry/git/url sources (installed by uv sync, not captured). */
41
+ function localSource(root, source) {
42
+ if (!source)
43
+ return null;
44
+ for (const kind of ['editable', 'directory', 'virtual']) {
45
+ if (typeof source[kind] === 'string')
46
+ return { dir: path.resolve(root, source[kind]), kind };
47
+ }
48
+ return null;
49
+ }
50
+ /**
51
+ * Find the workspace/standalone root governing `project` and the lock
52
+ * package (`subject`) whose local source resolves to it.
53
+ *
54
+ * @throws {Error} P3 (no lock in project or any ancestor), P5 (unsupported
55
+ * lock version), P4 (lock does not list a package at `project`)
56
+ */
57
+ function discoverPythonRoot(project, owner) {
58
+ let dir = project;
59
+ let lockPath = null;
60
+ for (;;) {
61
+ const candidate = path.join(dir, 'uv.lock');
62
+ if (fs.existsSync(candidate)) {
63
+ lockPath = candidate;
64
+ break;
65
+ }
66
+ const parent = path.dirname(dir);
67
+ if (parent === dir)
68
+ break;
69
+ dir = parent;
70
+ }
71
+ if (!lockPath) {
72
+ throw new Error(`Environment for '${owner}': no uv.lock in '${project}' or any parent — run 'uv lock' in ` +
73
+ `'${project}' (standalone), or add it to [tool.uv.workspace].members of the workspace root and 'uv lock' there`);
74
+ }
75
+ const root = path.dirname(lockPath);
76
+ const lock = parseToml(fs.readFileSync(lockPath, 'utf-8'));
77
+ if (lock.version !== 1) {
78
+ throw new Error(`Environment for '${owner}': unsupported uv.lock version ${lock.version} at '${root}' — update @elaraai/e3 or re-lock with a compatible uv`);
79
+ }
80
+ const projectCanon = canonicalPath(project);
81
+ const subject = (lock.package ?? []).find((p) => {
82
+ const local = localSource(root, p.source);
83
+ return local !== null && canonicalPath(local.dir) === projectCanon;
84
+ });
85
+ if (!subject) {
86
+ throw new Error(`Environment for '${owner}': uv.lock at '${root}' does not list a package at '${project}' — ` +
87
+ `the lockfile is out of date or the project is not a workspace member; run 'uv lock' at '${root}'`);
88
+ }
89
+ return { root, lock, subject: subject.name };
90
+ }
91
+ /**
92
+ * The transitive closure of LOCAL packages reachable from `subject` — the
93
+ * set whose sdists must ride the environment.
94
+ *
95
+ * Walks `dependencies` plus every optional-dependency and dev-dependency
96
+ * group (over-capture is sound: it only over-invalidates). Registry/git/url
97
+ * targets are skipped (uv sync installs them); a `path=<archive>` source is
98
+ * refused, and a virtual package contributes its deps but no sdist.
99
+ *
100
+ * @returns The buildable closure members, sorted by name
101
+ * @throws {Error} P6 (dangling edge), P7 (subject not packaged), P8 (source
102
+ * dir missing), P9 (local archive dependency)
103
+ */
104
+ function pythonClosure(lock, root, subject, owner) {
105
+ const byName = new Map((lock.package ?? []).map((p) => [p.name, p]));
106
+ const build = new Map();
107
+ const seen = new Set();
108
+ const queue = [subject];
109
+ while (queue.length > 0) {
110
+ const name = queue.shift();
111
+ if (seen.has(name))
112
+ continue;
113
+ seen.add(name);
114
+ const pkg = byName.get(name);
115
+ if (!pkg) {
116
+ if (name === subject)
117
+ throw new Error(`Environment for '${owner}': subject '${name}' not in uv.lock`);
118
+ throw new Error(`Environment for '${owner}': uv.lock is inconsistent — depends on unknown '${name}'; run 'uv lock'`);
119
+ }
120
+ if (typeof pkg.source?.path === 'string') {
121
+ throw new Error(`Environment for '${owner}': local archive dependency '${name}' is not supported — use a directory/workspace source or a registry`);
122
+ }
123
+ const local = localSource(root, pkg.source);
124
+ if (!local)
125
+ continue; // registry/git/url — sync installs it; don't recurse
126
+ if (local.kind !== 'virtual') {
127
+ if (!fs.existsSync(local.dir)) {
128
+ throw new Error(`Environment for '${owner}': package '${name}' resolves to '${local.dir}' which does not exist — run 'uv lock' or fix its path`);
129
+ }
130
+ build.set(name, local.dir);
131
+ }
132
+ else if (name === subject) {
133
+ throw new Error(`Environment for '${owner}': '${name}' is a virtual package (no build-system) and cannot be an environment subject`);
134
+ }
135
+ for (const edge of [
136
+ ...(pkg.dependencies ?? []),
137
+ ...Object.values(pkg['optional-dependencies'] ?? {}).flat(),
138
+ ...Object.values(pkg['dev-dependencies'] ?? {}).flat(),
139
+ ])
140
+ queue.push(edge.name);
141
+ }
142
+ return [...build.entries()].map(([name, dir]) => ({ name, dir })).sort((a, b) => (a.name < b.name ? -1 : 1));
143
+ }
28
144
  function readProjectFile(project, name, owner) {
29
145
  const p = path.join(project, name);
30
146
  if (!fs.existsSync(p)) {
@@ -33,6 +149,162 @@ function readProjectFile(project, name, owner) {
33
149
  }
34
150
  return fs.readFileSync(p);
35
151
  }
152
+ /**
153
+ * Walk up from `start` to the nearest `uv.lock`, parse and version-check it.
154
+ * Returns the governing workspace/standalone root + parsed lock, or null when
155
+ * no lock exists in `start` or any ancestor (no uv workspace to derive from).
156
+ *
157
+ * @throws {Error} if a lock is found but its version is unsupported
158
+ */
159
+ function findUvLock(start, owner) {
160
+ let dir = start;
161
+ for (;;) {
162
+ const candidate = path.join(dir, 'uv.lock');
163
+ if (fs.existsSync(candidate)) {
164
+ const lock = parseToml(fs.readFileSync(candidate, 'utf-8'));
165
+ if (lock.version !== 1) {
166
+ throw new Error(`Environment for '${owner}': unsupported uv.lock version ${lock.version} at '${dir}' — update @elaraai/e3 or re-lock with a compatible uv`);
167
+ }
168
+ return { root: dir, lock };
169
+ }
170
+ const parent = path.dirname(dir);
171
+ if (parent === dir)
172
+ return null;
173
+ dir = parent;
174
+ }
175
+ }
176
+ /**
177
+ * Build one sdist per closure member and store it, returning the sorted
178
+ * artifact set. Shared by the explicit `{ python }` capture and the derived
179
+ * platform capture so both produce byte-identical specs for the same closure.
180
+ */
181
+ function buildMemberSdists(closure, owner, addBlob) {
182
+ const sdists = [];
183
+ for (const member of closure) {
184
+ // Build each closure member's sdist in its own out-dir so the artifact set
185
+ // is unambiguous. Installers derive the package name from the filename.
186
+ const outDir = fs.mkdtempSync(path.join(os.tmpdir(), 'e3-env-sdist-'));
187
+ try {
188
+ for (const a of buildArtifacts('uv', ['build', '--sdist', '--out-dir', outDir], member.dir, outDir, '.tar.gz', owner)) {
189
+ sdists.push({ filename: a.filename, hash: addBlob(a.data) });
190
+ }
191
+ }
192
+ finally {
193
+ fs.rmSync(outDir, { recursive: true, force: true });
194
+ }
195
+ }
196
+ sdists.sort((a, b) => (a.filename < b.filename ? -1 : 1));
197
+ return sdists;
198
+ }
199
+ /**
200
+ * Derive a python environment from the platform packages a task's runner
201
+ * references. Each `custom` name that resolves to a LOCAL workspace member
202
+ * (a directory/workspace/editable source in the governing `uv.lock`)
203
+ * contributes its transitive closure; the union rides ONE `python` spec —
204
+ * shared root manifest + lock, union of member sdists (byte-identical to the
205
+ * explicit capture of a project depending on all of them). Registry /
206
+ * first-party names (e.g. `east-py-std`) are skipped — `uv sync` installs
207
+ * them. Returns null when `anchorDir` has no uv workspace or no referenced
208
+ * name is a local member (nothing to capture beyond the ambient runtime).
209
+ */
210
+ function capturePythonPlatforms(customNames, anchorDir, owner, addBlob) {
211
+ const found = findUvLock(anchorDir, owner);
212
+ if (!found)
213
+ return null;
214
+ const { root, lock } = found;
215
+ const subjects = customNames.filter((name) => {
216
+ const pkg = (lock.package ?? []).find((p) => p.name === name);
217
+ return pkg !== undefined && localSource(root, pkg.source) !== null;
218
+ });
219
+ if (subjects.length === 0)
220
+ return null;
221
+ // Union the referenced members' closures, deduped by package name.
222
+ const union = new Map();
223
+ for (const subject of subjects) {
224
+ for (const member of pythonClosure(lock, root, subject, owner))
225
+ union.set(member.name, member.dir);
226
+ }
227
+ const pyproject = addBlob(readProjectFile(root, 'pyproject.toml', owner));
228
+ const lockBlob = addBlob(readProjectFile(root, 'uv.lock', owner));
229
+ const members = [...union.entries()].map(([name, dir]) => ({ name, dir })).sort((a, b) => (a.name < b.name ? -1 : 1));
230
+ const sdists = buildMemberSdists(members, owner, addBlob);
231
+ return encodeEnvironmentSpec(variant('python', { pyproject, lock: lockBlob, sdists }));
232
+ }
233
+ /** Walk up from `start` to the nearest npm lockfile (not pnpm/yarn); null if none. */
234
+ function findNpmRoot(start) {
235
+ const names = ['package-lock.json', 'npm-shrinkwrap.json'];
236
+ let dir = start;
237
+ for (;;) {
238
+ const found = names.find((f) => fs.existsSync(path.join(dir, f)));
239
+ if (found)
240
+ return { root: dir, lock: JSON.parse(fs.readFileSync(path.join(dir, found), 'utf-8')) };
241
+ const parent = path.dirname(dir);
242
+ if (parent === dir)
243
+ return null;
244
+ dir = parent;
245
+ }
246
+ }
247
+ /**
248
+ * Derive a node environment from the platform packages a task's runner
249
+ * references. Each `custom` name that resolves to a LOCAL npm workspace member
250
+ * (matched by package.json name in the governing lockfile) is captured through
251
+ * the same `workspace_node` path as an explicit `{ node }`. Registry /
252
+ * first-party names are skipped. Returns null when `anchorDir` has no npm
253
+ * workspace or no referenced name is a local member.
254
+ *
255
+ * Multiple local node members in ONE task are not unioned yet (that needs a
256
+ * multi-subject `workspace_node` spec) — declare an explicit `environment`.
257
+ */
258
+ function captureNodePlatforms(customNames, anchorDir, owner, addBlob) {
259
+ const found = findNpmRoot(anchorDir);
260
+ if (!found)
261
+ return null;
262
+ const { root, lock } = found;
263
+ const memberDirs = customNames
264
+ .map((name) => {
265
+ const entry = Object.entries(lock.packages ?? {}).find(([p, v]) => p !== '' && !p.startsWith('node_modules/') && v.name === name && v.link !== true);
266
+ return entry ? path.join(root, entry[0]) : null;
267
+ })
268
+ .filter((d) => d !== null);
269
+ if (memberDirs.length === 0)
270
+ return null;
271
+ if (memberDirs.length > 1) {
272
+ throw new Error(`Environment for '${owner}': a task referencing multiple local node packages ` +
273
+ `(${customNames.join(', ')}) needs an explicit \`environment\` — auto-union of npm ` +
274
+ `workspace members is not supported yet`);
275
+ }
276
+ // A single member reuses the explicit workspace_node capture verbatim.
277
+ return captureEnvironment({ node: { project: memberDirs[0] } }, owner, addBlob);
278
+ }
279
+ /**
280
+ * Derive an EnvironmentSpec from a task/function's RUNNER platform references,
281
+ * for tasks that declare no explicit `environment`. Resolves each `{ custom }`
282
+ * platform name to its local workspace member and captures the union of their
283
+ * closures — so a project split into packages gets per-package change-detection
284
+ * granularity with zero `environment` boilerplate. The `environment` field
285
+ * remains the explicit override (and the only way to reach `tools` / `image`,
286
+ * which are never auto-derived).
287
+ *
288
+ * @param runtime - The runner runtime tag (e.g. `east-py`, `east-node`)
289
+ * @param customNames - The `{ custom: X }` platform names declared on the runner
290
+ * @param anchorDir - Directory the workspace is resolved from (the export cwd)
291
+ * @param owner - The declaring task/function name, for error messages
292
+ * @param addBlob - Stores a blob in the bundle's object store, returning its hash
293
+ * @returns The beast2-encoded EnvironmentSpec, or null when nothing local is
294
+ * referenced (no workspace, or every platform is a registry/first-party package)
295
+ */
296
+ export function captureAutoEnvironment(runtime, customNames, anchorDir, owner, addBlob) {
297
+ if (customNames.length === 0)
298
+ return null;
299
+ // east-py resolves against a uv workspace, east-node against an npm
300
+ // workspace. east-c (tools) is never derived — it uses explicit
301
+ // `environment: { tools }`. Unknown runtimes never auto-derive.
302
+ if (runtime === 'east-py')
303
+ return capturePythonPlatforms(customNames, anchorDir, owner, addBlob);
304
+ if (runtime === 'east-node')
305
+ return captureNodePlatforms(customNames, anchorDir, owner, addBlob);
306
+ return null;
307
+ }
36
308
  function buildArtifacts(command, args, project, outDir, extension, owner) {
37
309
  try {
38
310
  execFileSync(command, args, {
@@ -52,6 +324,148 @@ function buildArtifacts(command, args, project, outDir, extension, owner) {
52
324
  }
53
325
  return files.map((f) => ({ filename: f, data: fs.readFileSync(path.join(outDir, f)) }));
54
326
  }
327
+ // ---------------------------------------------------------------------------
328
+ // Node (npm workspace) dependency-closure capture (#280)
329
+ //
330
+ // A `{ node: { project } }` declaration is either a self-contained project
331
+ // (its own lockfile — captured byte-identically to before) or an npm
332
+ // workspace member. For a member we capture the ROOT package.json + lockfile
333
+ // plus an `npm pack` tarball per LOCAL closure member; the materializer
334
+ // (#276) reconstructs a closure-only workspace and `npm ci`s it.
335
+ //
336
+ // Unlike python's `uv pip check`, `npm ci` is NOT a loud oracle — it will
337
+ // silently install a member's unlocked deps from the registry — so the
338
+ // closure walk validates the lock at export (N4/N5) rather than relying on
339
+ // a run-time gate. pnpm workspaces are refused here (N8) until #284.
340
+ // ---------------------------------------------------------------------------
341
+ const NODE_LOCKFILES = ['package-lock.json', 'npm-shrinkwrap.json', 'pnpm-lock.yaml'];
342
+ /** Workspace-relative POSIX path from the root to a dir. */
343
+ function posixRel(root, dir) {
344
+ return path.relative(root, dir).split(path.sep).join('/');
345
+ }
346
+ /** The union of every dependency section's package names. */
347
+ function allDepNames(e) {
348
+ if (!e)
349
+ return [];
350
+ return [
351
+ ...Object.keys(e.dependencies ?? {}),
352
+ ...Object.keys(e.devDependencies ?? {}),
353
+ ...Object.keys(e.optionalDependencies ?? {}),
354
+ ...Object.keys(e.peerDependencies ?? {}),
355
+ ];
356
+ }
357
+ /**
358
+ * Detect whether `project` is a self-contained node project or an npm
359
+ * workspace member, and locate the governing root.
360
+ *
361
+ * @throws {Error} N1 (no lockfile anywhere), N8 (pnpm workspace — unsupported
362
+ * yet), N3 (project is the workspace root), N2 (not a member of the workspace)
363
+ */
364
+ function discoverNodeRoot(project, owner) {
365
+ const ownLock = NODE_LOCKFILES.find((f) => fs.existsSync(path.join(project, f)));
366
+ if (ownLock) {
367
+ // A workspace ROOT also has its own lockfile — but capturing it packs the
368
+ // (usually code-less) root, not a member. Reject: the environment belongs
369
+ // on a member.
370
+ const pkg = JSON.parse(fs.readFileSync(path.join(project, 'package.json'), 'utf-8'));
371
+ if (Array.isArray(pkg.workspaces) && pkg.workspaces.length > 0) {
372
+ throw new Error(`Environment for '${owner}': declare the environment on a workspace member, not the workspace root '${project}'`);
373
+ }
374
+ return { mode: 'single', lockName: ownLock };
375
+ }
376
+ let dir = path.dirname(project);
377
+ for (;;) {
378
+ const found = NODE_LOCKFILES.find((f) => fs.existsSync(path.join(dir, f)));
379
+ if (found) {
380
+ if (found === 'pnpm-lock.yaml') {
381
+ throw new Error(`Environment for '${owner}': pnpm workspaces are not yet supported as environments — use npm workspaces or a single-project env`);
382
+ }
383
+ const root = dir;
384
+ if (path.resolve(root) === path.resolve(project)) {
385
+ throw new Error(`Environment for '${owner}': declare the environment on a workspace member, not the workspace root '${root}'`);
386
+ }
387
+ const lock = JSON.parse(fs.readFileSync(path.join(root, found), 'utf-8'));
388
+ const subject = posixRel(root, project);
389
+ if (!lock.packages || !(subject in lock.packages)) {
390
+ throw new Error(`Environment for '${owner}': '${project}' is not a member of the workspace at '${root}' — add it to "workspaces" and refresh the lockfile, or run 'npm install' in '${project}' for a standalone env`);
391
+ }
392
+ return { mode: 'workspace', root, lock, subject };
393
+ }
394
+ const parent = path.dirname(dir);
395
+ if (parent === dir)
396
+ break;
397
+ dir = parent;
398
+ }
399
+ throw new Error(`Environment for '${owner}': no lockfile in '${project}' or any parent — run 'npm install' there, or add it to a workspace and lock at the root`);
400
+ }
401
+ /**
402
+ * The transitive closure of LOCAL workspace members reachable from `subject`,
403
+ * with export-time lock validation.
404
+ *
405
+ * @returns Closure members (workspace-relative path + package name), sorted by path
406
+ * @throws {Error} N4 (a member's on-disk manifest drifted from the lock — npm
407
+ * ci would silently install unlocked deps), N5 (a dep shadows a workspace
408
+ * member name from the registry), N6 (root depends on a member), N7 (a local
409
+ * dep resolves outside the workspace)
410
+ */
411
+ function npmClosure(lock, root, subject, owner) {
412
+ const pkgs = lock.packages ?? {};
413
+ const memberNames = new Set(Object.entries(pkgs)
414
+ .filter(([p, e]) => p !== '' && !p.includes('node_modules/') && typeof e.name === 'string')
415
+ .map(([, e]) => e.name));
416
+ // N6: the root manifest must not depend on a workspace member.
417
+ for (const dep of allDepNames(pkgs[''])) {
418
+ if (memberNames.has(dep)) {
419
+ throw new Error(`Environment for '${owner}': the workspace root depends on member '${dep}' — move member deps into the members that need them`);
420
+ }
421
+ }
422
+ const resolveDep = (fromPath, dep) => {
423
+ let dir = fromPath;
424
+ for (;;) {
425
+ const key = `${dir ? dir + '/' : ''}node_modules/${dep}`;
426
+ if (pkgs[key])
427
+ return pkgs[key];
428
+ if (!dir)
429
+ return null;
430
+ dir = dir.split('/').slice(0, -1).join('/');
431
+ }
432
+ };
433
+ const included = new Map(); // memberPath -> name
434
+ const seen = new Set();
435
+ const queue = [subject];
436
+ while (queue.length > 0) {
437
+ const memberPath = queue.shift();
438
+ if (seen.has(memberPath))
439
+ continue;
440
+ seen.add(memberPath);
441
+ const entry = pkgs[memberPath];
442
+ if (!entry)
443
+ continue;
444
+ included.set(memberPath, entry.name ?? path.basename(memberPath));
445
+ // N4: the locked dep sections must match the on-disk manifest.
446
+ const onDisk = JSON.parse(fs.readFileSync(path.join(root, ...memberPath.split('/'), 'package.json'), 'utf-8'));
447
+ for (const section of ['dependencies', 'devDependencies', 'optionalDependencies', 'peerDependencies']) {
448
+ if (JSON.stringify(onDisk[section] ?? {}) !== JSON.stringify(entry[section] ?? {})) {
449
+ throw new Error(`Environment for '${owner}': '${memberPath}/package.json' ${section} differ from the lockfile — run 'npm install' to refresh the lock before exporting`);
450
+ }
451
+ }
452
+ for (const dep of allDepNames(entry)) {
453
+ const resolved = resolveDep(memberPath, dep);
454
+ if (resolved?.link) {
455
+ const target = resolved.resolved ?? '';
456
+ if (target === '' || target.startsWith('..') || path.isAbsolute(target)) {
457
+ throw new Error(`Environment for '${owner}': local dependency '${dep}' of '${memberPath}' resolves outside the workspace ('${target}')`);
458
+ }
459
+ queue.push(target);
460
+ }
461
+ else if (memberNames.has(dep)) {
462
+ // N5: name collides with a workspace member but came from the registry.
463
+ throw new Error(`Environment for '${owner}': '${dep}' in '${memberPath}' is satisfied from the registry, not the workspace — align its version to the workspace member (or rename)`);
464
+ }
465
+ }
466
+ }
467
+ return [...included.entries()].map(([p, name]) => ({ path: p, name })).sort((a, b) => (a.path < b.path ? -1 : 1));
468
+ }
55
469
  /**
56
470
  * Resolves an environment declaration to an encoded {@link EnvironmentSpec}
57
471
  * at package export time.
@@ -73,38 +487,76 @@ export function captureEnvironment(decl, owner, addBlob) {
73
487
  validateEnvironmentDecl(decl, owner);
74
488
  spec = variant('image', { digest: decl.image.digest });
75
489
  }
490
+ else if ('tools' in decl) {
491
+ validateEnvironmentDecl(decl, owner);
492
+ // Capture each named prebuilt file as a blob under bin/<basename>,
493
+ // sorted by path so declaration order never affects the env hash. e3
494
+ // builds nothing here — the developer built these.
495
+ const files = decl.tools.files.map((f) => {
496
+ const p = path.resolve(f);
497
+ let stat;
498
+ try {
499
+ stat = fs.statSync(p); // follows symlinks — captures the target's bytes
500
+ }
501
+ catch {
502
+ throw new Error(`Environment for '${owner}': tools file '${f}' not found at '${p}' — build it before export (e3 does not build your binaries)`);
503
+ }
504
+ if (!stat.isFile()) {
505
+ throw new Error(`Environment for '${owner}': tools file '${f}' at '${p}' is not a regular file`);
506
+ }
507
+ return { path: `bin/${path.basename(p)}`, hash: addBlob(fs.readFileSync(p)) };
508
+ });
509
+ files.sort((a, b) => (a.path < b.path ? -1 : 1));
510
+ spec = variant('tools', { files });
511
+ }
76
512
  else if ('python' in decl) {
77
513
  const project = path.resolve(decl.python.project);
78
- const pyproject = addBlob(readProjectFile(project, 'pyproject.toml', owner));
79
- const lock = addBlob(readProjectFile(project, 'uv.lock', owner));
80
- const outDir = fs.mkdtempSync(path.join(os.tmpdir(), 'e3-env-sdist-'));
81
- try {
82
- // Installers derive the package name from the sdist filename — keep it.
83
- const sdists = buildArtifacts('uv', ['build', '--sdist', '--out-dir', outDir], project, outDir, '.tar.gz', owner).map((a) => ({ filename: a.filename, hash: addBlob(a.data) }));
84
- spec = variant('python', { pyproject, lock, sdists });
85
- }
86
- finally {
87
- fs.rmSync(outDir, { recursive: true, force: true });
88
- }
514
+ // Identity + closure come from the governing (root) lock; the ROOT
515
+ // manifest/lockfile are captured so materialization can `uv sync
516
+ // --all-packages` the whole third-party set. A member's own pyproject
517
+ // rides inside its sdist. For a standalone project root === project, so
518
+ // the captured spec is byte-identical to the pre-#278 single-project one.
519
+ const { root, lock, subject } = discoverPythonRoot(project, owner);
520
+ const pyproject = addBlob(readProjectFile(root, 'pyproject.toml', owner));
521
+ const lockBlob = addBlob(readProjectFile(root, 'uv.lock', owner));
522
+ const sdists = buildMemberSdists(pythonClosure(lock, root, subject, owner), owner, addBlob);
523
+ spec = variant('python', { pyproject, lock: lockBlob, sdists });
89
524
  }
90
525
  else {
91
526
  const project = path.resolve(decl.node.project);
92
- const packageJson = addBlob(readProjectFile(project, 'package.json', owner));
93
- const lockName = ['package-lock.json', 'npm-shrinkwrap.json', 'pnpm-lock.yaml']
94
- .find((f) => fs.existsSync(path.join(project, f)));
95
- if (!lockName) {
96
- throw new Error(`Environment for '${owner}': no lockfile (package-lock.json, npm-shrinkwrap.json ` +
97
- `or pnpm-lock.yaml) in project '${project}' — an environment project must be locked ` +
98
- `so the capture is reproducible`);
99
- }
100
- const lock = addBlob(readProjectFile(project, lockName, owner));
101
- const outDir = fs.mkdtempSync(path.join(os.tmpdir(), 'e3-env-pack-'));
102
- try {
103
- const tarballs = buildArtifacts('npm', ['pack', '--pack-destination', outDir], project, outDir, '.tgz', owner).map((a) => addBlob(a.data));
104
- spec = variant('node', { packageJson, lock, tarballs });
527
+ const disco = discoverNodeRoot(project, owner);
528
+ if (disco.mode === 'single') {
529
+ // Self-contained project — today's byte-identical capture.
530
+ const packageJson = addBlob(readProjectFile(project, 'package.json', owner));
531
+ const lock = addBlob(readProjectFile(project, disco.lockName, owner));
532
+ const outDir = fs.mkdtempSync(path.join(os.tmpdir(), 'e3-env-pack-'));
533
+ try {
534
+ const tarballs = buildArtifacts('npm', ['pack', '--pack-destination', outDir], project, outDir, '.tgz', owner).map((a) => addBlob(a.data));
535
+ spec = variant('node', { packageJson, lock, tarballs });
536
+ }
537
+ finally {
538
+ fs.rmSync(outDir, { recursive: true, force: true });
539
+ }
105
540
  }
106
- finally {
107
- fs.rmSync(outDir, { recursive: true, force: true });
541
+ else {
542
+ // npm workspace member capture the ROOT manifest/lock + a pack
543
+ // tarball per LOCAL closure member (validated against the lock).
544
+ const { root, lock, subject } = disco;
545
+ const packageJson = addBlob(readProjectFile(root, 'package.json', owner));
546
+ const lockBlob = addBlob(readProjectFile(root, 'package-lock.json', owner));
547
+ const closure = npmClosure(lock, root, subject, owner);
548
+ const members = closure.map((member) => {
549
+ const memberDir = path.join(root, ...member.path.split('/'));
550
+ const outDir = fs.mkdtempSync(path.join(os.tmpdir(), 'e3-env-pack-'));
551
+ try {
552
+ const built = buildArtifacts('npm', ['pack', '--pack-destination', outDir], memberDir, outDir, '.tgz', owner);
553
+ return { path: member.path, name: member.name, tarball: addBlob(built[0].data) };
554
+ }
555
+ finally {
556
+ fs.rmSync(outDir, { recursive: true, force: true });
557
+ }
558
+ });
559
+ spec = variant('workspace_node', { packageJson, lock: lockBlob, config: none, subject, members });
108
560
  }
109
561
  }
110
562
  return encodeEnvironmentSpec(spec);
@@ -1 +1 @@
1
- {"version":3,"file":"environment-capture.js","sourceRoot":"","sources":["../../src/environment-capture.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"environment-capture.js","sourceRoot":"","sources":["../../src/environment-capture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=environment-capture.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment-capture.spec.d.ts","sourceRoot":"","sources":["../../src/environment-capture.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,239 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ /**
6
+ * Python (uv) dependency-closure capture (#278) — the granularity contract.
7
+ *
8
+ * Builds a real uv workspace and asserts that capturing a member takes
9
+ * exactly its transitive LOCAL closure, and — the point of the whole epic —
10
+ * that editing a sibling *outside* that closure leaves the member's env
11
+ * spec byte-identical (no cross-invalidation), while editing a shared
12
+ * dependency changes it.
13
+ *
14
+ * uv-gated: self-skips where uv is unavailable, matching the integration
15
+ * e2e. (Sdist builds fetch the hatchling backend; CI has network.)
16
+ */
17
+ import { describe, it, before } from 'node:test';
18
+ import * as assert from 'node:assert';
19
+ import * as fs from 'node:fs';
20
+ import * as os from 'node:os';
21
+ import * as path from 'node:path';
22
+ import { execFileSync } from 'node:child_process';
23
+ import { createHash } from 'node:crypto';
24
+ import { decodeBeast2For } from '@elaraai/east';
25
+ import { EnvironmentSpecType } from '@elaraai/e3-types';
26
+ import { captureEnvironment, captureAutoEnvironment } from './environment-capture.js';
27
+ function toolAvailable(cmd) {
28
+ try {
29
+ execFileSync(cmd, ['--version'], { stdio: 'ignore', shell: process.platform === 'win32' });
30
+ return true;
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ }
36
+ /** Capture a member's env and return [sorted sdist filenames, spec-bytes sha]. */
37
+ function capture(project) {
38
+ const specBytes = captureEnvironment({ python: { project } }, 'test', (buf) => createHash('sha256').update(buf).digest('hex'));
39
+ const spec = decodeBeast2For(EnvironmentSpecType)(specBytes);
40
+ assert.ok(spec.type === 'python');
41
+ return {
42
+ sdists: spec.value.sdists.map((s) => s.filename.replace(/-0\.1\.0\.tar\.gz$/, '')).sort(),
43
+ specHash: createHash('sha256').update(specBytes).digest('hex'),
44
+ };
45
+ }
46
+ describe('python closure capture (#278)', () => {
47
+ const hasUv = toolAvailable('uv');
48
+ let ws;
49
+ before(() => {
50
+ if (!hasUv)
51
+ return;
52
+ ws = fs.mkdtempSync(path.join(os.tmpdir(), 'e3-cap-ws-'));
53
+ // A uv workspace: common (leaf) ← pricing; `other` is an unrelated
54
+ // sibling NOT in pricing's closure. All hatchling → deterministic sdists.
55
+ fs.writeFileSync(path.join(ws, 'pyproject.toml'), '[project]\nname = "root"\nversion = "0.1.0"\nrequires-python = ">=3.11"\n\n' +
56
+ '[tool.uv.workspace]\nmembers = ["packages/*"]\n\n' +
57
+ '[tool.uv.sources]\ncommon = { workspace = true }\n');
58
+ const mkMember = (name, deps, src = 'sources = {}') => {
59
+ const dir = path.join(ws, 'packages', name);
60
+ fs.mkdirSync(path.join(dir, 'src', name), { recursive: true });
61
+ fs.writeFileSync(path.join(dir, 'pyproject.toml'), `[project]\nname = "${name}"\nversion = "0.1.0"\nrequires-python = ">=3.11"\n` +
62
+ (deps.length ? `dependencies = [${deps.map((d) => `"${d}"`).join(', ')}]\n` : '') +
63
+ (deps.includes('common') ? '\n[tool.uv.sources]\ncommon = { workspace = true }\n' : '') +
64
+ '\n[build-system]\nrequires = ["hatchling"]\nbuild-backend = "hatchling.build"\n');
65
+ fs.writeFileSync(path.join(dir, 'src', name, '__init__.py'), `VALUE = "${name}-v1"\n`);
66
+ void src;
67
+ };
68
+ mkMember('common', []);
69
+ mkMember('pricing', ['common']);
70
+ mkMember('other', []);
71
+ execFileSync('uv', ['lock'], { cwd: ws, stdio: 'ignore', shell: process.platform === 'win32' });
72
+ });
73
+ it('captures exactly the transitive local closure of a member', { skip: hasUv ? false : 'uv not on PATH' }, () => {
74
+ assert.deepStrictEqual(capture(path.join(ws, 'packages', 'pricing')).sdists, ['common', 'pricing']);
75
+ assert.deepStrictEqual(capture(path.join(ws, 'packages', 'common')).sdists, ['common']);
76
+ assert.deepStrictEqual(capture(path.join(ws, 'packages', 'other')).sdists, ['other']);
77
+ });
78
+ it('does NOT cross-invalidate: editing an unrelated sibling leaves the spec byte-identical', { skip: hasUv ? false : 'uv not on PATH' }, () => {
79
+ const before = capture(path.join(ws, 'packages', 'pricing')).specHash;
80
+ const otherSrc = path.join(ws, 'packages', 'other', 'src', 'other', '__init__.py');
81
+ const orig = fs.readFileSync(otherSrc, 'utf-8');
82
+ try {
83
+ fs.writeFileSync(otherSrc, orig + '\nEDIT = 1\n');
84
+ assert.strictEqual(capture(path.join(ws, 'packages', 'pricing')).specHash, before, "editing 'other' must not change pricing's env spec");
85
+ }
86
+ finally {
87
+ fs.writeFileSync(otherSrc, orig);
88
+ }
89
+ });
90
+ it('DOES propagate a shared-dependency edit: editing common changes pricing', { skip: hasUv ? false : 'uv not on PATH' }, () => {
91
+ const before = capture(path.join(ws, 'packages', 'pricing')).specHash;
92
+ const commonSrc = path.join(ws, 'packages', 'common', 'src', 'common', '__init__.py');
93
+ const orig = fs.readFileSync(commonSrc, 'utf-8');
94
+ try {
95
+ fs.writeFileSync(commonSrc, orig + '\nEDIT = 1\n');
96
+ assert.notStrictEqual(capture(path.join(ws, 'packages', 'pricing')).specHash, before, "editing 'common' must change pricing's env spec");
97
+ }
98
+ finally {
99
+ fs.writeFileSync(commonSrc, orig);
100
+ }
101
+ });
102
+ it('errors clearly when the project is not in any lockfile', { skip: hasUv ? false : 'uv not on PATH' }, () => {
103
+ const orphan = fs.mkdtempSync(path.join(os.tmpdir(), 'e3-orphan-'));
104
+ fs.writeFileSync(path.join(orphan, 'pyproject.toml'), '[project]\nname = "orphan"\nversion = "0.1.0"\n');
105
+ try {
106
+ assert.throws(() => capture(orphan), /no uv\.lock/);
107
+ }
108
+ finally {
109
+ fs.rmSync(orphan, { recursive: true, force: true });
110
+ }
111
+ });
112
+ it('auto-derives from platform refs: resolves { custom } → member, unions closures, skips registry names', { skip: hasUv ? false : 'uv not on PATH' }, () => {
113
+ const auto = (customs) => {
114
+ const bytes = captureAutoEnvironment('east-py', customs, ws, 'test', (b) => createHash('sha256').update(b).digest('hex'));
115
+ if (bytes === null)
116
+ return null;
117
+ const spec = decodeBeast2For(EnvironmentSpecType)(bytes);
118
+ assert.ok(spec.type === 'python');
119
+ return spec.value.sdists.map((s) => s.filename.replace(/-0\.1\.0\.tar\.gz$/, '')).sort();
120
+ };
121
+ assert.deepStrictEqual(auto(['pricing']), ['common', 'pricing'], 'a member ref pulls its transitive closure');
122
+ assert.deepStrictEqual(auto(['other']), ['other'], 'an independent member is captured alone');
123
+ assert.deepStrictEqual(auto(['pricing', 'other']), ['common', 'other', 'pricing'], 'multiple refs union their closures');
124
+ assert.strictEqual(auto(['east-py-std']), null, 'a non-member (registry/first-party) name derives nothing');
125
+ });
126
+ });
127
+ describe('node npm-workspace closure capture (#280)', () => {
128
+ let ws;
129
+ const npmShell = process.platform === 'win32';
130
+ const captureNode = (project) => {
131
+ const bytes = captureEnvironment({ node: { project } }, 'test', (b) => createHash('sha256').update(b).digest('hex'));
132
+ const spec = decodeBeast2For(EnvironmentSpecType)(bytes);
133
+ assert.ok(spec.type === 'workspace_node');
134
+ return { members: spec.value.members.map((m) => m.name).sort(), specHash: createHash('sha256').update(bytes).digest('hex') };
135
+ };
136
+ before(() => {
137
+ ws = fs.mkdtempSync(path.join(os.tmpdir(), 'e3-cap-nws-'));
138
+ fs.writeFileSync(path.join(ws, 'package.json'), JSON.stringify({ name: 'root', version: '1.0.0', private: true, workspaces: ['packages/*'] }));
139
+ const mk = (name, deps, code = 'module.exports.v=1;') => {
140
+ const dir = path.join(ws, 'packages', name);
141
+ fs.mkdirSync(dir, { recursive: true });
142
+ fs.writeFileSync(path.join(dir, 'package.json'), JSON.stringify({ name: `@acme/${name}`, version: '1.0.0', main: 'index.js', ...(deps ? { dependencies: deps } : {}) }));
143
+ fs.writeFileSync(path.join(dir, 'index.js'), code);
144
+ };
145
+ mk('common');
146
+ mk('pricing', { '@acme/common': '1.0.0' });
147
+ mk('other');
148
+ execFileSync('npm', ['install', '--no-audit', '--no-fund'], { cwd: ws, stdio: 'ignore', shell: npmShell });
149
+ });
150
+ it('captures exactly the transitive local closure of a member', () => {
151
+ assert.deepStrictEqual(captureNode(path.join(ws, 'packages', 'pricing')).members, ['@acme/common', '@acme/pricing']);
152
+ assert.deepStrictEqual(captureNode(path.join(ws, 'packages', 'other')).members, ['@acme/other']);
153
+ });
154
+ it('does NOT cross-invalidate: editing an unrelated sibling leaves the spec byte-identical', () => {
155
+ const before = captureNode(path.join(ws, 'packages', 'pricing')).specHash;
156
+ const otherSrc = path.join(ws, 'packages', 'other', 'index.js');
157
+ const orig = fs.readFileSync(otherSrc, 'utf-8');
158
+ try {
159
+ fs.writeFileSync(otherSrc, orig + '\n// edit\n');
160
+ assert.strictEqual(captureNode(path.join(ws, 'packages', 'pricing')).specHash, before);
161
+ }
162
+ finally {
163
+ fs.writeFileSync(otherSrc, orig);
164
+ }
165
+ });
166
+ it('rejects a stale lock (N4): a member manifest dep not in the lock (npm ci would install it unpinned)', () => {
167
+ const pj = path.join(ws, 'packages', 'pricing', 'package.json');
168
+ const orig = fs.readFileSync(pj, 'utf-8');
169
+ try {
170
+ const obj = JSON.parse(orig);
171
+ obj.dependencies = { ...obj.dependencies, 'left-pad': '1.3.0' }; // added WITHOUT re-locking
172
+ fs.writeFileSync(pj, JSON.stringify(obj));
173
+ assert.throws(() => captureNode(path.join(ws, 'packages', 'pricing')), /differ from the lockfile/);
174
+ }
175
+ finally {
176
+ fs.writeFileSync(pj, orig);
177
+ }
178
+ });
179
+ it('errors when the environment is declared on the workspace root (N3)', () => {
180
+ assert.throws(() => captureEnvironment({ node: { project: ws } }, 'test', (b) => createHash('sha256').update(b).digest('hex')), /workspace member, not the workspace root/);
181
+ });
182
+ it('auto-derives from a { custom } member ref; multiple local members need an explicit env', () => {
183
+ const auto = (customs) => {
184
+ const bytes = captureAutoEnvironment('east-node', customs, ws, 'test', (b) => createHash('sha256').update(b).digest('hex'));
185
+ if (bytes === null)
186
+ return null;
187
+ const spec = decodeBeast2For(EnvironmentSpecType)(bytes);
188
+ assert.ok(spec.type === 'workspace_node');
189
+ return spec.value.members.map((m) => m.name).sort();
190
+ };
191
+ assert.deepStrictEqual(auto(['@acme/pricing']), ['@acme/common', '@acme/pricing'], 'a member ref pulls its transitive closure');
192
+ assert.deepStrictEqual(auto(['@acme/other']), ['@acme/other'], 'an independent member is captured alone');
193
+ assert.strictEqual(auto(['@elaraai/east-node-std']), null, 'a non-member name derives nothing');
194
+ assert.throws(() => auto(['@acme/pricing', '@acme/other']), /explicit `environment`/, 'multiple members need an explicit env for now');
195
+ });
196
+ });
197
+ describe('tools capture (#279)', () => {
198
+ let dir;
199
+ const cap = (files) => {
200
+ const blobs = new Map();
201
+ const bytes = captureEnvironment({ tools: { files: files } }, 'test', (b) => { const h = createHash('sha256').update(b).digest('hex'); blobs.set(h, b); return h; });
202
+ const spec = decodeBeast2For(EnvironmentSpecType)(bytes);
203
+ assert.ok(spec.type === 'tools');
204
+ return { paths: spec.value.files.map((f) => f.path), specHash: createHash('sha256').update(bytes).digest('hex'), blobs };
205
+ };
206
+ before(() => {
207
+ dir = fs.mkdtempSync(path.join(os.tmpdir(), 'e3-tools-cap-'));
208
+ fs.writeFileSync(path.join(dir, 'runner'), 'BINARY-BYTES');
209
+ fs.writeFileSync(path.join(dir, 'helper.dat'), 'DATA');
210
+ });
211
+ it('captures named files under bin/, sorted, decl-order-independent', () => {
212
+ const a = cap([path.join(dir, 'runner'), path.join(dir, 'helper.dat')]);
213
+ const b = cap([path.join(dir, 'helper.dat'), path.join(dir, 'runner')]);
214
+ assert.deepStrictEqual(a.paths, ['bin/helper.dat', 'bin/runner']);
215
+ assert.strictEqual(a.specHash, b.specHash, 'declaration order must not affect the env hash');
216
+ });
217
+ it('changes the env hash when a captured file changes (GAP-6)', () => {
218
+ const before = cap([path.join(dir, 'runner')]).specHash;
219
+ const orig = fs.readFileSync(path.join(dir, 'runner'));
220
+ try {
221
+ fs.writeFileSync(path.join(dir, 'runner'), 'REBUILT-BYTES');
222
+ assert.notStrictEqual(cap([path.join(dir, 'runner')]).specHash, before);
223
+ }
224
+ finally {
225
+ fs.writeFileSync(path.join(dir, 'runner'), orig);
226
+ }
227
+ });
228
+ it('rejects an empty file list (T1), a directory (T2), and colliding basenames (T3)', () => {
229
+ assert.throws(() => cap([]), /at least one file/);
230
+ assert.throws(() => cap([dir + '/']), /looks like a directory/);
231
+ fs.mkdirSync(path.join(dir, 'sub'), { recursive: true });
232
+ fs.writeFileSync(path.join(dir, 'sub', 'runner'), 'x');
233
+ assert.throws(() => cap([path.join(dir, 'runner'), path.join(dir, 'sub', 'runner')]), /collide on basename/);
234
+ });
235
+ it('errors when a named file does not exist (T4)', () => {
236
+ assert.throws(() => cap([path.join(dir, 'nonexistent')]), /not found/);
237
+ });
238
+ });
239
+ //# sourceMappingURL=environment-capture.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment-capture.spec.js","sourceRoot":"","sources":["../../src/environment-capture.spec.ts"],"names":[],"mappings":"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"}
@@ -31,9 +31,15 @@
31
31
  * packages the project itself.
32
32
  * - `image`: a full immutable digest reference (`repo@sha256:<64 hex>`);
33
33
  * validated at definition time — mutable tags are rejected.
34
+ * - `tools`: `files` names ≥1 prebuilt file (a compiled binary, or any
35
+ * artifact) to capture as content-addressed blobs and place on the
36
+ * runner's PATH. e3 never builds these — the developer builds them
37
+ * however they like. The C story: embed east-c in your binary, run it via
38
+ * a `custom` runner, and attach `{ tools: { files: ['./build/runner'] } }`
39
+ * so a rebuild changes the environment hash and re-runs its tasks.
34
40
  *
35
- * Relative `project` paths resolve against the exporting process's working
36
- * directory.
41
+ * Relative `project`/`files` paths resolve against the exporting process's
42
+ * working directory.
37
43
  */
38
44
  export type EnvironmentDecl = {
39
45
  python: {
@@ -47,6 +53,10 @@ export type EnvironmentDecl = {
47
53
  image: {
48
54
  digest: string;
49
55
  };
56
+ } | {
57
+ tools: {
58
+ files: [string, ...string[]];
59
+ };
50
60
  };
51
61
  /**
52
62
  * Validates an environment declaration at definition time.
@@ -56,7 +66,8 @@ export type EnvironmentDecl = {
56
66
  *
57
67
  * @param decl - The declaration to validate
58
68
  * @param owner - The declaring task/function name, for error messages
59
- * @throws {Error} if an `image` reference is not a full sha256 digest
69
+ * @throws {Error} if an `image` reference is not a full sha256 digest, or a
70
+ * `tools` declaration is empty, names a directory, or has duplicate basenames
60
71
  */
61
72
  export declare function validateEnvironmentDecl(decl: EnvironmentDecl, owner: string): void;
62
73
  //# sourceMappingURL=environment.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/environment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;;;;;GAiBG;AAEH;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,eAAe,GACvB;IAAE,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC7B;IAAE,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAIlC;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAUlF"}
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/environment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;;;;;GAiBG;AAEH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,MAAM,eAAe,GACvB;IAAE,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC7B;IAAE,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC7B;IAAE,KAAK,EAAE;QAAE,KAAK,EAAE,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;KAAE,CAAA;CAAE,CAAC;AAIhD;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CA4BlF"}
@@ -11,7 +11,8 @@ const IMAGE_DIGEST_RE = /@sha256:[0-9a-f]{64}$/;
11
11
  *
12
12
  * @param decl - The declaration to validate
13
13
  * @param owner - The declaring task/function name, for error messages
14
- * @throws {Error} if an `image` reference is not a full sha256 digest
14
+ * @throws {Error} if an `image` reference is not a full sha256 digest, or a
15
+ * `tools` declaration is empty, names a directory, or has duplicate basenames
15
16
  */
16
17
  export function validateEnvironmentDecl(decl, owner) {
17
18
  if ('image' in decl) {
@@ -21,5 +22,24 @@ export function validateEnvironmentDecl(decl, owner) {
21
22
  `would let the environment drift under a fixed hash`);
22
23
  }
23
24
  }
25
+ else if ('tools' in decl) {
26
+ const files = decl.tools.files;
27
+ if (files.length === 0) {
28
+ throw new Error(`Environment for '${owner}': tools.files must name at least one file`);
29
+ }
30
+ const basenames = new Set();
31
+ for (const f of files) {
32
+ if (f.endsWith('/') || f.endsWith('\\')) {
33
+ throw new Error(`Environment for '${owner}': tools file '${f}' looks like a directory — list files individually`);
34
+ }
35
+ // The env has one flat bin dir; case-insensitive because win32/macOS
36
+ // filesystems collapse case.
37
+ const base = f.replace(/[/\\]+$/, '').split(/[/\\]/).pop().toLowerCase();
38
+ if (basenames.has(base)) {
39
+ throw new Error(`Environment for '${owner}': tools files collide on basename '${base}' — each captured file needs a distinct name`);
40
+ }
41
+ basenames.add(base);
42
+ }
43
+ }
24
44
  }
25
45
  //# sourceMappingURL=environment.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/environment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyCH,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAEhD;;;;;;;;;GASG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAqB,EAAE,KAAa;IAC1E,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CACb,oBAAoB,KAAK,2CAA2C;gBACpE,wCAAwC,IAAI,CAAC,KAAK,CAAC,MAAM,2BAA2B;gBACpF,oDAAoD,CACrD,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/environment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgDH,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAEhD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAqB,EAAE,KAAa;IAC1E,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CACb,oBAAoB,KAAK,2CAA2C;gBACpE,wCAAwC,IAAI,CAAC,KAAK,CAAC,MAAM,2BAA2B;gBACpF,oDAAoD,CACrD,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,oBAAoB,KAAK,4CAA4C,CAAC,CAAC;QACzF,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QACpC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CAAC,oBAAoB,KAAK,kBAAkB,CAAC,oDAAoD,CAAC,CAAC;YACpH,CAAC;YACD,qEAAqE;YACrE,6BAA6B;YAC7B,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAG,CAAC,WAAW,EAAE,CAAC;YAC1E,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,oBAAoB,KAAK,uCAAuC,IAAI,8CAA8C,CAAC,CAAC;YACtI,CAAC;YACD,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/export.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,OAAO,IAAI,MAAM,MAAM,CAAC;AAIxB,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,YAAY,CAAC;AAK1D;;;;;;;;;;;;;;;GAeG;AAEH,wBAAsB,OAAO,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4PlH;AAOD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAKrE"}
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/export.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,OAAO,IAAI,MAAM,MAAM,CAAC;AAIxB,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,YAAY,CAAC;AAK1D;;;;;;;;;;;;;;;GAeG;AAEH,wBAAsB,OAAO,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiRlH;AAOD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAKrE"}
@@ -14,10 +14,10 @@
14
14
  import * as fs from 'node:fs';
15
15
  import { createHash } from 'node:crypto';
16
16
  import yazl from 'yazl';
17
- import { variant, encodeBeast2For, encodeEastIR, EastIR, AsyncEastIR, printIdentifier, SortedMap, toEastTypeValue } from '@elaraai/east';
17
+ import { variant, some, none, encodeBeast2For, encodeEastIR, EastIR, AsyncEastIR, printIdentifier, SortedMap, toEastTypeValue } from '@elaraai/east';
18
18
  import { DatasetRefType, PackageObjectType, TaskObjectType, FunctionObjectType, MutationObjectType, RecordObjectType } from '@elaraai/e3-types';
19
19
  import { runnerToVariant } from './runner.js';
20
- import { captureEnvironment } from './environment-capture.js';
20
+ import { captureEnvironment, captureAutoEnvironment } from './environment-capture.js';
21
21
  /**
22
22
  * Exports a package to a .zip bundle.
23
23
  *
@@ -46,18 +46,40 @@ export async function export_(pkg, outputPath) {
46
46
  // Resolve environment declarations to content-addressed EnvironmentSpec
47
47
  // objects, once per distinct declaration per export run (a project capture
48
48
  // shells out to uv/npm — identical declarations must not re-build).
49
- const environmentHashes = new Map(); // canonical decl key -> spec object hash
50
- const resolveEnvironment = (decl, owner) => {
51
- if (!decl)
52
- return variant('none', null);
53
- const key = JSON.stringify(decl);
49
+ // Environment spec hashes, memoized per distinct decl/derivation key (a
50
+ // capture shells out to uv/npm). '' marks a key that resolved to "no
51
+ // environment", so it is neither re-derived nor mistaken for a cache miss.
52
+ const environmentHashes = new Map();
53
+ const cachedEnvHash = (key, capture) => {
54
54
  let hash = environmentHashes.get(key);
55
55
  if (hash === undefined) {
56
- const specData = captureEnvironment(decl, owner, (blob) => addObject(zipfile, blob));
57
- hash = addObject(zipfile, Buffer.from(specData));
56
+ const specData = capture();
57
+ hash = specData === null ? '' : addObject(zipfile, Buffer.from(specData));
58
58
  environmentHashes.set(key, hash);
59
59
  }
60
- return variant('some', hash);
60
+ return hash === '' ? null : hash;
61
+ };
62
+ const environmentHashFor = (decl, runner, owner) => {
63
+ // An explicit `environment` wins (and is the only path to tools/image).
64
+ if (decl) {
65
+ return cachedEnvHash(`decl:${JSON.stringify(decl)}`, () => captureEnvironment(decl, owner, (blob) => addObject(zipfile, blob)));
66
+ }
67
+ // Otherwise derive it from the runner's `{ custom }` platform references, so
68
+ // a project split into workspace packages gets per-package change-detection
69
+ // granularity with no hand-written `environment`.
70
+ if (!runner || runner.runtime === 'custom')
71
+ return null;
72
+ const customs = (runner.platforms ?? [])
73
+ .filter((p) => typeof p === 'object' && p !== null && 'custom' in p)
74
+ .map((p) => p.custom);
75
+ if (customs.length === 0)
76
+ return null;
77
+ const key = `auto:${runner.runtime}:${[...customs].sort().join(',')}`;
78
+ return cachedEnvHash(key, () => captureAutoEnvironment(runner.runtime, customs, process.cwd(), owner, (blob) => addObject(zipfile, blob)));
79
+ };
80
+ const resolveEnvironment = (decl, runner, owner) => {
81
+ const hash = environmentHashFor(decl, runner, owner);
82
+ return hash === null ? none : some(hash);
61
83
  };
62
84
  // Create root structure as first entry
63
85
  structures.set('', variant('struct', new SortedMap()));
@@ -163,7 +185,7 @@ export async function export_(pkg, outputPath) {
163
185
  // customTask leaves TaskDef.runner undefined -> opaque custom
164
186
  // (empty command: the wire field is informational for custom tasks).
165
187
  runner: item.runner ? runnerToVariant(item.runner) : variant('custom', { command: [] }),
166
- environment: resolveEnvironment(item.environment, item.name),
188
+ environment: resolveEnvironment(item.environment, item.runner, item.name),
167
189
  };
168
190
  // Serialize and add to zip
169
191
  const taskEncoder = encodeBeast2For(TaskObjectType);
@@ -191,7 +213,7 @@ export async function export_(pkg, outputPath) {
191
213
  inputTypes: fdef.inputTypes.map((t) => toEastTypeValue(t)),
192
214
  outputType: toEastTypeValue(fdef.outputType),
193
215
  runner: runnerToVariant(fdef.runner),
194
- environment: resolveEnvironment(fdef.environment, fname),
216
+ environment: resolveEnvironment(fdef.environment, fdef.runner, fname),
195
217
  };
196
218
  const fnHash = addObject(zipfile, Buffer.from(functionEncoder(fnObject)));
197
219
  functions.set(fname, fnHash);
@@ -1 +1 @@
1
- {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/export.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/export.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elaraai/e3",
3
- "version": "1.0.30",
3
+ "version": "1.0.32",
4
4
  "description": "TypeScript SDK for authoring e3 packages",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -17,11 +17,12 @@
17
17
  }
18
18
  },
19
19
  "dependencies": {
20
+ "smol-toml": "^1.3.1",
20
21
  "yazl": "^2.5.1",
21
- "@elaraai/e3-types": "1.0.30"
22
+ "@elaraai/e3-types": "1.0.32"
22
23
  },
23
24
  "peerDependencies": {
24
- "@elaraai/east": "1.0.30"
25
+ "@elaraai/east": "1.0.32"
25
26
  },
26
27
  "devDependencies": {
27
28
  "@types/node": "^22.10.1",