@cadenza.io/core 2.0.0 → 3.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.
package/dist/index.js CHANGED
@@ -29,7 +29,6 @@ __export(index_exports, {
29
29
  GraphRunner: () => GraphRunner,
30
30
  SignalBroker: () => SignalBroker,
31
31
  SignalEmitter: () => SignalEmitter,
32
- SignalParticipant: () => SignalParticipant,
33
32
  SignalTask: () => SignalTask,
34
33
  Task: () => Task,
35
34
  default: () => index_default
@@ -140,7 +139,7 @@ var SignalBroker = class _SignalBroker {
140
139
  return true;
141
140
  },
142
141
  "Executes queued signals and clears the stack"
143
- ).doOn("meta.process_signal_queue_requested").emitsAfter("meta.signal_broker.queue_empty");
142
+ ).doOn("meta.process_signal_queue_requested").emits("meta.signal_broker.queue_empty");
144
143
  this.getSignalsTask = Cadenza.createMetaTask("Get signals", (ctx) => {
145
144
  return {
146
145
  __signals: Array.from(this.signalObservers.keys()),
@@ -365,10 +364,10 @@ var VueFlowExportVisitor = class {
365
364
  }
366
365
  visitNode(node) {
367
366
  const snapshot = node.export();
368
- if (!this.contextToColor[snapshot.__context.__id]) {
369
- this.contextToColor[snapshot.__context.__id] = this.colorRandomizer.getRandomColor();
367
+ if (!this.contextToColor[snapshot.__context.id]) {
368
+ this.contextToColor[snapshot.__context.id] = this.colorRandomizer.getRandomColor();
370
369
  }
371
- const color = this.contextToColor[snapshot.__context.__id];
370
+ const color = this.contextToColor[snapshot.__context.id];
372
371
  this.elements.push({
373
372
  id: snapshot.__id.slice(0, 8),
374
373
  label: snapshot.__task.__name,
@@ -385,7 +384,7 @@ var VueFlowExportVisitor = class {
385
384
  executionEnd: snapshot.__executionEnd,
386
385
  description: snapshot.__task.__description,
387
386
  functionString: snapshot.__task.__functionString,
388
- context: snapshot.__context.__context,
387
+ context: snapshot.__context.context,
389
388
  layerIndex: snapshot.__task.__layerIndex
390
389
  }
391
390
  });
@@ -619,8 +618,8 @@ var GraphContext = class _GraphContext {
619
618
  */
620
619
  export() {
621
620
  return {
622
- __id: this.id,
623
- __context: this.getFullContext()
621
+ id: this.id,
622
+ context: this.getFullContext()
624
623
  };
625
624
  }
626
625
  };
@@ -768,7 +767,7 @@ var GraphNode = class _GraphNode extends SignalEmitter {
768
767
  return this.task.getTag(this.context);
769
768
  }
770
769
  scheduleOn(layer) {
771
- var _a;
770
+ var _a, _b, _c;
772
771
  let shouldSchedule = true;
773
772
  const nodes = layer.getNodesByRoutineExecId(this.routineExecId);
774
773
  for (const node of nodes) {
@@ -791,7 +790,7 @@ var GraphNode = class _GraphNode extends SignalEmitter {
791
790
  data: {
792
791
  uuid: this.id,
793
792
  routineExecutionId: this.routineExecId,
794
- contractId: context.__contractId,
793
+ executionTraceId: (_b = context.__executionTraceId) != null ? _b : (_a = context.__metadata) == null ? void 0 : _a.__executionTraceId,
795
794
  context: this.context.export(),
796
795
  taskName: this.task.name,
797
796
  taskVersion: this.task.version,
@@ -816,7 +815,7 @@ var GraphNode = class _GraphNode extends SignalEmitter {
816
815
  }
817
816
  });
818
817
  });
819
- if (((_a = context.__signalEmission) == null ? void 0 : _a.consumed) === false && (!this.isMeta() || this.debug)) {
818
+ if (((_c = context.__signalEmission) == null ? void 0 : _c.consumed) === false && (!this.isMeta() || this.debug)) {
820
819
  this.emitMetricsWithMetadata("meta.node.consumed_signal", {
821
820
  data: {
822
821
  signalName: context.__signalEmission.signalName,
@@ -1338,139 +1337,21 @@ var GraphNode = class _GraphNode extends SignalEmitter {
1338
1337
  }
1339
1338
  };
1340
1339
 
1341
- // src/interfaces/SignalParticipant.ts
1342
- var SignalParticipant = class extends SignalEmitter {
1343
- constructor() {
1344
- super(...arguments);
1345
- this.emitsSignals = /* @__PURE__ */ new Set();
1346
- this.signalsToEmitAfter = /* @__PURE__ */ new Set();
1347
- this.signalsToEmitOnFail = /* @__PURE__ */ new Set();
1348
- this.observedSignals = /* @__PURE__ */ new Set();
1349
- }
1350
- /**
1351
- * Subscribes to signals (chainable).
1352
- * @param signals The signal names.
1353
- * @returns This for chaining.
1354
- * @edge Duplicates ignored; assumes broker.observe binds this as handler.
1355
- */
1356
- doOn(...signals) {
1357
- signals.forEach((signal) => {
1358
- if (this.observedSignals.has(signal)) return;
1359
- Cadenza.broker.observe(signal, this);
1360
- this.observedSignals.add(signal);
1361
- });
1362
- return this;
1363
- }
1364
- /**
1365
- * Sets signals to emit post-execution (chainable).
1366
- * @param signals The signal names.
1367
- * @returns This for chaining.
1368
- */
1369
- emitsAfter(...signals) {
1370
- signals.forEach((signal) => {
1371
- this.signalsToEmitAfter.add(signal);
1372
- this.emitsSignals.add(signal);
1373
- });
1374
- return this;
1375
- }
1376
- emitsOnFail(...signals) {
1377
- signals.forEach((signal) => {
1378
- this.signalsToEmitOnFail.add(signal);
1379
- this.emitsSignals.add(signal);
1380
- });
1381
- return this;
1382
- }
1383
- /**
1384
- * Unsubscribes from all observed signals.
1385
- * @returns This for chaining.
1386
- */
1387
- unsubscribeAll() {
1388
- this.observedSignals.forEach(
1389
- (signal) => Cadenza.broker.unsubscribe(signal, this)
1390
- );
1391
- this.observedSignals.clear();
1392
- return this;
1393
- }
1394
- /**
1395
- * Unsubscribes from specific signals.
1396
- * @param signals The signals.
1397
- * @returns This for chaining.
1398
- * @edge No-op if not subscribed.
1399
- */
1400
- unsubscribe(...signals) {
1401
- signals.forEach((signal) => {
1402
- if (this.observedSignals.has(signal)) {
1403
- Cadenza.broker.unsubscribe(signal, this);
1404
- this.observedSignals.delete(signal);
1405
- }
1406
- });
1407
- return this;
1408
- }
1409
- /**
1410
- * Detaches specific emitted signals.
1411
- * @param signals The signals.
1412
- * @returns This for chaining.
1413
- */
1414
- detachSignals(...signals) {
1415
- signals.forEach((signal) => this.signalsToEmitAfter.delete(signal));
1416
- return this;
1417
- }
1418
- /**
1419
- * Detaches all emitted signals.
1420
- * @returns This for chaining.
1421
- */
1422
- detachAllSignals() {
1423
- this.signalsToEmitAfter.clear();
1424
- return this;
1425
- }
1426
- mapSignals(callback) {
1427
- return Array.from(this.signalsToEmitAfter).map(callback);
1428
- }
1429
- mapOnFailSignals(callback) {
1430
- return Array.from(this.signalsToEmitOnFail).map(callback);
1431
- }
1432
- /**
1433
- * Emits attached signals.
1434
- * @param context The context for emission.
1435
- * @edge If isMeta (from Task), suppresses further "meta.*" to prevent loops.
1436
- */
1437
- emitSignals(context) {
1438
- this.signalsToEmitAfter.forEach((signal) => {
1439
- this.emit(signal, context.getFullContext());
1440
- });
1441
- }
1442
- /**
1443
- * Emits attached fail signals.
1444
- * @param context The context for emission.
1445
- * @edge If isMeta (from Task), suppresses further "meta.*" to prevent loops.
1446
- */
1447
- emitOnFailSignals(context) {
1448
- this.signalsToEmitOnFail.forEach((signal) => {
1449
- this.emit(signal, context.getFullContext());
1450
- });
1451
- }
1452
- /**
1453
- * Destroys the participant (unsub/detach).
1454
- */
1455
- destroy() {
1456
- this.unsubscribeAll();
1457
- this.detachAllSignals();
1458
- }
1459
- };
1460
-
1461
1340
  // src/graph/definition/GraphRoutine.ts
1462
- var GraphRoutine = class extends SignalParticipant {
1341
+ var GraphRoutine = class extends SignalEmitter {
1463
1342
  constructor(name, tasks, description, isMeta = false) {
1464
1343
  super();
1465
1344
  this.version = 1;
1466
1345
  this.isMeta = false;
1467
1346
  this.tasks = /* @__PURE__ */ new Set();
1347
+ this.observedSignals = /* @__PURE__ */ new Set();
1468
1348
  this.name = name;
1469
1349
  this.description = description;
1470
1350
  this.isMeta = isMeta;
1471
1351
  this.emit("meta.routine.created", {
1472
1352
  data: {
1473
1353
  name: this.name,
1354
+ version: this.version,
1474
1355
  description: this.description,
1475
1356
  isMeta: this.isMeta
1476
1357
  },
@@ -1509,11 +1390,51 @@ var GraphRoutine = class extends SignalParticipant {
1509
1390
  this.version = version;
1510
1391
  this.emit("meta.routine.global_version_set", { version: this.version });
1511
1392
  }
1512
- // Removed emitsSignals per clarification (routines as listeners only)
1393
+ /**
1394
+ * Subscribes to signals (chainable).
1395
+ * @param signals The signal names.
1396
+ * @returns This for chaining.
1397
+ * @edge Duplicates ignored; assumes broker.observe binds this as handler.
1398
+ */
1399
+ doOn(...signals) {
1400
+ signals.forEach((signal) => {
1401
+ if (this.observedSignals.has(signal)) return;
1402
+ Cadenza.broker.observe(signal, this);
1403
+ this.observedSignals.add(signal);
1404
+ });
1405
+ return this;
1406
+ }
1407
+ /**
1408
+ * Unsubscribes from all observed signals.
1409
+ * @returns This for chaining.
1410
+ */
1411
+ unsubscribeAll() {
1412
+ this.observedSignals.forEach(
1413
+ (signal) => Cadenza.broker.unsubscribe(signal, this)
1414
+ );
1415
+ this.observedSignals.clear();
1416
+ return this;
1417
+ }
1418
+ /**
1419
+ * Unsubscribes from specific signals.
1420
+ * @param signals The signals.
1421
+ * @returns This for chaining.
1422
+ * @edge No-op if not subscribed.
1423
+ */
1424
+ unsubscribe(...signals) {
1425
+ signals.forEach((signal) => {
1426
+ if (this.observedSignals.has(signal)) {
1427
+ Cadenza.broker.unsubscribe(signal, this);
1428
+ this.observedSignals.delete(signal);
1429
+ }
1430
+ });
1431
+ return this;
1432
+ }
1513
1433
  /**
1514
1434
  * Destroys the routine.
1515
1435
  */
1516
1436
  destroy() {
1437
+ this.unsubscribeAll();
1517
1438
  this.tasks.clear();
1518
1439
  this.emit("meta.routine.destroyed", {
1519
1440
  data: { deleted: true },
@@ -1554,7 +1475,7 @@ var TaskIterator = class {
1554
1475
  };
1555
1476
 
1556
1477
  // src/graph/definition/Task.ts
1557
- var Task = class extends SignalParticipant {
1478
+ var Task = class extends SignalEmitter {
1558
1479
  /**
1559
1480
  * Constructs a Task (static definition).
1560
1481
  * @param name Name.
@@ -1604,6 +1525,10 @@ var Task = class extends SignalParticipant {
1604
1525
  this.onFailTasks = /* @__PURE__ */ new Set();
1605
1526
  this.predecessorTasks = /* @__PURE__ */ new Set();
1606
1527
  this.destroyed = false;
1528
+ this.emitsSignals = /* @__PURE__ */ new Set();
1529
+ this.signalsToEmitAfter = /* @__PURE__ */ new Set();
1530
+ this.signalsToEmitOnFail = /* @__PURE__ */ new Set();
1531
+ this.observedSignals = /* @__PURE__ */ new Set();
1607
1532
  this.name = name;
1608
1533
  this.taskFunction = task.bind(this);
1609
1534
  this.description = description;
@@ -1628,8 +1553,9 @@ var Task = class extends SignalParticipant {
1628
1553
  if (register && !this.isHidden && !this.isSubMeta) {
1629
1554
  const { __functionString, __getTagCallback } = this.export();
1630
1555
  this.emitWithMetadata("meta.task.created", {
1631
- __task: {
1556
+ data: {
1632
1557
  name: this.name,
1558
+ version: this.version,
1633
1559
  description: this.description,
1634
1560
  functionString: __functionString,
1635
1561
  tagIdGetter: __getTagCallback,
@@ -1648,8 +1574,8 @@ var Task = class extends SignalParticipant {
1648
1574
  isMeta: this.isMeta,
1649
1575
  validateInputContext: this.validateInputContext,
1650
1576
  validateOutputContext: this.validateOutputContext,
1651
- inputContextSchemaId: this.inputContextSchema,
1652
- outputContextSchemaId: this.outputContextSchema
1577
+ inputContextSchema: this.inputContextSchema,
1578
+ outputContextSchema: this.outputContextSchema
1653
1579
  },
1654
1580
  __taskInstance: this
1655
1581
  });
@@ -2002,8 +1928,165 @@ var Task = class extends SignalParticipant {
2002
1928
  mapPrevious(callback) {
2003
1929
  return Array.from(this.predecessorTasks).map(callback);
2004
1930
  }
1931
+ /**
1932
+ * Subscribes to signals (chainable).
1933
+ * @param signals The signal names.
1934
+ * @returns This for chaining.
1935
+ * @edge Duplicates ignored; assumes broker.observe binds this as handler.
1936
+ */
1937
+ doOn(...signals) {
1938
+ signals.forEach((signal) => {
1939
+ if (this.observedSignals.has(signal)) return;
1940
+ Cadenza.broker.observe(signal, this);
1941
+ this.observedSignals.add(signal);
1942
+ this.emitWithMetadata("meta.task.observed_signal", {
1943
+ data: {
1944
+ signalName: signal,
1945
+ taskName: this.name,
1946
+ taskVersion: this.version
1947
+ }
1948
+ });
1949
+ });
1950
+ return this;
1951
+ }
1952
+ /**
1953
+ * Sets signals to emit post-execution (chainable).
1954
+ * @param signals The signal names.
1955
+ * @returns This for chaining.
1956
+ */
1957
+ emits(...signals) {
1958
+ signals.forEach((signal) => {
1959
+ this.signalsToEmitAfter.add(signal);
1960
+ this.emitsSignals.add(signal);
1961
+ this.emitWithMetadata("meta.task.attached_signal", {
1962
+ data: {
1963
+ signalName: signal,
1964
+ taskName: this.name,
1965
+ taskVersion: this.version
1966
+ }
1967
+ });
1968
+ });
1969
+ return this;
1970
+ }
1971
+ emitsOnFail(...signals) {
1972
+ signals.forEach((signal) => {
1973
+ this.signalsToEmitOnFail.add(signal);
1974
+ this.emitsSignals.add(signal);
1975
+ this.emitWithMetadata("meta.task.attached_signal", {
1976
+ data: {
1977
+ signalName: signal,
1978
+ taskName: this.name,
1979
+ taskVersion: this.version,
1980
+ isOnFail: true
1981
+ }
1982
+ });
1983
+ });
1984
+ return this;
1985
+ }
1986
+ /**
1987
+ * Unsubscribes from all observed signals.
1988
+ * @returns This for chaining.
1989
+ */
1990
+ unsubscribeAll() {
1991
+ this.observedSignals.forEach((signal) => {
1992
+ Cadenza.broker.unsubscribe(signal, this);
1993
+ this.emitWithMetadata("meta.task.unsubscribed_signal", {
1994
+ filter: {
1995
+ signalName: signal,
1996
+ taskName: this.name,
1997
+ taskVersion: this.version
1998
+ }
1999
+ });
2000
+ });
2001
+ this.observedSignals.clear();
2002
+ return this;
2003
+ }
2004
+ /**
2005
+ * Unsubscribes from specific signals.
2006
+ * @param signals The signals.
2007
+ * @returns This for chaining.
2008
+ * @edge No-op if not subscribed.
2009
+ */
2010
+ unsubscribe(...signals) {
2011
+ signals.forEach((signal) => {
2012
+ if (this.observedSignals.has(signal)) {
2013
+ Cadenza.broker.unsubscribe(signal, this);
2014
+ this.observedSignals.delete(signal);
2015
+ this.emitWithMetadata("meta.task.unsubscribed_signal", {
2016
+ filter: {
2017
+ signalName: signal,
2018
+ taskName: this.name,
2019
+ taskVersion: this.version
2020
+ }
2021
+ });
2022
+ }
2023
+ });
2024
+ return this;
2025
+ }
2026
+ /**
2027
+ * Detaches specific emitted signals.
2028
+ * @param signals The signals.
2029
+ * @returns This for chaining.
2030
+ */
2031
+ detachSignals(...signals) {
2032
+ signals.forEach((signal) => {
2033
+ this.signalsToEmitAfter.delete(signal);
2034
+ this.emitWithMetadata("meta.task.detached_signal", {
2035
+ filter: {
2036
+ signalName: signal,
2037
+ taskName: this.name,
2038
+ taskVersion: this.version
2039
+ }
2040
+ });
2041
+ });
2042
+ return this;
2043
+ }
2044
+ /**
2045
+ * Detaches all emitted signals.
2046
+ * @returns This for chaining.
2047
+ */
2048
+ detachAllSignals() {
2049
+ this.signalsToEmitAfter.forEach((signal) => {
2050
+ this.emitWithMetadata("meta.task.detached_signal", {
2051
+ filter: {
2052
+ signalName: signal,
2053
+ taskName: this.name,
2054
+ taskVersion: this.version
2055
+ }
2056
+ });
2057
+ });
2058
+ this.signalsToEmitAfter.clear();
2059
+ return this;
2060
+ }
2061
+ mapSignals(callback) {
2062
+ return Array.from(this.signalsToEmitAfter).map(callback);
2063
+ }
2064
+ mapOnFailSignals(callback) {
2065
+ return Array.from(this.signalsToEmitOnFail).map(callback);
2066
+ }
2067
+ /**
2068
+ * Emits attached signals.
2069
+ * @param context The context for emission.
2070
+ * @edge If isMeta (from Task), suppresses further "meta.*" to prevent loops.
2071
+ */
2072
+ emitSignals(context) {
2073
+ this.signalsToEmitAfter.forEach((signal) => {
2074
+ this.emit(signal, context.getFullContext());
2075
+ });
2076
+ }
2077
+ /**
2078
+ * Emits attached fail signals.
2079
+ * @param context The context for emission.
2080
+ * @edge If isMeta (from Task), suppresses further "meta.*" to prevent loops.
2081
+ */
2082
+ emitOnFailSignals(context) {
2083
+ this.signalsToEmitOnFail.forEach((signal) => {
2084
+ this.emit(signal, context.getFullContext());
2085
+ });
2086
+ }
2005
2087
  destroy() {
2006
- super.destroy();
2088
+ this.unsubscribeAll();
2089
+ this.detachAllSignals();
2007
2090
  this.predecessorTasks.forEach((pred) => pred.nextTasks.delete(this));
2008
2091
  this.nextTasks.forEach((next) => next.predecessorTasks.delete(this));
2009
2092
  this.onFailTasks.forEach((fail) => fail.predecessorTasks.delete(this));
@@ -2074,7 +2157,7 @@ var GraphRegistry = class _GraphRegistry {
2074
2157
  true,
2075
2158
  false,
2076
2159
  true
2077
- ).doOn("meta.task.created");
2160
+ ).doOn("meta.task.created").emits("meta.graph_registry.task_registered");
2078
2161
  this.tasks.set(this.registerTask.name, this.registerTask);
2079
2162
  this.updateTaskInputSchema = Cadenza.createMetaTask(
2080
2163
  "Update task input schema",
@@ -2247,7 +2330,7 @@ var GraphRunner = class extends SignalEmitter {
2247
2330
  * @edge Empty tasks warns no-op.
2248
2331
  */
2249
2332
  addTasks(tasks, context = {}) {
2250
- var _a, _b, _c, _d, _e, _f;
2333
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
2251
2334
  let _tasks = Array.isArray(tasks) ? tasks : [tasks];
2252
2335
  if (_tasks.length === 0) {
2253
2336
  console.warn("No tasks/routines to add.");
@@ -2270,18 +2353,35 @@ var GraphRunner = class extends SignalEmitter {
2270
2353
  const isSubMeta = allTasks.some((t) => t.isSubMeta) || !!context.__isSubMeta;
2271
2354
  context.__isSubMeta = isSubMeta;
2272
2355
  const ctx = new GraphContext(context || {});
2356
+ const isNewTrace = !!context.__routineExecId;
2273
2357
  const routineExecId = (_a = context.__routineExecId) != null ? _a : (0, import_uuid4.v4)();
2274
2358
  context.__routineExecId = routineExecId;
2275
2359
  if (!isSubMeta) {
2360
+ const executionTraceId = (_d = (_c = (_b = context.__metadata) == null ? void 0 : _b.__executionTraceId) != null ? _c : context.__executionTraceId) != null ? _d : (0, import_uuid4.v4)();
2361
+ const contextData = ctx.export();
2362
+ if (isNewTrace) {
2363
+ this.emitMetrics("meta.runner.new_trace", {
2364
+ data: {
2365
+ uuid: executionTraceId,
2366
+ issuer_type: "service",
2367
+ // TODO: Add issuer type
2368
+ issuer_id: (_g = (_f = (_e = context.__metadata) == null ? void 0 : _e.__issuerId) != null ? _f : context.__issuerId) != null ? _g : null,
2369
+ issued_at: formatTimestamp(Date.now()),
2370
+ intent: (_j = (_i = (_h = context.__metadata) == null ? void 0 : _h.__intent) != null ? _i : context.__intent) != null ? _j : null,
2371
+ context: contextData,
2372
+ is_meta: isMeta
2373
+ }
2374
+ });
2375
+ }
2276
2376
  this.emitMetrics("meta.runner.added_tasks", {
2277
2377
  data: {
2278
2378
  uuid: routineExecId,
2279
2379
  name: routineName,
2280
2380
  routineVersion,
2281
2381
  isMeta,
2282
- contractId: (_d = (_c = (_b = context.__metadata) == null ? void 0 : _b.__contractId) != null ? _c : context.__contractId) != null ? _d : null,
2283
- context: ctx.export(),
2284
- previousRoutineExecution: (_f = (_e = context.__metadata) == null ? void 0 : _e.__routineExecId) != null ? _f : null,
2382
+ executionTraceId,
2383
+ context: isNewTrace ? contextData.id : contextData,
2384
+ previousRoutineExecution: (_l = (_k = context.__metadata) == null ? void 0 : _k.__routineExecId) != null ? _l : null,
2285
2385
  // TODO: There is a chance this is not added to the database yet...
2286
2386
  created: formatTimestamp(Date.now())
2287
2387
  }
@@ -3420,7 +3520,6 @@ var index_default = Cadenza;
3420
3520
  GraphRunner,
3421
3521
  SignalBroker,
3422
3522
  SignalEmitter,
3423
- SignalParticipant,
3424
3523
  SignalTask,
3425
3524
  Task
3426
3525
  });