@naisys/hub 3.0.0-beta.30 → 3.0.0-beta.31

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.
@@ -1,4 +1,4 @@
1
- import { AgentPeekRequestSchema, AgentStartRequestSchema, AgentStopRequestSchema, HubEvents, } from "@naisys/hub-protocol";
1
+ import { AgentPeekRequestSchema, AgentRunCommandRequestSchema, AgentRunPauseRequestSchema, AgentStartRequestSchema, AgentStopRequestSchema, HubEvents, } from "@naisys/hub-protocol";
2
2
  /** Handles agent_start requests by routing them to the least-loaded eligible host */
3
3
  export function createHubAgentService(naisysServer, { hubDb }, logService, heartbeatService, sendMailService, hostRegistrar) {
4
4
  /** Find the least-loaded eligible host for a given user */
@@ -199,6 +199,93 @@ export function createHubAgentService(naisysServer, { hubDb }, logService, heart
199
199
  ack({ success: false, error: String(error) });
200
200
  }
201
201
  });
202
+ function registerRunPauseHandler(event) {
203
+ naisysServer.registerEvent(event, (hostId, data, ack) => {
204
+ try {
205
+ const parsed = AgentRunPauseRequestSchema.parse(data);
206
+ const targetHostIds = heartbeatService.findHostsForAgent(parsed.userId);
207
+ if (targetHostIds.length === 0) {
208
+ ack({
209
+ success: false,
210
+ error: `Agent ${parsed.userId} is not running on any known host`,
211
+ });
212
+ return;
213
+ }
214
+ let acked = false;
215
+ let sendFailures = 0;
216
+ for (const targetHostId of targetHostIds) {
217
+ const sent = naisysServer.sendMessage(targetHostId, event, {
218
+ userId: parsed.userId,
219
+ runId: parsed.runId,
220
+ sessionId: parsed.sessionId,
221
+ sourceHostId: hostId,
222
+ }, (response) => {
223
+ if (!acked) {
224
+ acked = true;
225
+ ack(response);
226
+ }
227
+ });
228
+ if (!sent) {
229
+ sendFailures++;
230
+ }
231
+ }
232
+ if (sendFailures === targetHostIds.length && !acked) {
233
+ ack({
234
+ success: false,
235
+ error: `No target hosts are connected`,
236
+ });
237
+ }
238
+ }
239
+ catch (error) {
240
+ logService.error(`[Hub:Agents] ${event} error from host ${hostId}: ${error}`);
241
+ ack({ success: false, error: String(error) });
242
+ }
243
+ });
244
+ }
245
+ registerRunPauseHandler(HubEvents.AGENT_RUN_PAUSE);
246
+ registerRunPauseHandler(HubEvents.AGENT_RUN_RESUME);
247
+ naisysServer.registerEvent(HubEvents.AGENT_RUN_COMMAND, (hostId, data, ack) => {
248
+ try {
249
+ const parsed = AgentRunCommandRequestSchema.parse(data);
250
+ const targetHostIds = heartbeatService.findHostsForAgent(parsed.userId);
251
+ if (targetHostIds.length === 0) {
252
+ ack({
253
+ success: false,
254
+ error: `Agent ${parsed.userId} is not running on any known host`,
255
+ });
256
+ return;
257
+ }
258
+ let acked = false;
259
+ let sendFailures = 0;
260
+ for (const targetHostId of targetHostIds) {
261
+ const sent = naisysServer.sendMessage(targetHostId, HubEvents.AGENT_RUN_COMMAND, {
262
+ userId: parsed.userId,
263
+ runId: parsed.runId,
264
+ sessionId: parsed.sessionId,
265
+ command: parsed.command,
266
+ sourceHostId: hostId,
267
+ }, (response) => {
268
+ if (!acked) {
269
+ acked = true;
270
+ ack(response);
271
+ }
272
+ });
273
+ if (!sent) {
274
+ sendFailures++;
275
+ }
276
+ }
277
+ if (sendFailures === targetHostIds.length && !acked) {
278
+ ack({
279
+ success: false,
280
+ error: `No target hosts are connected`,
281
+ });
282
+ }
283
+ }
284
+ catch (error) {
285
+ logService.error(`[Hub:Agents] ${HubEvents.AGENT_RUN_COMMAND} error from host ${hostId}: ${error}`);
286
+ ack({ success: false, error: String(error) });
287
+ }
288
+ });
202
289
  naisysServer.registerEvent(HubEvents.AGENT_PEEK, (hostId, data, ack) => {
203
290
  try {
204
291
  const parsed = AgentPeekRequestSchema.parse(data);
@@ -54,6 +54,8 @@ export function createHubHeartbeatService(naisysServer, { hubDb }, logService) {
54
54
  runId: session.runId,
55
55
  sessionId: session.sessionId,
56
56
  lastActive: now,
57
+ paused: session.paused,
58
+ state: session.state,
57
59
  });
58
60
  }
59
61
  hostActiveSessions.set(hostId, sessionMap);
@@ -101,6 +103,8 @@ export function createHubHeartbeatService(naisysServer, { hubDb }, logService) {
101
103
  runId: info.runId,
102
104
  sessionId: info.sessionId,
103
105
  lastActive: info.lastActive,
106
+ paused: info.paused,
107
+ state: info.state,
104
108
  });
