@a-company/gnomon 0.0.0-stage → 8.0.2

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 (71) hide show
  1. package/README.md +126 -2
  2. package/dist/agent.d.ts +28 -0
  3. package/dist/agent.js +45708 -0
  4. package/dist/build-id.json +1 -0
  5. package/dist/cli/gnomon.js +53946 -0
  6. package/dist/cli/gnomond.js +47744 -0
  7. package/dist/gnomon-local/cli.js +897 -0
  8. package/dist/index.d.ts +3477 -0
  9. package/dist/index.js +13698 -0
  10. package/dist/loops.d.ts +440 -0
  11. package/dist/loops.js +4706 -0
  12. package/dist/signer-CQ3Bpe7G.d.ts +158 -0
  13. package/dist/transport/gnomon-web.js +688 -0
  14. package/gnomon-mods/.purpose +143 -0
  15. package/gnomon-mods/constellation/README.md +27 -0
  16. package/gnomon-mods/constellation/fixtures/map-the-idea.golden.json +19 -0
  17. package/gnomon-mods/constellation/fixtures/map-the-idea.json +3 -0
  18. package/gnomon-mods/constellation/fixtures/summarize-the-session.golden.json +20 -0
  19. package/gnomon-mods/constellation/fixtures/summarize-the-session.json +3 -0
  20. package/gnomon-mods/constellation/fixtures/two-blocks.golden.json +4 -0
  21. package/gnomon-mods/constellation/fixtures/two-blocks.json +3 -0
  22. package/gnomon-mods/constellation/gnomon-manifest.json +68 -0
  23. package/gnomon-mods/constellation/skills/constellation-desk/SKILL.md +35 -0
  24. package/gnomon-mods/ledger/README.md +10 -0
  25. package/gnomon-mods/ledger/fixtures/breaker.golden.json +28 -0
  26. package/gnomon-mods/ledger/fixtures/breaker.json +80 -0
  27. package/gnomon-mods/ledger/fixtures/compacted.golden.json +42 -0
  28. package/gnomon-mods/ledger/fixtures/compacted.json +103 -0
  29. package/gnomon-mods/ledger/fixtures/over-budget.golden.json +24 -0
  30. package/gnomon-mods/ledger/fixtures/over-budget.json +86 -0
  31. package/gnomon-mods/ledger/fixtures/strip-reduced.golden.json +23 -0
  32. package/gnomon-mods/ledger/fixtures/strip-reduced.json +76 -0
  33. package/gnomon-mods/ledger/fixtures/strip.golden.json +18 -0
  34. package/gnomon-mods/ledger/fixtures/strip.json +68 -0
  35. package/gnomon-mods/ledger/gnomon-manifest.json +16 -0
  36. package/gnomon-mods/ledger/index.mjs +77 -0
  37. package/gnomon-mods/ledger/model.mjs +237 -0
  38. package/gnomon-mods/neurons/README.md +31 -0
  39. package/gnomon-mods/neurons/fixtures/capture-a-decision.golden.json +20 -0
  40. package/gnomon-mods/neurons/fixtures/capture-a-decision.json +3 -0
  41. package/gnomon-mods/neurons/fixtures/capture-a-learning.golden.json +19 -0
  42. package/gnomon-mods/neurons/fixtures/capture-a-learning.json +3 -0
  43. package/gnomon-mods/neurons/fixtures/search-the-brain.golden.json +19 -0
  44. package/gnomon-mods/neurons/fixtures/search-the-brain.json +3 -0
  45. package/gnomon-mods/neurons/fixtures/undeclared-kind.golden.json +9 -0
  46. package/gnomon-mods/neurons/fixtures/undeclared-kind.json +3 -0
  47. package/gnomon-mods/neurons/gnomon-manifest.json +87 -0
  48. package/gnomon-mods/neurons/skills/neurons-desk/SKILL.md +44 -0
  49. package/gnomon-mods/paradigm-context/README.md +9 -0
  50. package/gnomon-mods/paradigm-context/fixtures/empty.golden.json +28 -0
  51. package/gnomon-mods/paradigm-context/fixtures/empty.json +48 -0
  52. package/gnomon-mods/paradigm-context/fixtures/full-dark.golden.json +497 -0
  53. package/gnomon-mods/paradigm-context/fixtures/full-dark.json +134 -0
  54. package/gnomon-mods/paradigm-context/fixtures/full.golden.json +497 -0
  55. package/gnomon-mods/paradigm-context/fixtures/full.json +134 -0
  56. package/gnomon-mods/paradigm-context/fixtures/stale.golden.json +205 -0
  57. package/gnomon-mods/paradigm-context/fixtures/stale.json +69 -0
  58. package/gnomon-mods/paradigm-context/fixtures/unfocused.golden.json +28 -0
  59. package/gnomon-mods/paradigm-context/fixtures/unfocused.json +14 -0
  60. package/gnomon-mods/paradigm-context/gnomon-manifest.json +15 -0
  61. package/gnomon-mods/paradigm-context/index.mjs +64 -0
  62. package/gnomon-mods/paradigm-context/model.mjs +137 -0
  63. package/gnomon-mods/workshop/README.md +12 -0
  64. package/gnomon-mods/workshop/fixtures/strip-reduced.golden.json +56 -0
  65. package/gnomon-mods/workshop/fixtures/strip-reduced.json +16 -0
  66. package/gnomon-mods/workshop/fixtures/strip.golden.json +56 -0
  67. package/gnomon-mods/workshop/fixtures/strip.json +16 -0
  68. package/gnomon-mods/workshop/gnomon-manifest.json +14 -0
  69. package/gnomon-mods/workshop/index.mjs +73 -0
  70. package/gnomon-mods/workshop/model.mjs +152 -0
  71. package/package.json +80 -4
