@camstack/addon-provider-homeassistant 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
@@ -4983,6 +4983,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
4983
4983
  */
4984
4984
  EventCategory["PipelineEngineMetricsSnapshot"] = "pipeline.engine-metrics-snapshot";
4985
4985
  /**
4986
+ * Per-node detection-engine runtime-provisioning transition. Emitted by
4987
+ * the detection-pipeline provider on every state change of its lazy
4988
+ * engine-provisioning machine (idle → installing → verifying → ready,
4989
+ * or → failed with a `nextRetryAt`). Payload is the
4990
+ * `EngineProvisioningState` snapshot; `event.source.nodeId` carries the
4991
+ * node. The Pipeline page subscribes to drive a live "installing
4992
+ * OpenVINO… / ready" indicator per node without polling
4993
+ * `pipelineExecutor.getEngineProvisioning`. Telemetry-grade (D8): the UI
4994
+ * also reads the cap snapshot on mount / reconnect. Phase 2.
4995
+ */
4996
+ EventCategory["PipelineEngineProvisioning"] = "pipeline.engine-provisioning";
4997
+ /**
4986
4998
  * Cluster topology snapshot. Carries the same payload returned by
4987
4999
  * `nodes.topology` (every reachable node + addons + processes).
4988
5000
  * Emitted by the hub on any agent / addon lifecycle change
@@ -10401,6 +10413,24 @@ var DetectorOutputSchema = object({
10401
10413
  inferenceMs: number(),
10402
10414
  modelId: string()
10403
10415
  });
10416
+ var EngineProvisioningSchema = object({
10417
+ runtimeId: _enum([
10418
+ "onnx",
10419
+ "openvino",
10420
+ "coreml"
10421
+ ]).nullable(),
10422
+ device: string().nullable(),
10423
+ state: _enum([
10424
+ "idle",
10425
+ "installing",
10426
+ "verifying",
10427
+ "ready",
10428
+ "failed"
10429
+ ]),
10430
+ progress: number().optional(),
10431
+ error: string().optional(),
10432
+ nextRetryAt: number().optional()
10433
+ });
10404
10434
  var PipelineStepInputSchema = lazy(() => object({
10405
10435
  addonId: string(),
10406
10436
  modelId: string(),
@@ -10469,7 +10499,7 @@ var PipelineRunResultBridge = custom();
10469
10499
  method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(), PipelineEngineChoiceSchema, {
10470
10500
  kind: "mutation",
10471
10501
  auth: "admin"
10472
- }), method(_void(), record(string(), object({
10502
+ }), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
10473
10503
  modelId: string(),
10474
10504
  settings: record(string(), unknown()).readonly()
10475
10505
  }))), method(object({ steps: record(string(), object({
@@ -15691,7 +15721,10 @@ var AgentAddonConfigSchema = object({
15691
15721
  modelId: string(),
15692
15722
  settings: record(string(), unknown()).readonly()
15693
15723
  });
15694
- var AgentPipelineSettingsSchema = object({ addonDefaults: record(string(), AgentAddonConfigSchema).readonly() });
15724
+ var AgentPipelineSettingsSchema = object({
15725
+ addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
15726
+ maxCameras: number().int().nonnegative().nullable().default(null)
15727
+ });
15695
15728
  var CameraPipelineForAgentSchema = object({
15696
15729
  steps: array(PipelineStepInputSchema).readonly(),
15697
15730
  audio: object({
@@ -15793,6 +15826,133 @@ var GlobalMetricsSchema = object({
15793
15826
  * capability providers.
15794
15827
  */
15795
15828
  var CapabilityBindingsSchema = record(string(), string());
