@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.mjs CHANGED
@@ -382,16 +382,16 @@ function normalizeServiceTransportConfig(value) {
382
382
  }
383
383
  function normalizeServiceTransportDescriptor(value) {
384
384
  const raw = value ?? {};
385
- const uuid5 = normalizeString(raw.uuid);
385
+ const uuid6 = normalizeString(raw.uuid);
386
386
  const serviceInstanceId = normalizeString(
387
387
  raw.serviceInstanceId ?? raw.service_instance_id
388
388
  );
389
389
  const config = normalizeServiceTransportConfig(raw);
390
- if (!uuid5 || !serviceInstanceId || !config) {
390
+ if (!uuid6 || !serviceInstanceId || !config) {
391
391
  return null;
392
392
  }
393
393
  return {
394
- uuid: uuid5,
394
+ uuid: uuid6,
395
395
  serviceInstanceId,
396
396
  role: config.role,
397
397
  origin: config.origin,
@@ -453,14 +453,14 @@ function normalizeTransportArray(value, serviceInstanceId) {
453
453
  }
454
454
  function normalizeServiceInstanceDescriptor(value) {
455
455
  const raw = value ?? {};
456
- const uuid5 = normalizeString2(raw.uuid);
456
+ const uuid6 = normalizeString2(raw.uuid);
457
457
  const serviceName = normalizeString2(raw.serviceName ?? raw.service_name);
458
- if (!uuid5 || !serviceName) {
458
+ if (!uuid6 || !serviceName) {
459
459
  return null;
460
460
  }
461
- const transports = normalizeTransportArray(raw.transports, uuid5);
461
+ const transports = normalizeTransportArray(raw.transports, uuid6);
462
462
  return {
463
- uuid: uuid5,
463
+ uuid: uuid6,
464
464
  serviceName,
465
465
  numberOfRunningGraphs: Math.max(
466
466
  0,
@@ -903,15 +903,15 @@ var ServiceRegistry = class _ServiceRegistry {
903
903
  if (!serviceInstance) {
904
904
  return false;
905
905
  }
906
- const uuid5 = serviceInstance.uuid;
906
+ const uuid6 = serviceInstance.uuid;
907
907
  const serviceName = serviceInstance.serviceName;
908
908
  const deleted = Boolean(
909
909
  ctx.deleted ?? ctx.serviceInstance?.deleted ?? ctx.data?.deleted
910
910
  );
911
- if (uuid5 === this.serviceInstanceId) return;
911
+ if (uuid6 === this.serviceInstanceId) return;
912
912
  if (deleted) {
913
- const existingInstance = this.instances.get(serviceName)?.find((instance) => instance.uuid === uuid5);
914
- const indexToDelete = this.instances.get(serviceName)?.findIndex((i) => i.uuid === uuid5) ?? -1;
913
+ const existingInstance = this.instances.get(serviceName)?.find((instance) => instance.uuid === uuid6);
914
+ const indexToDelete = this.instances.get(serviceName)?.findIndex((i) => i.uuid === uuid6) ?? -1;
915
915
  if (indexToDelete >= 0 && existingInstance) {
916
916
  this.instances.get(serviceName)?.splice(indexToDelete, 1);
917
917
  for (const transport of existingInstance.transports) {
@@ -923,13 +923,13 @@ var ServiceRegistry = class _ServiceRegistry {
923
923
  if (this.instances.get(serviceName)?.length === 0) {
924
924
  this.instances.delete(serviceName);
925
925
  }
926
- this.unregisterDependee(uuid5, serviceName);
926
+ this.unregisterDependee(uuid6, serviceName);
927
927
  return;
928
928
  }
929
929
  if (!this.instances.has(serviceName))
930
930
  this.instances.set(serviceName, []);
931
931
  const instances = this.instances.get(serviceName);
932
- const existing = instances.find((i) => i.uuid === uuid5);
932
+ const existing = instances.find((i) => i.uuid === uuid6);
933
933
  if (existing) {
934
934
  Object.assign(existing, {
935
935
  ...serviceInstance,
@@ -939,7 +939,7 @@ var ServiceRegistry = class _ServiceRegistry {
939
939
  } else {
940
940
  instances.push(serviceInstance);
941
941
  }
942
- const trackedInstance = existing ?? instances.find((instance) => instance.uuid === uuid5);
942
+ const trackedInstance = existing ?? instances.find((instance) => instance.uuid === uuid6);
943
943
  if (trackedInstance) {
944
944
  const snapshot = this.resolveRuntimeStatusSnapshot(
945
945
  trackedInstance.numberOfRunningGraphs ?? 0,
@@ -952,7 +952,7 @@ var ServiceRegistry = class _ServiceRegistry {
952
952
  trackedInstance.reportedAt = trackedInstance.reportedAt ?? (/* @__PURE__ */ new Date()).toISOString();
953
953
  }
954
954
  if (!serviceInstance.isBootstrapPlaceholder) {
955
- this.reconcileBootstrapPlaceholderInstance(serviceName, uuid5, emit);
955
+ this.reconcileBootstrapPlaceholderInstance(serviceName, uuid6, emit);
956
956
  }
957
957
  if (this.serviceName === serviceName) {
958
958
  return false;
@@ -978,7 +978,7 @@ var ServiceRegistry = class _ServiceRegistry {
978
978
  if (!clientCreated) {
979
979
  emit("meta.service_registry.dependee_registered", {
980
980
  serviceName,
981
- serviceInstanceId: uuid5,
981
+ serviceInstanceId: uuid6,
982
982
  serviceTransportId: trackedTransport.uuid,
983
983
  serviceOrigin: trackedTransport.origin,
984
984
  transportProtocols: trackedTransport.protocols,
@@ -992,7 +992,7 @@ var ServiceRegistry = class _ServiceRegistry {
992
992
  } else {
993
993
  emit("meta.service_registry.routeable_transport_missing", {
994
994
  serviceName,
995
- serviceInstanceId: uuid5,
995
+ serviceInstanceId: uuid6,
996
996
  requiredRole: this.getRoutingTransportRole(),
997
997
  isFrontend: this.isFrontend
998
998
  });
@@ -3233,6 +3233,7 @@ import http from "http";
3233
3233
  import fs from "fs";
3234
3234
  import https from "https";
3235
3235
  import fetch from "node-fetch";
3236
+ import { v4 as uuid3 } from "uuid";
3236
3237
  var RestController = class _RestController {
3237
3238
  /**
3238
3239
  * Constructor for initializing the REST server and related configurations.
@@ -3594,7 +3595,7 @@ var RestController = class _RestController {
3594
3595
  const internalOrigin = httpOrigin ?? httpsOrigin;
3595
3596
  if (internalOrigin) {
3596
3597
  transportData.unshift({
3597
- uuid: `${ctx.__serviceInstanceId}-internal-auto`,
3598
+ uuid: uuid3(),
3598
3599
  service_instance_id: ctx.__serviceInstanceId,
3599
3600
  role: "internal",
3600
3601
  origin: internalOrigin,
@@ -5778,6 +5779,13 @@ var GraphMetadataController = class _GraphMetadataController {
5778
5779
  };
5779
5780
  }).doOn("meta.task.layer_index_changed", "meta.task.destroyed").emits("global.meta.graph_metadata.task_updated");
5780
5781
  CadenzaService.createMetaTask("Handle task relationship creation", (ctx) => {
5782
+ const taskName = ctx.data?.taskName ?? ctx.data?.task_name;
5783
+ const predecessorTaskName = ctx.data?.predecessorTaskName ?? ctx.data?.predecessor_task_name;
5784
+ const task = taskName ? CadenzaService.get(taskName) : void 0;
5785
+ const predecessorTask = predecessorTaskName ? CadenzaService.get(predecessorTaskName) : void 0;
5786
+ if (!task?.registered || !predecessorTask?.registered) {
5787
+ return false;
5788
+ }
5781
5789
  return {
5782
5790
  data: {
5783
5791
  ...ctx.data,
@@ -6054,6 +6062,13 @@ function defaultOperationIntentDescription(operation, tableName) {
6054
6062
  function isExplicitSqlLiteral(value) {
6055
6063
  return /^'.*'::[a-z_][a-z0-9_]*(\[\])?$/i.test(value.trim());
6056
6064
  }
6065
+ function extractExplicitJsonLiteral(value) {
6066
+ const match = /^'(.*)'::jsonb$/i.exec(value.trim());
6067
+ if (!match) {
6068
+ return null;
6069
+ }
6070
+ return match[1].replace(/''/g, "'");
6071
+ }
6057
6072
  function isExplicitSqlExpression(value) {
6058
6073
  const trimmed = value.trim();
6059
6074
  if (!trimmed) {
@@ -6112,6 +6127,24 @@ function serializeInitialDataValueForSql(value, field) {
6112
6127
  }
6113
6128
  return `'${stringValue.replace(/'/g, "''")}'`;
6114
6129
  }
6130
+ function serializeFieldValueForQuery(value, field) {
6131
+ if (value === void 0 || value === null || field?.type !== "jsonb") {
6132
+ return value;
6133
+ }
6134
+ if (typeof value === "string") {
6135
+ const explicitJsonLiteral = extractExplicitJsonLiteral(value);
6136
+ if (explicitJsonLiteral !== null) {
6137
+ return explicitJsonLiteral;
6138
+ }
6139
+ try {
6140
+ JSON.parse(value);
6141
+ return value;
6142
+ } catch {
6143
+ return JSON.stringify(value);
6144
+ }
6145
+ }
6146
+ return JSON.stringify(value);
6147
+ }
6115
6148
  function readCustomIntentConfig(customIntent) {
6116
6149
  if (typeof customIntent === "string") {
6117
6150
  return {
@@ -6793,18 +6826,28 @@ var DatabaseController = class _DatabaseController {
6793
6826
  throw new Error("No rows available for insert after resolving data");
6794
6827
  }
6795
6828
  const keys = Object.keys(rows[0]);
6829
+ const tableFields = registration.schema.tables[tableName]?.fields ?? {};
6796
6830
  const sqlPrefix = `INSERT INTO ${tableName} (${keys.map((key) => snakeCase(key)).join(", ")}) VALUES `;
6797
6831
  const params = [];
6798
6832
  const placeholders = rows.map((row) => {
6799
6833
  const tuple = keys.map((key) => {
6800
- params.push(row[key]);
6834
+ params.push(
6835
+ serializeFieldValueForQuery(
6836
+ row[key],
6837
+ this.getFieldDefinitionForKey(tableFields, key)
6838
+ )
6839
+ );
6801
6840
  return `$${params.length}`;
6802
6841
  }).join(", ");
6803
6842
  return `(${tuple})`;
6804
6843
  }).join(", ");
6805
6844
  let onConflictSql = "";
6806
6845
  if (onConflict) {
6807
- onConflictSql = this.buildOnConflictClause(onConflict, params);
6846
+ onConflictSql = this.buildOnConflictClause(
6847
+ onConflict,
6848
+ params,
6849
+ tableFields
6850
+ );
6808
6851
  }
6809
6852
  const sql = `${sqlPrefix}${placeholders}${onConflictSql} RETURNING ${fields.length ? fields.map(snakeCase).join(", ") : "*"}`;
6810
6853
  const result = await this.withTimeout(
@@ -6852,27 +6895,26 @@ var DatabaseController = class _DatabaseController {
6852
6895
  data,
6853
6896
  tableName
6854
6897
  );
6855
- const params = Object.values(resolvedData);
6856
- let offset = 0;
6857
- const setClause = Object.keys(resolvedData).map((key, index) => {
6898
+ const tableFields = registration.schema.tables[tableName]?.fields ?? {};
6899
+ const params = [];
6900
+ const setClause = Object.keys(resolvedData).map((key) => {
6858
6901
  const value = resolvedData[key];
6859
- const offsetIndex = index - offset;
6860
6902
  if (value?.__effect === "increment") {
6861
- params.splice(offsetIndex, 1);
6862
- offset += 1;
6863
6903
  return `${snakeCase(key)} = ${snakeCase(key)} + 1`;
6864
6904
  }
6865
6905
  if (value?.__effect === "decrement") {
6866
- params.splice(offsetIndex, 1);
6867
- offset += 1;
6868
6906
  return `${snakeCase(key)} = ${snakeCase(key)} - 1`;
6869
6907
  }
6870
6908
  if (value?.__effect === "set") {
6871
- params.splice(offsetIndex, 1);
6872
- offset += 1;
6873
6909
  return `${snakeCase(key)} = ${value.__value}`;
6874
6910
  }
6875
- return `${snakeCase(key)} = $${offsetIndex + 1}`;
6911
+ params.push(
6912
+ serializeFieldValueForQuery(
6913
+ value,
6914
+ this.getFieldDefinitionForKey(tableFields, key)
6915
+ )
6916
+ );
6917
+ return `${snakeCase(key)} = $${params.length}`;
6876
6918
  }).join(", ");
6877
6919
  const whereClause = this.buildWhereClause(filter, params);
6878
6920
  const sql = `UPDATE ${tableName} SET ${setClause} ${whereClause} RETURNING *`;
@@ -6961,7 +7003,7 @@ var DatabaseController = class _DatabaseController {
6961
7003
  retryDelayFactor: Number.isFinite(durableState.safetyPolicy?.retryDelayFactor) ? Math.max(1, Number(durableState.safetyPolicy?.retryDelayFactor)) : 1
6962
7004
  };
6963
7005
  }
6964
- buildOnConflictClause(onConflict, params) {
7006
+ buildOnConflictClause(onConflict, params, tableFields) {
6965
7007
  const { target, action } = onConflict;
6966
7008
  let sql = ` ON CONFLICT (${target.map(snakeCase).join(", ")})`;
6967
7009
  if (action.do === "update") {
@@ -6972,7 +7014,12 @@ var DatabaseController = class _DatabaseController {
6972
7014
  if (typeof value === "string" && value === "excluded") {
6973
7015
  return `${snakeCase(field)} = excluded.${snakeCase(field)}`;
6974
7016
  }
6975
- params.push(value);
7017
+ params.push(
7018
+ serializeFieldValueForQuery(
7019
+ value,
7020
+ this.getFieldDefinitionForKey(tableFields, field)
7021
+ )
7022
+ );
6976
7023
  return `${snakeCase(field)} = $${params.length}`;
6977
7024
  });
6978
7025
  sql += ` DO UPDATE SET ${assignments.join(", ")}`;
@@ -6984,6 +7031,9 @@ var DatabaseController = class _DatabaseController {
6984
7031
  sql += " DO NOTHING";
6985
7032
  return sql;
6986
7033
  }
7034
+ getFieldDefinitionForKey(fields, key) {
7035
+ return fields[key] ?? fields[snakeCase(key)];
7036
+ }
6987
7037
  /**
6988
7038
  * Validates database schema structure and content.
6989
7039
  */
@@ -7605,7 +7655,13 @@ var DatabaseController = class _DatabaseController {
7605
7655
  );
7606
7656
  const row = ensurePlainObject(resolvedData, "sub-operation insert data");
7607
7657
  const keys = Object.keys(row);
7608
- const params = Object.values(row);
7658
+ const tableFields = registration.schema.tables[operation.table]?.fields ?? {};
7659
+ const params = keys.map(
7660
+ (key) => serializeFieldValueForQuery(
7661
+ row[key],
7662
+ this.getFieldDefinitionForKey(tableFields, key)
7663
+ )
7664
+ );
7609
7665
  const sql2 = `INSERT INTO ${operation.table} (${keys.map((key) => snakeCase(key)).join(", ")}) VALUES (${params.map((_, index) => `$${index + 1}`).join(", ")}) ON CONFLICT DO NOTHING RETURNING ${operation.return ?? "*"}`;
7610
7666
  const result2 = await this.withTimeout(
7611
7667
  () => client.query(sql2, params),
@@ -7955,7 +8011,7 @@ function tableFieldTypeToSchemaType(type) {
7955
8011
  }
7956
8012
 
7957
8013
  // src/Cadenza.ts
7958
- import { v4 as uuid3 } from "uuid";
8014
+ import { v4 as uuid4 } from "uuid";
7959
8015
 
7960
8016
  // src/graph/controllers/GraphSyncController.ts
7961
8017
  var ACTOR_TASK_METADATA = /* @__PURE__ */ Symbol.for("@cadenza.io/core/actor-task-meta");
@@ -8017,10 +8073,29 @@ function buildActorRegistrationData(actor) {
8017
8073
  version: 1
8018
8074
  };
8019
8075
  }
8076
+ function resolveSyncServiceName(task) {
8077
+ const taskServiceName = typeof task?.serviceName === "string" ? task.serviceName.trim() : "";
8078
+ const registryServiceName = typeof CadenzaService.serviceRegistry.serviceName === "string" ? CadenzaService.serviceRegistry.serviceName.trim() : "";
8079
+ return taskServiceName || registryServiceName || void 0;
8080
+ }
8081
+ function buildIntentRegistryData(intent) {
8082
+ const name = String(intent?.name ?? "").trim();
8083
+ if (!name) {
8084
+ return null;
8085
+ }
8086
+ return {
8087
+ name,
8088
+ description: typeof intent?.description === "string" ? intent.description : "",
8089
+ input: intent?.input && typeof intent.input === "object" ? intent.input : { type: "object" },
8090
+ output: intent?.output && typeof intent.output === "object" ? intent.output : { type: "object" },
8091
+ isMeta: isMetaIntentName(name)
8092
+ };
8093
+ }
8020
8094
  var GraphSyncController = class _GraphSyncController {
8021
8095
  constructor() {
8022
8096
  this.registeredActors = /* @__PURE__ */ new Set();
8023
8097
  this.registeredActorTaskMaps = /* @__PURE__ */ new Set();
8098
+ this.registeredIntentDefinitions = /* @__PURE__ */ new Set();
8024
8099
  this.isCadenzaDBReady = false;
8025
8100
  }
8026
8101
  static get instance() {
@@ -8028,11 +8103,27 @@ var GraphSyncController = class _GraphSyncController {
8028
8103
  return this._instance;
8029
8104
  }
8030
8105
  init() {
8106
+ const insertIntentRegistryTask = this.isCadenzaDBReady ? CadenzaService.createCadenzaDBInsertTask(
8107
+ "intent_registry",
8108
+ {
8109
+ onConflict: {
8110
+ target: ["name"],
8111
+ action: {
8112
+ do: "nothing"
8113
+ }
8114
+ }
8115
+ },
8116
+ { concurrency: 30 }
8117
+ ) : CadenzaService.get("dbInsertIntentRegistry");
8031
8118
  this.splitRoutinesTask = CadenzaService.createMetaTask(
8032
8119
  "Split routines for registration",
8033
8120
  async function* (ctx, emit) {
8034
8121
  const { routines } = ctx;
8035
8122
  if (!routines) return;
8123
+ const serviceName = resolveSyncServiceName();
8124
+ if (!serviceName) {
8125
+ return;
8126
+ }
8036
8127
  CadenzaService.debounce("meta.sync_controller.synced_resource", {
8037
8128
  delayMs: 2e3
8038
8129
  });
@@ -8043,7 +8134,7 @@ var GraphSyncController = class _GraphSyncController {
8043
8134
  name: routine.name,
8044
8135
  version: routine.version,
8045
8136
  description: routine.description,
8046
- serviceName: CadenzaService.serviceRegistry.serviceName,
8137
+ serviceName,
8047
8138
  isMeta: routine.isMeta
8048
8139
  },
8049
8140
  __routineName: routine.name
@@ -8085,6 +8176,10 @@ var GraphSyncController = class _GraphSyncController {
8085
8176
  function* (ctx) {
8086
8177
  const { routines } = ctx;
8087
8178
  if (!routines) return;
8179
+ const serviceName = resolveSyncServiceName();
8180
+ if (!serviceName) {
8181
+ return;
8182
+ }
8088
8183
  CadenzaService.debounce("meta.sync_controller.synced_resource", {
8089
8184
  delayMs: 3e3
8090
8185
  });
@@ -8104,7 +8199,7 @@ var GraphSyncController = class _GraphSyncController {
8104
8199
  taskVersion: nextTask.version,
8105
8200
  routineName: routine.name,
8106
8201
  routineVersion: routine.version,
8107
- serviceName: CadenzaService.serviceRegistry.serviceName
8202
+ serviceName
8108
8203
  },
8109
8204
  __routineName: routine.name,
8110
8205
  __taskName: nextTask.name
@@ -8207,6 +8302,10 @@ var GraphSyncController = class _GraphSyncController {
8207
8302
  delayMs: 3e3
8208
8303
  });
8209
8304
  const tasks = ctx.tasks;
8305
+ const serviceName = resolveSyncServiceName();
8306
+ if (!serviceName) {
8307
+ return;
8308
+ }
8210
8309
  for (const task of tasks) {
8211
8310
  if (task.registered) continue;
8212
8311
  const { __functionString, __getTagCallback } = task.export();
@@ -8236,7 +8335,7 @@ var GraphSyncController = class _GraphSyncController {
8236
8335
  retryDelay: task.retryDelay,
8237
8336
  retryDelayMax: task.retryDelayMax,
8238
8337
  retryDelayFactor: task.retryDelayFactor,
8239
- service_name: CadenzaService.serviceRegistry.serviceName,
8338
+ service_name: serviceName,
8240
8339
  signals: {
8241
8340
  emits: Array.from(task.emitsSignals),
8242
8341
  signalsToEmitAfter: Array.from(task.signalsToEmitAfter),
@@ -8284,11 +8383,15 @@ var GraphSyncController = class _GraphSyncController {
8284
8383
  CadenzaService.debounce("meta.sync_controller.synced_resource", {
8285
8384
  delayMs: 3e3
8286
8385
  });
8386
+ const serviceName = resolveSyncServiceName();
8387
+ if (!serviceName) {
8388
+ return;
8389
+ }
8287
8390
  const actors = ctx.actors ?? [];
8288
8391
  for (const actor of actors) {
8289
8392
  const data = {
8290
8393
  ...buildActorRegistrationData(actor),
8291
- service_name: CadenzaService.serviceRegistry.serviceName
8394
+ service_name: serviceName
8292
8395
  };
8293
8396
  if (!data.name) {
8294
8397
  continue;
@@ -8344,7 +8447,11 @@ var GraphSyncController = class _GraphSyncController {
8344
8447
  if (!metadata?.actorName) {
8345
8448
  return;
8346
8449
  }
8347
- const registrationKey = `${metadata.actorName}|${task.name}|${task.version}|${CadenzaService.serviceRegistry.serviceName}`;
8450
+ const serviceName = resolveSyncServiceName(task);
8451
+ if (!serviceName) {
8452
+ return;
8453
+ }
8454
+ const registrationKey = `${metadata.actorName}|${task.name}|${task.version}|${serviceName}`;
8348
8455
  if (this.registeredActorTaskMaps.has(registrationKey)) {
8349
8456
  return;
8350
8457
  }
@@ -8354,7 +8461,7 @@ var GraphSyncController = class _GraphSyncController {
8354
8461
  actor_version: 1,
8355
8462
  task_name: task.name,
8356
8463
  task_version: task.version,
8357
- service_name: CadenzaService.serviceRegistry.serviceName,
8464
+ service_name: serviceName,
8358
8465
  mode: metadata.mode,
8359
8466
  description: task.description ?? metadata.actorDescription ?? "",
8360
8467
  is_meta: metadata.actorKind === "meta" || task.isMeta === true
@@ -8409,6 +8516,10 @@ var GraphSyncController = class _GraphSyncController {
8409
8516
  function* (ctx) {
8410
8517
  const task = ctx.task;
8411
8518
  if (task.hidden || !task.register) return;
8519
+ const serviceName = resolveSyncServiceName(task);
8520
+ if (!serviceName) {
8521
+ return;
8522
+ }
8412
8523
  for (const signal of task.observedSignals) {
8413
8524
  const _signal = signal.split(":")[0];
8414
8525
  if (task.registeredSignals.has(signal)) continue;
@@ -8419,7 +8530,7 @@ var GraphSyncController = class _GraphSyncController {
8419
8530
  isGlobal,
8420
8531
  taskName: task.name,
8421
8532
  taskVersion: task.version,
8422
- serviceName: CadenzaService.serviceRegistry.serviceName
8533
+ serviceName
8423
8534
  },
8424
8535
  __taskName: task.name,
8425
8536
  __signal: signal
@@ -8445,6 +8556,46 @@ var GraphSyncController = class _GraphSyncController {
8445
8556
  { concurrency: 30 }
8446
8557
  ) : CadenzaService.get("dbInsertSignalToTaskMap"))?.then(registerSignalTask)
8447
8558
  );
8559
+ this.splitIntentsTask = CadenzaService.createMetaTask(
8560
+ "Split intents for registration",
8561
+ function* (ctx) {
8562
+ CadenzaService.debounce("meta.sync_controller.synced_resource", {
8563
+ delayMs: 3e3
8564
+ });
8565
+ const intents = Array.isArray(ctx.intents) ? ctx.intents : Array.from(CadenzaService.inquiryBroker.intents.values());
8566
+ for (const intent of intents) {
8567
+ const intentData = buildIntentRegistryData(intent);
8568
+ if (!intentData) {
8569
+ continue;
8570
+ }
8571
+ if (this.registeredIntentDefinitions.has(intentData.name)) {
8572
+ continue;
8573
+ }
8574
+ yield {
8575
+ data: intentData,
8576
+ __intentName: intentData.name
8577
+ };
8578
+ }
8579
+ }.bind(this)
8580
+ ).then(
8581
+ insertIntentRegistryTask?.then(
8582
+ CadenzaService.createMetaTask("Record intent definition registration", (ctx) => {
8583
+ if (!ctx.__syncing) {
8584
+ return;
8585
+ }
8586
+ CadenzaService.debounce("meta.sync_controller.synced_resource", {
8587
+ delayMs: 3e3
8588
+ });
8589
+ this.registeredIntentDefinitions.add(ctx.__intentName);
8590
+ return true;
8591
+ }).then(
8592
+ CadenzaService.createUniqueMetaTask(
8593
+ "Gather intent registration",
8594
+ () => true
8595
+ ).emits("meta.sync_controller.synced_intents")
8596
+ )
8597
+ )
8598
+ );
8448
8599
  const registerIntentTask = CadenzaService.createMetaTask(
8449
8600
  "Record intent registration",
8450
8601
  (ctx) => {
@@ -8464,6 +8615,10 @@ var GraphSyncController = class _GraphSyncController {
8464
8615
  function* (ctx) {
8465
8616
  const task = ctx.task;
8466
8617
  if (task.hidden || !task.register) return;
8618
+ const serviceName = resolveSyncServiceName(task);
8619
+ if (!serviceName) {
8620
+ return;
8621
+ }
8467
8622
  task.__registeredIntents = task.__registeredIntents ?? /* @__PURE__ */ new Set();
8468
8623
  task.__invalidMetaIntentWarnings = task.__invalidMetaIntentWarnings ?? /* @__PURE__ */ new Set();
8469
8624
  for (const intent of task.handlesIntents) {
@@ -8483,36 +8638,75 @@ var GraphSyncController = class _GraphSyncController {
8483
8638
  }
8484
8639
  continue;
8485
8640
  }
8641
+ const intentDefinition = buildIntentRegistryData(CadenzaService.inquiryBroker.intents.get(intent)) ?? buildIntentRegistryData({ name: intent });
8642
+ if (!intentDefinition) {
8643
+ continue;
8644
+ }
8486
8645
  yield {
8487
8646
  data: {
8488
8647
  intentName: intent,
8489
8648
  taskName: task.name,
8490
8649
  taskVersion: task.version,
8491
- serviceName: CadenzaService.serviceRegistry.serviceName
8650
+ serviceName
8492
8651
  },
8493
8652
  __taskName: task.name,
8494
- __intent: intent
8653
+ __intent: intent,
8654
+ __intentDefinition: intentDefinition,
8655
+ __intentMapData: {
8656
+ intentName: intent,
8657
+ taskName: task.name,
8658
+ taskVersion: task.version,
8659
+ serviceName
8660
+ }
8495
8661
  };
8496
8662
  }
8497
8663
  }
8498
8664
  ).then(
8499
- (this.isCadenzaDBReady ? CadenzaService.createCadenzaDBInsertTask(
8500
- "intent_to_task_map",
8501
- {
8502
- onConflict: {
8503
- target: [
8504
- "intent_name",
8505
- "task_name",
8506
- "task_version",
8507
- "service_name"
8508
- ],
8509
- action: {
8510
- do: "nothing"
8511
- }
8665
+ CadenzaService.createMetaTask(
8666
+ "Prepare intent definition for intent-to-task map",
8667
+ (ctx) => {
8668
+ if (!ctx.__intentDefinition || !ctx.__intentMapData) {
8669
+ return false;
8512
8670
  }
8513
- },
8514
- { concurrency: 30 }
8515
- ) : CadenzaService.get("dbInsertIntentToTaskMap"))?.then(registerIntentTask)
8671
+ return {
8672
+ ...ctx,
8673
+ data: ctx.__intentDefinition
8674
+ };
8675
+ }
8676
+ ).then(
8677
+ insertIntentRegistryTask?.then(
8678
+ CadenzaService.createMetaTask(
8679
+ "Restore intent-to-task map payload",
8680
+ (ctx) => {
8681
+ if (!ctx.__intentMapData) {
8682
+ return false;
8683
+ }
8684
+ return {
8685
+ ...ctx,
8686
+ data: ctx.__intentMapData
8687
+ };
8688
+ }
8689
+ ).then(
8690
+ (this.isCadenzaDBReady ? CadenzaService.createCadenzaDBInsertTask(
8691
+ "intent_to_task_map",
8692
+ {
8693
+ onConflict: {
8694
+ target: [
8695
+ "intent_name",
8696
+ "task_name",
8697
+ "task_version",
8698
+ "service_name"
8699
+ ],
8700
+ action: {
8701
+ do: "nothing"
8702
+ }
8703
+ }
8704
+ },
8705
+ { concurrency: 30 }
8706
+ ) : CadenzaService.get("dbInsertIntentToTaskMap"))?.then(registerIntentTask)
8707
+ )
8708
+ )
8709
+ )
8516
8710
  );
8517
8711
  this.registerTaskMapTask = CadenzaService.createMetaTask(
8518
8712
  "Register task map to DB",
@@ -8522,18 +8716,26 @@ var GraphSyncController = class _GraphSyncController {
8522
8716
  delayMs: 3e3
8523
8717
  });
8524
8718
  if (task.hidden || !task.register) return;
8719
+ const predecessorServiceName = resolveSyncServiceName(task);
8720
+ if (!predecessorServiceName) {
8721
+ return;
8722
+ }
8525
8723
  for (const t of task.nextTasks) {
8526
8724
  if (task.taskMapRegistration.has(t.name) || t.hidden || !t.register) {
8527
8725
  continue;
8528
8726
  }
8727
+ const serviceName = resolveSyncServiceName(t);
8728
+ if (!serviceName) {
8729
+ continue;
8730
+ }
8529
8731
  yield {
8530
8732
  data: {
8531
8733
  taskName: t.name,
8532
8734
  taskVersion: t.version,
8533
8735
  predecessorTaskName: task.name,
8534
8736
  predecessorTaskVersion: task.version,
8535
- serviceName: CadenzaService.serviceRegistry.serviceName,
8536
- predecessorServiceName: CadenzaService.serviceRegistry.serviceName
8737
+ serviceName,
8738
+ predecessorServiceName
8537
8739
  },
8538
8740
  __taskName: task.name,
8539
8741
  __nextTaskName: t.name
@@ -8580,14 +8782,19 @@ var GraphSyncController = class _GraphSyncController {
8580
8782
  if (task.hidden || !task.register) return;
8581
8783
  if (task.isDeputy && !task.signalName) {
8582
8784
  if (task.registeredDeputyMap) return;
8785
+ const serviceName = resolveSyncServiceName(task);
8786
+ const predecessorServiceName = resolveSyncServiceName();
8787
+ if (!serviceName || !predecessorServiceName) {
8788
+ return;
8789
+ }
8583
8790
  return {
8584
8791
  data: {
8585
8792
  task_name: task.remoteRoutineName,
8586
8793
  task_version: 1,
8587
- service_name: task.serviceName,
8794
+ service_name: serviceName,
8588
8795
  predecessor_task_name: task.name,
8589
8796
  predecessor_task_version: task.version,
8590
- predecessor_service_name: CadenzaService.serviceRegistry.serviceName
8797
+ predecessor_service_name: predecessorServiceName
8591
8798
  },
8592
8799
  __taskName: task.name
8593
8800
  };
@@ -8632,6 +8839,12 @@ var GraphSyncController = class _GraphSyncController {
8632
8839
  "meta.service_registry.initial_sync_complete"
8633
8840
  ).then(this.splitSignalsTask);
8634
8841
  CadenzaService.registry.getAllTasks.clone().doOn("meta.sync_controller.synced_signals").then(this.splitTasksForRegistration);
8842
+ CadenzaService.createMetaTask("Get all intents", (ctx) => {
8843
+ return {
8844
+ ...ctx,
8845
+ intents: Array.from(CadenzaService.inquiryBroker.intents.values())
8846
+ };
8847
+ }).doOn("meta.sync_controller.synced_tasks").then(this.splitIntentsTask);
8635
8848
  CadenzaService.registry.getAllRoutines.clone().doOn("meta.sync_controller.synced_tasks").then(this.splitRoutinesTask);
8636
8849
  CadenzaService.createMetaTask("Get all actors", (ctx) => {
8637
8850
  return {
@@ -8642,9 +8855,9 @@ var GraphSyncController = class _GraphSyncController {
8642
8855
  CadenzaService.registry.doForEachTask.clone().doOn("meta.sync_controller.synced_tasks").then(
8643
8856
  this.registerTaskMapTask,
8644
8857
  this.registerSignalToTaskMapTask,
8645
- this.registerIntentToTaskMapTask,
8646
8858
  this.registerDeputyRelationshipTask
8647
8859
  );
8860
+ CadenzaService.registry.doForEachTask.clone().doOn("meta.sync_controller.synced_tasks", "meta.sync_controller.synced_intents").then(this.registerIntentToTaskMapTask);
8648
8861
  CadenzaService.registry.doForEachTask.clone().doOn("meta.sync_controller.synced_tasks", "meta.sync_controller.synced_actors").then(this.registerActorTaskMapTask);
8649
8862
  CadenzaService.registry.getAllRoutines.clone().doOn("meta.sync_controller.synced_routines").then(this.splitTasksInRoutines);
8650
8863
  CadenzaService.createMetaTask("Finish sync", (ctx, emit) => {
@@ -8904,9 +9117,9 @@ var CadenzaService = class {
8904
9117
  static normalizeDeclaredTransports(transports, serviceId) {
8905
9118
  return (transports ?? []).map((transport) => normalizeServiceTransportConfig(transport)).filter(
8906
9119
  (transport) => !!transport
8907
- ).map((transport, index) => ({
9120
+ ).map((transport) => ({
8908
9121
  ...transport,
8909
- uuid: `${serviceId}-transport-${index + 1}`
9122
+ uuid: uuid4()
8910
9123
  }));
8911
9124
  }
8912
9125
  static createBootstrapTransport(serviceInstanceId, role, endpoint) {
@@ -9150,7 +9363,7 @@ var CadenzaService = class {
9150
9363
  }
9151
9364
  for (const responder of responders) {
9152
9365
  const { task, descriptor } = responder;
9153
- const inquiryId = uuid3();
9366
+ const inquiryId = uuid4();
9154
9367
  startTimeByTask.set(task, Date.now());
9155
9368
  const resolverTask = this.createEphemeralMetaTask(
9156
9369
  `Resolve inquiry ${inquiry} for ${descriptor.localTaskName}`,
@@ -9639,7 +9852,7 @@ var CadenzaService = class {
9639
9852
  this.bootstrap();
9640
9853
  this.validateName(serviceName);
9641
9854
  this.validateServiceName(serviceName);
9642
- const serviceId = options.customServiceId ?? uuid3();
9855
+ const serviceId = options.customServiceId ?? uuid4();
9643
9856
  this.serviceRegistry.serviceName = serviceName;
9644
9857
  this.serviceRegistry.serviceInstanceId = serviceId;
9645
9858
  this.setHydrationResults(options.hydration);
@@ -10470,7 +10683,7 @@ import {
10470
10683
  } from "@cadenza.io/core";
10471
10684
 
10472
10685
  // src/ssr/createSSRInquiryBridge.ts
10473
- import { v4 as uuid4 } from "uuid";
10686
+ import { v4 as uuid5 } from "uuid";
10474
10687
  function ensureFetch() {
10475
10688
  if (typeof globalThis.fetch !== "function") {
10476
10689
  throw new Error("SSR inquiry bridge requires global fetch support.");
@@ -10546,7 +10759,7 @@ function createSSRInquiryBridge(options = {}) {
10546
10759
  __remoteRoutineName: remoteRoutineName,
10547
10760
  __metadata: {
10548
10761
  ...context.__metadata ?? {},
10549
- __deputyExecId: uuid4()
10762
+ __deputyExecId: uuid5()
10550
10763
  }
10551
10764
  }),
10552
10765
  signal