@camstack/addon-mqtt-broker 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.
@@ -5027,6 +5027,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5027
5027
  */
5028
5028
  EventCategory["PipelineEngineMetricsSnapshot"] = "pipeline.engine-metrics-snapshot";
5029
5029
  /**
5030
+ * Per-node detection-engine runtime-provisioning transition. Emitted by
5031
+ * the detection-pipeline provider on every state change of its lazy
5032
+ * engine-provisioning machine (idle → installing → verifying → ready,
5033
+ * or → failed with a `nextRetryAt`). Payload is the
5034
+ * `EngineProvisioningState` snapshot; `event.source.nodeId` carries the
5035
+ * node. The Pipeline page subscribes to drive a live "installing
5036
+ * OpenVINO… / ready" indicator per node without polling
5037
+ * `pipelineExecutor.getEngineProvisioning`. Telemetry-grade (D8): the UI
5038
+ * also reads the cap snapshot on mount / reconnect. Phase 2.
5039
+ */
5040
+ EventCategory["PipelineEngineProvisioning"] = "pipeline.engine-provisioning";
5041
+ /**
5030
5042
  * Cluster topology snapshot. Carries the same payload returned by
5031
5043
  * `nodes.topology` (every reachable node + addons + processes).
5032
5044
  * Emitted by the hub on any agent / addon lifecycle change
@@ -9191,6 +9203,24 @@ var DetectorOutputSchema = object({
9191
9203
  inferenceMs: number(),
9192
9204
  modelId: string()
9193
9205
  });
9206
+ var EngineProvisioningSchema = object({
9207
+ runtimeId: _enum([
9208
+ "onnx",
9209
+ "openvino",
9210
+ "coreml"
9211
+ ]).nullable(),
9212
+ device: string().nullable(),
9213
+ state: _enum([
9214
+ "idle",
9215
+ "installing",
9216
+ "verifying",
9217
+ "ready",
9218
+ "failed"
9219
+ ]),
9220
+ progress: number().optional(),
9221
+ error: string().optional(),
9222
+ nextRetryAt: number().optional()
9223
+ });
9194
9224
  var PipelineStepInputSchema = lazy(() => object({
9195
9225
  addonId: string(),
9196
9226
  modelId: string(),
@@ -9259,7 +9289,7 @@ var PipelineRunResultBridge = custom();
9259
9289
  method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(), PipelineEngineChoiceSchema, {
9260
9290
  kind: "mutation",
9261
9291
  auth: "admin"
9262
- }), method(_void(), record(string(), object({
9292
+ }), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
9263
9293
  modelId: string(),
9264
9294
  settings: record(string(), unknown()).readonly()
9265
9295
  }))), method(object({ steps: record(string(), object({
@@ -12914,7 +12944,10 @@ var AgentAddonConfigSchema = object({
12914
12944
  modelId: string(),
12915
12945
  settings: record(string(), unknown()).readonly()
12916
12946
  });
12917
- var AgentPipelineSettingsSchema = object({ addonDefaults: record(string(), AgentAddonConfigSchema).readonly() });
12947
+ var AgentPipelineSettingsSchema = object({
12948
+ addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
12949
+ maxCameras: number().int().nonnegative().nullable().default(null)
12950
+ });
12918
12951
  var CameraPipelineForAgentSchema = object({
12919
12952
  steps: array(PipelineStepInputSchema).readonly(),
12920
12953
  audio: object({
@@ -13016,6 +13049,133 @@ var GlobalMetricsSchema = object({
13016
13049
  * capability providers.
13017
13050
  */
13018
13051
  var CapabilityBindingsSchema = record(string(), string());
