@cadenza.io/core 1.5.1 → 1.7.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.d.mts CHANGED
@@ -382,6 +382,7 @@ type SchemaDefinition = {
382
382
  items?: SchemaDefinition;
383
383
  constraints?: SchemaConstraints;
384
384
  description?: string;
385
+ strict?: boolean;
385
386
  };
386
387
 
387
388
  type TaskFunction = (context: AnyObject, progressCallback: (progress: number) => void) => TaskResult;
@@ -604,6 +605,9 @@ declare class SignalBroker {
604
605
  * @returns The broker instance.
605
606
  */
606
607
  static get instance(): SignalBroker;
608
+ private debug;
609
+ setDebug(value: boolean): void;
610
+ protected sanitizeSignalName(signalName: string): void;
607
611
  protected runner: GraphRunner | undefined;
608
612
  protected metaRunner: GraphRunner | undefined;
609
613
  getSignalsTask: Task | undefined;
@@ -651,7 +655,6 @@ declare class SignalBroker {
651
655
  * @returns Array of signals.
652
656
  */
653
657
  listObservedSignals(): string[];
654
- private getRunner;
655
658
  reset(): void;
656
659
  }
657
660
 
@@ -662,6 +665,8 @@ declare class GraphRegistry {
662
665
  private routines;
663
666
  registerTask: Task;
664
667
  updateTaskId: Task;
668
+ updateTaskInputSchema: Task;
669
+ updateTaskOutputSchema: Task;
665
670
  getTaskById: Task;
666
671
  getTaskByName: Task;
667
672
  getTasksByLayer: Task;
@@ -730,17 +735,20 @@ interface TaskOptions {
730
735
  outputSchema?: SchemaDefinition;
731
736
  validateOutputContext?: boolean;
732
737
  }
738
+ type CadenzaMode = "dev" | "debug" | "production";
733
739
  declare class Cadenza {
734
740
  static broker: SignalBroker;
735
741
  static runner: GraphRunner;
736
742
  static metaRunner: GraphRunner;
737
743
  static registry: GraphRegistry;
738
744
  protected static isBootstrapped: boolean;
745
+ protected static mode: CadenzaMode;
739
746
  protected static bootstrap(): void;
740
747
  static get runStrategy(): {
741
748
  PARALLEL: GraphAsyncRun;
742
749
  SEQUENTIAL: GraphStandardRun;
743
750
  };
751
+ static setMode(mode: CadenzaMode): void;
744
752
  /**
745
753
  * Validates a name for uniqueness and non-emptiness.
746
754
  * @param name The name to validate.
package/dist/index.d.ts CHANGED
@@ -382,6 +382,7 @@ type SchemaDefinition = {
382
382
  items?: SchemaDefinition;
383
383
  constraints?: SchemaConstraints;
384
384
  description?: string;
385
+ strict?: boolean;
385
386
  };
386
387
 
387
388
  type TaskFunction = (context: AnyObject, progressCallback: (progress: number) => void) => TaskResult;
@@ -604,6 +605,9 @@ declare class SignalBroker {
604
605
  * @returns The broker instance.
605
606
  */
606
607
  static get instance(): SignalBroker;
608
+ private debug;
609
+ setDebug(value: boolean): void;
610
+ protected sanitizeSignalName(signalName: string): void;
607
611
  protected runner: GraphRunner | undefined;
608
612
  protected metaRunner: GraphRunner | undefined;
609
613
  getSignalsTask: Task | undefined;
@@ -651,7 +655,6 @@ declare class SignalBroker {
651
655
  * @returns Array of signals.
652
656
  */
653
657
  listObservedSignals(): string[];
654
- private getRunner;
655
658
  reset(): void;
656
659
  }
657
660
 
@@ -662,6 +665,8 @@ declare class GraphRegistry {
662
665
  private routines;
663
666
  registerTask: Task;
664
667
  updateTaskId: Task;
668
+ updateTaskInputSchema: Task;
669
+ updateTaskOutputSchema: Task;
665
670
  getTaskById: Task;
666
671
  getTaskByName: Task;
667
672
  getTasksByLayer: Task;
@@ -730,17 +735,20 @@ interface TaskOptions {
730
735
  outputSchema?: SchemaDefinition;
731
736
  validateOutputContext?: boolean;
732
737
  }
738
+ type CadenzaMode = "dev" | "debug" | "production";
733
739
  declare class Cadenza {
734
740
  static broker: SignalBroker;
735
741
  static runner: GraphRunner;
736
742
  static metaRunner: GraphRunner;
737
743
  static registry: GraphRegistry;
738
744
  protected static isBootstrapped: boolean;
745
+ protected static mode: CadenzaMode;
739
746
  protected static bootstrap(): void;
740
747
  static get runStrategy(): {
741
748
  PARALLEL: GraphAsyncRun;
742
749
  SEQUENTIAL: GraphStandardRun;
743
750
  };
751
+ static setMode(mode: CadenzaMode): void;
744
752
  /**
745
753
  * Validates a name for uniqueness and non-emptiness.
746
754
  * @param name The name to validate.
package/dist/index.js CHANGED
@@ -38,9 +38,10 @@ module.exports = __toCommonJS(index_exports);
38
38
  var SignalBroker = class _SignalBroker {
39
39
  // execId -> emitted signals
40
40
  constructor() {
41
+ this.debug = false;
41
42
  this.signalObservers = /* @__PURE__ */ new Map();
42
43
  this.emitStacks = /* @__PURE__ */ new Map();
43
- this.addSignal("meta.signal.added");
44
+ this.addSignal("meta.signal_broker.added");
44
45
  }
45
46
  /**
46
47
  * Singleton instance for signal management.
@@ -52,6 +53,28 @@ var SignalBroker = class _SignalBroker {
52
53
  }
53
54
  return this.instance_;
54
55
  }
56
+ setDebug(value) {
57
+ this.debug = value;
58
+ }
59
+ sanitizeSignalName(signalName) {
60
+ if (signalName.length > 100) {
61
+ throw new Error("Signal name must be less than 100 characters");
62
+ }
63
+ if (signalName.includes(" ")) {
64
+ throw new Error("Signal name must not contain spaces");
65
+ }
66
+ if (signalName.includes("/")) {
67
+ throw new Error("Signal name must not contain slashes");
68
+ }
69
+ if (signalName.includes("\\")) {
70
+ throw new Error("Signal name must not contain backslashes");
71
+ }
72
+ if (/[A-Z]/.test(signalName.split(".").slice(1).join("."))) {
73
+ throw new Error(
74
+ "Signal name must not contain uppercase letters in the middle of the signal name. It is only allowed in the first part of the signal name."
75
+ );
76
+ }
77
+ }
55
78
  /**
56
79
  * Initializes with runners.
57
80
  * @param runner Standard runner for user signals.
@@ -117,7 +140,7 @@ var SignalBroker = class _SignalBroker {
117
140
  * @throws Error on detected loop.
118
141
  */
119
142
  emit(signal, context = {}) {
120
- const execId = context.__graphExecId || "global";
143
+ const execId = context.__routineExecId || "global";
121
144
  if (!this.emitStacks.has(execId)) this.emitStacks.set(execId, /* @__PURE__ */ new Map());
122
145
  const stack = this.emitStacks.get(execId);
123
146
  stack.set(signal, context);
@@ -140,20 +163,26 @@ var SignalBroker = class _SignalBroker {
140
163
  }
141
164
  executeListener(signal, context) {
142
165
  const obs = this.signalObservers.get(signal);
143
- const runner = this.getRunner(signal);
166
+ const runner = signal.startsWith("meta") ? this.metaRunner : this.runner;
144
167
  if (obs && obs.tasks.size && runner) {
145
168
  obs.fn(runner, Array.from(obs.tasks), context);
169
+ if (this.debug) {
170
+ console.log(
171
+ `Emitted signal ${signal} with context ${JSON.stringify(context)}`
172
+ );
173
+ }
146
174
  return true;
147
175
  }
148
176
  return false;
149
177
  }
150
178
  addSignal(signal) {
151
179
  if (!this.signalObservers.has(signal)) {
180
+ this.sanitizeSignalName(signal);
152
181
  this.signalObservers.set(signal, {
153
182
  fn: (runner, tasks, context) => runner.run(tasks, context),
154
183
  tasks: /* @__PURE__ */ new Set()
155
184
  });
156
- this.emit("meta.signal.added", { __signal: signal });
185
+ this.emit("meta.signal_broker.added", { __signalName: signal });
157
186
  }
158
187
  }
159
188
  /**
@@ -163,9 +192,6 @@ var SignalBroker = class _SignalBroker {
163
192
  listObservedSignals() {
164
193
  return Array.from(this.signalObservers.keys());
165
194
  }
166
- getRunner(signal) {
167
- return signal.startsWith("meta") ? this.metaRunner : this.runner;
168
- }
169
195
  reset() {
170
196
  this.emitStacks.clear();
171
197
  this.signalObservers.clear();
@@ -1369,6 +1395,8 @@ var Task = class extends SignalParticipant {
1369
1395
  } else if (constraints.oneOf && !constraints.oneOf.includes(value)) {
1370
1396
  errors[`${path}.${key}`] = `Value '${value}' for '${key}' not in oneOf ${JSON.stringify(constraints.oneOf)}`;
1371
1397
  }
1398
+ } else if (schema.strict) {
1399
+ errors[`${path}.${key}`] = `Key '${key}' is not allowed`;
1372
1400
  }
1373
1401
  }
1374
1402
  if (Object.keys(errors).length > 0) {
@@ -1628,6 +1656,28 @@ var GraphRegistry = class _GraphRegistry {
1628
1656
  },
1629
1657
  "Updates task id."
1630
1658
  ).doOn("meta.task.global_id_set");
1659
+ this.updateTaskInputSchema = Cadenza.createMetaTask(
1660
+ "Update task input schema",
1661
+ (context) => {
1662
+ const { __id, __schema } = context;
1663
+ const task = this.tasks.get(__id);
1664
+ if (!task) return true;
1665
+ task.setInputContextSchema(__schema);
1666
+ return true;
1667
+ },
1668
+ "Updates task input schema."
1669
+ ).doOn("meta.task.input_schema_updated");
1670
+ this.updateTaskOutputSchema = Cadenza.createMetaTask(
1671
+ "Update task input schema",
1672
+ (context) => {
1673
+ const { __id, __schema } = context;
1674
+ const task = this.tasks.get(__id);
1675
+ if (!task) return true;
1676
+ task.setOutputContextSchema(__schema);
1677
+ return true;
1678
+ },
1679
+ "Updates task input schema."
1680
+ ).doOn("meta.task.output_schema_updated");
1631
1681
  this.getTaskById = Cadenza.createMetaTask(
1632
1682
  "Get task by id",
1633
1683
  (context) => {
@@ -1827,6 +1877,7 @@ var GraphRunner = class extends SignalEmitter {
1827
1877
  });
1828
1878
  const ctx = new GraphContext(context || {});
1829
1879
  const routineExecId = (_a = context.__routineExecId) != null ? _a : (0, import_uuid6.v4)();
1880
+ context.__routineExecId = routineExecId;
1830
1881
  const data = {
1831
1882
  __routineExecId: routineExecId,
1832
1883
  __routineName: routineName,
@@ -1841,6 +1892,11 @@ var GraphRunner = class extends SignalEmitter {
1841
1892
  __scheduled: Date.now()
1842
1893
  };
1843
1894
  this.emit("meta.runner.added_tasks", data);
1895
+ if (this.debug) {
1896
+ console.log(
1897
+ `Running routine ${routineName} with context ${JSON.stringify(ctx.getContext())}`
1898
+ );
1899
+ }
1844
1900
  allTasks.forEach(
1845
1901
  (task) => this.currentRun.addNode(new GraphNode(task, ctx, routineExecId))
1846
1902
  );
@@ -2554,6 +2610,12 @@ var Cadenza = class {
2554
2610
  SEQUENTIAL: new GraphStandardRun()
2555
2611
  };
2556
2612
  }
2613
+ static setMode(mode) {
2614
+ this.mode = mode;
2615
+ if (mode === "debug" || mode === "dev") {
2616
+ this.broker.setDebug(true);
2617
+ }
2618
+ }
2557
2619
  /**
2558
2620
  * Validates a name for uniqueness and non-emptiness.
2559
2621
  * @param name The name to validate.
@@ -2917,6 +2979,7 @@ var Cadenza = class {
2917
2979
  }
2918
2980
  };
2919
2981
  Cadenza.isBootstrapped = false;
2982
+ Cadenza.mode = "production";
2920
2983
 
2921
2984
  // src/graph/definition/SignalTask.ts
2922
2985
  var SignalTask = class extends Task {