camstack 1.2.139 → 1.2.141

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.
@@ -28352,6 +28352,14 @@ var NativeCropResultSchema = external_exports.object({
28352
28352
  * set `encodeJpeg: true`; `bytes` is then absent.
28353
28353
  */
28354
28354
  jpeg: external_exports.string().optional(),
28355
+ /**
28356
+ * The SAME compressed JPEG as `jpeg`, as bytes (D462). Present instead of
28357
+ * `jpeg` when the request set `acceptJpegBytes`; a request that did not gets
28358
+ * `jpeg` exactly as before. MsgPack and the mesh leg both carry binary —
28359
+ * `bytes` above has crossed this boundary as a `Uint8Array` all along — so
28360
+ * base64 was buying nothing but a multi-megabyte string in the relay's heap.
28361
+ */
28362
+ jpegBytes: external_exports.instanceof(Uint8Array).optional(),
28355
28363
  width: external_exports.number().int().positive(),
28356
28364
  height: external_exports.number().int().positive(),
28357
28365
  /**
@@ -28393,7 +28401,14 @@ var ParkTrackFrameResultSchema = external_exports.discriminatedUnion("parked", [
28393
28401
  detail: external_exports.string().optional()
28394
28402
  })]);
28395
28403
  var ParkedTrackFrameSchema = external_exports.object({
28396
- jpeg: external_exports.string(),
28404
+ /**
28405
+ * Base64 JPEG — the pre-D462 wire. OPTIONAL since D462: a request that set
28406
+ * `acceptJpegBytes` is answered in `jpegBytes` and this is then absent.
28407
+ * Exactly one of the two is present.
28408
+ */
28409
+ jpeg: external_exports.string().optional(),
28410
+ /** The same JPEG as bytes, for a caller that declared it reads them (D462). */
28411
+ jpegBytes: external_exports.instanceof(Uint8Array).optional(),
28397
28412
  width: external_exports.number().int().positive(),
28398
28413
  height: external_exports.number().int().positive(),
28399
28414
  /** The frame instant the parcel shows (the caller's clock, echoed back). */
@@ -29049,6 +29064,13 @@ var pipelineRunnerCapability = {
29049
29064
  bbox: NativeCropBboxSchema,
29050
29065
  maxWidth: external_exports.number().int().positive().optional(),
29051
29066
  /**
29067
+ * The caller reads a `Uint8Array` (D462). When set, a JPEG answer comes
29068
+ * back in `jpegBytes` instead of base64 `jpeg`. Absent means the old
29069
+ * wire — never assume consent: a pre-D462 caller parses the field as
29070
+ * base64 and bytes would decode to garbage rather than fail.
29071
+ */
29072
+ acceptJpegBytes: external_exports.boolean().optional(),
29073
+ /**
29052
29074
  * When `true`, the runner encodes the resolved crop to JPEG ON THE
29053
29075
  * OWNING NODE and returns it in `jpeg` (base64) INSTEAD of raw `bytes`.
29054
29076
  * Callers set this for CROSS-NODE fetches (`handle.nodeId` is a remote
@@ -29221,7 +29243,14 @@ var pipelineRunnerCapability = {
29221
29243
  getParkedTrackFrame: method(external_exports.object({
29222
29244
  deviceId: external_exports.number(),
29223
29245
  trackId: external_exports.string(),
29224
- kind: ParkedFrameKindSchema
29246
+ kind: ParkedFrameKindSchema,
29247
+ /**
29248
+ * The caller reads a `Uint8Array` (D462). When set, a JPEG answer comes
29249
+ * back in `jpegBytes` instead of base64 `jpeg`. Absent means the old
29250
+ * wire — never assume consent: a pre-D462 caller parses the field as
29251
+ * base64 and bytes would decode to garbage rather than fail.
29252
+ */
29253
+ acceptJpegBytes: external_exports.boolean().optional()
29225
29254
  }), ParkedTrackFrameSchema.nullable()),