13052
+ /** Source block — always present; derives from the stream catalog. */
13053
+ var CameraSourceStatusSchema = object({ streams: array(object({
13054
+ camStreamId: string(),
13055
+ codec: string(),
13056
+ width: number(),
13057
+ height: number(),
13058
+ fps: number(),
13059
+ kind: string()
13060
+ })).readonly() });
13061
+ /** Assignment block — always present (orchestrator-local, no remote call). */
13062
+ var CameraAssignmentStatusSchema = object({
13063
+ detectionNodeId: string().nullable(),
13064
+ decoderNodeId: string().nullable(),
13065
+ audioNodeId: string().nullable(),
13066
+ pinned: object({
13067
+ detection: boolean(),
13068
+ decoder: boolean(),
13069
+ audio: boolean()
13070
+ }),
13071
+ reasons: object({
13072
+ detection: string().optional(),
13073
+ decoder: string().optional(),
13074
+ audio: string().optional()
13075
+ })
13076
+ });
13077
+ /** Broker block — null when the broker stage is unreachable or inactive. */
13078
+ var CameraBrokerStatusSchema = object({
13079
+ profiles: array(object({
13080
+ profile: string(),
13081
+ status: string(),
13082
+ codec: string(),
13083
+ width: number(),
13084
+ height: number(),
13085
+ subscribers: number(),
13086
+ inFps: number(),
13087
+ outFps: number()
13088
+ })).readonly(),
13089
+ webrtcSessions: number(),
13090
+ rtspRestream: boolean()
13091
+ });
13092
+ /** Shared-memory ring statistics within the decoder block. */
13093
+ var CameraDecoderShmSchema = object({
13094
+ framesWritten: number(),
13095
+ getFrameHits: number(),
13096
+ getFrameMisses: number(),
13097
+ budgetMb: number()
13098
+ });
13099
+ /** Decoder block — null when the decoder stage is unreachable or inactive. */
13100
+ var CameraDecoderStatusSchema = object({
13101
+ nodeId: string(),
13102
+ formats: array(string()).readonly(),
13103
+ sessionCount: number(),
13104
+ shm: CameraDecoderShmSchema
13105
+ });
13106
+ /** Motion block — null when motion detection is not active for this device. */
13107
+ var CameraMotionStatusSchema = object({
13108
+ enabled: boolean(),
13109
+ fps: number()
13110
+ });
13111
+ /** Detection provisioning sub-block. */
13112
+ var CameraDetectionProvisioningSchema = object({
13113
+ state: _enum([
13114
+ "idle",
13115
+ "installing",
13116
+ "verifying",
13117
+ "ready",
13118
+ "failed"
13119
+ ]),
13120
+ error: string().optional()
13121
+ });
13122
+ /** Detection phase — derived from the runner's engine phase. */
13123
+ var CameraDetectionPhaseSchema = _enum([
13124
+ "idle",
13125
+ "watching",
13126
+ "active"
13127
+ ]);
13128
+ /** Detection block — null when no detection node is assigned or reachable. */
13129
+ var CameraDetectionStatusSchema = object({
13130
+ nodeId: string(),
13131
+ engine: object({
13132
+ backend: string(),
13133
+ device: string()
13134
+ }),
13135
+ phase: CameraDetectionPhaseSchema,
13136
+ configuredFps: number(),
13137
+ actualFps: number(),
13138
+ queueDepth: number(),
13139
+ avgInferenceMs: number(),
13140
+ provisioning: CameraDetectionProvisioningSchema
13141
+ });
13142
+ /** Audio block — null when no audio node is assigned or reachable. */
13143
+ var CameraAudioStatusSchema = object({
13144
+ nodeId: string(),
13145
+ enabled: boolean()
13146
+ });
13147
+ /** Recording block — null when no recording cap is active for this device. */
13148
+ var CameraRecordingStatusSchema = object({
13149
+ mode: _enum([
13150
+ "off",
13151
+ "continuous",
13152
+ "events"
13153
+ ]),
13154
+ active: boolean(),
13155
+ storageBytes: number()
13156
+ });
13157
+ /**
13158
+ * Aggregated per-camera pipeline status — server-composed, single call.
13159
+ *
13160
+ * The `assignment` and `source` blocks are always present.
13161
+ * Every other block is `null` when the stage is inactive or unreachable
13162
+ * during the bounded parallel fan-out in the orchestrator implementation.
13163
+ *
13164
+ * See spec: `docs/superpowers/specs/2026-06-24-camera-status-aggregator-cap.md`
13165
+ */
13166
+ var CameraStatusSchema = object({
13167
+ deviceId: number(),
13168
+ assignment: CameraAssignmentStatusSchema,
13169
+ source: CameraSourceStatusSchema,
13170
+ broker: CameraBrokerStatusSchema.nullable(),
13171
+ decoder: CameraDecoderStatusSchema.nullable(),
13172
+ motion: CameraMotionStatusSchema.nullable(),
13173
+ detection: CameraDetectionStatusSchema.nullable(),
13174
+ audio: CameraAudioStatusSchema.nullable(),
13175
+ recording: CameraRecordingStatusSchema.nullable(),
13176
+ /** Unix timestamp (ms) when this snapshot was composed server-side. */
13177
+ fetchedAt: number()
13178
+ });
13019
13179
  method(object({
13020
13180
  deviceId: number(),
13021
13181
  agentNodeId: string()
@@ -13083,6 +13243,12 @@ method(object({
13083
13243
  }), {
13084
13244
  kind: "mutation",
13085
13245
  auth: "admin"
13246
+ }), method(object({
13247
+ agentNodeId: string(),
13248
+ maxCameras: number().int().nonnegative().nullable()
13249
+ }), object({ success: literal(true) }), {
13250
+ kind: "mutation",
13251
+ auth: "admin"
13086
13252
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
13087
13253
  deviceId: number(),
13088
13254
  addonId: string(),
@@ -13108,7 +13274,7 @@ method(object({
13108
13274
  }), method(object({
13109
13275
  deviceId: number(),
13110
13276
  agentNodeId: string().optional()
13111
- }), CameraPipelineConfigSchema), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
13277
+ }), CameraPipelineConfigSchema), method(object({ deviceId: number() }), CameraStatusSchema), method(object({ deviceIds: array(number()).optional() }), array(CameraStatusSchema).readonly()), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
13112
13278
  name: string(),
13113
13279
  description: string().optional(),
13114
13280
  config: CameraPipelineConfigSchema
@@ -18900,6 +19066,12 @@ Object.freeze({
18900
19066
  addonId: null,
18901
19067
  access: "view"
18902
19068
  },
19069
+ "pipelineExecutor.getEngineProvisioning": {
19070
+ capName: "pipeline-executor",
19071
+ capScope: "system",
19072
+ addonId: null,
19073
+ access: "view"
19074
+ },
18903
19075
  "pipelineExecutor.getGlobalPipelineConfig": {
18904
19076
  capName: "pipeline-executor",
18905
19077
  capScope: "system",
@@ -19104,6 +19276,18 @@ Object.freeze({
19104
19276
  addonId: null,
19105
19277
  access: "view"
19106
19278
  },
19279
+ "pipelineOrchestrator.getCameraStatus": {
19280
+ capName: "pipeline-orchestrator",
19281
+ capScope: "system",
19282
+ addonId: null,
19283
+ access: "view"
19284
+ },
19285
+ "pipelineOrchestrator.getCameraStatuses": {
19286
+ capName: "pipeline-orchestrator",
19287
+ capScope: "system",
19288
+ addonId: null,
19289
+ access: "view"
19290
+ },
19107
19291
  "pipelineOrchestrator.getCameraStepOverrides": {
19108
19292
  capName: "pipeline-orchestrator",
19109
19293
  capScope: "system",
@@ -19188,6 +19372,12 @@ Object.freeze({
19188
19372
  addonId: null,
19189
19373
  access: "create"
19190
19374
  },
19375
+ "pipelineOrchestrator.setAgentMaxCameras": {
19376
+ capName: "pipeline-orchestrator",
19377
+ capScope: "system",
19378
+ addonId: null,
19379
+ access: "create"
19380
+ },
19191
19381
  "pipelineOrchestrator.setCameraPipelineForAgent": {
19192
19382
  capName: "pipeline-orchestrator",
19193
19383
  capScope: "system",
@@ -5022,6 +5022,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5022
5022
  */
5023
5023
  EventCategory["PipelineEngineMetricsSnapshot"] = "pipeline.engine-metrics-snapshot";
5024
5024
  /**
5025
+ * Per-node detection-engine runtime-provisioning transition. Emitted by
5026
+ * the detection-pipeline provider on every state change of its lazy
5027
+ * engine-provisioning machine (idle → installing → verifying → ready,
5028
+ * or → failed with a `nextRetryAt`). Payload is the
5029
+ * `EngineProvisioningState` snapshot; `event.source.nodeId` carries the
5030
+ * node. The Pipeline page subscribes to drive a live "installing
5031
+ * OpenVINO… / ready" indicator per node without polling
5032
+ * `pipelineExecutor.getEngineProvisioning`. Telemetry-grade (D8): the UI
5033
+ * also reads the cap snapshot on mount / reconnect. Phase 2.
5034
+ */
5035
+ EventCategory["PipelineEngineProvisioning"] = "pipeline.engine-provisioning";
5036
+ /**
5025
5037
  * Cluster topology snapshot. Carries the same payload returned by
5026
5038
  * `nodes.topology` (every reachable node + addons + processes).
5027
5039
  * Emitted by the hub on any agent / addon lifecycle change
@@ -9186,6 +9198,24 @@ var DetectorOutputSchema = object({
9186
9198
  inferenceMs: number(),
9187
9199
  modelId: string()
9188
9200
  });
9201
+ var EngineProvisioningSchema = object({
9202
+ runtimeId: _enum([
9203
+ "onnx",
9204
+ "openvino",
9205
+ "coreml"
9206
+ ]).nullable(),
9207
+ device: string().nullable(),
9208
+ state: _enum([
9209
+ "idle",
9210
+ "installing",
9211
+ "verifying",
9212
+ "ready",
9213
+ "failed"
9214
+ ]),
9215
+ progress: number().optional(),
9216
+ error: string().optional(),
9217
+ nextRetryAt: number().optional()
9218
+ });
9189
9219
  var PipelineStepInputSchema = lazy(() => object({
9190
9220
  addonId: string(),
9191
9221
  modelId: string(),
@@ -9254,7 +9284,7 @@ var PipelineRunResultBridge = custom();
9254
9284
  method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(), PipelineEngineChoiceSchema, {
9255
9285
  kind: "mutation",
9256
9286
  auth: "admin"
9257
- }), method(_void(), record(string(), object({
9287
+ }), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
9258
9288
  modelId: string(),
9259
9289
  settings: record(string(), unknown()).readonly()
9260
9290
  }))), method(object({ steps: record(string(), object({
@@ -12909,7 +12939,10 @@ var AgentAddonConfigSchema = object({
12909
12939
  modelId: string(),
12910
12940
  settings: record(string(), unknown()).readonly()
12911
12941
  });
12912
- var AgentPipelineSettingsSchema = object({ addonDefaults: record(string(), AgentAddonConfigSchema).readonly() });
12942
+ var AgentPipelineSettingsSchema = object({
12943
+ addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
12944
+ maxCameras: number().int().nonnegative().nullable().default(null)
12945
+ });
12913
12946
  var CameraPipelineForAgentSchema = object({
12914
12947
  steps: array(PipelineStepInputSchema).readonly(),
12915
12948
  audio: object({
@@ -13011,6 +13044,133 @@ var GlobalMetricsSchema = object({
13011
13044
  * capability providers.
13012
13045
  */
13013
13046
  var CapabilityBindingsSchema = record(string(), string());
13047
+ /** Source block — always present; derives from the stream catalog. */
13048
+ var CameraSourceStatusSchema = object({ streams: array(object({
13049
+ camStreamId: string(),
13050
+ codec: string(),
13051
+ width: number(),
13052
+ height: number(),
13053
+ fps: number(),
13054
+ kind: string()
13055
+ })).readonly() });
13056
+ /** Assignment block — always present (orchestrator-local, no remote call). */
13057
+ var CameraAssignmentStatusSchema = object({
13058
+ detectionNodeId: string().nullable(),
13059
+ decoderNodeId: string().nullable(),
13060
+ audioNodeId: string().nullable(),
13061
+ pinned: object({
13062
+ detection: boolean(),
13063
+ decoder: boolean(),
13064
+ audio: boolean()
13065
+ }),
13066
+ reasons: object({
13067
+ detection: string().optional(),
13068
+ decoder: string().optional(),
13069
+ audio: string().optional()
13070
+ })
13071
+ });
13072
+ /** Broker block — null when the broker stage is unreachable or inactive. */
13073
+ var CameraBrokerStatusSchema = object({
13074
+ profiles: array(object({
13075
+ profile: string(),
13076
+ status: string(),
13077
+ codec: string(),
13078
+ width: number(),
13079
+ height: number(),
13080
+ subscribers: number(),
13081
+ inFps: number(),
13082
+ outFps: number()
13083
+ })).readonly(),
13084
+ webrtcSessions: number(),
13085
+ rtspRestream: boolean()
13086
+ });
13087
+ /** Shared-memory ring statistics within the decoder block. */
13088
+ var CameraDecoderShmSchema = object({
13089
+ framesWritten: number(),
13090
+ getFrameHits: number(),
13091
+ getFrameMisses: number(),
13092
+ budgetMb: number()
13093
+ });
13094
+ /** Decoder block — null when the decoder stage is unreachable or inactive. */
13095
+ var CameraDecoderStatusSchema = object({
13096
+ nodeId: string(),
13097
+ formats: array(string()).readonly(),
13098
+ sessionCount: number(),
13099
+ shm: CameraDecoderShmSchema
13100
+ });
13101
+ /** Motion block — null when motion detection is not active for this device. */
13102
+ var CameraMotionStatusSchema = object({
13103
+ enabled: boolean(),
13104
+ fps: number()
13105
+ });
13106
+ /** Detection provisioning sub-block. */
13107
+ var CameraDetectionProvisioningSchema = object({
13108
+ state: _enum([
13109
+ "idle",
13110
+ "installing",
13111
+ "verifying",
13112
+ "ready",
13113
+ "failed"
13114
+ ]),
13115
+ error: string().optional()
13116
+ });
13117
+ /** Detection phase — derived from the runner's engine phase. */
13118
+ var CameraDetectionPhaseSchema = _enum([
13119
+ "idle",
13120
+ "watching",
13121
+ "active"
13122
+ ]);
13123
+ /** Detection block — null when no detection node is assigned or reachable. */
13124
+ var CameraDetectionStatusSchema = object({
13125
+ nodeId: string(),
13126
+ engine: object({
13127
+ backend: string(),
13128
+ device: string()
13129
+ }),
13130
+ phase: CameraDetectionPhaseSchema,
13131
+ configuredFps: number(),
13132
+ actualFps: number(),
13133
+ queueDepth: number(),
13134
+ avgInferenceMs: number(),
13135
+ provisioning: CameraDetectionProvisioningSchema
13136
+ });
13137
+ /** Audio block — null when no audio node is assigned or reachable. */
13138
+ var CameraAudioStatusSchema = object({
13139
+ nodeId: string(),
13140
+ enabled: boolean()
13141
+ });
13142
+ /** Recording block — null when no recording cap is active for this device. */
13143
+ var CameraRecordingStatusSchema = object({
13144
+ mode: _enum([
13145
+ "off",
13146
+ "continuous",
13147
+ "events"
13148
+ ]),
13149
+ active: boolean(),
13150
+ storageBytes: number()
13151
+ });
13152
+ /**
13153
+ * Aggregated per-camera pipeline status — server-composed, single call.
13154
+ *
13155
+ * The `assignment` and `source` blocks are always present.
13156
+ * Every other block is `null` when the stage is inactive or unreachable
13157
+ * during the bounded parallel fan-out in the orchestrator implementation.
13158
+ *
13159
+ * See spec: `docs/superpowers/specs/2026-06-24-camera-status-aggregator-cap.md`
13160
+ */
13161
+ var CameraStatusSchema = object({
13162
+ deviceId: number(),
13163
+ assignment: CameraAssignmentStatusSchema,
13164
+ source: CameraSourceStatusSchema,
13165
+ broker: CameraBrokerStatusSchema.nullable(),
13166
+ decoder: CameraDecoderStatusSchema.nullable(),
13167
+ motion: CameraMotionStatusSchema.nullable(),
13168
+ detection: CameraDetectionStatusSchema.nullable(),
13169
+ audio: CameraAudioStatusSchema.nullable(),
13170
+ recording: CameraRecordingStatusSchema.nullable(),
13171
+ /** Unix timestamp (ms) when this snapshot was composed server-side. */
13172
+ fetchedAt: number()
13173
+ });
13014
13174
  method(object({
13015
13175
  deviceId: number(),
13016
13176
  agentNodeId: string()
@@ -13078,6 +13238,12 @@ method(object({
13078
13238
  }), {
13079
13239
  kind: "mutation",
13080
13240
  auth: "admin"
13241
+ }), method(object({
13242
+ agentNodeId: string(),
13243
+ maxCameras: number().int().nonnegative().nullable()
13244
+ }), object({ success: literal(true) }), {
13245
+ kind: "mutation",
13246
+ auth: "admin"
13081
13247
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
13082
13248
  deviceId: number(),
13083
13249
  addonId: string(),
@@ -13103,7 +13269,7 @@ method(object({
13103
13269
  }), method(object({
13104
13270
  deviceId: number(),
13105
13271
  agentNodeId: string().optional()
13106
- }), CameraPipelineConfigSchema), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
13272
+ }), CameraPipelineConfigSchema), method(object({ deviceId: number() }), CameraStatusSchema), method(object({ deviceIds: array(number()).optional() }), array(CameraStatusSchema).readonly()), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
13107
13273
  name: string(),
13108
13274
  description: string().optional(),
13109
13275
  config: CameraPipelineConfigSchema
@@ -18895,6 +19061,12 @@ Object.freeze({
18895
19061
  addonId: null,
18896
19062
  access: "view"
18897
19063
  },
19064
+ "pipelineExecutor.getEngineProvisioning": {
19065
+ capName: "pipeline-executor",
19066
+ capScope: "system",
19067
+ addonId: null,
19068
+ access: "view"
19069
+ },
18898
19070
  "pipelineExecutor.getGlobalPipelineConfig": {
18899
19071
  capName: "pipeline-executor",
18900
19072
  capScope: "system",
@@ -19099,6 +19271,18 @@ Object.freeze({
19099
19271
  addonId: null,
19100
19272
  access: "view"
19101
19273
  },
19274
+ "pipelineOrchestrator.getCameraStatus": {
19275
+ capName: "pipeline-orchestrator",
19276
+ capScope: "system",
19277
+ addonId: null,
19278
+ access: "view"
19279
+ },
19280
+ "pipelineOrchestrator.getCameraStatuses": {
19281
+ capName: "pipeline-orchestrator",
19282
+ capScope: "system",
19283
+ addonId: null,
19284
+ access: "view"
19285
+ },
19102
19286
  "pipelineOrchestrator.getCameraStepOverrides": {
19103
19287
  capName: "pipeline-orchestrator",
19104
19288
  capScope: "system",
@@ -19183,6 +19367,12 @@ Object.freeze({
19183
19367
  addonId: null,
19184
19368
  access: "create"
19185
19369
  },
19370
+ "pipelineOrchestrator.setAgentMaxCameras": {
19371
+ capName: "pipeline-orchestrator",
19372
+ capScope: "system",
19373
+ addonId: null,
19374
+ access: "create"
19375
+ },
19186
19376
  "pipelineOrchestrator.setCameraPipelineForAgent": {
19187
19377
  capName: "pipeline-orchestrator",
19188
19378
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-mqtt-broker",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "MQTT broker registry addon for CamStack — manages external broker entries + an optional embedded aedes broker. Consumers spin up their own `mqtt.js` clients via the `mqtt-broker` cap.",
5
5
  "keywords": [
6
6
  "camstack",