4runr-os 2.10.74 → 2.10.76

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.
@@ -199,15 +199,15 @@
199
199
  }
200
200
  },
201
201
  "node_modules/@aws-sdk/client-kms": {
202
- "version": "3.1065.0",
203
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-kms/-/client-kms-3.1065.0.tgz",
204
- "integrity": "sha512-PnLZxCE0QWQwS8pBz8xXAYjSN+SIVHG+IpaQqlMXyGGPhWaMXqXaCoDrHsi9oklUmSjBdRP7erRyj1EDalEg/Q==",
202
+ "version": "3.1066.0",
203
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-kms/-/client-kms-3.1066.0.tgz",
204
+ "integrity": "sha512-qaSA4aFdmh0HX8/1tjYX6oZoFV3ylL9mUgjZhlMkX6P9K4c6Cw8H0B9f4Ap2zMIKpgpvYBMBh/1c8XC/OiQk8Q==",
205
205
  "license": "Apache-2.0",
206
206
  "dependencies": {
207
207
  "@aws-crypto/sha256-browser": "5.2.0",
208
208
  "@aws-crypto/sha256-js": "5.2.0",
209
209
  "@aws-sdk/core": "^3.974.20",
210
- "@aws-sdk/credential-provider-node": "^3.972.54",
210
+ "@aws-sdk/credential-provider-node": "^3.972.55",
211
211
  "@aws-sdk/types": "^3.973.12",
212
212
  "@smithy/core": "^3.24.6",
213
213
  "@smithy/fetch-http-handler": "^5.4.6",
@@ -220,15 +220,15 @@
220
220
  }
221
221
  },
222
222
  "node_modules/@aws-sdk/client-secrets-manager": {
223
- "version": "3.1065.0",
224
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.1065.0.tgz",
225
- "integrity": "sha512-6SngzPglYGapTFrqkiDJwIxPszNoQtEF54+VAoG3/sw3ldf9IR9cGx2bzc18LOC43iI/0YJ2W5X0oaxyCWmDAw==",
223
+ "version": "3.1066.0",
224
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.1066.0.tgz",
225
+ "integrity": "sha512-QvlrUcuB8TAfxXXCfmDeypReoI779GaxJWVYFGf75dJiTrmZsFfOpjSblFuv6/bL6YqF/wGTs2ta0gxGz8L/BA==",
226
226
  "license": "Apache-2.0",
227
227
  "dependencies": {
228
228
  "@aws-crypto/sha256-browser": "5.2.0",
229
229
  "@aws-crypto/sha256-js": "5.2.0",
230
230
  "@aws-sdk/core": "^3.974.20",
231
- "@aws-sdk/credential-provider-node": "^3.972.54",
231
+ "@aws-sdk/credential-provider-node": "^3.972.55",
232
232
  "@aws-sdk/types": "^3.973.12",
233
233
  "@smithy/core": "^3.24.6",
234
234
  "@smithy/fetch-http-handler": "^5.4.6",
@@ -241,15 +241,15 @@
241
241
  }
242
242
  },
243
243
  "node_modules/@aws-sdk/client-ssm": {
244
- "version": "3.1065.0",
245
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.1065.0.tgz",
246
- "integrity": "sha512-qHdmHVrx6gtUPwF9lnDd2cxkvUdbs8JOzn0esVTOXcwLxH+KKzrkMWrV5FHfiWh3Nsd121waRpKSfEX1Tg25VQ==",
244
+ "version": "3.1066.0",
245
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.1066.0.tgz",
246
+ "integrity": "sha512-hnhsB2v0eYqt9A7QBTyTQR6O6hGQkDEpeuUKsk4rru7bgiDfKgMJ53WRqKwxEPgPORXBQrItl3jWRW30+CkjGg==",
247
247
  "license": "Apache-2.0",
248
248
  "dependencies": {
249
249
  "@aws-crypto/sha256-browser": "5.2.0",
250
250
  "@aws-crypto/sha256-js": "5.2.0",
251
251
  "@aws-sdk/core": "^3.974.20",
252
- "@aws-sdk/credential-provider-node": "^3.972.54",
252
+ "@aws-sdk/credential-provider-node": "^3.972.55",
253
253
  "@aws-sdk/types": "^3.973.12",
254
254
  "@smithy/core": "^3.24.6",
255
255
  "@smithy/fetch-http-handler": "^5.4.6",
@@ -315,19 +315,19 @@
315
315
  }
316
316
  },
