@camstack/addon-provider-reolink 1.2.1 → 1.2.3

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.
package/dist/addon.js CHANGED
@@ -12560,7 +12560,8 @@ var PipelineStepInputSchema = lazy(() => object({
12560
12560
  modelId: string().optional(),
12561
12561
  enabled: boolean().default(true),
12562
12562
  children: array(PipelineStepInputSchema).optional(),
12563
- settings: record(string(), unknown()).optional()
12563
+ settings: record(string(), unknown()).optional(),
12564
+ jumpDeviceKey: string().optional()
12564
12565
  }));
12565
12566
  var ModelSubstitutionSchema = object({
12566
12567
  addonId: string(),
@@ -12899,8 +12900,24 @@ var NativeCropBboxSchema = object({
12899
12900
  });
12900
12901
  /** Result of a best-effort native-resolution crop (`getNativeCrop`). */
12901
12902
  var NativeCropResultSchema = object({
12902
- /** Packed rgb (24-bit) pixels of the crop. */
12903
- bytes: _instanceof(Uint8Array),
12903
+ /**
12904
+ * Packed rgb (24-bit) pixels of the crop. Present on the DEFAULT (raw) path —
12905
+ * same-node (in-process / UDS) callers get zero-copy RGB and encode locally.
12906
+ * OMITTED when the caller requested `encodeJpeg` (the cross-node compressed
12907
+ * path below), where shipping raw RGB is both an invariant violation and, for
12908
+ * a native full frame (~26 MB at 4K), larger than Moleculer's 10 MB
12909
+ * `maxPacketSize` → the packet is dropped and the call 60s-times-out. That is
12910
+ * the cross-node native-media miss: `bytes` is replaced by `jpeg`.
12911
+ */
12912
+ bytes: _instanceof(Uint8Array).optional(),
12913
+ /**
12914
+ * Base64 JPEG of the crop — the COMPRESSED cross-node payload. The OWNING node
12915
+ * (which holds the native surface) encodes it in-process, so a native 4K frame
12916
+ * ships as ~0.5–2 MB (well under `maxPacketSize`) and NO raw pixels ever cross
12917
+ * a process boundary (CLAUDE.md invariant #21). Present ONLY when the request
12918
+ * set `encodeJpeg: true`; `bytes` is then absent.
12919
+ */
12920
+ jpeg: string().optional(),
12904
12921
  width: number().int().positive(),
12905
12922
  height: number().int().positive(),
12906
12923
  /**
@@ -13046,6 +13063,20 @@ var RunnerFrameSourceSchema = discriminatedUnion("kind", [object({ kind: literal
13046
13063
  hubHostnameOverride: string().optional()
13047
13064
  })]).describe("Per-camera frame-source mode for the runner (P2c)");
13048
13065
  /**
13066
+ * One ENABLED inference device on the runner's node, as the step-tree
13067
+ * device-jump resolver sees it (phase 1). The orchestrator populates this
13068
+ * roster on the attach payload whenever the camera is elected onto a specific
13069
+ * `deviceKey` and the node has ≥2 enabled devices — it is the candidate set the
13070
+ * runner auto-jumps an enrichment step to when the elected device's format
13071
+ * cannot run that step's model. `weight`/`maxSessions` mirror the balancer's
13072
+ * per-device knobs so the auto choice is weighted-least-loaded.
13073
+ */
13074
+ var RunnerInferenceDeviceSchema = object({
13075
+ deviceKey: string(),
13076
+ weight: number().positive().default(1),
13077
+ maxSessions: number().int().positive().nullable().default(null)
13078
+ });
13079
+ /**
13049
13080
  * Camera assignment payload sent by `addon-pipeline-orchestrator` to a
13050
13081
  * specific runner instance via `attachCamera`. Carries everything the
13051
13082
  * runner needs to subscribe to the local broker and execute inference.
@@ -13163,7 +13194,16 @@ var RunnerCameraConfigSchema = object({
13163
13194
  * omitted ⇒ the runner's default device. The engine itself stays node-local —
13164
13195
  * this only selects WHICH device pool of that node runs the session.
13165
13196
  */
13166
- deviceKey: string().optional()
13197
+ deviceKey: string().optional(),
13198
+ /**
13199
+ * Step-tree device-jump roster (phase 1): the node's ENABLED inference
13200
+ * devices, populated by the orchestrator ONLY when `deviceKey` is set and the
13201
+ * node has ≥2 enabled devices. The runner uses it to AUTO-jump an enrichment
13202
+ * step whose model has no build for the elected device's format onto another
13203
+ * enabled device of the SAME node (weighted-least-loaded). Absent/single-entry
13204
+ * ⇒ no jump possible; the step runs on `deviceKey`.
13205
+ */
13206
+ inferenceDevices: array(RunnerInferenceDeviceSchema).readonly().optional()
13167
13207
  });
13168
13208
  motionFpsField.min, motionFpsField.max, motionFpsField.step, motionFpsField.default, detectionFpsField.min, detectionFpsField.max, detectionFpsField.step, detectionFpsField.default, motionCooldownMsField.min, motionCooldownMsField.max, motionCooldownMsField.step, motionCooldownMsField.default, occupancyRecheckSecField.min, occupancyRecheckSecField.max, occupancyRecheckSecField.step, occupancyRecheckSecField.default, occupancyRecheckFramesField.min, occupancyRecheckFramesField.max, occupancyRecheckFramesField.step, occupancyRecheckFramesField.default;
13169
13209
  /**
@@ -13219,7 +13259,18 @@ var RunnerLocalMetricsSchema = object({
13219
13259
  method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mutation" }), method(object({ deviceId: number() }), object({ success: literal(true) }), { kind: "mutation" }), method(ReportMotionInputSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), RunnerLocalLoadSchema), method(_void(), RunnerLocalMetricsSchema), method(object({ deviceId: number() }), CameraMetricsSchema.nullable()), method(_void(), array(CameraMetricsWithDeviceIdSchema).readonly()), method(_void(), array(number()).readonly()), method(object({
13220
13260
  handle: FrameHandleSchema,
13221
13261
  bbox: NativeCropBboxSchema,
13222
- maxWidth: number().int().positive().optional()
13262
+ maxWidth: number().int().positive().optional(),
13263
+ /**
13264
+ * When `true`, the runner encodes the resolved crop to JPEG ON THE
13265
+ * OWNING NODE and returns it in `jpeg` (base64) INSTEAD of raw `bytes`.
13266
+ * Callers set this for CROSS-NODE fetches (`handle.nodeId` is a remote
13267
+ * agent) so the compressed payload fits Moleculer's `maxPacketSize` and
13268
+ * no raw pixels cross the process boundary. Same-node callers omit it
13269
+ * and keep the zero-copy raw `bytes` path. Additive + optional: a
13270
+ * pre-encode runner (version skew) ignores it and returns `bytes`, so
13271
+ * the caller falls back to encoding locally.
13272
+ */
13273
+ encodeJpeg: boolean().optional()
13223
13274
  }), NativeCropResultSchema.nullable()), method(object({
13224
13275
  deviceId: number(),
13225
13276
  frameHandle: FrameHandleSchema.optional(),
@@ -19702,7 +19753,8 @@ var MediaFileKindEnum = _enum([
19702
19753
  "faceCrop",
19703
19754
  "plateCrop",
19704
19755
  "keyFrame",
19705
- "keyFrameSmall"
19756
+ "keyFrameSmall",
19757
+ "thumbnailSmall"
19706
19758
  ]);
19707
19759
  var MediaFileSchema = object({
19708
19760
  key: string(),
@@ -20033,7 +20085,16 @@ var PipelineTemplateSchema = object({
20033
20085
  });
20034
20086
  var DeviceStepConfigSchema = object({
20035
20087
  modelId: string().optional(),
20036
- settings: record(string(), unknown()).optional()
20088
+ settings: record(string(), unknown()).optional(),
20089
+ /**
20090
+ * Step-tree device jump (same-node, phase 1) — OPTIONAL manual override.
20091
+ * When set, this step runs on the named enabled device of the SAME node
20092
+ * (`<backend>:<device>`) instead of the camera's elected device, bypassing
20093
+ * the runtime AUTO-jump. The orchestrator rejects a `jumpDeviceKey` pointing
20094
+ * at a disabled/absent device on that node at save time. Absent ⇒ the runner
20095
+ * auto-jumps only when the effective device's format cannot run the step.
20096
+ */
20097
+ jumpDeviceKey: string().optional()
20037
20098
  });
20038
20099
  var AgentPipelineSettingsSchema = object({
20039
20100
  maxCameras: number().int().nonnegative().nullable().default(null),
package/dist/addon.mjs CHANGED
@@ -12555,7 +12555,8 @@ var PipelineStepInputSchema = lazy(() => object({
12555
12555
  modelId: string().optional(),
12556
12556
  enabled: boolean().default(true),
12557
12557
  children: array(PipelineStepInputSchema).optional(),
12558
- settings: record(string(), unknown()).optional()
12558
+ settings: record(string(), unknown()).optional(),
12559
+ jumpDeviceKey: string().optional()
12559
12560
  }));
12560
12561
  var ModelSubstitutionSchema = object({
12561
12562
  addonId: string(),
@@ -12894,8 +12895,24 @@ var NativeCropBboxSchema = object({
12894
12895
  });
12895
12896
  /** Result of a best-effort native-resolution crop (`getNativeCrop`). */
12896
12897
  var NativeCropResultSchema = object({
12897
- /** Packed rgb (24-bit) pixels of the crop. */
12898
- bytes: _instanceof(Uint8Array),
12898
+ /**
12899
+ * Packed rgb (24-bit) pixels of the crop. Present on the DEFAULT (raw) path —
12900
+ * same-node (in-process / UDS) callers get zero-copy RGB and encode locally.
12901
+ * OMITTED when the caller requested `encodeJpeg` (the cross-node compressed
12902
+ * path below), where shipping raw RGB is both an invariant violation and, for
12903
+ * a native full frame (~26 MB at 4K), larger than Moleculer's 10 MB
12904
+ * `maxPacketSize` → the packet is dropped and the call 60s-times-out. That is
12905
+ * the cross-node native-media miss: `bytes` is replaced by `jpeg`.
12906
+ */
12907
+ bytes: _instanceof(Uint8Array).optional(),
12908
+ /**
12909
+ * Base64 JPEG of the crop — the COMPRESSED cross-node payload. The OWNING node
12910
+ * (which holds the native surface) encodes it in-process, so a native 4K frame
12911
+ * ships as ~0.5–2 MB (well under `maxPacketSize`) and NO raw pixels ever cross
12912
+ * a process boundary (CLAUDE.md invariant #21). Present ONLY when the request
12913
+ * set `encodeJpeg: true`; `bytes` is then absent.
12914
+ */
12915
+ jpeg: string().optional(),
12899
12916
  width: number().int().positive(),
12900
12917
  height: number().int().positive(),
12901
12918
  /**
@@ -13041,6 +13058,20 @@ var RunnerFrameSourceSchema = discriminatedUnion("kind", [object({ kind: literal
13041
13058
  hubHostnameOverride: string().optional()
13042
13059
  })]).describe("Per-camera frame-source mode for the runner (P2c)");
13043
13060
  /**
13061
+ * One ENABLED inference device on the runner's node, as the step-tree
13062
+ * device-jump resolver sees it (phase 1). The orchestrator populates this
13063
+ * roster on the attach payload whenever the camera is elected onto a specific
13064
+ * `deviceKey` and the node has ≥2 enabled devices — it is the candidate set the
13065
+ * runner auto-jumps an enrichment step to when the elected device's format
13066
+ * cannot run that step's model. `weight`/`maxSessions` mirror the balancer's
13067
+ * per-device knobs so the auto choice is weighted-least-loaded.
13068
+ */
13069
+ var RunnerInferenceDeviceSchema = object({
13070
+ deviceKey: string(),
13071
+ weight: number().positive().default(1),
13072
+ maxSessions: number().int().positive().nullable().default(null)
13073
+ });
13074
+ /**
13044
13075
  * Camera assignment payload sent by `addon-pipeline-orchestrator` to a
13045
13076
  * specific runner instance via `attachCamera`. Carries everything the
13046
13077
  * runner needs to subscribe to the local broker and execute inference.
@@ -13158,7 +13189,16 @@ var RunnerCameraConfigSchema = object({
13158
13189
  * omitted ⇒ the runner's default device. The engine itself stays node-local —
13159
13190
  * this only selects WHICH device pool of that node runs the session.
13160
13191
  */
13161
- deviceKey: string().optional()
13192
+ deviceKey: string().optional(),
13193
+ /**
13194
+ * Step-tree device-jump roster (phase 1): the node's ENABLED inference
13195
+ * devices, populated by the orchestrator ONLY when `deviceKey` is set and the
13196
+ * node has ≥2 enabled devices. The runner uses it to AUTO-jump an enrichment
13197
+ * step whose model has no build for the elected device's format onto another
13198
+ * enabled device of the SAME node (weighted-least-loaded). Absent/single-entry
13199
+ * ⇒ no jump possible; the step runs on `deviceKey`.
13200
+ */
13201
+ inferenceDevices: array(RunnerInferenceDeviceSchema).readonly().optional()
13162
13202
  });
13163
13203
  motionFpsField.min, motionFpsField.max, motionFpsField.step, motionFpsField.default, detectionFpsField.min, detectionFpsField.max, detectionFpsField.step, detectionFpsField.default, motionCooldownMsField.min, motionCooldownMsField.max, motionCooldownMsField.step, motionCooldownMsField.default, occupancyRecheckSecField.min, occupancyRecheckSecField.max, occupancyRecheckSecField.step, occupancyRecheckSecField.default, occupancyRecheckFramesField.min, occupancyRecheckFramesField.max, occupancyRecheckFramesField.step, occupancyRecheckFramesField.default;
13164
13204
  /**
@@ -13214,7 +13254,18 @@ var RunnerLocalMetricsSchema = object({
13214
13254
  method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mutation" }), method(object({ deviceId: number() }), object({ success: literal(true) }), { kind: "mutation" }), method(ReportMotionInputSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), RunnerLocalLoadSchema), method(_void(), RunnerLocalMetricsSchema), method(object({ deviceId: number() }), CameraMetricsSchema.nullable()), method(_void(), array(CameraMetricsWithDeviceIdSchema).readonly()), method(_void(), array(number()).readonly()), method(object({
13215
13255
  handle: FrameHandleSchema,
13216
13256
  bbox: NativeCropBboxSchema,
13217
- maxWidth: number().int().positive().optional()
13257
+ maxWidth: number().int().positive().optional(),
13258
+ /**
13259
+ * When `true`, the runner encodes the resolved crop to JPEG ON THE
13260
+ * OWNING NODE and returns it in `jpeg` (base64) INSTEAD of raw `bytes`.
13261
+ * Callers set this for CROSS-NODE fetches (`handle.nodeId` is a remote
13262
+ * agent) so the compressed payload fits Moleculer's `maxPacketSize` and
13263
+ * no raw pixels cross the process boundary. Same-node callers omit it
13264
+ * and keep the zero-copy raw `bytes` path. Additive + optional: a
13265
+ * pre-encode runner (version skew) ignores it and returns `bytes`, so
13266
+ * the caller falls back to encoding locally.
13267
+ */
13268
+ encodeJpeg: boolean().optional()
13218
13269
  }), NativeCropResultSchema.nullable()), method(object({
13219
13270
  deviceId: number(),
13220
13271
  frameHandle: FrameHandleSchema.optional(),
@@ -19697,7 +19748,8 @@ var MediaFileKindEnum = _enum([
19697
19748
  "faceCrop",
19698
19749
  "plateCrop",
19699
19750
  "keyFrame",
19700
- "keyFrameSmall"
19751
+ "keyFrameSmall",
19752
+ "thumbnailSmall"
19701
19753
  ]);
19702
19754
  var MediaFileSchema = object({
19703
19755
  key: string(),
@@ -20028,7 +20080,16 @@ var PipelineTemplateSchema = object({
20028
20080
  });
20029
20081
  var DeviceStepConfigSchema = object({
20030
20082
  modelId: string().optional(),
20031
- settings: record(string(), unknown()).optional()
20083
+ settings: record(string(), unknown()).optional(),
20084
+ /**
20085
+ * Step-tree device jump (same-node, phase 1) — OPTIONAL manual override.
20086
+ * When set, this step runs on the named enabled device of the SAME node
20087
+ * (`<backend>:<device>`) instead of the camera's elected device, bypassing
20088
+ * the runtime AUTO-jump. The orchestrator rejects a `jumpDeviceKey` pointing
20089
+ * at a disabled/absent device on that node at save time. Absent ⇒ the runner
20090
+ * auto-jumps only when the effective device's format cannot run the step.
20091
+ */
20092
+ jumpDeviceKey: string().optional()
20032
20093
  });
20033
20094
  var AgentPipelineSettingsSchema = object({
20034
20095
  maxCameras: number().int().nonnegative().nullable().default(null),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-reolink",
3
- "version": "1.2.1",
3
+ "version": "1.2.3",
4
4
  "description": "Reolink camera device provider addon for CamStack — native Baichuan protocol",
5
5
  "keywords": [
6
6
  "camstack",