@camstack/addon-remote-storage 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/s3.addon.js CHANGED
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_shared = require("./shared-DB-bSHfI.js");
5
+ const require_shared = require("./shared-BUmgLZCW.js");
6
6
  let node_stream = require("node:stream");
7
7
  let _aws_sdk_client_s3 = require("@aws-sdk/client-s3");
8
8
  let _aws_sdk_lib_storage = require("@aws-sdk/lib-storage");
package/dist/s3.addon.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { c as BaseAddon, i as rearmIdleAbort, n as getOptionalBasePath, o as scheduleIdleAbort, s as storageProviderCapability, t as createSessionId } from "./shared-Df-ffKz9.mjs";
1
+ import { c as BaseAddon, i as rearmIdleAbort, n as getOptionalBasePath, o as scheduleIdleAbort, s as storageProviderCapability, t as createSessionId } from "./shared-DR3X5bYm.mjs";
2
2
  import { PassThrough } from "node:stream";
3
3
  import { DeleteObjectCommand, GetObjectCommand, HeadBucketCommand, HeadObjectCommand, ListObjectsV2Command, PutObjectCommand, S3Client } from "@aws-sdk/client-s3";
4
4
  import { Upload } from "@aws-sdk/lib-storage";
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_shared = require("./shared-DB-bSHfI.js");
5
+ const require_shared = require("./shared-BUmgLZCW.js");
6
6
  let ssh2 = require("ssh2");
7
7
  let node_path = require("node:path");
8
8
  node_path = require_shared.__toESM(node_path);
@@ -1,4 +1,4 @@
1
- import { a as safeJoinRemotePath, c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, r as getRequiredBasePath, s as storageProviderCapability, t as createSessionId } from "./shared-Df-ffKz9.mjs";
1
+ import { a as safeJoinRemotePath, c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, r as getRequiredBasePath, s as storageProviderCapability, t as createSessionId } from "./shared-DR3X5bYm.mjs";
2
2
  import { Client } from "ssh2";
3
3
  import * as path from "node:path";
4
4
  //#region src/providers/sftp/sftp-config-schema.ts
@@ -4652,7 +4652,7 @@ function _instanceof(cls, params = {}) {
4652
4652
  return inst;
4653
4653
  }
4654
4654
  //#endregion
4655
- //#region ../types/dist/sleep-BV7rLc6Y.mjs
4655
+ //#region ../types/dist/sleep-NOH4yRwj.mjs
4656
4656
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4657
4657
  EventCategory["SystemBoot"] = "system.boot";
4658
4658
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -5767,15 +5767,24 @@ var BaseAddon = class {
5767
5767
  } catch {}
5768
5768
  }
5769
5769
  /**
5770
- * Resolve the shared models directory path via the storage capability.
5771
- * Falls back to `camstack-data/models` if storage is unavailable.
5772
- * Used by inference addons (detection-pipeline, audio-classifier, embedding-encoder).
5770
+ * Resolve the shared, node-local models directory: `<nodeDataDir>/models`.
5771
+ *
5772
+ * This is the SINGLE centralized models-dir resolver for every inference addon
5773
+ * (detection-pipeline, audio-analyzer, embedding-encoder, model-studio). It is
5774
+ * anchored at the node's own writable data root (`ctx.nodeDataDir`, i.e.
5775
+ * `CAMSTACK_DATA` ?? the kernel boot dir) — never the hub-singleton `storage`
5776
+ * cap, which returns the hub's `/data/models` to every node and breaks any node
5777
+ * whose real data dir differs (e.g. the macOS electron agent).
5778
+ *
5779
+ * `node:path`/`node:fs` are imported dynamically so the `@camstack/types` root
5780
+ * barrel (re-exported into browser bundles) stays free of node builtins.
5773
5781
  */
5774
5782
  async resolveModelsDir() {
5775
- return this.ctx.api.storage.resolve.query({
5776
- location: "models",
5777
- relativePath: ""
5778
- }).catch(() => "camstack-data/models");
5783
+ const { join } = await import("node:path");
5784
+ const { promises: fsp } = await import("node:fs");
5785
+ const dir = join(this.ctx.nodeDataDir, "models");
5786
+ await fsp.mkdir(dir, { recursive: true });
5787
+ return dir;
5779
5788
  }
5780
5789
  /**
5781
5790
  * Access the runtime capability registry for in-process provider lookups.
@@ -12716,7 +12725,8 @@ method(object({
12716
12725
  sessionId: string().optional()
12717
12726
  }), ConvertResultSchema, {
12718
12727
  kind: "mutation",
12719
- auth: "admin"
12728
+ auth: "admin",
12729
+ timeoutMs: 6e5
12720
12730
  });
12721
12731
  var AddonHttpRouteSchema = object({
12722
12732
  method: _enum([
@@ -14252,7 +14262,14 @@ var NotificationRuleConditionsSchema = object({
14252
14262
  /** Match against `event.data.eventType` token (e.g. `'press_long'`). When non-empty, only events
14253
14263
  * carrying a matching `data.eventType` string pass this condition. Rules without this field are
14254
14264
  * unaffected (back-compat). Distinct from `rule.eventTypes` which holds EventCategory strings. */
