@cadenza.io/core 1.10.1 → 1.11.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.
package/dist/index.mjs CHANGED
@@ -1,3 +1,38 @@
1
+ // src/utils/tools.ts
2
+ function deepCloneFilter(input, filterOut = () => false) {
3
+ if (input === null || typeof input !== "object") {
4
+ return input;
5
+ }
6
+ const visited = /* @__PURE__ */ new WeakMap();
7
+ const stack = [];
8
+ const output = Array.isArray(input) ? [] : {};
9
+ stack.push({ source: input, target: output });
10
+ visited.set(input, output);
11
+ while (stack.length) {
12
+ const { source, target, key } = stack.pop();
13
+ const currentTarget = key !== void 0 ? target[key] : target;
14
+ for (const [k, value] of Object.entries(source)) {
15
+ if (filterOut(k)) continue;
16
+ if (value && typeof value === "object") {
17
+ if (visited.has(value)) {
18
+ currentTarget[k] = visited.get(value);
19
+ continue;
20
+ }
21
+ const clonedValue = Array.isArray(value) ? [] : {};
22
+ currentTarget[k] = clonedValue;
23
+ visited.set(value, clonedValue);
24
+ stack.push({ source: value, target: currentTarget, key: k });
25
+ } else {
26
+ currentTarget[k] = value;
27
+ }
28
+ }
29
+ }
30
+ return output;
31
+ }
32
+ function formatTimestamp(timestamp) {
33
+ return new Date(timestamp).toISOString();
34
+ }
35
+
1
36
  // src/engine/SignalBroker.ts
