@camstack/addon-provider-reolink 1.0.4 → 1.0.5

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
@@ -5009,6 +5009,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5009
5009
  */
5010
5010
  EventCategory["PipelineEngineMetricsSnapshot"] = "pipeline.engine-metrics-snapshot";
5011
5011
  /**
5012
+ * Per-node detection-engine runtime-provisioning transition. Emitted by
5013
+ * the detection-pipeline provider on every state change of its lazy
5014
+ * engine-provisioning machine (idle → installing → verifying → ready,
5015
+ * or → failed with a `nextRetryAt`). Payload is the
5016
+ * `EngineProvisioningState` snapshot; `event.source.nodeId` carries the
5017
+ * node. The Pipeline page subscribes to drive a live "installing
5018
+ * OpenVINO… / ready" indicator per node without polling
5019
+ * `pipelineExecutor.getEngineProvisioning`. Telemetry-grade (D8): the UI
5020
+ * also reads the cap snapshot on mount / reconnect. Phase 2.
5021
+ */
5022
+ EventCategory["PipelineEngineProvisioning"] = "pipeline.engine-provisioning";
5023
+ /**
5012
5024
  * Cluster topology snapshot. Carries the same payload returned by
5013
5025
  * `nodes.topology` (every reachable node + addons + processes).
5014
5026
  * Emitted by the hub on any agent / addon lifecycle change
@@ -10586,6 +10598,24 @@ var DetectorOutputSchema = object({
10586
10598
  inferenceMs: number(),
10587
10599
  modelId: string()
10588
10600
  });
10601
+ var EngineProvisioningSchema = object({
10602
+ runtimeId: _enum([
10603
+ "onnx",
10604
+ "openvino",
10605
+ "coreml"
10606
+ ]).nullable(),
10607
+ device: string().nullable(),
10608
+ state: _enum([
10609
+ "idle",
10610
+ "installing",
10611
+ "verifying",
10612
+ "ready",
10613
+ "failed"
10614
+ ]),
10615
+ progress: number().optional(),
10616
+ error: string().optional(),
10617
+ nextRetryAt: number().optional()
10618
+ });
10589
10619
  var PipelineStepInputSchema = lazy(() => object({
10590
10620
  addonId: string(),
10591
10621
  modelId: string(),
@@ -10654,7 +10684,7 @@ var PipelineRunResultBridge = custom$2();
10654
10684
  method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(), PipelineEngineChoiceSchema, {
10655
10685
  kind: "mutation",
10656
10686
  auth: "admin"
10657
- }), method(_void(), record(string(), object({
10687
+ }), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
10658
10688
  modelId: string(),
10659
10689
  settings: record(string(), unknown()).readonly()
10660
10690
  }))), method(object({ steps: record(string(), object({
@@ -15822,7 +15852,10 @@ var AgentAddonConfigSchema = object({
15822
15852
  modelId: string(),
15823
15853
  settings: record(string(), unknown()).readonly()
15824
15854
  });
15825
- var AgentPipelineSettingsSchema = object({ addonDefaults: record(string(), AgentAddonConfigSchema).readonly() });
15855
+ var AgentPipelineSettingsSchema = object({
15856
+ addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
15857
+ maxCameras: number().int().nonnegative().nullable().default(null)
15858
+ });
15826
15859
  var CameraPipelineForAgentSchema = object({
15827
15860
  steps: array(PipelineStepInputSchema).readonly(),
15828
15861
  audio: object({
@@ -15924,6 +15957,133 @@ var GlobalMetricsSchema = object({
15924
15957
  * capability providers.
15925
15958
  */
15926
15959
  var CapabilityBindingsSchema = record(string(), string());
