@camstack/addon-provider-hikvision 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.
package/dist/addon.js CHANGED
@@ -4631,7 +4631,7 @@ function _instanceof(cls, params = {}) {
4631
4631
  return inst;
4632
4632
  }
4633
4633
  //#endregion
4634
- //#region ../types/dist/sleep-B1dKJAMJ.mjs
4634
+ //#region ../types/dist/sleep-BV7rLc6Y.mjs
4635
4635
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4636
4636
  EventCategory["SystemBoot"] = "system.boot";
4637
4637
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -5110,6 +5110,12 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5110
5110
  * Payload: `{ deviceId, childDeviceIds, hiddenChildIds }`.
5111
5111
  */
5112
5112
  EventCategory["AccessoriesChanged"] = "accessories.onAccessoriesChanged";
5113
+ /**
5114
+ * Progress update from a running model conversion job.
5115
+ * Payload: `{ kind: 'model-convert', phase, sessionId?, pct?, detail? }`.
5116
+ * Emitted by `addon-model-studio` on the converting node.
5117
+ */
5118
+ EventCategory["ModelConvertProgress"] = "model-convert.progress";
5113
5119
  return EventCategory;
5114
5120
  }({});
5115
5121
  Object.fromEntries([
@@ -6635,6 +6641,13 @@ object({
6635
6641
  unreachable: number()
6636
6642
  })
6637
6643
  });
