@elaraai/east 1.0.84 → 1.0.86

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 (247) hide show
  1. package/dist/src/analyze.d.ts.map +1 -1
  2. package/dist/src/analyze.js +48 -0
  3. package/dist/src/analyze.js.map +1 -1
  4. package/dist/src/ast_to_ir.coerce_to.spec.js +4 -4
  5. package/dist/src/ast_to_ir.coerce_to.spec.js.map +1 -1
  6. package/dist/src/ast_to_ir.d.ts +6 -1
  7. package/dist/src/ast_to_ir.d.ts.map +1 -1
  8. package/dist/src/ast_to_ir.js +20 -7
  9. package/dist/src/ast_to_ir.js.map +1 -1
  10. package/dist/src/builtins.d.ts +1 -1
  11. package/dist/src/builtins.d.ts.map +1 -1
  12. package/dist/src/builtins.js +52 -0
  13. package/dist/src/builtins.js.map +1 -1
  14. package/dist/src/codegen/canonical.d.ts +37 -0
  15. package/dist/src/codegen/canonical.d.ts.map +1 -0
  16. package/dist/src/codegen/canonical.js +208 -0
  17. package/dist/src/codegen/canonical.js.map +1 -0
  18. package/dist/src/codegen/codegen.spec.js +132 -201
  19. package/dist/src/codegen/codegen.spec.js.map +1 -1
  20. package/dist/src/codegen/printer.d.ts.map +1 -1
  21. package/dist/src/codegen/printer.js +142 -24
  22. package/dist/src/codegen/printer.js.map +1 -1
  23. package/dist/src/codegen/spellings.d.ts +4 -1
  24. package/dist/src/codegen/spellings.d.ts.map +1 -1
  25. package/dist/src/codegen/spellings.js +5 -1
  26. package/dist/src/codegen/spellings.js.map +1 -1
  27. package/dist/src/compile/builtins/index.d.ts.map +1 -1
  28. package/dist/src/compile/builtins/index.js +2 -0
  29. package/dist/src/compile/builtins/index.js.map +1 -1
  30. package/dist/src/compile/builtins/primitives.d.ts.map +1 -1
  31. package/dist/src/compile/builtins/primitives.js +2 -1
  32. package/dist/src/compile/builtins/primitives.js.map +1 -1
  33. package/dist/src/compile/builtins/query.d.ts +10 -0
  34. package/dist/src/compile/builtins/query.d.ts.map +1 -0
  35. package/dist/src/compile/builtins/query.js +5 -0
  36. package/dist/src/compile/builtins/query.js.map +1 -0
  37. package/dist/src/expr/block.d.ts.map +1 -1
  38. package/dist/src/expr/block.js +2 -1
  39. package/dist/src/expr/block.js.map +1 -1
  40. package/dist/src/expr/index.d.ts +75 -47
  41. package/dist/src/expr/index.d.ts.map +1 -1
  42. package/dist/src/expr/index.js +31 -0
  43. package/dist/src/expr/index.js.map +1 -1
  44. package/dist/src/expr/libs/datetime.d.ts +20 -20
  45. package/dist/src/expr/libs/datetime.d.ts.map +1 -1
  46. package/dist/src/expr/libs/datetime.js +208 -167
  47. package/dist/src/expr/libs/datetime.js.map +1 -1
  48. package/dist/src/expr/libs/float.d.ts +15 -15
  49. package/dist/src/expr/libs/float.d.ts.map +1 -1
  50. package/dist/src/expr/libs/float.js +298 -267
  51. package/dist/src/expr/libs/float.js.map +1 -1
  52. package/dist/src/expr/libs/integer.d.ts +12 -12
  53. package/dist/src/expr/libs/integer.d.ts.map +1 -1
  54. package/dist/src/expr/libs/integer.js +219 -194
  55. package/dist/src/expr/libs/integer.js.map +1 -1
  56. package/dist/src/expr/libs/lazy.d.ts +28 -0
  57. package/dist/src/expr/libs/lazy.d.ts.map +1 -0
  58. package/dist/src/expr/libs/lazy.js +55 -0
  59. package/dist/src/expr/libs/lazy.js.map +1 -0
  60. package/dist/src/expr/libs/lazy.spec.d.ts +6 -0
  61. package/dist/src/expr/libs/lazy.spec.d.ts.map +1 -0
  62. package/dist/src/expr/libs/lazy.spec.js +102 -0
  63. package/dist/src/expr/libs/lazy.spec.js.map +1 -0
  64. package/dist/src/expr/query.d.ts +60 -0
  65. package/dist/src/expr/query.d.ts.map +1 -0
  66. package/dist/src/expr/query.js +84 -0
  67. package/dist/src/expr/query.js.map +1 -0
  68. package/dist/src/functions.crossimport.spec.js +8 -0
  69. package/dist/src/functions.crossimport.spec.js.map +1 -1
  70. package/dist/src/functions.d.ts +45 -8
  71. package/dist/src/functions.d.ts.map +1 -1
  72. package/dist/src/functions.js +138 -28
  73. package/dist/src/functions.js.map +1 -1
  74. package/dist/src/functions.spec.js +60 -2
  75. package/dist/src/functions.spec.js.map +1 -1
  76. package/dist/src/index.d.ts +3 -0
  77. package/dist/src/index.d.ts.map +1 -1
  78. package/dist/src/index.js +3 -0
  79. package/dist/src/index.js.map +1 -1
  80. package/dist/src/internal.d.ts +4 -0
  81. package/dist/src/internal.d.ts.map +1 -1
  82. package/dist/src/internal.js +9 -0
  83. package/dist/src/internal.js.map +1 -1
  84. package/dist/src/location.d.ts +22 -0
  85. package/dist/src/location.d.ts.map +1 -1
  86. package/dist/src/location.js +31 -0
  87. package/dist/src/location.js.map +1 -1
  88. package/dist/src/naming.d.ts +5 -3
  89. package/dist/src/naming.d.ts.map +1 -1
  90. package/dist/src/naming.js.map +1 -1
  91. package/dist/src/portable.spec.d.ts +6 -0
  92. package/dist/src/portable.spec.d.ts.map +1 -0
  93. package/dist/src/portable.spec.js +181 -0
  94. package/dist/src/portable.spec.js.map +1 -0
  95. package/dist/src/query/evaluate.d.ts +98 -0
  96. package/dist/src/query/evaluate.d.ts.map +1 -0
  97. package/dist/src/query/evaluate.js +193 -0
  98. package/dist/src/query/evaluate.js.map +1 -0
  99. package/dist/src/query/index.d.ts +17 -0
  100. package/dist/src/query/index.d.ts.map +1 -0
  101. package/dist/src/query/index.js +17 -0
  102. package/dist/src/query/index.js.map +1 -0
  103. package/dist/src/query/jq/catalog.d.ts +174 -0
  104. package/dist/src/query/jq/catalog.d.ts.map +1 -0
  105. package/dist/src/query/jq/catalog.js +1740 -0
  106. package/dist/src/query/jq/catalog.js.map +1 -0
  107. package/dist/src/query/jq/check.d.ts +210 -0
  108. package/dist/src/query/jq/check.d.ts.map +1 -0
  109. package/dist/src/query/jq/check.js +2261 -0
  110. package/dist/src/query/jq/check.js.map +1 -0
  111. package/dist/src/query/jq/complete.d.ts +89 -0
  112. package/dist/src/query/jq/complete.d.ts.map +1 -0
  113. package/dist/src/query/jq/complete.js +320 -0
  114. package/dist/src/query/jq/complete.js.map +1 -0
  115. package/dist/src/query/jq/describe.d.ts +53 -0
  116. package/dist/src/query/jq/describe.d.ts.map +1 -0
  117. package/dist/src/query/jq/describe.js +149 -0
  118. package/dist/src/query/jq/describe.js.map +1 -0
  119. package/dist/src/query/jq/lex.d.ts +118 -0
  120. package/dist/src/query/jq/lex.d.ts.map +1 -0
  121. package/dist/src/query/jq/lex.js +371 -0
  122. package/dist/src/query/jq/lex.js.map +1 -0
  123. package/dist/src/query/jq/literals.d.ts +49 -0
  124. package/dist/src/query/jq/literals.d.ts.map +1 -0
  125. package/dist/src/query/jq/literals.js +78 -0
  126. package/dist/src/query/jq/literals.js.map +1 -0
  127. package/dist/src/query/jq/messages.d.ts +126 -0
  128. package/dist/src/query/jq/messages.d.ts.map +1 -0
  129. package/dist/src/query/jq/messages.js +172 -0
  130. package/dist/src/query/jq/messages.js.map +1 -0
  131. package/dist/src/query/jq/parse.d.ts +70 -0
  132. package/dist/src/query/jq/parse.d.ts.map +1 -0
  133. package/dist/src/query/jq/parse.js +1013 -0
  134. package/dist/src/query/jq/parse.js.map +1 -0
  135. package/dist/src/query/jq/print.d.ts +59 -0
  136. package/dist/src/query/jq/print.d.ts.map +1 -0
  137. package/dist/src/query/jq/print.js +587 -0
  138. package/dist/src/query/jq/print.js.map +1 -0
  139. package/dist/src/query/jq/shapes.d.ts +345 -0
  140. package/dist/src/query/jq/shapes.d.ts.map +1 -0
  141. package/dist/src/query/jq/shapes.js +584 -0
  142. package/dist/src/query/jq/shapes.js.map +1 -0
  143. package/dist/src/query/jq/spans.d.ts +133 -0
  144. package/dist/src/query/jq/spans.d.ts.map +1 -0
  145. package/dist/src/query/jq/spans.js +195 -0
  146. package/dist/src/query/jq/spans.js.map +1 -0
  147. package/dist/src/query/jq/split.d.ts +334 -0
  148. package/dist/src/query/jq/split.d.ts.map +1 -0
  149. package/dist/src/query/jq/split.js +2108 -0
  150. package/dist/src/query/jq/split.js.map +1 -0
  151. package/dist/src/query/jq/strftime.d.ts +20 -0
  152. package/dist/src/query/jq/strftime.d.ts.map +1 -0
  153. package/dist/src/query/jq/strftime.js +65 -0
  154. package/dist/src/query/jq/strftime.js.map +1 -0
  155. package/dist/src/query/jq/summary.d.ts +139 -0
  156. package/dist/src/query/jq/summary.d.ts.map +1 -0
  157. package/dist/src/query/jq/summary.js +222 -0
  158. package/dist/src/query/jq/summary.js.map +1 -0
  159. package/dist/src/query/jq/translate-builtins.d.ts +21 -0
  160. package/dist/src/query/jq/translate-builtins.d.ts.map +1 -0
  161. package/dist/src/query/jq/translate-builtins.js +1873 -0
  162. package/dist/src/query/jq/translate-builtins.js.map +1 -0
  163. package/dist/src/query/jq/translate.d.ts +627 -0
  164. package/dist/src/query/jq/translate.d.ts.map +1 -0
  165. package/dist/src/query/jq/translate.js +3364 -0
  166. package/dist/src/query/jq/translate.js.map +1 -0
  167. package/dist/src/query/types.d.ts +505 -0
  168. package/dist/src/query/types.d.ts.map +1 -0
  169. package/dist/src/query/types.js +231 -0
  170. package/dist/src/query/types.js.map +1 -0
  171. package/dist/src/runner_exec.d.ts +134 -0
  172. package/dist/src/runner_exec.d.ts.map +1 -0
  173. package/dist/src/runner_exec.js +371 -0
  174. package/dist/src/runner_exec.js.map +1 -0
  175. package/dist/src/runner_exec.spec.d.ts +6 -0
  176. package/dist/src/runner_exec.spec.d.ts.map +1 -0
  177. package/dist/src/runner_exec.spec.js +198 -0
  178. package/dist/src/runner_exec.spec.js.map +1 -0
  179. package/dist/src/runner_io.d.ts +370 -0
  180. package/dist/src/runner_io.d.ts.map +1 -0
  181. package/dist/src/runner_io.js +563 -0
  182. package/dist/src/runner_io.js.map +1 -0
  183. package/dist/src/runner_io.spec.d.ts +6 -0
  184. package/dist/src/runner_io.spec.d.ts.map +1 -0
  185. package/dist/src/runner_io.spec.js +224 -0
  186. package/dist/src/runner_io.spec.js.map +1 -0
  187. package/dist/src/runner_merge.d.ts +95 -0
  188. package/dist/src/runner_merge.d.ts.map +1 -0
  189. package/dist/src/runner_merge.js +238 -0
  190. package/dist/src/runner_merge.js.map +1 -0
  191. package/dist/src/runner_protocol.d.ts +11 -4
  192. package/dist/src/runner_protocol.d.ts.map +1 -1
  193. package/dist/src/runner_protocol.js +11 -4
  194. package/dist/src/runner_protocol.js.map +1 -1
  195. package/dist/src/serialization/beast2/index.d.ts +1 -1
  196. package/dist/src/serialization/beast2/index.d.ts.map +1 -1
  197. package/dist/src/serialization/beast2/index.js.map +1 -1
  198. package/dist/src/serialization/beast2/v5/frames.d.ts +10 -6
  199. package/dist/src/serialization/beast2/v5/frames.d.ts.map +1 -1
  200. package/dist/src/serialization/beast2/v5/frames.js +10 -6
  201. package/dist/src/serialization/beast2/v5/frames.js.map +1 -1
  202. package/dist/src/serialization/beast2/v5/frames.spec.d.ts +6 -0
  203. package/dist/src/serialization/beast2/v5/frames.spec.d.ts.map +1 -0
  204. package/dist/src/serialization/beast2/v5/frames.spec.js +42 -0
  205. package/dist/src/serialization/beast2/v5/frames.spec.js.map +1 -0
  206. package/dist/src/serialization/beast2/v5/index.spec.js +108 -0
  207. package/dist/src/serialization/beast2/v5/index.spec.js.map +1 -1
  208. package/dist/src/serialization/beast2/v5/lazy.d.ts +12 -7
  209. package/dist/src/serialization/beast2/v5/lazy.d.ts.map +1 -1
  210. package/dist/src/serialization/beast2/v5/lazy.js +16 -6
  211. package/dist/src/serialization/beast2/v5/lazy.js.map +1 -1
  212. package/dist/src/serialization/beast2/v5/lazy.spec.js +159 -18
  213. package/dist/src/serialization/beast2/v5/lazy.spec.js.map +1 -1
  214. package/dist/src/serialization/beast2/v5/stream.d.ts +110 -21
  215. package/dist/src/serialization/beast2/v5/stream.d.ts.map +1 -1
  216. package/dist/src/serialization/beast2/v5/stream.js +153 -42
  217. package/dist/src/serialization/beast2/v5/stream.js.map +1 -1
  218. package/dist/src/serialization/beast2/v5/weight.d.ts +36 -0
  219. package/dist/src/serialization/beast2/v5/weight.d.ts.map +1 -0
  220. package/dist/src/serialization/beast2/v5/weight.js +238 -0
  221. package/dist/src/serialization/beast2/v5/weight.js.map +1 -0
  222. package/dist/src/serialization/crc32.d.ts +38 -0
  223. package/dist/src/serialization/crc32.d.ts.map +1 -0
  224. package/dist/src/serialization/crc32.js +70 -0
  225. package/dist/src/serialization/crc32.js.map +1 -0
  226. package/dist/src/serialization/crc32.spec.d.ts +6 -0
  227. package/dist/src/serialization/crc32.spec.d.ts.map +1 -0
  228. package/dist/src/serialization/crc32.spec.js +92 -0
  229. package/dist/src/serialization/crc32.spec.js.map +1 -0
  230. package/dist/src/serialization/east-inferred.spec.js +4 -0
  231. package/dist/src/serialization/east-inferred.spec.js.map +1 -1
  232. package/dist/src/serialization/east.d.ts.map +1 -1
  233. package/dist/src/serialization/east.js +134 -110
  234. package/dist/src/serialization/east.js.map +1 -1
  235. package/dist/src/serialization/east.spec.js +185 -4
  236. package/dist/src/serialization/east.spec.js.map +1 -1
  237. package/dist/src/serialization/east_text.d.ts +25 -0
  238. package/dist/src/serialization/east_text.d.ts.map +1 -0
  239. package/dist/src/serialization/east_text.js +29 -0
  240. package/dist/src/serialization/east_text.js.map +1 -0
  241. package/dist/src/serialization/index.d.ts +1 -1
  242. package/dist/src/serialization/index.d.ts.map +1 -1
  243. package/dist/src/types.d.ts +1 -1
  244. package/dist/src/types.d.ts.map +1 -1
  245. package/dist/src/types.js +7 -6
  246. package/dist/src/types.js.map +1 -1
  247. package/package.json +6 -3