2
37
  var SignalBroker = class _SignalBroker {
3
38
  // execId -> emitted signals
@@ -64,8 +99,11 @@ var SignalBroker = class _SignalBroker {
64
99
  },
65
100
  "Executes queued signals and clears the stack",
66
101
  500,
67
- { maxWait: 1e4 }
68
- ).doOn("meta.process_signal_queue_requested");
102
+ {
103
+ maxWait: 1e4,
104
+ leading: true
105
+ }
106
+ ).doOn("meta.process_signal_queue_requested").emitsAfter("meta.signal_broker.queue_empty");
69
107
  this.getSignalsTask = Cadenza.createMetaTask("Get signals", (ctx) => {
70
108
  return {
71
109
  __signals: Array.from(this.signalObservers.keys()),
@@ -107,6 +145,7 @@ var SignalBroker = class _SignalBroker {
107
145
  */
108
146
  emit(signal, context = {}) {
109
147
  const execId = context.__routineExecId || "global";
148
+ delete context.__routineExecId;
110
149
  if (!this.emitStacks.has(execId)) this.emitStacks.set(execId, /* @__PURE__ */ new Map());
111
150
  const stack = this.emitStacks.get(execId);
112
151
  stack.set(signal, context);
@@ -119,29 +158,36 @@ var SignalBroker = class _SignalBroker {
119
158
  }
120
159
  }
121
160
  execute(signal, context) {
122
- const isMeta = signal.startsWith("meta");
123
- const emittedAt = Date.now();
124
- const data = {
125
- ...context,
126
- __signalEmission: {
161
+ const isMeta = signal.startsWith("meta.");
162
+ const isSubMeta = signal.startsWith("sub_meta.");
163
+ if (!isSubMeta && (!isMeta || this.debug)) {
164
+ const emittedAt = Date.now();
165
+ context.__signalEmission = {
127
166
  ...context.__signalEmission,
128
167
  signalName: signal,
129
- emittedAt,
168
+ emittedAt: formatTimestamp(emittedAt),
130
169
  isMeta
131
- }
132
- };
133
- let executed;
134
- executed = this.executeListener(signal, data);
135
- const parts = signal.slice(0, Math.max(signal.lastIndexOf(":"), signal.lastIndexOf("."))).split(".");
136
- for (let i = parts.length; i > 0; i--) {
137
- const parent = parts.slice(0, i).join(".");
138
- executed = executed || this.executeListener(parent + ".*", data);
170
+ };
171
+ } else if (isSubMeta) {
172
+ context.__isSubMeta = true;
173
+ delete context.__signalEmission;
174
+ } else {
175
+ delete context.__signalEmission;
139
176
  }
140
- if (this.debug) {
141
- console.log(
142
- `Emitted signal ${signal} with context ${JSON.stringify(data)}`,
143
- executed ? "\u2705" : "\u274C"
144
- );
177
+ let executed;
178
+ executed = this.executeListener(signal, context);
179
+ if (!isSubMeta) {
180
+ const parts = signal.slice(0, Math.max(signal.lastIndexOf(":"), signal.lastIndexOf("."))).split(".");
181
+ for (let i = parts.length; i > 0; i--) {
182
+ const parent = parts.slice(0, i).join(".");
183
+ executed = executed || this.executeListener(parent + ".*", context);
184
+ }
185
+ if (this.debug) {
186
+ console.log(
187
+ `Emitted signal ${signal} with context ${JSON.stringify(context)}`,
188
+ executed ? "\u2705" : "\u274C"
189
+ );
190
+ }
145
191
  }
146
192
  return executed;
147
193
  }
@@ -448,40 +494,6 @@ import { v4 as uuid3 } from "uuid";
448
494
 
449
495
  // src/graph/context/GraphContext.ts
450
496
  import { v4 as uuid2 } from "uuid";
451
-
452
- // src/utils/tools.ts
453
- function deepCloneFilter(input, filterOut = () => false) {
454
- if (input === null || typeof input !== "object") {
455
- return input;
456
- }
457
- const visited = /* @__PURE__ */ new WeakMap();
458
- const stack = [];
459
- const output = Array.isArray(input) ? [] : {};
460
- stack.push({ source: input, target: output });
461
- visited.set(input, output);
462
- while (stack.length) {
463
- const { source, target, key } = stack.pop();
464
- const currentTarget = key !== void 0 ? target[key] : target;
465
- for (const [k, value] of Object.entries(source)) {
466
- if (filterOut(k)) continue;
467
- if (value && typeof value === "object") {
468
- if (visited.has(value)) {
469
- currentTarget[k] = visited.get(value);
470
- continue;
471
- }
472
- const clonedValue = Array.isArray(value) ? [] : {};
473
- currentTarget[k] = clonedValue;
474
- visited.set(value, clonedValue);
475
- stack.push({ source: value, target: currentTarget, key: k });
476
- } else {
477
- currentTarget[k] = value;
478
- }
479
- }
480
- }
481
- return output;
482
- }
483
-
484
- // src/graph/context/GraphContext.ts
485
497
  var GraphContext = class _GraphContext {
486
498
  // __keys, frozen
487
499
  constructor(context) {
@@ -641,7 +653,10 @@ function sleep(ms) {
641
653
  // src/graph/execution/GraphNode.ts
642
654
  var GraphNode = class _GraphNode extends SignalEmitter {
643
655
  constructor(task, context, routineExecId, prevNodes = [], debug = false) {
644
- super(task.isMeta);
656
+ var _a;
657
+ super(
658
+ task.isMeta && !debug || task.isSubMeta || ((_a = context == null ? void 0 : context.getMetaData()) == null ? void 0 : _a.__isSubMeta)
659
+ );
645
660
  this.divided = false;
646
661
  this.splitGroupId = "";
647
662
  this.processing = false;
@@ -712,6 +727,7 @@ var GraphNode = class _GraphNode extends SignalEmitter {
712
727
  return this.task.getTag(this.context);
713
728
  }
714
729
  scheduleOn(layer) {
730
+ var _a;
715
731
  let shouldSchedule = true;
716
732
  const nodes = layer.getNodesByRoutineExecId(this.routineExecId);
717
733
  for (const node of nodes) {
@@ -728,23 +744,56 @@ var GraphNode = class _GraphNode extends SignalEmitter {
728
744
  if (shouldSchedule) {
729
745
  this.layer = layer;
730
746
  layer.add(this);
747
+ const context = this.context.getFullContext();
731
748
  const scheduledAt = Date.now();
732
749
  this.emitWithMetadata("meta.node.scheduled", {
733
- ...this.lightExport(),
734
- __scheduled: scheduledAt
750
+ data: {
751
+ uuid: this.id,
752
+ routineExecutionId: this.routineExecId,
753
+ contractId: context.__contractId,
754
+ context: this.context.export(),
755
+ taskId: this.task.id,
756
+ taskName: this.task.name,
757
+ isMeta: this.isMeta(),
758
+ isScheduled: true,
759
+ splitGroupId: this.splitGroupId,
760
+ created: formatTimestamp(scheduledAt)
761
+ }
735
762
  });
736
- const context = this.context.getFullContext();
737
- if (context.__signalEmission !== void 0 && (!this.isMeta() || this.debug)) {
763
+ this.previousNodes.forEach((node) => {
764
+ this.emitWithMetadata("meta.node.mapped", {
765
+ data: {
766
+ taskExecutionId: this.id,
767
+ previousTaskExecutionId: node.id,
768
+ executionCount: "increment"
769
+ },
770
+ filter: {
771
+ taskId: this.task.id,
772
+ previousTaskId: node.task.id
773
+ }
774
+ });
775
+ if (node.failed || node.errored) {
776
+ this.emitWithMetadata("meta.node.failed_mapped", {
777
+ data: {
778
+ executionCount: "increment"
779
+ },
780
+ filter: {
781
+ taskId: this.task.id,
782
+ failTaskId: node.task.id
783
+ }
784
+ });
785
+ }
786
+ });
787
+ if (((_a = context.__signalEmission) == null ? void 0 : _a.signalName) && (!this.isMeta() || this.debug)) {
738
788
  this.emitWithMetadata("meta.node.consumed_signal", {
739
- __signalConsumption: {
789
+ data: {
740
790
  signalName: context.__signalEmission.signalName,
741
791
  taskId: this.task.id,
742
792
  taskExecutionId: this.id,
743
- consumedAt: scheduledAt
793
+ consumedAt: formatTimestamp(scheduledAt)
744
794
  }
745
795
  });
746
796
  delete context.__signalEmission;
747
- this.migrate(context);
748
797
  }
749
798
  }
750
799
  }
@@ -752,14 +801,25 @@ var GraphNode = class _GraphNode extends SignalEmitter {
752
801
  if (this.executionStart === 0) {
753
802
  this.executionStart = Date.now();
754
803
  }
755
- const memento = this.lightExport();
756
804
  if (this.previousNodes.length === 0) {
757
- this.emitWithMetadata("meta.node.started_routine_execution", memento);
805
+ this.emitWithMetadata("meta.node.started_routine_execution", {
806
+ data: {
807
+ isRunning: true,
808
+ started: formatTimestamp(this.executionStart)
809
+ },
810
+ filter: { uuid: this.routineExecId }
811
+ });
758
812
  }
759
813
  if (this.debug) {
760
814
  this.log();
761
815
  }
762
- this.emitWithMetadata("meta.node.started", memento);
816
+ this.emitWithMetadata("meta.node.started", {
817
+ data: {
818
+ isRunning: true,
819
+ started: formatTimestamp(this.executionStart)
820
+ },
821
+ filter: { uuid: this.id }
822
+ });
763
823
  return this.executionStart;
764
824
  }
765
825
  end() {
@@ -769,15 +829,44 @@ var GraphNode = class _GraphNode extends SignalEmitter {
769
829
  this.processing = false;
770
830
  const end = Date.now();
771
831
  this.executionTime = end - this.executionStart;
772
- const memento = this.lightExport();
832
+ const context = this.context.getFullContext();
773
833
  if (this.errored || this.failed) {
774
- this.emitWithMetadata("meta.node.errored", memento);
834
+ this.emitWithMetadata("meta.node.errored", {
835
+ data: {
836
+ isRunning: false,
837
+ errored: this.errored,
838
+ failed: this.failed,
839
+ errorMessage: context.__error
840
+ },
841
+ filter: { uuid: this.id }
842
+ });
775
843
  }
776
- this.emitWithMetadata("meta.node.ended", memento);
844
+ this.emitWithMetadata("meta.node.ended", {
845
+ data: {
846
+ isRunning: false,
847
+ isComplete: true,
848
+ resultContext: this.context.export(),
849
+ errored: this.errored,
850
+ failed: this.failed,
851
+ errorMessage: context.__error,
852
+ progress: 1,
853
+ ended: formatTimestamp(end)
854
+ },
855
+ filter: { uuid: this.id }
856
+ });
777
857
  if (this.graphDone()) {
778
858
  this.emitWithMetadata(
779
859
  `meta.node.ended_routine_execution:${this.routineExecId}`,
780
- memento
860
+ {
861
+ data: {
862
+ isRunning: false,
863
+ isComplete: true,
864
+ resultContext: this.context.export(),
865
+ progress: 1,
866
+ ended: formatTimestamp(end)
867
+ },
868
+ filter: { uuid: this.routineExecId }
869
+ }
781
870
  );
782
871
  }
783
872
  return end;
@@ -839,23 +928,41 @@ var GraphNode = class _GraphNode extends SignalEmitter {
839
928
  }
840
929
  }
841
930
  emitWithMetadata(signal, ctx) {
842
- this.emit(signal, {
843
- ...ctx,
844
- __signalEmission: {
931
+ if (this.silent) return;
932
+ const data = { ...ctx };
933
+ if (!this.task.isHidden) {
934
+ data.__signalEmission = {
845
935
  taskId: this.task.id,
846
936
  taskExecutionId: this.id
847
- }
848
- });
937
+ };
938
+ data.__metadata = {
939
+ __routineExecId: this.routineExecId
940
+ };
941
+ }
942
+ this.emit(signal, data);
849
943
  }
850
944
  onProgress(progress) {
851
- var _a, _b, _c;
945
+ var _a, _b;
852
946
  progress = Math.min(Math.max(0, progress), 1);
853
- this.emitWithMetadata(`meta.node.progress:${this.routineExecId}`, {
854
- __nodeId: this.id,
855
- __routineExecId: this.routineExecId,
856
- __progress: progress,
857
- __weight: this.task.progressWeight / ((_c = (_b = (_a = this.layer) == null ? void 0 : _a.getNodesByRoutineExecId(this.routineExecId)) == null ? void 0 : _b.length) != null ? _c : 1)
947
+ this.emitWithMetadata("meta.node.progress", {
948
+ data: {
949
+ progress
950
+ },
951
+ filter: {
952
+ uuid: this.id
953
+ }
858
954
  });
955
+ this.emitWithMetadata(
956
+ `meta.node.routine_execution_progress:${this.routineExecId}`,
957
+ {
958
+ data: {
959
+ progress: progress * this.task.progressWeight / ((_b = (_a = this.layer) == null ? void 0 : _a.getIdenticalNodes(this).length) != null ? _b : 1)
960
+ },
961
+ filter: {
962
+ uuid: this.routineExecId
963
+ }
964
+ }
965
+ );
859
966
  }
860
967
  postProcess() {
861
968
  if (typeof this.result === "string") {
@@ -872,11 +979,11 @@ var GraphNode = class _GraphNode extends SignalEmitter {
872
979
  }
873
980
  if (this.errored || this.failed) {
874
981
  this.task.mapOnFailSignals(
875
- (signal) => this.emitWithMetadata(signal, this.context)
982
+ (signal) => this.emitWithMetadata(signal, this.context.getFullContext())
876
983
  );
877
984
  } else {
878
985
  this.task.mapSignals(
879
- (signal) => this.emitWithMetadata(signal, this.context)
986
+ (signal) => this.emitWithMetadata(signal, this.context.getFullContext())
880
987
  );
881
988
  }
882
989
  this.end();
@@ -1265,8 +1372,24 @@ var GraphRoutine = class extends SignalParticipant {
1265
1372
  this.name = name;
1266
1373
  this.description = description;
1267
1374
  this.isMeta = isMeta;
1268
- tasks.forEach((t) => this.tasks.add(t));
1269
- this.emit("meta.routine.created", { __routine: this });
1375
+ this.emit("meta.routine.created", {
1376
+ data: {
1377
+ uuid: this.id,
1378
+ name: this.name,
1379
+ description: this.description,
1380
+ isMeta: this.isMeta
1381
+ },
1382
+ __routineInstance: this
1383
+ });
1384
+ tasks.forEach((t) => {
1385
+ this.tasks.add(t);
1386
+ this.emit("meta.routine.task_added", {
1387
+ data: {
1388
+ taskId: t.id,
1389
+ routineId: this.id
1390
+ }
1391
+ });
1392
+ });
1270
1393
  }
1271
1394
  /**
1272
1395
  * Applies callback to starting tasks.
@@ -1296,7 +1419,10 @@ var GraphRoutine = class extends SignalParticipant {
1296
1419
  */
1297
1420
  destroy() {
1298
1421
  this.tasks.clear();
1299
- this.emit("meta.routine.destroyed", { __id: this.id });
1422
+ this.emit("meta.routine.destroyed", {
1423
+ data: { deleted: true },
1424
+ filter: { uuid: this.id }
1425
+ });
1300
1426
  }
1301
1427
  };
1302
1428
 
@@ -1346,6 +1472,8 @@ var Task = class extends SignalParticipant {
1346
1472
  * @param register Register via signal (default true).
1347
1473
  * @param isUnique
1348
1474
  * @param isMeta
1475
+ * @param isSubMeta
1476
+ * @param isHidden
1349
1477
  * @param getTagCallback
1350
1478
  * @param inputSchema
1351
1479
  * @param validateInputContext
@@ -1357,14 +1485,17 @@ var Task = class extends SignalParticipant {
1357
1485
  * @param retryDelayFactor
1358
1486
  * @edge Emits 'meta.task.created' with { __task: this } for seed.
1359
1487
  */
1360
- constructor(name, task, description = "", concurrency = 0, timeout = 0, register = true, isUnique = false, isMeta = false, getTagCallback = void 0, inputSchema = void 0, validateInputContext = false, outputSchema = void 0, validateOutputContext = false, retryCount = 0, retryDelay = 0, retryDelayMax = 0, retryDelayFactor = 1) {
1488
+ constructor(name, task, description = "", concurrency = 0, timeout = 0, register = true, isUnique = false, isMeta = false, isSubMeta = false, isHidden = false, getTagCallback = void 0, inputSchema = void 0, validateInputContext = false, outputSchema = void 0, validateOutputContext = false, retryCount = 0, retryDelay = 0, retryDelayMax = 0, retryDelayFactor = 1) {
1361
1489
  super();
1362
1490
  this.isMeta = false;
1491
+ this.isSubMeta = false;
1492
+ this.isHidden = false;
1363
1493
  this.isUnique = false;
1364
1494
  this.throttled = false;
1365
1495
  this.isSignal = false;
1366
1496
  this.isDeputy = false;
1367
1497
  this.isEphemeral = false;
1498
+ this.isDebounce = false;
1368
1499
  this.inputContextSchema = void 0;
1369
1500
  this.validateInputContext = false;
1370
1501
  this.outputContextSchema = void 0;
@@ -1387,6 +1518,8 @@ var Task = class extends SignalParticipant {
1387
1518
  this.timeout = timeout;
1388
1519
  this.isUnique = isUnique;
1389
1520
  this.isMeta = isMeta;
1521
+ this.isSubMeta = isSubMeta;
1522
+ this.isHidden = isHidden;
1390
1523
  this.inputContextSchema = inputSchema;
1391
1524
  this.validateInputContext = validateInputContext;
1392
1525
  this.outputContextSchema = outputSchema;
@@ -1399,8 +1532,35 @@ var Task = class extends SignalParticipant {
1399
1532
  this.getTag = (context) => getTagCallback(context, this);
1400
1533
  this.throttled = true;
1401
1534
  }
1402
- if (register) {
1403
- this.emit("meta.task.created", { __task: this });
1535
+ if (register && !this.isHidden && !this.isSubMeta) {
1536
+ const { __functionString, __getTagCallback } = this.export();
1537
+ this.emit("meta.task.created", {
1538
+ __task: {
1539
+ uuid: this.id,
1540
+ name: this.name,
1541
+ description: this.description,
1542
+ functionString: __functionString,
1543
+ tagIdGetter: __getTagCallback,
1544
+ layerIndex: this.layerIndex,
1545
+ concurrency: this.concurrency,
1546
+ retryCount: this.retryCount,
1547
+ retryDelay: this.retryDelay,
1548
+ retryDelayMax: this.retryDelayMax,
1549
+ retryDelayFactor: this.retryDelayFactor,
1550
+ timeout: this.timeout,
1551
+ isUnique: this.isUnique,
1552
+ isSignal: this.isSignal,
1553
+ isThrottled: this.throttled,
1554
+ isDebounce: this.isDebounce,
1555
+ isEphemeral: this.isEphemeral,
1556
+ isMeta: this.isMeta,
1557
+ validateInputContext: this.validateInputContext,
1558
+ validateOutputContext: this.validateOutputContext,
1559
+ inputContextSchemaId: this.inputContextSchema,
1560
+ outputContextSchemaId: this.outputContextSchema
1561
+ },
1562
+ __taskInstance: this
1563
+ });
1404
1564
  }
1405
1565
  }
1406
1566
  getTag(context) {
@@ -1610,6 +1770,12 @@ var Task = class extends SignalParticipant {
1610
1770
  this.decouple(pred);
1611
1771
  throw new Error(`Cycle adding pred ${pred.name} to ${this.name}`);
1612
1772
  }
1773
+ this.emit("meta.task.relationship_added", {
1774
+ data: {
1775
+ taskId: this.id,
1776
+ predecessorTaskId: pred.id
1777
+ }
1778
+ });
1613
1779
  }
1614
1780
  this.updateProgressWeights();
1615
1781
  return this;
@@ -1624,6 +1790,12 @@ var Task = class extends SignalParticipant {
1624
1790
  this.decouple(next);
1625
1791
  throw new Error(`Cycle adding next ${next.name} to ${this.name}`);
1626
1792
  }
1793
+ this.emit("meta.task.relationship_added", {
1794
+ data: {
1795
+ taskId: next.id,
1796
+ predecessorTaskId: this.id
1797
+ }
1798
+ });
1627
1799
  }
1628
1800
  this.updateProgressWeights();
1629
1801
  return this;
@@ -1649,6 +1821,12 @@ var Task = class extends SignalParticipant {
1649
1821
  this.decouple(task);
1650
1822
  throw new Error(`Cycle adding onFail ${task.name} to ${this.name}`);
1651
1823
  }
1824
+ this.emit("meta.task.on_fail_relationship_added", {
1825
+ data: {
1826
+ taskId: this.id,
1827
+ onFailTaskId: task.id
1828
+ }
1829
+ });
1652
1830
  }
1653
1831
  return this;
1654
1832
  }
@@ -1680,11 +1858,20 @@ var Task = class extends SignalParticipant {
1680
1858
  return layers;
1681
1859
  }
1682
1860
  updateLayerFromPredecessors() {
1861
+ const prevLayerIndex = this.layerIndex;
1683
1862
  let maxPred = 0;
1684
1863
  this.predecessorTasks.forEach(
1685
1864
  (pred) => maxPred = Math.max(maxPred, pred.layerIndex)
1686
1865
  );
1687
1866
  this.layerIndex = maxPred + 1;
1867
+ if (prevLayerIndex !== this.layerIndex) {
1868
+ this.emit("meta.task.layer_index_changed", {
1869
+ data: {
1870
+ layerIndex: this.layerIndex
1871
+ },
1872
+ filter: { uuid: this.id }
1873
+ });
1874
+ }
1688
1875
  const queue = Array.from(this.nextTasks);
1689
1876
  while (queue.length) {
1690
1877
  const next = queue.shift();
@@ -1724,7 +1911,10 @@ var Task = class extends SignalParticipant {
1724
1911
  this.predecessorTasks.clear();
1725
1912
  this.onFailTasks.clear();
1726
1913
  this.destroyed = true;
1727
- this.emit("meta.task.destroyed", { __id: this.id });
1914
+ this.emit("meta.task.destroyed", {
1915
+ data: { deleted: true },
1916
+ filter: { uuid: this.id }
1917
+ });
1728
1918
  }
1729
1919
  export() {
1730
1920
  return {
@@ -1772,10 +1962,11 @@ var GraphRegistry = class _GraphRegistry {
1772
1962
  this.registerTask = new Task(
1773
1963
  "Register task",
1774
1964
  (context) => {
1775
- const { __task } = context;
1776
- if (__task && !this.tasks.has(__task.id)) {
1777
- this.tasks.set(__task.id, __task);
1965
+ const { __taskInstance } = context;
1966
+ if (__taskInstance && !this.tasks.has(__taskInstance.id)) {
1967
+ this.tasks.set(__taskInstance.id, __taskInstance);
1778
1968
  }
1969
+ delete context.__taskInstance;
1779
1970
  return true;
1780
1971
  },
1781
1972
  "Registers tasks. Seed for meta.taskCreated",
@@ -1880,10 +2071,11 @@ var GraphRegistry = class _GraphRegistry {
1880
2071
  this.registerRoutine = Cadenza.createMetaTask(
1881
2072
  "Register routine",
1882
2073
  (context) => {
1883
- const { __routine } = context;
1884
- if (__routine && !this.routines.has(__routine.id)) {
1885
- this.routines.set(__routine.id, __routine);
2074
+ const { __routineInstance } = context;
2075
+ if (__routineInstance && !this.routines.has(__routineInstance.id)) {
2076
+ this.routines.set(__routineInstance.id, __routineInstance);
1886
2077
  }
2078
+ delete context.__routineInstance;
1887
2079
  return true;
1888
2080
  },
1889
2081
  "Registers routine."
@@ -2020,28 +2212,18 @@ var GraphRunner = class extends SignalEmitter {
2020
2212
  const ctx = new GraphContext(context || {});
2021
2213
  const routineExecId = (_a = context.__routineExecId) != null ? _a : uuid6();
2022
2214
  context.__routineExecId = routineExecId;
2023
- const data = {
2024
- __routineExecId: routineExecId,
2025
- __routineName: routineName,
2026
- __isMeta: isMeta,
2027
- __routineId: routineId,
2028
- __context: ctx.export(),
2029
- __previousRoutineExecution: (_c = (_b = context.__metaData) == null ? void 0 : _b.__routineExecId) != null ? _c : null,
2030
- __contractId: (_f = (_e = (_d = context.__metaData) == null ? void 0 : _d.__contractId) != null ? _e : context.__contractId) != null ? _f : null,
2031
- __task: {
2032
- __name: routineName
2033
- },
2034
- __scheduled: Date.now()
2035
- };
2036
- this.emit("meta.runner.added_tasks", data);
2037
- if (this.debug) {
2038
- console.log(
2039
- `${this.isMeta ? "Meta" : ""}Runner added tasks`,
2040
- allTasks.map((t) => t.name),
2041
- "with context",
2042
- ctx.getFullContext()
2043
- );
2044
- }
2215
+ this.emit("meta.runner.added_tasks", {
2216
+ data: {
2217
+ uuid: routineExecId,
2218
+ name: routineName,
2219
+ isMeta,
2220
+ contractId: (_d = (_c = (_b = context.__metaData) == null ? void 0 : _b.__contractId) != null ? _c : context.__contractId) != null ? _d : null,
2221
+ context: ctx.export(),
2222
+ previousRoutineExecution: (_f = (_e = context.__metaData) == null ? void 0 : _e.__routineExecId) != null ? _f : null,
2223
+ // TODO: There is a chance this is not added to the database yet...
2224
+ created: formatTimestamp(Date.now())
2225
+ }
2226
+ });
2045
2227
  allTasks.forEach(
2046
2228
  (task) => this.currentRun.addNode(
2047
2229
  new GraphNode(task, ctx, routineExecId, [], this.debug)
@@ -2112,7 +2294,7 @@ var GraphRunner = class extends SignalEmitter {
2112
2294
 
2113
2295
  // src/graph/definition/DebounceTask.ts
2114
2296
  var DebounceTask = class extends Task {
2115
- constructor(name, task, description = "", debounceTime = 1e3, leading = false, trailing = true, maxWait = 0, concurrency = 0, timeout = 0, register = true, isUnique = false, isMeta = false, inputSchema = void 0, validateInputSchema = false, outputSchema = void 0, validateOutputSchema = false) {
2297
+ constructor(name, task, description = "", debounceTime = 1e3, leading = false, trailing = true, maxWait = 0, concurrency = 0, timeout = 0, register = true, isUnique = false, isMeta = false, isSubMeta = false, isHidden = false, inputSchema = void 0, validateInputSchema = false, outputSchema = void 0, validateOutputSchema = false) {
2116
2298
  super(
2117
2299
  name,
2118
2300
  task,
@@ -2122,6 +2304,8 @@ var DebounceTask = class extends Task {
2122
2304
  register,
2123
2305
  isUnique,
2124
2306
  isMeta,
2307
+ isSubMeta,
2308
+ isHidden,
2125
2309
  void 0,
2126
2310
  inputSchema,
2127
2311
  validateInputSchema,
@@ -2231,7 +2415,7 @@ var DebounceTask = class extends Task {
2231
2415
 
2232
2416
  // src/graph/definition/EphemeralTask.ts
2233
2417
  var EphemeralTask = class extends Task {
2234
- constructor(name, task, description = "", once = true, condition = () => true, concurrency = 0, timeout = 0, register = false, isUnique = false, isMeta = false, getTagCallback = void 0, inputSchema = void 0, validateInputContext = false, outputSchema = void 0, validateOutputContext = false, retryCount = 0, retryDelay = 0, retryDelayMax = 0, retryDelayFactor = 1) {
2418
+ constructor(name, task, description = "", once = true, condition = () => true, concurrency = 0, timeout = 0, register = false, isUnique = false, isMeta = false, isSubMeta = false, isHidden = false, getTagCallback = void 0, inputSchema = void 0, validateInputContext = false, outputSchema = void 0, validateOutputContext = false, retryCount = 0, retryDelay = 0, retryDelayMax = 0, retryDelayFactor = 1) {
2235
2419
  super(
2236
2420
  name,
2237
2421
  task,
@@ -2241,6 +2425,8 @@ var EphemeralTask = class extends Task {
2241
2425
  register,
2242
2426
  isUnique,
2243
2427
  isMeta,
2428
+ isSubMeta,
2429
+ isHidden,
2244
2430
  getTagCallback,
2245
2431
  inputSchema,
2246
2432
  validateInputContext,
@@ -2257,7 +2443,7 @@ var EphemeralTask = class extends Task {
2257
2443
  }
2258
2444
  execute(context, emit, progressCallback) {
2259
2445
  const result = super.execute(context, emit, progressCallback);
2260
- if (this.once || !this.condition(result)) {
2446
+ if (this.once || this.condition(result)) {
2261
2447
  this.destroy();
2262
2448
  return result;
2263
2449
  }
@@ -2365,6 +2551,11 @@ var GraphLayer = class _GraphLayer extends ExecutionChain {
2365
2551
  getNodesByRoutineExecId(routineExecId) {
2366
2552
  return this.nodes.filter((node) => node.routineExecId === routineExecId);
2367
2553
  }
2554
+ getIdenticalNodes(node) {
2555
+ return this.nodes.filter(
2556
+ (n) => node.routineExecId === n.routineExecId && node.sharesTaskWith(n)
2557
+ );
2558
+ }
2368
2559
  isProcessed() {
2369
2560
  for (const node of this.nodes) {
2370
2561
  if (!node.isProcessed()) {
@@ -2838,6 +3029,8 @@ var Cadenza = class {
2838
3029
  register: true,
2839
3030
  isUnique: false,
2840
3031
  isMeta: false,
3032
+ isSubMeta: false,
3033
+ isHidden: false,
2841
3034
  getTagCallback: void 0,
2842
3035
  inputSchema: void 0,
2843
3036
  validateInputContext: false,
@@ -2859,6 +3052,8 @@ var Cadenza = class {
2859
3052
  options.register,
2860
3053
  options.isUnique,
2861
3054
  options.isMeta,
3055
+ options.isSubMeta,
3056
+ options.isHidden,
2862
3057
  options.getTagCallback,
2863
3058
  options.inputSchema,
2864
3059
  options.validateInputContext,
@@ -2886,6 +3081,8 @@ var Cadenza = class {
2886
3081
  register: true,
2887
3082
  isUnique: false,
2888
3083
  isMeta: true,
3084
+ isSubMeta: false,
3085
+ isHidden: false,
2889
3086
  getTagCallback: void 0,
2890
3087
  inputSchema: void 0,
2891
3088
  validateInputContext: false,
@@ -2915,6 +3112,8 @@ var Cadenza = class {
2915
3112
  register: true,
2916
3113
  isUnique: true,
2917
3114
  isMeta: false,
3115
+ isSubMeta: false,
3116
+ isHidden: false,
2918
3117
  getTagCallback: void 0,
2919
3118
  inputSchema: void 0,
2920
3119
  validateInputContext: false,
@@ -2942,6 +3141,8 @@ var Cadenza = class {
2942
3141
  register: true,
2943
3142
  isUnique: true,
2944
3143
  isMeta: true,
3144
+ isSubMeta: false,
3145
+ isHidden: false,
2945
3146
  getTagCallback: void 0,
2946
3147
  inputSchema: void 0,
2947
3148
  validateInputContext: false,
@@ -2971,6 +3172,8 @@ var Cadenza = class {
2971
3172
  register: true,
2972
3173
  isUnique: false,
2973
3174
  isMeta: false,
3175
+ isSubMeta: false,
3176
+ isHidden: false,
2974
3177
  inputSchema: void 0,
2975
3178
  validateInputContext: false,
2976
3179
  outputSchema: void 0,
@@ -2998,6 +3201,8 @@ var Cadenza = class {
2998
3201
  register: true,
2999
3202
  isUnique: false,
3000
3203
  isMeta: true,
3204
+ isSubMeta: false,
3205
+ isHidden: false,
3001
3206
  inputSchema: void 0,
3002
3207
  validateInputContext: false,
3003
3208
  outputSchema: void 0,
@@ -3035,6 +3240,8 @@ var Cadenza = class {
3035
3240
  maxWait: 0,
3036
3241
  isUnique: false,
3037
3242
  isMeta: false,
3243
+ isSubMeta: false,
3244
+ isHidden: false,
3038
3245
  inputSchema: void 0,
3039
3246
  validateInputContext: false,
3040
3247
  outputSchema: void 0,
@@ -3055,6 +3262,8 @@ var Cadenza = class {
3055
3262
  options.register,
3056
3263
  options.isUnique,
3057
3264
  options.isMeta,
3265
+ options.isSubMeta,
3266
+ options.isHidden,
3058
3267
  options.inputSchema,
3059
3268
  options.validateInputContext,
3060
3269
  options.outputSchema,
@@ -3079,6 +3288,8 @@ var Cadenza = class {
3079
3288
  maxWait: 0,
3080
3289
  isUnique: false,
3081
3290
  isMeta: false,
3291
+ isSubMeta: false,
3292
+ isHidden: false,
3082
3293
  inputSchema: void 0,
3083
3294
  validateInputContext: false,
3084
3295
  outputSchema: void 0,
@@ -3099,18 +3310,20 @@ var Cadenza = class {
3099
3310
  * @param name Identifier (may not be unique if not registered).
3100
3311
  * @param func Function.
3101
3312
  * @param description Optional.
3102
- * @param once Destroy after first exec (default true).
3103
- * @param destroyCondition Predicate for destruction (default always true).
3104
- * @param options Optional task options.
3313
+ * @param options Optional task options plus optional "once" (true) and "destroyCondition" (ctx => boolean).
3105
3314
  * @returns The created EphemeralTask.
3106
3315
  * @edge Destruction triggered post-exec via Node/Builder; emits meta-signal for cleanup.
3107
3316
  */
3108
- static createEphemeralTask(name, func, description, once = true, destroyCondition = () => true, options = {
3317
+ static createEphemeralTask(name, func, description, options = {
3109
3318
  concurrency: 0,
3110
3319
  timeout: 0,
3111
3320
  register: true,
3112
3321
  isUnique: false,
3113
3322
  isMeta: false,
3323
+ isSubMeta: false,
3324
+ isHidden: false,
3325
+ once: true,
3326
+ destroyCondition: () => true,
3114
3327
  getTagCallback: void 0,
3115
3328
  inputSchema: void 0,
3116
3329
  validateInputContext: false,
@@ -3127,13 +3340,15 @@ var Cadenza = class {
3127
3340
  name,
3128
3341
  func,
3129
3342
  description,
3130
- once,
3131
- destroyCondition,
3343
+ options.once,
3344
+ options.destroyCondition,
3132
3345
  options.concurrency,
3133
3346
  options.timeout,
3134
3347
  options.register,
3135
3348
  options.isUnique,
3136
3349
  options.isMeta,
3350
+ options.isSubMeta,
3351
+ options.isHidden,
3137
3352
  options.getTagCallback,
3138
3353
  options.inputSchema,
3139
3354
  options.validateInputContext,
@@ -3150,17 +3365,19 @@ var Cadenza = class {
3150
3365
  * @param name Identifier.
3151
3366
  * @param func Function.
3152
3367
  * @param description Optional.
3153
- * @param once Destroy after first (default true).
3154
- * @param destroyCondition Destruction predicate.
3155
- * @param options Optional task options.
3368
+ * @param options Optional task options plus optional "once" (true) and "destroyCondition" (ctx => boolean).
3156
3369
  * @returns The created EphemeralMetaTask.
3157
3370
  */
3158
- static createEphemeralMetaTask(name, func, description, once = true, destroyCondition = () => true, options = {
3371
+ static createEphemeralMetaTask(name, func, description, options = {
3159
3372
  concurrency: 0,
3160
3373
  timeout: 0,
3161
3374
  register: true,
3162
3375
  isUnique: false,
3163
3376
  isMeta: true,
3377
+ isSubMeta: false,
3378
+ isHidden: false,
3379
+ once: true,
3380
+ destroyCondition: () => true,
3164
3381
  getTagCallback: void 0,
3165
3382
  inputSchema: void 0,
3166
3383
  validateInputContext: false,
@@ -3172,14 +3389,7 @@ var Cadenza = class {
3172
3389
  retryDelayFactor: 1
3173
3390
  }) {
3174
3391
  options.isMeta = true;
3175
- return this.createEphemeralTask(
3176
- name,
3177
- func,
3178
- description,
3179
- once,
3180
- destroyCondition,
3181
- options
3182
- );
3392
+ return this.createEphemeralTask(name, func, description, options);
3183
3393
  }
3184
3394
  /**
3185
3395
  * Creates a GraphRoutine (named entry to starting tasks) and registers it.
@@ -3216,6 +3426,7 @@ var Cadenza = class {
3216
3426
  var _a, _b;
3217
3427
  (_a = this.broker) == null ? void 0 : _a.reset();
3218
3428
  (_b = this.registry) == null ? void 0 : _b.reset();
3429
+ this.isBootstrapped = false;
3219
3430
  }
3220
3431
  };
3221
3432
  Cadenza.isBootstrapped = false;