29226
29255
  /**
29227
29256
  * Drop every parcel of a track — the hub closed it. Idempotent. A track
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runDiscover
4
- } from "./chunk-CN634R3T.js";
4
+ } from "./chunk-I7QELQM5.js";
5
5
  import "./chunk-LMMQX4CK.js";
6
6
 
7
7
  // src/cli.ts
@@ -38,7 +38,7 @@ async function runServe(args) {
38
38
  ...typeof values.data === "string" ? { data: values.data } : {}
39
39
  };
40
40
  Object.assign(process.env, buildServeEnv(opts));
41
- await import("./launcher-XPB2M67K.js");
41
+ await import("./launcher-VU6P7QP5.js");
42
42
  }
43
43
 
44
44
  // src/commands/agent.ts
@@ -83,7 +83,7 @@ async function runAgent(args) {
83
83
  ...typeof values.port === "string" ? { port: values.port } : {}
84
84
  };
85
85
  Object.assign(process.env, buildAgentEnv(opts));
86
- await import("./launcher-XPB2M67K.js");
86
+ await import("./launcher-VU6P7QP5.js");
87
87
  }
88
88
 
89
89
  // src/commands/setup.ts
@@ -531,6 +531,7 @@ async function deployAddon(addonPath, opts) {
531
531
  targets.push({ label: "hub" });
532
532
  }
533
533
  const outcomes = [];
534
+ let propagating = false;
534
535
  for (const t of targets) {
535
536
  console.log(`[camstack] \u2192 Deploying ${path2.basename(tgzPath)} to ${t.label}...`);
536
537
  const result = await withNetworkRetry(
@@ -553,6 +554,7 @@ async function deployAddon(addonPath, opts) {
553
554
  console.error(`[camstack] \u2717 ${t.label}: ${misrouted}`);
554
555
  outcomes.push({ target: t.label, ok: false, detail: misrouted });
555
556
  } else if (result.success) {
557
+ if (result.propagatingToAgentsInBackground === true) propagating = true;
556
558
  const { detail, warning } = describeDeployOutcome(result, t.nodeId !== void 0);
557
559
  console.log(`[camstack] \u2713 ${t.label}: ${detail}`);
558
560
  if (warning) console.warn(`[camstack] \u26A0 ${t.label}: ${warning}`);
@@ -569,6 +571,14 @@ async function deployAddon(addonPath, opts) {
569
571
  process.exit(1);
570
572
  }
571
573
  console.log(`[camstack] \u2713 Deployed to ${outcomes.length} target(s)`);
574
+ if (propagating) {
575
+ console.log(
576
+ "[camstack] \u2026 agents are updated in the BACKGROUND and are NOT covered by the \u2713 above."
577
+ );
578
+ console.log(
579
+ "[camstack] Confirm with: hub log line `propagation done` (per-agent success/error)."
580
+ );
581
+ }
572
582
  if (opts.verify !== false) {
573
583
  process.stdout.write("[camstack] Verifying hub health");
574
584
  const healthy = await verifyHubHealthy(opts.serverUrl, { attempts: 20, delayMs: 1500 });
@@ -1130,7 +1140,7 @@ function isUnknown(_value) {
1130
1140
  return true;
1131
1141
  }
1132
1142
  async function resolveServerInteractive(presetNamespace) {
1133
- const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-5XVCTM5V.js");
1143
+ const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-ELE6KHU4.js");
1134
1144
  if (presetNamespace) {
1135
1145
  const spinner4 = clack.spinner();
1136
1146
  spinner4.start(`Discovering hub on LAN (namespace "${presetNamespace}")`);
@@ -5,7 +5,7 @@ import {
5
5
  filterHubNodes,
6
6
  resolveHubFromDiscovered,
7
7
  runDiscover
8
- } from "./chunk-CN634R3T.js";
8
+ } from "./chunk-I7QELQM5.js";
9
9
  import "./chunk-LMMQX4CK.js";
10
10
  export {
11
11
  DEFAULT_HUB_HTTPS_PORT,
@@ -23633,9 +23633,9 @@ var require_zod = __commonJS({
23633
23633
  }
23634
23634
  });
23635
23635
 
23636
- // ../system/dist/dist-CllKpcTd.js
23637
- var require_dist_CllKpcTd = __commonJS({
23638
- "../system/dist/dist-CllKpcTd.js"(exports) {
23636
+ // ../system/dist/dist-0sWJNwme.js
23637
+ var require_dist_0sWJNwme = __commonJS({
23638
+ "../system/dist/dist-0sWJNwme.js"(exports) {
23639
23639
  "use strict";
23640
23640
  var zod = require_zod();
23641
23641
  var EventCategory = /* @__PURE__ */ (function(EventCategory2) {
@@ -39130,6 +39130,14 @@ var require_dist_CllKpcTd = __commonJS({
39130
39130
  * set `encodeJpeg: true`; `bytes` is then absent.
39131
39131
  */
39132
39132
  jpeg: zod.z.string().optional(),
39133
+ /**
39134
+ * The SAME compressed JPEG as `jpeg`, as bytes (D462). Present instead of
39135
+ * `jpeg` when the request set `acceptJpegBytes`; a request that did not gets
39136
+ * `jpeg` exactly as before. MsgPack and the mesh leg both carry binary —
39137
+ * `bytes` above has crossed this boundary as a `Uint8Array` all along — so
39138
+ * base64 was buying nothing but a multi-megabyte string in the relay's heap.
39139
+ */
39140
+ jpegBytes: zod.z.instanceof(Uint8Array).optional(),
39133
39141
  width: zod.z.number().int().positive(),
39134
39142
  height: zod.z.number().int().positive(),
39135
39143
  /**
@@ -39171,7 +39179,14 @@ var require_dist_CllKpcTd = __commonJS({
39171
39179
  detail: zod.z.string().optional()
39172
39180
  })]);
39173
39181
  var ParkedTrackFrameSchema = zod.z.object({
39174
- jpeg: zod.z.string(),
39182
+ /**
39183
+ * Base64 JPEG — the pre-D462 wire. OPTIONAL since D462: a request that set
39184
+ * `acceptJpegBytes` is answered in `jpegBytes` and this is then absent.
39185
+ * Exactly one of the two is present.
39186
+ */
39187
+ jpeg: zod.z.string().optional(),
39188
+ /** The same JPEG as bytes, for a caller that declared it reads them (D462). */
39189
+ jpegBytes: zod.z.instanceof(Uint8Array).optional(),
39175
39190
  width: zod.z.number().int().positive(),
39176
39191
  height: zod.z.number().int().positive(),
39177
39192
  /** The frame instant the parcel shows (the caller's clock, echoed back). */
@@ -39654,6 +39669,13 @@ var require_dist_CllKpcTd = __commonJS({
39654
39669
  bbox: NativeCropBboxSchema,
39655
39670
  maxWidth: zod.z.number().int().positive().optional(),
39656
39671
  /**
39672
+ * The caller reads a `Uint8Array` (D462). When set, a JPEG answer comes
39673
+ * back in `jpegBytes` instead of base64 `jpeg`. Absent means the old
39674
+ * wire — never assume consent: a pre-D462 caller parses the field as
39675
+ * base64 and bytes would decode to garbage rather than fail.
39676
+ */
39677
+ acceptJpegBytes: zod.z.boolean().optional(),
39678
+ /**
39657
39679
  * When `true`, the runner encodes the resolved crop to JPEG ON THE
39658
39680
  * OWNING NODE and returns it in `jpeg` (base64) INSTEAD of raw `bytes`.
39659
39681
  * Callers set this for CROSS-NODE fetches (`handle.nodeId` is a remote
@@ -39826,7 +39848,14 @@ var require_dist_CllKpcTd = __commonJS({
39826
39848
  getParkedTrackFrame: method(zod.z.object({
39827
39849
  deviceId: zod.z.number(),
39828
39850
  trackId: zod.z.string(),
39829
- kind: ParkedFrameKindSchema
39851
+ kind: ParkedFrameKindSchema,
39852
+ /**
39853
+ * The caller reads a `Uint8Array` (D462). When set, a JPEG answer comes
39854
+ * back in `jpegBytes` instead of base64 `jpeg`. Absent means the old
39855
+ * wire — never assume consent: a pre-D462 caller parses the field as
39856
+ * base64 and bytes would decode to garbage rather than fail.
39857
+ */
39858
+ acceptJpegBytes: zod.z.boolean().optional()
39830
39859
  }), ParkedTrackFrameSchema.nullable()),
39831
39860
  /**
39832
39861
  * Drop every parcel of a track — the hub closed it. Idempotent. A track
@@ -61710,7 +61739,7 @@ var require_alerts_addon = __commonJS({
61710
61739
  [Symbol.toStringTag]: { value: "Module" }
61711
61740
  });
61712
61741
  require_chunk_Cek0wNdY();
61713
- var require_dist10 = require_dist_CllKpcTd();
61742
+ var require_dist10 = require_dist_0sWJNwme();
61714
61743
  function selectExpired(alerts, cutoffMs) {
61715
61744
  return alerts.filter((a) => a.createdAt < cutoffMs).sort((a, b) => a.createdAt - b.createdAt).map((a) => a.id);
61716
61745
  }
@@ -62529,7 +62558,7 @@ var require_console_logging = __commonJS({
62529
62558
  [Symbol.toStringTag]: { value: "Module" }
62530
62559
  });
62531
62560
  require_chunk_Cek0wNdY();
62532
- var require_dist10 = require_dist_CllKpcTd();
62561
+ var require_dist10 = require_dist_0sWJNwme();
62533
62562
  var require_formatter = require_formatter_DqAKDlvN();
62534
62563
  var LEVEL_RANK = {
62535
62564
  debug: 0,
@@ -62623,7 +62652,7 @@ var require_core_blocks_addon = __commonJS({
62623
62652
  "use strict";
62624
62653
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
62625
62654
  var require_chunk = require_chunk_Cek0wNdY();
62626
- var require_dist10 = require_dist_CllKpcTd();
62655
+ var require_dist10 = require_dist_0sWJNwme();
62627
62656
  var node_crypto = __require("crypto");
62628
62657
  var node_fs_promises = __require("fs/promises");
62629
62658
  node_fs_promises = require_chunk.__toESM(node_fs_promises);
@@ -63520,11 +63549,11 @@ var require_core_blocks = __commonJS({
63520
63549
  }
63521
63550
  });
63522
63551
 
63523
- // ../system/dist/retired-settings-keys-7iEsSzmD.js
63524
- var require_retired_settings_keys_7iEsSzmD = __commonJS({
63525
- "../system/dist/retired-settings-keys-7iEsSzmD.js"(exports) {
63552
+ // ../system/dist/retired-settings-keys-Dh-XMfFx.js
63553
+ var require_retired_settings_keys_Dh_XMfFx = __commonJS({
63554
+ "../system/dist/retired-settings-keys-Dh-XMfFx.js"(exports) {
63526
63555
  "use strict";
63527
- var require_dist10 = require_dist_CllKpcTd();
63556
+ var require_dist10 = require_dist_0sWJNwme();
63528
63557
  function settingsStoreIsAuthoritativeHere(env) {
63529
63558
  const raw = (env["CAMSTACK_ROLE"] ?? "").trim().toLowerCase();
63530
63559
  return raw === "" || raw === "hub";
@@ -65759,8 +65788,8 @@ var require_device_manager_addon = __commonJS({
65759
65788
  [Symbol.toStringTag]: { value: "Module" }
65760
65789
  });
65761
65790
  require_chunk_Cek0wNdY();
65762
- var require_dist10 = require_dist_CllKpcTd();
65763
- var require_retired_settings_keys = require_retired_settings_keys_7iEsSzmD();
65791
+ var require_dist10 = require_dist_0sWJNwme();
65792
+ var require_retired_settings_keys = require_retired_settings_keys_Dh_XMfFx();
65764
65793
  var node_crypto = __require("crypto");
65765
65794
  var _camstack_types_node = require_node();
65766
65795
  var JOB_HISTORY = 20;
@@ -71385,7 +71414,7 @@ var require_hub_forwarder = __commonJS({
71385
71414
  [Symbol.toStringTag]: { value: "Module" }
71386
71415
  });
71387
71416
  require_chunk_Cek0wNdY();
71388
- var require_dist10 = require_dist_CllKpcTd();
71417
+ var require_dist10 = require_dist_0sWJNwme();
71389
71418
  var require_formatter = require_formatter_DqAKDlvN();
71390
71419
  var DEFAULT_OUTBOUND_BUFFER_SIZE = 500;
71391
71420
  var HubForwarderDestination = class {
@@ -71522,7 +71551,7 @@ var require_liveness_monitor_addon = __commonJS({
71522
71551
  "use strict";
71523
71552
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
71524
71553
  require_chunk_Cek0wNdY();
71525
- var require_dist10 = require_dist_CllKpcTd();
71554
+ var require_dist10 = require_dist_0sWJNwme();
71526
71555
  var NO_DEVICES = "liveness:no-devices";
71527
71556
  var ALL_OFFLINE = "liveness:all-devices-offline";
71528
71557
  var NO_FOOTAGE_PREFIX = "liveness:no-footage:";
@@ -71718,7 +71747,7 @@ var require_local_auth_addon = __commonJS({
71718
71747
  [Symbol.toStringTag]: { value: "Module" }
71719
71748
  });
71720
71749
  var require_chunk = require_chunk_Cek0wNdY();
71721
- var require_dist10 = require_dist_CllKpcTd();
71750
+ var require_dist10 = require_dist_0sWJNwme();
71722
71751
  var node_crypto = __require("crypto");
71723
71752
  node_crypto = require_chunk.__toESM(node_crypto);
71724
71753
  var crypto$1 = __require("crypto");
@@ -79531,7 +79560,7 @@ var require_loki_logging = __commonJS({
79531
79560
  [Symbol.toStringTag]: { value: "Module" }
79532
79561
  });
79533
79562
  require_chunk_Cek0wNdY();
79534
- var require_dist10 = require_dist_CllKpcTd();
79563
+ var require_dist10 = require_dist_0sWJNwme();
79535
79564
  function sanitizeLabelName(raw) {
79536
79565
  const replaced = raw.replaceAll(/[^a-zA-Z0-9_]/g, "_");
79537
79566
  return /^[a-zA-Z_]/.test(replaced) ? replaced : `_${replaced}`;
@@ -80118,7 +80147,7 @@ var require_native_metrics_addon = __commonJS({
80118
80147
  [Symbol.toStringTag]: { value: "Module" }
80119
80148
  });
80120
80149
  var require_chunk = require_chunk_Cek0wNdY();
80121
- var require_dist10 = require_dist_CllKpcTd();
80150
+ var require_dist10 = require_dist_0sWJNwme();
80122
80151
  var node_fs_promises = __require("fs/promises");
80123
80152
  var node_fs = __require("fs");
80124
80153
  node_fs = require_chunk.__toESM(node_fs);
@@ -82871,7 +82900,7 @@ var require_filesystem_storage_addon = __commonJS({
82871
82900
  [Symbol.toStringTag]: { value: "Module" }
82872
82901
  });
82873
82902
  var require_chunk = require_chunk_Cek0wNdY();
82874
- var require_dist10 = require_dist_CllKpcTd();
82903
+ var require_dist10 = require_dist_0sWJNwme();
82875
82904
  var node_crypto = __require("crypto");
82876
82905
  var node_fs_promises = __require("fs/promises");
82877
82906
  var node_path = __require("path");
@@ -84098,8 +84127,8 @@ var require_sqlite_settings_addon = __commonJS({
84098
84127
  [Symbol.toStringTag]: { value: "Module" }
84099
84128
  });
84100
84129
  var require_chunk = require_chunk_Cek0wNdY();
84101
- var require_dist10 = require_dist_CllKpcTd();
84102
- var require_retired_settings_keys = require_retired_settings_keys_7iEsSzmD();
84130
+ var require_dist10 = require_dist_0sWJNwme();
84131
+ var require_retired_settings_keys = require_retired_settings_keys_Dh_XMfFx();
84103
84132
  var require_wal_checkpoint_policy = require_wal_checkpoint_policy_CCJZngds();
84104
84133
  var node_crypto = __require("crypto");
84105
84134
  var node_path = __require("path");
@@ -86766,7 +86795,7 @@ var require_storage_orchestrator_addon = __commonJS({
86766
86795
  [Symbol.toStringTag]: { value: "Module" }
86767
86796
  });
86768
86797
  var require_chunk = require_chunk_Cek0wNdY();
86769
- var require_dist10 = require_dist_CllKpcTd();
86798
+ var require_dist10 = require_dist_0sWJNwme();
86770
86799
  var require_hub_cap_forward = require_hub_cap_forward_DmHNjbB0();
86771
86800
  var zod = require_zod();
86772
86801
  var node_crypto = __require("crypto");
@@ -90416,7 +90445,7 @@ var require_system_config_addon = __commonJS({
90416
90445
  [Symbol.toStringTag]: { value: "Module" }
90417
90446
  });
90418
90447
  require_chunk_Cek0wNdY();
90419
- var require_dist10 = require_dist_CllKpcTd();
90448
+ var require_dist10 = require_dist_0sWJNwme();
90420
90449
  var SECTION_TITLES = {
90421
90450
  server: "Server",
90422
90451
  auth: "Authentication"
@@ -108477,7 +108506,7 @@ var require_winston_logging = __commonJS({
108477
108506
  [Symbol.toStringTag]: { value: "Module" }
108478
108507
  });
108479
108508
  var require_chunk = require_chunk_Cek0wNdY();
108480
- var require_dist10 = require_dist_CllKpcTd();
108509
+ var require_dist10 = require_dist_0sWJNwme();
108481
108510
  var require_formatter = require_formatter_DqAKDlvN();
108482
108511
  var node_path = __require("path");
108483
108512
  node_path = require_chunk.__toESM(node_path);
@@ -121213,9 +121242,9 @@ var require_dist2 = __commonJS({
121213
121242
  }
121214
121243
  });
121215
121244
 
121216
- // ../system/dist/manifest-system-deps-DfpwaXkh.js
121217
- var require_manifest_system_deps_DfpwaXkh = __commonJS({
121218
- "../system/dist/manifest-system-deps-DfpwaXkh.js"(exports) {
121245
+ // ../system/dist/manifest-system-deps-YYKKCKSF.js
121246
+ var require_manifest_system_deps_YYKKCKSF = __commonJS({
121247
+ "../system/dist/manifest-system-deps-YYKKCKSF.js"(exports) {
121219
121248
  "use strict";
121220
121249
  var require_chunk = require_chunk_Cek0wNdY();
121221
121250
  require_hub_cap_forward_DmHNjbB0();
@@ -121265,7 +121294,9 @@ var require_manifest_system_deps_DfpwaXkh = __commonJS({
121265
121294
  childrenConnected: listed.length,
121266
121295
  childrenUndeclared: registry.undeclaredChildCount(),
121267
121296
  crossNodeDelivered: crossNode?.delivered ?? 0,
121268
- crossNodeSuppressed: crossNode?.suppressed ?? 0
121297
+ crossNodeSuppressed: crossNode?.suppressed ?? 0,
121298
+ categories: registry.categoryFanout(),
121299
+ categoryOverflow: registry.categoryCensusOverflow()
121269
121300
  };
121270
121301
  } catch {
121271
121302
  return;
@@ -121275,8 +121306,10 @@ var require_manifest_system_deps_DfpwaXkh = __commonJS({
121275
121306
  var EVENT_PLANE_TOP_N = 5;
121276
121307
  var EMPTY_EVENT_PLANE_BASELINE = {
121277
121308
  children: /* @__PURE__ */ new Map(),
121309
+ categories: /* @__PURE__ */ new Map(),
121278
121310
  crossNodeDelivered: 0,
121279
- crossNodeSuppressed: 0
121311
+ crossNodeSuppressed: 0,
121312
+ categoryOverflow: 0
121280
121313
  };
121281
121314
  function diffEventPlane(baseline, current, topN = 5) {
121282
121315
  const deltas = [];
@@ -121294,6 +121327,23 @@ var require_manifest_system_deps_DfpwaXkh = __commonJS({
121294
121327
  suppressed
121295
121328
  });
121296
121329
  }
121330
+ const categoryDeltas = [];
121331
+ let categoryBroadcasts = 0;
121332
+ let orphanBroadcasts = 0;
121333
+ for (const sample of current.categories) {
121334
+ const before = baseline.categories.get(sample.category);
121335
+ const broadcasts = Math.max(0, sample.broadcasts - (before?.broadcasts ?? 0));
121336
+ if (broadcasts === 0) continue;
121337
+ const wanted = Math.max(0, sample.wanted - (before?.wanted ?? 0));
121338
+ categoryBroadcasts += broadcasts;
121339
+ if (wanted === 0) orphanBroadcasts += broadcasts;
121340
+ categoryDeltas.push({
121341
+ category: sample.category,
121342
+ broadcasts,
121343
+ wanted
121344
+ });
121345
+ }
121346
+ const byBroadcasts = categoryDeltas.toSorted((a, b) => b.broadcasts - a.broadcasts || a.category.localeCompare(b.category));
121297
121347
  return {
121298
121348
  udsMode: current.udsMode,
121299
121349
  crossNodeMode: current.crossNodeMode,
@@ -121303,7 +121353,12 @@ var require_manifest_system_deps_DfpwaXkh = __commonJS({
121303
121353
  fanoutSuppressed,
121304
121354
  crossNodeDelivered: Math.max(0, current.crossNodeDelivered - baseline.crossNodeDelivered),
121305
121355
  crossNodeSuppressed: Math.max(0, current.crossNodeSuppressed - baseline.crossNodeSuppressed),
121306
- top: deltas.toSorted((a, b) => b.sent - a.sent || a.childId.localeCompare(b.childId)).slice(0, topN)
121356
+ top: deltas.toSorted((a, b) => b.sent - a.sent || a.childId.localeCompare(b.childId)).slice(0, topN),
121357
+ categoryBroadcasts,
121358
+ orphanBroadcasts,
121359
+ topCategories: byBroadcasts.slice(0, topN),
121360
+ topOrphans: byBroadcasts.filter((c) => c.wanted === 0).slice(0, topN),
121361
+ categoryOverflow: Math.max(0, current.categoryOverflow - baseline.categoryOverflow)
121307
121362
  };
121308
121363
  }
121309
121364
  function createEventPlaneMeter(reader, topN = 5) {
@@ -121314,8 +121369,10 @@ var require_manifest_system_deps_DfpwaXkh = __commonJS({
121314
121369
  const window2 = diffEventPlane(baseline, current, topN);
121315
121370
  baseline = {
121316
121371
  children: new Map(current.children.map((s) => [s.childId, s])),
121372
+ categories: new Map(current.categories.map((c) => [c.category, c])),
121317
121373
  crossNodeDelivered: current.crossNodeDelivered,
121318
- crossNodeSuppressed: current.crossNodeSuppressed
121374
+ crossNodeSuppressed: current.crossNodeSuppressed,
121375
+ categoryOverflow: current.categoryOverflow
121319
121376
  };
121320
121377
  return window2;
121321
121378
  } };
@@ -121323,7 +121380,9 @@ var require_manifest_system_deps_DfpwaXkh = __commonJS({
121323
121380
  function formatEventPlane(window2) {
121324
121381
  if (window2 === void 0) return "";
121325
121382
  const top = window2.top.map((d) => `${d.childId}:${d.sent}/${d.suppressed}`).join(",");
121326
- return ` fanoutMode=uds:${window2.udsMode}/cross-node:${window2.crossNodeMode} children=${window2.childrenConnected} childrenUndeclared=${window2.childrenUndeclared} fanoutSent=${window2.fanoutSent} fanoutSuppressed=${window2.fanoutSuppressed} crossNodeDelivered=${window2.crossNodeDelivered} crossNodeSuppressed=${window2.crossNodeSuppressed}` + (top.length === 0 ? "" : ` fanoutTop=${top}`);
121383
+ const cats = window2.topCategories.map((c) => `${c.category}:${c.broadcasts}/${c.wanted}`).join(",");
121384
+ const orphans = window2.topOrphans.map((c) => `${c.category}:${c.broadcasts}`).join(",");
121385
+ return ` fanoutMode=uds:${window2.udsMode}/cross-node:${window2.crossNodeMode} children=${window2.childrenConnected} childrenUndeclared=${window2.childrenUndeclared} fanoutSent=${window2.fanoutSent} fanoutSuppressed=${window2.fanoutSuppressed} crossNodeDelivered=${window2.crossNodeDelivered} crossNodeSuppressed=${window2.crossNodeSuppressed} fanoutEvents=${window2.categoryBroadcasts} fanoutOrphans=${window2.orphanBroadcasts} fanoutCatsDropped=${window2.categoryOverflow}` + (top.length === 0 ? "" : ` fanoutTop=${top}`) + (cats.length === 0 ? "" : ` fanoutCats=${cats}`) + (orphans.length === 0 ? "" : ` fanoutOrphanTop=${orphans}`);
121327
121386
  }
121328
121387
  var EMPTY_CAP_ACTION_READING = /* @__PURE__ */ new Map();
121329
121388
  var CAP_ACTION_UNLABELLED = "(unlabelled)";
@@ -126394,6 +126453,12 @@ var require_manifest_system_deps_DfpwaXkh = __commonJS({
126394
126453
  fanoutMode = readFanoutMode();
126395
126454
  /** Per-child event fan-out counters (sent / suppressed). */
126396
126455
  childEventStats = /* @__PURE__ */ new Map();
126456
+ /** D467: per-category production census (cumulative). See {@link CategoryFanoutSample}. */
126457
+ categoryStats = /* @__PURE__ */ new Map();
126458
+ /** Broadcasts whose category did not fit in {@link CATEGORY_CENSUS_MAX}. */
126459
+ categoryOverflow = 0;
126460
+ /** One INFO line the first time the census cap trips, never per event. */
126461
+ categoryOverflowLogged = false;
126397
126462
  /** Last pattern-set string logged per child, to dedup the INFO line. */
126398
126463
  loggedPatternSet = /* @__PURE__ */ new Map();
126399
126464
  /**
@@ -126449,6 +126514,25 @@ var require_manifest_system_deps_DfpwaXkh = __commonJS({
126449
126514
  };
126450
126515
  }
126451
126516
  /**
126517
+ * D467: every category this node has broadcast, with its emit count and how
126518
+ * many child subscriptions matched. Cumulative for the life of the process —
126519
+ * the heartbeat differences it, the same discipline as the per-child
126520
+ * counters. Largest `broadcasts` first.
126521
+ */
126522
+ categoryFanout() {
126523
+ const out = [];
126524
+ for (const [category, s] of this.categoryStats) out.push({
126525
+ category,
126526
+ broadcasts: s.broadcasts,
126527
+ wanted: s.wanted
126528
+ });
126529
+ return out.toSorted((a, b) => b.broadcasts - a.broadcasts || a.category.localeCompare(b.category));
126530
+ }
126531
+ /** Broadcasts the census could not attribute because it was full (cumulative). */
126532
+ categoryCensusOverflow() {
126533
+ return this.categoryOverflow;
126534
+ }
126535
+ /**
126452
126536
  * This child's socket traffic — bytes and messages, both directions, split by
126453
126537
  * frame kind — or `null` when the child is gone or its channel keeps no
126454
126538
  * counters (an in-process or test transport).
@@ -126539,6 +126623,17 @@ var require_manifest_system_deps_DfpwaXkh = __commonJS({
126539
126623
  */
126540
126624
  childWantsEvent(entry, category) {
126541
126625
  if (this.fanoutMode === "broadcast") return true;
126626
+ return this.childSubscribesTo(entry, category);
126627
+ }
126628
+ /**
126629
+ * The SUBSCRIPTION answer alone, with no fan-out-mode override.
126630
+ *
126631
+ * {@link childWantsEvent} answers "will this child be sent the event", which
126632
+ * under `broadcast` is `true` for everything and therefore cannot say whether
126633
+ * anyone actually asked. The D467 census needs the second question, so the
126634
+ * two are separate functions and `broadcast` mode overrides only the first.
126635
+ */
126636
+ childSubscribesTo(entry, category) {
126542
126637
  if (entry.eventPatterns === null) return true;
126543
126638
  return entry.eventPatterns.some((p) => matchesPattern(p, category));
126544
126639
  }
@@ -126841,8 +126936,10 @@ var require_manifest_system_deps_DfpwaXkh = __commonJS({
126841
126936
  event,
126842
126937
  sourceNodeId
126843
126938
  };
126939
+ let subscribed = 0;
126844
126940
  for (const entry of this.children.values()) {
126845
126941
  if (entry.childId === exceptChildId) continue;
126942
+ if (this.childSubscribesTo(entry, event.category)) subscribed += 1;
126846
126943
  const wants = this.childWantsEvent(entry, event.category);
126847
126944
  const stats = this.statsFor(entry.childId);
126848
126945
  if (!wants) stats.suppressed++;
@@ -126851,6 +126948,34 @@ var require_manifest_system_deps_DfpwaXkh = __commonJS({
126851
126948
  entry.channel.emit(msg);
126852
126949
  }
126853
126950
  }
126951
+ this.recordCategoryBroadcast(event.category, subscribed);
126952
+ }
126953
+ /**
126954
+ * Record one PRODUCED event against its category. Called once per broadcast,
126955
+ * outside the per-child loop, because production is what the census measures.
126956
+ */
126957
+ recordCategoryBroadcast(category, subscribed) {
126958
+ const existing = this.categoryStats.get(category);
126959
+ if (existing !== void 0) {
126960
+ existing.broadcasts += 1;
126961
+ existing.wanted += subscribed;
126962
+ return;
126963
+ }
126964
+ if (this.categoryStats.size >= 256) {
126965
+ this.categoryOverflow += 1;
126966
+ if (!this.categoryOverflowLogged) {
126967
+ this.categoryOverflowLogged = true;
126968
+ this.logger?.info("event category census full \u2014 further new categories are unattributed", {
126969
+ max: 256,
126970
+ firstDropped: category
126971
+ });
126972
+ }
126973
+ return;
126974
+ }
126975
+ this.categoryStats.set(category, {
126976
+ broadcasts: 1,
126977
+ wanted: subscribed
126978
+ });
126854
126979
  }
126855
126980
  /**
126856
126981
  * E2: Send a `set-log-level` control message to a specific child.
@@ -130540,11 +130665,11 @@ var require_manifest_system_deps_DfpwaXkh = __commonJS({
130540
130665
  }
130541
130666
  });
130542
130667
 
130543
- // ../system/dist/custom-action-registry-B42MC_Pv.js
130544
- var require_custom_action_registry_B42MC_Pv = __commonJS({
130545
- "../system/dist/custom-action-registry-B42MC_Pv.js"(exports) {
130668
+ // ../system/dist/custom-action-registry-DvVMHLfJ.js
130669
+ var require_custom_action_registry_DvVMHLfJ = __commonJS({
130670
+ "../system/dist/custom-action-registry-DvVMHLfJ.js"(exports) {
130546
130671
  "use strict";
130547
- var require_dist10 = require_dist_CllKpcTd();
130672
+ var require_dist10 = require_dist_0sWJNwme();
130548
130673
  var CustomActionRegistry = class {
130549
130674
  byAddon = /* @__PURE__ */ new Map();
130550
130675
  registerAddon(addonId, catalog, handler) {
@@ -134358,7 +134483,7 @@ var require_dist3 = __commonJS({
134358
134483
  "use strict";
134359
134484
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
134360
134485
  var require_chunk = require_chunk_Cek0wNdY();
134361
- var require_dist10 = require_dist_CllKpcTd();
134486
+ var require_dist10 = require_dist_0sWJNwme();
134362
134487
  var require_builtins_alerts_alerts_addon = require_alerts_addon();
134363
134488
  require_alerts();
134364
134489
  var require_formatter = require_formatter_DqAKDlvN();
@@ -134385,9 +134510,9 @@ var require_dist3 = __commonJS({
134385
134510
  var require_builtins_winston_logging_index = require_winston_logging();
134386
134511
  var require_event_loop_stall_monitor = require_event_loop_stall_monitor_CAsHdMwP();
134387
134512
  var require_tls$1 = require_tls_BFs4PzoW();
134388
- var require_manifest_system_deps = require_manifest_system_deps_DfpwaXkh();
134513
+ var require_manifest_system_deps = require_manifest_system_deps_YYKKCKSF();
134389
134514
  var require_resource_monitor = require_resource_monitor_LVE1BoLs();
134390
- var require_custom_action_registry = require_custom_action_registry_B42MC_Pv();
134515
+ var require_custom_action_registry = require_custom_action_registry_DvVMHLfJ();
134391
134516
  var zod = require_zod();
134392
134517
  var node_crypto = __require("crypto");
134393
134518
  var _camstack_types_node = require_node();
@@ -199088,8 +199213,9 @@ ${originalIndentation}`;
199088
199213
  const type2 = resolvePacketType(packet[5]);
199089
199214
  this.emit("data", type2, msg);
199090
199215
  const rest = packet.slice(length);
199091
- this.bufs = rest.length > 0 ? [rest] : [];
199092
- this.bufLen = rest.length;
199216
+ const carried = rest.length > 0 && rest.length * 8 < rest.buffer.byteLength ? Buffer.from(rest) : rest;
199217
+ this.bufs = carried.length > 0 ? [carried] : [];
199218
+ this.bufLen = carried.length;
199093
199219
  }
199094
199220
  cb();
199095
199221
  }
@@ -231696,6 +231822,14 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
231696
231822
  * set `encodeJpeg: true`; `bytes` is then absent.
231697
231823
  */
231698
231824
  jpeg: zod.z.string().optional(),
231825
+ /**
231826
+ * The SAME compressed JPEG as `jpeg`, as bytes (D462). Present instead of
231827
+ * `jpeg` when the request set `acceptJpegBytes`; a request that did not gets
231828
+ * `jpeg` exactly as before. MsgPack and the mesh leg both carry binary —
231829
+ * `bytes` above has crossed this boundary as a `Uint8Array` all along — so
231830
+ * base64 was buying nothing but a multi-megabyte string in the relay's heap.
231831
+ */
231832
+ jpegBytes: zod.z.instanceof(Uint8Array).optional(),
231699
231833
  width: zod.z.number().int().positive(),
231700
231834
  height: zod.z.number().int().positive(),
231701
231835
  /**
@@ -231737,7 +231871,14 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
231737
231871
  detail: zod.z.string().optional()
231738
231872
  })]);
231739
231873
  var ParkedTrackFrameSchema = zod.z.object({
231740
- jpeg: zod.z.string(),
231874
+ /**
231875
+ * Base64 JPEG — the pre-D462 wire. OPTIONAL since D462: a request that set
231876
+ * `acceptJpegBytes` is answered in `jpegBytes` and this is then absent.
231877
+ * Exactly one of the two is present.
231878
+ */
231879
+ jpeg: zod.z.string().optional(),
231880
+ /** The same JPEG as bytes, for a caller that declared it reads them (D462). */
231881
+ jpegBytes: zod.z.instanceof(Uint8Array).optional(),
231741
231882
  width: zod.z.number().int().positive(),
231742
231883
  height: zod.z.number().int().positive(),
231743
231884
  /** The frame instant the parcel shows (the caller's clock, echoed back). */
@@ -232393,6 +232534,13 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
232393
232534
  bbox: NativeCropBboxSchema,
232394
232535
  maxWidth: zod.z.number().int().positive().optional(),
232395
232536
  /**
232537
+ * The caller reads a `Uint8Array` (D462). When set, a JPEG answer comes
232538
+ * back in `jpegBytes` instead of base64 `jpeg`. Absent means the old
232539
+ * wire — never assume consent: a pre-D462 caller parses the field as
232540
+ * base64 and bytes would decode to garbage rather than fail.
232541
+ */
232542
+ acceptJpegBytes: zod.z.boolean().optional(),
232543
+ /**
232396
232544
  * When `true`, the runner encodes the resolved crop to JPEG ON THE
232397
232545
  * OWNING NODE and returns it in `jpeg` (base64) INSTEAD of raw `bytes`.
232398
232546
  * Callers set this for CROSS-NODE fetches (`handle.nodeId` is a remote
@@ -232565,7 +232713,14 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
232565
232713
  getParkedTrackFrame: require_sleep.method(zod.z.object({
232566
232714
  deviceId: zod.z.number(),
232567
232715
  trackId: zod.z.string(),
232568
- kind: ParkedFrameKindSchema
232716
+ kind: ParkedFrameKindSchema,
232717
+ /**
232718
+ * The caller reads a `Uint8Array` (D462). When set, a JPEG answer comes
232719
+ * back in `jpegBytes` instead of base64 `jpeg`. Absent means the old
232720
+ * wire — never assume consent: a pre-D462 caller parses the field as
232721
+ * base64 and bytes would decode to garbage rather than fail.
232722
+ */
232723
+ acceptJpegBytes: zod.z.boolean().optional()
232569
232724
  }), ParkedTrackFrameSchema.nullable()),
232570
232725
  /**
232571
232726
  * Drop every parcel of a track — the hub closed it. Idempotent. A track
@@ -357630,8 +357785,10 @@ var require_parser2 = __commonJS({
357630
357785
  const type = resolvePacketType(packet[5]);
357631
357786
  this.emit("data", type, msg);
357632
357787
  const rest = packet.slice(length);
357633
- this.bufs = rest.length > 0 ? [rest] : [];
357634
- this.bufLen = rest.length;
357788
+ const pinsTooMuch = rest.length > 0 && rest.length * 8 < rest.buffer.byteLength;
357789
+ const carried = pinsTooMuch ? Buffer.from(rest) : rest;
357790
+ this.bufs = carried.length > 0 ? [carried] : [];
357791
+ this.bufLen = carried.length;
357635
357792
  }
357636
357793
  cb();
357637
357794
  }
@@ -413995,7 +414152,7 @@ var require_agent_addon_delivery = __commonJS({
413995
414152
  exports.AGENT_RELOAD_TIMEOUT_MS = exports.AGENT_DEPLOY_CONTROL_TIMEOUT_MS = void 0;
413996
414153
  exports.isAgentDeployResponse = isAgentDeployResponse;
413997
414154
  exports.deliverAddonToAgent = deliverAddonToAgent;
413998
- exports.AGENT_DEPLOY_CONTROL_TIMEOUT_MS = 3e4;
414155
+ exports.AGENT_DEPLOY_CONTROL_TIMEOUT_MS = 3e5;
413999
414156
  exports.AGENT_RELOAD_TIMEOUT_MS = 6e4;
414000
414157
  function isAgentDeployResponse(value) {
414001
414158
  if (value === null || typeof value !== "object")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "camstack",
3
- "version": "1.2.139",
3
+ "version": "1.2.141",
4
4
  "description": "CLI tool for managing and running CamStack server",
5
5
  "keywords": [
6
6
  "camstack",