317
317
  "node_modules/@aws-sdk/credential-provider-ini": {
318
- "version": "3.972.52",
319
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.52.tgz",
320
- "integrity": "sha512-szg1nnebqC+Svv6Vfsdf6P/QK8x5g/ghG2CKa/1WkHifRnq0BBmDELj2Qnqk9nPsUvEu/OEcYic97CPLpKqF9g==",
318
+ "version": "3.972.53",
319
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.53.tgz",
320
+ "integrity": "sha512-ZfdhIOR41q8TcWEnUac+gCOb+O2LBWdHLmjedXpXz4IEFW2ppNuFcm6p0sMTavpM+zD5TYfpH5Gp7guRyqSgsQ==",
321
321
  "license": "Apache-2.0",
322
322
  "dependencies": {
323
323
  "@aws-sdk/core": "^3.974.20",
324
324
  "@aws-sdk/credential-provider-env": "^3.972.46",
325
325
  "@aws-sdk/credential-provider-http": "^3.972.48",
326
- "@aws-sdk/credential-provider-login": "^3.972.51",
326
+ "@aws-sdk/credential-provider-login": "^3.972.52",
327
327
  "@aws-sdk/credential-provider-process": "^3.972.46",
328
- "@aws-sdk/credential-provider-sso": "^3.972.51",
329
- "@aws-sdk/credential-provider-web-identity": "^3.972.51",
330
- "@aws-sdk/nested-clients": "^3.997.19",
328
+ "@aws-sdk/credential-provider-sso": "^3.972.52",
329
+ "@aws-sdk/credential-provider-web-identity": "^3.972.52",
330
+ "@aws-sdk/nested-clients": "^3.997.20",
331
331
  "@aws-sdk/types": "^3.973.12",
332
332
  "@smithy/core": "^3.24.6",
333
333
  "@smithy/credential-provider-imds": "^4.3.7",
@@ -339,13 +339,13 @@
339
339
  }
340
340
  },
341
341
  "node_modules/@aws-sdk/credential-provider-login": {
342
- "version": "3.972.51",
343
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.51.tgz",
344
- "integrity": "sha512-csHFsH+/VjnI40oqm1l1OqMY4B4kza36DbfcbHcgcbobgjebasqUbTU34xvwUkvtoNGGizbfyMSlMzJWUPv3dQ==",
342
+ "version": "3.972.52",
343
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.52.tgz",
344
+ "integrity": "sha512-9hu2oR0qH7Fst5Tzdx+UWxm+w5zCXtErTLtOOW5hwwQc170CLwOeniRxyFY6s9mHfGEfC5zFukNBdKBwJR8mhQ==",
345
345
  "license": "Apache-2.0",
346
346
  "dependencies": {
347
347
  "@aws-sdk/core": "^3.974.20",
348
- "@aws-sdk/nested-clients": "^3.997.19",
348
+ "@aws-sdk/nested-clients": "^3.997.20",
349
349
  "@aws-sdk/types": "^3.973.12",
350
350
  "@smithy/core": "^3.24.6",
351
351
  "@smithy/types": "^4.14.3",
@@ -356,17 +356,17 @@
356
356
  }
357
357
  },
358
358
  "node_modules/@aws-sdk/credential-provider-node": {
359
- "version": "3.972.54",
360
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.54.tgz",
361
- "integrity": "sha512-vinTSQtziNHxi2nqXF+76jr2sO44q88Ind1qFFVaotNgBaC1rcWDjBug8yoE8n0ov33s21xks9WY5XDHH9SENw==",
359
+ "version": "3.972.55",
360
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.55.tgz",
361
+ "integrity": "sha512-zMGLa/dhESVqmCD7mmIFFKSwSFrJGScvCXcjvBZEVOOMauFS5JRQvLTMukFpMEFWiV6dTAlsen2ATDBulLPtbg==",
362
362
  "license": "Apache-2.0",
363
363
  "dependencies": {
364
364
  "@aws-sdk/credential-provider-env": "^3.972.46",
365
365
  "@aws-sdk/credential-provider-http": "^3.972.48",
366
- "@aws-sdk/credential-provider-ini": "^3.972.52",
366
+ "@aws-sdk/credential-provider-ini": "^3.972.53",
367
367
  "@aws-sdk/credential-provider-process": "^3.972.46",
368
- "@aws-sdk/credential-provider-sso": "^3.972.51",
369
- "@aws-sdk/credential-provider-web-identity": "^3.972.51",
368
+ "@aws-sdk/credential-provider-sso": "^3.972.52",
369
+ "@aws-sdk/credential-provider-web-identity": "^3.972.52",
370
370
  "@aws-sdk/types": "^3.973.12",
371
371
  "@smithy/core": "^3.24.6",
372
372
  "@smithy/credential-provider-imds": "^4.3.7",
@@ -394,14 +394,14 @@
394
394
  }
395
395
  },
