@camstack/addon-mqtt-broker 1.0.7 → 1.1.1

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.
@@ -4673,7 +4673,7 @@ function _instanceof(cls, params = {}) {
4673
4673
  return inst;
4674
4674
  }
4675
4675
  //#endregion
4676
- //#region ../types/dist/sleep-B1dKJAMJ.mjs
4676
+ //#region ../types/dist/sleep-BV7rLc6Y.mjs
4677
4677
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4678
4678
  EventCategory["SystemBoot"] = "system.boot";
4679
4679
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -5152,6 +5152,12 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5152
5152
  * Payload: `{ deviceId, childDeviceIds, hiddenChildIds }`.
5153
5153
  */
5154
5154
  EventCategory["AccessoriesChanged"] = "accessories.onAccessoriesChanged";
5155
+ /**
5156
+ * Progress update from a running model conversion job.
5157
+ * Payload: `{ kind: 'model-convert', phase, sessionId?, pct?, detail? }`.
5158
+ * Emitted by `addon-model-studio` on the converting node.
5159
+ */
5160
+ EventCategory["ModelConvertProgress"] = "model-convert.progress";
5155
5161
  return EventCategory;
5156
5162
  }({});
5157
5163
  Object.fromEntries([
@@ -6673,6 +6679,13 @@ object({
6673
6679
  unreachable: number()
6674
6680
  })
6675
6681
  });