105
109
  }
106
110
  }
@@ -81,10 +81,15 @@ export function createNaisysServer(nsp, initialHubAccessKey, logService, hostReg
81
81
  const result = hostType === "supervisor"
82
82
  ? await hostRegistrar.registerSupervisor(hostName, socket.handshake.address, resolvedVersion)
83
83
  : await hostRegistrar.registerNaisysClient(hostName, machineId, socket.handshake.address, resolvedVersion, environment);
84
- // Reject duplicate naisys connections (supervisors may have multiple)
85
- if (hostType === "naisys" && naisysConnections.has(result.hostId)) {
86
- logService.log(`[Hub] Connection rejected: host '${result.hostName}' is already connected`);
87
- return next(new Error(`Host '${result.hostName}' already has an active connection`));
84
+ // Supersede any existing naisys connection for this host (supervisors may have multiple).
85
+ // The disconnect handler is identity-aware, so the old socket's cleanup
86
+ // will not wipe the new connection once it registers.
87
+ if (hostType === "naisys") {
88
+ const existing = naisysConnections.get(result.hostId);
89
+ if (existing) {
90
+ logService.log(`[Hub] Superseding existing connection for host '${result.hostName}' — disconnecting old socket`);
91
+ existing.disconnect();
92
+ }
88
93
  }
89
94
  socket.data.hostId = result.hostId;
90
95
  socket.data.hostName = result.hostName;
@@ -122,15 +127,23 @@ export function createNaisysServer(nsp, initialHubAccessKey, logService, hostReg
122
127
  logService.log(`[Hub] Active connections: naisys=${naisysConnections.size}, supervisors=${supervisorConnections.length}`);
123
128
  // Clean up on disconnect
124
129
  socket.on("disconnect", () => {
130
+ let superseded = false;
125
131
  if (hostType === "supervisor") {
126
132
  const idx = supervisorConnections.indexOf(connection);
127
133
  if (idx !== -1)
128
134
  supervisorConnections.splice(idx, 1);
129
135
  }
130
- else {
136
+ else if (naisysConnections.get(hostId) === connection) {
131
137
  naisysConnections.delete(hostId);
132
138
  }
133
- raiseEvent("client_disconnected", hostId);
139
+ else {
140
+ // A newer connection replaced us; skip the disconnect broadcast so
141
+ // downstream services don't clear state belonging to the live socket.
142
+ superseded = true;
143
+ }
144
+ if (!superseded) {
145
+ raiseEvent("client_disconnected", hostId);
146
+ }
134
147
  logService.log(`[Hub] Active connections: naisys=${naisysConnections.size}, supervisors=${supervisorConnections.length}`);
135
148
  });
136
149
  });
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@naisys/hub",
3
- "version": "3.0.0-beta.30",
3
+ "version": "3.0.0-beta.31",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@naisys/hub",
9
- "version": "3.0.0-beta.30",
9
+ "version": "3.0.0-beta.31",
10
10
  "dependencies": {
11
- "@naisys/common": "3.0.0-beta.30",
12
- "@naisys/common-node": "3.0.0-beta.30",
13
- "@naisys/hub-database": "3.0.0-beta.30",
14
- "@naisys/hub-protocol": "3.0.0-beta.30",
11
+ "@naisys/common": "3.0.0-beta.31",
12
+ "@naisys/common-node": "3.0.0-beta.31",
13
+ "@naisys/hub-database": "3.0.0-beta.31",
14
+ "@naisys/hub-protocol": "3.0.0-beta.31",
15
15
  "commander": "^14.0.3",
16
16
  "dotenv": "^17.3.1",
17
17
  "fastify": "^5.8.2",
@@ -20,16 +20,11 @@
20
20
  "bin": {
21
21
  "naisys-hub": "bin/naisys-hub.js"
22
22
  },
23
- "devDependencies": {
24
- "@types/node": "^25.5.0",
25
- "tsx": "^4.21.0",
26
- "typescript": "^5.9.3"
27
- },
28
23
  "engines": {
29
24
  "node": ">=22.0.0"
30
25
  },
31
26
  "peerDependencies": {
32
- "@naisys/supervisor": "3.0.0-beta.30"
27
+ "@naisys/supervisor": "3.0.0-beta.31"
33
28
  },
34
29
  "peerDependenciesMeta": {
35
30
  "@naisys/supervisor": {
@@ -194,32 +189,32 @@
194
189
  "license": "MIT"
195
190
  },
196
191
  "node_modules/@naisys/common": {
197
- "version": "3.0.0-beta.30",
198
- "resolved": "https://registry.npmjs.org/@naisys/common/-/common-3.0.0-beta.30.tgz",
199
- "integrity": "sha512-xccdzzGpPLAi1kxatmQNUF9ojDkGM9L2s5ZiRsDmllZs8Y5tANZmHd9HhFwLHtncxAhRGwOWfBS/5jyz5UYpcw==",
192
+ "version": "3.0.0-beta.31",
193
+ "resolved": "https://registry.npmjs.org/@naisys/common/-/common-3.0.0-beta.31.tgz",
194
+ "integrity": "sha512-Kh7ScO9RW0UJl+OZdpy/AhGQzxkwyC96GnPQ26taY5cJD0FYgEGjCO7cVp2e+RVJRiF8suM5ZBWxjAftFsfjGg==",
200
195
  "dependencies": {
201
196
  "semver": "^7.7.4",
202
197
  "zod": "^4.3.6"
203
198
  }
204
199
  },
205
200
  "node_modules/@naisys/common-node": {
206
- "version": "3.0.0-beta.30",
207
- "resolved": "https://registry.npmjs.org/@naisys/common-node/-/common-node-3.0.0-beta.30.tgz",
208
- "integrity": "sha512-jhF7BMn1rwu4US8AkISH3IrLI9r6Plr3Nl0gvIvbRLUH9DKGTn/U+aZM5uB10rFXD7CV2aMTs4sKfkd/66cTSw==",
201
+ "version": "3.0.0-beta.31",
202
+ "resolved": "https://registry.npmjs.org/@naisys/common-node/-/common-node-3.0.0-beta.31.tgz",
203
+ "integrity": "sha512-BdlnfP31LTjkko66s0RzQ2QR/0PevXE/ACxAGvcf+hyt1uHcM6xHtH/Sb34xNicqp+5g2pPAPKJx232QSAtPJg==",
209
204
  "dependencies": {
210
- "@naisys/common": "3.0.0-beta.30",
205
+ "@naisys/common": "3.0.0-beta.31",
211
206
  "better-sqlite3": "^12.6.2",
212
207
  "js-yaml": "^4.1.1",
213
208
  "pino": "^10.3.1"
214
209
  }
215
210
  },
216
211
  "node_modules/@naisys/hub-database": {
217
- "version": "3.0.0-beta.30",
218
- "resolved": "https://registry.npmjs.org/@naisys/hub-database/-/hub-database-3.0.0-beta.30.tgz",
219
- "integrity": "sha512-V8ahfsVdQMZh/+QZw+Ly5SV/xVtFVkEh5g/lfDBcjE7F/3aLaGhissgR2w6iw3A7qj5vWvthS5JsytzSNBjv/Q==",
212
+ "version": "3.0.0-beta.31",
213
+ "resolved": "https://registry.npmjs.org/@naisys/hub-database/-/hub-database-3.0.0-beta.31.tgz",
214
+ "integrity": "sha512-L8IR8v9YPVpmd3JMGCDWEBC/KXZEb/LFGTaIKRmhSf/ffhFo6aXDPar1TxSIhIV2JaEZnSLOkByH9WlKD7AlTg==",
220
215
  "dependencies": {
221
- "@naisys/common": "3.0.0-beta.30",
222
- "@naisys/common-node": "3.0.0-beta.30",
216
+ "@naisys/common": "3.0.0-beta.31",
217
+ "@naisys/common-node": "3.0.0-beta.31",
223
218
  "@prisma/adapter-better-sqlite3": "^7.5.0",
224
219
  "@prisma/client": "^7.5.0",
225
220
  "better-sqlite3": "^12.6.2",
@@ -227,11 +222,11 @@
227
222
  }
228
223
  },
229
224
  "node_modules/@naisys/hub-protocol": {
230
- "version": "3.0.0-beta.30",
231
- "resolved": "https://registry.npmjs.org/@naisys/hub-protocol/-/hub-protocol-3.0.0-beta.30.tgz",
232
- "integrity": "sha512-syUg48OFIvQstk0GpC4LPMtIoL8/FYvUp9gKJfWoN9JsH3plyMiV96w169Hhj0SAr+YZS7dGBEE+g7id0awHcQ==",
225
+ "version": "3.0.0-beta.31",
226
+ "resolved": "https://registry.npmjs.org/@naisys/hub-protocol/-/hub-protocol-3.0.0-beta.31.tgz",
227
+ "integrity": "sha512-+ckTLAze6a8618uM+zcCouuCAUWcf5f1+qqMCHeEFldXc4PYr6GCmTm5Z+cwOaq9HqyeaBWir9xkgwyz4Cus/A==",
233
228
  "dependencies": {
234
- "@naisys/common": "3.0.0-beta.30",
229
+ "@naisys/common": "3.0.0-beta.31",
235
230
  "zod": "^4.3.6"
236
231
  }
237
232
  },
@@ -1151,152 +1146,6 @@
1151
1146
  "url": "https://github.com/sponsors/sindresorhus"
1152
1147
  }
1153
1148
  },
1154
- "node_modules/esbuild": {
1155
- "version": "0.27.7",
1156
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz",
1157
- "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==",
1158
- "dev": true,
1159
- "hasInstallScript": true,
1160
- "license": "MIT",
1161
- "bin": {
1162
- "esbuild": "bin/esbuild"
1163
- },
1164
- "engines": {
1165
- "node": ">=18"
1166
- },
1167
- "optionalDependencies": {
1168
- "@esbuild/aix-ppc64": "0.27.7",
1169
- "@esbuild/android-arm": "0.27.7",
1170
- "@esbuild/android-arm64": "0.27.7",
1171
- "@esbuild/android-x64": "0.27.7",
1172
- "@esbuild/darwin-arm64": "0.27.7",
1173
- "@esbuild/darwin-x64": "0.27.7",
1174
- "@esbuild/freebsd-arm64": "0.27.7",
1175
- "@esbuild/freebsd-x64": "0.27.7",
1176
- "@esbuild/linux-arm": "0.27.7",
1177
- "@esbuild/linux-arm64": "0.27.7",
1178
- "@esbuild/linux-ia32": "0.27.7",
1179
- "@esbuild/linux-loong64": "0.27.7",
1180
- "@esbuild/linux-mips64el": "0.27.7",
1181
- "@esbuild/linux-ppc64": "0.27.7",
1182
- "@esbuild/linux-riscv64": "0.27.7",
1183
- "@esbuild/linux-s390x": "0.27.7",
1184
- "@esbuild/linux-x64": "0.27.7",
1185
- "@esbuild/netbsd-arm64": "0.27.7",
1186
- "@esbuild/netbsd-x64": "0.27.7",
1187
- "@esbuild/openbsd-arm64": "0.27.7",
1188
- "@esbuild/openbsd-x64": "0.27.7",
1189
- "@esbuild/openharmony-arm64": "0.27.7",
1190
- "@esbuild/sunos-x64": "0.27.7",
1191
- "@esbuild/win32-arm64": "0.27.7",
1192
- "@esbuild/win32-ia32": "0.27.7",
1193
- "@esbuild/win32-x64": "0.27.7"
1194
- }
1195
- },
1196
- "node_modules/esbuild/node_modules/@esbuild/aix-ppc64": {
1197
- "dev": true,
1198
- "optional": true
1199
- },
1200
- "node_modules/esbuild/node_modules/@esbuild/android-arm": {
1201
- "dev": true,
1202
- "optional": true
1203
- },
1204
- "node_modules/esbuild/node_modules/@esbuild/android-arm64": {
1205
- "dev": true,
1206
- "optional": true
1207
- },
1208
- "node_modules/esbuild/node_modules/@esbuild/android-x64": {
1209
- "dev": true,
1210
- "optional": true
1211
- },
1212
- "node_modules/esbuild/node_modules/@esbuild/darwin-arm64": {
1213
- "dev": true,
1214
- "optional": true
1215
- },
1216
- "node_modules/esbuild/node_modules/@esbuild/darwin-x64": {
1217
- "dev": true,
1218
- "optional": true
1219
- },
1220
- "node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": {
1221
- "dev": true,
1222
- "optional": true
1223
- },
1224
- "node_modules/esbuild/node_modules/@esbuild/freebsd-x64": {
1225
- "dev": true,
1226
- "optional": true
1227
- },
1228
- "node_modules/esbuild/node_modules/@esbuild/linux-arm": {
1229
- "dev": true,
1230
- "optional": true
1231
- },
1232
- "node_modules/esbuild/node_modules/@esbuild/linux-arm64": {
1233
- "dev": true,
1234
- "optional": true
1235
- },
1236
- "node_modules/esbuild/node_modules/@esbuild/linux-ia32": {
1237
- "dev": true,
1238
- "optional": true
1239
- },
1240
- "node_modules/esbuild/node_modules/@esbuild/linux-loong64": {
1241
- "dev": true,
1242
- "optional": true
1243
- },
1244
- "node_modules/esbuild/node_modules/@esbuild/linux-mips64el": {
1245
- "dev": true,
1246
- "optional": true
1247
- },
1248
- "node_modules/esbuild/node_modules/@esbuild/linux-ppc64": {
1249
- "dev": true,
1250
- "optional": true
1251
- },
1252
- "node_modules/esbuild/node_modules/@esbuild/linux-riscv64": {
1253
- "dev": true,
1254
- "optional": true
1255
- },
1256
- "node_modules/esbuild/node_modules/@esbuild/linux-s390x": {
1257
- "dev": true,
1258
- "optional": true
1259
- },
1260
- "node_modules/esbuild/node_modules/@esbuild/linux-x64": {
1261
- "dev": true,
1262
- "optional": true
1263
- },
1264
- "node_modules/esbuild/node_modules/@esbuild/netbsd-arm64": {
1265
- "dev": true,
1266
- "optional": true
1267
- },
1268
- "node_modules/esbuild/node_modules/@esbuild/netbsd-x64": {
1269
- "dev": true,
1270
- "optional": true
1271
- },
1272
- "node_modules/esbuild/node_modules/@esbuild/openbsd-arm64": {
1273
- "dev": true,
1274
- "optional": true
1275
- },
1276
- "node_modules/esbuild/node_modules/@esbuild/openbsd-x64": {
1277
- "dev": true,
1278
- "optional": true
1279
- },
1280
- "node_modules/esbuild/node_modules/@esbuild/openharmony-arm64": {
1281
- "dev": true,
1282
- "optional": true
1283
- },
1284
- "node_modules/esbuild/node_modules/@esbuild/sunos-x64": {
1285
- "dev": true,
1286
- "optional": true
1287
- },
1288
- "node_modules/esbuild/node_modules/@esbuild/win32-arm64": {
1289
- "dev": true,
1290
- "optional": true
1291
- },
1292
- "node_modules/esbuild/node_modules/@esbuild/win32-ia32": {
1293
- "dev": true,
1294
- "optional": true
1295
- },
1296
- "node_modules/esbuild/node_modules/@esbuild/win32-x64": {
1297
- "dev": true,
1298
- "optional": true
1299
- },
1300
1149
  "node_modules/expand-template": {
1301
1150
  "version": "2.0.3",
1302
1151
  "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
@@ -1479,21 +1328,6 @@
1479
1328
  "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
1480
1329
  "license": "MIT"
1481
1330
  },
1482
- "node_modules/fsevents": {
1483
- "version": "2.3.3",
1484
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1485
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1486
- "dev": true,
1487
- "hasInstallScript": true,
1488
- "license": "MIT",
1489
- "optional": true,
1490
- "os": [
1491
- "darwin"
1492
- ],
1493
- "engines": {
1494
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1495
- }
1496
- },
1497
1331
  "node_modules/generate-function": {
1498
1332
  "version": "2.3.1",
1499
1333
  "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
@@ -1509,19 +1343,6 @@
1509
1343
  "integrity": "sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==",
1510
1344
  "license": "MIT"
1511
1345
  },
1512
- "node_modules/get-tsconfig": {
1513
- "version": "4.13.7",
1514
- "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.7.tgz",
1515
- "integrity": "sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==",
1516
- "dev": true,
1517
- "license": "MIT",
1518
- "dependencies": {
1519
- "resolve-pkg-maps": "^1.0.0"
1520
- },
1521
- "funding": {
1522
- "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
1523
- }
1524
- },
1525
1346
  "node_modules/giget": {
1526
1347
  "version": "2.0.0",
1527
1348
  "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz",
@@ -2235,16 +2056,6 @@
2235
2056
  "node": ">=0.10.0"
2236
2057
  }
2237
2058
  },
2238
- "node_modules/resolve-pkg-maps": {
2239
- "version": "1.0.0",
2240
- "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
2241
- "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
2242
- "dev": true,
2243
- "license": "MIT",
2244
- "funding": {
2245
- "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
2246
- }
2247
- },
2248
2059
  "node_modules/ret": {
2249
2060
  "version": "0.5.0",
2250
2061
  "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz",
@@ -2610,26 +2421,6 @@
2610
2421
  "node": ">=12"
2611
2422
  }
2612
2423
  },