396
396
  "node_modules/@aws-sdk/credential-provider-sso": {
397
- "version": "3.972.51",
398
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.51.tgz",
399
- "integrity": "sha512-60qhpQcSDIKIr0AuBlmJezKX0b5nbJPCINiR49N9yJXrEI5tTRwsXVBr0IdSvvsNJyqgiINyoBd++Ed0yvggbw==",
397
+ "version": "3.972.52",
398
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.52.tgz",
399
+ "integrity": "sha512-nb2/n4o/HQf+FVpVbZe9vCTFngmuDoIsltMgLAtjixaKzvzhB4J8WSDFyWgnErgLHk55ctWH+I4PU+LIHhyffg==",
400
400
  "license": "Apache-2.0",
401
401
  "dependencies": {
402
402
  "@aws-sdk/core": "^3.974.20",
403
- "@aws-sdk/nested-clients": "^3.997.19",
404
- "@aws-sdk/token-providers": "3.1065.0",
403
+ "@aws-sdk/nested-clients": "^3.997.20",
404
+ "@aws-sdk/token-providers": "3.1066.0",
405
405
  "@aws-sdk/types": "^3.973.12",
406
406
  "@smithy/core": "^3.24.6",
407
407
  "@smithy/types": "^4.14.3",
@@ -412,13 +412,13 @@
412
412
  }
413
413
  },
414
414
  "node_modules/@aws-sdk/credential-provider-web-identity": {
415
- "version": "3.972.51",
416
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.51.tgz",
417
- "integrity": "sha512-0X5eWsUIp8ItRJeJBBrhQAPzc9AQelDetRTVTsycCAISCCzM17R4hs/vFAPeQ0o0B35sciLiqe/Pwmml909cZA==",
415
+ "version": "3.972.52",
416
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.52.tgz",
417
+ "integrity": "sha512-lKj6aRSGbqLmpYmM24bY7a1Xmfcq2vkE3hv8CSPYfc1yCu0BPu/XEJ1L4Fm61MsU6ULLNSG8UGsffNoFUBjESA==",
418
418
  "license": "Apache-2.0",
419
419
  "dependencies": {
420
420
  "@aws-sdk/core": "^3.974.20",
421
- "@aws-sdk/nested-clients": "^3.997.19",
421
+ "@aws-sdk/nested-clients": "^3.997.20",
422
422
  "@aws-sdk/types": "^3.973.12",
423
423
  "@smithy/core": "^3.24.6",
424
424
  "@smithy/types": "^4.14.3",
@@ -429,15 +429,15 @@
429
429
  }
430
430
  },
431
431
  "node_modules/@aws-sdk/nested-clients": {
432
- "version": "3.997.19",
433
- "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.19.tgz",
434
- "integrity": "sha512-P2Otgf15GBJMKzG6j5Ddf7w+Kz6z2jvesMy874TD3jlMfDWNK7clJeUd7hgigdeVOotjoUP4emcTWVdS9sfZDw==",
432
+ "version": "3.997.20",
433
+ "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.20.tgz",
434
+ "integrity": "sha512-IYJuLpXp2DEILVQpQOy0PMpkftv0AHEOCn52o0atyOaumA0CdWQ3klPyXdViGYLbNpESsVFMVybvHUeZAuiGxA==",
435
435
  "license": "Apache-2.0",
436
436
  "dependencies": {
437
437
  "@aws-crypto/sha256-browser": "5.2.0",
438
438
  "@aws-crypto/sha256-js": "5.2.0",
439
439
  "@aws-sdk/core": "^3.974.20",
440
- "@aws-sdk/signature-v4-multi-region": "^3.996.33",
440
+ "@aws-sdk/signature-v4-multi-region": "^3.996.34",
441
441
  "@aws-sdk/types": "^3.973.12",
442
442
  "@smithy/core": "^3.24.6",
443
443
  "@smithy/fetch-http-handler": "^5.4.6",
@@ -450,9 +450,9 @@
450
450
  }
451
451
  },
