@almadar/std 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/LICENSE +72 -0
  2. package/dist/behaviors/action-affinity.d.ts +88 -0
  3. package/dist/behaviors/action-affinity.js +290 -0
  4. package/dist/behaviors/action-affinity.js.map +1 -0
  5. package/dist/behaviors/async.d.ts +20 -0
  6. package/dist/behaviors/async.js +542 -0
  7. package/dist/behaviors/async.js.map +1 -0
  8. package/dist/behaviors/data-management.d.ts +40 -0
  9. package/dist/behaviors/data-management.js +495 -0
  10. package/dist/behaviors/data-management.js.map +1 -0
  11. package/dist/behaviors/feedback.d.ts +18 -0
  12. package/dist/behaviors/feedback.js +307 -0
  13. package/dist/behaviors/feedback.js.map +1 -0
  14. package/dist/behaviors/game-core.d.ts +40 -0
  15. package/dist/behaviors/game-core.js +443 -0
  16. package/dist/behaviors/game-core.js.map +1 -0
  17. package/dist/behaviors/game-entity.d.ts +39 -0
  18. package/dist/behaviors/game-entity.js +643 -0
  19. package/dist/behaviors/game-entity.js.map +1 -0
  20. package/dist/behaviors/game-ui.d.ts +29 -0
  21. package/dist/behaviors/game-ui.js +493 -0
  22. package/dist/behaviors/game-ui.js.map +1 -0
  23. package/dist/behaviors/index.d.ts +11 -0
  24. package/dist/behaviors/index.js +4539 -0
  25. package/dist/behaviors/index.js.map +1 -0
  26. package/dist/behaviors/registry.d.ts +103 -0
  27. package/dist/behaviors/registry.js +4166 -0
  28. package/dist/behaviors/registry.js.map +1 -0
  29. package/dist/behaviors/types.d.ts +179 -0
  30. package/dist/behaviors/types.js +111 -0
  31. package/dist/behaviors/types.js.map +1 -0
  32. package/dist/behaviors/ui-interaction.d.ts +36 -0
  33. package/dist/behaviors/ui-interaction.js +1104 -0
  34. package/dist/behaviors/ui-interaction.js.map +1 -0
  35. package/dist/index.d.ts +195 -0
  36. package/dist/index.js +8209 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/modules/array.d.ts +28 -0
  39. package/dist/modules/array.js +556 -0
  40. package/dist/modules/array.js.map +1 -0
  41. package/dist/modules/async.d.ts +22 -0
  42. package/dist/modules/async.js +112 -0
  43. package/dist/modules/async.js.map +1 -0
  44. package/dist/modules/format.d.ts +21 -0
  45. package/dist/modules/format.js +129 -0
  46. package/dist/modules/format.js.map +1 -0
  47. package/dist/modules/index.d.ts +12 -0
  48. package/dist/modules/index.js +3131 -0
  49. package/dist/modules/index.js.map +1 -0
  50. package/dist/modules/math.d.ts +22 -0
  51. package/dist/modules/math.js +215 -0
  52. package/dist/modules/math.js.map +1 -0
  53. package/dist/modules/nn.d.ts +23 -0
  54. package/dist/modules/nn.js +189 -0
  55. package/dist/modules/nn.js.map +1 -0
  56. package/dist/modules/object.d.ts +22 -0
  57. package/dist/modules/object.js +257 -0
  58. package/dist/modules/object.js.map +1 -0
  59. package/dist/modules/str.d.ts +21 -0
  60. package/dist/modules/str.js +344 -0
  61. package/dist/modules/str.js.map +1 -0
  62. package/dist/modules/tensor.d.ts +23 -0
  63. package/dist/modules/tensor.js +427 -0
  64. package/dist/modules/tensor.js.map +1 -0
  65. package/dist/modules/time.d.ts +24 -0
  66. package/dist/modules/time.js +323 -0
  67. package/dist/modules/time.js.map +1 -0
  68. package/dist/modules/train.d.ts +23 -0
  69. package/dist/modules/train.js +308 -0
  70. package/dist/modules/train.js.map +1 -0
  71. package/dist/modules/validate.d.ts +23 -0
  72. package/dist/modules/validate.js +301 -0
  73. package/dist/modules/validate.js.map +1 -0
  74. package/dist/registry.d.ts +140 -0
  75. package/dist/registry.js +3240 -0
  76. package/dist/registry.js.map +1 -0
  77. package/dist/types-I95R8_FN.d.ts +91 -0
  78. package/package.json +59 -0
