@cadenza.io/service 2.17.79 → 2.18.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.mjs CHANGED
@@ -220,6 +220,13 @@ var DatabaseTask = class extends DeputyTask {
220
220
  const metadata = context.getMetadata();
221
221
  const dynamicQueryData = ctx.queryData ?? {};
222
222
  delete ctx.queryData;
223
+ const nextQueryData = {
224
+ ...this.queryData,
225
+ data: {
226
+ ...ctx.data
227
+ },
228
+ ...dynamicQueryData
229
+ };
223
230
  const deputyContext = {
224
231
  ...ctx,
225
232
  __localTaskName: this.name,
@@ -236,13 +243,13 @@ var DatabaseTask = class extends DeputyTask {
236
243
  __blockRemoteExecution: metadata.__blockRemoteExecution ?? ctx.__blockRemoteExecution ?? false,
237
244
  __deputyTaskName: this.name
238
245
  },
239
- queryData: {
240
- ...this.queryData,
241
- data: {
242
- ...ctx.data
243
- },
244
- ...dynamicQueryData
245
- }
246
+ data: nextQueryData.data ?? ctx.data,
247
+ batch: nextQueryData.batch ?? ctx.batch,
248
+ transaction: nextQueryData.transaction ?? ctx.transaction,
249
+ onConflict: Object.prototype.hasOwnProperty.call(nextQueryData, "onConflict") ? nextQueryData.onConflict : void 0,
250
+ filter: nextQueryData.filter ?? ctx.filter,
251
+ fields: nextQueryData.fields ?? ctx.fields,
252
+ queryData: nextQueryData
246
253
  };
247
254
  return this.taskFunction(deputyContext, emit, inquire, progressCallback);
248
255
  }
