@camstack/addon-provider-reolink 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
@@ -4655,7 +4655,7 @@ function _instanceof(cls, params = {}) {
4655
4655
  return inst;
4656
4656
  }
4657
4657
  //#endregion
4658
- //#region ../types/dist/sleep-BV7rLc6Y.mjs
4658
+ //#region ../types/dist/sleep-NOH4yRwj.mjs
4659
4659
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4660
4660
  EventCategory["SystemBoot"] = "system.boot";
4661
4661
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -5770,15 +5770,24 @@ var BaseAddon = class {
5770
5770
  } catch {}
5771
5771
  }
5772
5772
  /**
5773
- * Resolve the shared models directory path via the storage capability.
5774
- * Falls back to `camstack-data/models` if storage is unavailable.
5775
- * Used by inference addons (detection-pipeline, audio-classifier, embedding-encoder).
5773
+ * Resolve the shared, node-local models directory: `<nodeDataDir>/models`.
5774
+ *
5775
+ * This is the SINGLE centralized models-dir resolver for every inference addon
5776
+ * (detection-pipeline, audio-analyzer, embedding-encoder, model-studio). It is
5777
+ * anchored at the node's own writable data root (`ctx.nodeDataDir`, i.e.
5778
+ * `CAMSTACK_DATA` ?? the kernel boot dir) — never the hub-singleton `storage`
5779
+ * cap, which returns the hub's `/data/models` to every node and breaks any node
5780
+ * whose real data dir differs (e.g. the macOS electron agent).
5781
+ *
5782
+ * `node:path`/`node:fs` are imported dynamically so the `@camstack/types` root
5783
+ * barrel (re-exported into browser bundles) stays free of node builtins.
5776
5784
  */
5777
5785
  async resolveModelsDir() {
5778
- return this.ctx.api.storage.resolve.query({
5779
- location: "models",
5780
- relativePath: ""
5781
- }).catch(() => "camstack-data/models");
5786
+ const { join } = await import("node:path");
5787
+ const { promises: fsp } = await import("node:fs");
5788
+ const dir = join(this.ctx.nodeDataDir, "models");
5789
+ await fsp.mkdir(dir, { recursive: true });
5790
+ return dir;
5782
5791
  }
5783
5792
  /**
5784
5793
  * Access the runtime capability registry for in-process provider lookups.
@@ -15692,7 +15701,8 @@ method(object({
15692
15701
  sessionId: string().optional()
15693
15702
  }), ConvertResultSchema, {
15694
15703
  kind: "mutation",
15695
- auth: "admin"
15704
+ auth: "admin",
15705
+ timeoutMs: 6e5
15696
15706
  });
15697
15707
  var AddonHttpRouteSchema = object({
15698
15708
  method: _enum([
@@ -17271,7 +17281,14 @@ var NotificationRuleConditionsSchema = object({
17271
17281
  /** Match against `event.data.eventType` token (e.g. `'press_long'`). When non-empty, only events
17272
17282
  * carrying a matching `data.eventType` string pass this condition. Rules without this field are
17273
17283
  * unaffected (back-compat). Distinct from `rule.eventTypes` which holds EventCategory strings. */
17274
- eventTypeTokens: array(string()).readonly().optional()
17284
+ eventTypeTokens: array(string()).readonly().optional(),
17285
+ /** Match detections whose CLIP image embedding is semantically similar to this free-text
17286
+ * description. Requires the embedding-encoder cap to have pre-warmed the text vector.
17287
+ * `minSimilarity` is the cosine similarity threshold in [0, 1]. */
17288
+ clipDescription: object({
17289
+ text: string().min(1),
17290
+ minSimilarity: number().min(0).max(1)
17291
+ }).optional()
17275
17292
  });