15960
+ /** Source block — always present; derives from the stream catalog. */
15961
+ var CameraSourceStatusSchema = object({ streams: array(object({
15962
+ camStreamId: string(),
15963
+ codec: string(),
15964
+ width: number(),
15965
+ height: number(),
15966
+ fps: number(),
15967
+ kind: string()
15968
+ })).readonly() });
15969
+ /** Assignment block — always present (orchestrator-local, no remote call). */
15970
+ var CameraAssignmentStatusSchema = object({
15971
+ detectionNodeId: string().nullable(),
15972
+ decoderNodeId: string().nullable(),
15973
+ audioNodeId: string().nullable(),
15974
+ pinned: object({
15975
+ detection: boolean(),
15976
+ decoder: boolean(),
15977
+ audio: boolean()
15978
+ }),
15979
+ reasons: object({
15980
+ detection: string().optional(),
15981
+ decoder: string().optional(),
15982
+ audio: string().optional()
15983
+ })
15984
+ });
15985
+ /** Broker block — null when the broker stage is unreachable or inactive. */
15986
+ var CameraBrokerStatusSchema = object({
15987
+ profiles: array(object({
15988
+ profile: string(),
15989
+ status: string(),
15990
+ codec: string(),
15991
+ width: number(),
15992
+ height: number(),
15993
+ subscribers: number(),
15994
+ inFps: number(),
15995
+ outFps: number()
15996
+ })).readonly(),
15997
+ webrtcSessions: number(),
15998
+ rtspRestream: boolean()
15999
+ });
16000
+ /** Shared-memory ring statistics within the decoder block. */
16001
+ var CameraDecoderShmSchema = object({
16002
+ framesWritten: number(),
16003
+ getFrameHits: number(),
16004
+ getFrameMisses: number(),
16005
+ budgetMb: number()
16006
+ });
16007
+ /** Decoder block — null when the decoder stage is unreachable or inactive. */
16008
+ var CameraDecoderStatusSchema = object({
16009
+ nodeId: string(),
16010
+ formats: array(string()).readonly(),
16011
+ sessionCount: number(),
16012
+ shm: CameraDecoderShmSchema
16013
+ });
16014
+ /** Motion block — null when motion detection is not active for this device. */
16015
+ var CameraMotionStatusSchema = object({
16016
+ enabled: boolean(),
16017
+ fps: number()
16018
+ });
16019
+ /** Detection provisioning sub-block. */
16020
+ var CameraDetectionProvisioningSchema = object({
16021
+ state: _enum([
16022
+ "idle",
16023
+ "installing",
16024
+ "verifying",
16025
+ "ready",
16026
+ "failed"
16027
+ ]),
16028
+ error: string().optional()
16029
+ });
16030
+ /** Detection phase — derived from the runner's engine phase. */
16031
+ var CameraDetectionPhaseSchema = _enum([
16032
+ "idle",
16033
+ "watching",
16034
+ "active"
16035
+ ]);
16036
+ /** Detection block — null when no detection node is assigned or reachable. */
16037
+ var CameraDetectionStatusSchema = object({
16038
+ nodeId: string(),
16039
+ engine: object({
16040
+ backend: string(),
16041
+ device: string()
16042
+ }),
16043
+ phase: CameraDetectionPhaseSchema,
16044
+ configuredFps: number(),
16045
+ actualFps: number(),
16046
+ queueDepth: number(),
16047
+ avgInferenceMs: number(),
16048
+ provisioning: CameraDetectionProvisioningSchema
16049
+ });
16050
+ /** Audio block — null when no audio node is assigned or reachable. */
16051
+ var CameraAudioStatusSchema = object({
16052
+ nodeId: string(),
16053
+ enabled: boolean()
16054
+ });
16055
+ /** Recording block — null when no recording cap is active for this device. */
16056
+ var CameraRecordingStatusSchema = object({
16057
+ mode: _enum([
16058
+ "off",
16059
+ "continuous",
16060
+ "events"
16061
+ ]),
16062
+ active: boolean(),
16063
+ storageBytes: number()
16064
+ });
16065
+ /**
16066
+ * Aggregated per-camera pipeline status — server-composed, single call.
16067
+ *
16068
+ * The `assignment` and `source` blocks are always present.
16069
+ * Every other block is `null` when the stage is inactive or unreachable
16070
+ * during the bounded parallel fan-out in the orchestrator implementation.
16071
+ *
16072
+ * See spec: `docs/superpowers/specs/2026-06-24-camera-status-aggregator-cap.md`
16073
+ */
16074
+ var CameraStatusSchema = object({
16075
+ deviceId: number(),
16076
+ assignment: CameraAssignmentStatusSchema,
16077
+ source: CameraSourceStatusSchema,
16078
+ broker: CameraBrokerStatusSchema.nullable(),
16079
+ decoder: CameraDecoderStatusSchema.nullable(),
16080
+ motion: CameraMotionStatusSchema.nullable(),
16081
+ detection: CameraDetectionStatusSchema.nullable(),
16082
+ audio: CameraAudioStatusSchema.nullable(),
16083
+ recording: CameraRecordingStatusSchema.nullable(),
16084
+ /** Unix timestamp (ms) when this snapshot was composed server-side. */
16085
+ fetchedAt: number()
16086
+ });
15927
16087
  method(object({
15928
16088
  deviceId: number(),
15929
16089
  agentNodeId: string()
@@ -15991,6 +16151,12 @@ method(object({
15991
16151
  }), {
15992
16152
  kind: "mutation",
15993
16153
  auth: "admin"
16154
+ }), method(object({
16155
+ agentNodeId: string(),
16156
+ maxCameras: number().int().nonnegative().nullable()
16157
+ }), object({ success: literal(true) }), {
16158
+ kind: "mutation",
16159
+ auth: "admin"
15994
16160
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
15995
16161
  deviceId: number(),
15996
16162
  addonId: string(),
@@ -16016,7 +16182,7 @@ method(object({
16016
16182
  }), method(object({
16017
16183
  deviceId: number(),
16018
16184
  agentNodeId: string().optional()
16019
- }), CameraPipelineConfigSchema), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
16185
+ }), CameraPipelineConfigSchema), method(object({ deviceId: number() }), CameraStatusSchema), method(object({ deviceIds: array(number()).optional() }), array(CameraStatusSchema).readonly()), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
16020
16186
  name: string(),
16021
16187
  description: string().optional(),
16022
16188
  config: CameraPipelineConfigSchema
@@ -22180,6 +22346,12 @@ Object.freeze({
22180
22346
  addonId: null,
22181
22347
  access: "view"
22182
22348
  },
22349
+ "pipelineExecutor.getEngineProvisioning": {
22350
+ capName: "pipeline-executor",
22351
+ capScope: "system",
22352
+ addonId: null,
22353
+ access: "view"
22354
+ },
22183
22355
  "pipelineExecutor.getGlobalPipelineConfig": {
22184
22356
  capName: "pipeline-executor",
22185
22357
  capScope: "system",
@@ -22384,6 +22556,18 @@ Object.freeze({
22384
22556
  addonId: null,
22385
22557
  access: "view"
22386
22558
  },
22559
+ "pipelineOrchestrator.getCameraStatus": {
22560
+ capName: "pipeline-orchestrator",
22561
+ capScope: "system",
22562
+ addonId: null,
22563
+ access: "view"
22564
+ },
22565
+ "pipelineOrchestrator.getCameraStatuses": {
22566
+ capName: "pipeline-orchestrator",
22567
+ capScope: "system",
22568
+ addonId: null,
22569
+ access: "view"
22570
+ },
22387
22571
  "pipelineOrchestrator.getCameraStepOverrides": {
22388
22572
  capName: "pipeline-orchestrator",
22389
22573
  capScope: "system",
@@ -22468,6 +22652,12 @@ Object.freeze({
22468
22652
  addonId: null,
22469
22653
  access: "create"
22470
22654
  },
22655
+ "pipelineOrchestrator.setAgentMaxCameras": {
22656
+ capName: "pipeline-orchestrator",
22657
+ capScope: "system",
22658
+ addonId: null,
22659
+ access: "create"
22660
+ },
22471
22661
  "pipelineOrchestrator.setCameraPipelineForAgent": {
22472
22662
  capName: "pipeline-orchestrator",
22473
22663
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -5004,6 +5004,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5004
5004
  */
5005
5005
  EventCategory["PipelineEngineMetricsSnapshot"] = "pipeline.engine-metrics-snapshot";
5006
5006
  /**
5007
+ * Per-node detection-engine runtime-provisioning transition. Emitted by
5008
+ * the detection-pipeline provider on every state change of its lazy
5009
+ * engine-provisioning machine (idle → installing → verifying → ready,
5010
+ * or → failed with a `nextRetryAt`). Payload is the
5011
+ * `EngineProvisioningState` snapshot; `event.source.nodeId` carries the
5012
+ * node. The Pipeline page subscribes to drive a live "installing
5013
+ * OpenVINO… / ready" indicator per node without polling
5014
+ * `pipelineExecutor.getEngineProvisioning`. Telemetry-grade (D8): the UI
5015
+ * also reads the cap snapshot on mount / reconnect. Phase 2.
5016
+ */
5017
+ EventCategory["PipelineEngineProvisioning"] = "pipeline.engine-provisioning";
5018
+ /**
5007
5019
  * Cluster topology snapshot. Carries the same payload returned by
5008
5020
  * `nodes.topology` (every reachable node + addons + processes).
5009
5021
  * Emitted by the hub on any agent / addon lifecycle change
@@ -10581,6 +10593,24 @@ var DetectorOutputSchema = object({
10581
10593
  inferenceMs: number(),
10582
10594
  modelId: string()
10583
10595
  });
10596
+ var EngineProvisioningSchema = object({
10597
+ runtimeId: _enum([
10598
+ "onnx",
10599
+ "openvino",
10600
+ "coreml"
10601
+ ]).nullable(),
10602
+ device: string().nullable(),
10603
+ state: _enum([
10604
+ "idle",
10605
+ "installing",
10606
+ "verifying",
10607
+ "ready",
10608
+ "failed"
10609
+ ]),
10610
+ progress: number().optional(),
10611
+ error: string().optional(),
10612
+ nextRetryAt: number().optional()
10613
+ });
10584
10614
  var PipelineStepInputSchema = lazy(() => object({
10585
10615
  addonId: string(),
10586
10616
  modelId: string(),
@@ -10649,7 +10679,7 @@ var PipelineRunResultBridge = custom$2();
10649
10679
  method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(), PipelineEngineChoiceSchema, {
10650
10680
  kind: "mutation",
10651
10681
  auth: "admin"
10652
- }), method(_void(), record(string(), object({
10682
+ }), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
10653
10683
  modelId: string(),
10654
10684
  settings: record(string(), unknown()).readonly()
10655
10685
  }))), method(object({ steps: record(string(), object({
@@ -15817,7 +15847,10 @@ var AgentAddonConfigSchema = object({
15817
15847
  modelId: string(),
15818
15848
  settings: record(string(), unknown()).readonly()
15819
15849
  });
15820
- var AgentPipelineSettingsSchema = object({ addonDefaults: record(string(), AgentAddonConfigSchema).readonly() });
15850
+ var AgentPipelineSettingsSchema = object({
15851
+ addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
15852
+ maxCameras: number().int().nonnegative().nullable().default(null)
15853
+ });
15821
15854
  var CameraPipelineForAgentSchema = object({
15822
15855
  steps: array(PipelineStepInputSchema).readonly(),
15823
15856
  audio: object({
@@ -15919,6 +15952,133 @@ var GlobalMetricsSchema = object({
15919
15952
  * capability providers.
15920
15953
  */
15921
15954
  var CapabilityBindingsSchema = record(string(), string());
15955
+ /** Source block — always present; derives from the stream catalog. */
15956
+ var CameraSourceStatusSchema = object({ streams: array(object({
15957
+ camStreamId: string(),
15958
+ codec: string(),
15959
+ width: number(),
15960
+ height: number(),
15961
+ fps: number(),
15962
+ kind: string()
15963
+ })).readonly() });
15964
+ /** Assignment block — always present (orchestrator-local, no remote call). */
15965
+ var CameraAssignmentStatusSchema = object({
15966
+ detectionNodeId: string().nullable(),
15967
+ decoderNodeId: string().nullable(),
15968
+ audioNodeId: string().nullable(),
15969
+ pinned: object({
15970
+ detection: boolean(),
15971
+ decoder: boolean(),
15972
+ audio: boolean()
15973
+ }),
15974
+ reasons: object({
15975
+ detection: string().optional(),
15976
+ decoder: string().optional(),
15977
+ audio: string().optional()
15978
+ })
15979
+ });
15980
+ /** Broker block — null when the broker stage is unreachable or inactive. */
15981
+ var CameraBrokerStatusSchema = object({
15982
+ profiles: array(object({
15983
+ profile: string(),
15984
+ status: string(),
15985
+ codec: string(),
15986
+ width: number(),
15987
+ height: number(),
15988
+ subscribers: number(),
15989
+ inFps: number(),
15990
+ outFps: number()
15991
+ })).readonly(),
15992
+ webrtcSessions: number(),
15993
+ rtspRestream: boolean()
15994
+ });
15995
+ /** Shared-memory ring statistics within the decoder block. */
15996
+ var CameraDecoderShmSchema = object({
15997
+ framesWritten: number(),
15998
+ getFrameHits: number(),
15999
+ getFrameMisses: number(),
16000
+ budgetMb: number()
16001
+ });
16002
+ /** Decoder block — null when the decoder stage is unreachable or inactive. */
16003
+ var CameraDecoderStatusSchema = object({
16004
+ nodeId: string(),
16005
+ formats: array(string()).readonly(),
16006
+ sessionCount: number(),
16007
+ shm: CameraDecoderShmSchema
16008
+ });
16009
+ /** Motion block — null when motion detection is not active for this device. */
16010
+ var CameraMotionStatusSchema = object({
16011
+ enabled: boolean(),
16012
+ fps: number()
16013
+ });
16014
+ /** Detection provisioning sub-block. */
16015
+ var CameraDetectionProvisioningSchema = object({
16016
+ state: _enum([
16017
+ "idle",
16018
+ "installing",
16019
+ "verifying",
16020
+ "ready",
16021
+ "failed"
16022
+ ]),
16023
+ error: string().optional()
16024
+ });
16025
+ /** Detection phase — derived from the runner's engine phase. */
16026
+ var CameraDetectionPhaseSchema = _enum([
16027
+ "idle",
16028
+ "watching",
16029
+ "active"
16030
+ ]);
16031
+ /** Detection block — null when no detection node is assigned or reachable. */
16032
+ var CameraDetectionStatusSchema = object({
16033
+ nodeId: string(),
16034
+ engine: object({
16035
+ backend: string(),
16036
+ device: string()
16037
+ }),
16038
+ phase: CameraDetectionPhaseSchema,
16039
+ configuredFps: number(),
16040
+ actualFps: number(),
16041
+ queueDepth: number(),
16042
+ avgInferenceMs: number(),
16043
+ provisioning: CameraDetectionProvisioningSchema
16044
+ });
16045
+ /** Audio block — null when no audio node is assigned or reachable. */
16046
+ var CameraAudioStatusSchema = object({
16047
+ nodeId: string(),
16048
+ enabled: boolean()
16049
+ });
16050
+ /** Recording block — null when no recording cap is active for this device. */
16051
+ var CameraRecordingStatusSchema = object({
16052
+ mode: _enum([
16053
+ "off",
16054
+ "continuous",
16055
+ "events"
16056
+ ]),
16057
+ active: boolean(),
16058
+ storageBytes: number()
16059
+ });
16060
+ /**
16061
+ * Aggregated per-camera pipeline status — server-composed, single call.
16062
+ *
16063
+ * The `assignment` and `source` blocks are always present.
16064
+ * Every other block is `null` when the stage is inactive or unreachable
16065
+ * during the bounded parallel fan-out in the orchestrator implementation.
16066
+ *
16067
+ * See spec: `docs/superpowers/specs/2026-06-24-camera-status-aggregator-cap.md`
16068
+ */
16069
+ var CameraStatusSchema = object({
16070
+ deviceId: number(),
16071
+ assignment: CameraAssignmentStatusSchema,
16072
+ source: CameraSourceStatusSchema,
16073
+ broker: CameraBrokerStatusSchema.nullable(),
16074
+ decoder: CameraDecoderStatusSchema.nullable(),
16075
+ motion: CameraMotionStatusSchema.nullable(),
16076
+ detection: CameraDetectionStatusSchema.nullable(),
16077
+ audio: CameraAudioStatusSchema.nullable(),
16078
+ recording: CameraRecordingStatusSchema.nullable(),
16079
+ /** Unix timestamp (ms) when this snapshot was composed server-side. */
16080
+ fetchedAt: number()
16081
+ });
15922
16082
  method(object({
15923
16083
  deviceId: number(),
15924
16084
  agentNodeId: string()
@@ -15986,6 +16146,12 @@ method(object({
15986
16146
  }), {
15987
16147
  kind: "mutation",
15988
16148
  auth: "admin"
16149
+ }), method(object({
16150
+ agentNodeId: string(),
16151
+ maxCameras: number().int().nonnegative().nullable()
16152
+ }), object({ success: literal(true) }), {
16153
+ kind: "mutation",
16154
+ auth: "admin"
15989
16155
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
15990
16156
  deviceId: number(),
15991
16157
  addonId: string(),
@@ -16011,7 +16177,7 @@ method(object({
16011
16177
  }), method(object({
16012
16178
  deviceId: number(),
16013
16179
  agentNodeId: string().optional()
16014
- }), CameraPipelineConfigSchema), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
16180
+ }), CameraPipelineConfigSchema), method(object({ deviceId: number() }), CameraStatusSchema), method(object({ deviceIds: array(number()).optional() }), array(CameraStatusSchema).readonly()), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
16015
16181
  name: string(),
16016
16182
  description: string().optional(),
16017
16183
  config: CameraPipelineConfigSchema
@@ -22175,6 +22341,12 @@ Object.freeze({
22175
22341
  addonId: null,
22176
22342
  access: "view"
22177
22343
  },
22344
+ "pipelineExecutor.getEngineProvisioning": {
22345
+ capName: "pipeline-executor",
22346
+ capScope: "system",
22347
+ addonId: null,
22348
+ access: "view"
22349
+ },
22178
22350
  "pipelineExecutor.getGlobalPipelineConfig": {
22179
22351
  capName: "pipeline-executor",
22180
22352
  capScope: "system",
@@ -22379,6 +22551,18 @@ Object.freeze({
22379
22551
  addonId: null,
22380
22552
  access: "view"
22381
22553
  },
22554
+ "pipelineOrchestrator.getCameraStatus": {
22555
+ capName: "pipeline-orchestrator",
22556
+ capScope: "system",
22557
+ addonId: null,
22558
+ access: "view"
22559
+ },
22560
+ "pipelineOrchestrator.getCameraStatuses": {
22561
+ capName: "pipeline-orchestrator",
22562
+ capScope: "system",
22563
+ addonId: null,
22564
+ access: "view"
22565
+ },
22382
22566
  "pipelineOrchestrator.getCameraStepOverrides": {
22383
22567
  capName: "pipeline-orchestrator",
22384
22568
  capScope: "system",
@@ -22463,6 +22647,12 @@ Object.freeze({
22463
22647
  addonId: null,
22464
22648
  access: "create"
22465
22649
  },
22650
+ "pipelineOrchestrator.setAgentMaxCameras": {
22651
+ capName: "pipeline-orchestrator",
22652
+ capScope: "system",
22653
+ addonId: null,
22654
+ access: "create"
22655
+ },
22466
22656
  "pipelineOrchestrator.setCameraPipelineForAgent": {
22467
22657
  capName: "pipeline-orchestrator",
22468
22658
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-reolink",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "Reolink camera device provider addon for CamStack — native Baichuan protocol",
5
5
  "keywords": [
6
6
  "camstack",