14255
- eventTypeTokens: array(string()).readonly().optional()
14265
+ eventTypeTokens: array(string()).readonly().optional(),
14266
+ /** Match detections whose CLIP image embedding is semantically similar to this free-text
14267
+ * description. Requires the embedding-encoder cap to have pre-warmed the text vector.
14268
+ * `minSimilarity` is the cosine similarity threshold in [0, 1]. */
14269
+ clipDescription: object({
14270
+ text: string().min(1),
14271
+ minSimilarity: number().min(0).max(1)
14272
+ }).optional()
14256
14273
  });
14257
14274
  var NotificationRuleTemplateSchema = object({
14258
14275
  title: string(),
@@ -14494,6 +14511,16 @@ var TrackedDetectionSchema = object({
14494
14511
  zones: array(string()).readonly(),
14495
14512
  state: TrackStateSchema
14496
14513
  });
14514
+ var ScoredObjectEventSchema = ObjectEventSchema.extend({ score: number() });
14515
+ var SearchObjectEventsInput = object({
14516
+ text: string(),
14517
+ deviceId: number().optional(),
14518
+ since: number().optional(),
14519
+ until: number().optional(),
14520
+ classFilter: string().optional(),
14521
+ limit: number().default(50),
14522
+ minScore: number().min(0).max(1).default(.2)
14523
+ });
14497
14524
  DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
14498
14525
  deviceId: number(),
14499
14526
  trackId: string()
@@ -14528,7 +14555,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
14528
14555
  }), method(object({
14529
14556
  eventId: string(),
14530
14557
  kind: MediaFileKindEnum.optional()
14531
- }), array(MediaFileSchema).readonly()), method(object({ trackId: string() }), array(MediaFileSchema).readonly()), object({
14558
+ }), array(MediaFileSchema).readonly()), method(object({ trackId: string() }), array(MediaFileSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), object({
14532
14559
  deviceId: number(),
14533
14560
  timestamp: number(),
14534
14561
  frameWidth: number(),
@@ -19178,6 +19205,12 @@ Object.freeze({
19178
19205
  addonId: null,
19179
19206
  access: "create"
19180
19207
  },
19208
+ "pipelineAnalytics.searchObjectEvents": {
19209
+ capName: "pipeline-analytics",
19210
+ capScope: "device",
19211
+ addonId: null,
19212
+ access: "view"
19213
+ },
19181
19214
  "pipelineExecutor.cacheFrameInPool": {
19182
19215
  capName: "pipeline-executor",
19183
19216
  capScope: "system",
@@ -4629,7 +4629,7 @@ function _instanceof(cls, params = {}) {
4629
4629
  return inst;
4630
4630
  }
4631
4631
  //#endregion
4632
- //#region ../types/dist/sleep-BV7rLc6Y.mjs
4632
+ //#region ../types/dist/sleep-NOH4yRwj.mjs
4633
4633
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4634
4634
  EventCategory["SystemBoot"] = "system.boot";
4635
4635
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -5744,15 +5744,24 @@ var BaseAddon = class {
5744
5744
  } catch {}
5745
5745
  }
5746
5746
  /**
5747
- * Resolve the shared models directory path via the storage capability.
5748
- * Falls back to `camstack-data/models` if storage is unavailable.
5749
- * Used by inference addons (detection-pipeline, audio-classifier, embedding-encoder).
5747
+ * Resolve the shared, node-local models directory: `<nodeDataDir>/models`.
5748
+ *
5749
+ * This is the SINGLE centralized models-dir resolver for every inference addon
5750
+ * (detection-pipeline, audio-analyzer, embedding-encoder, model-studio). It is
5751
+ * anchored at the node's own writable data root (`ctx.nodeDataDir`, i.e.
5752
+ * `CAMSTACK_DATA` ?? the kernel boot dir) — never the hub-singleton `storage`
5753
+ * cap, which returns the hub's `/data/models` to every node and breaks any node
5754
+ * whose real data dir differs (e.g. the macOS electron agent).
5755
+ *
5756
+ * `node:path`/`node:fs` are imported dynamically so the `@camstack/types` root
5757
+ * barrel (re-exported into browser bundles) stays free of node builtins.
5750
5758
  */
5751
5759
  async resolveModelsDir() {
5752
- return this.ctx.api.storage.resolve.query({
5753
- location: "models",
5754
- relativePath: ""
5755
- }).catch(() => "camstack-data/models");
5760
+ const { join } = await import("node:path");
5761
+ const { promises: fsp } = await import("node:fs");
5762
+ const dir = join(this.ctx.nodeDataDir, "models");
5763
+ await fsp.mkdir(dir, { recursive: true });
5764
+ return dir;
5756
5765
  }
5757
5766
  /**
5758
5767
  * Access the runtime capability registry for in-process provider lookups.
@@ -12693,7 +12702,8 @@ method(object({
12693
12702
  sessionId: string().optional()
12694
12703
  }), ConvertResultSchema, {
12695
12704
  kind: "mutation",
12696
- auth: "admin"
12705
+ auth: "admin",
12706
+ timeoutMs: 6e5
12697
12707
  });
12698
12708
  var AddonHttpRouteSchema = object({
12699
12709
  method: _enum([
@@ -14229,7 +14239,14 @@ var NotificationRuleConditionsSchema = object({
14229
14239
  /** Match against `event.data.eventType` token (e.g. `'press_long'`). When non-empty, only events
14230
14240
  * carrying a matching `data.eventType` string pass this condition. Rules without this field are
14231
14241
  * unaffected (back-compat). Distinct from `rule.eventTypes` which holds EventCategory strings. */
14232
- eventTypeTokens: array(string()).readonly().optional()
14242
+ eventTypeTokens: array(string()).readonly().optional(),
14243
+ /** Match detections whose CLIP image embedding is semantically similar to this free-text
14244
+ * description. Requires the embedding-encoder cap to have pre-warmed the text vector.
14245
+ * `minSimilarity` is the cosine similarity threshold in [0, 1]. */
14246
+ clipDescription: object({
14247
+ text: string().min(1),
14248
+ minSimilarity: number().min(0).max(1)
14249
+ }).optional()
14233
14250
  });
14234
14251
  var NotificationRuleTemplateSchema = object({
14235
14252
  title: string(),
@@ -14471,6 +14488,16 @@ var TrackedDetectionSchema = object({
14471
14488
  zones: array(string()).readonly(),
14472
14489
  state: TrackStateSchema
14473
14490
  });
14491
+ var ScoredObjectEventSchema = ObjectEventSchema.extend({ score: number() });
14492
+ var SearchObjectEventsInput = object({
14493
+ text: string(),
14494
+ deviceId: number().optional(),
14495
+ since: number().optional(),
14496
+ until: number().optional(),
14497
+ classFilter: string().optional(),
14498
+ limit: number().default(50),
14499
+ minScore: number().min(0).max(1).default(.2)
14500
+ });
14474
14501
  DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
14475
14502
  deviceId: number(),
14476
14503
  trackId: string()
@@ -14505,7 +14532,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
14505
14532
  }), method(object({
14506
14533
  eventId: string(),
14507
14534
  kind: MediaFileKindEnum.optional()
14508
- }), array(MediaFileSchema).readonly()), method(object({ trackId: string() }), array(MediaFileSchema).readonly()), object({
14535
+ }), array(MediaFileSchema).readonly()), method(object({ trackId: string() }), array(MediaFileSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), object({
14509
14536
  deviceId: number(),
14510
14537
  timestamp: number(),
14511
14538
  frameWidth: number(),
@@ -19155,6 +19182,12 @@ Object.freeze({
19155
19182
  addonId: null,
19156
19183
  access: "create"
19157
19184
  },
19185
+ "pipelineAnalytics.searchObjectEvents": {
19186
+ capName: "pipeline-analytics",
19187
+ capScope: "device",
19188
+ addonId: null,
19189
+ access: "view"
19190
+ },
19158
19191
  "pipelineExecutor.cacheFrameInPool": {
19159
19192
  capName: "pipeline-executor",
19160
19193
  capScope: "system",
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_shared = require("./shared-DB-bSHfI.js");
5
+ const require_shared = require("./shared-BUmgLZCW.js");
6
6
  let node_stream = require("node:stream");
7
7
  let webdav = require("webdav");
8
8
  //#region src/providers/webdav/webdav-config-schema.ts
@@ -1,4 +1,4 @@
1
- import { a as safeJoinRemotePath, c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, r as getRequiredBasePath, s as storageProviderCapability, t as createSessionId } from "./shared-Df-ffKz9.mjs";
1
+ import { a as safeJoinRemotePath, c as BaseAddon, i as rearmIdleAbort, o as scheduleIdleAbort, r as getRequiredBasePath, s as storageProviderCapability, t as createSessionId } from "./shared-DR3X5bYm.mjs";
2
2
  import { PassThrough } from "node:stream";
3
3
  import { AuthType, createClient } from "webdav";
4
4
  //#region src/providers/webdav/webdav-config-schema.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-remote-storage",
3
- "version": "1.1.3",
3
+ "version": "1.1.5",
4
4
  "description": "Remote storage providers (SFTP, S3, WebDAV) — unifies remote backends behind the storage-provider cap",
5
5
  "keywords": [
6
6
  "camstack",