@@ -0,0 +1,3240 @@
1
+ // types.ts
2
+ var STD_MODULES = [
3
+ "math",
4
+ "str",
5
+ "array",
6
+ "object",
7
+ "time",
8
+ "validate",
9
+ "format",
10
+ "async",
11
+ "nn",
12
+ "tensor",
13
+ "train"
14
+ ];
15
+ function getModuleFromOperator(operator) {
16
+ const parts = operator.split("/");
17
+ if (parts.length !== 2) return null;
18
+ const module = parts[0];
19
+ return STD_MODULES.includes(module) ? module : null;
20
+ }
21
+ function isStdOperator(operator) {
22
+ return getModuleFromOperator(operator) !== null;
23
+ }
24
+
25
+ // modules/math.ts
26
+ var MATH_OPERATORS = {
27
+ "math/abs": {
28
+ module: "math",
29
+ category: "std-math",
30
+ minArity: 1,
31
+ maxArity: 1,
32
+ description: "Absolute value",
33
+ hasSideEffects: false,
34
+ returnType: "number",
35
+ params: [{ name: "n", type: "number", description: "The number" }],
36
+ example: '["math/abs", -5] // => 5'
37
+ },
38
+ "math/min": {
39
+ module: "math",
40
+ category: "std-math",
41
+ minArity: 2,
42
+ maxArity: null,
43
+ description: "Minimum of values",
44
+ hasSideEffects: false,
45
+ returnType: "number",
46
+ params: [{ name: "...nums", type: "number[]", description: "Numbers to compare" }],
47
+ example: '["math/min", 3, 1, 4] // => 1'
48
+ },
49
+ "math/max": {
50
+ module: "math",
51
+ category: "std-math",
52
+ minArity: 2,
53
+ maxArity: null,
54
+ description: "Maximum of values",
55
+ hasSideEffects: false,
56
+ returnType: "number",
57
+ params: [{ name: "...nums", type: "number[]", description: "Numbers to compare" }],
58
+ example: '["math/max", 3, 1, 4] // => 4'
59
+ },
60
+ "math/clamp": {
61
+ module: "math",
62
+ category: "std-math",
63
+ minArity: 3,
64
+ maxArity: 3,
65
+ description: "Constrain value to range [min, max]",
66
+ hasSideEffects: false,
67
+ returnType: "number",
68
+ params: [
69
+ { name: "n", type: "number", description: "The value to clamp" },
70
+ { name: "min", type: "number", description: "Minimum bound" },
71
+ { name: "max", type: "number", description: "Maximum bound" }
72
+ ],
73
+ example: '["math/clamp", 150, 0, 100] // => 100'
74
+ },
75
+ "math/floor": {
76
+ module: "math",
77
+ category: "std-math",
78
+ minArity: 1,
79
+ maxArity: 1,
80
+ description: "Round down to integer",
81
+ hasSideEffects: false,
82
+ returnType: "number",
83
+ params: [{ name: "n", type: "number", description: "The number" }],
84
+ example: '["math/floor", 3.7] // => 3'
85
+ },
86
+ "math/ceil": {
87
+ module: "math",
88
+ category: "std-math",
89
+ minArity: 1,
90
+ maxArity: 1,
91
+ description: "Round up to integer",
92
+ hasSideEffects: false,
93
+ returnType: "number",
94
+ params: [{ name: "n", type: "number", description: "The number" }],
95
+ example: '["math/ceil", 3.2] // => 4'
96
+ },
97
+ "math/round": {
98
+ module: "math",
99
+ category: "std-math",
100
+ minArity: 1,
101
+ maxArity: 2,
102
+ description: "Round to nearest integer or specified decimals",
103
+ hasSideEffects: false,
104
+ returnType: "number",
105
+ params: [
106
+ { name: "n", type: "number", description: "The number" },
107
+ { name: "decimals", type: "number", description: "Decimal places", optional: true, defaultValue: 0 }
108
+ ],
109
+ example: '["math/round", 3.456, 2] // => 3.46'
110
+ },
111
+ "math/pow": {
112
+ module: "math",
113
+ category: "std-math",
114
+ minArity: 2,
115
+ maxArity: 2,
116
+ description: "Exponentiation (base^exp)",
117
+ hasSideEffects: false,
118
+ returnType: "number",
119
+ params: [
120
+ { name: "base", type: "number", description: "The base" },
121
+ { name: "exp", type: "number", description: "The exponent" }
122
+ ],
123
+ example: '["math/pow", 2, 8] // => 256'
124
+ },
125
+ "math/sqrt": {
126
+ module: "math",
127
+ category: "std-math",
128
+ minArity: 1,
129
+ maxArity: 1,
130
+ description: "Square root",
131
+ hasSideEffects: false,
132
+ returnType: "number",
133
+ params: [{ name: "n", type: "number", description: "The number" }],
134
+ example: '["math/sqrt", 16] // => 4'
135
+ },
136
+ "math/mod": {
137
+ module: "math",
138
+ category: "std-math",
139
+ minArity: 2,
140
+ maxArity: 2,
141
+ description: "Modulo (remainder)",
142
+ hasSideEffects: false,
143
+ returnType: "number",
144
+ params: [
145
+ { name: "a", type: "number", description: "Dividend" },
146
+ { name: "b", type: "number", description: "Divisor" }
147
+ ],
148
+ example: '["math/mod", 7, 3] // => 1'
149
+ },
150
+ "math/sign": {
151
+ module: "math",
152
+ category: "std-math",
153
+ minArity: 1,
154
+ maxArity: 1,
155
+ description: "Returns -1, 0, or 1 indicating sign",
156
+ hasSideEffects: false,
157
+ returnType: "number",
158
+ params: [{ name: "n", type: "number", description: "The number" }],
159
+ example: '["math/sign", -42] // => -1'
160
+ },
161
+ "math/lerp": {
162
+ module: "math",
163
+ category: "std-math",
164
+ minArity: 3,
165
+ maxArity: 3,
166
+ description: "Linear interpolation between a and b by factor t",
167
+ hasSideEffects: false,
168
+ returnType: "number",
169
+ params: [
170
+ { name: "a", type: "number", description: "Start value" },
171
+ { name: "b", type: "number", description: "End value" },
172
+ { name: "t", type: "number", description: "Interpolation factor (0-1)" }
173
+ ],
174
+ example: '["math/lerp", 0, 100, 0.5] // => 50'
175
+ },
176
+ "math/map": {
177
+ module: "math",
178
+ category: "std-math",
179
+ minArity: 5,
180
+ maxArity: 5,
181
+ description: "Map value from one range to another",
182
+ hasSideEffects: false,
183
+ returnType: "number",
184
+ params: [
185
+ { name: "n", type: "number", description: "The value" },
186
+ { name: "inMin", type: "number", description: "Input range minimum" },
187
+ { name: "inMax", type: "number", description: "Input range maximum" },
188
+ { name: "outMin", type: "number", description: "Output range minimum" },
189
+ { name: "outMax", type: "number", description: "Output range maximum" }
190
+ ],
191
+ example: '["math/map", 5, 0, 10, 0, 100] // => 50'
192
+ },
193
+ "math/random": {
194
+ module: "math",
195
+ category: "std-math",
196
+ minArity: 0,
197
+ maxArity: 0,
198
+ description: "Random number between 0 (inclusive) and 1 (exclusive)",
199
+ hasSideEffects: false,
200
+ returnType: "number",
201
+ params: [],
202
+ example: '["math/random"] // => 0.7234...'
203
+ },
204
+ "math/randomInt": {
205
+ module: "math",
206
+ category: "std-math",
207
+ minArity: 2,
208
+ maxArity: 2,
209
+ description: "Random integer in range [min, max] (inclusive)",
210
+ hasSideEffects: false,
211
+ returnType: "number",
212
+ params: [
213
+ { name: "min", type: "number", description: "Minimum (inclusive)" },
214
+ { name: "max", type: "number", description: "Maximum (inclusive)" }
215
+ ],
216
+ example: '["math/randomInt", 1, 6] // => 4'
217
+ },
218
+ "math/default": {
219
+ module: "math",
220
+ category: "std-math",
221
+ minArity: 2,
222
+ maxArity: 2,
223
+ description: "Return default if value is null, undefined, or NaN",
224
+ hasSideEffects: false,
225
+ returnType: "number",
226
+ params: [
227
+ { name: "n", type: "number | null", description: "The value" },
228
+ { name: "default", type: "number", description: "Default value" }
229
+ ],
230
+ example: '["math/default", null, 0] // => 0'
231
+ }
232
+ };
233
+
234
+ // modules/str.ts
235
+ var STR_OPERATORS = {
236
+ "str/len": {
237
+ module: "str",
238
+ category: "std-str",
239
+ minArity: 1,
240
+ maxArity: 1,
241
+ description: "String length",
242
+ hasSideEffects: false,
243
+ returnType: "number",
244
+ params: [{ name: "s", type: "string", description: "The string" }],
245
+ example: '["str/len", "hello"] // => 5'
246
+ },
247
+ "str/upper": {
248
+ module: "str",
249
+ category: "std-str",
250
+ minArity: 1,
251
+ maxArity: 1,
252
+ description: "Convert to uppercase",
253
+ hasSideEffects: false,
254
+ returnType: "string",
255
+ params: [{ name: "s", type: "string", description: "The string" }],
256
+ example: '["str/upper", "hello"] // => "HELLO"'
257
+ },
258
+ "str/lower": {
259
+ module: "str",
260
+ category: "std-str",
261
+ minArity: 1,
262
+ maxArity: 1,
263
+ description: "Convert to lowercase",
264
+ hasSideEffects: false,
265
+ returnType: "string",
266
+ params: [{ name: "s", type: "string", description: "The string" }],
267
+ example: '["str/lower", "HELLO"] // => "hello"'
268
+ },
269
+ "str/trim": {
270
+ module: "str",
271
+ category: "std-str",
272
+ minArity: 1,
273
+ maxArity: 1,
274
+ description: "Remove leading and trailing whitespace",
275
+ hasSideEffects: false,
276
+ returnType: "string",
277
+ params: [{ name: "s", type: "string", description: "The string" }],
278
+ example: '["str/trim", " hello "] // => "hello"'
279
+ },
280
+ "str/trimStart": {
281
+ module: "str",
282
+ category: "std-str",
283
+ minArity: 1,
284
+ maxArity: 1,
285
+ description: "Remove leading whitespace",
286
+ hasSideEffects: false,
287
+ returnType: "string",
288
+ params: [{ name: "s", type: "string", description: "The string" }],
289
+ example: '["str/trimStart", " hello"] // => "hello"'
290
+ },
291
+ "str/trimEnd": {
292
+ module: "str",
293
+ category: "std-str",
294
+ minArity: 1,
295
+ maxArity: 1,
296
+ description: "Remove trailing whitespace",
297
+ hasSideEffects: false,
298
+ returnType: "string",
299
+ params: [{ name: "s", type: "string", description: "The string" }],
300
+ example: '["str/trimEnd", "hello "] // => "hello"'
301
+ },
302
+ "str/split": {
303
+ module: "str",
304
+ category: "std-str",
305
+ minArity: 2,
306
+ maxArity: 2,
307
+ description: "Split string into array by delimiter",
308
+ hasSideEffects: false,
309
+ returnType: "array",
310
+ params: [
311
+ { name: "s", type: "string", description: "The string" },
312
+ { name: "delim", type: "string", description: "Delimiter" }
313
+ ],
314
+ example: '["str/split", "a,b,c", ","] // => ["a", "b", "c"]'
315
+ },
316
+ "str/join": {
317
+ module: "str",
318
+ category: "std-str",
319
+ minArity: 2,
320
+ maxArity: 2,
321
+ description: "Join array elements into string",
322
+ hasSideEffects: false,
323
+ returnType: "string",
324
+ params: [
325
+ { name: "arr", type: "array", description: "Array to join" },
326
+ { name: "delim", type: "string", description: "Delimiter" }
327
+ ],
328
+ example: '["str/join", ["a", "b", "c"], ", "] // => "a, b, c"'
329
+ },
330
+ "str/slice": {
331
+ module: "str",
332
+ category: "std-str",
333
+ minArity: 2,
334
+ maxArity: 3,
335
+ description: "Extract substring",
336
+ hasSideEffects: false,
337
+ returnType: "string",
338
+ params: [
339
+ { name: "s", type: "string", description: "The string" },
340
+ { name: "start", type: "number", description: "Start index" },
341
+ { name: "end", type: "number", description: "End index (exclusive)", optional: true }
342
+ ],
343
+ example: '["str/slice", "hello", 1, 4] // => "ell"'
344
+ },
345
+ "str/replace": {
346
+ module: "str",
347
+ category: "std-str",
348
+ minArity: 3,
349
+ maxArity: 3,
350
+ description: "Replace first occurrence",
351
+ hasSideEffects: false,
352
+ returnType: "string",
353
+ params: [
354
+ { name: "s", type: "string", description: "The string" },
355
+ { name: "find", type: "string", description: "String to find" },
356
+ { name: "replace", type: "string", description: "Replacement" }
357
+ ],
358
+ example: '["str/replace", "hello world", "world", "there"] // => "hello there"'
359
+ },
360
+ "str/replaceAll": {
361
+ module: "str",
362
+ category: "std-str",
363
+ minArity: 3,
364
+ maxArity: 3,
365
+ description: "Replace all occurrences",
366
+ hasSideEffects: false,
367
+ returnType: "string",
368
+ params: [
369
+ { name: "s", type: "string", description: "The string" },
370
+ { name: "find", type: "string", description: "String to find" },
371
+ { name: "replace", type: "string", description: "Replacement" }
372
+ ],
373
+ example: '["str/replaceAll", "a-b-c", "-", "_"] // => "a_b_c"'
374
+ },
375
+ "str/includes": {
376
+ module: "str",
377
+ category: "std-str",
378
+ minArity: 2,
379
+ maxArity: 2,
380
+ description: "Check if string contains substring",
381
+ hasSideEffects: false,
382
+ returnType: "boolean",
383
+ params: [
384
+ { name: "s", type: "string", description: "The string" },
385
+ { name: "search", type: "string", description: "Substring to find" }
386
+ ],
387
+ example: '["str/includes", "hello world", "world"] // => true'
388
+ },
389
+ "str/startsWith": {
390
+ module: "str",
391
+ category: "std-str",
392
+ minArity: 2,
393
+ maxArity: 2,
394
+ description: "Check if string starts with prefix",
395
+ hasSideEffects: false,
396
+ returnType: "boolean",
397
+ params: [
398
+ { name: "s", type: "string", description: "The string" },
399
+ { name: "prefix", type: "string", description: "Prefix to check" }
400
+ ],
401
+ example: '["str/startsWith", "hello", "hel"] // => true'
402
+ },
403
+ "str/endsWith": {
404
+ module: "str",
405
+ category: "std-str",
406
+ minArity: 2,
407
+ maxArity: 2,
408
+ description: "Check if string ends with suffix",
409
+ hasSideEffects: false,
410
+ returnType: "boolean",
411
+ params: [
412
+ { name: "s", type: "string", description: "The string" },
413
+ { name: "suffix", type: "string", description: "Suffix to check" }
414
+ ],
415
+ example: '["str/endsWith", "hello", "lo"] // => true'
416
+ },
417
+ "str/padStart": {
418
+ module: "str",
419
+ category: "std-str",
420
+ minArity: 2,
421
+ maxArity: 3,
422
+ description: "Pad string from start to target length",
423
+ hasSideEffects: false,
424
+ returnType: "string",
425
+ params: [
426
+ { name: "s", type: "string", description: "The string" },
427
+ { name: "len", type: "number", description: "Target length" },
428
+ { name: "char", type: "string", description: "Padding character", optional: true, defaultValue: " " }
429
+ ],
430
+ example: '["str/padStart", "5", 3, "0"] // => "005"'
431
+ },
432
+ "str/padEnd": {
433
+ module: "str",
434
+ category: "std-str",
435
+ minArity: 2,
436
+ maxArity: 3,
437
+ description: "Pad string from end to target length",
438
+ hasSideEffects: false,
439
+ returnType: "string",
440
+ params: [
441
+ { name: "s", type: "string", description: "The string" },
442
+ { name: "len", type: "number", description: "Target length" },
443
+ { name: "char", type: "string", description: "Padding character", optional: true, defaultValue: " " }
444
+ ],
445
+ example: '["str/padEnd", "5", 3, "0"] // => "500"'
446
+ },
447
+ "str/repeat": {
448
+ module: "str",
449
+ category: "std-str",
450
+ minArity: 2,
451
+ maxArity: 2,
452
+ description: "Repeat string n times",
453
+ hasSideEffects: false,
454
+ returnType: "string",
455
+ params: [
456
+ { name: "s", type: "string", description: "The string" },
457
+ { name: "count", type: "number", description: "Repeat count" }
458
+ ],
459
+ example: '["str/repeat", "ab", 3] // => "ababab"'
460
+ },
461
+ "str/reverse": {
462
+ module: "str",
463
+ category: "std-str",
464
+ minArity: 1,
465
+ maxArity: 1,
466
+ description: "Reverse string",
467
+ hasSideEffects: false,
468
+ returnType: "string",
469
+ params: [{ name: "s", type: "string", description: "The string" }],
470
+ example: '["str/reverse", "hello"] // => "olleh"'
471
+ },
472
+ "str/capitalize": {
473
+ module: "str",
474
+ category: "std-str",
475
+ minArity: 1,
476
+ maxArity: 1,
477
+ description: "Capitalize first character",
478
+ hasSideEffects: false,
479
+ returnType: "string",
480
+ params: [{ name: "s", type: "string", description: "The string" }],
481
+ example: '["str/capitalize", "hello"] // => "Hello"'
482
+ },
483
+ "str/titleCase": {
484
+ module: "str",
485
+ category: "std-str",
486
+ minArity: 1,
487
+ maxArity: 1,
488
+ description: "Convert to Title Case",
489
+ hasSideEffects: false,
490
+ returnType: "string",
491
+ params: [{ name: "s", type: "string", description: "The string" }],
492
+ example: '["str/titleCase", "hello world"] // => "Hello World"'
493
+ },
494
+ "str/camelCase": {
495
+ module: "str",
496
+ category: "std-str",
497
+ minArity: 1,
498
+ maxArity: 1,
499
+ description: "Convert to camelCase",
500
+ hasSideEffects: false,
501
+ returnType: "string",
502
+ params: [{ name: "s", type: "string", description: "The string" }],
503
+ example: '["str/camelCase", "hello world"] // => "helloWorld"'
504
+ },
505
+ "str/kebabCase": {
506
+ module: "str",
507
+ category: "std-str",
508
+ minArity: 1,
509
+ maxArity: 1,
510
+ description: "Convert to kebab-case",
511
+ hasSideEffects: false,
512
+ returnType: "string",
513
+ params: [{ name: "s", type: "string", description: "The string" }],
514
+ example: '["str/kebabCase", "Hello World"] // => "hello-world"'
515
+ },
516
+ "str/snakeCase": {
517
+ module: "str",
518
+ category: "std-str",
519
+ minArity: 1,
520
+ maxArity: 1,
521
+ description: "Convert to snake_case",
522
+ hasSideEffects: false,
523
+ returnType: "string",
524
+ params: [{ name: "s", type: "string", description: "The string" }],
525
+ example: '["str/snakeCase", "Hello World"] // => "hello_world"'
526
+ },
527
+ "str/default": {
528
+ module: "str",
529
+ category: "std-str",
530
+ minArity: 2,
531
+ maxArity: 2,
532
+ description: "Return default if value is null/undefined/empty",
533
+ hasSideEffects: false,
534
+ returnType: "string",
535
+ params: [
536
+ { name: "s", type: "string | null", description: "The value" },
537
+ { name: "default", type: "string", description: "Default value" }
538
+ ],
539
+ example: '["str/default", null, "N/A"] // => "N/A"'
540
+ },
541
+ "str/template": {
542
+ module: "str",
543
+ category: "std-str",
544
+ minArity: 2,
545
+ maxArity: 2,
546
+ description: "Variable substitution in template string",
547
+ hasSideEffects: false,
548
+ returnType: "string",
549
+ params: [
550
+ { name: "template", type: "string", description: "Template with {placeholders}" },
551
+ { name: "vars", type: "object", description: "Variables to substitute" }
552
+ ],
553
+ example: '["str/template", "Hello, {name}!", {"name": "World"}] // => "Hello, World!"'
554
+ },
555
+ "str/truncate": {
556
+ module: "str",
557
+ category: "std-str",
558
+ minArity: 2,
559
+ maxArity: 3,
560
+ description: "Truncate string with optional suffix",
561
+ hasSideEffects: false,
562
+ returnType: "string",
563
+ params: [
564
+ { name: "s", type: "string", description: "The string" },
565
+ { name: "len", type: "number", description: "Maximum length" },
566
+ { name: "suffix", type: "string", description: "Suffix for truncated strings", optional: true, defaultValue: "..." }
567
+ ],
568
+ example: '["str/truncate", "Hello World", 8, "..."] // => "Hello..."'
569
+ }
570
+ };
571
+
572
+ // modules/array.ts
573
+ var ARRAY_OPERATORS = {
574
+ "array/len": {
575
+ module: "array",
576
+ category: "std-array",
577
+ minArity: 1,
578
+ maxArity: 1,
579
+ description: "Array length",
580
+ hasSideEffects: false,
581
+ returnType: "number",
582
+ params: [{ name: "arr", type: "array", description: "The array" }],
583
+ example: '["array/len", [1, 2, 3]] // => 3'
584
+ },
585
+ "array/empty?": {
586
+ module: "array",
587
+ category: "std-array",
588
+ minArity: 1,
589
+ maxArity: 1,
590
+ description: "Check if array is empty",
591
+ hasSideEffects: false,
592
+ returnType: "boolean",
593
+ params: [{ name: "arr", type: "array", description: "The array" }],
594
+ example: '["array/empty?", []] // => true'
595
+ },
596
+ "array/first": {
597
+ module: "array",
598
+ category: "std-array",
599
+ minArity: 1,
600
+ maxArity: 1,
601
+ description: "Get first element",
602
+ hasSideEffects: false,
603
+ returnType: "any",
604
+ params: [{ name: "arr", type: "array", description: "The array" }],
605
+ example: '["array/first", [1, 2, 3]] // => 1'
606
+ },
607
+ "array/last": {
608
+ module: "array",
609
+ category: "std-array",
610
+ minArity: 1,
611
+ maxArity: 1,
612
+ description: "Get last element",
613
+ hasSideEffects: false,
614
+ returnType: "any",
615
+ params: [{ name: "arr", type: "array", description: "The array" }],
616
+ example: '["array/last", [1, 2, 3]] // => 3'
617
+ },
618
+ "array/nth": {
619
+ module: "array",
620
+ category: "std-array",
621
+ minArity: 2,
622
+ maxArity: 2,
623
+ description: "Get element at index",
624
+ hasSideEffects: false,
625
+ returnType: "any",
626
+ params: [
627
+ { name: "arr", type: "array", description: "The array" },
628
+ { name: "index", type: "number", description: "Index (0-based)" }
629
+ ],
630
+ example: '["array/nth", [1, 2, 3], 1] // => 2'
631
+ },
632
+ "array/slice": {
633
+ module: "array",
634
+ category: "std-array",
635
+ minArity: 2,
636
+ maxArity: 3,
637
+ description: "Extract subarray",
638
+ hasSideEffects: false,
639
+ returnType: "array",
640
+ params: [
641
+ { name: "arr", type: "array", description: "The array" },
642
+ { name: "start", type: "number", description: "Start index" },
643
+ { name: "end", type: "number", description: "End index (exclusive)", optional: true }
644
+ ],
645
+ example: '["array/slice", [1, 2, 3, 4], 1, 3] // => [2, 3]'
646
+ },
647
+ "array/concat": {
648
+ module: "array",
649
+ category: "std-array",
650
+ minArity: 2,
651
+ maxArity: null,
652
+ description: "Concatenate arrays",
653
+ hasSideEffects: false,
654
+ returnType: "array",
655
+ params: [{ name: "...arrs", type: "array[]", description: "Arrays to concatenate" }],
656
+ example: '["array/concat", [1, 2], [3, 4]] // => [1, 2, 3, 4]'
657
+ },
658
+ "array/append": {
659
+ module: "array",
660
+ category: "std-array",
661
+ minArity: 2,
662
+ maxArity: 2,
663
+ description: "Add item to end (returns new array)",
664
+ hasSideEffects: false,
665
+ returnType: "array",
666
+ params: [
667
+ { name: "arr", type: "array", description: "The array" },
668
+ { name: "item", type: "any", description: "Item to add" }
669
+ ],
670
+ example: '["array/append", [1, 2], 3] // => [1, 2, 3]'
671
+ },
672
+ "array/prepend": {
673
+ module: "array",
674
+ category: "std-array",
675
+ minArity: 2,
676
+ maxArity: 2,
677
+ description: "Add item to start (returns new array)",
678
+ hasSideEffects: false,
679
+ returnType: "array",
680
+ params: [
681
+ { name: "arr", type: "array", description: "The array" },
682
+ { name: "item", type: "any", description: "Item to add" }
683
+ ],
684
+ example: '["array/prepend", [2, 3], 1] // => [1, 2, 3]'
685
+ },
686
+ "array/insert": {
687
+ module: "array",
688
+ category: "std-array",
689
+ minArity: 3,
690
+ maxArity: 3,
691
+ description: "Insert item at index (returns new array)",
692
+ hasSideEffects: false,
693
+ returnType: "array",
694
+ params: [
695
+ { name: "arr", type: "array", description: "The array" },
696
+ { name: "index", type: "number", description: "Index to insert at" },
697
+ { name: "item", type: "any", description: "Item to insert" }
698
+ ],
699
+ example: '["array/insert", [1, 3], 1, 2] // => [1, 2, 3]'
700
+ },
701
+ "array/remove": {
702
+ module: "array",
703
+ category: "std-array",
704
+ minArity: 2,
705
+ maxArity: 2,
706
+ description: "Remove item at index (returns new array)",
707
+ hasSideEffects: false,
708
+ returnType: "array",
709
+ params: [
710
+ { name: "arr", type: "array", description: "The array" },
711
+ { name: "index", type: "number", description: "Index to remove" }
712
+ ],
713
+ example: '["array/remove", [1, 2, 3], 1] // => [1, 3]'
714
+ },
715
+ "array/removeItem": {
716
+ module: "array",
717
+ category: "std-array",
718
+ minArity: 2,
719
+ maxArity: 2,
720
+ description: "Remove first matching item (returns new array)",
721
+ hasSideEffects: false,
722
+ returnType: "array",
723
+ params: [
724
+ { name: "arr", type: "array", description: "The array" },
725
+ { name: "item", type: "any", description: "Item to remove" }
726
+ ],
727
+ example: '["array/removeItem", [1, 2, 3, 2], 2] // => [1, 3, 2]'
728
+ },
729
+ "array/reverse": {
730
+ module: "array",
731
+ category: "std-array",
732
+ minArity: 1,
733
+ maxArity: 1,
734
+ description: "Reverse array order (returns new array)",
735
+ hasSideEffects: false,
736
+ returnType: "array",
737
+ params: [{ name: "arr", type: "array", description: "The array" }],
738
+ example: '["array/reverse", [1, 2, 3]] // => [3, 2, 1]'
739
+ },
740
+ "array/sort": {
741
+ module: "array",
742
+ category: "std-array",
743
+ minArity: 1,
744
+ maxArity: 3,
745
+ description: "Sort array (returns new array)",
746
+ hasSideEffects: false,
747
+ returnType: "array",
748
+ params: [
749
+ { name: "arr", type: "array", description: "The array" },
750
+ { name: "key", type: "string", description: "Field to sort by (for objects)", optional: true },
751
+ { name: "dir", type: "string", description: '"asc" or "desc"', optional: true, defaultValue: "asc" }
752
+ ],
753
+ example: '["array/sort", "@items", "price", "desc"]'
754
+ },
755
+ "array/shuffle": {
756
+ module: "array",
757
+ category: "std-array",
758
+ minArity: 1,
759
+ maxArity: 1,
760
+ description: "Randomly shuffle array (returns new array)",
761
+ hasSideEffects: false,
762
+ returnType: "array",
763
+ params: [{ name: "arr", type: "array", description: "The array" }],
764
+ example: '["array/shuffle", [1, 2, 3, 4, 5]]'
765
+ },
766
+ "array/unique": {
767
+ module: "array",
768
+ category: "std-array",
769
+ minArity: 1,
770
+ maxArity: 1,
771
+ description: "Remove duplicates (returns new array)",
772
+ hasSideEffects: false,
773
+ returnType: "array",
774
+ params: [{ name: "arr", type: "array", description: "The array" }],
775
+ example: '["array/unique", [1, 2, 2, 3, 1]] // => [1, 2, 3]'
776
+ },
777
+ "array/flatten": {
778
+ module: "array",
779
+ category: "std-array",
780
+ minArity: 1,
781
+ maxArity: 1,
782
+ description: "Flatten nested arrays one level",
783
+ hasSideEffects: false,
784
+ returnType: "array",
785
+ params: [{ name: "arr", type: "array", description: "The array" }],
786
+ example: '["array/flatten", [[1, 2], [3, 4]]] // => [1, 2, 3, 4]'
787
+ },
788
+ "array/zip": {
789
+ module: "array",
790
+ category: "std-array",
791
+ minArity: 2,
792
+ maxArity: 2,
793
+ description: "Pair elements from two arrays",
794
+ hasSideEffects: false,
795
+ returnType: "array",
796
+ params: [
797
+ { name: "arr1", type: "array", description: "First array" },
798
+ { name: "arr2", type: "array", description: "Second array" }
799
+ ],
800
+ example: '["array/zip", [1, 2], ["a", "b"]] // => [[1, "a"], [2, "b"]]'
801
+ },
802
+ "array/includes": {
803
+ module: "array",
804
+ category: "std-array",
805
+ minArity: 2,
806
+ maxArity: 2,
807
+ description: "Check if array contains item",
808
+ hasSideEffects: false,
809
+ returnType: "boolean",
810
+ params: [
811
+ { name: "arr", type: "array", description: "The array" },
812
+ { name: "item", type: "any", description: "Item to find" }
813
+ ],
814
+ example: '["array/includes", [1, 2, 3], 2] // => true'
815
+ },
816
+ "array/indexOf": {
817
+ module: "array",
818
+ category: "std-array",
819
+ minArity: 2,
820
+ maxArity: 2,
821
+ description: "Find index of item (-1 if not found)",
822
+ hasSideEffects: false,
823
+ returnType: "number",
824
+ params: [
825
+ { name: "arr", type: "array", description: "The array" },
826
+ { name: "item", type: "any", description: "Item to find" }
827
+ ],
828
+ example: '["array/indexOf", [1, 2, 3], 2] // => 1'
829
+ },
830
+ "array/find": {
831
+ module: "array",
832
+ category: "std-array",
833
+ minArity: 2,
834
+ maxArity: 2,
835
+ description: "Find first element matching predicate",
836
+ hasSideEffects: false,
837
+ returnType: "any",
838
+ acceptsLambda: true,
839
+ lambdaArgPosition: 1,
840
+ params: [
841
+ { name: "arr", type: "array", description: "The array" },
842
+ { name: "pred", type: "lambda", description: "Predicate function" }
843
+ ],
844
+ example: '["array/find", "@items", ["fn", "x", ["=", "@x.status", "active"]]]'
845
+ },
846
+ "array/findIndex": {
847
+ module: "array",
848
+ category: "std-array",
849
+ minArity: 2,
850
+ maxArity: 2,
851
+ description: "Find index of first element matching predicate (-1 if none)",
852
+ hasSideEffects: false,
853
+ returnType: "number",
854
+ acceptsLambda: true,
855
+ lambdaArgPosition: 1,
856
+ params: [
857
+ { name: "arr", type: "array", description: "The array" },
858
+ { name: "pred", type: "lambda", description: "Predicate function" }
859
+ ],
860
+ example: '["array/findIndex", "@items", ["fn", "x", ["=", "@x.status", "active"]]]'
861
+ },
862
+ "array/filter": {
863
+ module: "array",
864
+ category: "std-array",
865
+ minArity: 2,
866
+ maxArity: 2,
867
+ description: "Keep elements matching predicate",
868
+ hasSideEffects: false,
869
+ returnType: "array",
870
+ acceptsLambda: true,
871
+ lambdaArgPosition: 1,
872
+ params: [
873
+ { name: "arr", type: "array", description: "The array" },
874
+ { name: "pred", type: "lambda", description: "Predicate function" }
875
+ ],
876
+ example: '["array/filter", "@items", ["fn", "x", [">", "@x.price", 100]]]'
877
+ },
878
+ "array/reject": {
879
+ module: "array",
880
+ category: "std-array",
881
+ minArity: 2,
882
+ maxArity: 2,
883
+ description: "Remove elements matching predicate",
884
+ hasSideEffects: false,
885
+ returnType: "array",
886
+ acceptsLambda: true,
887
+ lambdaArgPosition: 1,
888
+ params: [
889
+ { name: "arr", type: "array", description: "The array" },
890
+ { name: "pred", type: "lambda", description: "Predicate function" }
891
+ ],
892
+ example: '["array/reject", "@items", ["fn", "x", ["=", "@x.status", "deleted"]]]'
893
+ },
894
+ "array/map": {
895
+ module: "array",
896
+ category: "std-array",
897
+ minArity: 2,
898
+ maxArity: 2,
899
+ description: "Transform each element",
900
+ hasSideEffects: false,
901
+ returnType: "array",
902
+ acceptsLambda: true,
903
+ lambdaArgPosition: 1,
904
+ params: [
905
+ { name: "arr", type: "array", description: "The array" },
906
+ { name: "fn", type: "lambda", description: "Transform function" }
907
+ ],
908
+ example: '["array/map", "@items", ["fn", "x", ["*", "@x.price", 1.1]]]'
909
+ },
910
+ "array/reduce": {
911
+ module: "array",
912
+ category: "std-array",
913
+ minArity: 3,
914
+ maxArity: 3,
915
+ description: "Reduce array to single value",
916
+ hasSideEffects: false,
917
+ returnType: "any",
918
+ acceptsLambda: true,
919
+ lambdaArgPosition: 1,
920
+ params: [
921
+ { name: "arr", type: "array", description: "The array" },
922
+ { name: "fn", type: "lambda", description: "Reducer function (acc, item) => newAcc" },
923
+ { name: "init", type: "any", description: "Initial accumulator value" }
924
+ ],
925
+ example: '["array/reduce", "@items", ["fn", ["acc", "x"], ["+", "@acc", "@x.price"]], 0]'
926
+ },
927
+ "array/every": {
928
+ module: "array",
929
+ category: "std-array",
930
+ minArity: 2,
931
+ maxArity: 2,
932
+ description: "Check if all elements match predicate",
933
+ hasSideEffects: false,
934
+ returnType: "boolean",
935
+ acceptsLambda: true,
936
+ lambdaArgPosition: 1,
937
+ params: [
938
+ { name: "arr", type: "array", description: "The array" },
939
+ { name: "pred", type: "lambda", description: "Predicate function" }
940
+ ],
941
+ example: '["array/every", "@items", ["fn", "x", [">", "@x.price", 0]]]'
942
+ },
943
+ "array/some": {
944
+ module: "array",
945
+ category: "std-array",
946
+ minArity: 2,
947
+ maxArity: 2,
948
+ description: "Check if any element matches predicate",
949
+ hasSideEffects: false,
950
+ returnType: "boolean",
951
+ acceptsLambda: true,
952
+ lambdaArgPosition: 1,
953
+ params: [
954
+ { name: "arr", type: "array", description: "The array" },
955
+ { name: "pred", type: "lambda", description: "Predicate function" }
956
+ ],
957
+ example: '["array/some", "@items", ["fn", "x", ["=", "@x.status", "active"]]]'
958
+ },
959
+ "array/count": {
960
+ module: "array",
961
+ category: "std-array",
962
+ minArity: 1,
963
+ maxArity: 2,
964
+ description: "Count elements (optionally matching predicate)",
965
+ hasSideEffects: false,
966
+ returnType: "number",
967
+ acceptsLambda: true,
968
+ lambdaArgPosition: 1,
969
+ params: [
970
+ { name: "arr", type: "array", description: "The array" },
971
+ { name: "pred", type: "lambda", description: "Predicate function", optional: true }
972
+ ],
973
+ example: '["array/count", "@tasks", ["fn", "t", ["=", "@t.status", "done"]]]'
974
+ },
975
+ "array/sum": {
976
+ module: "array",
977
+ category: "std-array",
978
+ minArity: 1,
979
+ maxArity: 2,
980
+ description: "Sum values (optionally by field)",
981
+ hasSideEffects: false,
982
+ returnType: "number",
983
+ params: [
984
+ { name: "arr", type: "array", description: "The array" },
985
+ { name: "key", type: "string", description: "Field to sum", optional: true }
986
+ ],
987
+ example: '["array/sum", "@cart.items", "price"]'
988
+ },
989
+ "array/avg": {
990
+ module: "array",
991
+ category: "std-array",
992
+ minArity: 1,
993
+ maxArity: 2,
994
+ description: "Average of values (optionally by field)",
995
+ hasSideEffects: false,
996
+ returnType: "number",
997
+ params: [
998
+ { name: "arr", type: "array", description: "The array" },
999
+ { name: "key", type: "string", description: "Field to average", optional: true }
1000
+ ],
1001
+ example: '["array/avg", "@ratings", "score"]'
1002
+ },
1003
+ "array/min": {
1004
+ module: "array",
1005
+ category: "std-array",
1006
+ minArity: 1,
1007
+ maxArity: 2,
1008
+ description: "Minimum value (optionally by field)",
1009
+ hasSideEffects: false,
1010
+ returnType: "number",
1011
+ params: [
1012
+ { name: "arr", type: "array", description: "The array" },
1013
+ { name: "key", type: "string", description: "Field to compare", optional: true }
1014
+ ],
1015
+ example: '["array/min", "@products", "price"]'
1016
+ },
1017
+ "array/max": {
1018
+ module: "array",
1019
+ category: "std-array",
1020
+ minArity: 1,
1021
+ maxArity: 2,
1022
+ description: "Maximum value (optionally by field)",
1023
+ hasSideEffects: false,
1024
+ returnType: "number",
1025
+ params: [
1026
+ { name: "arr", type: "array", description: "The array" },
1027
+ { name: "key", type: "string", description: "Field to compare", optional: true }
1028
+ ],
1029
+ example: '["array/max", "@products", "price"]'
1030
+ },
1031
+ "array/groupBy": {
1032
+ module: "array",
1033
+ category: "std-array",
1034
+ minArity: 2,
1035
+ maxArity: 2,
1036
+ description: "Group elements by field value",
1037
+ hasSideEffects: false,
1038
+ returnType: "any",
1039
+ params: [
1040
+ { name: "arr", type: "array", description: "The array" },
1041
+ { name: "key", type: "string", description: "Field to group by" }
1042
+ ],
1043
+ example: '["array/groupBy", "@orders", "status"]'
1044
+ },
1045
+ "array/partition": {
1046
+ module: "array",
1047
+ category: "std-array",
1048
+ minArity: 2,
1049
+ maxArity: 2,
1050
+ description: "Split array by predicate into [matches, nonMatches]",
1051
+ hasSideEffects: false,
1052
+ returnType: "array",
1053
+ acceptsLambda: true,
1054
+ lambdaArgPosition: 1,
1055
+ params: [
1056
+ { name: "arr", type: "array", description: "The array" },
1057
+ { name: "pred", type: "lambda", description: "Predicate function" }
1058
+ ],
1059
+ example: '["array/partition", "@items", ["fn", "x", [">", "@x.price", 50]]]'
1060
+ },
1061
+ "array/take": {
1062
+ module: "array",
1063
+ category: "std-array",
1064
+ minArity: 2,
1065
+ maxArity: 2,
1066
+ description: "Take first n elements",
1067
+ hasSideEffects: false,
1068
+ returnType: "array",
1069
+ params: [
1070
+ { name: "arr", type: "array", description: "The array" },
1071
+ { name: "n", type: "number", description: "Number of elements" }
1072
+ ],
1073
+ example: '["array/take", "@items", 5]'
1074
+ },
1075
+ "array/drop": {
1076
+ module: "array",
1077
+ category: "std-array",
1078
+ minArity: 2,
1079
+ maxArity: 2,
1080
+ description: "Skip first n elements",
1081
+ hasSideEffects: false,
1082
+ returnType: "array",
1083
+ params: [
1084
+ { name: "arr", type: "array", description: "The array" },
1085
+ { name: "n", type: "number", description: "Number of elements to skip" }
1086
+ ],
1087
+ example: '["array/drop", "@items", 5]'
1088
+ },
1089
+ "array/takeLast": {
1090
+ module: "array",
1091
+ category: "std-array",
1092
+ minArity: 2,
1093
+ maxArity: 2,
1094
+ description: "Take last n elements",
1095
+ hasSideEffects: false,
1096
+ returnType: "array",
1097
+ params: [
1098
+ { name: "arr", type: "array", description: "The array" },
1099
+ { name: "n", type: "number", description: "Number of elements" }
1100
+ ],
1101
+ example: '["array/takeLast", "@items", 3]'
1102
+ },
1103
+ "array/dropLast": {
1104
+ module: "array",
1105
+ category: "std-array",
1106
+ minArity: 2,
1107
+ maxArity: 2,
1108
+ description: "Skip last n elements",
1109
+ hasSideEffects: false,
1110
+ returnType: "array",
1111
+ params: [
1112
+ { name: "arr", type: "array", description: "The array" },
1113
+ { name: "n", type: "number", description: "Number of elements to skip" }
1114
+ ],
1115
+ example: '["array/dropLast", "@items", 2]'
1116
+ }
1117
+ };
1118
+
1119
+ // modules/object.ts
1120
+ var OBJECT_OPERATORS = {
1121
+ "object/keys": {
1122
+ module: "object",
1123
+ category: "std-object",
1124
+ minArity: 1,
1125
+ maxArity: 1,
1126
+ description: "Get object keys as array",
1127
+ hasSideEffects: false,
1128
+ returnType: "array",
1129
+ params: [{ name: "obj", type: "object", description: "The object" }],
1130
+ example: '["object/keys", {"a": 1, "b": 2}] // => ["a", "b"]'
1131
+ },
1132
+ "object/values": {
1133
+ module: "object",
1134
+ category: "std-object",
1135
+ minArity: 1,
1136
+ maxArity: 1,
1137
+ description: "Get object values as array",
1138
+ hasSideEffects: false,
1139
+ returnType: "array",
1140
+ params: [{ name: "obj", type: "object", description: "The object" }],
1141
+ example: '["object/values", {"a": 1, "b": 2}] // => [1, 2]'
1142
+ },
1143
+ "object/entries": {
1144
+ module: "object",
1145
+ category: "std-object",
1146
+ minArity: 1,
1147
+ maxArity: 1,
1148
+ description: "Get [key, value] pairs as array",
1149
+ hasSideEffects: false,
1150
+ returnType: "array",
1151
+ params: [{ name: "obj", type: "object", description: "The object" }],
1152
+ example: '["object/entries", {"a": 1}] // => [["a", 1]]'
1153
+ },
1154
+ "object/fromEntries": {
1155
+ module: "object",
1156
+ category: "std-object",
1157
+ minArity: 1,
1158
+ maxArity: 1,
1159
+ description: "Create object from [key, value] pairs",
1160
+ hasSideEffects: false,
1161
+ returnType: "any",
1162
+ params: [{ name: "entries", type: "array", description: "Array of [key, value] pairs" }],
1163
+ example: '["object/fromEntries", [["a", 1], ["b", 2]]] // => {"a": 1, "b": 2}'
1164
+ },
1165
+ "object/get": {
1166
+ module: "object",
1167
+ category: "std-object",
1168
+ minArity: 2,
1169
+ maxArity: 3,
1170
+ description: "Get nested value by path",
1171
+ hasSideEffects: false,
1172
+ returnType: "any",
1173
+ params: [
1174
+ { name: "obj", type: "object", description: "The object" },
1175
+ { name: "path", type: "string", description: 'Dot-separated path (e.g., "user.name")' },
1176
+ { name: "default", type: "any", description: "Default if path not found", optional: true }
1177
+ ],
1178
+ example: '["object/get", "@user", "profile.name", "Anonymous"]'
1179
+ },
1180
+ "object/set": {
1181
+ module: "object",
1182
+ category: "std-object",
1183
+ minArity: 3,
1184
+ maxArity: 3,
1185
+ description: "Set nested value by path (returns new object)",
1186
+ hasSideEffects: false,
1187
+ returnType: "any",
1188
+ params: [
1189
+ { name: "obj", type: "object", description: "The object" },
1190
+ { name: "path", type: "string", description: "Dot-separated path" },
1191
+ { name: "value", type: "any", description: "Value to set" }
1192
+ ],
1193
+ example: '["object/set", "@user", "profile.name", "John"]'
1194
+ },
1195
+ "object/has": {
1196
+ module: "object",
1197
+ category: "std-object",
1198
+ minArity: 2,
1199
+ maxArity: 2,
1200
+ description: "Check if path exists",
1201
+ hasSideEffects: false,
1202
+ returnType: "boolean",
1203
+ params: [
1204
+ { name: "obj", type: "object", description: "The object" },
1205
+ { name: "path", type: "string", description: "Dot-separated path" }
1206
+ ],
1207
+ example: '["object/has", "@user", "profile.name"]'
1208
+ },
1209
+ "object/merge": {
1210
+ module: "object",
1211
+ category: "std-object",
1212
+ minArity: 2,
1213
+ maxArity: null,
1214
+ description: "Shallow merge objects (later wins)",
1215
+ hasSideEffects: false,
1216
+ returnType: "any",
1217
+ params: [{ name: "...objs", type: "object[]", description: "Objects to merge" }],
1218
+ example: '["object/merge", {"a": 1}, {"b": 2}] // => {"a": 1, "b": 2}'
1219
+ },
1220
+ "object/deepMerge": {
1221
+ module: "object",
1222
+ category: "std-object",
1223
+ minArity: 2,
1224
+ maxArity: null,
1225
+ description: "Deep merge objects (later wins)",
1226
+ hasSideEffects: false,
1227
+ returnType: "any",
1228
+ params: [{ name: "...objs", type: "object[]", description: "Objects to merge" }],
1229
+ example: '["object/deepMerge", {"a": {"b": 1}}, {"a": {"c": 2}}]'
1230
+ },
1231
+ "object/pick": {
1232
+ module: "object",
1233
+ category: "std-object",
1234
+ minArity: 2,
1235
+ maxArity: 2,
1236
+ description: "Select only specified keys",
1237
+ hasSideEffects: false,
1238
+ returnType: "any",
1239
+ params: [
1240
+ { name: "obj", type: "object", description: "The object" },
1241
+ { name: "keys", type: "array", description: "Keys to keep" }
1242
+ ],
1243
+ example: '["object/pick", "@entity", ["name", "email"]]'
1244
+ },
1245
+ "object/omit": {
1246
+ module: "object",
1247
+ category: "std-object",
1248
+ minArity: 2,
1249
+ maxArity: 2,
1250
+ description: "Exclude specified keys",
1251
+ hasSideEffects: false,
1252
+ returnType: "any",
1253
+ params: [
1254
+ { name: "obj", type: "object", description: "The object" },
1255
+ { name: "keys", type: "array", description: "Keys to exclude" }
1256
+ ],
1257
+ example: '["object/omit", "@entity", ["password", "secret"]]'
1258
+ },
1259
+ "object/mapValues": {
1260
+ module: "object",
1261
+ category: "std-object",
1262
+ minArity: 2,
1263
+ maxArity: 2,
1264
+ description: "Transform all values",
1265
+ hasSideEffects: false,
1266
+ returnType: "any",
1267
+ acceptsLambda: true,
1268
+ lambdaArgPosition: 1,
1269
+ params: [
1270
+ { name: "obj", type: "object", description: "The object" },
1271
+ { name: "fn", type: "lambda", description: "Transform function" }
1272
+ ],
1273
+ example: '["object/mapValues", "@stats", ["fn", "v", ["*", "@v", 100]]]'
1274
+ },
1275
+ "object/mapKeys": {
1276
+ module: "object",
1277
+ category: "std-object",
1278
+ minArity: 2,
1279
+ maxArity: 2,
1280
+ description: "Transform all keys",
1281
+ hasSideEffects: false,
1282
+ returnType: "any",
1283
+ acceptsLambda: true,
1284
+ lambdaArgPosition: 1,
1285
+ params: [
1286
+ { name: "obj", type: "object", description: "The object" },
1287
+ { name: "fn", type: "lambda", description: "Transform function" }
1288
+ ],
1289
+ example: '["object/mapKeys", "@data", ["fn", "k", ["str/upper", "@k"]]]'
1290
+ },
1291
+ "object/filter": {
1292
+ module: "object",
1293
+ category: "std-object",
1294
+ minArity: 2,
1295
+ maxArity: 2,
1296
+ description: "Filter entries by predicate",
1297
+ hasSideEffects: false,
1298
+ returnType: "any",
1299
+ acceptsLambda: true,
1300
+ lambdaArgPosition: 1,
1301
+ params: [
1302
+ { name: "obj", type: "object", description: "The object" },
1303
+ { name: "pred", type: "lambda", description: "Predicate (key, value) => boolean" }
1304
+ ],
1305
+ example: '["object/filter", "@data", ["fn", ["k", "v"], ["!=", "@v", null]]]'
1306
+ },
1307
+ "object/empty?": {
1308
+ module: "object",
1309
+ category: "std-object",
1310
+ minArity: 1,
1311
+ maxArity: 1,
1312
+ description: "Check if object has no keys",
1313
+ hasSideEffects: false,
1314
+ returnType: "boolean",
1315
+ params: [{ name: "obj", type: "object", description: "The object" }],
1316
+ example: '["object/empty?", {}] // => true'
1317
+ },
1318
+ "object/equals": {
1319
+ module: "object",
1320
+ category: "std-object",
1321
+ minArity: 2,
1322
+ maxArity: 2,
1323
+ description: "Deep equality check",
1324
+ hasSideEffects: false,
1325
+ returnType: "boolean",
1326
+ params: [
1327
+ { name: "a", type: "object", description: "First object" },
1328
+ { name: "b", type: "object", description: "Second object" }
1329
+ ],
1330
+ example: '["object/equals", {"a": 1}, {"a": 1}] // => true'
1331
+ },
1332
+ "object/clone": {
1333
+ module: "object",
1334
+ category: "std-object",
1335
+ minArity: 1,
1336
+ maxArity: 1,
1337
+ description: "Shallow clone object",
1338
+ hasSideEffects: false,
1339
+ returnType: "any",
1340
+ params: [{ name: "obj", type: "object", description: "The object" }],
1341
+ example: '["object/clone", "@entity"]'
1342
+ },
1343
+ "object/deepClone": {
1344
+ module: "object",
1345
+ category: "std-object",
1346
+ minArity: 1,
1347
+ maxArity: 1,
1348
+ description: "Deep clone object",
1349
+ hasSideEffects: false,
1350
+ returnType: "any",
1351
+ params: [{ name: "obj", type: "object", description: "The object" }],
1352
+ example: '["object/deepClone", "@entity"]'
1353
+ },
1354
+ "path": {
1355
+ module: "object",
1356
+ category: "std-object",
1357
+ minArity: 1,
1358
+ maxArity: null,
1359
+ // variadic
1360
+ description: "Build a dot-separated path string from segments. Used with set effect for dynamic field paths.",
1361
+ hasSideEffects: false,
1362
+ returnType: "string",
1363
+ params: [
1364
+ { name: "...segments", type: "string[]", description: "Path segments to join with dots" }
1365
+ ],
1366
+ example: '["path", "formValues", "@payload.fieldId"] // => "formValues.customerName"'
1367
+ }
1368
+ };
1369
+
1370
+ // modules/time.ts
1371
+ var TIME_OPERATORS = {
1372
+ "time/now": {
1373
+ module: "time",
1374
+ category: "std-time",
1375
+ minArity: 0,
1376
+ maxArity: 0,
1377
+ description: "Current timestamp",
1378
+ hasSideEffects: false,
1379
+ returnType: "number",
1380
+ params: [],
1381
+ example: '["time/now"] // => 1705593600000'
1382
+ },
1383
+ "time/today": {
1384
+ module: "time",
1385
+ category: "std-time",
1386
+ minArity: 0,
1387
+ maxArity: 0,
1388
+ description: "Today at midnight (local time)",
1389
+ hasSideEffects: false,
1390
+ returnType: "number",
1391
+ params: [],
1392
+ example: '["time/today"]'
1393
+ },
1394
+ "time/parse": {
1395
+ module: "time",
1396
+ category: "std-time",
1397
+ minArity: 1,
1398
+ maxArity: 2,
1399
+ description: "Parse string to timestamp",
1400
+ hasSideEffects: false,
1401
+ returnType: "number",
1402
+ params: [
1403
+ { name: "str", type: "string", description: "Date string" },
1404
+ { name: "format", type: "string", description: "Format pattern", optional: true }
1405
+ ],
1406
+ example: '["time/parse", "2024-01-18", "YYYY-MM-DD"]'
1407
+ },
1408
+ "time/format": {
1409
+ module: "time",
1410
+ category: "std-time",
1411
+ minArity: 2,
1412
+ maxArity: 2,
1413
+ description: "Format timestamp to string",
1414
+ hasSideEffects: false,
1415
+ returnType: "string",
1416
+ params: [
1417
+ { name: "date", type: "number", description: "Timestamp" },
1418
+ { name: "format", type: "string", description: "Format pattern" }
1419
+ ],
1420
+ example: '["time/format", "@entity.createdAt", "MMM DD, YYYY"]'
1421
+ },
1422
+ "time/year": {
1423
+ module: "time",
1424
+ category: "std-time",
1425
+ minArity: 1,
1426
+ maxArity: 1,
1427
+ description: "Get year from timestamp",
1428
+ hasSideEffects: false,
1429
+ returnType: "number",
1430
+ params: [{ name: "date", type: "number", description: "Timestamp" }],
1431
+ example: '["time/year", "@entity.createdAt"] // => 2024'
1432
+ },
1433
+ "time/month": {
1434
+ module: "time",
1435
+ category: "std-time",
1436
+ minArity: 1,
1437
+ maxArity: 1,
1438
+ description: "Get month from timestamp (1-12)",
1439
+ hasSideEffects: false,
1440
+ returnType: "number",
1441
+ params: [{ name: "date", type: "number", description: "Timestamp" }],
1442
+ example: '["time/month", "@entity.createdAt"] // => 1'
1443
+ },
1444
+ "time/day": {
1445
+ module: "time",
1446
+ category: "std-time",
1447
+ minArity: 1,
1448
+ maxArity: 1,
1449
+ description: "Get day of month from timestamp (1-31)",
1450
+ hasSideEffects: false,
1451
+ returnType: "number",
1452
+ params: [{ name: "date", type: "number", description: "Timestamp" }],
1453
+ example: '["time/day", "@entity.createdAt"] // => 18'
1454
+ },
1455
+ "time/weekday": {
1456
+ module: "time",
1457
+ category: "std-time",
1458
+ minArity: 1,
1459
+ maxArity: 1,
1460
+ description: "Get day of week (0=Sunday, 6=Saturday)",
1461
+ hasSideEffects: false,
1462
+ returnType: "number",
1463
+ params: [{ name: "date", type: "number", description: "Timestamp" }],
1464
+ example: '["time/weekday", "@entity.createdAt"] // => 4 (Thursday)'
1465
+ },
1466
+ "time/hour": {
1467
+ module: "time",
1468
+ category: "std-time",
1469
+ minArity: 1,
1470
+ maxArity: 1,
1471
+ description: "Get hour from timestamp (0-23)",
1472
+ hasSideEffects: false,
1473
+ returnType: "number",
1474
+ params: [{ name: "date", type: "number", description: "Timestamp" }],
1475
+ example: '["time/hour", "@entity.createdAt"] // => 14'
1476
+ },
1477
+ "time/minute": {
1478
+ module: "time",
1479
+ category: "std-time",
1480
+ minArity: 1,
1481
+ maxArity: 1,
1482
+ description: "Get minute from timestamp (0-59)",
1483
+ hasSideEffects: false,
1484
+ returnType: "number",
1485
+ params: [{ name: "date", type: "number", description: "Timestamp" }],
1486
+ example: '["time/minute", "@entity.createdAt"] // => 30'
1487
+ },
1488
+ "time/second": {
1489
+ module: "time",
1490
+ category: "std-time",
1491
+ minArity: 1,
1492
+ maxArity: 1,
1493
+ description: "Get second from timestamp (0-59)",
1494
+ hasSideEffects: false,
1495
+ returnType: "number",
1496
+ params: [{ name: "date", type: "number", description: "Timestamp" }],
1497
+ example: '["time/second", "@entity.createdAt"] // => 45'
1498
+ },
1499
+ "time/add": {
1500
+ module: "time",
1501
+ category: "std-time",
1502
+ minArity: 3,
1503
+ maxArity: 3,
1504
+ description: "Add time to timestamp",
1505
+ hasSideEffects: false,
1506
+ returnType: "number",
1507
+ params: [
1508
+ { name: "date", type: "number", description: "Timestamp" },
1509
+ { name: "amount", type: "number", description: "Amount to add" },
1510
+ { name: "unit", type: "string", description: "Time unit (year/month/week/day/hour/minute/second/ms)" }
1511
+ ],
1512
+ example: '["time/add", ["time/now"], 7, "day"]'
1513
+ },
1514
+ "time/subtract": {
1515
+ module: "time",
1516
+ category: "std-time",
1517
+ minArity: 3,
1518
+ maxArity: 3,
1519
+ description: "Subtract time from timestamp",
1520
+ hasSideEffects: false,
1521
+ returnType: "number",
1522
+ params: [
1523
+ { name: "date", type: "number", description: "Timestamp" },
1524
+ { name: "amount", type: "number", description: "Amount to subtract" },
1525
+ { name: "unit", type: "string", description: "Time unit" }
1526
+ ],
1527
+ example: '["time/subtract", ["time/now"], 1, "hour"]'
1528
+ },
1529
+ "time/diff": {
1530
+ module: "time",
1531
+ category: "std-time",
1532
+ minArity: 2,
1533
+ maxArity: 3,
1534
+ description: "Difference between timestamps",
1535
+ hasSideEffects: false,
1536
+ returnType: "number",
1537
+ params: [
1538
+ { name: "a", type: "number", description: "First timestamp" },
1539
+ { name: "b", type: "number", description: "Second timestamp" },
1540
+ { name: "unit", type: "string", description: "Result unit", optional: true, defaultValue: "ms" }
1541
+ ],
1542
+ example: '["time/diff", "@entity.birthDate", ["time/now"], "year"]'
1543
+ },
1544
+ "time/startOf": {
1545
+ module: "time",
1546
+ category: "std-time",
1547
+ minArity: 2,
1548
+ maxArity: 2,
1549
+ description: "Get start of time period",
1550
+ hasSideEffects: false,
1551
+ returnType: "number",
1552
+ params: [
1553
+ { name: "date", type: "number", description: "Timestamp" },
1554
+ { name: "unit", type: "string", description: "Time unit (year/month/week/day/hour/minute)" }
1555
+ ],
1556
+ example: '["time/startOf", ["time/now"], "month"]'
1557
+ },
1558
+ "time/endOf": {
1559
+ module: "time",
1560
+ category: "std-time",
1561
+ minArity: 2,
1562
+ maxArity: 2,
1563
+ description: "Get end of time period",
1564
+ hasSideEffects: false,
1565
+ returnType: "number",
1566
+ params: [
1567
+ { name: "date", type: "number", description: "Timestamp" },
1568
+ { name: "unit", type: "string", description: "Time unit" }
1569
+ ],
1570
+ example: '["time/endOf", ["time/now"], "month"]'
1571
+ },
1572
+ "time/isBefore": {
1573
+ module: "time",
1574
+ category: "std-time",
1575
+ minArity: 2,
1576
+ maxArity: 2,
1577
+ description: "Check if a is before b",
1578
+ hasSideEffects: false,
1579
+ returnType: "boolean",
1580
+ params: [
1581
+ { name: "a", type: "number", description: "First timestamp" },
1582
+ { name: "b", type: "number", description: "Second timestamp" }
1583
+ ],
1584
+ example: '["time/isBefore", "@entity.startDate", "@entity.endDate"]'
1585
+ },
1586
+ "time/isAfter": {
1587
+ module: "time",
1588
+ category: "std-time",
1589
+ minArity: 2,
1590
+ maxArity: 2,
1591
+ description: "Check if a is after b",
1592
+ hasSideEffects: false,
1593
+ returnType: "boolean",
1594
+ params: [
1595
+ { name: "a", type: "number", description: "First timestamp" },
1596
+ { name: "b", type: "number", description: "Second timestamp" }
1597
+ ],
1598
+ example: '["time/isAfter", ["time/now"], "@entity.deadline"]'
1599
+ },
1600
+ "time/isBetween": {
1601
+ module: "time",
1602
+ category: "std-time",
1603
+ minArity: 3,
1604
+ maxArity: 3,
1605
+ description: "Check if date is between start and end",
1606
+ hasSideEffects: false,
1607
+ returnType: "boolean",
1608
+ params: [
1609
+ { name: "date", type: "number", description: "Timestamp to check" },
1610
+ { name: "start", type: "number", description: "Range start" },
1611
+ { name: "end", type: "number", description: "Range end" }
1612
+ ],
1613
+ example: '["time/isBetween", ["time/now"], "@entity.startDate", "@entity.endDate"]'
1614
+ },
1615
+ "time/isSame": {
1616
+ module: "time",
1617
+ category: "std-time",
1618
+ minArity: 2,
1619
+ maxArity: 3,
1620
+ description: "Check if timestamps are same (optionally by unit)",
1621
+ hasSideEffects: false,
1622
+ returnType: "boolean",
1623
+ params: [
1624
+ { name: "a", type: "number", description: "First timestamp" },
1625
+ { name: "b", type: "number", description: "Second timestamp" },
1626
+ { name: "unit", type: "string", description: "Comparison unit", optional: true }
1627
+ ],
1628
+ example: '["time/isSame", "@a", "@b", "day"]'
1629
+ },
1630
+ "time/isPast": {
1631
+ module: "time",
1632
+ category: "std-time",
1633
+ minArity: 1,
1634
+ maxArity: 1,
1635
+ description: "Check if timestamp is in the past",
1636
+ hasSideEffects: false,
1637
+ returnType: "boolean",
1638
+ params: [{ name: "date", type: "number", description: "Timestamp" }],
1639
+ example: '["time/isPast", "@entity.expiresAt"]'
1640
+ },
1641
+ "time/isFuture": {
1642
+ module: "time",
1643
+ category: "std-time",
1644
+ minArity: 1,
1645
+ maxArity: 1,
1646
+ description: "Check if timestamp is in the future",
1647
+ hasSideEffects: false,
1648
+ returnType: "boolean",
1649
+ params: [{ name: "date", type: "number", description: "Timestamp" }],
1650
+ example: '["time/isFuture", "@entity.scheduledAt"]'
1651
+ },
1652
+ "time/isToday": {
1653
+ module: "time",
1654
+ category: "std-time",
1655
+ minArity: 1,
1656
+ maxArity: 1,
1657
+ description: "Check if timestamp is today",
1658
+ hasSideEffects: false,
1659
+ returnType: "boolean",
1660
+ params: [{ name: "date", type: "number", description: "Timestamp" }],
1661
+ example: '["time/isToday", "@entity.createdAt"]'
1662
+ },
1663
+ "time/relative": {
1664
+ module: "time",
1665
+ category: "std-time",
1666
+ minArity: 1,
1667
+ maxArity: 1,
1668
+ description: 'Format as relative time ("2 hours ago", "in 3 days")',
1669
+ hasSideEffects: false,
1670
+ returnType: "string",
1671
+ params: [{ name: "date", type: "number", description: "Timestamp" }],
1672
+ example: '["time/relative", "@entity.lastActivityAt"] // => "2 hours ago"'
1673
+ },
1674
+ "time/duration": {
1675
+ module: "time",
1676
+ category: "std-time",
1677
+ minArity: 1,
1678
+ maxArity: 1,
1679
+ description: 'Format milliseconds as duration ("2h 30m")',
1680
+ hasSideEffects: false,
1681
+ returnType: "string",
1682
+ params: [{ name: "ms", type: "number", description: "Duration in milliseconds" }],
1683
+ example: '["time/duration", 9000000] // => "2h 30m"'
1684
+ }
1685
+ };
1686
+
1687
+ // modules/validate.ts
1688
+ var VALIDATE_OPERATORS = {
1689
+ "validate/required": {
1690
+ module: "validate",
1691
+ category: "std-validate",
1692
+ minArity: 1,
1693
+ maxArity: 1,
1694
+ description: "Check if value is not null, undefined, or empty string",
1695
+ hasSideEffects: false,
1696
+ returnType: "boolean",
1697
+ params: [{ name: "value", type: "any", description: "Value to check" }],
1698
+ example: '["validate/required", "@payload.name"]'
1699
+ },
1700
+ "validate/string": {
1701
+ module: "validate",
1702
+ category: "std-validate",
1703
+ minArity: 1,
1704
+ maxArity: 1,
1705
+ description: "Check if value is a string",
1706
+ hasSideEffects: false,
1707
+ returnType: "boolean",
1708
+ params: [{ name: "value", type: "any", description: "Value to check" }],
1709
+ example: '["validate/string", "@payload.name"]'
1710
+ },
1711
+ "validate/number": {
1712
+ module: "validate",
1713
+ category: "std-validate",
1714
+ minArity: 1,
1715
+ maxArity: 1,
1716
+ description: "Check if value is a number",
1717
+ hasSideEffects: false,
1718
+ returnType: "boolean",
1719
+ params: [{ name: "value", type: "any", description: "Value to check" }],
1720
+ example: '["validate/number", "@payload.age"]'
1721
+ },
1722
+ "validate/boolean": {
1723
+ module: "validate",
1724
+ category: "std-validate",
1725
+ minArity: 1,
1726
+ maxArity: 1,
1727
+ description: "Check if value is a boolean",
1728
+ hasSideEffects: false,
1729
+ returnType: "boolean",
1730
+ params: [{ name: "value", type: "any", description: "Value to check" }],
1731
+ example: '["validate/boolean", "@payload.active"]'
1732
+ },
1733
+ "validate/array": {
1734
+ module: "validate",
1735
+ category: "std-validate",
1736
+ minArity: 1,
1737
+ maxArity: 1,
1738
+ description: "Check if value is an array",
1739
+ hasSideEffects: false,
1740
+ returnType: "boolean",
1741
+ params: [{ name: "value", type: "any", description: "Value to check" }],
1742
+ example: '["validate/array", "@payload.items"]'
1743
+ },
1744
+ "validate/object": {
1745
+ module: "validate",
1746
+ category: "std-validate",
1747
+ minArity: 1,
1748
+ maxArity: 1,
1749
+ description: "Check if value is an object",
1750
+ hasSideEffects: false,
1751
+ returnType: "boolean",
1752
+ params: [{ name: "value", type: "any", description: "Value to check" }],
1753
+ example: '["validate/object", "@payload.data"]'
1754
+ },
1755
+ "validate/email": {
1756
+ module: "validate",
1757
+ category: "std-validate",
1758
+ minArity: 1,
1759
+ maxArity: 1,
1760
+ description: "Check if value is a valid email format",
1761
+ hasSideEffects: false,
1762
+ returnType: "boolean",
1763
+ params: [{ name: "value", type: "string", description: "Email to validate" }],
1764
+ example: '["validate/email", "@payload.email"]'
1765
+ },
1766
+ "validate/url": {
1767
+ module: "validate",
1768
+ category: "std-validate",
1769
+ minArity: 1,
1770
+ maxArity: 1,
1771
+ description: "Check if value is a valid URL format",
1772
+ hasSideEffects: false,
1773
+ returnType: "boolean",
1774
+ params: [{ name: "value", type: "string", description: "URL to validate" }],
1775
+ example: '["validate/url", "@payload.website"]'
1776
+ },
1777
+ "validate/uuid": {
1778
+ module: "validate",
1779
+ category: "std-validate",
1780
+ minArity: 1,
1781
+ maxArity: 1,
1782
+ description: "Check if value is a valid UUID",
1783
+ hasSideEffects: false,
1784
+ returnType: "boolean",
1785
+ params: [{ name: "value", type: "string", description: "UUID to validate" }],
1786
+ example: '["validate/uuid", "@payload.id"]'
1787
+ },
1788
+ "validate/phone": {
1789
+ module: "validate",
1790
+ category: "std-validate",
1791
+ minArity: 1,
1792
+ maxArity: 1,
1793
+ description: "Check if value is a valid phone number",
1794
+ hasSideEffects: false,
1795
+ returnType: "boolean",
1796
+ params: [{ name: "value", type: "string", description: "Phone number to validate" }],
1797
+ example: '["validate/phone", "@payload.phone"]'
1798
+ },
1799
+ "validate/creditCard": {
1800
+ module: "validate",
1801
+ category: "std-validate",
1802
+ minArity: 1,
1803
+ maxArity: 1,
1804
+ description: "Check if value is a valid credit card number (Luhn algorithm)",
1805
+ hasSideEffects: false,
1806
+ returnType: "boolean",
1807
+ params: [{ name: "value", type: "string", description: "Card number to validate" }],
1808
+ example: '["validate/creditCard", "@payload.cardNumber"]'
1809
+ },
1810
+ "validate/date": {
1811
+ module: "validate",
1812
+ category: "std-validate",
1813
+ minArity: 1,
1814
+ maxArity: 1,
1815
+ description: "Check if value is a valid date",
1816
+ hasSideEffects: false,
1817
+ returnType: "boolean",
1818
+ params: [{ name: "value", type: "any", description: "Value to check" }],
1819
+ example: '["validate/date", "@payload.birthDate"]'
1820
+ },
1821
+ "validate/minLength": {
1822
+ module: "validate",
1823
+ category: "std-validate",
1824
+ minArity: 2,
1825
+ maxArity: 2,
1826
+ description: "Check if string/array has minimum length",
1827
+ hasSideEffects: false,
1828
+ returnType: "boolean",
1829
+ params: [
1830
+ { name: "value", type: "string | array", description: "Value to check" },
1831
+ { name: "min", type: "number", description: "Minimum length" }
1832
+ ],
1833
+ example: '["validate/minLength", "@payload.password", 8]'
1834
+ },
1835
+ "validate/maxLength": {
1836
+ module: "validate",
1837
+ category: "std-validate",
1838
+ minArity: 2,
1839
+ maxArity: 2,
1840
+ description: "Check if string/array has maximum length",
1841
+ hasSideEffects: false,
1842
+ returnType: "boolean",
1843
+ params: [
1844
+ { name: "value", type: "string | array", description: "Value to check" },
1845
+ { name: "max", type: "number", description: "Maximum length" }
1846
+ ],
1847
+ example: '["validate/maxLength", "@payload.name", 50]'
1848
+ },
1849
+ "validate/length": {
1850
+ module: "validate",
1851
+ category: "std-validate",
1852
+ minArity: 2,
1853
+ maxArity: 2,
1854
+ description: "Check if string/array has exact length",
1855
+ hasSideEffects: false,
1856
+ returnType: "boolean",
1857
+ params: [
1858
+ { name: "value", type: "string | array", description: "Value to check" },
1859
+ { name: "exact", type: "number", description: "Required length" }
1860
+ ],
1861
+ example: '["validate/length", "@payload.code", 6]'
1862
+ },
1863
+ "validate/min": {
1864
+ module: "validate",
1865
+ category: "std-validate",
1866
+ minArity: 2,
1867
+ maxArity: 2,
1868
+ description: "Check if number is >= minimum",
1869
+ hasSideEffects: false,
1870
+ returnType: "boolean",
1871
+ params: [
1872
+ { name: "value", type: "number", description: "Number to check" },
1873
+ { name: "min", type: "number", description: "Minimum value" }
1874
+ ],
1875
+ example: '["validate/min", "@payload.age", 18]'
1876
+ },
1877
+ "validate/max": {
1878
+ module: "validate",
1879
+ category: "std-validate",
1880
+ minArity: 2,
1881
+ maxArity: 2,
1882
+ description: "Check if number is <= maximum",
1883
+ hasSideEffects: false,
1884
+ returnType: "boolean",
1885
+ params: [
1886
+ { name: "value", type: "number", description: "Number to check" },
1887
+ { name: "max", type: "number", description: "Maximum value" }
1888
+ ],
1889
+ example: '["validate/max", "@payload.quantity", 100]'
1890
+ },
1891
+ "validate/range": {
1892
+ module: "validate",
1893
+ category: "std-validate",
1894
+ minArity: 3,
1895
+ maxArity: 3,
1896
+ description: "Check if number is within range [min, max]",
1897
+ hasSideEffects: false,
1898
+ returnType: "boolean",
1899
+ params: [
1900
+ { name: "value", type: "number", description: "Number to check" },
1901
+ { name: "min", type: "number", description: "Minimum value" },
1902
+ { name: "max", type: "number", description: "Maximum value" }
1903
+ ],
1904
+ example: '["validate/range", "@payload.rating", 1, 5]'
1905
+ },
1906
+ "validate/pattern": {
1907
+ module: "validate",
1908
+ category: "std-validate",
1909
+ minArity: 2,
1910
+ maxArity: 2,
1911
+ description: "Check if string matches regex pattern",
1912
+ hasSideEffects: false,
1913
+ returnType: "boolean",
1914
+ params: [
1915
+ { name: "value", type: "string", description: "String to check" },
1916
+ { name: "regex", type: "string", description: "Regex pattern" }
1917
+ ],
1918
+ example: '["validate/pattern", "@payload.code", "^[A-Z]{3}[0-9]{3}$"]'
1919
+ },
1920
+ "validate/oneOf": {
1921
+ module: "validate",
1922
+ category: "std-validate",
1923
+ minArity: 2,
1924
+ maxArity: 2,
1925
+ description: "Check if value is in list of allowed values",
1926
+ hasSideEffects: false,
1927
+ returnType: "boolean",
1928
+ params: [
1929
+ { name: "value", type: "any", description: "Value to check" },
1930
+ { name: "options", type: "array", description: "Allowed values" }
1931
+ ],
1932
+ example: '["validate/oneOf", "@payload.role", ["admin", "user", "guest"]]'
1933
+ },
1934
+ "validate/noneOf": {
1935
+ module: "validate",
1936
+ category: "std-validate",
1937
+ minArity: 2,
1938
+ maxArity: 2,
1939
+ description: "Check if value is not in list of disallowed values",
1940
+ hasSideEffects: false,
1941
+ returnType: "boolean",
1942
+ params: [
1943
+ { name: "value", type: "any", description: "Value to check" },
1944
+ { name: "options", type: "array", description: "Disallowed values" }
1945
+ ],
1946
+ example: '["validate/noneOf", "@payload.username", ["admin", "root", "system"]]'
1947
+ },
1948
+ "validate/equals": {
1949
+ module: "validate",
1950
+ category: "std-validate",
1951
+ minArity: 2,
1952
+ maxArity: 2,
1953
+ description: "Deep equality check",
1954
+ hasSideEffects: false,
1955
+ returnType: "boolean",
1956
+ params: [
1957
+ { name: "a", type: "any", description: "First value" },
1958
+ { name: "b", type: "any", description: "Second value" }
1959
+ ],
1960
+ example: '["validate/equals", "@payload.password", "@payload.confirmPassword"]'
1961
+ },
1962
+ "validate/check": {
1963
+ module: "validate",
1964
+ category: "std-validate",
1965
+ minArity: 2,
1966
+ maxArity: 2,
1967
+ description: "Run multiple validation rules, return { valid, errors }",
1968
+ hasSideEffects: false,
1969
+ returnType: "any",
1970
+ params: [
1971
+ { name: "value", type: "any", description: "Value or object to validate" },
1972
+ { name: "rules", type: "object", description: "Validation rules by field" }
1973
+ ],
1974
+ example: `["validate/check", "@payload.data", {
1975
+ "name": [["required"], ["minLength", 2], ["maxLength", 50]],
1976
+ "email": [["required"], ["email"]],
1977
+ "age": [["number"], ["min", 18]]
1978
+ }]`
1979
+ }
1980
+ };
1981
+
1982
+ // modules/format.ts
1983
+ var FORMAT_OPERATORS = {
1984
+ "format/number": {
1985
+ module: "format",
1986
+ category: "std-format",
1987
+ minArity: 1,
1988
+ maxArity: 2,
1989
+ description: "Format number with locale-aware separators",
1990
+ hasSideEffects: false,
1991
+ returnType: "string",
1992
+ params: [
1993
+ { name: "n", type: "number", description: "Number to format" },
1994
+ { name: "opts", type: "object", description: "Format options (decimals, locale)", optional: true }
1995
+ ],
1996
+ example: '["format/number", 1234567.89] // => "1,234,567.89"'
1997
+ },
1998
+ "format/currency": {
1999
+ module: "format",
2000
+ category: "std-format",
2001
+ minArity: 2,
2002
+ maxArity: 3,
2003
+ description: "Format as currency",
2004
+ hasSideEffects: false,
2005
+ returnType: "string",
2006
+ params: [
2007
+ { name: "n", type: "number", description: "Amount" },
2008
+ { name: "currency", type: "string", description: "Currency code (USD, EUR, etc.)" },
2009
+ { name: "locale", type: "string", description: "Locale", optional: true, defaultValue: "en-US" }
2010
+ ],
2011
+ example: '["format/currency", 1234.56, "USD"] // => "$1,234.56"'
2012
+ },
2013
+ "format/percent": {
2014
+ module: "format",
2015
+ category: "std-format",
2016
+ minArity: 1,
2017
+ maxArity: 2,
2018
+ description: "Format as percentage",
2019
+ hasSideEffects: false,
2020
+ returnType: "string",
2021
+ params: [
2022
+ { name: "n", type: "number", description: "Number (0.5 = 50%)" },
2023
+ { name: "decimals", type: "number", description: "Decimal places", optional: true, defaultValue: 0 }
2024
+ ],
2025
+ example: '["format/percent", 0.856, 1] // => "85.6%"'
2026
+ },
2027
+ "format/bytes": {
2028
+ module: "format",
2029
+ category: "std-format",
2030
+ minArity: 1,
2031
+ maxArity: 1,
2032
+ description: "Format bytes as human-readable size",
2033
+ hasSideEffects: false,
2034
+ returnType: "string",
2035
+ params: [{ name: "n", type: "number", description: "Bytes" }],
2036
+ example: '["format/bytes", 2500000] // => "2.4 MB"'
2037
+ },
2038
+ "format/ordinal": {
2039
+ module: "format",
2040
+ category: "std-format",
2041
+ minArity: 1,
2042
+ maxArity: 1,
2043
+ description: "Format number as ordinal (1st, 2nd, 3rd)",
2044
+ hasSideEffects: false,
2045
+ returnType: "string",
2046
+ params: [{ name: "n", type: "number", description: "Number" }],
2047
+ example: '["format/ordinal", 42] // => "42nd"'
2048
+ },
2049
+ "format/plural": {
2050
+ module: "format",
2051
+ category: "std-format",
2052
+ minArity: 3,
2053
+ maxArity: 3,
2054
+ description: "Format count with singular/plural word",
2055
+ hasSideEffects: false,
2056
+ returnType: "string",
2057
+ params: [
2058
+ { name: "n", type: "number", description: "Count" },
2059
+ { name: "singular", type: "string", description: "Singular form" },
2060
+ { name: "plural", type: "string", description: "Plural form" }
2061
+ ],
2062
+ example: '["format/plural", 5, "item", "items"] // => "5 items"'
2063
+ },
2064
+ "format/list": {
2065
+ module: "format",
2066
+ category: "std-format",
2067
+ minArity: 1,
2068
+ maxArity: 2,
2069
+ description: "Format array as natural language list",
2070
+ hasSideEffects: false,
2071
+ returnType: "string",
2072
+ params: [
2073
+ { name: "arr", type: "array", description: "Array of strings" },
2074
+ { name: "style", type: "string", description: '"and" or "or"', optional: true, defaultValue: "and" }
2075
+ ],
2076
+ example: '["format/list", ["Alice", "Bob", "Charlie"], "and"] // => "Alice, Bob, and Charlie"'
2077
+ },
2078
+ "format/phone": {
2079
+ module: "format",
2080
+ category: "std-format",
2081
+ minArity: 1,
2082
+ maxArity: 2,
2083
+ description: "Format phone number",
2084
+ hasSideEffects: false,
2085
+ returnType: "string",
2086
+ params: [
2087
+ { name: "str", type: "string", description: "Phone number digits" },
2088
+ { name: "format", type: "string", description: "Format pattern", optional: true, defaultValue: "US" }
2089
+ ],
2090
+ example: '["format/phone", "5551234567"] // => "(555) 123-4567"'
2091
+ },
2092
+ "format/creditCard": {
2093
+ module: "format",
2094
+ category: "std-format",
2095
+ minArity: 1,
2096
+ maxArity: 1,
2097
+ description: "Format credit card with masked digits",
2098
+ hasSideEffects: false,
2099
+ returnType: "string",
2100
+ params: [{ name: "str", type: "string", description: "Card number" }],
2101
+ example: '["format/creditCard", "4111111111111234"] // => "\u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 1234"'
2102
+ }
2103
+ };
2104
+
2105
+ // modules/async.ts
2106
+ var ASYNC_OPERATORS = {
2107
+ "async/delay": {
2108
+ module: "async",
2109
+ category: "std-async",
2110
+ minArity: 1,
2111
+ maxArity: 1,
2112
+ description: "Wait for specified milliseconds",
2113
+ hasSideEffects: true,
2114
+ returnType: "void",
2115
+ params: [{ name: "ms", type: "number", description: "Milliseconds to wait" }],
2116
+ example: '["async/delay", 2000] // Wait 2 seconds'
2117
+ },
2118
+ "async/timeout": {
2119
+ module: "async",
2120
+ category: "std-async",
2121
+ minArity: 2,
2122
+ maxArity: 2,
2123
+ description: "Add timeout to an effect",
2124
+ hasSideEffects: true,
2125
+ returnType: "any",
2126
+ params: [
2127
+ { name: "effect", type: "expression", description: "Effect to execute" },
2128
+ { name: "ms", type: "number", description: "Timeout in milliseconds" }
2129
+ ],
2130
+ example: '["async/timeout", ["call", "api", "fetchData"], 5000]'
2131
+ },
2132
+ "async/debounce": {
2133
+ module: "async",
2134
+ category: "std-async",
2135
+ minArity: 2,
2136
+ maxArity: 2,
2137
+ description: "Debounce an event (wait for pause in events)",
2138
+ hasSideEffects: true,
2139
+ returnType: "void",
2140
+ params: [
2141
+ { name: "event", type: "string", description: "Event name to emit" },
2142
+ { name: "ms", type: "number", description: "Debounce delay in milliseconds" }
2143
+ ],
2144
+ example: '["async/debounce", "SEARCH", 300]'
2145
+ },
2146
+ "async/throttle": {
2147
+ module: "async",
2148
+ category: "std-async",
2149
+ minArity: 2,
2150
+ maxArity: 2,
2151
+ description: "Throttle an event (emit at most once per interval)",
2152
+ hasSideEffects: true,
2153
+ returnType: "void",
2154
+ params: [
2155
+ { name: "event", type: "string", description: "Event name to emit" },
2156
+ { name: "ms", type: "number", description: "Throttle interval in milliseconds" }
2157
+ ],
2158
+ example: '["async/throttle", "SCROLL", 100]'
2159
+ },
2160
+ "async/retry": {
2161
+ module: "async",
2162
+ category: "std-async",
2163
+ minArity: 2,
2164
+ maxArity: 2,
2165
+ description: "Retry an effect with configurable backoff",
2166
+ hasSideEffects: true,
2167
+ returnType: "any",
2168
+ params: [
2169
+ { name: "effect", type: "expression", description: "Effect to retry" },
2170
+ { name: "opts", type: "object", description: "{ attempts, backoff, baseDelay }" }
2171
+ ],
2172
+ example: `["async/retry",
2173
+ ["call", "api", "fetchData", { "id": "@entity.id" }],
2174
+ { "attempts": 3, "backoff": "exponential", "baseDelay": 1000 }]`
2175
+ },
2176
+ "async/race": {
2177
+ module: "async",
2178
+ category: "std-async",
2179
+ minArity: 2,
2180
+ maxArity: null,
2181
+ description: "Execute effects in parallel, return first to complete",
2182
+ hasSideEffects: true,
2183
+ returnType: "any",
2184
+ params: [{ name: "...effects", type: "expression[]", description: "Effects to race" }],
2185
+ example: '["async/race", ["call", "api1"], ["call", "api2"]]'
2186
+ },
2187
+ "async/all": {
2188
+ module: "async",
2189
+ category: "std-async",
2190
+ minArity: 2,
2191
+ maxArity: null,
2192
+ description: "Execute effects in parallel, wait for all to complete",
2193
+ hasSideEffects: true,
2194
+ returnType: "array",
2195
+ params: [{ name: "...effects", type: "expression[]", description: "Effects to execute" }],
2196
+ example: '["async/all", ["call", "api1"], ["call", "api2"]]'
2197
+ },
2198
+ "async/sequence": {
2199
+ module: "async",
2200
+ category: "std-async",
2201
+ minArity: 2,
2202
+ maxArity: null,
2203
+ description: "Execute effects in sequence (one after another)",
2204
+ hasSideEffects: true,
2205
+ returnType: "array",
2206
+ params: [{ name: "...effects", type: "expression[]", description: "Effects to execute in order" }],
2207
+ example: '["async/sequence", ["call", "validate"], ["call", "save"]]'
2208
+ }
2209
+ };
2210
+
2211
+ // modules/nn.ts
2212
+ var NN_OPERATORS = {
2213
+ "nn/sequential": {
2214
+ module: "nn",
2215
+ category: "std-nn",
2216
+ minArity: 1,
2217
+ maxArity: null,
2218
+ description: "Create a sequential neural network from layers",
2219
+ hasSideEffects: false,
2220
+ returnType: "nn/module",
2221
+ params: [
2222
+ { name: "...layers", type: "nn/layer[]", description: "Layers to stack sequentially" }
2223
+ ],
2224
+ example: '["nn/sequential", ["nn/linear", 16, 64], ["nn/relu"], ["nn/linear", 64, 4]]'
2225
+ },
2226
+ "nn/linear": {
2227
+ module: "nn",
2228
+ category: "std-nn",
2229
+ minArity: 2,
2230
+ maxArity: 2,
2231
+ description: "Fully connected linear layer (output = input * weights + bias)",
2232
+ hasSideEffects: false,
2233
+ returnType: "nn/layer",
2234
+ params: [
2235
+ { name: "inFeatures", type: "number", description: "Input dimension" },
2236
+ { name: "outFeatures", type: "number", description: "Output dimension" }
2237
+ ],
2238
+ example: '["nn/linear", 16, 64] // 16 inputs -> 64 outputs'
2239
+ },
2240
+ "nn/relu": {
2241
+ module: "nn",
2242
+ category: "std-nn",
2243
+ minArity: 0,
2244
+ maxArity: 0,
2245
+ description: "ReLU activation function: max(0, x)",
2246
+ hasSideEffects: false,
2247
+ returnType: "nn/layer",
2248
+ params: [],
2249
+ example: '["nn/relu"]'
2250
+ },
2251
+ "nn/tanh": {
2252
+ module: "nn",
2253
+ category: "std-nn",
2254
+ minArity: 0,
2255
+ maxArity: 0,
2256
+ description: "Tanh activation function: (e^x - e^-x) / (e^x + e^-x)",
2257
+ hasSideEffects: false,
2258
+ returnType: "nn/layer",
2259
+ params: [],
2260
+ example: '["nn/tanh"]'
2261
+ },
2262
+ "nn/sigmoid": {
2263
+ module: "nn",
2264
+ category: "std-nn",
2265
+ minArity: 0,
2266
+ maxArity: 0,
2267
+ description: "Sigmoid activation function: 1 / (1 + e^-x)",
2268
+ hasSideEffects: false,
2269
+ returnType: "nn/layer",
2270
+ params: [],
2271
+ example: '["nn/sigmoid"]'
2272
+ },
2273
+ "nn/softmax": {
2274
+ module: "nn",
2275
+ category: "std-nn",
2276
+ minArity: 0,
2277
+ maxArity: 1,
2278
+ description: "Softmax activation function (normalizes to probability distribution)",
2279
+ hasSideEffects: false,
2280
+ returnType: "nn/layer",
2281
+ params: [
2282
+ { name: "dim", type: "number", description: "Dimension to apply softmax", optional: true, defaultValue: -1 }
2283
+ ],
2284
+ example: '["nn/softmax"]'
2285
+ },
2286
+ "nn/dropout": {
2287
+ module: "nn",
2288
+ category: "std-nn",
2289
+ minArity: 0,
2290
+ maxArity: 1,
2291
+ description: "Dropout layer for regularization (randomly zeros elements during training)",
2292
+ hasSideEffects: false,
2293
+ returnType: "nn/layer",
2294
+ params: [
2295
+ { name: "p", type: "number", description: "Dropout probability", optional: true, defaultValue: 0.5 }
2296
+ ],
2297
+ example: '["nn/dropout", 0.3] // 30% dropout'
2298
+ },
2299
+ "nn/batchnorm": {
2300
+ module: "nn",
2301
+ category: "std-nn",
2302
+ minArity: 1,
2303
+ maxArity: 1,
2304
+ description: "Batch normalization layer",
2305
+ hasSideEffects: false,
2306
+ returnType: "nn/layer",
2307
+ params: [
2308
+ { name: "numFeatures", type: "number", description: "Number of features to normalize" }
2309
+ ],
2310
+ example: '["nn/batchnorm", 64]'
2311
+ },
2312
+ "nn/layernorm": {
2313
+ module: "nn",
2314
+ category: "std-nn",
2315
+ minArity: 1,
2316
+ maxArity: 1,
2317
+ description: "Layer normalization",
2318
+ hasSideEffects: false,
2319
+ returnType: "nn/layer",
2320
+ params: [
2321
+ { name: "normalizedShape", type: "number | number[]", description: "Shape to normalize over" }
2322
+ ],
2323
+ example: '["nn/layernorm", 64]'
2324
+ },
2325
+ "nn/forward": {
2326
+ module: "nn",
2327
+ category: "std-nn",
2328
+ minArity: 2,
2329
+ maxArity: 2,
2330
+ description: "Execute forward pass through network",
2331
+ hasSideEffects: false,
2332
+ returnType: "tensor",
2333
+ params: [
2334
+ { name: "module", type: "nn/module", description: "The neural network module" },
2335
+ { name: "input", type: "tensor", description: "Input tensor" }
2336
+ ],
2337
+ example: '["nn/forward", "@entity.architecture", "@entity.sensors"]'
2338
+ },
2339
+ "nn/getWeights": {
2340
+ module: "nn",
2341
+ category: "std-nn",
2342
+ minArity: 1,
2343
+ maxArity: 1,
2344
+ description: "Get network weights as a flat tensor",
2345
+ hasSideEffects: false,
2346
+ returnType: "tensor",
2347
+ params: [
2348
+ { name: "module", type: "nn/module", description: "The neural network module" }
2349
+ ],
2350
+ example: '["nn/getWeights", "@entity.architecture"]'
2351
+ },
2352
+ "nn/setWeights": {
2353
+ module: "nn",
2354
+ category: "std-nn",
2355
+ minArity: 2,
2356
+ maxArity: 2,
2357
+ description: "Set network weights from a flat tensor",
2358
+ hasSideEffects: true,
2359
+ returnType: "nn/module",
2360
+ params: [
2361
+ { name: "module", type: "nn/module", description: "The neural network module" },
2362
+ { name: "weights", type: "tensor", description: "New weights as flat tensor" }
2363
+ ],
2364
+ example: '["nn/setWeights", "@entity.architecture", "@payload.newWeights"]'
2365
+ },
2366
+ "nn/paramCount": {
2367
+ module: "nn",
2368
+ category: "std-nn",
2369
+ minArity: 1,
2370
+ maxArity: 1,
2371
+ description: "Get total number of trainable parameters",
2372
+ hasSideEffects: false,
2373
+ returnType: "number",
2374
+ params: [
2375
+ { name: "module", type: "nn/module", description: "The neural network module" }
2376
+ ],
2377
+ example: '["nn/paramCount", "@entity.architecture"] // => 3300'
2378
+ },
2379
+ "nn/clone": {
2380
+ module: "nn",
2381
+ category: "std-nn",
2382
+ minArity: 1,
2383
+ maxArity: 1,
2384
+ description: "Create a deep copy of the network with same weights",
2385
+ hasSideEffects: false,
2386
+ returnType: "nn/module",
2387
+ params: [
2388
+ { name: "module", type: "nn/module", description: "The neural network module to clone" }
2389
+ ],
2390
+ example: '["nn/clone", "@entity.architecture"]'
2391
+ }
2392
+ };
2393
+
2394
+ // modules/tensor.ts
2395
+ var TENSOR_OPERATORS = {
2396
+ // ============================================================================
2397
+ // Creation
2398
+ // ============================================================================
2399
+ "tensor/from": {
2400
+ module: "tensor",
2401
+ category: "std-tensor",
2402
+ minArity: 1,
2403
+ maxArity: 1,
2404
+ description: "Create tensor from array",
2405
+ hasSideEffects: false,
2406
+ returnType: "tensor",
2407
+ params: [
2408
+ { name: "data", type: "array", description: "Array of numbers (can be nested for multi-dimensional)" }
2409
+ ],
2410
+ example: '["tensor/from", [1.0, 2.0, 3.0]]'
2411
+ },
2412
+ "tensor/zeros": {
2413
+ module: "tensor",
2414
+ category: "std-tensor",
2415
+ minArity: 1,
2416
+ maxArity: 1,
2417
+ description: "Create tensor filled with zeros",
2418
+ hasSideEffects: false,
2419
+ returnType: "tensor",
2420
+ params: [
2421
+ { name: "shape", type: "number[]", description: "Shape of the tensor" }
2422
+ ],
2423
+ example: '["tensor/zeros", [3, 4]] // 3x4 tensor of zeros'
2424
+ },
2425
+ "tensor/ones": {
2426
+ module: "tensor",
2427
+ category: "std-tensor",
2428
+ minArity: 1,
2429
+ maxArity: 1,
2430
+ description: "Create tensor filled with ones",
2431
+ hasSideEffects: false,
2432
+ returnType: "tensor",
2433
+ params: [
2434
+ { name: "shape", type: "number[]", description: "Shape of the tensor" }
2435
+ ],
2436
+ example: '["tensor/ones", [3, 4]] // 3x4 tensor of ones'
2437
+ },
2438
+ "tensor/rand": {
2439
+ module: "tensor",
2440
+ category: "std-tensor",
2441
+ minArity: 1,
2442
+ maxArity: 1,
2443
+ description: "Create tensor with random values in [0, 1)",
2444
+ hasSideEffects: false,
2445
+ returnType: "tensor",
2446
+ params: [
2447
+ { name: "shape", type: "number[]", description: "Shape of the tensor" }
2448
+ ],
2449
+ example: '["tensor/rand", [16]] // Random 16-element vector'
2450
+ },
2451
+ "tensor/randn": {
2452
+ module: "tensor",
2453
+ category: "std-tensor",
2454
+ minArity: 1,
2455
+ maxArity: 1,
2456
+ description: "Create tensor with random values from standard normal distribution",
2457
+ hasSideEffects: false,
2458
+ returnType: "tensor",
2459
+ params: [
2460
+ { name: "shape", type: "number[]", description: "Shape of the tensor" }
2461
+ ],
2462
+ example: '["tensor/randn", [16]] // Random normal 16-element vector'
2463
+ },
2464
+ // ============================================================================
2465
+ // Shape & Indexing
2466
+ // ============================================================================
2467
+ "tensor/shape": {
2468
+ module: "tensor",
2469
+ category: "std-tensor",
2470
+ minArity: 1,
2471
+ maxArity: 1,
2472
+ description: "Get tensor shape as array",
2473
+ hasSideEffects: false,
2474
+ returnType: "number[]",
2475
+ params: [
2476
+ { name: "tensor", type: "tensor", description: "The tensor" }
2477
+ ],
2478
+ example: '["tensor/shape", "@entity.sensors"] // => [16]'
2479
+ },
2480
+ "tensor/get": {
2481
+ module: "tensor",
2482
+ category: "std-tensor",
2483
+ minArity: 2,
2484
+ maxArity: 2,
2485
+ description: "Get element at index",
2486
+ hasSideEffects: false,
2487
+ returnType: "number",
2488
+ params: [
2489
+ { name: "tensor", type: "tensor", description: "The tensor" },
2490
+ { name: "index", type: "number | number[]", description: "Index (single for 1D, array for multi-D)" }
2491
+ ],
2492
+ example: '["tensor/get", "@entity.output", 3] // Get 4th element'
2493
+ },
2494
+ "tensor/slice": {
2495
+ module: "tensor",
2496
+ category: "std-tensor",
2497
+ minArity: 3,
2498
+ maxArity: 3,
2499
+ description: "Get slice of tensor",
2500
+ hasSideEffects: false,
2501
+ returnType: "tensor",
2502
+ params: [
2503
+ { name: "tensor", type: "tensor", description: "The tensor" },
2504
+ { name: "start", type: "number", description: "Start index" },
2505
+ { name: "end", type: "number", description: "End index (exclusive)" }
2506
+ ],
2507
+ example: '["tensor/slice", "@entity.output", 0, 3] // First 3 elements'
2508
+ },
2509
+ "tensor/reshape": {
2510
+ module: "tensor",
2511
+ category: "std-tensor",
2512
+ minArity: 2,
2513
+ maxArity: 2,
2514
+ description: "Reshape tensor to new shape (total elements must match)",
2515
+ hasSideEffects: false,
2516
+ returnType: "tensor",
2517
+ params: [
2518
+ { name: "tensor", type: "tensor", description: "The tensor" },
2519
+ { name: "shape", type: "number[]", description: "New shape" }
2520
+ ],
2521
+ example: '["tensor/reshape", "@entity.data", [4, 4]] // Reshape to 4x4'
2522
+ },
2523
+ "tensor/flatten": {
2524
+ module: "tensor",
2525
+ category: "std-tensor",
2526
+ minArity: 1,
2527
+ maxArity: 1,
2528
+ description: "Flatten tensor to 1D",
2529
+ hasSideEffects: false,
2530
+ returnType: "tensor",
2531
+ params: [
2532
+ { name: "tensor", type: "tensor", description: "The tensor" }
2533
+ ],
2534
+ example: '["tensor/flatten", "@entity.data"]'
2535
+ },
2536
+ // ============================================================================
2537
+ // Math Operations
2538
+ // ============================================================================
2539
+ "tensor/add": {
2540
+ module: "tensor",
2541
+ category: "std-tensor",
2542
+ minArity: 2,
2543
+ maxArity: 2,
2544
+ description: "Element-wise addition",
2545
+ hasSideEffects: false,
2546
+ returnType: "tensor",
2547
+ params: [
2548
+ { name: "a", type: "tensor", description: "First tensor" },
2549
+ { name: "b", type: "tensor | number", description: "Second tensor or scalar" }
2550
+ ],
2551
+ example: '["tensor/add", "@entity.a", "@entity.b"]'
2552
+ },
2553
+ "tensor/sub": {
2554
+ module: "tensor",
2555
+ category: "std-tensor",
2556
+ minArity: 2,
2557
+ maxArity: 2,
2558
+ description: "Element-wise subtraction",
2559
+ hasSideEffects: false,
2560
+ returnType: "tensor",
2561
+ params: [
2562
+ { name: "a", type: "tensor", description: "First tensor" },
2563
+ { name: "b", type: "tensor | number", description: "Second tensor or scalar" }
2564
+ ],
2565
+ example: '["tensor/sub", "@entity.a", "@entity.b"]'
2566
+ },
2567
+ "tensor/mul": {
2568
+ module: "tensor",
2569
+ category: "std-tensor",
2570
+ minArity: 2,
2571
+ maxArity: 2,
2572
+ description: "Element-wise multiplication",
2573
+ hasSideEffects: false,
2574
+ returnType: "tensor",
2575
+ params: [
2576
+ { name: "a", type: "tensor", description: "First tensor" },
2577
+ { name: "b", type: "tensor | number", description: "Second tensor or scalar" }
2578
+ ],
2579
+ example: '["tensor/mul", "@entity.weights", 0.99] // Decay weights'
2580
+ },
2581
+ "tensor/div": {
2582
+ module: "tensor",
2583
+ category: "std-tensor",
2584
+ minArity: 2,
2585
+ maxArity: 2,
2586
+ description: "Element-wise division",
2587
+ hasSideEffects: false,
2588
+ returnType: "tensor",
2589
+ params: [
2590
+ { name: "a", type: "tensor", description: "First tensor" },
2591
+ { name: "b", type: "tensor | number", description: "Second tensor or scalar" }
2592
+ ],
2593
+ example: '["tensor/div", "@entity.gradient", "@entity.batchSize"]'
2594
+ },
2595
+ "tensor/matmul": {
2596
+ module: "tensor",
2597
+ category: "std-tensor",
2598
+ minArity: 2,
2599
+ maxArity: 2,
2600
+ description: "Matrix multiplication",
2601
+ hasSideEffects: false,
2602
+ returnType: "tensor",
2603
+ params: [
2604
+ { name: "a", type: "tensor", description: "First tensor (NxM)" },
2605
+ { name: "b", type: "tensor", description: "Second tensor (MxK)" }
2606
+ ],
2607
+ example: '["tensor/matmul", "@entity.input", "@entity.weights"]'
2608
+ },
2609
+ "tensor/dot": {
2610
+ module: "tensor",
2611
+ category: "std-tensor",
2612
+ minArity: 2,
2613
+ maxArity: 2,
2614
+ description: "Dot product of two 1D tensors",
2615
+ hasSideEffects: false,
2616
+ returnType: "number",
2617
+ params: [
2618
+ { name: "a", type: "tensor", description: "First vector" },
2619
+ { name: "b", type: "tensor", description: "Second vector" }
2620
+ ],
2621
+ example: '["tensor/dot", "@entity.a", "@entity.b"]'
2622
+ },
2623
+ // ============================================================================
2624
+ // Reductions
2625
+ // ============================================================================
2626
+ "tensor/sum": {
2627
+ module: "tensor",
2628
+ category: "std-tensor",
2629
+ minArity: 1,
2630
+ maxArity: 2,
2631
+ description: "Sum of tensor elements",
2632
+ hasSideEffects: false,
2633
+ returnType: "number | tensor",
2634
+ params: [
2635
+ { name: "tensor", type: "tensor", description: "The tensor" },
2636
+ { name: "dim", type: "number", description: "Dimension to reduce", optional: true }
2637
+ ],
2638
+ example: '["tensor/sum", "@entity.rewards"] // Total reward'
2639
+ },
2640
+ "tensor/mean": {
2641
+ module: "tensor",
2642
+ category: "std-tensor",
2643
+ minArity: 1,
2644
+ maxArity: 2,
2645
+ description: "Mean of tensor elements",
2646
+ hasSideEffects: false,
2647
+ returnType: "number | tensor",
2648
+ params: [
2649
+ { name: "tensor", type: "tensor", description: "The tensor" },
2650
+ { name: "dim", type: "number", description: "Dimension to reduce", optional: true }
2651
+ ],
2652
+ example: '["tensor/mean", "@entity.losses"]'
2653
+ },
2654
+ "tensor/max": {
2655
+ module: "tensor",
2656
+ category: "std-tensor",
2657
+ minArity: 1,
2658
+ maxArity: 2,
2659
+ description: "Maximum value in tensor",
2660
+ hasSideEffects: false,
2661
+ returnType: "number | tensor",
2662
+ params: [
2663
+ { name: "tensor", type: "tensor", description: "The tensor" },
2664
+ { name: "dim", type: "number", description: "Dimension to reduce", optional: true }
2665
+ ],
2666
+ example: '["tensor/max", "@entity.qValues"]'
2667
+ },
2668
+ "tensor/min": {
2669
+ module: "tensor",
2670
+ category: "std-tensor",
2671
+ minArity: 1,
2672
+ maxArity: 2,
2673
+ description: "Minimum value in tensor",
2674
+ hasSideEffects: false,
2675
+ returnType: "number | tensor",
2676
+ params: [
2677
+ { name: "tensor", type: "tensor", description: "The tensor" },
2678
+ { name: "dim", type: "number", description: "Dimension to reduce", optional: true }
2679
+ ],
2680
+ example: '["tensor/min", "@entity.distances"]'
2681
+ },
2682
+ "tensor/argmax": {
2683
+ module: "tensor",
2684
+ category: "std-tensor",
2685
+ minArity: 1,
2686
+ maxArity: 2,
2687
+ description: "Index of maximum value",
2688
+ hasSideEffects: false,
2689
+ returnType: "number | tensor",
2690
+ params: [
2691
+ { name: "tensor", type: "tensor", description: "The tensor" },
2692
+ { name: "dim", type: "number", description: "Dimension to reduce", optional: true }
2693
+ ],
2694
+ example: '["tensor/argmax", "@entity.qValues"] // Best action index'
2695
+ },
2696
+ "tensor/norm": {
2697
+ module: "tensor",
2698
+ category: "std-tensor",
2699
+ minArity: 1,
2700
+ maxArity: 2,
2701
+ description: "L2 norm of tensor",
2702
+ hasSideEffects: false,
2703
+ returnType: "number",
2704
+ params: [
2705
+ { name: "tensor", type: "tensor", description: "The tensor" },
2706
+ { name: "p", type: "number", description: "Norm order (default 2)", optional: true, defaultValue: 2 }
2707
+ ],
2708
+ example: '["tensor/norm", "@entity.gradient"]'
2709
+ },
2710
+ // ============================================================================
2711
+ // Range Validation (for contracts)
2712
+ // ============================================================================
2713
+ "tensor/allInRange": {
2714
+ module: "tensor",
2715
+ category: "std-tensor",
2716
+ minArity: 2,
2717
+ maxArity: 2,
2718
+ description: "Check if all elements are within range [min, max]",
2719
+ hasSideEffects: false,
2720
+ returnType: "boolean",
2721
+ params: [
2722
+ { name: "tensor", type: "tensor", description: "The tensor" },
2723
+ { name: "range", type: "[number, number]", description: "Range as [min, max]" }
2724
+ ],
2725
+ example: '["tensor/allInRange", "@payload.input", [-1.0, 1.0]]'
2726
+ },
2727
+ "tensor/outOfRangeIndices": {
2728
+ module: "tensor",
2729
+ category: "std-tensor",
2730
+ minArity: 2,
2731
+ maxArity: 2,
2732
+ description: "Get indices of elements outside range",
2733
+ hasSideEffects: false,
2734
+ returnType: "number[]",
2735
+ params: [
2736
+ { name: "tensor", type: "tensor", description: "The tensor" },
2737
+ { name: "range", type: "[number, number]", description: "Range as [min, max]" }
2738
+ ],
2739
+ example: '["tensor/outOfRangeIndices", "@payload.input", [-1.0, 1.0]]'
2740
+ },
2741
+ "tensor/clamp": {
2742
+ module: "tensor",
2743
+ category: "std-tensor",
2744
+ minArity: 3,
2745
+ maxArity: 3,
2746
+ description: "Clamp all elements to range [min, max]",
2747
+ hasSideEffects: false,
2748
+ returnType: "tensor",
2749
+ params: [
2750
+ { name: "tensor", type: "tensor", description: "The tensor" },
2751
+ { name: "min", type: "number", description: "Minimum value" },
2752
+ { name: "max", type: "number", description: "Maximum value" }
2753
+ ],
2754
+ example: '["tensor/clamp", "@entity.output", -10.0, 10.0]'
2755
+ },
2756
+ "tensor/clampPerDim": {
2757
+ module: "tensor",
2758
+ category: "std-tensor",
2759
+ minArity: 2,
2760
+ maxArity: 2,
2761
+ description: "Clamp each dimension to its specified range",
2762
+ hasSideEffects: false,
2763
+ returnType: "tensor",
2764
+ params: [
2765
+ { name: "tensor", type: "tensor", description: "The tensor" },
2766
+ { name: "ranges", type: "object", description: 'Per-dimension ranges { "0": {min, max}, ... }' }
2767
+ ],
2768
+ example: '["tensor/clampPerDim", "@entity.rawOutput", "@entity.outputContract.ranges"]'
2769
+ },
2770
+ "tensor/outOfRangeDims": {
2771
+ module: "tensor",
2772
+ category: "std-tensor",
2773
+ minArity: 2,
2774
+ maxArity: 2,
2775
+ description: "Get dimensions that exceed their specified ranges",
2776
+ hasSideEffects: false,
2777
+ returnType: "array",
2778
+ params: [
2779
+ { name: "tensor", type: "tensor", description: "The tensor" },
2780
+ { name: "ranges", type: "object", description: 'Per-dimension ranges { "0": {min, max}, ... }' }
2781
+ ],
2782
+ example: '["tensor/outOfRangeDims", "@entity.rawOutput", "@entity.outputContract.ranges"]'
2783
+ },
2784
+ // ============================================================================
2785
+ // Conversion
2786
+ // ============================================================================
2787
+ "tensor/toArray": {
2788
+ module: "tensor",
2789
+ category: "std-tensor",
2790
+ minArity: 1,
2791
+ maxArity: 1,
2792
+ description: "Convert tensor to nested array",
2793
+ hasSideEffects: false,
2794
+ returnType: "array",
2795
+ params: [
2796
+ { name: "tensor", type: "tensor", description: "The tensor" }
2797
+ ],
2798
+ example: '["tensor/toArray", "@entity.output"]'
2799
+ },
2800
+ "tensor/toList": {
2801
+ module: "tensor",
2802
+ category: "std-tensor",
2803
+ minArity: 1,
2804
+ maxArity: 1,
2805
+ description: "Convert 1D tensor to flat array",
2806
+ hasSideEffects: false,
2807
+ returnType: "number[]",
2808
+ params: [
2809
+ { name: "tensor", type: "tensor", description: "The tensor (must be 1D)" }
2810
+ ],
2811
+ example: '["tensor/toList", "@entity.output"]'
2812
+ }
2813
+ };
2814
+
2815
+ // modules/train.ts
2816
+ var TRAIN_OPERATORS = {
2817
+ // ============================================================================
2818
+ // Training Loop
2819
+ // ============================================================================
2820
+ "train/loop": {
2821
+ module: "train",
2822
+ category: "std-train",
2823
+ minArity: 3,
2824
+ maxArity: 3,
2825
+ description: "Execute training loop with constraints",
2826
+ hasSideEffects: true,
2827
+ returnType: "train/result",
2828
+ params: [
2829
+ { name: "module", type: "nn/module", description: "The neural network to train" },
2830
+ { name: "data", type: "array", description: "Training data (array of {input, target} or experiences)" },
2831
+ { name: "config", type: "train/config", description: "Training configuration with constraints" }
2832
+ ],
2833
+ example: '["train/loop", "@entity.architecture", "@entity.buffer", "@entity.trainingConfig"]'
2834
+ },
2835
+ "train/step": {
2836
+ module: "train",
2837
+ category: "std-train",
2838
+ minArity: 4,
2839
+ maxArity: 4,
2840
+ description: "Execute single training step (forward, loss, backward, update)",
2841
+ hasSideEffects: true,
2842
+ returnType: "train/stepResult",
2843
+ params: [
2844
+ { name: "module", type: "nn/module", description: "The neural network" },
2845
+ { name: "input", type: "tensor", description: "Input tensor" },
2846
+ { name: "target", type: "tensor", description: "Target tensor" },
2847
+ { name: "config", type: "train/config", description: "Training configuration" }
2848
+ ],
2849
+ example: '["train/step", "@entity.architecture", "@batch.input", "@batch.target", "@entity.config"]'
2850
+ },
2851
+ // ============================================================================
2852
+ // Validation
2853
+ // ============================================================================
2854
+ "train/validate": {
2855
+ module: "train",
2856
+ category: "std-train",
2857
+ minArity: 2,
2858
+ maxArity: 2,
2859
+ description: "Validate model on test cases, returns pass/fail metrics",
2860
+ hasSideEffects: false,
2861
+ returnType: "train/validationResult",
2862
+ params: [
2863
+ { name: "module", type: "nn/module", description: "The neural network" },
2864
+ { name: "testCases", type: "array", description: "Array of {input, expected, tolerance?}" }
2865
+ ],
2866
+ example: '["train/validate", "@entity.architecture", "@entity.validationSet"]'
2867
+ },
2868
+ "train/checkRegression": {
2869
+ module: "train",
2870
+ category: "std-train",
2871
+ minArity: 3,
2872
+ maxArity: 3,
2873
+ description: "Check if new model regresses on required invariants",
2874
+ hasSideEffects: false,
2875
+ returnType: "train/regressionResult",
2876
+ params: [
2877
+ { name: "newModule", type: "nn/module", description: "Newly trained network" },
2878
+ { name: "oldModule", type: "nn/module", description: "Previous network" },
2879
+ { name: "invariants", type: "array", description: "Test cases that must not regress" }
2880
+ ],
2881
+ example: '["train/checkRegression", "@payload.newWeights", "@entity.architecture", "@entity.requiredInvariants"]'
2882
+ },
2883
+ // ============================================================================
2884
+ // Constraint Checking
2885
+ // ============================================================================
2886
+ "train/checkConstraints": {
2887
+ module: "train",
2888
+ category: "std-train",
2889
+ minArity: 2,
2890
+ maxArity: 2,
2891
+ description: "Check if network weights satisfy all constraints",
2892
+ hasSideEffects: false,
2893
+ returnType: "train/constraintResult",
2894
+ params: [
2895
+ { name: "module", type: "nn/module", description: "The neural network" },
2896
+ { name: "constraints", type: "train/constraints", description: "Constraint specification" }
2897
+ ],
2898
+ example: '["train/checkConstraints", "@payload.newWeights", "@entity.constraints"]'
2899
+ },
2900
+ "train/checkWeightMagnitude": {
2901
+ module: "train",
2902
+ category: "std-train",
2903
+ minArity: 2,
2904
+ maxArity: 2,
2905
+ description: "Check if all weights are within magnitude limit",
2906
+ hasSideEffects: false,
2907
+ returnType: "boolean",
2908
+ params: [
2909
+ { name: "module", type: "nn/module", description: "The neural network" },
2910
+ { name: "maxMagnitude", type: "number", description: "Maximum allowed weight magnitude" }
2911
+ ],
2912
+ example: '["train/checkWeightMagnitude", "@entity.architecture", 10.0]'
2913
+ },
2914
+ "train/checkForbiddenOutputs": {
2915
+ module: "train",
2916
+ category: "std-train",
2917
+ minArity: 3,
2918
+ maxArity: 3,
2919
+ description: "Check if model produces outputs in forbidden regions",
2920
+ hasSideEffects: false,
2921
+ returnType: "train/forbiddenResult",
2922
+ params: [
2923
+ { name: "module", type: "nn/module", description: "The neural network" },
2924
+ { name: "testInputs", type: "array", description: "Inputs to test" },
2925
+ { name: "forbiddenRegions", type: "array", description: "Forbidden output regions" }
2926
+ ],
2927
+ example: '["train/checkForbiddenOutputs", "@entity.architecture", "@entity.testInputs", "@entity.forbiddenOutputRegions"]'
2928
+ },
2929
+ // ============================================================================
2930
+ // Gradient Operations
2931
+ // ============================================================================
2932
+ "train/clipGradients": {
2933
+ module: "train",
2934
+ category: "std-train",
2935
+ minArity: 2,
2936
+ maxArity: 2,
2937
+ description: "Clip gradients to max norm (modifies in place)",
2938
+ hasSideEffects: true,
2939
+ returnType: "number",
2940
+ params: [
2941
+ { name: "module", type: "nn/module", description: "The neural network" },
2942
+ { name: "maxNorm", type: "number", description: "Maximum gradient norm" }
2943
+ ],
2944
+ example: '["train/clipGradients", "@entity.architecture", 1.0]'
2945
+ },
2946
+ "train/getGradientNorm": {
2947
+ module: "train",
2948
+ category: "std-train",
2949
+ minArity: 1,
2950
+ maxArity: 1,
2951
+ description: "Get current gradient norm",
2952
+ hasSideEffects: false,
2953
+ returnType: "number",
2954
+ params: [
2955
+ { name: "module", type: "nn/module", description: "The neural network" }
2956
+ ],
2957
+ example: '["train/getGradientNorm", "@entity.architecture"]'
2958
+ },
2959
+ // ============================================================================
2960
+ // Weight Operations
2961
+ // ============================================================================
2962
+ "train/clipWeights": {
2963
+ module: "train",
2964
+ category: "std-train",
2965
+ minArity: 2,
2966
+ maxArity: 2,
2967
+ description: "Clip weights to max magnitude (modifies in place)",
2968
+ hasSideEffects: true,
2969
+ returnType: "void",
2970
+ params: [
2971
+ { name: "module", type: "nn/module", description: "The neural network" },
2972
+ { name: "maxMagnitude", type: "number", description: "Maximum weight magnitude" }
2973
+ ],
2974
+ example: '["train/clipWeights", "@entity.architecture", 10.0]'
2975
+ },
2976
+ "train/getMaxWeightMagnitude": {
2977
+ module: "train",
2978
+ category: "std-train",
2979
+ minArity: 1,
2980
+ maxArity: 1,
2981
+ description: "Get maximum weight magnitude in network",
2982
+ hasSideEffects: false,
2983
+ returnType: "number",
2984
+ params: [
2985
+ { name: "module", type: "nn/module", description: "The neural network" }
2986
+ ],
2987
+ example: '["train/getMaxWeightMagnitude", "@entity.architecture"]'
2988
+ },
2989
+ // ============================================================================
2990
+ // Loss Functions
2991
+ // ============================================================================
2992
+ "train/mse": {
2993
+ module: "train",
2994
+ category: "std-train",
2995
+ minArity: 2,
2996
+ maxArity: 2,
2997
+ description: "Mean squared error loss",
2998
+ hasSideEffects: false,
2999
+ returnType: "number",
3000
+ params: [
3001
+ { name: "predicted", type: "tensor", description: "Predicted values" },
3002
+ { name: "target", type: "tensor", description: "Target values" }
3003
+ ],
3004
+ example: '["train/mse", "@entity.output", "@batch.target"]'
3005
+ },
3006
+ "train/crossEntropy": {
3007
+ module: "train",
3008
+ category: "std-train",
3009
+ minArity: 2,
3010
+ maxArity: 2,
3011
+ description: "Cross-entropy loss for classification",
3012
+ hasSideEffects: false,
3013
+ returnType: "number",
3014
+ params: [
3015
+ { name: "logits", type: "tensor", description: "Raw model outputs (logits)" },
3016
+ { name: "labels", type: "tensor", description: "Target class labels" }
3017
+ ],
3018
+ example: '["train/crossEntropy", "@entity.logits", "@batch.labels"]'
3019
+ },
3020
+ "train/huber": {
3021
+ module: "train",
3022
+ category: "std-train",
3023
+ minArity: 2,
3024
+ maxArity: 3,
3025
+ description: "Huber loss (smooth L1, robust to outliers)",
3026
+ hasSideEffects: false,
3027
+ returnType: "number",
3028
+ params: [
3029
+ { name: "predicted", type: "tensor", description: "Predicted values" },
3030
+ { name: "target", type: "tensor", description: "Target values" },
3031
+ { name: "delta", type: "number", description: "Threshold for quadratic vs linear", optional: true, defaultValue: 1 }
3032
+ ],
3033
+ example: '["train/huber", "@entity.qValues", "@batch.targets", 1.0]'
3034
+ },
3035
+ // ============================================================================
3036
+ // Optimizers
3037
+ // ============================================================================
3038
+ "train/sgd": {
3039
+ module: "train",
3040
+ category: "std-train",
3041
+ minArity: 2,
3042
+ maxArity: 3,
3043
+ description: "Stochastic gradient descent optimizer step",
3044
+ hasSideEffects: true,
3045
+ returnType: "void",
3046
+ params: [
3047
+ { name: "module", type: "nn/module", description: "The neural network" },
3048
+ { name: "lr", type: "number", description: "Learning rate" },
3049
+ { name: "momentum", type: "number", description: "Momentum factor", optional: true, defaultValue: 0 }
3050
+ ],
3051
+ example: '["train/sgd", "@entity.architecture", 0.01, 0.9]'
3052
+ },
3053
+ "train/adam": {
3054
+ module: "train",
3055
+ category: "std-train",
3056
+ minArity: 2,
3057
+ maxArity: 4,
3058
+ description: "Adam optimizer step",
3059
+ hasSideEffects: true,
3060
+ returnType: "void",
3061
+ params: [
3062
+ { name: "module", type: "nn/module", description: "The neural network" },
3063
+ { name: "lr", type: "number", description: "Learning rate" },
3064
+ { name: "beta1", type: "number", description: "First moment decay", optional: true, defaultValue: 0.9 },
3065
+ { name: "beta2", type: "number", description: "Second moment decay", optional: true, defaultValue: 0.999 }
3066
+ ],
3067
+ example: '["train/adam", "@entity.architecture", 0.001]'
3068
+ },
3069
+ // ============================================================================
3070
+ // Experience Replay (for RL)
3071
+ // ============================================================================
3072
+ "train/sampleBatch": {
3073
+ module: "train",
3074
+ category: "std-train",
3075
+ minArity: 2,
3076
+ maxArity: 2,
3077
+ description: "Sample random batch from experience buffer",
3078
+ hasSideEffects: false,
3079
+ returnType: "array",
3080
+ params: [
3081
+ { name: "buffer", type: "array", description: "Experience buffer" },
3082
+ { name: "batchSize", type: "number", description: "Number of samples" }
3083
+ ],
3084
+ example: '["train/sampleBatch", "@entity.experienceBuffer", 32]'
3085
+ },
3086
+ "train/computeReturns": {
3087
+ module: "train",
3088
+ category: "std-train",
3089
+ minArity: 2,
3090
+ maxArity: 2,
3091
+ description: "Compute discounted returns from rewards",
3092
+ hasSideEffects: false,
3093
+ returnType: "tensor",
3094
+ params: [
3095
+ { name: "rewards", type: "array", description: "Array of rewards" },
3096
+ { name: "gamma", type: "number", description: "Discount factor" }
3097
+ ],
3098
+ example: '["train/computeReturns", "@episode.rewards", 0.99]'
3099
+ },
3100
+ "train/computeAdvantages": {
3101
+ module: "train",
3102
+ category: "std-train",
3103
+ minArity: 3,
3104
+ maxArity: 3,
3105
+ description: "Compute GAE advantages for policy gradient",
3106
+ hasSideEffects: false,
3107
+ returnType: "tensor",
3108
+ params: [
3109
+ { name: "rewards", type: "array", description: "Array of rewards" },
3110
+ { name: "values", type: "tensor", description: "Value estimates" },
3111
+ { name: "config", type: "object", description: "Config with gamma, lambda" }
3112
+ ],
3113
+ example: '["train/computeAdvantages", "@episode.rewards", "@episode.values", { "gamma": 0.99, "lambda": 0.95 }]'
3114
+ }
3115
+ };
3116
+
3117
+ // registry.ts
3118
+ var STD_OPERATORS = {
3119
+ ...MATH_OPERATORS,
3120
+ ...STR_OPERATORS,
3121
+ ...ARRAY_OPERATORS,
3122
+ ...OBJECT_OPERATORS,
3123
+ ...TIME_OPERATORS,
3124
+ ...VALIDATE_OPERATORS,
3125
+ ...FORMAT_OPERATORS,
3126
+ ...ASYNC_OPERATORS,
3127
+ ...NN_OPERATORS,
3128
+ ...TENSOR_OPERATORS,
3129
+ ...TRAIN_OPERATORS
3130
+ };
3131
+ var STD_OPERATORS_BY_MODULE = {
3132
+ math: MATH_OPERATORS,
3133
+ str: STR_OPERATORS,
3134
+ array: ARRAY_OPERATORS,
3135
+ object: OBJECT_OPERATORS,
3136
+ time: TIME_OPERATORS,
3137
+ validate: VALIDATE_OPERATORS,
3138
+ format: FORMAT_OPERATORS,
3139
+ async: ASYNC_OPERATORS,
3140
+ nn: NN_OPERATORS,
3141
+ tensor: TENSOR_OPERATORS,
3142
+ train: TRAIN_OPERATORS
3143
+ };
3144
+ function getStdOperatorMeta(operator) {
3145
+ return STD_OPERATORS[operator];
3146
+ }
3147
+ function isKnownStdOperator(operator) {
3148
+ return operator in STD_OPERATORS;
3149
+ }
3150
+ function getModuleOperators(module) {
3151
+ return STD_OPERATORS_BY_MODULE[module] || {};
3152
+ }
3153
+ function getAllStdOperators() {
3154
+ return Object.keys(STD_OPERATORS);
3155
+ }
3156
+ function getStdOperatorsByModule(module) {
3157
+ return Object.keys(STD_OPERATORS_BY_MODULE[module] || {});
3158
+ }
3159
+ function getLambdaOperators() {
3160
+ return Object.entries(STD_OPERATORS).filter(([, meta]) => meta.acceptsLambda).map(([name]) => name);
3161
+ }
3162
+ function getStdEffectOperators() {
3163
+ return Object.entries(STD_OPERATORS).filter(([, meta]) => meta.hasSideEffects).map(([name]) => name);
3164
+ }
3165
+ function getStdPureOperators() {
3166
+ return Object.entries(STD_OPERATORS).filter(([, meta]) => !meta.hasSideEffects).map(([name]) => name);
3167
+ }
3168
+ function validateStdOperatorArity(operator, argCount) {
3169
+ const meta = STD_OPERATORS[operator];
3170
+ if (!meta) {
3171
+ return `Unknown std operator: ${operator}`;
3172
+ }
3173
+ if (argCount < meta.minArity) {
3174
+ return `Operator '${operator}' requires at least ${meta.minArity} argument(s), got ${argCount}`;
3175
+ }
3176
+ if (meta.maxArity !== null && argCount > meta.maxArity) {
3177
+ return `Operator '${operator}' accepts at most ${meta.maxArity} argument(s), got ${argCount}`;
3178
+ }
3179
+ return null;
3180
+ }
3181
+ function isStdGuardOperator(operator) {
3182
+ const meta = STD_OPERATORS[operator];
3183
+ return meta !== void 0 && !meta.hasSideEffects;
3184
+ }
3185
+ function isStdEffectOperator(operator) {
3186
+ const meta = STD_OPERATORS[operator];
3187
+ return meta?.hasSideEffects ?? false;
3188
+ }
3189
+ function getOperatorMetaExtended(operator, coreOperators) {
3190
+ if (isStdOperator(operator)) {
3191
+ return STD_OPERATORS[operator];
3192
+ }
3193
+ return coreOperators[operator];
3194
+ }
3195
+ function isKnownOperatorExtended(operator, coreOperators) {
3196
+ if (isStdOperator(operator)) {
3197
+ return operator in STD_OPERATORS;
3198
+ }
3199
+ return operator in coreOperators;
3200
+ }
3201
+ function validateOperatorArityExtended(operator, argCount, coreOperators) {
3202
+ if (isStdOperator(operator)) {
3203
+ return validateStdOperatorArity(operator, argCount);
3204
+ }
3205
+ const meta = coreOperators[operator];
3206
+ if (!meta) {
3207
+ return `Unknown operator: ${operator}`;
3208
+ }
3209
+ if (argCount < meta.minArity) {
3210
+ return `Operator '${operator}' requires at least ${meta.minArity} argument(s), got ${argCount}`;
3211
+ }
3212
+ if (meta.maxArity !== null && argCount > meta.maxArity) {
3213
+ return `Operator '${operator}' accepts at most ${meta.maxArity} argument(s), got ${argCount}`;
3214
+ }
3215
+ return null;
3216
+ }
3217
+ function isEffectOperatorExtended(operator, coreOperators) {
3218
+ if (isStdOperator(operator)) {
3219
+ return isStdEffectOperator(operator);
3220
+ }
3221
+ const meta = coreOperators[operator];
3222
+ return meta?.hasSideEffects ?? false;
3223
+ }
3224
+ function getStdLibStats() {
3225
+ const byModule = {};
3226
+ for (const module of STD_MODULES) {
3227
+ byModule[module] = Object.keys(STD_OPERATORS_BY_MODULE[module] || {}).length;
3228
+ }
3229
+ return {
3230
+ totalOperators: Object.keys(STD_OPERATORS).length,
3231
+ byModule,
3232
+ pureOperators: getStdPureOperators().length,
3233
+ effectOperators: getStdEffectOperators().length,
3234
+ lambdaOperators: getLambdaOperators().length
3235
+ };
3236
+ }
3237
+
3238
+ export { STD_OPERATORS, STD_OPERATORS_BY_MODULE, getAllStdOperators, getLambdaOperators, getModuleOperators, getOperatorMetaExtended, getStdEffectOperators, getStdLibStats, getStdOperatorMeta, getStdOperatorsByModule, getStdPureOperators, isEffectOperatorExtended, isKnownOperatorExtended, isKnownStdOperator, isStdEffectOperator, isStdGuardOperator, validateOperatorArityExtended, validateStdOperatorArity };
3239
+ //# sourceMappingURL=registry.js.map
3240
+ //# sourceMappingURL=registry.js.map