@cadenza.io/service 2.17.8 → 2.17.10

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
@@ -433,16 +433,16 @@ function normalizeServiceTransportConfig(value) {
433
433
  }
434
434
  function normalizeServiceTransportDescriptor(value) {
435
435
  const raw = value ?? {};
436
- const uuid5 = normalizeString(raw.uuid);
436
+ const uuid6 = normalizeString(raw.uuid);
437
437
  const serviceInstanceId = normalizeString(
438
438
  raw.serviceInstanceId ?? raw.service_instance_id
439
439
  );
440
440
  const config = normalizeServiceTransportConfig(raw);
441
- if (!uuid5 || !serviceInstanceId || !config) {
441
+ if (!uuid6 || !serviceInstanceId || !config) {
442
442
  return null;
443
443
  }
444
444
  return {
445
- uuid: uuid5,
445
+ uuid: uuid6,
446
446
  serviceInstanceId,
447
447
  role: config.role,
448
448
  origin: config.origin,
@@ -504,14 +504,14 @@ function normalizeTransportArray(value, serviceInstanceId) {
504
504
  }
505
505
  function normalizeServiceInstanceDescriptor(value) {
506
506
  const raw = value ?? {};
507
- const uuid5 = normalizeString2(raw.uuid);
507
+ const uuid6 = normalizeString2(raw.uuid);
508
508
  const serviceName = normalizeString2(raw.serviceName ?? raw.service_name);
509
- if (!uuid5 || !serviceName) {
509
+ if (!uuid6 || !serviceName) {
510
510
  return null;
511
511
  }
512
- const transports = normalizeTransportArray(raw.transports, uuid5);
512
+ const transports = normalizeTransportArray(raw.transports, uuid6);
513
513
  return {
514
- uuid: uuid5,
514
+ uuid: uuid6,
515
515
  serviceName,
516
516
  numberOfRunningGraphs: Math.max(
517
517
  0,
@@ -954,15 +954,15 @@ var ServiceRegistry = class _ServiceRegistry {
954
954
  if (!serviceInstance) {
955
955
  return false;
956
956
  }
957
- const uuid5 = serviceInstance.uuid;
957
+ const uuid6 = serviceInstance.uuid;
958
958
  const serviceName = serviceInstance.serviceName;
959
959
  const deleted = Boolean(
960
960
  ctx.deleted ?? ctx.serviceInstance?.deleted ?? ctx.data?.deleted
961
961
  );
962
- if (uuid5 === this.serviceInstanceId) return;
962
+ if (uuid6 === this.serviceInstanceId) return;
963
963
  if (deleted) {
964
- const existingInstance = this.instances.get(serviceName)?.find((instance) => instance.uuid === uuid5);
965
- const indexToDelete = this.instances.get(serviceName)?.findIndex((i) => i.uuid === uuid5) ?? -1;
964
+ const existingInstance = this.instances.get(serviceName)?.find((instance) => instance.uuid === uuid6);
965
+ const indexToDelete = this.instances.get(serviceName)?.findIndex((i) => i.uuid === uuid6) ?? -1;
966
966
  if (indexToDelete >= 0 && existingInstance) {
967
967
  this.instances.get(serviceName)?.splice(indexToDelete, 1);
968
968
  for (const transport of existingInstance.transports) {
@@ -974,13 +974,13 @@ var ServiceRegistry = class _ServiceRegistry {
974
974
  if (this.instances.get(serviceName)?.length === 0) {
975
975
  this.instances.delete(serviceName);
976
976
  }
977
- this.unregisterDependee(uuid5, serviceName);
977
+ this.unregisterDependee(uuid6, serviceName);
978
978
  return;
979
979
  }
980
980
  if (!this.instances.has(serviceName))
981
981
  this.instances.set(serviceName, []);
982
982
  const instances = this.instances.get(serviceName);
983
- const existing = instances.find((i) => i.uuid === uuid5);
983
+ const existing = instances.find((i) => i.uuid === uuid6);
984
984
  if (existing) {
985
985
  Object.assign(existing, {
986
986
  ...serviceInstance,
@@ -990,7 +990,7 @@ var ServiceRegistry = class _ServiceRegistry {
990
990
  } else {
991
991
  instances.push(serviceInstance);
992
992
  }
993
- const trackedInstance = existing ?? instances.find((instance) => instance.uuid === uuid5);
993
+ const trackedInstance = existing ?? instances.find((instance) => instance.uuid === uuid6);
994
994
  if (trackedInstance) {
995
995
  const snapshot = this.resolveRuntimeStatusSnapshot(
996
996
  trackedInstance.numberOfRunningGraphs ?? 0,
@@ -1003,7 +1003,7 @@ var ServiceRegistry = class _ServiceRegistry {
1003
1003
  trackedInstance.reportedAt = trackedInstance.reportedAt ?? (/* @__PURE__ */ new Date()).toISOString();
1004
1004
  }
1005
1005
  if (!serviceInstance.isBootstrapPlaceholder) {
1006
- this.reconcileBootstrapPlaceholderInstance(serviceName, uuid5, emit);
1006
+ this.reconcileBootstrapPlaceholderInstance(serviceName, uuid6, emit);
1007
1007
  }
1008
1008
  if (this.serviceName === serviceName) {
1009
1009
  return false;
@@ -1029,7 +1029,7 @@ var ServiceRegistry = class _ServiceRegistry {
1029
1029
  if (!clientCreated) {
1030
1030
  emit("meta.service_registry.dependee_registered", {
1031
1031
  serviceName,
1032
- serviceInstanceId: uuid5,
1032
+ serviceInstanceId: uuid6,
1033
1033
  serviceTransportId: trackedTransport.uuid,
1034
1034
  serviceOrigin: trackedTransport.origin,
1035
1035
  transportProtocols: trackedTransport.protocols,
@@ -1043,7 +1043,7 @@ var ServiceRegistry = class _ServiceRegistry {
1043
1043
  } else {
1044
1044
  emit("meta.service_registry.routeable_transport_missing", {
1045
1045
  serviceName,
1046
- serviceInstanceId: uuid5,
1046
+ serviceInstanceId: uuid6,
1047
1047
  requiredRole: this.getRoutingTransportRole(),
1048
1048
  isFrontend: this.isFrontend
1049
1049
  });
@@ -3284,6 +3284,7 @@ var import_node_http = __toESM(require("http"));
3284
3284
  var import_node_fs = __toESM(require("fs"));
3285
3285
  var import_node_https = __toESM(require("https"));
3286
3286
  var import_node_fetch = __toESM(require("node-fetch"));
3287
+ var import_uuid3 = require("uuid");
3287
3288
  var RestController = class _RestController {
3288
3289
  /**
3289
3290
  * Constructor for initializing the REST server and related configurations.
@@ -3645,7 +3646,7 @@ var RestController = class _RestController {
3645
3646
  const internalOrigin = httpOrigin ?? httpsOrigin;
3646
3647
  if (internalOrigin) {
3647
3648
  transportData.unshift({
3648
- uuid: `${ctx.__serviceInstanceId}-internal-auto`,
3649
+ uuid: (0, import_uuid3.v4)(),
3649
3650
  service_instance_id: ctx.__serviceInstanceId,
3650
3651
  role: "internal",
3651
3652
  origin: internalOrigin,
@@ -5829,6 +5830,13 @@ var GraphMetadataController = class _GraphMetadataController {
5829
5830
  };
5830
5831
  }).doOn("meta.task.layer_index_changed", "meta.task.destroyed").emits("global.meta.graph_metadata.task_updated");
5831
5832
  CadenzaService.createMetaTask("Handle task relationship creation", (ctx) => {
5833
+ const taskName = ctx.data?.taskName ?? ctx.data?.task_name;
5834
+ const predecessorTaskName = ctx.data?.predecessorTaskName ?? ctx.data?.predecessor_task_name;
5835
+ const task = taskName ? CadenzaService.get(taskName) : void 0;
5836
+ const predecessorTask = predecessorTaskName ? CadenzaService.get(predecessorTaskName) : void 0;
5837
+ if (!task?.registered || !predecessorTask?.registered) {
5838
+ return false;
5839
+ }
5832
5840
  return {
5833
5841
  data: {
5834
5842
  ...ctx.data,
@@ -6105,6 +6113,13 @@ function defaultOperationIntentDescription(operation, tableName) {
6105
6113
  function isExplicitSqlLiteral(value) {
6106
6114
  return /^'.*'::[a-z_][a-z0-9_]*(\[\])?$/i.test(value.trim());
6107
6115
  }
6116
+ function extractExplicitJsonLiteral(value) {
6117
+ const match = /^'(.*)'::jsonb$/i.exec(value.trim());
6118
+ if (!match) {
6119
+ return null;
6120
+ }
6121
+ return match[1].replace(/''/g, "'");
6122
+ }
6108
6123
  function isExplicitSqlExpression(value) {
6109
6124
  const trimmed = value.trim();
6110
6125
  if (!trimmed) {
@@ -6163,6 +6178,24 @@ function serializeInitialDataValueForSql(value, field) {
6163
6178
  }
6164
6179
  return `'${stringValue.replace(/'/g, "''")}'`;
6165
6180
  }
6181
+ function serializeFieldValueForQuery(value, field) {
6182
+ if (value === void 0 || value === null || field?.type !== "jsonb") {
6183
+ return value;
6184
+ }
6185
+ if (typeof value === "string") {
6186
+ const explicitJsonLiteral = extractExplicitJsonLiteral(value);
6187
+ if (explicitJsonLiteral !== null) {
6188
+ return explicitJsonLiteral;
6189
+ }
6190
+ try {
6191
+ JSON.parse(value);
6192
+ return value;
6193
+ } catch {
6194
+ return JSON.stringify(value);
6195
+ }
6196
+ }
6197
+ return JSON.stringify(value);
6198
+ }
6166
6199
  function readCustomIntentConfig(customIntent) {
6167
6200
  if (typeof customIntent === "string") {
6168
6201
  return {
@@ -6844,18 +6877,28 @@ var DatabaseController = class _DatabaseController {
6844
6877
  throw new Error("No rows available for insert after resolving data");
6845
6878
  }
6846
6879
  const keys = Object.keys(rows[0]);
6880
+ const tableFields = registration.schema.tables[tableName]?.fields ?? {};
6847
6881
  const sqlPrefix = `INSERT INTO ${tableName} (${keys.map((key) => (0, import_lodash_es.snakeCase)(key)).join(", ")}) VALUES `;
6848
6882
  const params = [];
6849
6883
  const placeholders = rows.map((row) => {
6850
6884
  const tuple = keys.map((key) => {
6851
- params.push(row[key]);
6885
+ params.push(
6886
+ serializeFieldValueForQuery(
6887
+ row[key],
6888
+ this.getFieldDefinitionForKey(tableFields, key)
6889
+ )
6890
+ );
6852
6891
  return `$${params.length}`;
6853
6892
  }).join(", ");
6854
6893
  return `(${tuple})`;
6855
6894
  }).join(", ");
6856
6895
  let onConflictSql = "";
6857
6896
  if (onConflict) {
6858
- onConflictSql = this.buildOnConflictClause(onConflict, params);
6897
+ onConflictSql = this.buildOnConflictClause(
6898
+ onConflict,
6899
+ params,
6900
+ tableFields
6901
+ );
6859
6902
  }
6860
6903
  const sql = `${sqlPrefix}${placeholders}${onConflictSql} RETURNING ${fields.length ? fields.map(import_lodash_es.snakeCase).join(", ") : "*"}`;
6861
6904
  const result = await this.withTimeout(
@@ -6903,27 +6946,26 @@ var DatabaseController = class _DatabaseController {
6903
6946
  data,
6904
6947
  tableName
6905
6948
  );
6906
- const params = Object.values(resolvedData);
6907
- let offset = 0;
6908
- const setClause = Object.keys(resolvedData).map((key, index) => {
6949
+ const tableFields = registration.schema.tables[tableName]?.fields ?? {};
6950
+ const params = [];
6951
+ const setClause = Object.keys(resolvedData).map((key) => {
6909
6952
  const value = resolvedData[key];
6910
- const offsetIndex = index - offset;
6911
6953
  if (value?.__effect === "increment") {
6912
- params.splice(offsetIndex, 1);
6913
- offset += 1;
6914
6954
  return `${(0, import_lodash_es.snakeCase)(key)} = ${(0, import_lodash_es.snakeCase)(key)} + 1`;
6915
6955
  }
6916
6956
  if (value?.__effect === "decrement") {
6917
- params.splice(offsetIndex, 1);
6918
- offset += 1;
6919
6957
  return `${(0, import_lodash_es.snakeCase)(key)} = ${(0, import_lodash_es.snakeCase)(key)} - 1`;
6920
6958
  }
6921
6959
  if (value?.__effect === "set") {
6922
- params.splice(offsetIndex, 1);
6923
- offset += 1;
6924
6960
  return `${(0, import_lodash_es.snakeCase)(key)} = ${value.__value}`;
6925
6961
  }
6926
- return `${(0, import_lodash_es.snakeCase)(key)} = $${offsetIndex + 1}`;
6962
+ params.push(
6963
+ serializeFieldValueForQuery(
6964
+ value,
6965
+ this.getFieldDefinitionForKey(tableFields, key)
6966
+ )
6967
+ );
6968
+ return `${(0, import_lodash_es.snakeCase)(key)} = $${params.length}`;
6927
6969
  }).join(", ");
6928
6970
  const whereClause = this.buildWhereClause(filter, params);
6929
6971
  const sql = `UPDATE ${tableName} SET ${setClause} ${whereClause} RETURNING *`;
@@ -7012,7 +7054,7 @@ var DatabaseController = class _DatabaseController {
7012
7054
  retryDelayFactor: Number.isFinite(durableState.safetyPolicy?.retryDelayFactor) ? Math.max(1, Number(durableState.safetyPolicy?.retryDelayFactor)) : 1
7013
7055
  };
7014
7056
  }
7015
- buildOnConflictClause(onConflict, params) {
7057
+ buildOnConflictClause(onConflict, params, tableFields) {
7016
7058
  const { target, action } = onConflict;
7017
7059
  let sql = ` ON CONFLICT (${target.map(import_lodash_es.snakeCase).join(", ")})`;
7018
7060
  if (action.do === "update") {
@@ -7023,7 +7065,12 @@ var DatabaseController = class _DatabaseController {
7023
7065
  if (typeof value === "string" && value === "excluded") {
7024
7066
  return `${(0, import_lodash_es.snakeCase)(field)} = excluded.${(0, import_lodash_es.snakeCase)(field)}`;
7025
7067
  }
7026
- params.push(value);
7068
+ params.push(
7069
+ serializeFieldValueForQuery(
7070
+ value,
7071
+ this.getFieldDefinitionForKey(tableFields, field)
7072
+ )
7073
+ );
7027
7074
  return `${(0, import_lodash_es.snakeCase)(field)} = $${params.length}`;
7028
7075
  });
7029
7076
  sql += ` DO UPDATE SET ${assignments.join(", ")}`;
@@ -7035,6 +7082,9 @@ var DatabaseController = class _DatabaseController {
7035
7082
  sql += " DO NOTHING";
7036
7083
  return sql;
7037
7084
  }
7085
+ getFieldDefinitionForKey(fields, key) {
7086
+ return fields[key] ?? fields[(0, import_lodash_es.snakeCase)(key)];
7087
+ }
7038
7088
  /**
7039
7089
  * Validates database schema structure and content.
7040
7090
  */
@@ -7656,7 +7706,13 @@ var DatabaseController = class _DatabaseController {
7656
7706
  );
7657
7707
  const row = ensurePlainObject(resolvedData, "sub-operation insert data");
7658
7708
  const keys = Object.keys(row);
7659
- const params = Object.values(row);
7709
+ const tableFields = registration.schema.tables[operation.table]?.fields ?? {};
7710
+ const params = keys.map(
7711
+ (key) => serializeFieldValueForQuery(
7712
+ row[key],
7713
+ this.getFieldDefinitionForKey(tableFields, key)
7714
+ )
7715
+ );
7660
7716
  const sql2 = `INSERT INTO ${operation.table} (${keys.map((key) => (0, import_lodash_es.snakeCase)(key)).join(", ")}) VALUES (${params.map((_, index) => `$${index + 1}`).join(", ")}) ON CONFLICT DO NOTHING RETURNING ${operation.return ?? "*"}`;
7661
7717
  const result2 = await this.withTimeout(
7662
7718
  () => client.query(sql2, params),
@@ -8006,7 +8062,7 @@ function tableFieldTypeToSchemaType(type) {
8006
8062
  }
8007
8063
 
8008
8064
  // src/Cadenza.ts
8009
- var import_uuid3 = require("uuid");
8065
+ var import_uuid4 = require("uuid");
8010
8066
 
8011
8067
  // src/graph/controllers/GraphSyncController.ts
8012
8068
  var ACTOR_TASK_METADATA = /* @__PURE__ */ Symbol.for("@cadenza.io/core/actor-task-meta");
@@ -8068,10 +8124,29 @@ function buildActorRegistrationData(actor) {
8068
8124
  version: 1
8069
8125
  };
8070
8126
  }
8127
+ function resolveSyncServiceName(task) {
8128
+ const taskServiceName = typeof task?.serviceName === "string" ? task.serviceName.trim() : "";
8129
+ const registryServiceName = typeof CadenzaService.serviceRegistry.serviceName === "string" ? CadenzaService.serviceRegistry.serviceName.trim() : "";
8130
+ return taskServiceName || registryServiceName || void 0;
8131
+ }
8132
+ function buildIntentRegistryData(intent) {
8133
+ const name = String(intent?.name ?? "").trim();
8134
+ if (!name) {
8135
+ return null;
8136
+ }
8137
+ return {
8138
+ name,
8139
+ description: typeof intent?.description === "string" ? intent.description : "",
8140
+ input: intent?.input && typeof intent.input === "object" ? intent.input : { type: "object" },
8141
+ output: intent?.output && typeof intent.output === "object" ? intent.output : { type: "object" },
8142
+ isMeta: isMetaIntentName(name)
8143
+ };
8144
+ }
8071
8145
  var GraphSyncController = class _GraphSyncController {
8072
8146
  constructor() {
8073
8147
  this.registeredActors = /* @__PURE__ */ new Set();
8074
8148
  this.registeredActorTaskMaps = /* @__PURE__ */ new Set();
8149
+ this.registeredIntentDefinitions = /* @__PURE__ */ new Set();
8075
8150
  this.isCadenzaDBReady = false;
8076
8151
  }
8077
8152
  static get instance() {
@@ -8079,11 +8154,27 @@ var GraphSyncController = class _GraphSyncController {
8079
8154
  return this._instance;
8080
8155
  }
8081
8156
  init() {
8157
+ const insertIntentRegistryTask = this.isCadenzaDBReady ? CadenzaService.createCadenzaDBInsertTask(
8158
+ "intent_registry",
8159
+ {
8160
+ onConflict: {
8161
+ target: ["name"],
8162
+ action: {
8163
+ do: "nothing"
8164
+ }
8165
+ }
8166
+ },
8167
+ { concurrency: 30 }
8168
+ ) : CadenzaService.get("dbInsertIntentRegistry");
8082
8169
  this.splitRoutinesTask = CadenzaService.createMetaTask(
8083
8170
  "Split routines for registration",
8084
8171
  async function* (ctx, emit) {
8085
8172
  const { routines } = ctx;
8086
8173
  if (!routines) return;
8174
+ const serviceName = resolveSyncServiceName();
8175
+ if (!serviceName) {
8176
+ return;
8177
+ }
8087
8178
  CadenzaService.debounce("meta.sync_controller.synced_resource", {
8088
8179
  delayMs: 2e3
8089
8180
  });
@@ -8094,7 +8185,7 @@ var GraphSyncController = class _GraphSyncController {
8094
8185
  name: routine.name,
8095
8186
  version: routine.version,
8096
8187
  description: routine.description,
8097
- serviceName: CadenzaService.serviceRegistry.serviceName,
8188
+ serviceName,
8098
8189
  isMeta: routine.isMeta
8099
8190
  },
8100
8191
  __routineName: routine.name
@@ -8136,6 +8227,10 @@ var GraphSyncController = class _GraphSyncController {
8136
8227
  function* (ctx) {
8137
8228
  const { routines } = ctx;
8138
8229
  if (!routines) return;
8230
+ const serviceName = resolveSyncServiceName();
8231
+ if (!serviceName) {
8232
+ return;
8233
+ }
8139
8234
  CadenzaService.debounce("meta.sync_controller.synced_resource", {
8140
8235
  delayMs: 3e3
8141
8236
  });
@@ -8155,7 +8250,7 @@ var GraphSyncController = class _GraphSyncController {
8155
8250
  taskVersion: nextTask.version,
8156
8251
  routineName: routine.name,
8157
8252
  routineVersion: routine.version,
8158
- serviceName: CadenzaService.serviceRegistry.serviceName
8253
+ serviceName
8159
8254
  },
8160
8255
  __routineName: routine.name,
8161
8256
  __taskName: nextTask.name
@@ -8258,6 +8353,10 @@ var GraphSyncController = class _GraphSyncController {
8258
8353
  delayMs: 3e3
8259
8354
  });
8260
8355
  const tasks = ctx.tasks;
8356
+ const serviceName = resolveSyncServiceName();
8357
+ if (!serviceName) {
8358
+ return;
8359
+ }
8261
8360
  for (const task of tasks) {
8262
8361
  if (task.registered) continue;
8263
8362
  const { __functionString, __getTagCallback } = task.export();
@@ -8287,7 +8386,7 @@ var GraphSyncController = class _GraphSyncController {
8287
8386
  retryDelay: task.retryDelay,
8288
8387
  retryDelayMax: task.retryDelayMax,
8289
8388
  retryDelayFactor: task.retryDelayFactor,
8290
- service_name: CadenzaService.serviceRegistry.serviceName,
8389
+ service_name: serviceName,
8291
8390
  signals: {
8292
8391
  emits: Array.from(task.emitsSignals),
8293
8392
  signalsToEmitAfter: Array.from(task.signalsToEmitAfter),
@@ -8335,11 +8434,15 @@ var GraphSyncController = class _GraphSyncController {
8335
8434
  CadenzaService.debounce("meta.sync_controller.synced_resource", {
8336
8435
  delayMs: 3e3
8337
8436
  });
8437
+ const serviceName = resolveSyncServiceName();
8438
+ if (!serviceName) {
8439
+ return;
8440
+ }
8338
8441
  const actors = ctx.actors ?? [];
8339
8442
  for (const actor of actors) {
8340
8443
  const data = {
8341
8444
  ...buildActorRegistrationData(actor),
8342
- service_name: CadenzaService.serviceRegistry.serviceName
8445
+ service_name: serviceName
8343
8446
  };
8344
8447
  if (!data.name) {
8345
8448
  continue;
@@ -8395,7 +8498,11 @@ var GraphSyncController = class _GraphSyncController {
8395
8498
  if (!metadata?.actorName) {
8396
8499
  return;
8397
8500
  }
8398
- const registrationKey = `${metadata.actorName}|${task.name}|${task.version}|${CadenzaService.serviceRegistry.serviceName}`;
8501
+ const serviceName = resolveSyncServiceName(task);
8502
+ if (!serviceName) {
8503
+ return;
8504
+ }
8505
+ const registrationKey = `${metadata.actorName}|${task.name}|${task.version}|${serviceName}`;
8399
8506
  if (this.registeredActorTaskMaps.has(registrationKey)) {
8400
8507
  return;
8401
8508
  }
@@ -8405,7 +8512,7 @@ var GraphSyncController = class _GraphSyncController {
8405
8512
  actor_version: 1,
8406
8513
  task_name: task.name,
8407
8514
  task_version: task.version,
8408
- service_name: CadenzaService.serviceRegistry.serviceName,
8515
+ service_name: serviceName,
8409
8516
  mode: metadata.mode,
8410
8517
  description: task.description ?? metadata.actorDescription ?? "",
8411
8518
  is_meta: metadata.actorKind === "meta" || task.isMeta === true
@@ -8460,6 +8567,10 @@ var GraphSyncController = class _GraphSyncController {
8460
8567
  function* (ctx) {
8461
8568
  const task = ctx.task;
8462
8569
  if (task.hidden || !task.register) return;
8570
+ const serviceName = resolveSyncServiceName(task);
8571
+ if (!serviceName) {
8572
+ return;
8573
+ }
8463
8574
  for (const signal of task.observedSignals) {
8464
8575
  const _signal = signal.split(":")[0];
8465
8576
  if (task.registeredSignals.has(signal)) continue;
@@ -8470,7 +8581,7 @@ var GraphSyncController = class _GraphSyncController {
8470
8581
  isGlobal,
8471
8582
  taskName: task.name,
8472
8583
  taskVersion: task.version,
8473
- serviceName: CadenzaService.serviceRegistry.serviceName
8584
+ serviceName
8474
8585
  },
8475
8586
  __taskName: task.name,
8476
8587
  __signal: signal
@@ -8496,6 +8607,46 @@ var GraphSyncController = class _GraphSyncController {
8496
8607
  { concurrency: 30 }
8497
8608
  ) : CadenzaService.get("dbInsertSignalToTaskMap"))?.then(registerSignalTask)
8498
8609
  );
8610
+ this.splitIntentsTask = CadenzaService.createMetaTask(
8611
+ "Split intents for registration",
8612
+ function* (ctx) {
8613
+ CadenzaService.debounce("meta.sync_controller.synced_resource", {
8614
+ delayMs: 3e3
8615
+ });
8616
+ const intents = Array.isArray(ctx.intents) ? ctx.intents : Array.from(CadenzaService.inquiryBroker.intents.values());
8617
+ for (const intent of intents) {
8618
+ const intentData = buildIntentRegistryData(intent);
8619
+ if (!intentData) {
8620
+ continue;
8621
+ }
8622
+ if (this.registeredIntentDefinitions.has(intentData.name)) {
8623
+ continue;
8624
+ }
8625
+ yield {
8626
+ data: intentData,
8627
+ __intentName: intentData.name
8628
+ };
8629
+ }
8630
+ }.bind(this)
8631
+ ).then(
8632
+ insertIntentRegistryTask?.then(
8633
+ CadenzaService.createMetaTask("Record intent definition registration", (ctx) => {
8634
+ if (!ctx.__syncing) {
8635
+ return;
8636
+ }
8637
+ CadenzaService.debounce("meta.sync_controller.synced_resource", {
8638
+ delayMs: 3e3
8639
+ });
8640
+ this.registeredIntentDefinitions.add(ctx.__intentName);
8641
+ return true;
8642
+ }).then(
8643
+ CadenzaService.createUniqueMetaTask(
8644
+ "Gather intent registration",
8645
+ () => true
8646
+ ).emits("meta.sync_controller.synced_intents")
8647
+ )
8648
+ )
8649
+ );
8499
8650
  const registerIntentTask = CadenzaService.createMetaTask(
8500
8651
  "Record intent registration",
8501
8652
  (ctx) => {
@@ -8515,6 +8666,10 @@ var GraphSyncController = class _GraphSyncController {
8515
8666
  function* (ctx) {
8516
8667
  const task = ctx.task;
8517
8668
  if (task.hidden || !task.register) return;
8669
+ const serviceName = resolveSyncServiceName(task);
8670
+ if (!serviceName) {
8671
+ return;
8672
+ }
8518
8673
  task.__registeredIntents = task.__registeredIntents ?? /* @__PURE__ */ new Set();
8519
8674
  task.__invalidMetaIntentWarnings = task.__invalidMetaIntentWarnings ?? /* @__PURE__ */ new Set();
8520
8675
  for (const intent of task.handlesIntents) {
@@ -8534,36 +8689,75 @@ var GraphSyncController = class _GraphSyncController {
8534
8689
  }
8535
8690
  continue;
8536
8691
  }
8692
+ const intentDefinition = buildIntentRegistryData(CadenzaService.inquiryBroker.intents.get(intent)) ?? buildIntentRegistryData({ name: intent });
8693
+ if (!intentDefinition) {
8694
+ continue;
8695
+ }
8537
8696
  yield {
8538
8697
  data: {
8539
8698
  intentName: intent,
8540
8699
  taskName: task.name,
8541
8700
  taskVersion: task.version,
8542
- serviceName: CadenzaService.serviceRegistry.serviceName
8701
+ serviceName
8543
8702
  },
8544
8703
  __taskName: task.name,
8545
- __intent: intent
8704
+ __intent: intent,
8705
+ __intentDefinition: intentDefinition,
8706
+ __intentMapData: {
8707
+ intentName: intent,
8708
+ taskName: task.name,
8709
+ taskVersion: task.version,
8710
+ serviceName
8711
+ }
8546
8712
  };
8547
8713
  }
8548
8714
  }
8549
8715
  ).then(
8550
- (this.isCadenzaDBReady ? CadenzaService.createCadenzaDBInsertTask(
8551
- "intent_to_task_map",
8552
- {
8553
- onConflict: {
8554
- target: [
8555
- "intent_name",
8556
- "task_name",
8557
- "task_version",
8558
- "service_name"
8559
- ],
8560
- action: {
8561
- do: "nothing"
8562
- }
8716
+ CadenzaService.createMetaTask(
8717
+ "Prepare intent definition for intent-to-task map",
8718
+ (ctx) => {
8719
+ if (!ctx.__intentDefinition || !ctx.__intentMapData) {
8720
+ return false;
8563
8721
  }
8564
- },
8565
- { concurrency: 30 }
8566
- ) : CadenzaService.get("dbInsertIntentToTaskMap"))?.then(registerIntentTask)
8722
+ return {
8723
+ ...ctx,
8724
+ data: ctx.__intentDefinition
8725
+ };
8726
+ }
8727
+ ).then(
8728
+ insertIntentRegistryTask?.then(
8729
+ CadenzaService.createMetaTask(
8730
+ "Restore intent-to-task map payload",
8731
+ (ctx) => {
8732
+ if (!ctx.__intentMapData) {
8733
+ return false;
8734
+ }
8735
+ return {
8736
+ ...ctx,
8737
+ data: ctx.__intentMapData
8738
+ };
8739
+ }
8740
+ ).then(
8741
+ (this.isCadenzaDBReady ? CadenzaService.createCadenzaDBInsertTask(
8742
+ "intent_to_task_map",
8743
+ {
8744
+ onConflict: {
8745
+ target: [
8746
+ "intent_name",
8747
+ "task_name",
8748
+ "task_version",
8749
+ "service_name"
8750
+ ],
8751
+ action: {
8752
+ do: "nothing"
8753
+ }
8754
+ }
8755
+ },
8756
+ { concurrency: 30 }
8757
+ ) : CadenzaService.get("dbInsertIntentToTaskMap"))?.then(registerIntentTask)
8758
+ )
8759
+ )
8760
+ )
8567
8761
  );
8568
8762
  this.registerTaskMapTask = CadenzaService.createMetaTask(
8569
8763
  "Register task map to DB",
@@ -8573,18 +8767,26 @@ var GraphSyncController = class _GraphSyncController {
8573
8767
  delayMs: 3e3
8574
8768
  });
8575
8769
  if (task.hidden || !task.register) return;
8770
+ const predecessorServiceName = resolveSyncServiceName(task);
8771
+ if (!predecessorServiceName) {
8772
+ return;
8773
+ }
8576
8774
  for (const t of task.nextTasks) {
8577
8775
  if (task.taskMapRegistration.has(t.name) || t.hidden || !t.register) {
8578
8776
  continue;
8579
8777
  }
8778
+ const serviceName = resolveSyncServiceName(t);
8779
+ if (!serviceName) {
8780
+ continue;
8781
+ }
8580
8782
  yield {
8581
8783
  data: {
8582
8784
  taskName: t.name,
8583
8785
  taskVersion: t.version,
8584
8786
  predecessorTaskName: task.name,
8585
8787
  predecessorTaskVersion: task.version,
8586
- serviceName: CadenzaService.serviceRegistry.serviceName,
8587
- predecessorServiceName: CadenzaService.serviceRegistry.serviceName
8788
+ serviceName,
8789
+ predecessorServiceName
8588
8790
  },
8589
8791
  __taskName: task.name,
8590
8792
  __nextTaskName: t.name
@@ -8631,14 +8833,19 @@ var GraphSyncController = class _GraphSyncController {
8631
8833
  if (task.hidden || !task.register) return;
8632
8834
  if (task.isDeputy && !task.signalName) {
8633
8835
  if (task.registeredDeputyMap) return;
8836
+ const serviceName = resolveSyncServiceName(task);
8837
+ const predecessorServiceName = resolveSyncServiceName();
8838
+ if (!serviceName || !predecessorServiceName) {
8839
+ return;
8840
+ }
8634
8841
  return {
8635
8842
  data: {
8636
8843
  task_name: task.remoteRoutineName,
8637
8844
  task_version: 1,
8638
- service_name: task.serviceName,
8845
+ service_name: serviceName,
8639
8846
  predecessor_task_name: task.name,
8640
8847
  predecessor_task_version: task.version,
8641
- predecessor_service_name: CadenzaService.serviceRegistry.serviceName
8848
+ predecessor_service_name: predecessorServiceName
8642
8849
  },
8643
8850
  __taskName: task.name
8644
8851
  };
@@ -8683,6 +8890,12 @@ var GraphSyncController = class _GraphSyncController {
8683
8890
  "meta.service_registry.initial_sync_complete"
8684
8891
  ).then(this.splitSignalsTask);
8685
8892
  CadenzaService.registry.getAllTasks.clone().doOn("meta.sync_controller.synced_signals").then(this.splitTasksForRegistration);
8893
+ CadenzaService.createMetaTask("Get all intents", (ctx) => {
8894
+ return {
8895
+ ...ctx,
8896
+ intents: Array.from(CadenzaService.inquiryBroker.intents.values())
8897
+ };
8898
+ }).doOn("meta.sync_controller.synced_tasks").then(this.splitIntentsTask);
8686
8899
  CadenzaService.registry.getAllRoutines.clone().doOn("meta.sync_controller.synced_tasks").then(this.splitRoutinesTask);
8687
8900
  CadenzaService.createMetaTask("Get all actors", (ctx) => {
8688
8901
  return {
@@ -8693,9 +8906,9 @@ var GraphSyncController = class _GraphSyncController {
8693
8906
  CadenzaService.registry.doForEachTask.clone().doOn("meta.sync_controller.synced_tasks").then(
8694
8907
  this.registerTaskMapTask,
8695
8908
  this.registerSignalToTaskMapTask,
8696
- this.registerIntentToTaskMapTask,
8697
8909
  this.registerDeputyRelationshipTask
8698
8910
  );
8911
+ CadenzaService.registry.doForEachTask.clone().doOn("meta.sync_controller.synced_tasks", "meta.sync_controller.synced_intents").then(this.registerIntentToTaskMapTask);
8699
8912
  CadenzaService.registry.doForEachTask.clone().doOn("meta.sync_controller.synced_tasks", "meta.sync_controller.synced_actors").then(this.registerActorTaskMapTask);
8700
8913
  CadenzaService.registry.getAllRoutines.clone().doOn("meta.sync_controller.synced_routines").then(this.splitTasksInRoutines);
8701
8914
  CadenzaService.createMetaTask("Finish sync", (ctx, emit) => {
@@ -8955,9 +9168,9 @@ var CadenzaService = class {
8955
9168
  static normalizeDeclaredTransports(transports, serviceId) {
8956
9169
  return (transports ?? []).map((transport) => normalizeServiceTransportConfig(transport)).filter(
8957
9170
  (transport) => !!transport
8958
- ).map((transport, index) => ({
9171
+ ).map((transport) => ({
8959
9172
  ...transport,
8960
- uuid: `${serviceId}-transport-${index + 1}`
9173
+ uuid: (0, import_uuid4.v4)()
8961
9174
  }));
8962
9175
  }
8963
9176
  static createBootstrapTransport(serviceInstanceId, role, endpoint) {
@@ -9201,7 +9414,7 @@ var CadenzaService = class {
9201
9414
  }
9202
9415
  for (const responder of responders) {
9203
9416
  const { task, descriptor } = responder;
9204
- const inquiryId = (0, import_uuid3.v4)();
9417
+ const inquiryId = (0, import_uuid4.v4)();
9205
9418
  startTimeByTask.set(task, Date.now());
9206
9419
  const resolverTask = this.createEphemeralMetaTask(
9207
9420
  `Resolve inquiry ${inquiry} for ${descriptor.localTaskName}`,
@@ -9690,7 +9903,7 @@ var CadenzaService = class {
9690
9903
  this.bootstrap();
9691
9904
  this.validateName(serviceName);
9692
9905
  this.validateServiceName(serviceName);
9693
- const serviceId = options.customServiceId ?? (0, import_uuid3.v4)();
9906
+ const serviceId = options.customServiceId ?? (0, import_uuid4.v4)();
9694
9907
  this.serviceRegistry.serviceName = serviceName;
9695
9908
  this.serviceRegistry.serviceInstanceId = serviceId;
9696
9909
  this.setHydrationResults(options.hydration);
@@ -10515,7 +10728,7 @@ CadenzaService.frontendSyncScheduled = false;
10515
10728
  var import_core5 = require("@cadenza.io/core");
10516
10729
 
10517
10730
  // src/ssr/createSSRInquiryBridge.ts
10518
- var import_uuid4 = require("uuid");
10731
+ var import_uuid5 = require("uuid");
10519
10732
  function ensureFetch() {
10520
10733
  if (typeof globalThis.fetch !== "function") {
10521
10734
  throw new Error("SSR inquiry bridge requires global fetch support.");
@@ -10591,7 +10804,7 @@ function createSSRInquiryBridge(options = {}) {
10591
10804
  __remoteRoutineName: remoteRoutineName,
10592
10805
  __metadata: {
10593
10806
  ...context.__metadata ?? {},
10594
- __deputyExecId: (0, import_uuid4.v4)()
10807
+ __deputyExecId: (0, import_uuid5.v4)()
10595
10808
  }
10596
10809
  }),
10597
10810
  signal