452
452
  "node_modules/@aws-sdk/signature-v4-multi-region": {
453
- "version": "3.996.33",
454
- "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.33.tgz",
455
- "integrity": "sha512-Hn0RThJEbyOZWV2PV9Z4YD3nitGPxybmyU17dSe9b61WOBcKnqS0WTtM3c1zyZq9WnGiyrfi/i+UBPUk7cM8Ug==",
453
+ "version": "3.996.34",
454
+ "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.34.tgz",
455
+ "integrity": "sha512-mx1L5qlumSOt/nKM3BFaHE2HVkWwz0i4Bw0pyYO42FfX/FeLlo8YI6csC0gSPprEk6fTIqI+CZN9RwUwKd5krQ==",
456
456
  "license": "Apache-2.0",
457
457
  "dependencies": {
458
458
  "@aws-sdk/types": "^3.973.12",
@@ -465,13 +465,13 @@
465
465
  }
466
466
  },
467
467
  "node_modules/@aws-sdk/token-providers": {
468
- "version": "3.1065.0",
469
- "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1065.0.tgz",
470
- "integrity": "sha512-qdHQntq82gMqG6Tf8xrgmhJxacaYkxW4PEeDg/ISMVJ84EWe7iD6JyCTgbyox3uNDH6vqEJ8GUiTaXCq307zVw==",
468
+ "version": "3.1066.0",
469
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1066.0.tgz",
470
+ "integrity": "sha512-UqEUJq7dqa44hneLDUcX7UJy95cg8YqEWyakRpvIPnrNS3Mq+UlQHgCDGu5pvwAPtlIW4qcYbvW6reG6++FyvA==",
471
471
  "license": "Apache-2.0",
472
472
  "dependencies": {
473
473
  "@aws-sdk/core": "^3.974.20",
474
- "@aws-sdk/nested-clients": "^3.997.19",
474
+ "@aws-sdk/nested-clients": "^3.997.20",
475
475
  "@aws-sdk/types": "^3.973.12",
476
476
  "@smithy/core": "^3.24.6",
477
477
  "@smithy/types": "^4.14.3",
@@ -4135,9 +4135,9 @@
4135
4135
  }
4136
4136
  },
4137
4137
  "node_modules/electron-to-chromium": {
4138
- "version": "1.5.370",
4139
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.370.tgz",
4140
- "integrity": "sha512-D5tSHJReAb/Kf3Hu9F/GO4lJuSWzEWHwvQ/kKSUP7pimNgvxkSKj+gUQhHpKKACwrin7rS3byU7IxreF56rl5g==",
4138
+ "version": "1.5.371",
4139
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.371.tgz",
4140
+ "integrity": "sha512-e9htk9mAYL6AzmkEhSvVVw7IWGSBJ/Bqdn2eRyRLrj1g6sncN4WbFt5qnILYoCktktr45pyjIrOiRvBThQ808w==",
4141
4141
  "dev": true,
4142
4142
  "license": "ISC"
4143
4143
  },
@@ -7919,9 +7919,9 @@
7919
7919
  "license": "BSD-3-Clause"
7920
7920
  },