@@ -675,6 +682,8 @@ function hasSignificantRuntimeStatusChange(previous, next) {
675
682
 
676
683
  // src/registry/ServiceRegistry.ts
677
684
  var META_SERVICE_REGISTRY_FULL_SYNC_INTENT = "meta-service-registry-full-sync";
685
+ var CADENZA_DB_GATHERED_SYNC_SIGNAL = "global.meta.cadenza_db.gathered_sync_data";
686
+ var META_GATHERED_SYNC_TRANSMISSION_RECONCILE_SIGNAL = "meta.service_registry.gathered_sync_transmission_reconcile_requested";
678
687
  var META_RUNTIME_STATUS_HEARTBEAT_TICK_SIGNAL = "meta.service_registry.runtime_status.heartbeat_tick";
679
688
  var META_RUNTIME_STATUS_MONITOR_TICK_SIGNAL = "meta.service_registry.runtime_status.monitor_tick";
680
689
  var INTERNAL_RUNTIME_STATUS_TASK_NAMES = /* @__PURE__ */ new Set([
@@ -762,18 +771,6 @@ function normalizeServiceRegistryInsertResult(tableName, ctx, queryData, rawResu
762
771
  }
763
772
  return result;
764
773
  }
765
- function shouldTraceIotDbRegistryPath(localServiceName, targetServiceName) {
766
- return targetServiceName === "IotDbService" && localServiceName !== "IotDbService";
767
- }
768
- function summarizeTransportDescriptors(transports) {
769
- return transports.map((transport) => ({
770
- uuid: transport.uuid,
771
- serviceInstanceId: transport.serviceInstanceId,
772
- role: transport.role,
773
- origin: transport.origin,
774
- protocols: transport.protocols
775
- }));
776
- }
777
774
  function resolveServiceRegistryInsertTask(tableName, queryData = {}, options = {}) {
778
775
  const remoteInsertTask = CadenzaService.createCadenzaDBInsertTask(
779
776
  tableName,
@@ -790,6 +787,10 @@ function resolveServiceRegistryInsertTask(tableName, queryData = {}, options = {
790
787
  const nextQueryData = buildServiceRegistryInsertQueryData(ctx, queryData);
791
788
  const delegationContext = ensureDelegationContextMetadata({
792
789
  ...ctx,
790
+ data: nextQueryData.data !== void 0 ? nextQueryData.data : ctx.data,
791
+ batch: nextQueryData.batch !== void 0 ? nextQueryData.batch : ctx.batch,
792
+ onConflict: Object.prototype.hasOwnProperty.call(nextQueryData, "onConflict") ? nextQueryData.onConflict : void 0,
793
+ transaction: nextQueryData.transaction !== void 0 ? nextQueryData.transaction : ctx.transaction,
793
794
  queryData: nextQueryData
794
795
  });
795
796
  delegationContext.__metadata.__skipRemoteExecution = delegationContext.__metadata.__skipRemoteExecution ?? delegationContext.__skipRemoteExecution ?? false;
@@ -913,6 +914,7 @@ var ServiceRegistry = class _ServiceRegistry {
913
914
  this.deputies = /* @__PURE__ */ new Map();
914
915
  this.remoteSignals = /* @__PURE__ */ new Map();
915
916
  this.remoteIntents = /* @__PURE__ */ new Map();
917
+ this.gatheredSyncTransmissionServices = /* @__PURE__ */ new Set();
916
918
  this.remoteIntentDeputiesByKey = /* @__PURE__ */ new Map();
917
919
  this.remoteIntentDeputiesByTask = /* @__PURE__ */ new Map();
918
920
  this.dependeesByService = /* @__PURE__ */ new Map();
@@ -1164,21 +1166,6 @@ var ServiceRegistry = class _ServiceRegistry {
1164
1166
  trackedInstance.acceptingWork = snapshot.acceptingWork;
1165
1167
  trackedInstance.reportedAt = trackedInstance.reportedAt ?? (/* @__PURE__ */ new Date()).toISOString();
1166
1168
  }
1167
- if (shouldTraceIotDbRegistryPath(this.serviceName, serviceName)) {
1168
- console.log("[CADENZA_REGISTRY_DEBUG] handle_instance_update", {
1169
- localServiceName: this.serviceName,
1170
- localServiceInstanceId: this.serviceInstanceId,
1171
- targetServiceName: serviceName,
1172
- targetServiceInstanceId: uuid8,
1173
- existingInstance: !!existing,
1174
- deleted,
1175
- remoteInterest: this.deputies.has(serviceName) || this.remoteIntents.has(serviceName) || this.remoteSignals.has(serviceName),
1176
- hasDeputies: this.deputies.has(serviceName),
1177
- hasRemoteIntents: this.remoteIntents.has(serviceName),
1178
- hasRemoteSignals: this.remoteSignals.has(serviceName),
1179
- transports: trackedInstance ? summarizeTransportDescriptors(trackedInstance.transports) : []
1180
- });
1181
- }
1182
1169
  if (!serviceInstance.isBootstrapPlaceholder) {
1183
1170
  this.reconcileBootstrapPlaceholderInstance(serviceName, uuid8, emit);
1184
1171
  }
@@ -1191,7 +1178,8 @@ var ServiceRegistry = class _ServiceRegistry {
1191
1178
  if (this.deputies.has(serviceName) || this.remoteIntents.has(serviceName) || this.remoteSignals.has(serviceName)) {
1192
1179
  const connected = this.ensureDependeeClientForInstance(
1193
1180
  trackedInstance,
1194
- emit
1181
+ emit,
1182
+ ctx
1195
1183
  );
1196
1184
  if (!connected) {
1197
1185
  emit("meta.service_registry.routeable_transport_missing", {
@@ -1234,27 +1222,6 @@ var ServiceRegistry = class _ServiceRegistry {
1234
1222
  break;
1235
1223
  }
1236
1224
  }
1237
- if (shouldTraceIotDbRegistryPath(
1238
- this.serviceName,
1239
- ownerInstance?.serviceName ?? ctx.serviceName ?? void 0
1240
- )) {
1241
- console.log("[CADENZA_REGISTRY_DEBUG] handle_transport_update", {
1242
- localServiceName: this.serviceName,
1243
- localServiceInstanceId: this.serviceInstanceId,
1244
- transport: {
1245
- uuid: transport.uuid,
1246
- serviceInstanceId: transport.serviceInstanceId,
1247
- role: transport.role,
1248
- origin: transport.origin,
1249
- protocols: transport.protocols,
1250
- deleted: transport.deleted
1251
- },
1252
- ownerFound: !!ownerInstance,
1253
- ownerServiceName: ownerInstance?.serviceName,
1254
- ownerInstanceId: ownerInstance?.uuid,
1255
- ownerTransports: ownerInstance ? summarizeTransportDescriptors(ownerInstance.transports) : []
1256
- });
1257
- }
1258
1225
  if (!ownerInstance) {
1259
1226
  return false;
1260
1227
  }
@@ -1280,7 +1247,7 @@ var ServiceRegistry = class _ServiceRegistry {
1280
1247
  if (!hasRemoteInterest) {
1281
1248
  return true;
1282
1249
  }
1283
- this.ensureDependeeClientForInstance(ownerInstance, emit);
1250
+ this.ensureDependeeClientForInstance(ownerInstance, emit, ctx);
1284
1251
  return true;
1285
1252
  },
1286
1253
  "Handles service transport updates independently from instance rows."
@@ -1310,29 +1277,12 @@ var ServiceRegistry = class _ServiceRegistry {
1310
1277
  "Tracks remote dependency instances for runtime heartbeat monitoring."
1311
1278
  ).doOn("meta.service_registry.dependee_registered");
1312
1279
  const normalizeServiceInstancesFromSync = (ctx) => this.normalizeServiceInstancesFromSync(ctx);
1313
- const getLocalTraceContext = () => ({
1314
- localServiceName: this.serviceName,
1315
- localServiceInstanceId: this.serviceInstanceId
1316
- });
1317
1280
  CadenzaService.createMetaTask("Split service instances", function* (ctx) {
1318
1281
  const serviceInstances = normalizeServiceInstancesFromSync(ctx);
1319
1282
  if (serviceInstances.length === 0) {
1320
1283
  return;
1321
1284
  }
1322
1285
  for (const serviceInstance of serviceInstances) {
1323
- const { localServiceName, localServiceInstanceId } = getLocalTraceContext();
1324
- if (shouldTraceIotDbRegistryPath(
1325
- localServiceName,
1326
- serviceInstance.serviceName
1327
- )) {
1328
- console.log("[CADENZA_REGISTRY_DEBUG] split_service_instance", {
1329
- localServiceName,
1330
- localServiceInstanceId,
1331
- targetServiceName: serviceInstance.serviceName,
1332
- targetServiceInstanceId: serviceInstance.uuid,
1333
- transports: summarizeTransportDescriptors(serviceInstance.transports)
1334
- });
1335
- }
1336
1286
  yield { serviceInstance };
1337
1287
  }
1338
1288
  }).doOn(
@@ -1378,6 +1328,15 @@ var ServiceRegistry = class _ServiceRegistry {
1378
1328
  },
1379
1329
  "Handles registration of remote signals"
1380
1330
  ).emits("meta.service_registry.registered_global_signals").doOn("global.meta.cadenza_db.gathered_sync_data");
1331
+ this.reconcileGatheredSyncTransmissionsTask = CadenzaService.createMetaTask(
1332
+ "Reconcile gathered sync signal transmissions",
1333
+ (ctx, emit) => this.reconcileGatheredSyncTransmissions(ctx, emit),
1334
+ "Keeps gathered sync transmitters aligned with known remote service instances."
1335
+ ).doOn(
1336
+ CADENZA_DB_GATHERED_SYNC_SIGNAL,
1337
+ META_GATHERED_SYNC_TRANSMISSION_RECONCILE_SIGNAL,
1338
+ "meta.service_registry.service_discovered"
1339
+ );
1381
1340
  this.handleGlobalIntentRegistrationTask = CadenzaService.createMetaTask(
1382
1341
  "Handle global intent registration",
1383
1342
  (ctx, emit) => {
@@ -1388,15 +1347,19 @@ var ServiceRegistry = class _ServiceRegistry {
1388
1347
  return 0;
1389
1348
  });
1390
1349
  for (const map of sorted) {
1391
- if (map.deleted) {
1392
- this.unregisterRemoteIntentDeputy(map);
1393
- continue;
1350
+ try {
1351
+ if (map.deleted) {
1352
+ this.unregisterRemoteIntentDeputy(map);
1353
+ continue;
1354
+ }
1355
+ CadenzaService.inquiryBroker.addIntent({
1356
+ name: map.intentName
1357
+ });
1358
+ this.registerRemoteIntentDeputy(map);
1359
+ this.ensureDependeeClientsForService(map.serviceName, emit);
1360
+ } catch (error) {
1361
+ throw error;
1394
1362
  }
1395
- CadenzaService.inquiryBroker.addIntent({
1396
- name: map.intentName
1397
- });
1398
- this.registerRemoteIntentDeputy(map);
1399
- this.ensureDependeeClientsForService(map.serviceName, emit);
1400
1363
  }
1401
1364
  return true;
1402
1365
  },
@@ -1548,7 +1511,7 @@ var ServiceRegistry = class _ServiceRegistry {
1548
1511
  {
1549
1512
  uuid: report.transportId,
1550
1513
  serviceInstanceId: report.serviceInstanceId,
1551
- role: this.getRoutingTransportRole(),
1514
+ role: report.transportRole ?? this.getRoutingTransportRole(),
1552
1515
  origin: report.transportOrigin,
1553
1516
  protocols: report.transportProtocols && report.transportProtocols.length > 0 ? report.transportProtocols : ["rest", "socket"],
1554
1517
  securityProfile: null,
@@ -1590,21 +1553,6 @@ var ServiceRegistry = class _ServiceRegistry {
1590
1553
  const serviceInstances = this.normalizeServiceInstancesFromSync(
1591
1554
  inquiryResult
1592
1555
  );
1593
- if (shouldTraceIotDbRegistryPath(this.serviceName, "IotDbService")) {
1594
- const tracedInstances = serviceInstances.filter((instance) => instance.serviceName === "IotDbService").map((instance) => ({
1595
- uuid: instance.uuid,
1596
- isActive: instance.isActive,
1597
- isNonResponsive: instance.isNonResponsive,
1598
- isBlocked: instance.isBlocked,
1599
- transports: summarizeTransportDescriptors(instance.transports)
1600
- }));
1601
- console.log("[CADENZA_REGISTRY_DEBUG] full_sync_instances", {
1602
- localServiceName: this.serviceName,
1603
- localServiceInstanceId: this.serviceInstanceId,
1604
- totalServiceInstances: serviceInstances.length,
1605
- tracedInstances
1606
- });
1607
- }
1608
1556
  return {
1609
1557
  ...ctx,
1610
1558
  signalToTaskMaps,
@@ -1701,44 +1649,6 @@ var ServiceRegistry = class _ServiceRegistry {
1701
1649
  let retries = __retries ?? 0;
1702
1650
  let triedInstances = __triedInstances ?? [];
1703
1651
  const preferredRole = this.getRoutingTransportRole();
1704
- const allInstances = this.instances.get(__serviceName) ?? [];
1705
- const candidateDiagnostics = shouldTraceIotDbRegistryPath(
1706
- this.serviceName,
1707
- __serviceName ?? void 0
1708
- ) ? allInstances.map((instance) => ({
1709
- uuid: instance.uuid,
1710
- isActive: instance.isActive,
1711
- isNonResponsive: instance.isNonResponsive,
1712
- isBlocked: instance.isBlocked,
1713
- isFrontend: instance.isFrontend,
1714
- transports: summarizeTransportDescriptors(instance.transports),
1715
- selectedTransport: instance.isFrontend ? null : this.selectTransportForInstance(
1716
- instance,
1717
- context,
1718
- preferredRole
1719
- ) ? {
1720
- uuid: this.selectTransportForInstance(
1721
- instance,
1722
- context,
1723
- preferredRole
1724
- ).uuid,
1725
- role: this.selectTransportForInstance(
1726
- instance,
1727
- context,
1728
- preferredRole
1729
- ).role,
1730
- origin: this.selectTransportForInstance(
1731
- instance,
1732
- context,
1733
- preferredRole
1734
- ).origin,
1735
- protocols: this.selectTransportForInstance(
1736
- instance,
1737
- context,
1738
- preferredRole
1739
- ).protocols
1740
- } : null
1741
- })) : void 0;
1742
1652
  const instances = this.instances.get(__serviceName)?.filter((instance) => {
1743
1653
  if (targetServiceInstanceId && instance.uuid !== targetServiceInstanceId) {
1744
1654
  return false;
@@ -1771,20 +1681,6 @@ var ServiceRegistry = class _ServiceRegistry {
1771
1681
  }
1772
1682
  return (a.numberOfRunningGraphs ?? 0) - (b.numberOfRunningGraphs ?? 0);
1773
1683
  });
1774
- if (candidateDiagnostics) {
1775
- console.log("[CADENZA_REGISTRY_DEBUG] get_balanced_instance", {
1776
- localServiceName: this.serviceName,
1777
- localServiceInstanceId: this.serviceInstanceId,
1778
- targetServiceName: __serviceName,
1779
- preferredRole,
1780
- useSocket: this.useSocket,
1781
- targetServiceInstanceId,
1782
- retries,
1783
- triedInstances,
1784
- candidateDiagnostics,
1785
- filteredInstanceIds: instances?.map((instance) => instance.uuid) ?? []
1786
- });
1787
- }
1788
1684
  if (!instances || instances.length === 0 || retries > this.retryCount) {
1789
1685
  context.errored = true;
1790
1686
  context.__error = this.isFrontend && preferredRole === "public" ? `No public transport available for ${__serviceName}.` : `No routeable ${preferredRole} transport available for ${__serviceName}. Retries: ${retries}.`;
@@ -2042,6 +1938,7 @@ var ServiceRegistry = class _ServiceRegistry {
2042
1938
  serviceName: report.serviceName,
2043
1939
  serviceInstanceId: report.serviceInstanceId,
2044
1940
  transportId: report.transportId,
1941
+ transportRole: report.transportRole,
2045
1942
  transportOrigin: report.transportOrigin,
2046
1943
  transportProtocols: report.transportProtocols,
2047
1944
  isFrontend: report.isFrontend,
@@ -2658,6 +2555,64 @@ var ServiceRegistry = class _ServiceRegistry {
2658
2555
  (instance) => !!instance && !!instance.isActive && !instance.isNonResponsive && !instance.isBlocked
2659
2556
  );
2660
2557
  }
2558
+ shouldReconcileGatheredSyncTransmissions() {
2559
+ return this.serviceName === "CadenzaDB";
2560
+ }
2561
+ collectGatheredSyncTransmissionRecipients(ctx) {
2562
+ const recipients = /* @__PURE__ */ new Set();
2563
+ const addRecipient = (serviceName) => {
2564
+ const normalizedServiceName = String(serviceName ?? "").trim();
2565
+ if (!normalizedServiceName || normalizedServiceName === this.serviceName) {
2566
+ return;
2567
+ }
2568
+ recipients.add(normalizedServiceName);
2569
+ };
2570
+ addRecipient(ctx.serviceName ?? ctx.__serviceName);
2571
+ for (const instance of this.normalizeServiceInstancesFromSync(ctx)) {
2572
+ addRecipient(instance.serviceName);
2573
+ }
2574
+ for (const [serviceName, instances] of this.instances.entries()) {
2575
+ if (!instances?.length) {
2576
+ continue;
2577
+ }
2578
+ addRecipient(serviceName);
2579
+ }
2580
+ return recipients;
2581
+ }
2582
+ reconcileGatheredSyncTransmissions(ctx, emit) {
2583
+ if (!this.shouldReconcileGatheredSyncTransmissions()) {
2584
+ return false;
2585
+ }
2586
+ const desiredRecipients = this.collectGatheredSyncTransmissionRecipients(ctx);
2587
+ const createdRecipients = [];
2588
+ for (const serviceName of desiredRecipients) {
2589
+ if (this.gatheredSyncTransmissionServices.has(serviceName)) {
2590
+ continue;
2591
+ }
2592
+ CadenzaService.createSignalTransmissionTask(
2593
+ CADENZA_DB_GATHERED_SYNC_SIGNAL,
2594
+ serviceName
2595
+ );
2596
+ this.gatheredSyncTransmissionServices.add(serviceName);
2597
+ createdRecipients.push(serviceName);
2598
+ }
2599
+ for (const serviceName of Array.from(this.gatheredSyncTransmissionServices)) {
2600
+ if (desiredRecipients.has(serviceName)) {
2601
+ continue;
2602
+ }
2603
+ CadenzaService.get(
2604
+ `Transmit signal: ${CADENZA_DB_GATHERED_SYNC_SIGNAL} to ${serviceName}`
2605
+ )?.destroy();
2606
+ this.gatheredSyncTransmissionServices.delete(serviceName);
2607
+ }
2608
+ if (createdRecipients.length > 0 && ctx.__signalName === CADENZA_DB_GATHERED_SYNC_SIGNAL) {
2609
+ emit("meta.cadenza_db.sync_tick", {
2610
+ __syncing: true,
2611
+ __reason: "gathered_sync_transmissions_reconciled"
2612
+ });
2613
+ }
2614
+ return createdRecipients.length > 0 || this.gatheredSyncTransmissionServices.size > 0;
2615
+ }
2661
2616
  registerRemoteIntentDeputy(map) {
2662
2617
  if (!this.serviceName || map.serviceName === this.serviceName) {
2663
2618
  return;
@@ -2900,38 +2855,18 @@ var ServiceRegistry = class _ServiceRegistry {
2900
2855
  }
2901
2856
  return communicationTypes;
2902
2857
  }
2903
- ensureDependeeClientForInstance(instance, emit) {
2858
+ ensureDependeeClientForInstance(instance, emit, ctx) {
2904
2859
  if (!instance || instance.uuid === this.serviceInstanceId || instance.isFrontend || !instance.isActive || instance.isNonResponsive || instance.isBlocked) {
2905
2860
  return false;
2906
2861
  }
2907
2862
  if (!this.deputies.has(instance.serviceName) && !this.remoteIntents.has(instance.serviceName) && !this.remoteSignals.has(instance.serviceName)) {
2908
2863
  return false;
2909
2864
  }
2910
- const transport = this.getRouteableTransport(
2865
+ const transport = this.selectTransportForInstance(
2911
2866
  instance,
2912
- this.useSocket ? "socket" : "rest"
2913
- );
2914
- if (shouldTraceIotDbRegistryPath(this.serviceName, instance.serviceName)) {
2915
- console.log("[CADENZA_REGISTRY_DEBUG] ensure_dependee_client_for_instance", {
2916
- localServiceName: this.serviceName,
2917
- localServiceInstanceId: this.serviceInstanceId,
2918
- targetServiceName: instance.serviceName,
2919
- targetServiceInstanceId: instance.uuid,
2920
- useSocket: this.useSocket,
2921
- routeableRole: this.getRoutingTransportRole(),
2922
- hasDeputies: this.deputies.has(instance.serviceName),
2923
- hasRemoteIntents: this.remoteIntents.has(instance.serviceName),
2924
- hasRemoteSignals: this.remoteSignals.has(instance.serviceName),
2925
- clientCreatedTransportIds: instance.clientCreatedTransportIds ?? [],
2926
- transports: summarizeTransportDescriptors(instance.transports),
2927
- selectedTransport: transport ? {
2928
- uuid: transport.uuid,
2929
- role: transport.role,
2930
- origin: transport.origin,
2931
- protocols: transport.protocols
2932
- } : null
2933
- });
2934
- }
2867
+ ctx ?? {},
2868
+ this.getRoutingTransportRole()
2869
+ );
2935
2870
  if (!transport || this.hasTransportClientCreated(instance, transport.uuid)) {
2936
2871
  return false;
2937
2872
  }
@@ -2948,9 +2883,9 @@ var ServiceRegistry = class _ServiceRegistry {
2948
2883
  this.markTransportClientCreated(instance, transport.uuid);
2949
2884
  return true;
2950
2885
  }
2951
- ensureDependeeClientsForService(serviceName, emit) {
2886
+ ensureDependeeClientsForService(serviceName, emit, ctx) {
2952
2887
  for (const instance of this.instances.get(serviceName) ?? []) {
2953
- this.ensureDependeeClientForInstance(instance, emit);
2888
+ this.ensureDependeeClientForInstance(instance, emit, ctx);
2954
2889
  }
2955
2890
  }
2956
2891
  hasTransportClientCreated(instance, transportId) {
@@ -3009,6 +2944,10 @@ var ServiceRegistry = class _ServiceRegistry {
3009
2944
  if (!instances?.length) {
3010
2945
  return;
3011
2946
  }
2947
+ const resolvedInstance = instances.find(
2948
+ (instance) => instance.uuid === resolvedInstanceId
2949
+ );
2950
+ const frontendRoutingRole = this.isFrontend ? this.getRoutingTransportRole() : null;
3012
2951
  const placeholders = instances.filter(
3013
2952
  (instance) => instance.uuid !== resolvedInstanceId && instance.isBootstrapPlaceholder
3014
2953
  );
@@ -3020,7 +2959,33 @@ var ServiceRegistry = class _ServiceRegistry {
3020
2959
  const requiredForReadiness = this.readinessDependeeByInstance.has(
3021
2960
  placeholder.uuid
3022
2961
  );
2962
+ const preservedTransportIds = /* @__PURE__ */ new Set();
2963
+ if (resolvedInstance && frontendRoutingRole) {
2964
+ const resolvedHasFrontendRoute = resolvedInstance.transports.some(
2965
+ (transport) => transport.role === frontendRoutingRole && !transport.deleted
2966
+ );
2967
+ if (!resolvedHasFrontendRoute) {
2968
+ const transportsToPreserve = placeholder.transports.filter(
2969
+ (transport) => transport.role === frontendRoutingRole && !transport.deleted
2970
+ );
2971
+ for (const transport of transportsToPreserve) {
2972
+ if (resolvedInstance.transports.some(
2973
+ (existingTransport) => existingTransport.role === transport.role && existingTransport.origin === transport.origin
2974
+ )) {
2975
+ continue;
2976
+ }
2977
+ resolvedInstance.transports.push({
2978
+ ...transport,
2979
+ serviceInstanceId: resolvedInstanceId
2980
+ });
2981
+ preservedTransportIds.add(transport.uuid);
2982
+ }
2983
+ }
2984
+ }
3023
2985
  for (const transport of placeholder.transports) {
2986
+ if (preservedTransportIds.has(transport.uuid)) {
2987
+ continue;
2988
+ }
3024
2989
  const transportKey = buildTransportClientKey(transport);
3025
2990
  emit(`meta.socket_shutdown_requested:${transportKey}`, {});
3026
2991
  emit(`meta.fetch.destroy_requested:${transportKey}`, {});
@@ -3141,6 +3106,7 @@ var ServiceRegistry = class _ServiceRegistry {
3141
3106
  return null;
3142
3107
  }
3143
3108
  const transportId = ctx.transportId ?? ctx.serviceTransportId ?? ctx.serviceTransport?.uuid ?? void 0;
3109
+ const transportRole = ctx.transportRole ?? ctx.transport_role ?? ctx.serviceTransport?.role ?? void 0;
3144
3110
  const transportOrigin = ctx.transportOrigin ?? ctx.serviceOrigin ?? ctx.serviceTransport?.origin ?? void 0;
3145
3111
  const transportProtocols = Array.isArray(
3146
3112
  ctx.transportProtocols ?? ctx.serviceTransport?.protocols
@@ -3166,6 +3132,7 @@ var ServiceRegistry = class _ServiceRegistry {
3166
3132
  serviceName,
3167
3133
  serviceInstanceId,
3168
3134
  transportId: typeof transportId === "string" && transportId.trim().length > 0 ? transportId : void 0,
3135
+ transportRole: transportRole === "internal" || transportRole === "public" ? transportRole : void 0,
3169
3136
  transportOrigin: typeof transportOrigin === "string" && transportOrigin.trim().length > 0 ? transportOrigin : void 0,
3170
3137
  transportProtocols: transportProtocols && transportProtocols.length > 0 ? Array.from(new Set(transportProtocols)) : void 0,
3171
3138
  isFrontend: typeof ctx.isFrontend === "boolean" ? ctx.isFrontend : typeof ctx.serviceInstance?.isFrontend === "boolean" ? ctx.serviceInstance.isFrontend : void 0,
@@ -3188,13 +3155,16 @@ var ServiceRegistry = class _ServiceRegistry {
3188
3155
  const protocols = report.transportProtocols && report.transportProtocols.length > 0 ? report.transportProtocols : ["rest", "socket"];
3189
3156
  const existingTransport = this.getTransportById(instance, report.transportId);
3190
3157
  if (existingTransport) {
3158
+ if (report.transportRole) {
3159
+ existingTransport.role = report.transportRole;
3160
+ }
3191
3161
  existingTransport.origin = report.transportOrigin;
3192
3162
  existingTransport.protocols = protocols;
3193
3163
  } else {
3194
3164
  instance.transports.push({
3195
3165
  uuid: report.transportId,
3196
3166
  serviceInstanceId: report.serviceInstanceId,
3197
- role: this.getRoutingTransportRole(),
3167
+ role: report.transportRole ?? this.getRoutingTransportRole(),
3198
3168
  origin: report.transportOrigin,
3199
3169
  protocols,
3200
3170
  securityProfile: null,
@@ -3240,24 +3210,18 @@ var ServiceRegistry = class _ServiceRegistry {
3240
3210
  localInstance.isBlocked
3241
3211
  );
3242
3212
  const reportedAt = (/* @__PURE__ */ new Date()).toISOString();
3213
+ const transport = this.getRouteableTransport(
3214
+ localInstance,
3215
+ this.useSocket ? "socket" : "rest",
3216
+ "internal"
3217
+ );
3243
3218
  const report = {
3244
3219
  serviceName: this.serviceName,
3245
3220
  serviceInstanceId: this.serviceInstanceId,
3246
- transportId: this.getRouteableTransport(
3247
- localInstance,
3248
- this.useSocket ? "socket" : "rest",
3249
- "internal"
3250
- )?.uuid ?? void 0,
3251
- transportOrigin: this.getRouteableTransport(
3252
- localInstance,
3253
- this.useSocket ? "socket" : "rest",
3254
- "internal"
3255
- )?.origin ?? void 0,
3256
- transportProtocols: this.getRouteableTransport(
3257
- localInstance,
3258
- this.useSocket ? "socket" : "rest",
3259
- "internal"
3260
- )?.protocols ?? void 0,
3221
+ transportId: transport?.uuid ?? void 0,
3222
+ transportRole: transport?.role ?? void 0,
3223
+ transportOrigin: transport?.origin ?? void 0,
3224
+ transportProtocols: transport?.protocols ?? void 0,
3261
3225
  isFrontend: localInstance.isFrontend,
3262
3226
  reportedAt,
3263
3227
  state: snapshot.state,
@@ -3621,6 +3585,7 @@ var ServiceRegistry = class _ServiceRegistry {
3621
3585
  this.deputies.clear();
3622
3586
  this.remoteSignals.clear();
3623
3587
  this.remoteIntents.clear();
3588
+ this.gatheredSyncTransmissionServices.clear();
3624
3589
  this.remoteIntentDeputiesByKey.clear();
3625
3590
  this.remoteIntentDeputiesByTask.clear();
3626
3591
  this.dependeesByService.clear();
@@ -5372,10 +5337,14 @@ var SocketController = class _SocketController {
5372
5337
  const communicationTypes = this.normalizeCommunicationTypes(
5373
5338
  input.communicationTypes
5374
5339
  );
5340
+ const transportProtocols = Array.isArray(input.transportProtocols) ? input.transportProtocols.map((entry) => String(entry)) : [];
5375
5341
  const serviceName = String(input.serviceName ?? "");
5376
5342
  const serviceTransportId = String(input.serviceTransportId ?? "");
5377
5343
  const serviceOrigin = String(input.serviceOrigin ?? "");
5378
5344
  const parsedOrigin = parseTransportOrigin(serviceOrigin);
5345
+ if (!transportProtocols.includes("socket")) {
5346
+ return false;
5347
+ }
5379
5348
  if (!serviceTransportId || !serviceOrigin || !parsedOrigin) {
5380
5349
  CadenzaService.log(
5381
5350
  "Socket client setup skipped due to missing transport origin",
@@ -5401,7 +5370,7 @@ var SocketController = class _SocketController {
5401
5370
  serviceName,
5402
5371
  serviceTransportId,
5403
5372
  serviceOrigin,
5404
- transportProtocols: input.transportProtocols,
5373
+ transportProtocols,
5405
5374
  url
5406
5375
  });
5407
5376
  };
@@ -5422,7 +5391,7 @@ var SocketController = class _SocketController {
5422
5391
  serviceName,
5423
5392
  serviceTransportId,
5424
5393
  serviceOrigin,
5425
- transportProtocols: Array.isArray(input.transportProtocols) ? input.transportProtocols.map((entry) => String(entry)) : [],
5394
+ transportProtocols,
5426
5395
  url,
5427
5396
  destroyed: false,
5428
5397
  updatedAt: Date.now()
@@ -6001,7 +5970,7 @@ var SocketController = class _SocketController {
6001
5970
  communicationTypes,
6002
5971
  serviceTransportId,
6003
5972
  serviceOrigin,
6004
- transportProtocols: input.transportProtocols,
5973
+ transportProtocols,
6005
5974
  handshakeData: {
6006
5975
  instanceId: CadenzaService.serviceRegistry.serviceInstanceId,
6007
5976
  serviceName: CadenzaService.serviceRegistry.serviceName
@@ -6361,6 +6330,209 @@ var SignalController = class _SignalController {
6361
6330
  }
6362
6331
  };
6363
6332
 
6333
+ // src/runtime/RuntimeValidationController.ts
6334
+ var RUNTIME_VALIDATION_INTENTS = {
6335
+ getPolicy: "meta-runtime-validation-policy-get",
6336
+ setPolicy: "meta-runtime-validation-policy-set",
6337
+ replacePolicy: "meta-runtime-validation-policy-replace",
6338
+ clearPolicy: "meta-runtime-validation-policy-clear",
6339
+ listScopes: "meta-runtime-validation-scope-list",
6340
+ upsertScope: "meta-runtime-validation-scope-upsert",
6341
+ removeScope: "meta-runtime-validation-scope-remove",
6342
+ clearScopes: "meta-runtime-validation-scope-clear"
6343
+ };
6344
+ var RUNTIME_VALIDATION_SIGNALS = {
6345
+ setPolicyRequested: "meta.runtime_validation.policy_set_requested",
6346
+ replacePolicyRequested: "meta.runtime_validation.policy_replace_requested",
6347
+ clearPolicyRequested: "meta.runtime_validation.policy_clear_requested",
6348
+ upsertScopeRequested: "meta.runtime_validation.scope_upsert_requested",
6349
+ removeScopeRequested: "meta.runtime_validation.scope_remove_requested",
6350
+ clearScopesRequested: "meta.runtime_validation.scope_clear_requested",
6351
+ policyUpdated: "meta.runtime_validation.policy_updated",
6352
+ policyCleared: "meta.runtime_validation.policy_cleared",
6353
+ scopeUpserted: "meta.runtime_validation.scope_upserted",
6354
+ scopeRemoved: "meta.runtime_validation.scope_removed",
6355
+ scopesCleared: "meta.runtime_validation.scopes_cleared"
6356
+ };
6357
+ function normalizePolicyContext(ctx) {
6358
+ const source = ctx.policy && typeof ctx.policy === "object" && !Array.isArray(ctx.policy) ? ctx.policy : ctx;
6359
+ const policy = {};
6360
+ for (const key of [
6361
+ "metaInput",
6362
+ "metaOutput",
6363
+ "businessInput",
6364
+ "businessOutput",
6365
+ "warnOnMissingMetaInputSchema",
6366
+ "warnOnMissingMetaOutputSchema",
6367
+ "warnOnMissingBusinessInputSchema",
6368
+ "warnOnMissingBusinessOutputSchema"
6369
+ ]) {
6370
+ if (source[key] !== void 0) {
6371
+ policy[key] = source[key];
6372
+ }
6373
+ }
6374
+ return policy;
6375
+ }
6376
+ function normalizeScopeContext(ctx) {
6377
+ const source = ctx.scope && typeof ctx.scope === "object" && !Array.isArray(ctx.scope) ? ctx.scope : ctx;
6378
+ return {
6379
+ id: source.id,
6380
+ active: source.active,
6381
+ startTaskNames: Array.isArray(source.startTaskNames) ? source.startTaskNames : void 0,
6382
+ startRoutineNames: Array.isArray(source.startRoutineNames) ? source.startRoutineNames : void 0,
6383
+ policy: source.policy && typeof source.policy === "object" ? normalizePolicyContext({ policy: source.policy }) : void 0
6384
+ };
6385
+ }
6386
+ var RuntimeValidationController = class _RuntimeValidationController {
6387
+ static get instance() {
6388
+ if (!this._instance) {
6389
+ this._instance = new _RuntimeValidationController();
6390
+ }
6391
+ return this._instance;
6392
+ }
6393
+ constructor() {
6394
+ CadenzaService.defineIntent({
6395
+ name: RUNTIME_VALIDATION_INTENTS.getPolicy,
6396
+ description: "Get the active runtime validation policy.",
6397
+ input: { type: "object" },
6398
+ output: { type: "object" }
6399
+ });
6400
+ CadenzaService.defineIntent({
6401
+ name: RUNTIME_VALIDATION_INTENTS.setPolicy,
6402
+ description: "Merge fields into the active runtime validation policy.",
6403
+ input: { type: "object" },
6404
+ output: { type: "object" }
6405
+ });
6406
+ CadenzaService.defineIntent({
6407
+ name: RUNTIME_VALIDATION_INTENTS.replacePolicy,
6408
+ description: "Replace the active runtime validation policy.",
6409
+ input: { type: "object" },
6410
+ output: { type: "object" }
6411
+ });
6412
+ CadenzaService.defineIntent({
6413
+ name: RUNTIME_VALIDATION_INTENTS.clearPolicy,
6414
+ description: "Clear the active runtime validation policy.",
6415
+ input: { type: "object" },
6416
+ output: { type: "object" }
6417
+ });
6418
+ CadenzaService.defineIntent({
6419
+ name: RUNTIME_VALIDATION_INTENTS.listScopes,
6420
+ description: "List active runtime validation scopes.",
6421
+ input: { type: "object" },
6422
+ output: { type: "object" }
6423
+ });
6424
+ CadenzaService.defineIntent({
6425
+ name: RUNTIME_VALIDATION_INTENTS.upsertScope,
6426
+ description: "Create or update a runtime validation scope for targeted subflow validation.",
6427
+ input: { type: "object" },
6428
+ output: { type: "object" }
6429
+ });
6430
+ CadenzaService.defineIntent({
6431
+ name: RUNTIME_VALIDATION_INTENTS.removeScope,
6432
+ description: "Remove a runtime validation scope by id.",
6433
+ input: { type: "object" },
6434
+ output: { type: "object" }
6435
+ });
6436
+ CadenzaService.defineIntent({
6437
+ name: RUNTIME_VALIDATION_INTENTS.clearScopes,
6438
+ description: "Clear all runtime validation scopes.",
6439
+ input: { type: "object" },
6440
+ output: { type: "object" }
6441
+ });
6442
+ CadenzaService.createMetaTask("Get runtime validation policy", () => {
6443
+ return {
6444
+ policy: CadenzaService.getRuntimeValidationPolicy()
6445
+ };
6446
+ }).respondsTo(RUNTIME_VALIDATION_INTENTS.getPolicy);
6447
+ CadenzaService.createMetaTask(
6448
+ "Set runtime validation policy",
6449
+ (ctx, emit) => {
6450
+ const policy = normalizePolicyContext(ctx);
6451
+ const nextPolicy = CadenzaService.setRuntimeValidationPolicy(policy);
6452
+ emit(RUNTIME_VALIDATION_SIGNALS.policyUpdated, {
6453
+ policy: nextPolicy
6454
+ });
6455
+ return {
6456
+ policy: nextPolicy
6457
+ };
6458
+ },
6459
+ "Merges runtime validation policy fields at runtime."
6460
+ ).respondsTo(RUNTIME_VALIDATION_INTENTS.setPolicy).doOn(RUNTIME_VALIDATION_SIGNALS.setPolicyRequested);
6461
+ CadenzaService.createMetaTask(
6462
+ "Replace runtime validation policy",
6463
+ (ctx, emit) => {
6464
+ const policy = normalizePolicyContext(ctx);
6465
+ const nextPolicy = CadenzaService.replaceRuntimeValidationPolicy(policy);
6466
+ emit(RUNTIME_VALIDATION_SIGNALS.policyUpdated, {
6467
+ policy: nextPolicy
6468
+ });
6469
+ return {
6470
+ policy: nextPolicy
6471
+ };
6472
+ },
6473
+ "Replaces runtime validation policy fields at runtime."
6474
+ ).respondsTo(RUNTIME_VALIDATION_INTENTS.replacePolicy).doOn(RUNTIME_VALIDATION_SIGNALS.replacePolicyRequested);
6475
+ CadenzaService.createMetaTask(
6476
+ "Clear runtime validation policy",
6477
+ (_ctx, emit) => {
6478
+ CadenzaService.clearRuntimeValidationPolicy();
6479
+ emit(RUNTIME_VALIDATION_SIGNALS.policyCleared, {});
6480
+ return {
6481
+ policy: CadenzaService.getRuntimeValidationPolicy()
6482
+ };
6483
+ },
6484
+ "Clears the runtime validation policy."
6485
+ ).respondsTo(RUNTIME_VALIDATION_INTENTS.clearPolicy).doOn(RUNTIME_VALIDATION_SIGNALS.clearPolicyRequested);
6486
+ CadenzaService.createMetaTask("List runtime validation scopes", () => {
6487
+ return {
6488
+ scopes: CadenzaService.getRuntimeValidationScopes()
6489
+ };
6490
+ }).respondsTo(RUNTIME_VALIDATION_INTENTS.listScopes);
6491
+ CadenzaService.createMetaTask(
6492
+ "Upsert runtime validation scope",
6493
+ (ctx, emit) => {
6494
+ const scope = normalizeScopeContext(ctx);
6495
+ const nextScope = CadenzaService.upsertRuntimeValidationScope(scope);
6496
+ emit(RUNTIME_VALIDATION_SIGNALS.scopeUpserted, {
6497
+ scope: nextScope
6498
+ });
6499
+ return {
6500
+ scope: nextScope
6501
+ };
6502
+ },
6503
+ "Upserts a runtime validation scope for targeted debugging."
6504
+ ).respondsTo(RUNTIME_VALIDATION_INTENTS.upsertScope).doOn(RUNTIME_VALIDATION_SIGNALS.upsertScopeRequested);
6505
+ CadenzaService.createMetaTask(
6506
+ "Remove runtime validation scope",
6507
+ (ctx, emit) => {
6508
+ if (!ctx.id) {
6509
+ throw new Error("Runtime validation scope id is required");
6510
+ }
6511
+ CadenzaService.removeRuntimeValidationScope(ctx.id);
6512
+ emit(RUNTIME_VALIDATION_SIGNALS.scopeRemoved, {
6513
+ id: ctx.id
6514
+ });
6515
+ return {
6516
+ id: ctx.id,
6517
+ scopes: CadenzaService.getRuntimeValidationScopes()
6518
+ };
6519
+ },
6520
+ "Removes a runtime validation scope."
6521
+ ).respondsTo(RUNTIME_VALIDATION_INTENTS.removeScope).doOn(RUNTIME_VALIDATION_SIGNALS.removeScopeRequested);
6522
+ CadenzaService.createMetaTask(
6523
+ "Clear runtime validation scopes",
6524
+ (_ctx, emit) => {
6525
+ CadenzaService.clearRuntimeValidationScopes();
6526
+ emit(RUNTIME_VALIDATION_SIGNALS.scopesCleared, {});
6527
+ return {
6528
+ scopes: CadenzaService.getRuntimeValidationScopes()
6529
+ };
6530
+ },
6531
+ "Clears all runtime validation scopes."
6532
+ ).respondsTo(RUNTIME_VALIDATION_INTENTS.clearScopes).doOn(RUNTIME_VALIDATION_SIGNALS.clearScopesRequested);
6533
+ }
6534
+ };
6535
+
6364
6536
  // src/graph/controllers/registerActorSessionPersistence.ts
6365
6537
  import { META_ACTOR_SESSION_STATE_PERSIST_INTENT } from "@cadenza.io/core";
6366
6538
  function registerActorSessionPersistenceTasks() {
@@ -9074,7 +9246,6 @@ function buildSyncExecutionEnvelope(ctx, queryData) {
9074
9246
  }
9075
9247
  function resolveSyncInsertTask(isCadenzaDBReady, tableName, queryData = {}, options = {}) {
9076
9248
  const localInsertTask = CadenzaService.getLocalCadenzaDBInsertTask(tableName);
9077
- const debugTable = shouldDebugSyncTable(tableName);
9078
9249
  if (!localInsertTask && !isCadenzaDBReady) {
9079
9250
  return void 0;
9080
9251
  }
@@ -9087,16 +9258,6 @@ function resolveSyncInsertTask(isCadenzaDBReady, tableName, queryData = {}, opti
9087
9258
  register: false,
9088
9259
  isHidden: true
9089
9260
  });
9090
- if (debugTable) {
9091
- logSyncDebug("insert_task_resolved", {
9092
- tableName,
9093
- localInsertTaskName: localInsertTask?.name ?? null,
9094
- remoteInsertTaskName: isCadenzaDBReady ? targetTask.name : null,
9095
- targetTaskName: targetTask.name,
9096
- queryData,
9097
- options
9098
- });
9099
- }
9100
9261
  const prepareExecutionTask = CadenzaService.createMetaTask(
9101
9262
  `Prepare graph sync insert for ${tableName}`,
9102
9263
  (ctx) => {
@@ -9107,12 +9268,12 @@ function resolveSyncInsertTask(isCadenzaDBReady, tableName, queryData = {}, opti
9107
9268
  if ((tableName === "signal_registry" || tableName === "directional_task_graph_map") && originalQueryData.data && typeof originalQueryData.data === "object" && !Array.isArray(originalQueryData.data) && Object.keys(originalQueryData.data).length === 0) {
9108
9269
  console.warn(
9109
9270
  "[CADENZA_SYNC_EMPTY_INSERT]",
9110
- summarizeSyncDebugValue({
9271
+ {
9111
9272
  tableName,
9112
9273
  queryData: originalQueryData,
9113
9274
  ctx,
9114
9275
  joinedContexts: Array.isArray(ctx.joinedContexts) ? ctx.joinedContexts : []
9115
- })
9276
+ }
9116
9277
  );
9117
9278
  }
9118
9279
  return buildSyncExecutionEnvelope(
@@ -9126,37 +9287,6 @@ function resolveSyncInsertTask(isCadenzaDBReady, tableName, queryData = {}, opti
9126
9287
  isHidden: true
9127
9288
  }
9128
9289
  );
9129
- if (debugTable) {
9130
- prepareExecutionTask.then(
9131
- CadenzaService.createMetaTask(
9132
- `Log prepared graph sync insert execution for ${tableName}`,
9133
- (ctx) => {
9134
- if (tableName === "task") {
9135
- if (!shouldDebugTaskSyncPayload(ctx)) {
9136
- return ctx;
9137
- }
9138
- logSyncDebug("insert_prepare", {
9139
- tableName,
9140
- targetTaskName: targetTask.name,
9141
- payload: buildTaskSyncDebugPayload(ctx)
9142
- });
9143
- return ctx;
9144
- }
9145
- logSyncDebug("insert_prepare", {
9146
- tableName,
9147
- targetTaskName: targetTask.name,
9148
- ctx
9149
- });
9150
- return ctx;
9151
- },
9152
- `Logs prepared ${tableName} sync insert payloads.`,
9153
- {
9154
- register: false,
9155
- isHidden: true
9156
- }
9157
- )
9158
- );
9159
- }
9160
9290
  const finalizeExecutionTask = CadenzaService.createMetaTask(
9161
9291
  `Finalize graph sync insert for ${tableName}`,
9162
9292
  (ctx) => {
@@ -9167,25 +9297,6 @@ function resolveSyncInsertTask(isCadenzaDBReady, tableName, queryData = {}, opti
9167
9297
  ...ctx,
9168
9298
  queryData: ctx.queryData && typeof ctx.queryData === "object" ? ctx.queryData : originalQueryData
9169
9299
  };
9170
- if (debugTable) {
9171
- if (tableName === "task") {
9172
- if (shouldDebugTaskSyncPayload(normalizedContext)) {
9173
- logSyncDebug("insert_finalize", {
9174
- tableName,
9175
- targetTaskName: targetTask.name,
9176
- success: didSyncInsertSucceed(normalizedContext),
9177
- payload: buildTaskSyncDebugPayload(normalizedContext)
9178
- });
9179
- }
9180
- } else {
9181
- logSyncDebug("insert_finalize", {
9182
- tableName,
9183
- targetTaskName: targetTask.name,
9184
- success: didSyncInsertSucceed(normalizedContext),
9185
- ctx: normalizedContext
9186
- });
9187
- }
9188
- }
9189
9300
  return normalizedContext;
9190
9301
  },
9191
9302
  `Finalizes ${tableName} graph-sync insert execution after the authority task finishes.`,
@@ -9220,139 +9331,6 @@ var AUTHORITY_QUERY_RESULT_KEYS = {
9220
9331
  intent_registry: "intentRegistrys"
9221
9332
  };
9222
9333
  var EARLY_SYNC_REQUEST_DELAYS_MS = [2e3, 1e4, 3e4];
9223
- var SYNC_DEBUG_PREFIX = "[CADENZA_SYNC_DEBUG]";
9224
- var SYNC_DEBUG_ENABLED = typeof process !== "undefined" && typeof process.env === "object" && process.env.CADENZA_SYNC_DEBUG === "true";
9225
- var SYNC_DEBUG_TABLES = /* @__PURE__ */ new Set(["intent_to_task_map", "task"]);
9226
- var SYNC_DEBUG_TASK_NAMES = /* @__PURE__ */ new Set([
9227
- "Query service_instance",
9228
- "Query service_instance_transport",
9229
- "Query intent_to_task_map",
9230
- "Query signal_to_task_map",
9231
- "Prepare for signal sync",
9232
- "Compile sync data and broadcast",
9233
- "Forward service instance sync",
9234
- "Forward service transport sync",
9235
- "Forward intent to task map sync",
9236
- "Forward signal to task map sync",
9237
- "Normalize telemetry ingest payload",
9238
- "Get telemetry session state",
9239
- "Normalize anomaly detect input",
9240
- "Read anomaly runtime session",
9241
- "Normalize prediction compute input",
9242
- "Normalize telemetry insert queryData"
9243
- ]);
9244
- var SYNC_DEBUG_ROUTINE_NAMES = /* @__PURE__ */ new Set(["Sync services"]);
9245
- var SYNC_DEBUG_INTENT_NAMES = /* @__PURE__ */ new Set([
9246
- "meta-service-registry-full-sync",
9247
- "runner-traffic-runtime-get",
9248
- "iot-telemetry-ingest",
9249
- "iot-telemetry-session-get",
9250
- "iot-anomaly-detect",
9251
- "iot-anomaly-runtime-get",
9252
- "iot-prediction-compute",
9253
- "iot-db-telemetry-insert",
9254
- "query-pg-cadenza-db-postgres-actor-service_instance",
9255
- "query-pg-cadenza-db-postgres-actor-service_instance_transport",
9256
- "query-pg-cadenza-db-postgres-actor-intent_to_task_map",
9257
- "query-pg-cadenza-db-postgres-actor-signal_to_task_map"
9258
- ]);
9259
- function shouldDebugSyncTable(tableName) {
9260
- return SYNC_DEBUG_ENABLED && SYNC_DEBUG_TABLES.has(tableName);
9261
- }
9262
- function shouldDebugSyncTaskName(taskName) {
9263
- return SYNC_DEBUG_ENABLED && typeof taskName === "string" && SYNC_DEBUG_TASK_NAMES.has(taskName);
9264
- }
9265
- function shouldDebugSyncRoutineName(routineName) {
9266
- return SYNC_DEBUG_ENABLED && typeof routineName === "string" && SYNC_DEBUG_ROUTINE_NAMES.has(routineName);
9267
- }
9268
- function shouldDebugSyncIntentName(intentName) {
9269
- return SYNC_DEBUG_ENABLED && typeof intentName === "string" && SYNC_DEBUG_INTENT_NAMES.has(intentName);
9270
- }
9271
- function summarizeSyncDebugValue(value, depth = 0) {
9272
- if (value === null || value === void 0) {
9273
- return value;
9274
- }
9275
- if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
9276
- return value;
9277
- }
9278
- if (value instanceof Set) {
9279
- return {
9280
- __type: "Set",
9281
- size: value.size,
9282
- values: Array.from(value).slice(0, 8).map((item) => summarizeSyncDebugValue(item, depth + 1))
9283
- };
9284
- }
9285
- if (value instanceof Map) {
9286
- return {
9287
- __type: "Map",
9288
- size: value.size
9289
- };
9290
- }
9291
- if (Array.isArray(value)) {
9292
- return {
9293
- __type: "Array",
9294
- length: value.length,
9295
- items: value.slice(0, 5).map((item) => summarizeSyncDebugValue(item, depth + 1))
9296
- };
9297
- }
9298
- if (typeof value === "object") {
9299
- if (depth >= 2) {
9300
- return "[object]";
9301
- }
9302
- const output = {};
9303
- const entries = Object.entries(value).filter(
9304
- ([key]) => ![
9305
- "functionString",
9306
- "tagIdGetter",
9307
- "__functionString",
9308
- "__getTagCallback",
9309
- "joinedContexts",
9310
- "task",
9311
- "taskInstance",
9312
- "tasks"
9313
- ].includes(key)
9314
- ).slice(0, 12);
9315
- for (const [key, nestedValue] of entries) {
9316
- output[key] = summarizeSyncDebugValue(nestedValue, depth + 1);
9317
- }
9318
- return output;
9319
- }
9320
- return String(value);
9321
- }
9322
- function logSyncDebug(event, payload) {
9323
- console.log(`${SYNC_DEBUG_PREFIX} ${event}`, summarizeSyncDebugValue(payload));
9324
- }
9325
- function buildTaskSyncDebugPayload(ctx) {
9326
- const data = ctx.data && typeof ctx.data === "object" ? ctx.data : {};
9327
- const queryData = ctx.queryData && typeof ctx.queryData === "object" ? ctx.queryData : {};
9328
- const queryDataData = queryData.data && typeof queryData.data === "object" ? queryData.data : {};
9329
- const taskPayload = Object.keys(queryDataData).length > 0 ? queryDataData : data;
9330
- const functionString = typeof taskPayload.functionString === "string" ? taskPayload.functionString : typeof taskPayload.function_string === "string" ? taskPayload.function_string : void 0;
9331
- const tagIdGetter = typeof taskPayload.tagIdGetter === "string" ? taskPayload.tagIdGetter : typeof taskPayload.tag_id_getter === "string" ? taskPayload.tag_id_getter : void 0;
9332
- const signals = taskPayload.signals && typeof taskPayload.signals === "object" ? taskPayload.signals : {};
9333
- const intents = taskPayload.intents && typeof taskPayload.intents === "object" ? taskPayload.intents : {};
9334
- return {
9335
- taskName: taskPayload.name ?? taskPayload.taskName ?? taskPayload.task_name ?? ctx.__taskName ?? null,
9336
- serviceName: taskPayload.service_name ?? taskPayload.serviceName ?? ctx.__syncServiceName ?? null,
9337
- functionStringLength: functionString?.length ?? null,
9338
- tagIdGetterLength: tagIdGetter?.length ?? null,
9339
- isMeta: taskPayload.isMeta ?? taskPayload.is_meta ?? null,
9340
- isSubMeta: taskPayload.isSubMeta ?? taskPayload.is_sub_meta ?? null,
9341
- isHidden: taskPayload.isHidden ?? taskPayload.is_hidden ?? null,
9342
- signalsEmitsCount: Array.isArray(signals.emits) ? signals.emits.length : null,
9343
- signalsObservedCount: Array.isArray(signals.observed) ? signals.observed.length : null,
9344
- intentHandlesCount: Array.isArray(intents.handles) ? intents.handles.length : null,
9345
- intentInquiresCount: Array.isArray(intents.inquires) ? intents.inquires.length : null,
9346
- rowCount: ctx.rowCount ?? null,
9347
- errored: ctx.errored ?? false,
9348
- success: ctx.__success ?? null,
9349
- error: ctx.__error ?? null
9350
- };
9351
- }
9352
- function shouldDebugTaskSyncPayload(ctx) {
9353
- const payload = buildTaskSyncDebugPayload(ctx);
9354
- return shouldDebugSyncTaskName(payload.taskName);
9355
- }
9356
9334
  function resolveSyncQueryRows(ctx, tableName) {
9357
9335
  const resultKey = AUTHORITY_QUERY_RESULT_KEYS[tableName];
9358
9336
  const rows = ctx?.[resultKey];
@@ -9799,16 +9777,6 @@ var GraphSyncController = class _GraphSyncController {
9799
9777
  if (!nextTask?.registered) {
9800
9778
  continue;
9801
9779
  }
9802
- if (shouldDebugSyncRoutineName(routine.name) || shouldDebugSyncTaskName(nextTask.name)) {
9803
- logSyncDebug("task_to_routine_split", {
9804
- routineName: routine.name,
9805
- routineVersion: routine.version,
9806
- taskName: nextTask.name,
9807
- taskVersion: nextTask.version,
9808
- serviceName: serviceName2,
9809
- registered: nextTask.registered
9810
- });
9811
- }
9812
9780
  yield {
9813
9781
  __syncing: ctx.__syncing,
9814
9782
  data: {
@@ -9954,20 +9922,6 @@ var GraphSyncController = class _GraphSyncController {
9954
9922
  if (task.registered) continue;
9955
9923
  const { __functionString, __getTagCallback } = task.export();
9956
9924
  this.tasksSynced = false;
9957
- if (shouldDebugSyncTaskName(task.name)) {
9958
- logSyncDebug("task_registration_split", {
9959
- taskName: task.name,
9960
- taskVersion: task.version,
9961
- serviceName: serviceName2,
9962
- register: task.register,
9963
- registered: task.registered,
9964
- hidden: task.hidden,
9965
- exportFunctionLength: __functionString?.length ?? null,
9966
- exportTagGetterLength: __getTagCallback?.length ?? null,
9967
- observedSignals: Array.from(task.observedSignals),
9968
- handledIntents: Array.from(task.handlesIntents)
9969
- });
9970
- }
9971
9925
  yield {
9972
9926
  __syncing: ctx.__syncing,
9973
9927
  data: {
@@ -10022,13 +9976,6 @@ var GraphSyncController = class _GraphSyncController {
10022
9976
  const registerTaskTask = CadenzaService.createMetaTask(
10023
9977
  "Record registration",
10024
9978
  (ctx, emit) => {
10025
- if (shouldDebugSyncTaskName(ctx.__taskName)) {
10026
- logSyncDebug("task_registration_result", {
10027
- taskName: ctx.__taskName,
10028
- success: didSyncInsertSucceed(ctx),
10029
- ctx
10030
- });
10031
- }
10032
9979
  if (!didSyncInsertSucceed(ctx)) {
10033
9980
  return;
10034
9981
  }
@@ -10054,16 +10001,6 @@ var GraphSyncController = class _GraphSyncController {
10054
10001
  "Prepare created task for immediate sync",
10055
10002
  (ctx) => {
10056
10003
  const task = ctx.taskInstance ?? (ctx.data?.name ? CadenzaService.get(String(ctx.data.name)) : void 0);
10057
- if (shouldDebugSyncTaskName(task?.name ?? ctx?.data?.name)) {
10058
- logSyncDebug("task_created_for_immediate_sync", {
10059
- incomingTaskName: ctx?.data?.name ?? null,
10060
- resolvedTaskName: task?.name ?? null,
10061
- exists: Boolean(task),
10062
- hidden: task?.hidden ?? null,
10063
- register: task?.register ?? null,
10064
- registered: task?.registered ?? null
10065
- });
10066
- }
10067
10004
  if (!task || task.hidden || !task.register || task.registered) {
10068
10005
  return false;
10069
10006
  }
@@ -10250,17 +10187,6 @@ var GraphSyncController = class _GraphSyncController {
10250
10187
  if (!isGlobal) {
10251
10188
  continue;
10252
10189
  }
10253
- if (shouldDebugSyncTaskName(task.name)) {
10254
- logSyncDebug("signal_to_task_map_split", {
10255
- taskName: task.name,
10256
- signalName: _signal,
10257
- rawSignal: signal,
10258
- serviceName: serviceName2,
10259
- observerRegistered: CadenzaService.signalBroker.signalObservers?.get(
10260
- _signal
10261
- )?.registered
10262
- });
10263
- }
10264
10190
  yield {
10265
10191
  __syncing: ctx.__syncing,
10266
10192
  data: {
@@ -10371,21 +10297,6 @@ var GraphSyncController = class _GraphSyncController {
10371
10297
  }
10372
10298
  task.__registeredIntents = task.__registeredIntents ?? /* @__PURE__ */ new Set();
10373
10299
  task.__invalidMetaIntentWarnings = task.__invalidMetaIntentWarnings ?? /* @__PURE__ */ new Set();
10374
- const shouldDebugTask = shouldDebugSyncTaskName(task.name);
10375
- if (shouldDebugTask) {
10376
- logSyncDebug("intent_map_task_state", {
10377
- taskName: task.name,
10378
- taskVersion: task.version,
10379
- serviceName: serviceName2,
10380
- registered: task.registered,
10381
- register: task.register,
10382
- hidden: task.hidden,
10383
- handledIntents: Array.from(task.handlesIntents),
10384
- registeredIntents: Array.from(task.__registeredIntents),
10385
- tasksSynced: this.tasksSynced,
10386
- intentsSynced: this.intentsSynced
10387
- });
10388
- }
10389
10300
  let emittedCount = 0;
10390
10301
  for (const intent of task.handlesIntents) {
10391
10302
  if (task.__registeredIntents.has(intent)) continue;
@@ -10411,15 +10322,6 @@ var GraphSyncController = class _GraphSyncController {
10411
10322
  if (!intentDefinition) {
10412
10323
  continue;
10413
10324
  }
10414
- if (shouldDebugSyncTaskName(task.name) || shouldDebugSyncIntentName(intent)) {
10415
- logSyncDebug("intent_to_task_map_split", {
10416
- taskName: task.name,
10417
- taskVersion: task.version,
10418
- intentName: intent,
10419
- serviceName: serviceName2,
10420
- intentDefinition
10421
- });
10422
- }
10423
10325
  yield {
10424
10326
  __syncing: ctx.__syncing,
10425
10327
  data: {
@@ -10440,15 +10342,6 @@ var GraphSyncController = class _GraphSyncController {
10440
10342
  };
10441
10343
  emittedCount += 1;
10442
10344
  }
10443
- if (shouldDebugTask && emittedCount === 0) {
10444
- logSyncDebug("intent_map_task_noop", {
10445
- taskName: task.name,
10446
- taskVersion: task.version,
10447
- serviceName: serviceName2,
10448
- handledIntents: Array.from(task.handlesIntents),
10449
- registeredIntents: Array.from(task.__registeredIntents)
10450
- });
10451
- }
10452
10345
  return emittedCount > 0;
10453
10346
  }.bind(this)
10454
10347
  );
@@ -10458,13 +10351,6 @@ var GraphSyncController = class _GraphSyncController {
10458
10351
  if (!ctx.__intentDefinition || !ctx.__intentMapData) {
10459
10352
  return false;
10460
10353
  }
10461
- if (shouldDebugSyncTaskName(ctx.__taskName) || shouldDebugSyncIntentName(ctx.__intent)) {
10462
- logSyncDebug("intent_definition_prepare", {
10463
- taskName: ctx.__taskName,
10464
- intentName: ctx.__intent,
10465
- intentDefinition: ctx.__intentDefinition
10466
- });
10467
- }
10468
10354
  return {
10469
10355
  ...ctx,
10470
10356
  data: ctx.__intentDefinition
@@ -10477,13 +10363,6 @@ var GraphSyncController = class _GraphSyncController {
10477
10363
  if (!ctx.__intentMapData) {
10478
10364
  return false;
10479
10365
  }
10480
- if (shouldDebugSyncTaskName(ctx.__taskName) || shouldDebugSyncIntentName(ctx.__intent)) {
10481
- logSyncDebug("intent_map_payload_restore", {
10482
- taskName: ctx.__taskName,
10483
- intentName: ctx.__intent,
10484
- intentMapData: ctx.__intentMapData
10485
- });
10486
- }
10487
10366
  return {
10488
10367
  ...ctx,
10489
10368
  data: ctx.__intentMapData
@@ -11305,6 +11184,13 @@ var CadenzaService = class {
11305
11184
  if (this.isBootstrapped) return;
11306
11185
  this.isBootstrapped = true;
11307
11186
  Cadenza.bootstrap();
11187
+ Cadenza.setRuntimeInquiryDelegate(
11188
+ (inquiry, context, options) => this.inquire(
11189
+ inquiry,
11190
+ context,
11191
+ options ?? {}
11192
+ )
11193
+ );
11308
11194
  this.signalBroker = Cadenza.signalBroker;
11309
11195
  this.inquiryBroker = Cadenza.inquiryBroker;
11310
11196
  this.runner = Cadenza.runner;
@@ -11313,7 +11199,7 @@ var CadenzaService = class {
11313
11199
  this.serviceRegistry = ServiceRegistry.instance;
11314
11200
  RestController.instance;
11315
11201
  SocketController.instance;
11316
- console.log("BOOTSTRAPPED");
11202
+ RuntimeValidationController.instance;
11317
11203
  }
11318
11204
  static ensureTransportControllers(isFrontend) {
11319
11205
  if (!isFrontend) {
@@ -11452,6 +11338,38 @@ var CadenzaService = class {
11452
11338
  this.inquiryBroker?.addIntent(intent);
11453
11339
  return intent;
11454
11340
  }
11341
+ static getRuntimeValidationPolicy() {
11342
+ this.bootstrap();
11343
+ return Cadenza.getRuntimeValidationPolicy();
11344
+ }
11345
+ static setRuntimeValidationPolicy(policy = {}) {
11346
+ this.bootstrap();
11347
+ return Cadenza.setRuntimeValidationPolicy(policy);
11348
+ }
11349
+ static replaceRuntimeValidationPolicy(policy = {}) {
11350
+ this.bootstrap();
11351
+ return Cadenza.replaceRuntimeValidationPolicy(policy);
11352
+ }
11353
+ static clearRuntimeValidationPolicy() {
11354
+ this.bootstrap();
11355
+ Cadenza.clearRuntimeValidationPolicy();
11356
+ }
11357
+ static getRuntimeValidationScopes() {
11358
+ this.bootstrap();
11359
+ return Cadenza.getRuntimeValidationScopes();
11360
+ }
11361
+ static upsertRuntimeValidationScope(scope) {
11362
+ this.bootstrap();
11363
+ return Cadenza.upsertRuntimeValidationScope(scope);
11364
+ }
11365
+ static removeRuntimeValidationScope(id) {
11366
+ this.bootstrap();
11367
+ Cadenza.removeRuntimeValidationScope(id);
11368
+ }
11369
+ static clearRuntimeValidationScopes() {
11370
+ this.bootstrap();
11371
+ Cadenza.clearRuntimeValidationScopes();
11372
+ }
11455
11373
  static getInquiryResponderDescriptor(task) {
11456
11374
  return this.serviceRegistry.getInquiryResponderDescriptor(task);
11457
11375
  }
@@ -12212,7 +12130,6 @@ var CadenzaService = class {
12212
12130
  }
12213
12131
  });
12214
12132
  });
12215
- console.log("Creating service...");
12216
12133
  const initContext = {
12217
12134
  data: {
12218
12135
  name: serviceName,
@@ -12245,10 +12162,13 @@ var CadenzaService = class {
12245
12162
  }).doOn("meta.fetch.handshake_complete");
12246
12163
  } else {
12247
12164
  this.emit("meta.create_service_requested", initContext);
12248
- this.createMetaTask("Create signal transmission for sync", (ctx) => {
12249
- this.createSignalTransmissionTask(
12250
- "global.meta.cadenza_db.gathered_sync_data",
12251
- ctx.serviceName
12165
+ this.createMetaTask("Create signal transmission for sync", (ctx, emit) => {
12166
+ emit(
12167
+ "meta.service_registry.gathered_sync_transmission_reconcile_requested",
12168
+ {
12169
+ serviceName: ctx.serviceName,
12170
+ __reason: "handshake"
12171
+ }
12252
12172
  );
12253
12173
  }).doOn("meta.rest.handshake", "meta.socket.handshake");
12254
12174
  }
@@ -13243,6 +13163,8 @@ export {
13243
13163
  EphemeralTask2 as EphemeralTask,
13244
13164
  GraphMetadataController,
13245
13165
  GraphRoutine2 as GraphRoutine,
13166
+ RUNTIME_VALIDATION_INTENTS,
13167
+ RUNTIME_VALIDATION_SIGNALS,
13246
13168
  RestController,
13247
13169
  ServiceRegistry,
13248
13170
  SignalController,