@camstack/addon-provider-onvif 1.1.3 → 1.1.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
@@ -4631,7 +4631,7 @@ function _instanceof(cls, params = {}) {
4631
4631
  return inst;
4632
4632
  }
4633
4633
  //#endregion
4634
- //#region ../types/dist/sleep-BV7rLc6Y.mjs
4634
+ //#region ../types/dist/sleep-NOH4yRwj.mjs
4635
4635
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4636
4636
  EventCategory["SystemBoot"] = "system.boot";
4637
4637
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -5746,15 +5746,24 @@ var BaseAddon = class {
5746
5746
  } catch {}
5747
5747
  }
5748
5748
  /**
5749
- * Resolve the shared models directory path via the storage capability.
5750
- * Falls back to `camstack-data/models` if storage is unavailable.
5751
- * Used by inference addons (detection-pipeline, audio-classifier, embedding-encoder).
5749
+ * Resolve the shared, node-local models directory: `<nodeDataDir>/models`.
5750
+ *
5751
+ * This is the SINGLE centralized models-dir resolver for every inference addon
5752
+ * (detection-pipeline, audio-analyzer, embedding-encoder, model-studio). It is
5753
+ * anchored at the node's own writable data root (`ctx.nodeDataDir`, i.e.
5754
+ * `CAMSTACK_DATA` ?? the kernel boot dir) — never the hub-singleton `storage`
5755
+ * cap, which returns the hub's `/data/models` to every node and breaks any node
5756
+ * whose real data dir differs (e.g. the macOS electron agent).
5757
+ *
5758
+ * `node:path`/`node:fs` are imported dynamically so the `@camstack/types` root
5759
+ * barrel (re-exported into browser bundles) stays free of node builtins.
5752
5760
  */
5753
5761
  async resolveModelsDir() {
5754
- return this.ctx.api.storage.resolve.query({
5755
- location: "models",
5756
- relativePath: ""
5757
- }).catch(() => "camstack-data/models");
5762
+ const { join } = await import("node:path");
5763
+ const { promises: fsp } = await import("node:fs");
5764
+ const dir = join(this.ctx.nodeDataDir, "models");
5765
+ await fsp.mkdir(dir, { recursive: true });
5766
+ return dir;
5758
5767
  }
5759
5768
  /**
5760
5769
  * Access the runtime capability registry for in-process provider lookups.
@@ -13026,7 +13035,8 @@ method(object({
13026
13035
  sessionId: string().optional()
13027
13036
  }), ConvertResultSchema, {
13028
13037
  kind: "mutation",
13029
- auth: "admin"
13038
+ auth: "admin",
13039
+ timeoutMs: 6e5
13030
13040
  });
13031
13041
  var AddonHttpRouteSchema = object({
13032
13042
  method: _enum([
@@ -14605,7 +14615,14 @@ var NotificationRuleConditionsSchema = object({
14605
14615
  /** Match against `event.data.eventType` token (e.g. `'press_long'`). When non-empty, only events
14606
14616
  * carrying a matching `data.eventType` string pass this condition. Rules without this field are
14607
14617
  * unaffected (back-compat). Distinct from `rule.eventTypes` which holds EventCategory strings. */
14608
- eventTypeTokens: array(string()).readonly().optional()
14618
+ eventTypeTokens: array(string()).readonly().optional(),
14619
+ /** Match detections whose CLIP image embedding is semantically similar to this free-text
14620
+ * description. Requires the embedding-encoder cap to have pre-warmed the text vector.
14621
+ * `minSimilarity` is the cosine similarity threshold in [0, 1]. */
14622
+ clipDescription: object({
14623
+ text: string().min(1),
14624
+ minSimilarity: number().min(0).max(1)
14625
+ }).optional()
14609
14626
  });