17276
17293
  var NotificationRuleTemplateSchema = object({
17277
17294
  title: string(),
@@ -17513,6 +17530,16 @@ var TrackedDetectionSchema = object({
17513
17530
  zones: array(string()).readonly(),
17514
17531
  state: TrackStateSchema
17515
17532
  });
17533
+ var ScoredObjectEventSchema = ObjectEventSchema.extend({ score: number() });
17534
+ var SearchObjectEventsInput = object({
17535
+ text: string(),
17536
+ deviceId: number().optional(),
17537
+ since: number().optional(),
17538
+ until: number().optional(),
17539
+ classFilter: string().optional(),
17540
+ limit: number().default(50),
17541
+ minScore: number().min(0).max(1).default(.2)
17542
+ });
17516
17543
  DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
17517
17544
  deviceId: number(),
17518
17545
  trackId: string()
@@ -17547,7 +17574,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17547
17574
  }), method(object({
17548
17575
  eventId: string(),
17549
17576
  kind: MediaFileKindEnum.optional()
17550
- }), array(MediaFileSchema).readonly()), method(object({ trackId: string() }), array(MediaFileSchema).readonly()), object({
17577
+ }), array(MediaFileSchema).readonly()), method(object({ trackId: string() }), array(MediaFileSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), object({
17551
17578
  deviceId: number(),
17552
17579
  timestamp: number(),
17553
17580
  frameWidth: number(),
@@ -22526,6 +22553,12 @@ Object.freeze({
22526
22553
  addonId: null,
22527
22554
  access: "create"
22528
22555
  },
22556
+ "pipelineAnalytics.searchObjectEvents": {
22557
+ capName: "pipeline-analytics",
22558
+ capScope: "device",
22559
+ addonId: null,
22560
+ access: "view"
22561
+ },
22529
22562
  "pipelineExecutor.cacheFrameInPool": {
22530
22563
  capName: "pipeline-executor",
22531
22564
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -4650,7 +4650,7 @@ function _instanceof(cls, params = {}) {
4650
4650
  return inst;
4651
4651
  }
4652
4652
  //#endregion
4653
- //#region ../types/dist/sleep-BV7rLc6Y.mjs
4653
+ //#region ../types/dist/sleep-NOH4yRwj.mjs
4654
4654
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4655
4655
  EventCategory["SystemBoot"] = "system.boot";
4656
4656
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -5765,15 +5765,24 @@ var BaseAddon = class {
5765
5765
  } catch {}
5766
5766
  }
5767
5767
  /**
5768
- * Resolve the shared models directory path via the storage capability.
5769
- * Falls back to `camstack-data/models` if storage is unavailable.
5770
- * Used by inference addons (detection-pipeline, audio-classifier, embedding-encoder).
5768
+ * Resolve the shared, node-local models directory: `<nodeDataDir>/models`.
5769
+ *
5770
+ * This is the SINGLE centralized models-dir resolver for every inference addon
5771
+ * (detection-pipeline, audio-analyzer, embedding-encoder, model-studio). It is
5772
+ * anchored at the node's own writable data root (`ctx.nodeDataDir`, i.e.
5773
+ * `CAMSTACK_DATA` ?? the kernel boot dir) — never the hub-singleton `storage`
5774
+ * cap, which returns the hub's `/data/models` to every node and breaks any node
5775
+ * whose real data dir differs (e.g. the macOS electron agent).
5776
+ *
5777
+ * `node:path`/`node:fs` are imported dynamically so the `@camstack/types` root
5778
+ * barrel (re-exported into browser bundles) stays free of node builtins.
5771
5779
  */
5772
5780
  async resolveModelsDir() {
5773
- return this.ctx.api.storage.resolve.query({
5774
- location: "models",
5775
- relativePath: ""
5776
- }).catch(() => "camstack-data/models");
5781
+ const { join } = await import("node:path");
5782
+ const { promises: fsp } = await import("node:fs");
5783
+ const dir = join(this.ctx.nodeDataDir, "models");
5784
+ await fsp.mkdir(dir, { recursive: true });
5785
+ return dir;
5777
5786
  }
5778
5787
  /**
5779
5788
  * Access the runtime capability registry for in-process provider lookups.
@@ -15687,7 +15696,8 @@ method(object({
15687
15696
  sessionId: string().optional()
15688
15697
  }), ConvertResultSchema, {
15689
15698
  kind: "mutation",
15690
- auth: "admin"
15699
+ auth: "admin",
15700
+ timeoutMs: 6e5
15691
15701
  });
15692
15702
  var AddonHttpRouteSchema = object({
15693
15703
  method: _enum([
@@ -17266,7 +17276,14 @@ var NotificationRuleConditionsSchema = object({
17266
17276
  /** Match against `event.data.eventType` token (e.g. `'press_long'`). When non-empty, only events
17267
17277
  * carrying a matching `data.eventType` string pass this condition. Rules without this field are
17268
17278
  * unaffected (back-compat). Distinct from `rule.eventTypes` which holds EventCategory strings. */
17269
- eventTypeTokens: array(string()).readonly().optional()
17279
+ eventTypeTokens: array(string()).readonly().optional(),
17280
+ /** Match detections whose CLIP image embedding is semantically similar to this free-text
17281
+ * description. Requires the embedding-encoder cap to have pre-warmed the text vector.
17282
+ * `minSimilarity` is the cosine similarity threshold in [0, 1]. */
17283
+ clipDescription: object({
17284
+ text: string().min(1),
17285
+ minSimilarity: number().min(0).max(1)
17286
+ }).optional()
17270
17287
  });
17271
17288
  var NotificationRuleTemplateSchema = object({
17272
17289
  title: string(),
@@ -17508,6 +17525,16 @@ var TrackedDetectionSchema = object({
17508
17525
  zones: array(string()).readonly(),
17509
17526
  state: TrackStateSchema
17510
17527
  });
17528
+ var ScoredObjectEventSchema = ObjectEventSchema.extend({ score: number() });
17529
+ var SearchObjectEventsInput = object({
17530
+ text: string(),
17531
+ deviceId: number().optional(),
17532
+ since: number().optional(),
17533
+ until: number().optional(),
17534
+ classFilter: string().optional(),
17535
+ limit: number().default(50),
17536
+ minScore: number().min(0).max(1).default(.2)
17537
+ });
17511
17538
  DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
17512
17539
  deviceId: number(),
17513
17540
  trackId: string()
@@ -17542,7 +17569,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17542
17569
  }), method(object({
17543
17570
  eventId: string(),
17544
17571
  kind: MediaFileKindEnum.optional()
17545
- }), array(MediaFileSchema).readonly()), method(object({ trackId: string() }), array(MediaFileSchema).readonly()), object({
17572
+ }), array(MediaFileSchema).readonly()), method(object({ trackId: string() }), array(MediaFileSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), object({
17546
17573
  deviceId: number(),
17547
17574
  timestamp: number(),
17548
17575
  frameWidth: number(),
@@ -22521,6 +22548,12 @@ Object.freeze({
22521
22548
  addonId: null,
22522
22549
  access: "create"
22523
22550
  },
22551
+ "pipelineAnalytics.searchObjectEvents": {
22552
+ capName: "pipeline-analytics",
22553
+ capScope: "device",
22554
+ addonId: null,
22555
+ access: "view"
22556
+ },
22524
22557
  "pipelineExecutor.cacheFrameInPool": {
22525
22558
  capName: "pipeline-executor",
22526
22559
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-reolink",
3
- "version": "1.1.3",
3
+ "version": "1.1.5",
4
4
  "description": "Reolink camera device provider addon for CamStack — native Baichuan protocol",
5
5
  "keywords": [
6
6
  "camstack",