7921
7921
  "node_modules/semver": {
7922
- "version": "7.8.3",
7923
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.3.tgz",
7924
- "integrity": "sha512-wnilbGyMxzbY7dNOl7jpKbLSjcfeweJWU5j4+u5qW+6/wuGD9KzIGOyZnQVSBM9E7DtWaaH3CyHkppYrKYoxwg==",
7922
+ "version": "7.8.4",
7923
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz",
7924
+ "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
7925
7925
  "license": "ISC",
7926
7926
  "bin": {
7927
7927
  "semver": "bin/semver.js"
@@ -1 +1 @@
1
- {"version":3,"file":"tui-handlers.d.ts","sourceRoot":"","sources":["../src/tui-handlers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAQ5C,OAAO,EACL,aAAa,EAId,MAAM,qBAAqB,CAAC;AA2G7B;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,aAAa,EAAE,aAAa,GAAG,IAAI,EACnC,SAAS,EAAE,OAAO,GACjB,IAAI,CA0CN"}
1
+ {"version":3,"file":"tui-handlers.d.ts","sourceRoot":"","sources":["../src/tui-handlers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAQ5C,OAAO,EACL,aAAa,EAId,MAAM,qBAAqB,CAAC;AA4G7B;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,aAAa,EAAE,aAAa,GAAG,IAAI,EACnC,SAAS,EAAE,OAAO,GACjB,IAAI,CA4CN"}
@@ -61,6 +61,7 @@ const DEDUPE_EXEMPT_COMMANDS = new Set([
61
61
  'sentinel.load',
62
62
  'sentinel.apply',
63
63
  'sentinel.applyCustom',
64
+ 'shield.load',
64
65
  ]);
65
66
  function portCheckHint(port) {
66
67
  if (process.platform === 'win32') {
@@ -97,6 +98,8 @@ export function initializeTUIHandlers(server, gatewayClient, localMode) {
97
98
  if (!DEDUPE_EXEMPT_COMMANDS.has(context.command) &&
98
99
  pendingCommands.has(commandKey)) {
99
100
  console.log(`[DEDUPE] Ignoring duplicate command: ${context.command}`);
101
+ // Always respond so the TUI does not hang waiting for a matching id.
102
+ server.sendError(context.ws, context.id, `Duplicate ${context.command} skipped — retry in a moment`);
100
103
  return;
101
104
  }
102
105
  // Add to pending set
@@ -1323,28 +1326,50 @@ async function handleShieldCommand(ctx, action) {
1323
1326
  ctx.server.sendError(ctx.ws, ctx.id, 'Not connected to Gateway. Connect via Connection Portal first.');
1324
1327
  return;
1325
1328
  }
1326
- if (action === 'status') {
1329
+ if (action === 'load' || action === 'status') {
1327
1330
  try {
1328
- const [healthRaw, configRaw, metricsText] = await Promise.all([
1331
+ const [healthRaw, configRaw, metricsText, gatewayHealthRaw, runsList] = await Promise.all([
1329
1332
  gc.getJson('/api/shield/health'),
1330
1333
  gc.getJson('/api/shield/config'),
1331
1334
  gc.prometheusMetrics().catch(() => ''),
1335
+ gc.getJson('/health').catch(() => null),
1336
+ gc.runs.list({ limit: 50 }).catch(() => []),
1332
1337
  ]);
1333
1338
  const snap = metricsText ? summarizeGatewayPrometheusMetrics(metricsText) : null;
1339
+ const metrics = snap
1340
+ ? {
1341
+ blocks: snap.totals.shieldBlocks,
1342
+ masks: snap.totals.shieldMasks,
1343
+ rewrites: snap.totals.shieldRewrites,
1344
+ decisions: snap.totals.shieldDecisions,
1345
+ }
1346
+ : {
1347
+ blocks: 0,
1348
+ masks: 0,
1349
+ rewrites: 0,
1350
+ decisions: 0,
1351
+ };
1352
+ const warnings = [];
1353
+ const gh = gatewayHealthRaw;
1354
+ const checks = gh?.checks;
1355
+ const shieldCheck = checks?.shield;
1356
+ if (shieldCheck && Array.isArray(shieldCheck.warnings)) {
1357
+ for (const w of shieldCheck.warnings) {
1358
+ if (typeof w === 'string')
1359
+ warnings.push(w);
1360
+ }
1361
+ }
1334
1362
  ctx.server.sendResponse(ctx.ws, ctx.id, {
1335
1363
  success: true,
1336
1364
  data: {
1365
+ shieldLoad: true,
1337
1366
  shieldStatus: true,
1338
1367
  health: healthRaw,
1339
1368
  config: configRaw,
1340
- metrics: snap
1341
- ? {
1342
- blocks: snap.totals.shieldBlocks,
1343
- masks: snap.totals.shieldMasks,
1344
- rewrites: snap.totals.shieldRewrites,
1345
- decisions: snap.totals.shieldDecisions,
1346
- }
1347
- : null,
1369
+ metrics,
1370
+ gatewayHealth: gatewayHealthRaw,
1371
+ recentRuns: runsList,
1372
+ warnings,
1348
1373
  },
1349
1374
  });
1350
1375
  }
@@ -1400,7 +1425,7 @@ async function handleShieldCommand(ctx, action) {
1400
1425
  }
1401
1426
  return;
1402
1427
  }
1403
- ctx.server.sendError(ctx.ws, ctx.id, `Unknown shield action: ${action} (try status, probe, demo)`);
1428
+ ctx.server.sendError(ctx.ws, ctx.id, `Unknown shield action: ${action} (try load)`);
1404
1429
  }
1405
1430
  // ============================================================
1406
1431
  // SENTINEL CONFIG HANDLERS