@@ -0,0 +1,371 @@
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
+ * Executing a unit of the runner protocol: {@link executeUnit}, the one
7
+ * TypeScript unit runner, over a {@link UnitIO}.
8
+ *
9
+ * A unit (`UnitType`) runs a program on its inputs, merges the parts of one
10
+ * output that earlier units wrote, or takes a delivered collection in, and
11
+ * names where its output and its result go. A program's output is written by
12
+ * its kind:
13
+ * - a value as one blob, or as a manifest directory when it is a collection;
14
+ * - an array through the Writer;
15
+ * - a set or a dict through the RunSorter, as sorted runs;
16
+ * - a fold by folding every emitted value into an accumulator.
17
+ *
18
+ * A delivery taken in is read a segment at a time from its file, and written
19
+ * through the Writer as a manifest directory (`intakeBeast2For`).
20
+ *
21
+ * Collections are written as manifest directories, which a store takes in by
22
+ * linking their files. The result (`UnitResultType`) records the outcome —
23
+ * `ok`, or the failure's message and source locations — with where the time
24
+ * went and the host's peak memory. east-c and east-py implement the same
25
+ * protocol, and the conformance corpus holds the three to the same output
26
+ * bytes and outcomes.
27
+ *
28
+ * The work reaches its files only through the UnitIO it is given, its
29
+ * platform functions only through the host's resolver, and the host's memory
30
+ * only through the gauges it is given, so the same code runs as east-node's
31
+ * `exec` over this machine's files and in a browser's Web Worker over an
32
+ * `InMemoryUnitIO` — east-c's shape (`east/unit.h`), where the unit machinery
33
+ * is library code and its CLI wires it to files.
34
+ */
35
+ import { EastTypeValueType, isTypeValueEqual } from "./type_of_type.js";
36
+ import { variant } from "./containers/variant.js";
37
+ import { SortedMap } from "./containers/sortedmap.js";
38
+ import { SortedSet } from "./containers/sortedset.js";
39
+ import { compareFor } from "./comparison.js";
40
+ import { EastError } from "./error.js";
41
+ import { printTypeValue } from "./compile/runtime.js";
42
+ import { Beast2ManifestWriter, Beast2RunSorter, beast2LazyStats, configureFramePool, decodeBeast2For, encodeBeast2For, intakeBeast2For, } from "./serialization/beast2/index.js";
43
+ import { lazyInputBytesRead, loadUnitInput, loadUnitProgram, openUnitInputs, segmentPath, } from "./runner_io.js";
44
+ import { loadUnitMergeFunction, mergeUnitParts } from "./runner_merge.js";
45
+ /**
46
+ * Executes a unit: does its work over `io`, writes its output there, and says
47
+ * how it went.
48
+ *
49
+ * @param unit - the unit; the files it names are read and written through `io`
50
+ * @param io - the unit's files
51
+ * @param options - the host's platform resolver, its memory gauges, the
52
+ * decoded weight a lazy input's pager keeps, and who hears how the inputs
53
+ * are read
54
+ * @returns the result — a failure is its outcome, never a throw. The host
55
+ * writes it where the unit's `result` says, if it keeps it
56
+ *
57
+ * @remarks
58
+ * The unit's thread grant caps the frame pool for the rest of the process: a
59
+ * grant of one frames every output inline. A unit whose host places its
60
+ * segments as they are read (`fetch`) has `io` asked for each segment of a
61
+ * staged manifest before it is read ({@link UnitIO.segment}).
62
+ *
63
+ * @example
64
+ * ```ts
65
+ * const io = new InMemoryUnitIO(files); // the unit and every file it names
66
+ * const unit = decodeBeast2For(UnitType)(io.read("unit.beast2"));
67
+ * const result = await executeUnit(unit, io, { platforms: (name) => packages.get(name)! });
68
+ * if (result.outcome.type === "ok") io.files.get("output.beast2"); // the output
69
+ * ```
70
+ */
71
+ export async function executeUnit(unit, io, options) {
72
+ configureFramePool({ workers: Number(unit.threads) });
73
+ const timings = { load: 0, compile: 0, execute: 0, output: 0 };
74
+ let mark = performance.now();
75
+ const lap = (phase) => {
76
+ const now = performance.now();
77
+ timings[phase] += now - mark;
78
+ mark = now;
79
+ };
80
+ let outcome;
81
+ try {
82
+ const platforms = [];
83
+ for (const name of unit.platforms)
84
+ platforms.push(...await options.platforms(name));
85
+ const host = { io, platforms, fetch: unit.fetch, resident: options.resident, cacheBytes: options.cacheBytes, report: options.report, lap };
86
+ if (unit.work.type === "run") {
87
+ await runWork(unit.work.value, host);
88
+ }
89
+ else if (unit.work.type === "merge") {
90
+ mergeWork(unit.work.value, host);
91
+ }
92
+ else {
93
+ intakeWork(unit.work.value, host);
94
+ }
95
+ outcome = variant("ok", null);
96
+ }
97
+ catch (err) {
98
+ outcome = err instanceof EastError
99
+ ? variant("failed", { message: err.eastMessage, locations: err.location })
100
+ : variant("failed", { message: err?.message ?? String(err), locations: [] });
101
+ }
102
+ return { outcome, peakBytes: options.peakBytes?.() ?? 0n, timings };
103
+ }
104
+ /** Runs a program on its inputs and writes what it produces. */
105
+ async function runWork(work, host) {
106
+ const { io, platforms, report, lap } = host;
107
+ const program = loadUnitProgram(io, work.program);
108
+ const signature = program.ir.value.type.value;
109
+ // Every kind but a value is emitted, through the trailing parameter.
110
+ const emitted = work.output.type !== "value";
111
+ if (emitted && signature.inputs.length === 0) {
112
+ throw new Error(`exec: a ${work.output.type} output is emitted: the program's trailing parameter must be emit, a function`);
113
+ }
114
+ const params = emitted ? signature.inputs.slice(0, -1) : signature.inputs;
115
+ if (work.inputs.length !== params.length) {
116
+ const printed = `(${signature.inputs.map((type) => printTypeValue(type)).join(", ")}) -> ${printTypeValue(signature.output)}`;
117
+ throw new Error(`Function expects ${params.length} inputs, got ${work.inputs.length}\nSignature: ${printed}`);
118
+ }
119
+ // Inputs are frozen: each collection opened lazily, or every input decoded
120
+ // whole, as the unit's `decode` says.
121
+ report?.running(work.program, work.inputs.map((path, i) => ({ path, type: params[i] })));
122
+ const inputs = openUnitInputs(io, work.inputs, params, work.decode, {
123
+ fetch: host.fetch,
124
+ ...(host.resident !== undefined && { resident: host.resident }),
125
+ ...(host.cacheBytes !== undefined && { cacheBytes: host.cacheBytes }),
126
+ ...(report !== undefined && { report }),
127
+ });
128
+ lap("load");
129
+ const compiled = program.compile(platforms);
130
+ const output = openOutput(work.output, emitted ? signature.inputs.at(-1) : signature.output, host);
131
+ lap("compile");
132
+ try {
133
+ const result = await compiled(...inputs, ...(output.emit !== undefined ? [output.emit] : []));
134
+ lap("execute");
135
+ output.finish(result);
136
+ lap("output");
137
+ }
138
+ finally {
139
+ // What reading each lazy input came to, the output's writing included —
140
+ // or up to the failure.
141
+ if (report !== undefined) {
142
+ inputs.forEach((input, i) => {
143
+ const read = lazyInputBytesRead(input);
144
+ const stats = beast2LazyStats(input);
145
+ if (read !== undefined && stats !== undefined)
146
+ report.lazyReads(i, work.inputs[i], stats, read);
147
+ });
148
+ }
149
+ }
150
+ }
151
+ /**
152
+ * Opens a running program's output.
153
+ *
154
+ * @param output - the output
155
+ * @param type - the program's result type, for a value; its emit parameter's
156
+ * type otherwise
157
+ * @param host - the unit's files, and the platforms a fold's functions
158
+ * compile with
159
+ * @returns the sink
160
+ * @throws {Error} When the emit parameter does not fit the kind, a fold's
161
+ * function does not fit the emitted type, or an output directory holds
162
+ * anything already.
163
+ */
164
+ function openOutput(output, type, host) {
165
+ const { io, platforms } = host;
166
+ if (output.type === "value") {
167
+ const path = output.value;
168
+ return { finish: (result) => writeValue(io, path, type, result) };
169
+ }
170
+ const arity = output.type === "dict" ? 2 : 1;
171
+ const emitInputs = type.type === "Function" ? type.value.inputs : null;
172
+ if (emitInputs === null || emitInputs.length !== arity) {
173
+ throw new Error(`exec: a ${output.type} output is emitted: the program's trailing parameter must be emit, a function of ${arity} argument${arity === 1 ? "" : "s"}, got ${printTypeValue(type)}`);
174
+ }
175
+ const element = emitInputs[0];
176
+ switch (output.type) {
177
+ case "array": {
178
+ const writer = new Beast2ManifestWriter(variant("Array", element), manifestDirectory(io, `${outputDirectory(io, output.value)}/0.beast2`), { parallel: true });
179
+ return {
180
+ emit: (value) => { writer.add(value); return null; },
181
+ finish: () => writer.finish(),
182
+ };
183
+ }
184
+ case "set": {
185
+ const dir = outputDirectory(io, output.value);
186
+ const sorter = new Beast2RunSorter(variant("Set", element), (run) => manifestDirectory(io, `${dir}/${run}.beast2`), { union: true, parallel: true });
187
+ return {
188
+ emit: (value) => { sorter.add(value); return null; },
189
+ finish: () => sorter.finish(),
190
+ };
191
+ }
192
+ case "dict": {
193
+ const value = emitInputs[1];
194
+ const merge = output.value.merge.type === "some"
195
+ ? loadUnitMergeFunction(io, output.value.merge.value, element, value, platforms, "the emit parameter")
196
+ : undefined;
197
+ const dir = outputDirectory(io, output.value.dir);
198
+ const sorter = new Beast2RunSorter(variant("Dict", { key: element, value }), (run) => manifestDirectory(io, `${dir}/${run}.beast2`), { ...(merge !== undefined && { merge }), parallel: true });
199
+ return {
200
+ emit: (key, entry) => { sorter.add([key, entry]); return null; },
201
+ finish: () => sorter.finish(),
202
+ };
203
+ }
204
+ case "fold": {
205
+ const { combine } = loadCombineFunction(io, output.value.combine, element, platforms);
206
+ const path = output.value.path;
207
+ let acc = loadUnitInput(io, output.value.zero, element, host.fetch);
208
+ return {
209
+ emit: (value) => { acc = combine(acc, value); return null; },
210
+ finish: () => writeValue(io, path, element, acc),
211
+ };
212
+ }
213
+ }
214
+ }
215
+ /** Assembles the parts of one output into one. */
216
+ function mergeWork(work, host) {
217
+ const { io, platforms, lap } = host;
218
+ const output = work.output;
219
+ switch (output.type) {
220
+ case "set":
221
+ case "dict": {
222
+ const dir = outputDirectory(io, output.type === "set" ? output.value : output.value.dir);
223
+ lap("load");
224
+ mergeUnitParts(io, work.parts, manifestDirectory(io, `${dir}/0.beast2`), {
225
+ union: output.type === "set",
226
+ ...(output.type === "dict" && output.value.merge.type === "some" && { merge: output.value.merge.value }),
227
+ ...(work.range.type === "some" && { range: work.range.value }),
228
+ platforms,
229
+ fetch: host.fetch,
230
+ });
231
+ lap("execute");
232
+ return;
233
+ }
234
+ case "fold": {
235
+ const { combine, type } = loadCombineFunction(io, output.value.combine, null, platforms);
236
+ let acc = loadUnitInput(io, output.value.zero, type, host.fetch);
237
+ lap("compile");
238
+ for (const part of work.parts)
239
+ acc = combine(acc, loadUnitInput(io, part, type, host.fetch));
240
+ lap("execute");
241
+ writeValue(io, output.value.path, type, acc);
242
+ lap("output");
243
+ return;
244
+ }
245
+ case "array":
246
+ throw new Error("exec: an array's parts are concatenated, never merged: a merge unit takes set, dict or fold parts");
247
+ case "value":
248
+ throw new Error("exec: a value has no parts: a merge unit takes set, dict or fold parts");
249
+ }
250
+ }
251
+ /**
252
+ * Takes a delivered collection in: the file read a segment at a time, through
253
+ * ranged reads, and written through the Writer as the manifest directory the
254
+ * unit names.
255
+ *
256
+ * @throws {Error} When the type file does not hold a type, the delivery cannot
257
+ * be read, or the intake refuses it — every refusal in the words each runner
258
+ * uses.
259
+ */
260
+ function intakeWork(work, host) {
261
+ const { io, lap } = host;
262
+ let type;
263
+ try {
264
+ type = decodeBeast2For(EastTypeValueType)(io.read(work.type));
265
+ }
266
+ catch {
267
+ throw new Error("exec: intake: its type file does not hold a type");
268
+ }
269
+ const intake = intakeBeast2For(type);
270
+ const delivery = {
271
+ size: io.size(work.input),
272
+ read: (offset, length) => io.readRange(work.input, offset, length),
273
+ };
274
+ lap("load");
275
+ const segments = work.segments.type === "some"
276
+ ? { segments: { from: Number(work.segments.value.from), to: Number(work.segments.value.to) } }
277
+ : {};
278
+ intake(delivery, manifestDirectory(io, work.output), { ...segments, parallel: true });
279
+ lap("execute");
280
+ }
281
+ /**
282
+ * Loads a fold's `combine`: an IR file holding a `(T, T) -> T` East function,
283
+ * compiled with the unit's platforms.
284
+ *
285
+ * @param io - the unit's files
286
+ * @param path - the IR file
287
+ * @param type - the emitted type, or `null` to take `T` from the function —
288
+ * a merge of fold partials has no program to say what was emitted
289
+ * @param platforms - the unit's platform functions
290
+ * @returns the compiled function, and `T`
291
+ * @throws {Error} When the IR is not a function of that shape.
292
+ */
293
+ function loadCombineFunction(io, path, type, platforms) {
294
+ const bundle = loadUnitProgram(io, path);
295
+ const fnType = bundle.ir.value.type;
296
+ const shape = fnType.type === "Function" ? fnType.value : null;
297
+ const t = type ?? shape?.output;
298
+ if (shape === null || t === undefined || shape.inputs.length !== 2 ||
299
+ !isTypeValueEqual(shape.inputs[0], t) ||
300
+ !isTypeValueEqual(shape.inputs[1], t) ||
301
+ !isTypeValueEqual(shape.output, t)) {
302
+ const expected = t !== undefined ? ` (T = ${printTypeValue(t)})` : "";
303
+ throw new Error(`exec: combine: expected a function (T, T) -> T${expected}, got ${printTypeValue(fnType)}`);
304
+ }
305
+ return { combine: bundle.compile(platforms), type: t };
306
+ }
307
+ /**
308
+ * Writes a value output: a collection as a manifest directory at `path`,
309
+ * anything else as one blob there.
310
+ *
311
+ * @param io - the unit's files
312
+ * @param path - the output's file
313
+ * @param type - the value's type
314
+ * @param value - the value
315
+ */
316
+ function writeValue(io, path, type, value) {
317
+ if (type.type !== "Array" && type.type !== "Set" && type.type !== "Dict") {
318
+ io.write(path, encodeBeast2For(type)(value));
319
+ return;
320
+ }
321
+ // A collection goes in canonical order: a Set or Dict an East program
322
+ // built is sorted already, and a plain one is sorted first.
323
+ const key = (type.type === "Dict" ? type.value.key : type.value);
324
+ const cmp = compareFor(key);
325
+ const elements = type.type === "Array" ? value
326
+ : type.type === "Set" ? (value instanceof SortedSet ? value : [...value].sort(cmp))
327
+ : value instanceof SortedMap ? value.entries() : [...value.entries()].sort((a, b) => cmp(a[0], b[0]));
328
+ const writer = new Beast2ManifestWriter(type, manifestDirectory(io, path), { parallel: true });
329
+ for (const element of elements)
330
+ writer.add(element);
331
+ writer.finish();
332
+ }
333
+ /**
334
+ * The sink a manifest directory is written through: the manifest at `path`,
335
+ * written last, and every object it names in `<path>.segments/` under its
336
+ * SHA-256 — the layout a store takes in by linking, and every runner's opener
337
+ * reads.
338
+ *
339
+ * @param io - the unit's files
340
+ * @param path - the manifest's file
341
+ * @returns the sink
342
+ */
343
+ function manifestDirectory(io, path) {
344
+ let made = false;
345
+ return {
346
+ object: (hash, bytes) => {
347
+ if (!made) {
348
+ io.makeDirectory(`${path}.segments`);
349
+ made = true;
350
+ }
351
+ io.write(segmentPath(path, hash), bytes);
352
+ },
353
+ manifest: (bytes) => io.write(path, bytes),
354
+ };
355
+ }
356
+ /**
357
+ * Makes an output directory of runs, which must hold nothing yet: every
358
+ * manifest in it is one of the unit's runs.
359
+ *
360
+ * @param io - the unit's files
361
+ * @param dir - the directory
362
+ * @returns the directory
363
+ * @throws {Error} When it holds anything already.
364
+ */
365
+ function outputDirectory(io, dir) {
366
+ io.makeDirectory(dir);
367
+ if (io.list(dir).length > 0)
368
+ throw new Error(`exec: the output directory ${dir} is not empty`);
369
+ return dir;
370
+ }
371
+ //# sourceMappingURL=runner_exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner_exec.js","sourceRoot":"","sources":["../../src/runner_exec.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=runner_exec.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner_exec.spec.d.ts","sourceRoot":"","sources":["../../src/runner_exec.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,198 @@
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
+ * `executeUnit` and what it asks of its host: the platform functions of each
7
+ * package a unit lists, the host's memory gauges, who hears how a run unit's
8
+ * inputs are read, and the segments a unit whose host places them as they are
9
+ * read asks for. What a unit's work comes to — its outputs and outcome, byte
10
+ * for byte — the runner corpus holds it to (`test/runner_corpus.spec.ts`).
11
+ */
12
+ import { describe, it } from "node:test";
13
+ import assert from "node:assert/strict";
14
+ import { DictType, IntegerType, StringType, East, InMemoryUnitIO, UnitOutcomeType, Beast2ManifestWriter, decodeBeast2For, decodeCollectionManifest, encodeBeast2For, encodeEastIR, equalFor, executeUnit, isTypeValueEqual, none, printFor, toEastTypeValue, variant, } from "./index.js";
15
+ const DT = DictType(IntegerType, StringType);
16
+ /** An outcome as a message shows it. */
17
+ const printOutcome = printFor(UnitOutcomeType);
18
+ /** A unit's files: a Dict staged as e3 stages one, as `table.beast2` and the
19
+ * segments beside it, and whatever else is given. */
20
+ function staged(rows, others = []) {
21
+ const files = new Map(others);
22
+ const writer = new Beast2ManifestWriter(DT, {
23
+ object: (hash, blob) => { files.set(`table.beast2.segments/${hash}.beast2`, blob.slice()); },
24
+ manifest: (blob) => { files.set("table.beast2", blob.slice()); },
25
+ });
26
+ for (let i = 0; i < rows; i++)
27
+ writer.add([BigInt(i), `row-${i}`]);
28
+ writer.finish();
29
+ return files;
30
+ }
31
+ /** A run unit over `inputs`, its output a value. */
32
+ function runUnit(inputs, options = {}) {
33
+ return {
34
+ work: variant("run", {
35
+ program: "program.beast2",
36
+ inputs,
37
+ output: variant("value", "out.beast2"),
38
+ decode: options.decode === "whole" ? variant("whole", null) : variant("lazy", null),
39
+ }),
40
+ platforms: options.platforms ?? [],
41
+ threads: 1n,
42
+ fetch: options.fetch ?? false,
43
+ result: "result.beast2",
44
+ };
45
+ }
46
+ /** A resolver for units that list no platform package. */
47
+ const noPackages = (name) => {
48
+ throw new Error(`no platform package ${name} here`);
49
+ };
50
+ /** An IO that records every segment it is asked to make there. */
51
+ class AskedIO extends InMemoryUnitIO {
52
+ asked = [];
53
+ segment(path, fetch) {
54
+ this.asked.push([path, fetch]);
55
+ super.segment(path, fetch);
56
+ }
57
+ }
58
+ describe("executeUnit", () => {
59
+ it("resolves each platform package the unit lists, once and in order, and runs the program with their functions", async () => {
60
+ const double = East.platform("exec_spec_double", [IntegerType], IntegerType);
61
+ const inc = East.platform("exec_spec_inc", [IntegerType], IntegerType);
62
+ const program = East.function([IntegerType], IntegerType, ($, x) => inc(double(x)));
63
+ const io = new InMemoryUnitIO([
64
+ ["program.beast2", encodeEastIR(program.toIR())],
65
+ ["x.beast2", encodeBeast2For(IntegerType)(7n)],
66
+ ]);
67
+ const resolved = [];
68
+ const result = await executeUnit(runUnit(["x.beast2"], { platforms: ["pkg-double", "pkg-inc"] }), io, {
69
+ platforms: (name) => {
70
+ resolved.push(name);
71
+ // A host may resolve a package at once, or later.
72
+ return name === "pkg-double"
73
+ ? [double.implement((x) => x * 2n)]
74
+ : Promise.resolve([inc.implement((x) => x + 1n)]);
75
+ },
76
+ });
77
+ assert.ok(equalFor(UnitOutcomeType)(result.outcome, variant("ok", null)), printOutcome(result.outcome));
78
+ assert.deepEqual(resolved, ["pkg-double", "pkg-inc"]);
79
+ assert.equal(decodeBeast2For(IntegerType)(io.read("out.beast2")), 15n);
80
+ });
81
+ it("fails a unit whose package its host cannot resolve, in the host's words, before any work", async () => {
82
+ // The program the unit names is not there: the resolver's refusal comes
83
+ // first, so its words are the outcome's.
84
+ const io = new InMemoryUnitIO([["x.beast2", encodeBeast2For(IntegerType)(7n)]]);
85
+ const result = await executeUnit(runUnit(["x.beast2"], { platforms: ["pkg-missing"] }), io, { platforms: noPackages });
86
+ assert.ok(equalFor(UnitOutcomeType)(result.outcome, variant("failed", { message: "no platform package pkg-missing here", locations: [] })), printOutcome(result.outcome));
87
+ assert.deepEqual([...io.files.keys()], ["x.beast2"], "nothing is written");
88
+ });
89
+ it("tells its report how a run unit reads its inputs, and weighs them by the host's gauges", async () => {
90
+ const program = East.function([DT, IntegerType], StringType, ($, table, key) => table.get(key));
91
+ const io = new InMemoryUnitIO(staged(20_000, [
92
+ ["program.beast2", encodeEastIR(program.toIR())],
93
+ ["x.beast2", encodeBeast2For(IntegerType)(123n)],
94
+ ]));
95
+ const segments = decodeCollectionManifest(io.read("table.beast2")).entries.length;
96
+ const heard = [];
97
+ let inputTypes = [];
98
+ const report = {
99
+ running: (path, inputs) => {
100
+ heard.push(["running", path, inputs.map((input) => input.path)]);
101
+ inputTypes = inputs.map((input) => input.type);
102
+ },
103
+ openedLazily: (i) => { heard.push(["lazily", i]); },
104
+ decodedWhole: (i, grown) => { heard.push(["whole", i, grown]); },
105
+ lazyReads: (i, path, stats, read) => { heard.push(["reads", i, path, stats, read > 0]); },
106
+ };
107
+ let gauge = 1_000;
108
+ const result = await executeUnit(runUnit(["table.beast2", "x.beast2"]), io, {
109
+ platforms: noPackages,
110
+ resident: () => (gauge += 10),
111
+ peakBytes: () => 42n,
112
+ report,
113
+ });
114
+ assert.ok(equalFor(UnitOutcomeType)(result.outcome, variant("ok", null)), printOutcome(result.outcome));
115
+ assert.equal(decodeBeast2For(StringType)(io.read("out.beast2")), "row-123");
116
+ assert.equal(result.peakBytes, 42n, "the peak is the host's gauge's");
117
+ assert.deepEqual(heard, [
118
+ ["running", "program.beast2", ["table.beast2", "x.beast2"]],
119
+ ["lazily", 0],
120
+ ["whole", 1, 10],
121
+ ["reads", 0, "table.beast2", { segments, segmentsDecoded: 1, fencesProbed: segments, hydrated: false, hydratedBytes: 0 }, true],
122
+ ], "the collection opened lazily, and its one keyed read decoded one segment; the Integer decoded whole, weighed by the gauge");
123
+ assert.equal(inputTypes.length, 2);
124
+ assert.ok(isTypeValueEqual(inputTypes[0], toEastTypeValue(DT)), "the table is read as its parameter's type");
125
+ assert.ok(isTypeValueEqual(inputTypes[1], toEastTypeValue(IntegerType)), "the key is read as its parameter's type");
126
+ });
127
+ it("gives each lazily opened input's pager the decoded weight its host keeps", async () => {
128
+ // Keyed reads that cycle over three segments far apart, so no run of reads
129
+ // in key order forms: kept, each segment decodes once; at a budget of 1,
130
+ // every read decodes its segment again.
131
+ const program = East.function([DT], IntegerType, ($, table) => {
132
+ const hits = $.let(0n);
133
+ $.for(East.Array.range(0n, 30n), ($, i) => {
134
+ $.if(table.has(i.remainder(3n).multiply(9000n)), ($) => {
135
+ $.assign(hits, hits.add(1n));
136
+ });
137
+ });
138
+ return hits;
139
+ });
140
+ for (const [cacheBytes, decodes] of [[1, 30], [undefined, 3]]) {
141
+ const io = new InMemoryUnitIO(staged(20_000, [["program.beast2", encodeEastIR(program.toIR())]]));
142
+ let stats;
143
+ const report = {
144
+ running: () => { },
145
+ openedLazily: () => { },
146
+ decodedWhole: () => { },
147
+ lazyReads: (_i, _path, read) => { stats = read; },
148
+ };
149
+ const result = await executeUnit(runUnit(["table.beast2"]), io, {
150
+ platforms: noPackages,
151
+ report,
152
+ ...(cacheBytes !== undefined && { cacheBytes }),
153
+ });
154
+ assert.ok(equalFor(UnitOutcomeType)(result.outcome, variant("ok", null)), printOutcome(result.outcome));
155
+ assert.equal(decodeBeast2For(IntegerType)(io.read("out.beast2")), 30n);
156
+ assert.equal(stats?.segmentsDecoded, decodes, `at a budget of ${cacheBytes ?? "256 MiB"}`);
157
+ }
158
+ });
159
+ it("measures nothing its host gives it no gauge for", async () => {
160
+ const io = new InMemoryUnitIO([["program.beast2", encodeEastIR(East.function([], IntegerType, (_$) => 1n).toIR())]]);
161
+ const result = await executeUnit(runUnit([]), io, { platforms: noPackages });
162
+ assert.ok(equalFor(UnitOutcomeType)(result.outcome, variant("ok", null)), printOutcome(result.outcome));
163
+ assert.equal(result.peakBytes, 0n, "a host that does not measure memory reports no peak");
164
+ for (const phase of ["load", "compile", "execute", "output"])
165
+ assert.ok(result.timings[phase] >= 0, phase);
166
+ });
167
+ it("asks its IO for each segment a unit reads, saying whether the unit's host places them as they are read", async () => {
168
+ const program = East.function([DT], StringType, ($, table) => table.get(9999n));
169
+ const files = staged(20_000, [["program.beast2", encodeEastIR(program.toIR())]]);
170
+ const segments = decodeCollectionManifest(files.get("table.beast2")).entries.map((entry) => `table.beast2.segments/${entry.hash}.beast2`);
171
+ assert.ok(segments.length > 2, `several segments, got ${segments.length}`);
172
+ // Lazily, one keyed read reads one segment.
173
+ const lazy = new AskedIO(files);
174
+ const fetched = await executeUnit(runUnit(["table.beast2"], { fetch: true }), lazy, { platforms: noPackages });
175
+ assert.ok(equalFor(UnitOutcomeType)(fetched.outcome, variant("ok", null)), printOutcome(fetched.outcome));
176
+ assert.equal(lazy.asked.length, 1, `one segment asked for: ${JSON.stringify(lazy.asked)}`);
177
+ assert.ok(segments.includes(lazy.asked[0][0]) && lazy.asked[0][1], "a segment the manifest names, asked of a host that places them");
178
+ // Decoded whole, every segment is read, and the unit's host places none.
179
+ const whole = new AskedIO(files);
180
+ const decoded = await executeUnit(runUnit(["table.beast2"], { decode: "whole" }), whole, { platforms: noPackages });
181
+ assert.ok(equalFor(UnitOutcomeType)(decoded.outcome, variant("ok", null)), printOutcome(decoded.outcome));
182
+ assert.deepEqual(whole.asked, segments.map((path) => [path, false]));
183
+ });
184
+ it("refuses an output directory that holds anything already", async () => {
185
+ const io = new InMemoryUnitIO([["out/stale.beast2", new Uint8Array([1])]]);
186
+ const unit = {
187
+ work: variant("merge", { parts: ["part.beast2"], range: none, output: variant("set", "out") }),
188
+ platforms: [],
189
+ threads: 1n,
190
+ fetch: false,
191
+ result: "result.beast2",
192
+ };
193
+ const result = await executeUnit(unit, io, { platforms: noPackages });
194
+ assert.ok(equalFor(UnitOutcomeType)(result.outcome, variant("failed", { message: "exec: the output directory out is not empty", locations: [] })), printOutcome(result.outcome));
195
+ assert.deepEqual([...io.files.keys()], ["out/stale.beast2"], "nothing is written");
196
+ });
197
+ });
198
+ //# sourceMappingURL=runner_exec.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner_exec.spec.js","sourceRoot":"","sources":["../../src/runner_exec.spec.ts"],"names":[],"mappings":"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"}