@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 +9 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.js +70 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +70 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +14 -3
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.
|
|
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.
|
|
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 =
|
|
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.
|
|
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 {
|