@camstack/addon-post-analysis 1.2.221 → 1.2.223

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.
@@ -22472,6 +22472,14 @@ var NativeCropResultSchema = object({
22472
22472
  * set `encodeJpeg: true`; `bytes` is then absent.
22473
22473
  */
22474
22474
  jpeg: string().optional(),
22475
+ /**
22476
+ * The SAME compressed JPEG as `jpeg`, as bytes (D462). Present instead of
22477
+ * `jpeg` when the request set `acceptJpegBytes`; a request that did not gets
22478
+ * `jpeg` exactly as before. MsgPack and the mesh leg both carry binary —
22479
+ * `bytes` above has crossed this boundary as a `Uint8Array` all along — so
22480
+ * base64 was buying nothing but a multi-megabyte string in the relay's heap.
22481
+ */
22482
+ jpegBytes: _instanceof(Uint8Array).optional(),
22475
22483
  width: number().int().positive(),
22476
22484
  height: number().int().positive(),
22477
22485
  /**
@@ -22538,7 +22546,14 @@ var ParkTrackFrameResultSchema = discriminatedUnion("parked", [object({
22538
22546
  })]);
22539
22547
  /** A retrieved parcel — the runner's own JPEG, base64 for the wire. */
22540
22548
  var ParkedTrackFrameSchema = object({
22541
- jpeg: string(),
22549
+ /**
22550
+ * Base64 JPEG — the pre-D462 wire. OPTIONAL since D462: a request that set
22551
+ * `acceptJpegBytes` is answered in `jpegBytes` and this is then absent.
22552
+ * Exactly one of the two is present.
22553
+ */
22554
+ jpeg: string().optional(),
22555
+ /** The same JPEG as bytes, for a caller that declared it reads them (D462). */
22556
+ jpegBytes: _instanceof(Uint8Array).optional(),
22542
22557
  width: number().int().positive(),
22543
22558
  height: number().int().positive(),
22544
22559
  /** The frame instant the parcel shows (the caller's clock, echoed back). */
@@ -23125,6 +23140,13 @@ method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mu
23125
23140
  bbox: NativeCropBboxSchema,
23126
23141
  maxWidth: number().int().positive().optional(),
23127
23142
  /**
23143
+ * The caller reads a `Uint8Array` (D462). When set, a JPEG answer comes
23144
+ * back in `jpegBytes` instead of base64 `jpeg`. Absent means the old
23145
+ * wire — never assume consent: a pre-D462 caller parses the field as
23146
+ * base64 and bytes would decode to garbage rather than fail.
23147
+ */
23148
+ acceptJpegBytes: boolean().optional(),
23149
+ /**
23128
23150
  * When `true`, the runner encodes the resolved crop to JPEG ON THE
23129
23151
  * OWNING NODE and returns it in `jpeg` (base64) INSTEAD of raw `bytes`.
23130
23152
  * Callers set this for CROSS-NODE fetches (`handle.nodeId` is a remote
@@ -23192,7 +23214,14 @@ method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mu
23192
23214
  }), ParkTrackFrameResultSchema, { kind: "mutation" }), method(object({
23193
23215
  deviceId: number(),
23194
23216
  trackId: string(),
23195
- kind: ParkedFrameKindSchema
23217
+ kind: ParkedFrameKindSchema,
23218
+ /**
23219
+ * The caller reads a `Uint8Array` (D462). When set, a JPEG answer comes
23220
+ * back in `jpegBytes` instead of base64 `jpeg`. Absent means the old
23221
+ * wire — never assume consent: a pre-D462 caller parses the field as
23222
+ * base64 and bytes would decode to garbage rather than fail.
23223
+ */
23224
+ acceptJpegBytes: boolean().optional()
23196
23225
  }), ParkedTrackFrameSchema.nullable()), method(object({
23197
23226
  deviceId: number(),
23198
23227
  trackId: string()
@@ -22503,6 +22503,14 @@ var NativeCropResultSchema = object({
22503
22503
  * set `encodeJpeg: true`; `bytes` is then absent.
22504
22504
  */
22505
22505
  jpeg: string().optional(),
22506
+ /**
22507
+ * The SAME compressed JPEG as `jpeg`, as bytes (D462). Present instead of
22508
+ * `jpeg` when the request set `acceptJpegBytes`; a request that did not gets
22509
+ * `jpeg` exactly as before. MsgPack and the mesh leg both carry binary —
22510
+ * `bytes` above has crossed this boundary as a `Uint8Array` all along — so
22511
+ * base64 was buying nothing but a multi-megabyte string in the relay's heap.
22512
+ */
22513
+ jpegBytes: _instanceof(Uint8Array).optional(),
22506
22514
  width: number().int().positive(),
22507
22515
  height: number().int().positive(),
22508
22516
  /**
@@ -22569,7 +22577,14 @@ var ParkTrackFrameResultSchema = discriminatedUnion("parked", [object({
22569
22577
  })]);
22570
22578
  /** A retrieved parcel — the runner's own JPEG, base64 for the wire. */
22571
22579
  var ParkedTrackFrameSchema = object({
22572
- jpeg: string(),
22580
+ /**
22581
+ * Base64 JPEG — the pre-D462 wire. OPTIONAL since D462: a request that set
22582
+ * `acceptJpegBytes` is answered in `jpegBytes` and this is then absent.
22583
+ * Exactly one of the two is present.
22584
+ */
22585
+ jpeg: string().optional(),
22586
+ /** The same JPEG as bytes, for a caller that declared it reads them (D462). */
22587
+ jpegBytes: _instanceof(Uint8Array).optional(),
22573
22588
  width: number().int().positive(),
22574
22589
  height: number().int().positive(),
22575
22590
  /** The frame instant the parcel shows (the caller's clock, echoed back). */
@@ -23156,6 +23171,13 @@ method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mu
23156
23171
  bbox: NativeCropBboxSchema,
23157
23172
  maxWidth: number().int().positive().optional(),
23158
23173
  /**
23174
+ * The caller reads a `Uint8Array` (D462). When set, a JPEG answer comes
23175
+ * back in `jpegBytes` instead of base64 `jpeg`. Absent means the old
23176
+ * wire — never assume consent: a pre-D462 caller parses the field as
23177
+ * base64 and bytes would decode to garbage rather than fail.
23178
+ */
23179
+ acceptJpegBytes: boolean().optional(),
23180
+ /**
23159
23181
  * When `true`, the runner encodes the resolved crop to JPEG ON THE
23160
23182
  * OWNING NODE and returns it in `jpeg` (base64) INSTEAD of raw `bytes`.
23161
23183
  * Callers set this for CROSS-NODE fetches (`handle.nodeId` is a remote
@@ -23223,7 +23245,14 @@ method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mu
23223
23245
  }), ParkTrackFrameResultSchema, { kind: "mutation" }), method(object({
23224
23246
  deviceId: number(),
23225
23247
  trackId: string(),
23226
- kind: ParkedFrameKindSchema
23248
+ kind: ParkedFrameKindSchema,
23249
+ /**
23250
+ * The caller reads a `Uint8Array` (D462). When set, a JPEG answer comes
23251
+ * back in `jpegBytes` instead of base64 `jpeg`. Absent means the old
23252
+ * wire — never assume consent: a pre-D462 caller parses the field as
23253
+ * base64 and bytes would decode to garbage rather than fail.
23254
+ */
23255
+ acceptJpegBytes: boolean().optional()
23227
23256
  }), ParkedTrackFrameSchema.nullable()), method(object({
23228
23257
  deviceId: number(),
23229
23258
  trackId: string()
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-B6jHfZ6s.js");
5
+ const require_dist = require("../dist-iJA2F7_d.js");
6
6
  let node_fs = require("node:fs");
7
7
  node_fs = require_dist.__toESM(node_fs);
8
8
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { At as resolvePoolMemoryPolicy, B as PoolMemoryWatchdog, Ct as parseProcStatus, gt as hfModelUrl, ut as embeddingEncoderCapability, zt as BaseAddon } from "../dist-Clp3AeIp.mjs";
1
+ import { At as resolvePoolMemoryPolicy, B as PoolMemoryWatchdog, Ct as parseProcStatus, gt as hfModelUrl, ut as embeddingEncoderCapability, zt as BaseAddon } from "../dist-CxPGPwcy.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import * as fs from "node:fs";
4
4
  import * as path$1 from "node:path";
@@ -3,7 +3,7 @@ import "./dist-CYZr2fwk.mjs";
3
3
  var e = {
4
4
  "@camstack/sdk": {
5
5
  name: "@camstack/sdk",
6
- version: "1.2.99",
6
+ version: "1.2.100",
7
7
  scope: ["default"],
8
8
  loaded: !1,
9
9
  from: "addon_pipeline_analytics_widgets",
@@ -18,7 +18,7 @@ var e = {
18
18
  },
19
19
  "@camstack/types": {
20
20
  name: "@camstack/types",
21
- version: "1.2.179",
21
+ version: "1.2.180",
22
22
  scope: ["default"],
23
23
  loaded: !1,
24
24
  from: "addon_pipeline_analytics_widgets",
@@ -33,7 +33,7 @@ var e = {
33
33
  },
34
34
  "@camstack/ui-library": {
35
35
  name: "@camstack/ui-library",
36
- version: "1.2.147",
36
+ version: "1.2.148",
37
37
  scope: ["default"],
38
38
  loaded: !1,
39
39
  from: "addon_pipeline_analytics_widgets",
@@ -36,7 +36,7 @@ async function r() {
36
36
  }
37
37
  },
38
38
  "@camstack/types": {
39
- version: "1.2.179",
39
+ version: "1.2.180",
40
40
  scope: "default",
41
41
  shareConfig: {
42
42
  singleton: !0,
@@ -45,7 +45,7 @@ async function r() {
45
45
  }
46
46
  },
47
47
  "@camstack/sdk": {
48
- version: "1.2.99",
48
+ version: "1.2.100",
49
49
  scope: "default",
50
50
  shareConfig: {
51
51
  singleton: !0,
@@ -81,7 +81,7 @@ async function r() {
81
81
  }
82
82
  },
83
83
  "@camstack/ui-library": {
84
- version: "1.2.147",
84
+ version: "1.2.148",
85
85
  scope: "default",
86
86
  shareConfig: {
87
87
  singleton: !0,
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-B6jHfZ6s.js");
5
+ const require_dist = require("../dist-iJA2F7_d.js");
6
6
  let node_fs = require("node:fs");
7
7
  node_fs = require_dist.__toESM(node_fs, 1);
8
8
  let node_path = require("node:path");
@@ -45876,8 +45876,13 @@ async function encodeRgbCropToJpeg(bytes, width, height) {
45876
45876
  * same-node (raw) or cross-node (JPEG). The decode happens IN-PROCESS on the
45877
45877
  * post-processing node — no raw pixels ever cross a process boundary.
45878
45878
  */
45879
- async function decodeJpegToRgb(base64Jpeg) {
45880
- const { data, info } = await (0, sharp.default)(Buffer.from(base64Jpeg, "base64")).raw().toBuffer({ resolveWithObject: true });
45879
+ /**
45880
+ * Decode a JPEG to raw RGB. Takes the BYTES, or the base64 a pre-D462 runner
45881
+ * still answers with — sharp wants bytes either way, so accepting both here is
45882
+ * what lets the caller stop base64-ing purely to be understood.
45883
+ */
45884
+ async function decodeJpegToRgb(jpeg) {
45885
+ const { data, info } = await (0, sharp.default)(typeof jpeg === "string" ? Buffer.from(jpeg, "base64") : Buffer.from(jpeg)).raw().toBuffer({ resolveWithObject: true });
45881
45886
  return {
45882
45887
  bytes: data,
45883
45888
  width: info.width,
@@ -64362,6 +64367,15 @@ function createNativeFrameTransport(deps) {
64362
64367
  const wantJpeg = (_handle) => true;
64363
64368
  const cropReplyToRgb = async (reply) => {
64364
64369
  const tier = reply.tier;
64370
+ if (reply.jpegBytes !== void 0) {
64371
+ const rgb = await decodeJpegToRgb(reply.jpegBytes);
64372
+ return {
64373
+ bytes: rgb.bytes,
64374
+ width: rgb.width,
64375
+ height: rgb.height,
64376
+ ...tier !== void 0 ? { tier } : {}
64377
+ };
64378
+ }
64365
64379
  if (reply.jpeg !== void 0) {
64366
64380
  const rgb = await decodeJpegToRgb(reply.jpeg);
64367
64381
  return {
@@ -64381,6 +64395,12 @@ function createNativeFrameTransport(deps) {
64381
64395
  };
64382
64396
  const cropReplyToJpeg = async (reply) => {
64383
64397
  const tier = reply.tier;
64398
+ if (reply.jpegBytes !== void 0) return {
64399
+ jpeg: Buffer.from(reply.jpegBytes),
64400
+ width: reply.width,
64401
+ height: reply.height,
64402
+ ...tier !== void 0 ? { tier } : {}
64403
+ };
64384
64404
  if (reply.jpeg !== void 0) return {
64385
64405
  jpeg: Buffer.from(reply.jpeg, "base64"),
64386
64406
  width: reply.width,
@@ -64442,7 +64462,8 @@ function createNativeFrameTransport(deps) {
64442
64462
  handle: frameHandle,
64443
64463
  bbox,
64444
64464
  ...maxWidth !== void 0 ? { maxWidth } : {},
64445
- encodeJpeg: wantJpeg(frameHandle)
64465
+ encodeJpeg: wantJpeg(frameHandle),
64466
+ acceptJpegBytes: true
64446
64467
  }, require_dist.nodePin(frameHandle.nodeId));
64447
64468
  if (!native || native.width <= 0 || native.height <= 0) return null;
64448
64469
  return await normalize(native);
@@ -64763,7 +64784,8 @@ function createParkedFrameClient(deps) {
64763
64784
  const parcel = await api.getParkedTrackFrame.query({
64764
64785
  deviceId: known.deviceId,
64765
64786
  trackId,
64766
- kind
64787
+ kind,
64788
+ acceptJpegBytes: true
64767
64789
  }, require_dist.nodePin(known.nodeId));
64768
64790
  if (parcel === null) {
64769
64791
  logger.warn("parked frame gone at retrieval — the node no longer holds it", {
@@ -64777,8 +64799,20 @@ function createParkedFrameClient(deps) {
64777
64799
  });
64778
64800
  return null;
64779
64801
  }
64802
+ const jpeg = parcel.jpegBytes !== void 0 ? Buffer.from(parcel.jpegBytes) : parcel.jpeg !== void 0 ? Buffer.from(parcel.jpeg, "base64") : null;
64803
+ if (jpeg === null) {
64804
+ logger.warn("parked frame arrived with neither jpegBytes nor jpeg", {
64805
+ tags: { deviceId: known.deviceId },
64806
+ meta: {
64807
+ trackId,
64808
+ kind,
64809
+ nodeId: known.nodeId
64810
+ }
64811
+ });
64812
+ return null;
64813
+ }
64780
64814
  return {
64781
- jpeg: Buffer.from(parcel.jpeg, "base64"),
64815
+ jpeg,
64782
64816
  width: parcel.width,
64783
64817
  height: parcel.height,
64784
64818
  timestamp: parcel.timestamp,
@@ -1,4 +1,4 @@
1
- import { $ as VISIT_MERGE_GAP_MS, $t as object, A as NcRulePatchSchema, Bt as CamProfileSchema, C as NC_ALARM_SYSTEM_EVENT_KINDS, D as NC_TAXONOMY, Dt as readDeviceStateFrom, Et as plateGalleryCapability, F as NcSnoozeSchema, Ft as vectorDimFromBase64, G as SCENE_DEFAULT_UNCOVERED_POLICY, Gt as nodePin, H as RetrainStatusSchema, Ht as createEvent, I as NcSnoozeSuppressedSchema, It as videoclipsCapability, J as TIMELAPSE_DENSE_FLOOR_SEC, Jt as array, K as SCENE_DIVERGED, Kt as sleep$1, L as NcSystemEventKindSchema, Lt as zoneAnalyticsCapability, M as NcRuleTargetSchema, Mt as storageOccupancyCapability, N as NcScheduleSchema, Nt as subKindsOf, O as NcConditionDescriptorSchema, Ot as readTimelapseGeneratedAt, P as NcSnoozeInputSchema, Pt as systemEventFilterApplies, Q as TrackSourceSchema, Qt as number, R as NcTaxonomySchema, Rt as errMsg$1, S as MediaFileKindEnum, St as notificationRulesCapability, T as NC_DEFAULT_SNOOZE_MINUTES, Tt as pipelineAnalyticsCapability, Ut as hydrateSchema, V as RECORDING_EXPORT_MAX_READ_BYTES, Vt as DeviceType, W as SCENE_DEFAULT_ANCHOR_THRESHOLD, Wt as isDeviceScopedCap, X as TimelapseRulePatchSchema, Xt as discriminatedUnion, Y as TimelapseRuleInputSchema, Yt as boolean, Z as TimelapseRuleSchema, Zt as literal, _ as FailureCounters, _t as isDetectionMacroClass, a as CLUSTER_MODEL_SCOPED_STEPS, at as buildEventKindDescriptor, b as MAX_BIRTH_DECISION_RECORDS, bt as kebabToCamel, ct as defineCustomActions, dt as encodeVectorBase64, en as partialRecord, et as addonWidgetsSourceCapability, f as DeclaredDevices, ft as evaluateSensorEdge, g as FULL_IMAGE_BBOX, h as FIRST_LEVEL_MACRO_CLASSES, ht as failureContributionCapability, i as BirthDecisionRecordSchema, in as EventCategory, it as audioModeOf, j as NcRuleSchema, jt as sceneMonitorCapability, k as NcRuleInputSchema, kt as resolveLocationMode, lt as deriveRecordingMode, m as EVENT_PAD_MS, mt as faceGalleryCapability, n as ArchivedDebugNoteSchema, nn as string, nt as assertTimelapseCadences, o as COCO_TO_MACRO, ot as cosineSimilarity$1, p as EVENT_KIND_BY_CAP, pt as evictionPolicyOfLocation, q as SceneMonitorSchema, qt as _enum, r as BaseDevice, rn as unknown, rt as audioMetricsCapability, s as DEFAULT_EVENT_COLOR, st as customAction, t as AUDIO_MACRO_LABELS, tn as record, tt as alarmPanelCapability, u as DETECTION_MACRO_CLASSES, v as LabelAttributionSchema, vt as isScheduleActive, w as NC_CONDITION_CATALOG, wt as pickClusterStepModels, xt as mayWriteToLocation, y as MAX_ARCHIVED_DEBUG_NOTES, yt as isSourceCap, z as OpsLogEntrySchema, zt as BaseAddon } from "../dist-Clp3AeIp.mjs";
1
+ import { $ as VISIT_MERGE_GAP_MS, $t as object, A as NcRulePatchSchema, Bt as CamProfileSchema, C as NC_ALARM_SYSTEM_EVENT_KINDS, D as NC_TAXONOMY, Dt as readDeviceStateFrom, Et as plateGalleryCapability, F as NcSnoozeSchema, Ft as vectorDimFromBase64, G as SCENE_DEFAULT_UNCOVERED_POLICY, Gt as nodePin, H as RetrainStatusSchema, Ht as createEvent, I as NcSnoozeSuppressedSchema, It as videoclipsCapability, J as TIMELAPSE_DENSE_FLOOR_SEC, Jt as array, K as SCENE_DIVERGED, Kt as sleep$1, L as NcSystemEventKindSchema, Lt as zoneAnalyticsCapability, M as NcRuleTargetSchema, Mt as storageOccupancyCapability, N as NcScheduleSchema, Nt as subKindsOf, O as NcConditionDescriptorSchema, Ot as readTimelapseGeneratedAt, P as NcSnoozeInputSchema, Pt as systemEventFilterApplies, Q as TrackSourceSchema, Qt as number, R as NcTaxonomySchema, Rt as errMsg$1, S as MediaFileKindEnum, St as notificationRulesCapability, T as NC_DEFAULT_SNOOZE_MINUTES, Tt as pipelineAnalyticsCapability, Ut as hydrateSchema, V as RECORDING_EXPORT_MAX_READ_BYTES, Vt as DeviceType, W as SCENE_DEFAULT_ANCHOR_THRESHOLD, Wt as isDeviceScopedCap, X as TimelapseRulePatchSchema, Xt as discriminatedUnion, Y as TimelapseRuleInputSchema, Yt as boolean, Z as TimelapseRuleSchema, Zt as literal, _ as FailureCounters, _t as isDetectionMacroClass, a as CLUSTER_MODEL_SCOPED_STEPS, at as buildEventKindDescriptor, b as MAX_BIRTH_DECISION_RECORDS, bt as kebabToCamel, ct as defineCustomActions, dt as encodeVectorBase64, en as partialRecord, et as addonWidgetsSourceCapability, f as DeclaredDevices, ft as evaluateSensorEdge, g as FULL_IMAGE_BBOX, h as FIRST_LEVEL_MACRO_CLASSES, ht as failureContributionCapability, i as BirthDecisionRecordSchema, in as EventCategory, it as audioModeOf, j as NcRuleSchema, jt as sceneMonitorCapability, k as NcRuleInputSchema, kt as resolveLocationMode, lt as deriveRecordingMode, m as EVENT_PAD_MS, mt as faceGalleryCapability, n as ArchivedDebugNoteSchema, nn as string, nt as assertTimelapseCadences, o as COCO_TO_MACRO, ot as cosineSimilarity$1, p as EVENT_KIND_BY_CAP, pt as evictionPolicyOfLocation, q as SceneMonitorSchema, qt as _enum, r as BaseDevice, rn as unknown, rt as audioMetricsCapability, s as DEFAULT_EVENT_COLOR, st as customAction, t as AUDIO_MACRO_LABELS, tn as record, tt as alarmPanelCapability, u as DETECTION_MACRO_CLASSES, v as LabelAttributionSchema, vt as isScheduleActive, w as NC_CONDITION_CATALOG, wt as pickClusterStepModels, xt as mayWriteToLocation, y as MAX_ARCHIVED_DEBUG_NOTES, yt as isSourceCap, z as OpsLogEntrySchema, zt as BaseAddon } from "../dist-CxPGPwcy.mjs";
2
2
  import { t as __exportAll } from "../embedding-encoder/index.mjs";
3
3
  import * as fs from "node:fs";
4
4
  import { promises } from "node:fs";
@@ -45802,8 +45802,13 @@ async function encodeRgbCropToJpeg(bytes, width, height) {
45802
45802
  * same-node (raw) or cross-node (JPEG). The decode happens IN-PROCESS on the
45803
45803
  * post-processing node — no raw pixels ever cross a process boundary.
45804
45804
  */
45805
- async function decodeJpegToRgb(base64Jpeg) {
45806
- const { data, info } = await sharp(Buffer.from(base64Jpeg, "base64")).raw().toBuffer({ resolveWithObject: true });
45805
+ /**
45806
+ * Decode a JPEG to raw RGB. Takes the BYTES, or the base64 a pre-D462 runner
45807
+ * still answers with — sharp wants bytes either way, so accepting both here is
45808
+ * what lets the caller stop base64-ing purely to be understood.
45809
+ */
45810
+ async function decodeJpegToRgb(jpeg) {
45811
+ const { data, info } = await sharp(typeof jpeg === "string" ? Buffer.from(jpeg, "base64") : Buffer.from(jpeg)).raw().toBuffer({ resolveWithObject: true });
45807
45812
  return {
45808
45813
  bytes: data,
45809
45814
  width: info.width,
@@ -64288,6 +64293,15 @@ function createNativeFrameTransport(deps) {
64288
64293
  const wantJpeg = (_handle) => true;
64289
64294
  const cropReplyToRgb = async (reply) => {
64290
64295
  const tier = reply.tier;
64296
+ if (reply.jpegBytes !== void 0) {
64297
+ const rgb = await decodeJpegToRgb(reply.jpegBytes);
64298
+ return {
64299
+ bytes: rgb.bytes,
64300
+ width: rgb.width,
64301
+ height: rgb.height,
64302
+ ...tier !== void 0 ? { tier } : {}
64303
+ };
64304
+ }
64291
64305
  if (reply.jpeg !== void 0) {
64292
64306
  const rgb = await decodeJpegToRgb(reply.jpeg);
64293
64307
  return {
@@ -64307,6 +64321,12 @@ function createNativeFrameTransport(deps) {
64307
64321
  };
64308
64322
  const cropReplyToJpeg = async (reply) => {
64309
64323
  const tier = reply.tier;
64324
+ if (reply.jpegBytes !== void 0) return {
64325
+ jpeg: Buffer.from(reply.jpegBytes),
64326
+ width: reply.width,
64327
+ height: reply.height,
64328
+ ...tier !== void 0 ? { tier } : {}
64329
+ };
64310
64330
  if (reply.jpeg !== void 0) return {
64311
64331
  jpeg: Buffer.from(reply.jpeg, "base64"),
64312
64332
  width: reply.width,
@@ -64368,7 +64388,8 @@ function createNativeFrameTransport(deps) {
64368
64388
  handle: frameHandle,
64369
64389
  bbox,
64370
64390
  ...maxWidth !== void 0 ? { maxWidth } : {},
64371
- encodeJpeg: wantJpeg(frameHandle)
64391
+ encodeJpeg: wantJpeg(frameHandle),
64392
+ acceptJpegBytes: true
64372
64393
  }, nodePin(frameHandle.nodeId));
64373
64394
  if (!native || native.width <= 0 || native.height <= 0) return null;
64374
64395
  return await normalize(native);
@@ -64689,7 +64710,8 @@ function createParkedFrameClient(deps) {
64689
64710
  const parcel = await api.getParkedTrackFrame.query({
64690
64711
  deviceId: known.deviceId,
64691
64712
  trackId,
64692
- kind
64713
+ kind,
64714
+ acceptJpegBytes: true
64693
64715
  }, nodePin(known.nodeId));
64694
64716
  if (parcel === null) {
64695
64717
  logger.warn("parked frame gone at retrieval — the node no longer holds it", {
@@ -64703,8 +64725,20 @@ function createParkedFrameClient(deps) {
64703
64725
  });
64704
64726
  return null;
64705
64727
  }
64728
+ const jpeg = parcel.jpegBytes !== void 0 ? Buffer.from(parcel.jpegBytes) : parcel.jpeg !== void 0 ? Buffer.from(parcel.jpeg, "base64") : null;
64729
+ if (jpeg === null) {
64730
+ logger.warn("parked frame arrived with neither jpegBytes nor jpeg", {
64731
+ tags: { deviceId: known.deviceId },
64732
+ meta: {
64733
+ trackId,
64734
+ kind,
64735
+ nodeId: known.nodeId
64736
+ }
64737
+ });
64738
+ return null;
64739
+ }
64706
64740
  return {
64707
- jpeg: Buffer.from(parcel.jpeg, "base64"),
64741
+ jpeg,
64708
64742
  width: parcel.width,
64709
64743
  height: parcel.height,
64710
64744
  timestamp: parcel.timestamp,
@@ -30,7 +30,7 @@ async function d(e) {
30
30
  }
31
31
  }
32
32
  async function f() {
33
- return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-BVv-ddKp.mjs")).catch((e) => {
33
+ return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-B3K65b9h.mjs")).catch((e) => {
34
34
  throw l = void 0, e;
35
35
  }), l;
36
36
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-post-analysis",
3
- "version": "1.2.221",
3
+ "version": "1.2.223",
4
4
  "description": "Post-Analysis bundle — enrichment, embedding-encoder, pipeline-analytics. Multi-entry npm package shipping addons that consume pipeline output.",
5
5
  "keywords": [
6
6
  "camstack",