14610
14627
  var NotificationRuleTemplateSchema = object({
14611
14628
  title: string(),
@@ -14847,6 +14864,16 @@ var TrackedDetectionSchema = object({
14847
14864
  zones: array(string()).readonly(),
14848
14865
  state: TrackStateSchema
14849
14866
  });
14867
+ var ScoredObjectEventSchema = ObjectEventSchema.extend({ score: number() });
14868
+ var SearchObjectEventsInput = object({
14869
+ text: string(),
14870
+ deviceId: number().optional(),
14871
+ since: number().optional(),
14872
+ until: number().optional(),
14873
+ classFilter: string().optional(),
14874
+ limit: number().default(50),
14875
+ minScore: number().min(0).max(1).default(.2)
14876
+ });
14850
14877
  DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
14851
14878
  deviceId: number(),
14852
14879
  trackId: string()
@@ -14881,7 +14908,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
14881
14908
  }), method(object({
14882
14909
  eventId: string(),
14883
14910
  kind: MediaFileKindEnum.optional()
14884
- }), array(MediaFileSchema).readonly()), method(object({ trackId: string() }), array(MediaFileSchema).readonly()), object({
14911
+ }), array(MediaFileSchema).readonly()), method(object({ trackId: string() }), array(MediaFileSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), object({
14885
14912
  deviceId: number(),
14886
14913
  timestamp: number(),
14887
14914
  frameWidth: number(),
@@ -19573,6 +19600,12 @@ Object.freeze({
19573
19600
  addonId: null,
19574
19601
  access: "create"
19575
19602
  },
19603
+ "pipelineAnalytics.searchObjectEvents": {
19604
+ capName: "pipeline-analytics",
19605
+ capScope: "device",
19606
+ addonId: null,
19607
+ access: "view"
19608
+ },
19576
19609
  "pipelineExecutor.cacheFrameInPool": {
19577
19610
  capName: "pipeline-executor",
19578
19611
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -4632,7 +4632,7 @@ function _instanceof(cls, params = {}) {
4632
4632
  return inst;
4633
4633
  }
4634
4634
  //#endregion
4635
- //#region ../types/dist/sleep-BV7rLc6Y.mjs
4635
+ //#region ../types/dist/sleep-NOH4yRwj.mjs
4636
4636
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4637
4637
  EventCategory["SystemBoot"] = "system.boot";
4638
4638
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -5747,15 +5747,24 @@ var BaseAddon = class {
5747
5747
  } catch {}
5748
5748
  }
5749
5749
  /**
5750
- * Resolve the shared models directory path via the storage capability.
5751
- * Falls back to `camstack-data/models` if storage is unavailable.
5752
- * Used by inference addons (detection-pipeline, audio-classifier, embedding-encoder).
5750
+ * Resolve the shared, node-local models directory: `<nodeDataDir>/models`.
5751
+ *
5752
+ * This is the SINGLE centralized models-dir resolver for every inference addon
5753
+ * (detection-pipeline, audio-analyzer, embedding-encoder, model-studio). It is
5754
+ * anchored at the node's own writable data root (`ctx.nodeDataDir`, i.e.
5755
+ * `CAMSTACK_DATA` ?? the kernel boot dir) — never the hub-singleton `storage`
5756
+ * cap, which returns the hub's `/data/models` to every node and breaks any node
5757
+ * whose real data dir differs (e.g. the macOS electron agent).
5758
+ *
5759
+ * `node:path`/`node:fs` are imported dynamically so the `@camstack/types` root
5760
+ * barrel (re-exported into browser bundles) stays free of node builtins.
5753
5761
  */
5754
5762
  async resolveModelsDir() {
5755
- return this.ctx.api.storage.resolve.query({
5756
- location: "models",
5757
- relativePath: ""
5758
- }).catch(() => "camstack-data/models");
5763
+ const { join } = await import("node:path");
5764
+ const { promises: fsp } = await import("node:fs");
5765
+ const dir = join(this.ctx.nodeDataDir, "models");
5766
+ await fsp.mkdir(dir, { recursive: true });
5767
+ return dir;
5759
5768
  }
5760
5769
  /**
5761
5770
  * Access the runtime capability registry for in-process provider lookups.
@@ -13027,7 +13036,8 @@ method(object({
13027
13036
  sessionId: string().optional()
13028
13037
  }), ConvertResultSchema, {
13029
13038
  kind: "mutation",
13030
- auth: "admin"
13039
+ auth: "admin",
13040
+ timeoutMs: 6e5
13031
13041
  });
13032
13042
  var AddonHttpRouteSchema = object({
13033
13043
  method: _enum([
@@ -14606,7 +14616,14 @@ var NotificationRuleConditionsSchema = object({
14606
14616
  /** Match against `event.data.eventType` token (e.g. `'press_long'`). When non-empty, only events
14607
14617
  * carrying a matching `data.eventType` string pass this condition. Rules without this field are
14608
14618
  * unaffected (back-compat). Distinct from `rule.eventTypes` which holds EventCategory strings. */
14609
- eventTypeTokens: array(string()).readonly().optional()
14619
+ eventTypeTokens: array(string()).readonly().optional(),
14620
+ /** Match detections whose CLIP image embedding is semantically similar to this free-text
14621
+ * description. Requires the embedding-encoder cap to have pre-warmed the text vector.
14622
+ * `minSimilarity` is the cosine similarity threshold in [0, 1]. */
14623
+ clipDescription: object({
14624
+ text: string().min(1),
14625
+ minSimilarity: number().min(0).max(1)
14626
+ }).optional()
14610
14627
  });
14611
14628
  var NotificationRuleTemplateSchema = object({
14612
14629
  title: string(),
@@ -14848,6 +14865,16 @@ var TrackedDetectionSchema = object({
14848
14865
  zones: array(string()).readonly(),
14849
14866
  state: TrackStateSchema
14850
14867
  });
14868
+ var ScoredObjectEventSchema = ObjectEventSchema.extend({ score: number() });
14869
+ var SearchObjectEventsInput = object({
14870
+ text: string(),
14871
+ deviceId: number().optional(),
14872
+ since: number().optional(),
14873
+ until: number().optional(),
14874
+ classFilter: string().optional(),
14875
+ limit: number().default(50),
14876
+ minScore: number().min(0).max(1).default(.2)
14877
+ });
14851
14878
  DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
14852
14879
  deviceId: number(),
14853
14880
  trackId: string()
@@ -14882,7 +14909,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
14882
14909
  }), method(object({
14883
14910
  eventId: string(),
14884
14911
  kind: MediaFileKindEnum.optional()
14885
- }), array(MediaFileSchema).readonly()), method(object({ trackId: string() }), array(MediaFileSchema).readonly()), object({
14912
+ }), array(MediaFileSchema).readonly()), method(object({ trackId: string() }), array(MediaFileSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), object({
14886
14913
  deviceId: number(),
14887
14914
  timestamp: number(),
14888
14915
  frameWidth: number(),
@@ -19574,6 +19601,12 @@ Object.freeze({
19574
19601
  addonId: null,
19575
19602
  access: "create"
19576
19603
  },
19604
+ "pipelineAnalytics.searchObjectEvents": {
19605
+ capName: "pipeline-analytics",
19606
+ capScope: "device",
19607
+ addonId: null,
19608
+ access: "view"
19609
+ },
19577
19610
  "pipelineExecutor.cacheFrameInPool": {
19578
19611
  capName: "pipeline-executor",
19579
19612
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-onvif",
3
- "version": "1.1.3",
3
+ "version": "1.1.5",
4
4
  "description": "ONVIF camera device provider addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",