6644
+ var LabelDefinitionSchema = object({
6645
+ id: string(),
6646
+ name: string(),
6647
+ category: string().optional(),
6648
+ description: string().optional(),
6649
+ icon: string().optional()
6650
+ });
6638
6651
  var MODEL_FORMATS = [
6639
6652
  "onnx",
6640
6653
  "coreml",
@@ -6642,6 +6655,120 @@ var MODEL_FORMATS = [
6642
6655
  "tflite",
6643
6656
  "pt"
6644
6657
  ];
6658
+ /**
6659
+ * Multi-file format payload.
6660
+ *
6661
+ * - Directory formats (`isDirectory: true`, e.g. `.mlpackage`): files
6662
+ * relative to the directory root — the downloader fetches each from
6663
+ * `{url}/{file}` into `{modelDir}/{file}`. If omitted, it probes the
6664
+ * HuggingFace API (slower).
6665
+ * - Single-file formats (no `isDirectory`, e.g. OpenVINO IR): sibling
6666
+ * files fetched from the SAME remote directory as `url` and stored flat
6667
+ * alongside the main file — e.g. `['camstack-yolov9t.bin']` for the IR
6668
+ * weights next to `camstack-yolov9t.xml`.
6669
+ */
6670
+ var ModelFormatEntrySchema = object({
6671
+ url: string(),
6672
+ sizeMB: number(),
6673
+ /** Whether this format is a directory bundle (e.g., .mlpackage) rather than a single file */
6674
+ isDirectory: boolean().optional(),
6675
+ /** Multi-file payload (directory members or sibling files). */
6676
+ files: array(string()).readonly().optional(),
6677
+ /** Runtime(s) that can use this format. If omitted, inferred from ModelFormat key */
6678
+ runtimes: array(_enum(["node", "python"])).readonly().optional()
6679
+ });
6680
+ /**
6681
+ * Extra file that must be downloaded alongside the model (e.g., labels JSON, dict.txt).
6682
+ * The downloader fetches from `url` and saves to `{modelsDir}/{filename}`.
6683
+ */
6684
+ var ModelExtraFileSchema = object({
6685
+ url: string(),
6686
+ filename: string(),
6687
+ sizeMB: number()
6688
+ });
6689
+ /**
6690
+ * Per-format payload map. Modelled as an explicit object (one optional key
6691
+ * per `ModelFormat`) rather than `z.record(enum, …)` — zod v4's enum-keyed
6692
+ * record requires every key, but a catalog entry only ships a subset of
6693
+ * formats.
6694
+ */
6695
+ var ModelFormatsSchema = object({
6696
+ onnx: ModelFormatEntrySchema.optional(),
6697
+ coreml: ModelFormatEntrySchema.optional(),
6698
+ openvino: ModelFormatEntrySchema.optional(),
6699
+ tflite: ModelFormatEntrySchema.optional(),
6700
+ pt: ModelFormatEntrySchema.optional()
6701
+ });
6702
+ var ModelCatalogEntrySchema = object({
6703
+ id: string(),
6704
+ name: string(),
6705
+ description: string(),
6706
+ formats: ModelFormatsSchema,
6707
+ inputSize: object({
6708
+ width: number(),
6709
+ height: number()
6710
+ }),
6711
+ labels: array(LabelDefinitionSchema).readonly(),
6712
+ inputLayout: _enum(["nchw", "nhwc"]).optional(),
6713
+ inputNormalization: _enum([
6714
+ "zero-one",
6715
+ "imagenet",
6716
+ "none"
6717
+ ]).optional(),
6718
+ preprocessMode: _enum(["letterbox", "resize"]).optional(),
6719
+ /**
6720
+ * When true, the executor produces a landmark-aligned crop (similarity warp
6721
+ * onto the canonical template) before this step runs, instead of a plain
6722
+ * axis-aligned bbox crop. Required for face-recognition embedders (ArcFace):
6723
+ * their embeddings are only discriminative on an aligned input. The face
6724
+ * detector that produced the parent detail must emit 5 landmarks.
6725
+ */
6726
+ faceAlignment: boolean().optional(),
6727
+ /**
6728
+ * Auxiliary files required at runtime (labels JSON, charset dict, etc.).
6729
+ * Downloaded into the same modelsDir alongside the model file.
6730
+ */
6731
+ extraFiles: array(ModelExtraFileSchema).readonly().optional()
6732
+ });
6733
+ var ConvertTargetSchema = discriminatedUnion("format", [object({
6734
+ format: literal("openvino"),
6735
+ precisions: array(_enum(["fp16", "int8"])).min(1).readonly()
6736
+ }), object({ format: literal("coreml") })]);
6737
+ var ModelConvertMetadataSchema = object({
6738
+ id: string().regex(/^[a-zA-Z0-9._-]+$/),
6739
+ name: string(),
6740
+ labels: array(LabelDefinitionSchema).readonly(),
6741
+ inputSize: object({
6742
+ width: number(),
6743
+ height: number()
6744
+ }),
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
+ outputFormat: _enum([
6753
+ "yolo",
6754
+ "ssd",
6755
+ "embedding",
6756
+ "classification",
6757
+ "ocr",
6758
+ "segmentation"
6759
+ ]),
6760
+ faceAlignment: boolean().optional()
6761
+ });
6762
+ var ConvertResultSchema = object({
6763
+ entry: ModelCatalogEntrySchema,
6764
+ artifacts: array(object({
6765
+ format: _enum(MODEL_FORMATS),
6766
+ precision: _enum(["fp16", "int8"]).optional(),
6767
+ sizeMB: number(),
6768
+ validated: boolean(),
6769
+ files: array(string()).readonly()
6770
+ })).readonly()
6771
+ });
6645
6772
  var EU_DST = {
6646
6773
  offsetHours: 1,
6647
6774
  startMonth: 3,
@@ -15471,6 +15598,54 @@ var EnrichedWidgetMetadataSchema = WidgetMetadataSchema.extend({
15471
15598
  bundleUrl: string()
15472
15599
  });
15473
15600
  method(_void(), array(EnrichedWidgetMetadataSchema).readonly());
15601
+ /**
15602
+ * `custom-model-registry` — collection cap exposing operator-registered
15603
+ * custom detection models. Each provider (today: `addon-model-studio`)
15604
+ * contributes a list of `CustomModelDescriptor`s; the hub auto-concatenates
15605
+ * them across providers (`concatCollection`).
15606
+ *
15607
+ * The detection-pipeline is *aware* of this cap: when at least one provider
15608
+ * exists it unions these descriptors into the per-step model picker and the
15609
+ * runtime model-resolution path, alongside the static catalog. When no
15610
+ * provider exists the consumer no-ops entirely (identical to the catalog-only
15611
+ * behaviour).
15612
+ *
15613
+ * A descriptor carries a full `ModelCatalogEntry` directly — the same shape
15614
+ * the static catalog uses — so the existing download/resolution code consumes
15615
+ * it unchanged. `stepId` is the detection step the model targets
15616
+ * (e.g. `'object-detection'`).
15617
+ */
15618
+ var CustomModelDescriptorSchema = object({
15619
+ stepId: string(),
15620
+ entry: ModelCatalogEntrySchema
15621
+ });
15622
+ method(_void(), array(CustomModelDescriptorSchema).readonly());
15623
+ method(object({
15624
+ nodeId: string(),
15625
+ modelId: string(),
15626
+ format: _enum(MODEL_FORMATS),
15627
+ entry: ModelCatalogEntrySchema
15628
+ }), object({
15629
+ ok: boolean(),
15630
+ /** sha256 of the staged tarball (empty for a hub-local no-op). */
15631
+ sha256: string(),
15632
+ bytes: number(),
15633
+ /** The target node's modelsDir the artifact landed in. */
15634
+ path: string()
15635
+ }), {
15636
+ kind: "mutation",
15637
+ auth: "admin"
15638
+ });
15639
+ method(object({
15640
+ sourceUrl: string(),
15641
+ metadata: ModelConvertMetadataSchema,
15642
+ targets: array(ConvertTargetSchema).min(1).readonly(),
15643
+ calibrationRef: string().optional(),
15644
+ sessionId: string().optional()
15645
+ }), ConvertResultSchema, {
15646
+ kind: "mutation",
15647
+ auth: "admin"
15648
+ });
15474
15649
  var AddonHttpRouteSchema = object({
15475
15650
  method: _enum([
15476
15651
  "GET",
@@ -20783,6 +20958,12 @@ Object.freeze({
20783
20958
  addonId: null,
20784
20959
  access: "create"
20785
20960
  },
20961
+ "customModelRegistry.listModels": {
20962
+ capName: "custom-model-registry",
20963
+ capScope: "system",
20964
+ addonId: null,
20965
+ access: "view"
20966
+ },
20786
20967
  "decoder.createSession": {
20787
20968
  capName: "decoder",
20788
20969
  capScope: "system",
@@ -22007,6 +22188,18 @@ Object.freeze({
22007
22188
  addonId: null,
22008
22189
  access: "view"
22009
22190
  },
22191
+ "modelConvert.convert": {
22192
+ capName: "model-convert",
22193
+ capScope: "system",
22194
+ addonId: null,
22195
+ access: "create"
22196
+ },
22197
+ "modelDistributor.distributeModel": {
22198
+ capName: "model-distributor",
22199
+ capScope: "system",
22200
+ addonId: null,
22201
+ access: "create"
22202
+ },
22010
22203
  "motion.isDetected": {
22011
22204
  capName: "motion",
22012
22205
  capScope: "device",
package/dist/addon.mjs CHANGED
@@ -4630,7 +4630,7 @@ function _instanceof(cls, params = {}) {
4630
4630
  return inst;
4631
4631
  }
4632
4632
  //#endregion
4633
- //#region ../types/dist/sleep-B1dKJAMJ.mjs
4633
+ //#region ../types/dist/sleep-BV7rLc6Y.mjs
4634
4634
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4635
4635
  EventCategory["SystemBoot"] = "system.boot";
4636
4636
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -5109,6 +5109,12 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5109
5109
  * Payload: `{ deviceId, childDeviceIds, hiddenChildIds }`.
5110
5110
  */
5111
5111
  EventCategory["AccessoriesChanged"] = "accessories.onAccessoriesChanged";
5112
+ /**
5113
+ * Progress update from a running model conversion job.
5114
+ * Payload: `{ kind: 'model-convert', phase, sessionId?, pct?, detail? }`.
5115
+ * Emitted by `addon-model-studio` on the converting node.
5116
+ */
5117
+ EventCategory["ModelConvertProgress"] = "model-convert.progress";
5112
5118
  return EventCategory;
5113
5119
  }({});
5114
5120
  Object.fromEntries([
@@ -6634,6 +6640,13 @@ object({
6634
6640
  unreachable: number()
6635
6641
  })
6636
6642
  });
6643
+ var LabelDefinitionSchema = object({
6644
+ id: string(),
6645
+ name: string(),
6646
+ category: string().optional(),
6647
+ description: string().optional(),
6648
+ icon: string().optional()
6649
+ });
6637
6650
  var MODEL_FORMATS = [
6638
6651
  "onnx",
6639
6652
  "coreml",
@@ -6641,6 +6654,120 @@ var MODEL_FORMATS = [
6641
6654
  "tflite",
6642
6655
  "pt"
6643
6656
  ];
6657
+ /**
6658
+ * Multi-file format payload.
6659
+ *
6660
+ * - Directory formats (`isDirectory: true`, e.g. `.mlpackage`): files
6661
+ * relative to the directory root — the downloader fetches each from
6662
+ * `{url}/{file}` into `{modelDir}/{file}`. If omitted, it probes the
6663
+ * HuggingFace API (slower).
6664
+ * - Single-file formats (no `isDirectory`, e.g. OpenVINO IR): sibling
6665
+ * files fetched from the SAME remote directory as `url` and stored flat
6666
+ * alongside the main file — e.g. `['camstack-yolov9t.bin']` for the IR
6667
+ * weights next to `camstack-yolov9t.xml`.
6668
+ */
6669
+ var ModelFormatEntrySchema = object({
6670
+ url: string(),
6671
+ sizeMB: number(),
6672
+ /** Whether this format is a directory bundle (e.g., .mlpackage) rather than a single file */
6673
+ isDirectory: boolean().optional(),
6674
+ /** Multi-file payload (directory members or sibling files). */
6675
+ files: array(string()).readonly().optional(),
6676
+ /** Runtime(s) that can use this format. If omitted, inferred from ModelFormat key */
6677
+ runtimes: array(_enum(["node", "python"])).readonly().optional()
6678
+ });
6679
+ /**
6680
+ * Extra file that must be downloaded alongside the model (e.g., labels JSON, dict.txt).
6681
+ * The downloader fetches from `url` and saves to `{modelsDir}/{filename}`.
6682
+ */
6683
+ var ModelExtraFileSchema = object({
6684
+ url: string(),
6685
+ filename: string(),
6686
+ sizeMB: number()
6687
+ });
6688
+ /**
6689
+ * Per-format payload map. Modelled as an explicit object (one optional key
6690
+ * per `ModelFormat`) rather than `z.record(enum, …)` — zod v4's enum-keyed
6691
+ * record requires every key, but a catalog entry only ships a subset of
6692
+ * formats.
6693
+ */
6694
+ var ModelFormatsSchema = object({
6695
+ onnx: ModelFormatEntrySchema.optional(),
6696
+ coreml: ModelFormatEntrySchema.optional(),
6697
+ openvino: ModelFormatEntrySchema.optional(),
6698
+ tflite: ModelFormatEntrySchema.optional(),
6699
+ pt: ModelFormatEntrySchema.optional()
6700
+ });
6701
+ var ModelCatalogEntrySchema = object({
6702
+ id: string(),
6703
+ name: string(),
6704
+ description: string(),
6705
+ formats: ModelFormatsSchema,
6706
+ inputSize: object({
6707
+ width: number(),
6708
+ height: number()
6709
+ }),
6710
+ labels: array(LabelDefinitionSchema).readonly(),
6711
+ inputLayout: _enum(["nchw", "nhwc"]).optional(),
6712
+ inputNormalization: _enum([
6713
+ "zero-one",
6714
+ "imagenet",
6715
+ "none"
6716
+ ]).optional(),
6717
+ preprocessMode: _enum(["letterbox", "resize"]).optional(),
6718
+ /**
6719
+ * When true, the executor produces a landmark-aligned crop (similarity warp
6720
+ * onto the canonical template) before this step runs, instead of a plain
6721
+ * axis-aligned bbox crop. Required for face-recognition embedders (ArcFace):
6722
+ * their embeddings are only discriminative on an aligned input. The face
6723
+ * detector that produced the parent detail must emit 5 landmarks.
6724
+ */
6725
+ faceAlignment: boolean().optional(),
6726
+ /**
6727
+ * Auxiliary files required at runtime (labels JSON, charset dict, etc.).
6728
+ * Downloaded into the same modelsDir alongside the model file.
6729
+ */
6730
+ extraFiles: array(ModelExtraFileSchema).readonly().optional()
6731
+ });
6732
+ var ConvertTargetSchema = discriminatedUnion("format", [object({
6733
+ format: literal("openvino"),
6734
+ precisions: array(_enum(["fp16", "int8"])).min(1).readonly()
6735
+ }), object({ format: literal("coreml") })]);
6736
+ var ModelConvertMetadataSchema = object({
6737
+ id: string().regex(/^[a-zA-Z0-9._-]+$/),
6738
+ name: string(),
6739
+ labels: array(LabelDefinitionSchema).readonly(),
6740
+ inputSize: object({
6741
+ width: number(),
6742
+ height: number()
6743
+ }),
6744
+ inputLayout: _enum(["nchw", "nhwc"]).optional(),
6745
+ inputNormalization: _enum([
6746
+ "zero-one",
6747
+ "imagenet",
6748
+ "none"
6749
+ ]).optional(),
6750
+ preprocessMode: _enum(["letterbox", "resize"]).optional(),
6751
+ outputFormat: _enum([
6752
+ "yolo",
6753
+ "ssd",
6754
+ "embedding",
6755
+ "classification",
6756
+ "ocr",
6757
+ "segmentation"
6758
+ ]),
6759
+ faceAlignment: boolean().optional()
6760
+ });
6761
+ var ConvertResultSchema = object({
6762
+ entry: ModelCatalogEntrySchema,
6763
+ artifacts: array(object({
6764
+ format: _enum(MODEL_FORMATS),
6765
+ precision: _enum(["fp16", "int8"]).optional(),
6766
+ sizeMB: number(),
6767
+ validated: boolean(),
6768
+ files: array(string()).readonly()
6769
+ })).readonly()
6770
+ });
6644
6771
  var EU_DST = {
6645
6772
  offsetHours: 1,
6646
6773
  startMonth: 3,
@@ -15470,6 +15597,54 @@ var EnrichedWidgetMetadataSchema = WidgetMetadataSchema.extend({
15470
15597
  bundleUrl: string()
15471
15598
  });
15472
15599
  method(_void(), array(EnrichedWidgetMetadataSchema).readonly());
15600
+ /**
15601
+ * `custom-model-registry` — collection cap exposing operator-registered
15602
+ * custom detection models. Each provider (today: `addon-model-studio`)
15603
+ * contributes a list of `CustomModelDescriptor`s; the hub auto-concatenates
15604
+ * them across providers (`concatCollection`).
15605
+ *
15606
+ * The detection-pipeline is *aware* of this cap: when at least one provider
15607
+ * exists it unions these descriptors into the per-step model picker and the
15608
+ * runtime model-resolution path, alongside the static catalog. When no
15609
+ * provider exists the consumer no-ops entirely (identical to the catalog-only
15610
+ * behaviour).
15611
+ *
15612
+ * A descriptor carries a full `ModelCatalogEntry` directly — the same shape
15613
+ * the static catalog uses — so the existing download/resolution code consumes
15614
+ * it unchanged. `stepId` is the detection step the model targets
15615
+ * (e.g. `'object-detection'`).
15616
+ */
15617
+ var CustomModelDescriptorSchema = object({
15618
+ stepId: string(),
15619
+ entry: ModelCatalogEntrySchema
15620
+ });
15621
+ method(_void(), array(CustomModelDescriptorSchema).readonly());
15622
+ method(object({
15623
+ nodeId: string(),
15624
+ modelId: string(),
15625
+ format: _enum(MODEL_FORMATS),
15626
+ entry: ModelCatalogEntrySchema
15627
+ }), object({
15628
+ ok: boolean(),
15629
+ /** sha256 of the staged tarball (empty for a hub-local no-op). */
15630
+ sha256: string(),
15631
+ bytes: number(),
15632
+ /** The target node's modelsDir the artifact landed in. */
15633
+ path: string()
15634
+ }), {
15635
+ kind: "mutation",
15636
+ auth: "admin"
15637
+ });
15638
+ method(object({
15639
+ sourceUrl: string(),
15640
+ metadata: ModelConvertMetadataSchema,
15641
+ targets: array(ConvertTargetSchema).min(1).readonly(),
15642
+ calibrationRef: string().optional(),
15643
+ sessionId: string().optional()
15644
+ }), ConvertResultSchema, {
15645
+ kind: "mutation",
15646
+ auth: "admin"
15647
+ });
15473
15648
  var AddonHttpRouteSchema = object({
15474
15649
  method: _enum([
15475
15650
  "GET",
@@ -20782,6 +20957,12 @@ Object.freeze({
20782
20957
  addonId: null,
20783
20958
  access: "create"
20784
20959
  },
20960
+ "customModelRegistry.listModels": {
20961
+ capName: "custom-model-registry",
20962
+ capScope: "system",
20963
+ addonId: null,
20964
+ access: "view"
20965
+ },
20785
20966
  "decoder.createSession": {
20786
20967
  capName: "decoder",
20787
20968
  capScope: "system",
@@ -22006,6 +22187,18 @@ Object.freeze({
22006
22187
  addonId: null,
22007
22188
  access: "view"
22008
22189
  },
22190
+ "modelConvert.convert": {
22191
+ capName: "model-convert",
22192
+ capScope: "system",
22193
+ addonId: null,
22194
+ access: "create"
22195
+ },
22196
+ "modelDistributor.distributeModel": {
22197
+ capName: "model-distributor",
22198
+ capScope: "system",
22199
+ addonId: null,
22200
+ access: "create"
22201
+ },
22009
22202
  "motion.isDetected": {
22010
22203
  capName: "motion",
22011
22204
  capScope: "device",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-hikvision",
3
- "version": "1.0.7",
3
+ "version": "1.1.1",
4
4
  "description": "Hikvision camera device provider addon for CamStack — ISAPI over HTTP(S) with digest auth (snapshot, alarm stream, RTSP discovery)",
5
5
  "keywords": [
6
6
  "camstack",