@cadenza.io/service 2.17.32 → 2.17.34

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.
@@ -249,7 +249,7 @@ var DatabaseTask = class extends DeputyTask {
249
249
  };
250
250
 
251
251
  // src/registry/ServiceRegistry.ts
252
- import { GraphContext as GraphContext2 } from "@cadenza.io/core";
252
+ import { v4 as uuid3 } from "uuid";
253
253
 
254
254
  // src/utils/environment.ts
255
255
  var isNode = typeof process !== "undefined" && process.versions?.node != null;
@@ -385,16 +385,16 @@ function normalizeServiceTransportConfig(value) {
385
385
  }
386
386
  function normalizeServiceTransportDescriptor(value) {
387
387
  const raw = value ?? {};
388
- const uuid6 = normalizeString(raw.uuid);
388
+ const uuid8 = normalizeString(raw.uuid);
389
389
  const serviceInstanceId = normalizeString(
390
390
  raw.serviceInstanceId ?? raw.service_instance_id
391
391
  );
392
392
  const config = normalizeServiceTransportConfig(raw);
393
- if (!uuid6 || !serviceInstanceId || !config) {
393
+ if (!uuid8 || !serviceInstanceId || !config) {
394
394
  return null;
395
395
  }
396
396
  return {
397
- uuid: uuid6,
397
+ uuid: uuid8,
398
398
  serviceInstanceId,
399
399
  role: config.role,
400
400
  origin: config.origin,
@@ -456,14 +456,14 @@ function normalizeTransportArray(value, serviceInstanceId) {
456
456
  }
457
457
  function normalizeServiceInstanceDescriptor(value) {
458
458
  const raw = value ?? {};
459
- const uuid6 = normalizeString2(raw.uuid);
459
+ const uuid8 = normalizeString2(raw.uuid);
460
460
  const serviceName = normalizeString2(raw.serviceName ?? raw.service_name);
461
- if (!uuid6 || !serviceName) {
461
+ if (!uuid8 || !serviceName) {
462
462
  return null;
463
463
  }
464
- const transports = normalizeTransportArray(raw.transports, uuid6);
464
+ const transports = normalizeTransportArray(raw.transports, uuid8);
465
465
  return {
466
- uuid: uuid6,
466
+ uuid: uuid8,
467
467
  serviceName,
468
468
  numberOfRunningGraphs: Math.max(
469
469
  0,
@@ -723,6 +723,8 @@ function normalizeServiceRegistryInsertResult(tableName, ctx, queryData, rawResu
723
723
  return rawResult;
724
724
  }
725
725
  const result = { ...rawResult };
726
+ delete result.__resolverOriginalContext;
727
+ delete result.__resolverQueryData;
726
728
  const normalizedQueryData = result.queryData && typeof result.queryData === "object" ? { ...result.queryData } : { ...queryData };
727
729
  const resolvedData = result.data ?? normalizedQueryData.data ?? queryData.data ?? ctx.data ?? ctx.__registrationData;
728
730
  if (resolvedData !== void 0 && result.data === void 0) {
@@ -734,12 +736,18 @@ function normalizeServiceRegistryInsertResult(tableName, ctx, queryData, rawResu
734
736
  result.queryData = normalizedQueryData;
735
737
  if (tableName === "service") {
736
738
  const resolvedServiceName = String(
737
- result.__serviceName ?? resolvedData?.name ?? resolvedData?.service_name ?? ctx.__serviceName ?? ""
739
+ ctx.__serviceName ?? result.__serviceName ?? resolvedData?.name ?? resolvedData?.service_name ?? ""
738
740
  ).trim();
739
741
  if (resolvedServiceName) {
740
742
  result.__serviceName = resolvedServiceName;
741
743
  }
742
744
  }
745
+ const resolvedLocalServiceInstanceId = String(
746
+ ctx.__serviceInstanceId ?? resolvedData?.uuid ?? resolvedData?.service_instance_id ?? ""
747
+ ).trim();
748
+ if (resolvedLocalServiceInstanceId) {
749
+ result.__serviceInstanceId = resolvedLocalServiceInstanceId;
750
+ }
743
751
  if (tableName === "service_instance" || tableName === "service_instance_transport") {
744
752
  const resolvedUuid = String(
745
753
  result.uuid ?? resolvedData?.uuid ?? ctx.__serviceInstanceId ?? ""
@@ -756,49 +764,105 @@ function resolveServiceRegistryInsertTask(tableName, queryData = {}, options = {
756
764
  queryData,
757
765
  options
758
766
  );
759
- return CadenzaService.createUniqueMetaTask(
760
- `Resolve service registry insert for ${tableName}`,
761
- (ctx, emit, inquire, progressCallback) => {
767
+ const localExecutionRequestedSignal = `meta.service_registry.insert_execution_requested:${tableName}:local`;
768
+ const remoteExecutionRequestedSignal = `meta.service_registry.insert_execution_requested:${tableName}:remote`;
769
+ const executionResolvedSignal = `meta.service_registry.insert_execution_resolved:${tableName}`;
770
+ const executionFailedSignal = `meta.service_registry.insert_execution_failed:${tableName}`;
771
+ const createPrepareExecutionTask = (signalName) => CadenzaService.createMetaTask(
772
+ `Prepare service registry insert execution for ${tableName} (${signalName})`,
773
+ (ctx) => {
762
774
  const nextQueryData = buildServiceRegistryInsertQueryData(ctx, queryData);
763
- if (tableName === "service" && nextQueryData.data === void 0) {
764
- CadenzaService.log(
765
- "Service registry insert resolver missing service payload.",
766
- {
767
- ctxKeys: ctx && typeof ctx === "object" ? Object.keys(ctx).sort() : [],
768
- hasData: !!ctx && typeof ctx === "object" && (Object.prototype.hasOwnProperty.call(ctx, "data") || ctx.data !== void 0),
769
- hasRegistrationData: !!ctx && typeof ctx === "object" && (Object.prototype.hasOwnProperty.call(ctx, "__registrationData") || ctx.__registrationData !== void 0),
770
- serviceName: ctx?.__serviceName ?? ctx?.data?.name ?? null
771
- },
772
- "warning"
773
- );
774
- }
775
- const targetTask = CadenzaService.getLocalCadenzaDBInsertTask(tableName) ?? remoteInsertTask;
776
775
  const delegationContext = ensureDelegationContextMetadata({
777
776
  ...ctx,
778
777
  queryData: nextQueryData
779
778
  });
780
779
  delegationContext.__metadata.__skipRemoteExecution = delegationContext.__metadata.__skipRemoteExecution ?? delegationContext.__skipRemoteExecution ?? false;
781
780
  delegationContext.__metadata.__blockRemoteExecution = delegationContext.__metadata.__blockRemoteExecution ?? delegationContext.__blockRemoteExecution ?? false;
782
- return Promise.resolve(
783
- targetTask.execute(
784
- new GraphContext2(delegationContext),
785
- emit,
786
- inquire,
787
- progressCallback,
788
- {
789
- nodeId: delegationContext.__previousTaskExecutionId ?? delegationContext.__metadata?.__previousTaskExecutionId ?? `service-registry-${tableName}`,
790
- routineExecId: delegationContext.__routineExecId ?? delegationContext.__metadata?.__routineExecId ?? delegationContext.__metadata?.__localRoutineExecId ?? "service-registry"
791
- }
792
- )
793
- ).then(
794
- (result) => normalizeServiceRegistryInsertResult(
795
- tableName,
796
- ctx,
797
- nextQueryData,
798
- result
799
- )
781
+ return {
782
+ ...delegationContext,
783
+ __resolverOriginalContext: {
784
+ ...ctx
785
+ },
786
+ __resolverQueryData: nextQueryData
787
+ };
788
+ },
789
+ `Prepares ${tableName} service-registry insert payloads for runner execution.`,
790
+ {
791
+ register: false,
792
+ isHidden: true
793
+ }
794
+ ).doOn(signalName).emitsOnFail(executionFailedSignal);
795
+ const prepareLocalExecutionTask = createPrepareExecutionTask(
796
+ localExecutionRequestedSignal
797
+ );
798
+ const prepareRemoteExecutionTask = createPrepareExecutionTask(
799
+ remoteExecutionRequestedSignal
800
+ );
801
+ const finalizeExecutionTask = CadenzaService.createMetaTask(
802
+ `Finalize service registry insert execution for ${tableName}`,
803
+ (ctx, emit) => {
804
+ if (!ctx.__resolverRequestId) {
805
+ return false;
806
+ }
807
+ const normalized = normalizeServiceRegistryInsertResult(
808
+ tableName,
809
+ ctx.__resolverOriginalContext ?? ctx,
810
+ ctx.__resolverQueryData ?? ctx.queryData ?? {},
811
+ ctx
800
812
  );
813
+ if (!normalized || typeof normalized !== "object") {
814
+ return normalized;
815
+ }
816
+ emit(executionResolvedSignal, normalized);
817
+ return normalized;
801
818
  },
819
+ `Normalizes ${tableName} service-registry insert results for resolver callers.`,
820
+ {
821
+ register: false,
822
+ isHidden: true
823
+ }
824
+ );
825
+ const wiredLocalTaskNames = /* @__PURE__ */ new Set();
826
+ const wireExecutionTarget = (targetTask, prepareTask) => {
827
+ targetTask.then(finalizeExecutionTask).emitsOnFail(executionFailedSignal);
828
+ prepareTask.then(targetTask);
829
+ };
830
+ wireExecutionTarget(remoteInsertTask, prepareRemoteExecutionTask);
831
+ return CadenzaService.createUniqueMetaTask(
832
+ `Resolve service registry insert for ${tableName}`,
833
+ (ctx, emit) => new Promise((resolve) => {
834
+ const resolverRequestId = uuid3();
835
+ CadenzaService.createEphemeralMetaTask(
836
+ `Resolve service registry insert execution for ${tableName} (${resolverRequestId})`,
837
+ (resultCtx) => {
838
+ if (resultCtx.__resolverRequestId !== resolverRequestId) {
839
+ return false;
840
+ }
841
+ const normalizedResult = {
842
+ ...resultCtx
843
+ };
844
+ delete normalizedResult.__resolverRequestId;
845
+ delete normalizedResult.__resolverOriginalContext;
846
+ delete normalizedResult.__resolverQueryData;
847
+ resolve(normalizedResult);
848
+ return normalizedResult;
849
+ },
850
+ `Resolves signal-driven ${tableName} service-registry insert execution.`,
851
+ {
852
+ register: false
853
+ }
854
+ ).doOn(executionResolvedSignal, executionFailedSignal);
855
+ const localInsertTask = CadenzaService.getLocalCadenzaDBInsertTask(tableName);
856
+ const executionSignal = localInsertTask ? localExecutionRequestedSignal : remoteExecutionRequestedSignal;
857
+ if (localInsertTask && !wiredLocalTaskNames.has(localInsertTask.name)) {
858
+ wireExecutionTarget(localInsertTask, prepareLocalExecutionTask);
859
+ wiredLocalTaskNames.add(localInsertTask.name);
860
+ }
861
+ emit(executionSignal, {
862
+ ...ctx,
863
+ __resolverRequestId: resolverRequestId
864
+ });
865
+ }),
802
866
  `Resolves ${tableName} inserts through the local CadenzaDB task when available.`,
803
867
  options
804
868
  );
@@ -1036,15 +1100,15 @@ var ServiceRegistry = class _ServiceRegistry {
1036
1100
  if (!serviceInstance) {
1037
1101
  return false;
1038
1102
  }
1039
- const uuid6 = serviceInstance.uuid;
1103
+ const uuid8 = serviceInstance.uuid;
1040
1104
  const serviceName = serviceInstance.serviceName;
1041
1105
  const deleted = Boolean(
1042
1106
  ctx.deleted ?? ctx.serviceInstance?.deleted ?? ctx.data?.deleted
1043
1107
  );
1044
- if (uuid6 === this.serviceInstanceId) return;
1108
+ if (uuid8 === this.serviceInstanceId) return;
1045
1109
  if (deleted) {
1046
- const existingInstance = this.instances.get(serviceName)?.find((instance) => instance.uuid === uuid6);
1047
- const indexToDelete = this.instances.get(serviceName)?.findIndex((i) => i.uuid === uuid6) ?? -1;
1110
+ const existingInstance = this.instances.get(serviceName)?.find((instance) => instance.uuid === uuid8);
1111
+ const indexToDelete = this.instances.get(serviceName)?.findIndex((i) => i.uuid === uuid8) ?? -1;
1048
1112
  if (indexToDelete >= 0 && existingInstance) {
1049
1113
  this.instances.get(serviceName)?.splice(indexToDelete, 1);
1050
1114
  for (const transport of existingInstance.transports) {
@@ -1056,13 +1120,13 @@ var ServiceRegistry = class _ServiceRegistry {
1056
1120
  if (this.instances.get(serviceName)?.length === 0) {
1057
1121
  this.instances.delete(serviceName);
1058
1122
  }
1059
- this.unregisterDependee(uuid6, serviceName);
1123
+ this.unregisterDependee(uuid8, serviceName);
1060
1124
  return;
1061
1125
  }
1062
1126
  if (!this.instances.has(serviceName))
1063
1127
  this.instances.set(serviceName, []);
1064
1128
  const instances = this.instances.get(serviceName);
1065
- const existing = instances.find((i) => i.uuid === uuid6);
1129
+ const existing = instances.find((i) => i.uuid === uuid8);
1066
1130
  if (existing) {
1067
1131
  Object.assign(existing, {
1068
1132
  ...serviceInstance,
@@ -1072,7 +1136,7 @@ var ServiceRegistry = class _ServiceRegistry {
1072
1136
  } else {
1073
1137
  instances.push(serviceInstance);
1074
1138
  }
1075
- const trackedInstance = existing ?? instances.find((instance) => instance.uuid === uuid6);
1139
+ const trackedInstance = existing ?? instances.find((instance) => instance.uuid === uuid8);
1076
1140
  if (trackedInstance) {
1077
1141
  const snapshot = this.resolveRuntimeStatusSnapshot(
1078
1142
  trackedInstance.numberOfRunningGraphs ?? 0,
@@ -1085,16 +1149,19 @@ var ServiceRegistry = class _ServiceRegistry {
1085
1149
  trackedInstance.reportedAt = trackedInstance.reportedAt ?? (/* @__PURE__ */ new Date()).toISOString();
1086
1150
  }
1087
1151
  if (!serviceInstance.isBootstrapPlaceholder) {
1088
- this.reconcileBootstrapPlaceholderInstance(serviceName, uuid6, emit);
1152
+ this.reconcileBootstrapPlaceholderInstance(serviceName, uuid8, emit);
1089
1153
  }
1090
1154
  if (this.serviceName === serviceName) {
1091
1155
  return false;
1092
1156
  }
1157
+ if (trackedInstance?.isFrontend) {
1158
+ return true;
1159
+ }
1093
1160
  const trackedTransport = this.getRouteableTransport(
1094
1161
  trackedInstance,
1095
1162
  this.useSocket ? "socket" : "rest"
1096
1163
  );
1097
- if (!serviceInstance.isFrontend && (this.deputies.has(serviceName) || this.remoteIntents.has(serviceName)) || this.remoteSignals.has(serviceName)) {
1164
+ if (this.deputies.has(serviceName) || this.remoteIntents.has(serviceName) || this.remoteSignals.has(serviceName)) {
1098
1165
  const communicationTypes = Array.from(
1099
1166
  new Set(
1100
1167
  this.deputies.get(serviceName)?.map((d) => d.communicationType) ?? []
@@ -1111,7 +1178,7 @@ var ServiceRegistry = class _ServiceRegistry {
1111
1178
  if (!clientCreated) {
1112
1179
  emit("meta.service_registry.dependee_registered", {
1113
1180
  serviceName,
1114
- serviceInstanceId: uuid6,
1181
+ serviceInstanceId: uuid8,
1115
1182
  serviceTransportId: trackedTransport.uuid,
1116
1183
  serviceOrigin: trackedTransport.origin,
1117
1184
  transportProtocols: trackedTransport.protocols,
@@ -1125,7 +1192,7 @@ var ServiceRegistry = class _ServiceRegistry {
1125
1192
  } else {
1126
1193
  emit("meta.service_registry.routeable_transport_missing", {
1127
1194
  serviceName,
1128
- serviceInstanceId: uuid6,
1195
+ serviceInstanceId: uuid8,
1129
1196
  requiredRole: this.getRoutingTransportRole(),
1130
1197
  isFrontend: this.isFrontend
1131
1198
  });
@@ -1184,7 +1251,7 @@ var ServiceRegistry = class _ServiceRegistry {
1184
1251
  if (ownerInstance.uuid === this.serviceInstanceId) {
1185
1252
  return true;
1186
1253
  }
1187
- const hasRemoteInterest = (!ownerInstance.isFrontend && (this.deputies.has(ownerInstance.serviceName) || this.remoteIntents.has(ownerInstance.serviceName)) || this.remoteSignals.has(ownerInstance.serviceName)) && transport.role === this.getRoutingTransportRole();
1254
+ const hasRemoteInterest = !ownerInstance.isFrontend && (this.deputies.has(ownerInstance.serviceName) || this.remoteIntents.has(ownerInstance.serviceName) || this.remoteSignals.has(ownerInstance.serviceName)) && transport.role === this.getRoutingTransportRole();
1188
1255
  if (!hasRemoteInterest) {
1189
1256
  return true;
1190
1257
  }
@@ -1599,6 +1666,9 @@ var ServiceRegistry = class _ServiceRegistry {
1599
1666
  if (!instance.isActive || instance.isNonResponsive || instance.isBlocked) {
1600
1667
  return false;
1601
1668
  }
1669
+ if (instance.isFrontend) {
1670
+ return true;
1671
+ }
1602
1672
  return Boolean(
1603
1673
  this.selectTransportForInstance(instance, context, preferredRole)
1604
1674
  );
@@ -1632,6 +1702,21 @@ var ServiceRegistry = class _ServiceRegistry {
1632
1702
  }
1633
1703
  if (__broadcast || instances[0].isFrontend) {
1634
1704
  for (const instance of instances) {
1705
+ if (instance.isFrontend) {
1706
+ const fetchId = `browser:${instance.uuid}`;
1707
+ emit(
1708
+ `meta.service_registry.selected_instance_for_socket:${fetchId}`,
1709
+ {
1710
+ ...context,
1711
+ __instance: instance.uuid,
1712
+ __transportId: void 0,
1713
+ __transportOrigin: void 0,
1714
+ __transportProtocols: ["socket"],
1715
+ __fetchId: fetchId
1716
+ }
1717
+ );
1718
+ continue;
1719
+ }
1635
1720
  const selectedTransport2 = this.selectTransportForInstance(
1636
1721
  instance,
1637
1722
  context,
@@ -1673,6 +1758,21 @@ var ServiceRegistry = class _ServiceRegistry {
1673
1758
  if (retries > 0) {
1674
1759
  selected = instancesToTry[Math.floor(Math.random() * instancesToTry.length)];
1675
1760
  }
1761
+ if (selected.isFrontend) {
1762
+ context.__instance = selected.uuid;
1763
+ context.__transportId = void 0;
1764
+ context.__transportOrigin = void 0;
1765
+ context.__transportProtocols = ["socket"];
1766
+ context.__fetchId = `browser:${selected.uuid}`;
1767
+ context.__triedInstances = triedInstances;
1768
+ context.__triedInstances.push(selected.uuid);
1769
+ context.__retries = retries;
1770
+ emit(
1771
+ `meta.service_registry.selected_instance_for_socket:${context.__fetchId}`,
1772
+ context
1773
+ );
1774
+ return context;
1775
+ }
1676
1776
  const selectedTransport = this.selectTransportForInstance(
1677
1777
  selected,
1678
1778
  context,
@@ -2329,7 +2429,7 @@ var ServiceRegistry = class _ServiceRegistry {
2329
2429
  )
2330
2430
  );
2331
2431
  for (const service of services) {
2332
- const instances = this.instances.get(service).filter((i) => i.isActive);
2432
+ const instances = this.instances.get(service).filter((i) => i.isActive && !i.isFrontend);
2333
2433
  for (const instance of instances) {
2334
2434
  const transport = this.getRouteableTransport(
2335
2435
  instance,
@@ -3381,9 +3481,9 @@ var ServiceRegistry = class _ServiceRegistry {
3381
3481
  };
3382
3482
 
3383
3483
  // src/graph/definition/SignalTransmissionTask.ts
3384
- import { Task as Task3 } from "@cadenza.io/core";
3385
- import { v4 as uuid3 } from "uuid";
3386
- var SignalTransmissionTask = class extends Task3 {
3484
+ import { Task as Task2 } from "@cadenza.io/core";
3485
+ import { v4 as uuid4 } from "uuid";
3486
+ var SignalTransmissionTask = class extends Task2 {
3387
3487
  /**
3388
3488
  * Constructs a new instance of the class and initializes it with the provided parameters.
3389
3489
  *
@@ -3411,7 +3511,7 @@ var SignalTransmissionTask = class extends Task3 {
3411
3511
  */
3412
3512
  constructor(name, signalName, serviceName, description = "", concurrency = 0, timeout = 0, register = true, isUnique = false, isMeta = true, isSubMeta = false, isHidden = false, getTagCallback = void 0, inputSchema = void 0, validateInputContext = false, outputSchema = void 0, validateOutputContext = false, retryCount = 0, retryDelay = 0, retryDelayMax = 0, retryDelayFactor = 1) {
3413
3513
  const taskFunction = (context) => {
3414
- context.__routineExecId = uuid3();
3514
+ context.__routineExecId = uuid4();
3415
3515
  return context;
3416
3516
  };
3417
3517
  super(
@@ -4048,6 +4148,35 @@ var SocketController = class _SocketController {
4048
4148
  },
4049
4149
  { isMeta: true }
4050
4150
  );
4151
+ CadenzaService.registry.getTaskByName.doOn("meta.socket.delegation_requested");
4152
+ CadenzaService.registry.getRoutineByName.doOn("meta.socket.delegation_requested");
4153
+ CadenzaService.createMetaTask(
4154
+ "Forward socket delegations to runner",
4155
+ (context, emit) => {
4156
+ if (!isBrowser && !CadenzaService.serviceRegistry.isFrontend) {
4157
+ return false;
4158
+ }
4159
+ if (context.task || context.routine) {
4160
+ const routine = context.task ?? context.routine;
4161
+ delete context.task;
4162
+ delete context.routine;
4163
+ context.__routineExecId = context.__metadata?.__deputyExecId ?? null;
4164
+ context.__isDeputy = true;
4165
+ CadenzaService.runner.run(routine, context);
4166
+ return true;
4167
+ }
4168
+ const deputyExecId = context.__metadata?.__deputyExecId ?? context.__deputyExecId;
4169
+ const remoteRoutineName = context.__remoteRoutineName ?? context.__name ?? "unknown";
4170
+ context.errored = true;
4171
+ context.__error = `No task or routine registered for delegation target ${remoteRoutineName}.`;
4172
+ if (deputyExecId) {
4173
+ emit(`meta.socket.delegation_target_not_found:${deputyExecId}`, context);
4174
+ }
4175
+ emit("meta.runner.failed", context);
4176
+ return false;
4177
+ },
4178
+ "Forwards socket delegated lookups to the local runner in frontend runtimes."
4179
+ ).attachSignal("meta.runner.failed").doAfter(CadenzaService.registry.getTaskByName, CadenzaService.registry.getRoutineByName);
4051
4180
  this.registerDiagnosticsTasks();
4052
4181
  this.registerSocketServerTasks();
4053
4182
  this.registerSocketClientTasks();
@@ -4291,8 +4420,56 @@ var SocketController = class _SocketController {
4291
4420
  });
4292
4421
  if (ctx.isFrontend) {
4293
4422
  const fetchId = `browser:${ctx.serviceInstanceId}`;
4423
+ const frontendDelegateTaskName = `Delegate flow to frontend ${fetchId}`;
4424
+ const frontendTransmitTaskName = `Transmit signal to ${fetchId}`;
4425
+ CadenzaService.get(frontendDelegateTaskName)?.destroy();
4426
+ CadenzaService.get(frontendTransmitTaskName)?.destroy();
4427
+ CadenzaService.createMetaTask(
4428
+ frontendDelegateTaskName,
4429
+ async (delegateCtx, emitter) => {
4430
+ if (delegateCtx.__remoteRoutineName === void 0) {
4431
+ return;
4432
+ }
4433
+ const normalizedDelegateCtx = ensureDelegationContextMetadata(delegateCtx);
4434
+ delete normalizedDelegateCtx.__isSubMeta;
4435
+ delete normalizedDelegateCtx.__broadcast;
4436
+ const deputyExecId = normalizedDelegateCtx.__metadata?.__deputyExecId;
4437
+ const resultContext = await new Promise((resolve) => {
4438
+ ws.timeout(normalizedDelegateCtx.__timeout ?? 6e4).emit(
4439
+ "delegation",
4440
+ normalizedDelegateCtx,
4441
+ (err, response) => {
4442
+ if (err) {
4443
+ resolve({
4444
+ ...normalizedDelegateCtx,
4445
+ errored: true,
4446
+ __error: `Frontend delegation timed out: ${err.message ?? err}`
4447
+ });
4448
+ return;
4449
+ }
4450
+ resolve(
4451
+ response ?? {
4452
+ errored: true,
4453
+ __error: "Frontend delegation returned no response"
4454
+ }
4455
+ );
4456
+ }
4457
+ );
4458
+ });
4459
+ if (deputyExecId) {
4460
+ const metadata = resultContext.__metadata;
4461
+ delete resultContext.__metadata;
4462
+ emitter(`meta.socket_client.delegated:${deputyExecId}`, {
4463
+ ...resultContext,
4464
+ ...metadata && typeof metadata === "object" ? metadata : {}
4465
+ });
4466
+ }
4467
+ return resultContext;
4468
+ },
4469
+ "Delegates work to a connected frontend runtime through its active websocket."
4470
+ ).doOn(`meta.service_registry.selected_instance_for_socket:${fetchId}`).attachSignal("meta.socket_client.delegated");
4294
4471
  CadenzaService.createMetaTask(
4295
- `Transmit signal to ${fetchId}`,
4472
+ frontendTransmitTaskName,
4296
4473
  (c, emitter) => {
4297
4474
  if (c.__signalName === void 0) {
4298
4475
  return;
@@ -4757,10 +4934,54 @@ var SocketController = class _SocketController {
4757
4934
  delegationCtx
4758
4935
  );
4759
4936
  });
4760
- socket.on("signal", (signalCtx) => {
4937
+ socket.on("delegation", (delegationCtx, callback) => {
4938
+ const normalizedDelegationCtx = ensureDelegationContextMetadata(delegationCtx);
4939
+ const deputyExecId = normalizedDelegationCtx.__metadata.__deputyExecId;
4940
+ const targetNotFoundSignal = `meta.socket.delegation_target_not_found:${deputyExecId}`;
4941
+ CadenzaService.createEphemeralMetaTask(
4942
+ `Resolve frontend socket delegation ${deputyExecId}`,
4943
+ (completedCtx) => {
4944
+ callback(completedCtx);
4945
+ return completedCtx;
4946
+ },
4947
+ "Resolves a server-routed delegation request through the frontend runtime.",
4948
+ {
4949
+ register: false
4950
+ }
4951
+ ).doOn(`meta.node.graph_completed:${deputyExecId}`, targetNotFoundSignal);
4952
+ if (!CadenzaService.get(normalizedDelegationCtx.__remoteRoutineName) && !CadenzaService.registry.routines.get(
4953
+ normalizedDelegationCtx.__remoteRoutineName
4954
+ )) {
4955
+ CadenzaService.emit(targetNotFoundSignal, {
4956
+ ...normalizedDelegationCtx,
4957
+ __error: `No task or routine registered for delegation target ${normalizedDelegationCtx.__remoteRoutineName}.`,
4958
+ errored: true
4959
+ });
4960
+ return;
4961
+ }
4962
+ CadenzaService.emit("meta.socket.delegation_requested", {
4963
+ ...normalizedDelegationCtx,
4964
+ __name: normalizedDelegationCtx.__remoteRoutineName
4965
+ });
4966
+ });
4967
+ socket.on("signal", (signalCtx, callback) => {
4761
4968
  if (CadenzaService.signalBroker.listObservedSignals().includes(signalCtx.__signalName)) {
4969
+ callback?.({
4970
+ __status: "success",
4971
+ __signalName: signalCtx.__signalName
4972
+ });
4762
4973
  CadenzaService.emit(signalCtx.__signalName, signalCtx);
4974
+ return;
4763
4975
  }
4976
+ callback?.({
4977
+ ...signalCtx,
4978
+ __status: "error",
4979
+ __error: `No such signal: ${signalCtx.__signalName}`,
4980
+ errored: true
4981
+ });
4982
+ });
4983
+ socket.on("status_check", (statusCtx, callback) => {
4984
+ callback(CadenzaService.serviceRegistry.resolveLocalStatusCheck(statusCtx));
4764
4985
  });
4765
4986
  socket.on("status_update", (status) => {
4766
4987
  CadenzaService.emit("meta.socket_client.status_received", status);
@@ -5835,13 +6056,13 @@ var DatabaseController = class _DatabaseController {
5835
6056
  };
5836
6057
 
5837
6058
  // src/Cadenza.ts
5838
- import { v4 as uuid4 } from "uuid";
6059
+ import { v4 as uuid6 } from "uuid";
5839
6060
 
5840
6061
  // src/graph/controllers/GraphSyncController.ts
5841
6062
  import {
5842
- GraphContext as GraphContext4,
5843
6063
  META_ACTOR_SESSION_STATE_PERSIST_INTENT as META_ACTOR_SESSION_STATE_PERSIST_INTENT2
5844
6064
  } from "@cadenza.io/core";
6065
+ import { v4 as uuid5 } from "uuid";
5845
6066
  var ACTOR_TASK_METADATA = /* @__PURE__ */ Symbol.for("@cadenza.io/core/actor-task-meta");
5846
6067
  function getActorTaskRuntimeMetadata(taskFunction) {
5847
6068
  if (typeof taskFunction !== "function") {
@@ -5975,30 +6196,69 @@ function resolveSyncInsertTask(isCadenzaDBReady, tableName, queryData = {}, opti
5975
6196
  if (!localInsertTask && !remoteInsertTask) {
5976
6197
  return void 0;
5977
6198
  }
5978
- return CadenzaService.createUniqueMetaTask(
5979
- `Resolve graph sync insert for ${tableName}`,
5980
- (ctx, emit, inquire, progressCallback) => {
5981
- const targetTask = CadenzaService.getLocalCadenzaDBInsertTask(tableName) ?? remoteInsertTask;
5982
- if (!targetTask) {
6199
+ const targetTask = localInsertTask ?? remoteInsertTask;
6200
+ const executionRequestedSignal = `meta.sync_controller.insert_execution_requested:${tableName}`;
6201
+ const executionResolvedSignal = `meta.sync_controller.insert_execution_resolved:${tableName}`;
6202
+ const executionFailedSignal = `meta.sync_controller.insert_execution_failed:${tableName}`;
6203
+ const prepareExecutionTask = CadenzaService.createMetaTask(
6204
+ `Prepare graph sync insert execution for ${tableName}`,
6205
+ (ctx) => ({
6206
+ ...ctx,
6207
+ queryData: buildSyncInsertQueryData(
6208
+ ctx,
6209
+ queryData
6210
+ )
6211
+ }),
6212
+ `Prepares ${tableName} graph-sync insert payloads for runner execution.`,
6213
+ {
6214
+ register: false,
6215
+ isHidden: true
6216
+ }
6217
+ ).doOn(executionRequestedSignal).emitsOnFail(executionFailedSignal);
6218
+ const finalizeExecutionTask = CadenzaService.createMetaTask(
6219
+ `Finalize graph sync insert execution for ${tableName}`,
6220
+ (ctx, emit) => {
6221
+ if (!ctx.__resolverRequestId) {
5983
6222
  return false;
5984
6223
  }
5985
- return targetTask.execute(
5986
- new GraphContext4({
5987
- ...ctx,
5988
- queryData: buildSyncInsertQueryData(
5989
- ctx,
5990
- queryData
5991
- )
5992
- }),
5993
- emit,
5994
- inquire,
5995
- progressCallback,
6224
+ emit(executionResolvedSignal, ctx);
6225
+ return ctx;
6226
+ },
6227
+ `Resolves signal-driven ${tableName} graph-sync insert execution.`,
6228
+ {
6229
+ register: false,
6230
+ isHidden: true
6231
+ }
6232
+ );
6233
+ targetTask.then(finalizeExecutionTask).emitsOnFail(executionFailedSignal);
6234
+ prepareExecutionTask.then(targetTask);
6235
+ return CadenzaService.createUniqueMetaTask(
6236
+ `Resolve graph sync insert for ${tableName}`,
6237
+ (ctx, emit) => new Promise((resolve) => {
6238
+ const resolverRequestId = uuid5();
6239
+ CadenzaService.createEphemeralMetaTask(
6240
+ `Resolve graph sync insert execution for ${tableName} (${resolverRequestId})`,
6241
+ (resultCtx) => {
6242
+ if (resultCtx.__resolverRequestId !== resolverRequestId) {
6243
+ return false;
6244
+ }
6245
+ const normalizedResult = {
6246
+ ...resultCtx
6247
+ };
6248
+ delete normalizedResult.__resolverRequestId;
6249
+ resolve(normalizedResult);
6250
+ return normalizedResult;
6251
+ },
6252
+ `Waits for signal-driven ${tableName} graph-sync insert execution.`,
5996
6253
  {
5997
- nodeId: ctx.__previousTaskExecutionId ?? ctx.__metadata?.__previousTaskExecutionId ?? `graph-sync-${tableName}`,
5998
- routineExecId: ctx.__routineExecId ?? ctx.__metadata?.__routineExecId ?? ctx.__metadata?.__localRoutineExecId ?? "graph-sync"
6254
+ register: false
5999
6255
  }
6000
- );
6001
- },
6256
+ ).doOn(executionResolvedSignal, executionFailedSignal);
6257
+ emit(executionRequestedSignal, {
6258
+ ...ctx,
6259
+ __resolverRequestId: resolverRequestId
6260
+ });
6261
+ }),
6002
6262
  `Routes graph sync inserts for ${tableName} through the local authority task when available.`,
6003
6263
  {
6004
6264
  ...options,
@@ -7350,7 +7610,7 @@ var CadenzaService = class {
7350
7610
  (transport) => !!transport
7351
7611
  ).map((transport) => ({
7352
7612
  ...transport,
7353
- uuid: uuid4()
7613
+ uuid: uuid6()
7354
7614
  }));
7355
7615
  }
7356
7616
  static createBootstrapTransport(serviceInstanceId, role, endpoint) {
@@ -7602,7 +7862,7 @@ var CadenzaService = class {
7602
7862
  }
7603
7863
  for (const responder of responders) {
7604
7864
  const { task, descriptor } = responder;
7605
- const inquiryId = uuid4();
7865
+ const inquiryId = uuid6();
7606
7866
  startTimeByTask.set(task, Date.now());
7607
7867
  const resolverTask = this.createEphemeralMetaTask(
7608
7868
  `Resolve inquiry ${inquiry} for ${descriptor.localTaskName}`,
@@ -8110,7 +8370,7 @@ var CadenzaService = class {
8110
8370
  this.bootstrap();
8111
8371
  this.validateName(serviceName);
8112
8372
  this.validateServiceName(serviceName);
8113
- const serviceId = options.customServiceId ?? uuid4();
8373
+ const serviceId = options.customServiceId ?? uuid6();
8114
8374
  this.serviceRegistry.serviceName = serviceName;
8115
8375
  this.serviceRegistry.serviceInstanceId = serviceId;
8116
8376
  this.setHydrationResults(options.hydration);
@@ -8247,7 +8507,7 @@ var CadenzaService = class {
8247
8507
  "global.meta.cadenza_db.gathered_sync_data",
8248
8508
  ctx.serviceName
8249
8509
  );
8250
- }).doOn("meta.rest.handshake");
8510
+ }).doOn("meta.rest.handshake", "meta.socket.handshake");
8251
8511
  }
8252
8512
  this.createMetaTask("Handle service setup completion", () => {
8253
8513
  if (isFrontend) {
@@ -8955,12 +9215,12 @@ import {
8955
9215
  Actor as Actor2,
8956
9216
  DebounceTask as DebounceTask2,
8957
9217
  EphemeralTask as EphemeralTask2,
8958
- GraphRoutine as GraphRoutine3,
8959
- Task as Task6
9218
+ GraphRoutine as GraphRoutine2,
9219
+ Task as Task5
8960
9220
  } from "@cadenza.io/core";
8961
9221
 
8962
9222
  // src/ssr/createSSRInquiryBridge.ts
8963
- import { v4 as uuid5 } from "uuid";
9223
+ import { v4 as uuid7 } from "uuid";
8964
9224
  function ensureFetch() {
8965
9225
  if (typeof globalThis.fetch !== "function") {
8966
9226
  throw new Error("SSR inquiry bridge requires global fetch support.");
@@ -9049,7 +9309,7 @@ function createSSRInquiryBridge(options = {}) {
9049
9309
  __remoteRoutineName: remoteRoutineName,
9050
9310
  __metadata: {
9051
9311
  ...context.__metadata ?? {},
9052
- __deputyExecId: uuid5()
9312
+ __deputyExecId: uuid7()
9053
9313
  }
9054
9314
  }),
9055
9315
  signal
@@ -9239,13 +9499,13 @@ export {
9239
9499
  DeputyTask,
9240
9500
  EphemeralTask2 as EphemeralTask,
9241
9501
  GraphMetadataController,
9242
- GraphRoutine3 as GraphRoutine,
9502
+ GraphRoutine2 as GraphRoutine,
9243
9503
  RestController,
9244
9504
  ServiceRegistry,
9245
9505
  SignalController,
9246
9506
  SignalTransmissionTask,
9247
9507
  SocketController,
9248
- Task6 as Task,
9508
+ Task5 as Task,
9249
9509
  createSSRInquiryBridge,
9250
9510
  index_default as default
9251
9511
  };