@@ -0,0 +1,440 @@
1
+ /** TD-2026-10-23-268: at most this many env files per loop (mirrored in kernel/loops/loop-env.ts). */
2
+ declare const LOOP_ENV_FILES_MAX = 8;
3
+ declare const LOOP_SCHEMA: "loop:v2";
4
+ declare const LOOP_COMPILED_VERSION: 1;
5
+ declare const LOOP_TERMINALS: readonly ["@goal", "@stop", "@pause"];
6
+ type LoopTerminal = (typeof LOOP_TERMINALS)[number];
7
+ declare const LOOP_ID_MAX = 64;
8
+ declare const LOOP_CALL_DEPTH_MAX = 3;
9
+ declare const LOOP_CONTINUOUS_MIN_COOLDOWN_SEC: number;
10
+ declare const LANDS_IN_8_1: "LANDS_IN_8_1";
11
+ /**
12
+ * BUILD_TOOLS entries a `run` argv0 may still name: direct type checkers and test runners whose config is part
13
+ * of the config closure (LP2). Every other build tool or package manager (npm, npm exec, make, cargo run …)
14
+ * runs repo-controlled scripts and is refused as argv0.
15
+ */
16
+ declare const LOOP_ARGV0_CHECKER_ALLOW: ReadonlySet<string>;
17
+ /** Always in a compiled loop's protected set: act nodes never edit installed dependencies. */
18
+ declare const LOOP_ALWAYS_PROTECTED: readonly ["node_modules/**", "**/node_modules/**"];
19
+ declare const LOOP_BUILTINS: readonly ["paradigm.flow-check", "paradigm.flow-affected", "paradigm.ripple", "paradigm.purpose-validate", "paradigm.drift", "paradigm.reindex", "git.clean"];
20
+ type LoopBuiltin = (typeof LOOP_BUILTINS)[number];
21
+ declare const LOOP_AUTONOMY: readonly ["act", "propose", "observe"];
22
+ declare const LOOP_DECIDE: readonly ["none", "before-land", "on-stop"];
23
+ declare const LOOP_NOTIFY_ON: readonly ["goal", "stop", "fail", "landed"];
24
+ declare const LOOP_NOTIFY_AS: readonly ["toast", "quiet"];
25
+ declare const LOOP_EVENT_KINDS: readonly ["file.changed", "commit.landed", "session.ended", "card.decided"];
26
+ declare const LOOP_WEEKDAYS: readonly ["mon", "tue", "wed", "thu", "fri", "sat", "sun"];
27
+ declare const LOOP_PARSERS: readonly ["tap", "junit", "tsc"];
28
+ declare const LOOP_JSON_OPS: readonly ["==", "!=", "<", "<=", ">", ">="];
29
+ declare const LOOP_MODEL_ROLES: readonly ["judge", "summarize", "act"];
30
+ declare const LOOP_PARADIGM_TOOLS: readonly ["ripple", "flow.check", "flow.affected", "purpose.validate", "drift"];
31
+ /** Input-reference roots that are not node ids (§2 `inputs`, `attach`). */
32
+ declare const LOOP_INPUT_ROOTS: readonly ["trigger", "last", "day", "loop", "failed", "run"];
33
+ /** Verdicts per node type (the edge keys a node may name, besides `any`). */
34
+ declare const CHECK_VERDICTS: readonly ["pass", "fail", "error"];
35
+ declare const MODEL_VERDICTS: readonly ["pass", "fail", "unsure", "unavailable", "error"];
36
+ declare const CALL_VERDICTS: readonly ["pass", "fail", "unsure", "error"];
37
+ declare const TOAST_VERDICTS: readonly ["pass"];
38
+ /**
39
+ * Global budget defaults, used for any field a definition leaves out (LL3: never unbounded). The live values
40
+ * come from root-signed `~/.gnomon/config.yaml` `loops:` once LP3 reads it; compileLoop takes them as an option.
41
+ * Escalations default to 0: loops are local only in 8.0 (D4).
42
+ */
43
+ interface LoopBudgets {
44
+ run: {
45
+ rounds: number;
46
+ wallMin: number;
47
+ tokens: number;
48
+ computeSec: number;
49
+ };
50
+ day: {
51
+ runs: number;
52
+ tokens: number;
53
+ computeSec: number;
54
+ };
55
+ escalations: {
56
+ perRun: number;
57
+ perDay: number;
58
+ };
59
+ }
60
+ declare const LOOP_BUDGET_DEFAULTS: Readonly<LoopBudgets>;
61
+ declare const LOOP_DEFAULTS: Readonly<{
62
+ autonomy: "act";
63
+ decide: "none";
64
+ notify: Readonly<{
65
+ on: readonly string[];
66
+ as: "toast";
67
+ }>;
68
+ catchUp: "skip";
69
+ debounceSec: 0;
70
+ effect: "read";
71
+ timeoutSec: 600;
72
+ landMaxWaitMin: 120;
73
+ modelLimits: Readonly<{
74
+ turns: 20;
75
+ tokens: 80000;
76
+ }>;
77
+ minConfidence: 0.7;
78
+ }>;
79
+ type Duration = number | string;
80
+ type Count = number | string;
81
+ type EdgeMap = Record<string, string>;
82
+ type LoopSchedule = {
83
+ every: Duration;
84
+ } | {
85
+ daily: string;
86
+ } | {
87
+ weekly: {
88
+ day: (typeof LOOP_WEEKDAYS)[number];
89
+ at: string;
90
+ };
91
+ };
92
+ type LoopTrigger = {
93
+ schedule: LoopSchedule;
94
+ catchUp?: 'skip' | 'once';
95
+ } | {
96
+ event: {
97
+ kind: 'file.changed';
98
+ flow: string;
99
+ } | {
100
+ kind: 'commit.landed';
101
+ } | {
102
+ kind: 'session.ended';
103
+ } | {
104
+ kind: 'card.decided';
105
+ loop: string;
106
+ node: string;
107
+ };
108
+ debounce?: Duration;
109
+ } | {
110
+ continuous: {
111
+ cooldown: Duration;
112
+ };
113
+ };
114
+ type CheckPass = {
115
+ exit: number;
116
+ } | {
117
+ parse: (typeof LOOP_PARSERS)[number];
118
+ failed: number;
119
+ } | {
120
+ json: string;
121
+ op: (typeof LOOP_JSON_OPS)[number];
122
+ value: string | number | boolean | null;
123
+ };
124
+ interface NodeExit {
125
+ maxVisits?: number;
126
+ maxFailStreak?: number;
127
+ }
128
+ interface CheckNode {
129
+ id: string;
130
+ type: 'check';
131
+ run?: string[];
132
+ builtin?: LoopBuiltin;
133
+ args?: Record<string, unknown>;
134
+ effect?: 'read' | 'write';
135
+ pass?: CheckPass;
136
+ timeoutSec?: number;
137
+ /** TD-2026-10-23-268: variables from the human's environment this check's child gets (names only here) */
138
+ env?: string[];
139
+ exit?: NodeExit;
140
+ on?: EdgeMap;
141
+ }
142
+ type ModelTool = 'read' | 'edit' | {
143
+ paradigm: string[];
144
+ };
145
+ interface ModelNode {
146
+ id: string;
147
+ type: 'model';
148
+ role: (typeof LOOP_MODEL_ROLES)[number];
149
+ model?: {
150
+ use?: 'local';
151
+ profile?: string;
152
+ escalate?: 'never';
153
+ minConfidence?: number;
154
+ };
155
+ prompt?: string;
156
+ inputs?: string[];
157
+ tools?: 'none' | ModelTool[];
158
+ verdict?: {
159
+ classes: string[];
160
+ };
161
+ limits?: {
162
+ turns?: number;
163
+ tokens?: Count;
164
+ };
165
+ /** TD-2026-10-23-268: role act only: variables from the human's environment the act session gets */
166
+ env?: string[];
167
+ exit?: NodeExit;
168
+ on?: EdgeMap;
169
+ }
170
+ interface NotifyNode {
171
+ id: string;
172
+ type: 'notify';
173
+ as: 'toast' | 'card';
174
+ text?: string;
175
+ attach?: string[];
176
+ choices?: string[];
177
+ exit?: NodeExit;
178
+ on?: EdgeMap;
179
+ }
180
+ interface CallNode {
181
+ id: string;
182
+ type: 'call';
183
+ loop: string;
184
+ exit?: NodeExit;
185
+ on?: EdgeMap;
186
+ }
187
+ type LoopNode = CheckNode | ModelNode | NotifyNode | CallNode;
188
+ interface LoopDefinition {
189
+ schema: typeof LOOP_SCHEMA;
190
+ id: string;
191
+ title?: string;
192
+ repo?: string;
193
+ flows?: string[];
194
+ triggers?: LoopTrigger[];
195
+ autonomy?: (typeof LOOP_AUTONOMY)[number];
196
+ notify?: {
197
+ on?: (typeof LOOP_NOTIFY_ON)[number][];
198
+ as?: (typeof LOOP_NOTIFY_AS)[number];
199
+ };
200
+ decide?: (typeof LOOP_DECIDE)[number];
201
+ budgets?: {
202
+ run?: {
203
+ rounds?: number;
204
+ wallMin?: number;
205
+ tokens?: Count;
206
+ computeSec?: number;
207
+ };
208
+ day?: {
209
+ runs?: number;
210
+ tokens?: Count;
211
+ computeSec?: number;
212
+ };
213
+ escalations?: {
214
+ perRun?: number;
215
+ perDay?: number;
216
+ };
217
+ };
218
+ goal?: {
219
+ node: string;
220
+ verdict?: 'pass';
221
+ inputs?: string[];
222
+ };
223
+ land?: {
224
+ paths: string[];
225
+ message: string;
226
+ maxWaitMin?: number;
227
+ };
228
+ /** TD-2026-10-23-268: `off` shows check output unredacted (no secret scrubbing) for this loop; default on */
229
+ redact?: 'on' | 'off' | boolean;
230
+ /** TD-2026-10-23-268: where the nodes' `env` values are read, in order (then ~/.gnomon/loop-env) */
231
+ envFiles?: string[];
232
+ /** TD-2026-10-23-268: `on` lets this loop's checks reach the network; default off */
233
+ network?: 'on' | 'off' | boolean;
234
+ start: string;
235
+ nodes: LoopNode[];
236
+ }
237
+ type CompiledTrigger = {
238
+ type: 'schedule';
239
+ every?: number;
240
+ daily?: string;
241
+ weekly?: {
242
+ day: string;
243
+ at: string;
244
+ };
245
+ catchUp: 'skip' | 'once';
246
+ } | {
247
+ type: 'event';
248
+ kind: string;
249
+ flow?: string;
250
+ paths?: string[];
251
+ loop?: string;
252
+ node?: string;
253
+ debounceSec: number;
254
+ } | {
255
+ type: 'continuous';
256
+ cooldownSec: number;
257
+ };
258
+ type CompiledNode = {
259
+ id: string;
260
+ type: 'check';
261
+ run?: string[];
262
+ argv0Interpreter?: string;
263
+ builtin?: string;
264
+ args?: Record<string, unknown>;
265
+ effect: 'read' | 'write';
266
+ pass: CheckPass;
267
+ timeoutSec: number;
268
+ env?: string[];
269
+ exit?: NodeExit;
270
+ on: Record<string, string>;
271
+ } | {
272
+ id: string;
273
+ type: 'model';
274
+ role: string;
275
+ model: {
276
+ use: 'local';
277
+ profile?: string;
278
+ escalate: 'never';
279
+ minConfidence: number;
280
+ };
281
+ prompt?: string;
282
+ inputs: string[];
283
+ tools: ModelTool[];
284
+ verdict?: {
285
+ classes: string[];
286
+ };
287
+ limits: {
288
+ turns: number;
289
+ tokens: number;
290
+ };
291
+ env?: string[];
292
+ exit?: NodeExit;
293
+ on: Record<string, string>;
294
+ } | {
295
+ id: string;
296
+ type: 'notify';
297
+ as: 'toast' | 'card';
298
+ text?: string;
299
+ attach: string[];
300
+ choices?: string[];
301
+ exit?: NodeExit;
302
+ on: Record<string, string>;
303
+ } | {
304
+ id: string;
305
+ type: 'call';
306
+ loop: string;
307
+ callee: string;
308
+ hash8: string;
309
+ exit?: NodeExit;
310
+ on: Record<string, string>;
311
+ };
312
+ interface CompiledLoop {
313
+ schema: typeof LOOP_SCHEMA;
314
+ /**
315
+ * `sourceHash` (LP2): loopContentHash of the PARSED source definition (the YAML), the hash a caller's `id@hash8`
316
+ * pin names. The kernel never sees the YAML, so it resolves a pin against the TRUSTED callee's sourceHash.
317
+ */
318
+ compiled: {
319
+ version: typeof LOOP_COMPILED_VERSION;
320
+ flowsResolved: boolean;
321
+ callsResolved: boolean;
322
+ sourceHash?: string;
323
+ };
324
+ id: string;
325
+ title?: string;
326
+ scope: 'repo' | 'personal';
327
+ repo?: string;
328
+ flows: string[];
329
+ flowPaths?: Record<string, string[]>;
330
+ triggers: CompiledTrigger[];
331
+ autonomy: string;
332
+ notify: {
333
+ on: string[];
334
+ as: string;
335
+ };
336
+ decide: string;
337
+ budgets: LoopBudgets;
338
+ goal?: {
339
+ node: string;
340
+ verdict: 'pass';
341
+ inputs: string[];
342
+ };
343
+ land?: {
344
+ paths: string[];
345
+ message: string;
346
+ maxWaitMin: number;
347
+ };
348
+ /** TD-2026-10-23-268: present only when off (check output unredacted); absent = on */
349
+ redact?: 'off';
350
+ /** TD-2026-10-23-268: the env files, as written (present only when non-empty) */
351
+ envFiles?: string[];
352
+ /** TD-2026-10-23-268: present only when on (checks can reach the network) */
353
+ network?: 'on';
354
+ start: string;
355
+ nodes: CompiledNode[];
356
+ /**
357
+ * Paths act nodes may not edit (the kernel enforces): node_modules, plus goal.inputs and the repo-relative
358
+ * argv words of run checks across this loop and every loop it calls (transitively, when known).
359
+ */
360
+ protected: string[];
361
+ }
362
+ interface LoopIssue {
363
+ /** JSON-ish path into the definition: `nodes[2].run[0]`, `triggers[0].schedule.cron`, or `` for the root. */
364
+ path: string;
365
+ code: string;
366
+ message: string;
367
+ }
368
+ interface LoopValidateOptions {
369
+ /** repo loops live in `.paradigm/loops/` and never name `repo`; personal loops (`~/.gnomon/loops`) must. Default repo. */
370
+ scope?: 'repo' | 'personal';
371
+ /**
372
+ * Other loops in the same scope, by id (parsed definitions; only their `call` nodes are read). Given, the
373
+ * validator refuses unknown callees, call cycles and call depth > 3. Absent, only a self-call is detected.
374
+ */
375
+ knownLoops?: ReadonlyMap<string, unknown> | Readonly<Record<string, unknown>>;
376
+ /** Flow id → path globs (from the flow index). Given, flows resolve; an unknown flow is refused. */
377
+ flowIndex?: Readonly<Record<string, readonly string[]>>;
378
+ }
379
+ interface LoopCompileOptions extends LoopValidateOptions {
380
+ /** Global budget defaults (the `loops:` block of ~/.gnomon/config.yaml); default LOOP_BUDGET_DEFAULTS. */
381
+ budgetDefaults?: LoopBudgets;
382
+ /**
383
+ * The shebang line (without `#!`) of a run argv0 that is a script, or null. Given, compiled check nodes carry
384
+ * `argv0Interpreter` so the trust card can show it (hashing the interpreter is LP2).
385
+ */
386
+ readShebang?: (argv0: string) => string | null;
387
+ }
388
+ interface LoopValidation {
389
+ ok: boolean;
390
+ errors: LoopIssue[];
391
+ warnings: LoopIssue[];
392
+ /** The definition, typed, when ok. */
393
+ loop?: LoopDefinition;
394
+ }
395
+ interface LoopCompilation extends LoopValidation {
396
+ compiled?: CompiledLoop;
397
+ }
398
+ /** Parse a duration (`30m`, `90s`, `2h`, `1d`, or integer seconds) to integer seconds; null when malformed. */
399
+ declare function parseDurationSec(v: unknown): number | null;
400
+ /** Parse a count (`400k`, `2M`, or an integer) to a positive integer; null when malformed. */
401
+ declare function parseCount(v: unknown): number | null;
402
+ /** The program argv0 names: its basename without trailing dots, spaces, `.exe` or `.com` (the denylists name programs). */
403
+ declare function programName(argv0: string): string;
404
+ /** The §3.1 issues of a `run` argv (empty when it passes); paths are rooted at `path`. */
405
+ declare function argvIssues(argv: unknown, path: string): LoopIssue[];
406
+ /** sha256 hex of canonicalJson(parsed definition): the content hash a call pin (`id@hash8`) names. */
407
+ declare function loopContentHash(parsed: unknown): string;
408
+ /** Repo-relative path words of an argv (`--opt=value` values too); absolute, `~`, `\\` and `..` words are not repo paths. */
409
+ declare function argvPathWords(argv: readonly unknown[]): string[];
410
+ /** Validate a parsed `loop:v2` definition. Pure: never reads the filesystem. */
411
+ declare function validateLoop(input: unknown, opts?: LoopValidateOptions): LoopValidation;
412
+ /**
413
+ * Validate, then compile to the kernel's form: every default filled (an absent budget field is the global
414
+ * default), durations in seconds, edges expanded, flows resolved when a flow index is given.
415
+ */
416
+ declare function compileLoop(input: unknown, opts?: LoopCompileOptions): LoopCompilation;
417
+ /** The stable hashing form of a compiled loop: sorted keys, no whitespace (gnomon-contracts canonicalJson). */
418
+ declare function canonicalLoopJson(compiled: CompiledLoop): string;
419
+ /** The file form (`<id>.loop.json`): the canonical key order, indented, with a trailing newline. */
420
+ declare function loopFileJson(compiled: CompiledLoop): string;
421
+ /** One-line rendering of an issue for CLI and MCP output. */
422
+ declare function formatLoopIssue(i: LoopIssue): string;
423
+
424
+ interface CompiledValidation {
425
+ ok: boolean;
426
+ errors: LoopIssue[];
427
+ /** The normalized compiled loop (the re-compile), when ok. Its `protected` is the loop's OWN set (no callees). */
428
+ compiled?: CompiledLoop;
429
+ }
430
+ /**
431
+ * Re-validate a parsed `<id>.loop.json` (see the header). `scope` is where the registry found it; `fileId` the file
432
+ * name's id (they must agree with the content).
433
+ */
434
+ declare function validateCompiledLoop(value: unknown, opts: {
435
+ scope: 'repo' | 'personal';
436
+ fileId?: string;
437
+ }): CompiledValidation;
438
+
439
+ export { CALL_VERDICTS, CHECK_VERDICTS, LANDS_IN_8_1, LOOP_ALWAYS_PROTECTED, LOOP_ARGV0_CHECKER_ALLOW, LOOP_AUTONOMY, LOOP_BUDGET_DEFAULTS, LOOP_BUILTINS, LOOP_CALL_DEPTH_MAX, LOOP_COMPILED_VERSION, LOOP_CONTINUOUS_MIN_COOLDOWN_SEC, LOOP_DECIDE, LOOP_DEFAULTS, LOOP_ENV_FILES_MAX, LOOP_EVENT_KINDS, LOOP_ID_MAX, LOOP_INPUT_ROOTS, LOOP_JSON_OPS, LOOP_MODEL_ROLES, LOOP_NOTIFY_AS, LOOP_NOTIFY_ON, LOOP_PARADIGM_TOOLS, LOOP_PARSERS, LOOP_SCHEMA, LOOP_TERMINALS, LOOP_WEEKDAYS, MODEL_VERDICTS, TOAST_VERDICTS, argvIssues, argvPathWords, canonicalLoopJson, compileLoop, formatLoopIssue, loopContentHash, loopFileJson, parseCount, parseDurationSec, programName, validateCompiledLoop, validateLoop };
440
+ export type { CallNode, CheckNode, CheckPass, CompiledLoop, CompiledNode, CompiledTrigger, CompiledValidation, Count, Duration, EdgeMap, LoopBudgets, LoopBuiltin, LoopCompilation, LoopCompileOptions, LoopDefinition, LoopIssue, LoopNode, LoopSchedule, LoopTerminal, LoopTrigger, LoopValidateOptions, LoopValidation, ModelNode, ModelTool, NodeExit, NotifyNode };