6682
+ var LabelDefinitionSchema = object({
6683
+ id: string(),
6684
+ name: string(),
6685
+ category: string().optional(),
6686
+ description: string().optional(),
6687
+ icon: string().optional()
6688
+ });
6676
6689
  var MODEL_FORMATS = [
6677
6690
  "onnx",
6678
6691
  "coreml",
@@ -6681,6 +6694,120 @@ var MODEL_FORMATS = [
6681
6694
  "pt"
6682
6695
  ];
6683
6696
  /**
6697
+ * Multi-file format payload.
6698
+ *
6699
+ * - Directory formats (`isDirectory: true`, e.g. `.mlpackage`): files
6700
+ * relative to the directory root — the downloader fetches each from
6701
+ * `{url}/{file}` into `{modelDir}/{file}`. If omitted, it probes the
6702
+ * HuggingFace API (slower).
6703
+ * - Single-file formats (no `isDirectory`, e.g. OpenVINO IR): sibling
6704
+ * files fetched from the SAME remote directory as `url` and stored flat
6705
+ * alongside the main file — e.g. `['camstack-yolov9t.bin']` for the IR
6706
+ * weights next to `camstack-yolov9t.xml`.
6707
+ */
6708
+ var ModelFormatEntrySchema = object({
6709
+ url: string(),
6710
+ sizeMB: number(),
6711
+ /** Whether this format is a directory bundle (e.g., .mlpackage) rather than a single file */
6712
+ isDirectory: boolean().optional(),
6713
+ /** Multi-file payload (directory members or sibling files). */
6714
+ files: array(string()).readonly().optional(),
6715
+ /** Runtime(s) that can use this format. If omitted, inferred from ModelFormat key */
6716
+ runtimes: array(_enum(["node", "python"])).readonly().optional()
6717
+ });
6718
+ /**
6719
+ * Extra file that must be downloaded alongside the model (e.g., labels JSON, dict.txt).
6720
+ * The downloader fetches from `url` and saves to `{modelsDir}/{filename}`.
6721
+ */
6722
+ var ModelExtraFileSchema = object({
6723
+ url: string(),
6724
+ filename: string(),
6725
+ sizeMB: number()
6726
+ });
6727
+ /**
6728
+ * Per-format payload map. Modelled as an explicit object (one optional key
6729
+ * per `ModelFormat`) rather than `z.record(enum, …)` — zod v4's enum-keyed
6730
+ * record requires every key, but a catalog entry only ships a subset of
6731
+ * formats.
6732
+ */
6733
+ var ModelFormatsSchema = object({
6734
+ onnx: ModelFormatEntrySchema.optional(),
6735
+ coreml: ModelFormatEntrySchema.optional(),
6736
+ openvino: ModelFormatEntrySchema.optional(),
6737
+ tflite: ModelFormatEntrySchema.optional(),
6738
+ pt: ModelFormatEntrySchema.optional()
6739
+ });
6740
+ var ModelCatalogEntrySchema = object({
6741
+ id: string(),
6742
+ name: string(),
6743
+ description: string(),
6744
+ formats: ModelFormatsSchema,
6745
+ inputSize: object({
6746
+ width: number(),
6747
+ height: number()
6748
+ }),
6749
+ labels: array(LabelDefinitionSchema).readonly(),
6750
+ inputLayout: _enum(["nchw", "nhwc"]).optional(),
6751
+ inputNormalization: _enum([
6752
+ "zero-one",
6753
+ "imagenet",
6754
+ "none"
6755
+ ]).optional(),
6756
+ preprocessMode: _enum(["letterbox", "resize"]).optional(),
6757
+ /**
6758
+ * When true, the executor produces a landmark-aligned crop (similarity warp
6759
+ * onto the canonical template) before this step runs, instead of a plain
6760
+ * axis-aligned bbox crop. Required for face-recognition embedders (ArcFace):
6761
+ * their embeddings are only discriminative on an aligned input. The face
6762
+ * detector that produced the parent detail must emit 5 landmarks.
6763
+ */
6764
+ faceAlignment: boolean().optional(),
6765
+ /**
6766
+ * Auxiliary files required at runtime (labels JSON, charset dict, etc.).
6767
+ * Downloaded into the same modelsDir alongside the model file.
6768
+ */
6769
+ extraFiles: array(ModelExtraFileSchema).readonly().optional()
6770
+ });
6771
+ var ConvertTargetSchema = discriminatedUnion("format", [object({
6772
+ format: literal("openvino"),
6773
+ precisions: array(_enum(["fp16", "int8"])).min(1).readonly()
6774
+ }), object({ format: literal("coreml") })]);
6775
+ var ModelConvertMetadataSchema = object({
6776
+ id: string().regex(/^[a-zA-Z0-9._-]+$/),
6777
+ name: string(),
6778
+ labels: array(LabelDefinitionSchema).readonly(),
6779
+ inputSize: object({
6780
+ width: number(),
6781
+ height: number()
6782
+ }),
6783
+ inputLayout: _enum(["nchw", "nhwc"]).optional(),
6784
+ inputNormalization: _enum([
6785
+ "zero-one",
6786
+ "imagenet",
6787
+ "none"
6788
+ ]).optional(),
6789
+ preprocessMode: _enum(["letterbox", "resize"]).optional(),
6790
+ outputFormat: _enum([
6791
+ "yolo",
6792
+ "ssd",
6793
+ "embedding",
6794
+ "classification",
6795
+ "ocr",
6796
+ "segmentation"
6797
+ ]),
6798
+ faceAlignment: boolean().optional()
6799
+ });
6800
+ var ConvertResultSchema = object({
6801
+ entry: ModelCatalogEntrySchema,
6802
+ artifacts: array(object({
6803
+ format: _enum(MODEL_FORMATS),
6804
+ precision: _enum(["fp16", "int8"]).optional(),
6805
+ sizeMB: number(),
6806
+ validated: boolean(),
6807
+ files: array(string()).readonly()
6808
+ })).readonly()
6809
+ });
6810
+ /**
6684
6811
  * Numeric day-of-week: 0 = Sunday … 6 = Saturday (matches `Date.getDay`).
6685
6812
  * Named `RecordingWeekday` to avoid collision with the string-union
6686
6813
  * `Weekday` exported from `interfaces/timezones.ts`.
@@ -12587,6 +12714,54 @@ var EnrichedWidgetMetadataSchema = WidgetMetadataSchema.extend({
12587
12714
  bundleUrl: string()
12588
12715
  });
12589
12716
  method(_void(), array(EnrichedWidgetMetadataSchema).readonly());
12717
+ /**
12718
+ * `custom-model-registry` — collection cap exposing operator-registered
12719
+ * custom detection models. Each provider (today: `addon-model-studio`)
12720
+ * contributes a list of `CustomModelDescriptor`s; the hub auto-concatenates
12721
+ * them across providers (`concatCollection`).
12722
+ *
12723
+ * The detection-pipeline is *aware* of this cap: when at least one provider
12724
+ * exists it unions these descriptors into the per-step model picker and the
12725
+ * runtime model-resolution path, alongside the static catalog. When no
12726
+ * provider exists the consumer no-ops entirely (identical to the catalog-only
12727
+ * behaviour).
12728
+ *
12729
+ * A descriptor carries a full `ModelCatalogEntry` directly — the same shape
12730
+ * the static catalog uses — so the existing download/resolution code consumes
12731
+ * it unchanged. `stepId` is the detection step the model targets
12732
+ * (e.g. `'object-detection'`).
12733
+ */
12734
+ var CustomModelDescriptorSchema = object({
12735
+ stepId: string(),
12736
+ entry: ModelCatalogEntrySchema
12737
+ });
12738
+ method(_void(), array(CustomModelDescriptorSchema).readonly());
12739
+ method(object({
12740
+ nodeId: string(),
12741
+ modelId: string(),
12742
+ format: _enum(MODEL_FORMATS),
12743
+ entry: ModelCatalogEntrySchema
12744
+ }), object({
12745
+ ok: boolean(),
12746
+ /** sha256 of the staged tarball (empty for a hub-local no-op). */
12747
+ sha256: string(),
12748
+ bytes: number(),
12749
+ /** The target node's modelsDir the artifact landed in. */
12750
+ path: string()
12751
+ }), {
12752
+ kind: "mutation",
12753
+ auth: "admin"
12754
+ });
12755
+ method(object({
12756
+ sourceUrl: string(),
12757
+ metadata: ModelConvertMetadataSchema,
12758
+ targets: array(ConvertTargetSchema).min(1).readonly(),
12759
+ calibrationRef: string().optional(),
12760
+ sessionId: string().optional()
12761
+ }), ConvertResultSchema, {
12762
+ kind: "mutation",
12763
+ auth: "admin"
12764
+ });
12590
12765
  var AddonHttpRouteSchema = object({
12591
12766
  method: _enum([
12592
12767
  "GET",
@@ -17481,6 +17656,12 @@ Object.freeze({
17481
17656
  addonId: null,
17482
17657
  access: "create"
17483
17658
  },
17659
+ "customModelRegistry.listModels": {
17660
+ capName: "custom-model-registry",
17661
+ capScope: "system",
17662
+ addonId: null,
17663
+ access: "view"
17664
+ },
17484
17665
  "decoder.createSession": {
17485
17666
  capName: "decoder",
17486
17667
  capScope: "system",
@@ -18705,6 +18886,18 @@ Object.freeze({
18705
18886
  addonId: null,
18706
18887
  access: "view"
18707
18888
  },
18889
+ "modelConvert.convert": {
18890
+ capName: "model-convert",
18891
+ capScope: "system",
18892
+ addonId: null,
18893
+ access: "create"
18894
+ },
18895
+ "modelDistributor.distributeModel": {
18896
+ capName: "model-distributor",
18897
+ capScope: "system",
18898
+ addonId: null,
18899
+ access: "create"
18900
+ },
18708
18901
  "motion.isDetected": {
18709
18902
  capName: "motion",
18710
18903
  capScope: "device",
@@ -4668,7 +4668,7 @@ function _instanceof(cls, params = {}) {
4668
4668
  return inst;
4669
4669
  }
4670
4670
  //#endregion
4671
- //#region ../types/dist/sleep-B1dKJAMJ.mjs
4671
+ //#region ../types/dist/sleep-BV7rLc6Y.mjs
4672
4672
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4673
4673
  EventCategory["SystemBoot"] = "system.boot";
4674
4674
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -5147,6 +5147,12 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5147
5147
  * Payload: `{ deviceId, childDeviceIds, hiddenChildIds }`.
5148
5148
  */
5149
5149
  EventCategory["AccessoriesChanged"] = "accessories.onAccessoriesChanged";
5150
+ /**
5151
+ * Progress update from a running model conversion job.
5152
+ * Payload: `{ kind: 'model-convert', phase, sessionId?, pct?, detail? }`.
5153
+ * Emitted by `addon-model-studio` on the converting node.
5154
+ */
5155
+ EventCategory["ModelConvertProgress"] = "model-convert.progress";
5150
5156
  return EventCategory;
5151
5157
  }({});
5152
5158
  Object.fromEntries([
@@ -6668,6 +6674,13 @@ object({
6668
6674
  unreachable: number()
6669
6675
  })
6670
6676
  });
6677
+ var LabelDefinitionSchema = object({
6678
+ id: string(),
6679
+ name: string(),
6680
+ category: string().optional(),
6681
+ description: string().optional(),
6682
+ icon: string().optional()
6683
+ });
6671
6684
  var MODEL_FORMATS = [
6672
6685
  "onnx",
6673
6686
  "coreml",
@@ -6676,6 +6689,120 @@ var MODEL_FORMATS = [
6676
6689
  "pt"
6677
6690
  ];
6678
6691
  /**
6692
+ * Multi-file format payload.
6693
+ *
6694
+ * - Directory formats (`isDirectory: true`, e.g. `.mlpackage`): files
6695
+ * relative to the directory root — the downloader fetches each from
6696
+ * `{url}/{file}` into `{modelDir}/{file}`. If omitted, it probes the
6697
+ * HuggingFace API (slower).
6698
+ * - Single-file formats (no `isDirectory`, e.g. OpenVINO IR): sibling
6699
+ * files fetched from the SAME remote directory as `url` and stored flat
6700
+ * alongside the main file — e.g. `['camstack-yolov9t.bin']` for the IR
6701
+ * weights next to `camstack-yolov9t.xml`.
6702
+ */
6703
+ var ModelFormatEntrySchema = object({
6704
+ url: string(),
6705
+ sizeMB: number(),
6706
+ /** Whether this format is a directory bundle (e.g., .mlpackage) rather than a single file */
6707
+ isDirectory: boolean().optional(),
6708
+ /** Multi-file payload (directory members or sibling files). */
6709
+ files: array(string()).readonly().optional(),
6710
+ /** Runtime(s) that can use this format. If omitted, inferred from ModelFormat key */
6711
+ runtimes: array(_enum(["node", "python"])).readonly().optional()
6712
+ });
6713
+ /**
6714
+ * Extra file that must be downloaded alongside the model (e.g., labels JSON, dict.txt).
6715
+ * The downloader fetches from `url` and saves to `{modelsDir}/{filename}`.
6716
+ */
6717
+ var ModelExtraFileSchema = object({
6718
+ url: string(),
6719
+ filename: string(),
6720
+ sizeMB: number()
6721
+ });
6722
+ /**
6723
+ * Per-format payload map. Modelled as an explicit object (one optional key
6724
+ * per `ModelFormat`) rather than `z.record(enum, …)` — zod v4's enum-keyed
6725
+ * record requires every key, but a catalog entry only ships a subset of
6726
+ * formats.
6727
+ */
6728
+ var ModelFormatsSchema = object({
6729
+ onnx: ModelFormatEntrySchema.optional(),
6730
+ coreml: ModelFormatEntrySchema.optional(),
6731
+ openvino: ModelFormatEntrySchema.optional(),
6732
+ tflite: ModelFormatEntrySchema.optional(),
6733
+ pt: ModelFormatEntrySchema.optional()
6734
+ });
6735
+ var ModelCatalogEntrySchema = object({
6736
+ id: string(),
6737
+ name: string(),
6738
+ description: string(),
6739
+ formats: ModelFormatsSchema,
6740
+ inputSize: object({
6741
+ width: number(),
6742
+ height: number()
6743
+ }),
6744
+ labels: array(LabelDefinitionSchema).readonly(),
6745
+ inputLayout: _enum(["nchw", "nhwc"]).optional(),
6746
+ inputNormalization: _enum([
6747
+ "zero-one",
6748
+ "imagenet",
6749
+ "none"
6750
+ ]).optional(),
6751
+ preprocessMode: _enum(["letterbox", "resize"]).optional(),
6752
+ /**
6753
+ * When true, the executor produces a landmark-aligned crop (similarity warp
6754
+ * onto the canonical template) before this step runs, instead of a plain
6755
+ * axis-aligned bbox crop. Required for face-recognition embedders (ArcFace):
6756
+ * their embeddings are only discriminative on an aligned input. The face
6757
+ * detector that produced the parent detail must emit 5 landmarks.
6758
+ */
6759
+ faceAlignment: boolean().optional(),
6760
+ /**
6761
+ * Auxiliary files required at runtime (labels JSON, charset dict, etc.).
6762
+ * Downloaded into the same modelsDir alongside the model file.
6763
+ */
6764
+ extraFiles: array(ModelExtraFileSchema).readonly().optional()
6765
+ });
6766
+ var ConvertTargetSchema = discriminatedUnion("format", [object({
6767
+ format: literal("openvino"),
6768
+ precisions: array(_enum(["fp16", "int8"])).min(1).readonly()
6769
+ }), object({ format: literal("coreml") })]);
6770
+ var ModelConvertMetadataSchema = object({
6771
+ id: string().regex(/^[a-zA-Z0-9._-]+$/),
6772
+ name: string(),
6773
+ labels: array(LabelDefinitionSchema).readonly(),
6774
+ inputSize: object({
6775
+ width: number(),
6776
+ height: number()
6777
+ }),
6778
+ inputLayout: _enum(["nchw", "nhwc"]).optional(),
6779
+ inputNormalization: _enum([
6780
+ "zero-one",
6781
+ "imagenet",
6782
+ "none"
6783
+ ]).optional(),
6784
+ preprocessMode: _enum(["letterbox", "resize"]).optional(),
6785
+ outputFormat: _enum([
6786
+ "yolo",
6787
+ "ssd",
6788
+ "embedding",
6789
+ "classification",
6790
+ "ocr",
6791
+ "segmentation"
6792
+ ]),
6793
+ faceAlignment: boolean().optional()
6794
+ });
6795
+ var ConvertResultSchema = object({
6796
+ entry: ModelCatalogEntrySchema,
6797
+ artifacts: array(object({
6798
+ format: _enum(MODEL_FORMATS),
6799
+ precision: _enum(["fp16", "int8"]).optional(),
6800
+ sizeMB: number(),
6801
+ validated: boolean(),
6802
+ files: array(string()).readonly()
6803
+ })).readonly()
6804
+ });
6805
+ /**
6679
6806
  * Numeric day-of-week: 0 = Sunday … 6 = Saturday (matches `Date.getDay`).
6680
6807
  * Named `RecordingWeekday` to avoid collision with the string-union
6681
6808
  * `Weekday` exported from `interfaces/timezones.ts`.
@@ -12582,6 +12709,54 @@ var EnrichedWidgetMetadataSchema = WidgetMetadataSchema.extend({
12582
12709
  bundleUrl: string()
12583
12710
  });
12584
12711
  method(_void(), array(EnrichedWidgetMetadataSchema).readonly());
12712
+ /**
12713
+ * `custom-model-registry` — collection cap exposing operator-registered
12714
+ * custom detection models. Each provider (today: `addon-model-studio`)
12715
+ * contributes a list of `CustomModelDescriptor`s; the hub auto-concatenates
12716
+ * them across providers (`concatCollection`).
12717
+ *
12718
+ * The detection-pipeline is *aware* of this cap: when at least one provider
12719
+ * exists it unions these descriptors into the per-step model picker and the
12720
+ * runtime model-resolution path, alongside the static catalog. When no
12721
+ * provider exists the consumer no-ops entirely (identical to the catalog-only
12722
+ * behaviour).
12723
+ *
12724
+ * A descriptor carries a full `ModelCatalogEntry` directly — the same shape
12725
+ * the static catalog uses — so the existing download/resolution code consumes
12726
+ * it unchanged. `stepId` is the detection step the model targets
12727
+ * (e.g. `'object-detection'`).
12728
+ */
12729
+ var CustomModelDescriptorSchema = object({
12730
+ stepId: string(),
12731
+ entry: ModelCatalogEntrySchema
12732
+ });
12733
+ method(_void(), array(CustomModelDescriptorSchema).readonly());
12734
+ method(object({
12735
+ nodeId: string(),
12736
+ modelId: string(),
12737
+ format: _enum(MODEL_FORMATS),
12738
+ entry: ModelCatalogEntrySchema
12739
+ }), object({
12740
+ ok: boolean(),
12741
+ /** sha256 of the staged tarball (empty for a hub-local no-op). */
12742
+ sha256: string(),
12743
+ bytes: number(),
12744
+ /** The target node's modelsDir the artifact landed in. */
12745
+ path: string()
12746
+ }), {
12747
+ kind: "mutation",
12748
+ auth: "admin"
12749
+ });
12750
+ method(object({
12751
+ sourceUrl: string(),
12752
+ metadata: ModelConvertMetadataSchema,
12753
+ targets: array(ConvertTargetSchema).min(1).readonly(),
12754
+ calibrationRef: string().optional(),
12755
+ sessionId: string().optional()
12756
+ }), ConvertResultSchema, {
12757
+ kind: "mutation",
12758
+ auth: "admin"
12759
+ });
12585
12760
  var AddonHttpRouteSchema = object({
12586
12761
  method: _enum([
12587
12762
  "GET",
@@ -17476,6 +17651,12 @@ Object.freeze({
17476
17651
  addonId: null,
17477
17652
  access: "create"
17478
17653
  },
17654
+ "customModelRegistry.listModels": {
17655
+ capName: "custom-model-registry",
17656
+ capScope: "system",
17657
+ addonId: null,
17658
+ access: "view"
17659
+ },
17479
17660
  "decoder.createSession": {
17480
17661
  capName: "decoder",
17481
17662
  capScope: "system",
@@ -18700,6 +18881,18 @@ Object.freeze({
18700
18881
  addonId: null,
18701
18882
  access: "view"
18702
18883
  },
18884
+ "modelConvert.convert": {
18885
+ capName: "model-convert",
18886
+ capScope: "system",
18887
+ addonId: null,
18888
+ access: "create"
18889
+ },
18890
+ "modelDistributor.distributeModel": {
18891
+ capName: "model-distributor",
18892
+ capScope: "system",
18893
+ addonId: null,
18894
+ access: "create"
18895
+ },
18703
18896
  "motion.isDetected": {
18704
18897
  capName: "motion",
18705
18898
  capScope: "device",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-mqtt-broker",
3
- "version": "1.0.7",
3
+ "version": "1.1.1",
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",