2613
- "node_modules/tsx": {
2614
- "version": "4.21.0",
2615
- "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz",
2616
- "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==",
2617
- "dev": true,
2618
- "license": "MIT",
2619
- "dependencies": {
2620
- "esbuild": "~0.27.0",
2621
- "get-tsconfig": "^4.7.5"
2622
- },
2623
- "bin": {
2624
- "tsx": "dist/cli.mjs"
2625
- },
2626
- "engines": {
2627
- "node": ">=18.0.0"
2628
- },
2629
- "optionalDependencies": {
2630
- "fsevents": "~2.3.3"
2631
- }
2632
- },
2633
2424
  "node_modules/tunnel-agent": {
2634
2425
  "version": "0.6.0",
2635
2426
  "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
@@ -2642,20 +2433,6 @@
2642
2433
  "node": "*"
2643
2434
  }
2644
2435
  },
2645
- "node_modules/typescript": {
2646
- "version": "5.9.3",
2647
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
2648
- "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
2649
- "devOptional": true,
2650
- "license": "Apache-2.0",
2651
- "bin": {
2652
- "tsc": "bin/tsc",
2653
- "tsserver": "bin/tsserver"
2654
- },
2655
- "engines": {
2656
- "node": ">=14.17"
2657
- }
2658
- },
2659
2436
  "node_modules/undici-types": {
2660
2437
  "version": "7.19.2",
2661
2438
  "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@naisys/hub",
3
- "version": "3.0.0-beta.30",
3
+ "version": "3.0.0-beta.31",
4
4
  "description": "NAISYS Hub - Adds persistence and multi-instance coordination to NAISYS",
5
5
  "type": "module",
6
6
  "main": "dist/naisysHub.js",
@@ -31,7 +31,7 @@
31
31
  "!dist/**/*.d.ts.map"
32
32
  ],
33
33
  "peerDependencies": {
34
- "@naisys/supervisor": "3.0.0-beta.30"
34
+ "@naisys/supervisor": "3.0.0-beta.31"
35
35
  },
36
36
  "peerDependenciesMeta": {
37
37
  "@naisys/supervisor": {
@@ -39,10 +39,10 @@
39
39
  }
40
40
  },
41
41
  "dependencies": {
42
- "@naisys/common": "3.0.0-beta.30",
43
- "@naisys/common-node": "3.0.0-beta.30",
44
- "@naisys/hub-database": "3.0.0-beta.30",
45
- "@naisys/hub-protocol": "3.0.0-beta.30",
42
+ "@naisys/common": "3.0.0-beta.31",
43
+ "@naisys/common-node": "3.0.0-beta.31",
44
+ "@naisys/hub-database": "3.0.0-beta.31",
45
+ "@naisys/hub-protocol": "3.0.0-beta.31",
46
46
  "commander": "^14.0.3",
47
47
  "dotenv": "^17.3.1",
48
48
  "fastify": "^5.8.2",