15829
+ /** Source block — always present; derives from the stream catalog. */
15830
+ var CameraSourceStatusSchema = object({ streams: array(object({
15831
+ camStreamId: string(),
15832
+ codec: string(),
15833
+ width: number(),
15834
+ height: number(),
15835
+ fps: number(),
15836
+ kind: string()
15837
+ })).readonly() });
15838
+ /** Assignment block — always present (orchestrator-local, no remote call). */
15839
+ var CameraAssignmentStatusSchema = object({
15840
+ detectionNodeId: string().nullable(),
15841
+ decoderNodeId: string().nullable(),
15842
+ audioNodeId: string().nullable(),
15843
+ pinned: object({
15844
+ detection: boolean(),
15845
+ decoder: boolean(),
15846
+ audio: boolean()
15847
+ }),
15848
+ reasons: object({
15849
+ detection: string().optional(),
15850
+ decoder: string().optional(),
15851
+ audio: string().optional()
15852
+ })
15853
+ });
15854
+ /** Broker block — null when the broker stage is unreachable or inactive. */
15855
+ var CameraBrokerStatusSchema = object({
15856
+ profiles: array(object({
15857
+ profile: string(),
15858
+ status: string(),
15859
+ codec: string(),
15860
+ width: number(),
15861
+ height: number(),
15862
+ subscribers: number(),
15863
+ inFps: number(),
15864
+ outFps: number()
15865
+ })).readonly(),
15866
+ webrtcSessions: number(),
15867
+ rtspRestream: boolean()
15868
+ });
15869
+ /** Shared-memory ring statistics within the decoder block. */
15870
+ var CameraDecoderShmSchema = object({
15871
+ framesWritten: number(),
15872
+ getFrameHits: number(),
15873
+ getFrameMisses: number(),
15874
+ budgetMb: number()
15875
+ });
15876
+ /** Decoder block — null when the decoder stage is unreachable or inactive. */
15877
+ var CameraDecoderStatusSchema = object({
15878
+ nodeId: string(),
15879
+ formats: array(string()).readonly(),
15880
+ sessionCount: number(),
15881
+ shm: CameraDecoderShmSchema
15882
+ });
15883
+ /** Motion block — null when motion detection is not active for this device. */
15884
+ var CameraMotionStatusSchema = object({
15885
+ enabled: boolean(),
15886
+ fps: number()
15887
+ });
15888
+ /** Detection provisioning sub-block. */
15889
+ var CameraDetectionProvisioningSchema = object({
15890
+ state: _enum([
15891
+ "idle",
15892
+ "installing",
15893
+ "verifying",
15894
+ "ready",
15895
+ "failed"
15896
+ ]),
15897
+ error: string().optional()
15898
+ });
15899
+ /** Detection phase — derived from the runner's engine phase. */
15900
+ var CameraDetectionPhaseSchema = _enum([
15901
+ "idle",
15902
+ "watching",
15903
+ "active"
15904
+ ]);
15905
+ /** Detection block — null when no detection node is assigned or reachable. */
15906
+ var CameraDetectionStatusSchema = object({
15907
+ nodeId: string(),
15908
+ engine: object({
15909
+ backend: string(),
15910
+ device: string()
15911
+ }),
15912
+ phase: CameraDetectionPhaseSchema,
15913
+ configuredFps: number(),
15914
+ actualFps: number(),
15915
+ queueDepth: number(),
15916
+ avgInferenceMs: number(),
15917
+ provisioning: CameraDetectionProvisioningSchema
15918
+ });
15919
+ /** Audio block — null when no audio node is assigned or reachable. */
15920
+ var CameraAudioStatusSchema = object({
15921
+ nodeId: string(),
15922
+ enabled: boolean()
15923
+ });
15924
+ /** Recording block — null when no recording cap is active for this device. */
15925
+ var CameraRecordingStatusSchema = object({
15926
+ mode: _enum([
15927
+ "off",
15928
+ "continuous",
15929
+ "events"
15930
+ ]),
15931
+ active: boolean(),
15932
+ storageBytes: number()
15933
+ });
15934
+ /**
15935
+ * Aggregated per-camera pipeline status — server-composed, single call.
15936
+ *
15937
+ * The `assignment` and `source` blocks are always present.
15938
+ * Every other block is `null` when the stage is inactive or unreachable
15939
+ * during the bounded parallel fan-out in the orchestrator implementation.
15940
+ *
15941
+ * See spec: `docs/superpowers/specs/2026-06-24-camera-status-aggregator-cap.md`
15942
+ */
15943
+ var CameraStatusSchema = object({
15944
+ deviceId: number(),
15945
+ assignment: CameraAssignmentStatusSchema,
15946
+ source: CameraSourceStatusSchema,
15947
+ broker: CameraBrokerStatusSchema.nullable(),
15948
+ decoder: CameraDecoderStatusSchema.nullable(),
15949
+ motion: CameraMotionStatusSchema.nullable(),
15950
+ detection: CameraDetectionStatusSchema.nullable(),
15951
+ audio: CameraAudioStatusSchema.nullable(),
15952
+ recording: CameraRecordingStatusSchema.nullable(),
15953
+ /** Unix timestamp (ms) when this snapshot was composed server-side. */
15954
+ fetchedAt: number()
15955
+ });
15796
15956
  method(object({
15797
15957
  deviceId: number(),
15798
15958
  agentNodeId: string()
@@ -15860,6 +16020,12 @@ method(object({
15860
16020
  }), {
15861
16021
  kind: "mutation",
15862
16022
  auth: "admin"
16023
+ }), method(object({
16024
+ agentNodeId: string(),
16025
+ maxCameras: number().int().nonnegative().nullable()
16026
+ }), object({ success: literal(true) }), {
16027
+ kind: "mutation",
16028
+ auth: "admin"
15863
16029
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
15864
16030
  deviceId: number(),
15865
16031
  addonId: string(),
@@ -15885,7 +16051,7 @@ method(object({
15885
16051
  }), method(object({
15886
16052
  deviceId: number(),
15887
16053
  agentNodeId: string().optional()
15888
- }), CameraPipelineConfigSchema), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
16054
+ }), CameraPipelineConfigSchema), method(object({ deviceId: number() }), CameraStatusSchema), method(object({ deviceIds: array(number()).optional() }), array(CameraStatusSchema).readonly()), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
15889
16055
  name: string(),
15890
16056
  description: string().optional(),
15891
16057
  config: CameraPipelineConfigSchema
@@ -21766,6 +21932,12 @@ Object.freeze({
21766
21932
  addonId: null,
21767
21933
  access: "view"
21768
21934
  },
21935
+ "pipelineExecutor.getEngineProvisioning": {
21936
+ capName: "pipeline-executor",
21937
+ capScope: "system",
21938
+ addonId: null,
21939
+ access: "view"
21940
+ },
21769
21941
  "pipelineExecutor.getGlobalPipelineConfig": {
21770
21942
  capName: "pipeline-executor",
21771
21943
  capScope: "system",
@@ -21970,6 +22142,18 @@ Object.freeze({
21970
22142
  addonId: null,
21971
22143
  access: "view"
21972
22144
  },
22145
+ "pipelineOrchestrator.getCameraStatus": {
22146
+ capName: "pipeline-orchestrator",
22147
+ capScope: "system",
22148
+ addonId: null,
22149
+ access: "view"
22150
+ },
22151
+ "pipelineOrchestrator.getCameraStatuses": {
22152
+ capName: "pipeline-orchestrator",
22153
+ capScope: "system",
22154
+ addonId: null,
22155
+ access: "view"
22156
+ },
21973
22157
  "pipelineOrchestrator.getCameraStepOverrides": {
21974
22158
  capName: "pipeline-orchestrator",
21975
22159
  capScope: "system",
@@ -22054,6 +22238,12 @@ Object.freeze({
22054
22238
  addonId: null,
22055
22239
  access: "create"
22056
22240
  },
22241
+ "pipelineOrchestrator.setAgentMaxCameras": {
22242
+ capName: "pipeline-orchestrator",
22243
+ capScope: "system",
22244
+ addonId: null,
22245
+ access: "create"
22246
+ },
22057
22247
  "pipelineOrchestrator.setCameraPipelineForAgent": {
22058
22248
  capName: "pipeline-orchestrator",
22059
22249
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -4982,6 +4982,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
4982
4982
  */
4983
4983
  EventCategory["PipelineEngineMetricsSnapshot"] = "pipeline.engine-metrics-snapshot";
4984
4984
  /**
4985
+ * Per-node detection-engine runtime-provisioning transition. Emitted by
4986
+ * the detection-pipeline provider on every state change of its lazy
4987
+ * engine-provisioning machine (idle → installing → verifying → ready,
4988
+ * or → failed with a `nextRetryAt`). Payload is the
4989
+ * `EngineProvisioningState` snapshot; `event.source.nodeId` carries the
4990
+ * node. The Pipeline page subscribes to drive a live "installing
4991
+ * OpenVINO… / ready" indicator per node without polling
4992
+ * `pipelineExecutor.getEngineProvisioning`. Telemetry-grade (D8): the UI
4993
+ * also reads the cap snapshot on mount / reconnect. Phase 2.
4994
+ */
4995
+ EventCategory["PipelineEngineProvisioning"] = "pipeline.engine-provisioning";
4996
+ /**
4985
4997
  * Cluster topology snapshot. Carries the same payload returned by
4986
4998
  * `nodes.topology` (every reachable node + addons + processes).
4987
4999
  * Emitted by the hub on any agent / addon lifecycle change
@@ -10400,6 +10412,24 @@ var DetectorOutputSchema = object({
10400
10412
  inferenceMs: number(),
10401
10413
  modelId: string()
10402
10414
  });
10415
+ var EngineProvisioningSchema = object({
10416
+ runtimeId: _enum([
10417
+ "onnx",
10418
+ "openvino",
10419
+ "coreml"
10420
+ ]).nullable(),
10421
+ device: string().nullable(),
10422
+ state: _enum([
10423
+ "idle",
10424
+ "installing",
10425
+ "verifying",
10426
+ "ready",
10427
+ "failed"
10428
+ ]),
10429
+ progress: number().optional(),
10430
+ error: string().optional(),
10431
+ nextRetryAt: number().optional()
10432
+ });
10403
10433
  var PipelineStepInputSchema = lazy(() => object({
10404
10434
  addonId: string(),
10405
10435
  modelId: string(),
@@ -10468,7 +10498,7 @@ var PipelineRunResultBridge = custom();
10468
10498
  method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(), PipelineEngineChoiceSchema, {
10469
10499
  kind: "mutation",
10470
10500
  auth: "admin"
10471
- }), method(_void(), record(string(), object({
10501
+ }), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
10472
10502
  modelId: string(),
10473
10503
  settings: record(string(), unknown()).readonly()
10474
10504
  }))), method(object({ steps: record(string(), object({
@@ -15690,7 +15720,10 @@ var AgentAddonConfigSchema = object({
15690
15720
  modelId: string(),
15691
15721
  settings: record(string(), unknown()).readonly()
15692
15722
  });
15693
- var AgentPipelineSettingsSchema = object({ addonDefaults: record(string(), AgentAddonConfigSchema).readonly() });
15723
+ var AgentPipelineSettingsSchema = object({
15724
+ addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
15725
+ maxCameras: number().int().nonnegative().nullable().default(null)
15726
+ });
15694
15727
  var CameraPipelineForAgentSchema = object({
15695
15728
  steps: array(PipelineStepInputSchema).readonly(),
15696
15729
  audio: object({
@@ -15792,6 +15825,133 @@ var GlobalMetricsSchema = object({
15792
15825
  * capability providers.
15793
15826
  */
15794
15827
  var CapabilityBindingsSchema = record(string(), string());
15828
+ /** Source block — always present; derives from the stream catalog. */
15829
+ var CameraSourceStatusSchema = object({ streams: array(object({
15830
+ camStreamId: string(),
15831
+ codec: string(),
15832
+ width: number(),
15833
+ height: number(),
15834
+ fps: number(),
15835
+ kind: string()
15836
+ })).readonly() });
15837
+ /** Assignment block — always present (orchestrator-local, no remote call). */
15838
+ var CameraAssignmentStatusSchema = object({
15839
+ detectionNodeId: string().nullable(),
15840
+ decoderNodeId: string().nullable(),
15841
+ audioNodeId: string().nullable(),
15842
+ pinned: object({
15843
+ detection: boolean(),
15844
+ decoder: boolean(),
15845
+ audio: boolean()
15846
+ }),
15847
+ reasons: object({
15848
+ detection: string().optional(),
15849
+ decoder: string().optional(),
15850
+ audio: string().optional()
15851
+ })
15852
+ });
15853
+ /** Broker block — null when the broker stage is unreachable or inactive. */
15854
+ var CameraBrokerStatusSchema = object({
15855
+ profiles: array(object({
15856
+ profile: string(),
15857
+ status: string(),
15858
+ codec: string(),
15859
+ width: number(),
15860
+ height: number(),
15861
+ subscribers: number(),
15862
+ inFps: number(),
15863
+ outFps: number()
15864
+ })).readonly(),
15865
+ webrtcSessions: number(),
15866
+ rtspRestream: boolean()
15867
+ });
15868
+ /** Shared-memory ring statistics within the decoder block. */
15869
+ var CameraDecoderShmSchema = object({
15870
+ framesWritten: number(),
15871
+ getFrameHits: number(),
15872
+ getFrameMisses: number(),
15873
+ budgetMb: number()
15874
+ });
15875
+ /** Decoder block — null when the decoder stage is unreachable or inactive. */
15876
+ var CameraDecoderStatusSchema = object({
15877
+ nodeId: string(),
15878
+ formats: array(string()).readonly(),
15879
+ sessionCount: number(),
15880
+ shm: CameraDecoderShmSchema
15881
+ });
15882
+ /** Motion block — null when motion detection is not active for this device. */
15883
+ var CameraMotionStatusSchema = object({
15884
+ enabled: boolean(),
15885
+ fps: number()
15886
+ });
15887
+ /** Detection provisioning sub-block. */
15888
+ var CameraDetectionProvisioningSchema = object({
15889
+ state: _enum([
15890
+ "idle",
15891
+ "installing",
15892
+ "verifying",
15893
+ "ready",
15894
+ "failed"
15895
+ ]),
15896
+ error: string().optional()
15897
+ });
15898
+ /** Detection phase — derived from the runner's engine phase. */
15899
+ var CameraDetectionPhaseSchema = _enum([
15900
+ "idle",
15901
+ "watching",
15902
+ "active"
15903
+ ]);
15904
+ /** Detection block — null when no detection node is assigned or reachable. */
15905
+ var CameraDetectionStatusSchema = object({
15906
+ nodeId: string(),
15907
+ engine: object({
15908
+ backend: string(),
15909
+ device: string()
15910
+ }),
15911
+ phase: CameraDetectionPhaseSchema,
15912
+ configuredFps: number(),
15913
+ actualFps: number(),
15914
+ queueDepth: number(),
15915
+ avgInferenceMs: number(),
15916
+ provisioning: CameraDetectionProvisioningSchema
15917
+ });
15918
+ /** Audio block — null when no audio node is assigned or reachable. */
15919
+ var CameraAudioStatusSchema = object({
15920
+ nodeId: string(),
15921
+ enabled: boolean()
15922
+ });
15923
+ /** Recording block — null when no recording cap is active for this device. */
15924
+ var CameraRecordingStatusSchema = object({
15925
+ mode: _enum([
15926
+ "off",
15927
+ "continuous",
15928
+ "events"
15929
+ ]),
15930
+ active: boolean(),
15931
+ storageBytes: number()
15932
+ });
15933
+ /**
15934
+ * Aggregated per-camera pipeline status — server-composed, single call.
15935
+ *
15936
+ * The `assignment` and `source` blocks are always present.
15937
+ * Every other block is `null` when the stage is inactive or unreachable
15938
+ * during the bounded parallel fan-out in the orchestrator implementation.
15939
+ *
15940
+ * See spec: `docs/superpowers/specs/2026-06-24-camera-status-aggregator-cap.md`
15941
+ */
15942
+ var CameraStatusSchema = object({
15943
+ deviceId: number(),
15944
+ assignment: CameraAssignmentStatusSchema,
15945
+ source: CameraSourceStatusSchema,
15946
+ broker: CameraBrokerStatusSchema.nullable(),
15947
+ decoder: CameraDecoderStatusSchema.nullable(),
15948
+ motion: CameraMotionStatusSchema.nullable(),
15949
+ detection: CameraDetectionStatusSchema.nullable(),
15950
+ audio: CameraAudioStatusSchema.nullable(),
15951
+ recording: CameraRecordingStatusSchema.nullable(),
15952
+ /** Unix timestamp (ms) when this snapshot was composed server-side. */
15953
+ fetchedAt: number()
15954
+ });
15795
15955
  method(object({
15796
15956
  deviceId: number(),
15797
15957
  agentNodeId: string()
@@ -15859,6 +16019,12 @@ method(object({
15859
16019
  }), {
15860
16020
  kind: "mutation",
15861
16021
  auth: "admin"
16022
+ }), method(object({
16023
+ agentNodeId: string(),
16024
+ maxCameras: number().int().nonnegative().nullable()
16025
+ }), object({ success: literal(true) }), {
16026
+ kind: "mutation",
16027
+ auth: "admin"
15862
16028
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
15863
16029
  deviceId: number(),
15864
16030
  addonId: string(),
@@ -15884,7 +16050,7 @@ method(object({
15884
16050
  }), method(object({
15885
16051
  deviceId: number(),
15886
16052
  agentNodeId: string().optional()
15887
- }), CameraPipelineConfigSchema), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
16053
+ }), CameraPipelineConfigSchema), method(object({ deviceId: number() }), CameraStatusSchema), method(object({ deviceIds: array(number()).optional() }), array(CameraStatusSchema).readonly()), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
15888
16054
  name: string(),
15889
16055
  description: string().optional(),
15890
16056
  config: CameraPipelineConfigSchema
@@ -21765,6 +21931,12 @@ Object.freeze({
21765
21931
  addonId: null,
21766
21932
  access: "view"
21767
21933
  },
21934
+ "pipelineExecutor.getEngineProvisioning": {
21935
+ capName: "pipeline-executor",
21936
+ capScope: "system",
21937
+ addonId: null,
21938
+ access: "view"
21939
+ },
21768
21940
  "pipelineExecutor.getGlobalPipelineConfig": {
21769
21941
  capName: "pipeline-executor",
21770
21942
  capScope: "system",
@@ -21969,6 +22141,18 @@ Object.freeze({
21969
22141
  addonId: null,
21970
22142
  access: "view"
21971
22143
  },
22144
+ "pipelineOrchestrator.getCameraStatus": {
22145
+ capName: "pipeline-orchestrator",
22146
+ capScope: "system",
22147
+ addonId: null,
22148
+ access: "view"
22149
+ },
22150
+ "pipelineOrchestrator.getCameraStatuses": {
22151
+ capName: "pipeline-orchestrator",
22152
+ capScope: "system",
22153
+ addonId: null,
22154
+ access: "view"
22155
+ },
21972
22156
  "pipelineOrchestrator.getCameraStepOverrides": {
21973
22157
  capName: "pipeline-orchestrator",
21974
22158
  capScope: "system",
@@ -22053,6 +22237,12 @@ Object.freeze({
22053
22237
  addonId: null,
22054
22238
  access: "create"
22055
22239
  },
22240
+ "pipelineOrchestrator.setAgentMaxCameras": {
22241
+ capName: "pipeline-orchestrator",
22242
+ capScope: "system",
22243
+ addonId: null,
22244
+ access: "create"
22245
+ },
22056
22246
  "pipelineOrchestrator.setCameraPipelineForAgent": {
22057
22247
  capName: "pipeline-orchestrator",
22058
22248
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-homeassistant",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "Home Assistant device provider addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",