@camstack/addon-smtp-nodemailer 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.
@@ -4665,7 +4665,7 @@ function _instanceof(cls, params = {}) {
4665
4665
  return inst;
4666
4666
  }
4667
4667
  //#endregion
4668
- //#region ../types/dist/sleep-BV7rLc6Y.mjs
4668
+ //#region ../types/dist/sleep-NOH4yRwj.mjs
4669
4669
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4670
4670
  EventCategory["SystemBoot"] = "system.boot";
4671
4671
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -5780,15 +5780,24 @@ var BaseAddon = class {
5780
5780
  } catch {}
5781
5781
  }
5782
5782
  /**
5783
- * Resolve the shared models directory path via the storage capability.
5784
- * Falls back to `camstack-data/models` if storage is unavailable.
5785
- * Used by inference addons (detection-pipeline, audio-classifier, embedding-encoder).
5783
+ * Resolve the shared, node-local models directory: `<nodeDataDir>/models`.
5784
+ *
5785
+ * This is the SINGLE centralized models-dir resolver for every inference addon
5786
+ * (detection-pipeline, audio-analyzer, embedding-encoder, model-studio). It is
5787
+ * anchored at the node's own writable data root (`ctx.nodeDataDir`, i.e.
5788
+ * `CAMSTACK_DATA` ?? the kernel boot dir) — never the hub-singleton `storage`
5789
+ * cap, which returns the hub's `/data/models` to every node and breaks any node
5790
+ * whose real data dir differs (e.g. the macOS electron agent).
5791
+ *
5792
+ * `node:path`/`node:fs` are imported dynamically so the `@camstack/types` root
5793
+ * barrel (re-exported into browser bundles) stays free of node builtins.
5786
5794
  */
5787
5795
  async resolveModelsDir() {
5788
- return this.ctx.api.storage.resolve.query({
5789
- location: "models",
5790
- relativePath: ""
5791
- }).catch(() => "camstack-data/models");
5796
+ const { join } = await import("node:path");
5797
+ const { promises: fsp } = await import("node:fs");
5798
+ const dir = join(this.ctx.nodeDataDir, "models");
5799
+ await fsp.mkdir(dir, { recursive: true });
5800
+ return dir;
5792
5801
  }
5793
5802
  /**
5794
5803
  * Access the runtime capability registry for in-process provider lookups.
@@ -12697,7 +12706,8 @@ method(object({
12697
12706
  sessionId: string().optional()
12698
12707
  }), ConvertResultSchema, {
12699
12708
  kind: "mutation",
12700
- auth: "admin"
12709
+ auth: "admin",
12710
+ timeoutMs: 6e5
12701
12711
  });
12702
12712
  var AddonHttpRouteSchema = object({
12703
12713
  method: _enum([
@@ -14233,7 +14243,14 @@ var NotificationRuleConditionsSchema = object({
14233
14243
  /** Match against `event.data.eventType` token (e.g. `'press_long'`). When non-empty, only events
14234
14244
  * carrying a matching `data.eventType` string pass this condition. Rules without this field are
14235
14245
  * unaffected (back-compat). Distinct from `rule.eventTypes` which holds EventCategory strings. */
14236
- eventTypeTokens: array(string()).readonly().optional()
14246
+ eventTypeTokens: array(string()).readonly().optional(),
14247
+ /** Match detections whose CLIP image embedding is semantically similar to this free-text
14248
+ * description. Requires the embedding-encoder cap to have pre-warmed the text vector.
14249
+ * `minSimilarity` is the cosine similarity threshold in [0, 1]. */
14250
+ clipDescription: object({
14251
+ text: string().min(1),
14252
+ minSimilarity: number().min(0).max(1)
14253
+ }).optional()
14237
14254
  });
14238
14255
  var NotificationRuleTemplateSchema = object({
14239
14256
  title: string(),
@@ -14475,6 +14492,16 @@ var TrackedDetectionSchema = object({
14475
14492
  zones: array(string()).readonly(),
14476
14493
  state: TrackStateSchema
14477
14494
  });
14495
+ var ScoredObjectEventSchema = ObjectEventSchema.extend({ score: number() });
14496
+ var SearchObjectEventsInput = object({
14497
+ text: string(),
14498
+ deviceId: number().optional(),
14499
+ since: number().optional(),
14500
+ until: number().optional(),
14501
+ classFilter: string().optional(),
14502
+ limit: number().default(50),
14503
+ minScore: number().min(0).max(1).default(.2)
14504
+ });
14478
14505
  DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
14479
14506
  deviceId: number(),
14480
14507
  trackId: string()
@@ -14509,7 +14536,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
14509
14536
  }), method(object({
14510
14537
  eventId: string(),
14511
14538
  kind: MediaFileKindEnum.optional()
14512
- }), array(MediaFileSchema).readonly()), method(object({ trackId: string() }), array(MediaFileSchema).readonly()), object({
14539
+ }), array(MediaFileSchema).readonly()), method(object({ trackId: string() }), array(MediaFileSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), object({
14513
14540
  deviceId: number(),
14514
14541
  timestamp: number(),
14515
14542
  frameWidth: number(),
@@ -19159,6 +19186,12 @@ Object.freeze({
19159
19186
  addonId: null,
19160
19187
  access: "create"
19161
19188
  },
19189
+ "pipelineAnalytics.searchObjectEvents": {
19190
+ capName: "pipeline-analytics",
19191
+ capScope: "device",
19192
+ addonId: null,
19193
+ access: "view"
19194
+ },
19162
19195
  "pipelineExecutor.cacheFrameInPool": {
19163
19196
  capName: "pipeline-executor",
19164
19197
  capScope: "system",
@@ -4663,7 +4663,7 @@ function _instanceof(cls, params = {}) {
4663
4663
  return inst;
4664
4664
  }
4665
4665
  //#endregion
4666
- //#region ../types/dist/sleep-BV7rLc6Y.mjs
4666
+ //#region ../types/dist/sleep-NOH4yRwj.mjs
4667
4667
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4668
4668
  EventCategory["SystemBoot"] = "system.boot";
4669
4669
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -5778,15 +5778,24 @@ var BaseAddon = class {
5778
5778
  } catch {}
5779
5779
  }
5780
5780
  /**
5781
- * Resolve the shared models directory path via the storage capability.
5782
- * Falls back to `camstack-data/models` if storage is unavailable.
5783
- * Used by inference addons (detection-pipeline, audio-classifier, embedding-encoder).
5781
+ * Resolve the shared, node-local models directory: `<nodeDataDir>/models`.
5782
+ *
5783
+ * This is the SINGLE centralized models-dir resolver for every inference addon
5784
+ * (detection-pipeline, audio-analyzer, embedding-encoder, model-studio). It is
5785
+ * anchored at the node's own writable data root (`ctx.nodeDataDir`, i.e.
5786
+ * `CAMSTACK_DATA` ?? the kernel boot dir) — never the hub-singleton `storage`
5787
+ * cap, which returns the hub's `/data/models` to every node and breaks any node
5788
+ * whose real data dir differs (e.g. the macOS electron agent).
5789
+ *
5790
+ * `node:path`/`node:fs` are imported dynamically so the `@camstack/types` root
5791
+ * barrel (re-exported into browser bundles) stays free of node builtins.
5784
5792
  */
5785
5793
  async resolveModelsDir() {
5786
- return this.ctx.api.storage.resolve.query({
5787
- location: "models",
5788
- relativePath: ""
5789
- }).catch(() => "camstack-data/models");
5794
+ const { join } = await import("node:path");
5795
+ const { promises: fsp } = await import("node:fs");
5796
+ const dir = join(this.ctx.nodeDataDir, "models");
5797
+ await fsp.mkdir(dir, { recursive: true });
5798
+ return dir;
5790
5799
  }
5791
5800
  /**
5792
5801
  * Access the runtime capability registry for in-process provider lookups.
@@ -12695,7 +12704,8 @@ method(object({
12695
12704
  sessionId: string().optional()
12696
12705
  }), ConvertResultSchema, {
12697
12706
  kind: "mutation",
12698
- auth: "admin"
12707
+ auth: "admin",
12708
+ timeoutMs: 6e5
12699
12709
  });
12700
12710
  var AddonHttpRouteSchema = object({
12701
12711
  method: _enum([
@@ -14231,7 +14241,14 @@ var NotificationRuleConditionsSchema = object({
14231
14241
  /** Match against `event.data.eventType` token (e.g. `'press_long'`). When non-empty, only events
14232
14242
  * carrying a matching `data.eventType` string pass this condition. Rules without this field are
14233
14243
  * unaffected (back-compat). Distinct from `rule.eventTypes` which holds EventCategory strings. */
14234
- eventTypeTokens: array(string()).readonly().optional()
14244
+ eventTypeTokens: array(string()).readonly().optional(),
14245
+ /** Match detections whose CLIP image embedding is semantically similar to this free-text
14246
+ * description. Requires the embedding-encoder cap to have pre-warmed the text vector.
14247
+ * `minSimilarity` is the cosine similarity threshold in [0, 1]. */
14248
+ clipDescription: object({
14249
+ text: string().min(1),
14250
+ minSimilarity: number().min(0).max(1)
14251
+ }).optional()
14235
14252
  });
14236
14253
  var NotificationRuleTemplateSchema = object({
14237
14254
  title: string(),
@@ -14473,6 +14490,16 @@ var TrackedDetectionSchema = object({
14473
14490
  zones: array(string()).readonly(),
14474
14491
  state: TrackStateSchema
14475
14492
  });
14493
+ var ScoredObjectEventSchema = ObjectEventSchema.extend({ score: number() });
14494
+ var SearchObjectEventsInput = object({
14495
+ text: string(),
14496
+ deviceId: number().optional(),
14497
+ since: number().optional(),
14498
+ until: number().optional(),
14499
+ classFilter: string().optional(),
14500
+ limit: number().default(50),
14501
+ minScore: number().min(0).max(1).default(.2)
14502
+ });
14476
14503
  DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
14477
14504
  deviceId: number(),
14478
14505
  trackId: string()
@@ -14507,7 +14534,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
14507
14534
  }), method(object({
14508
14535
  eventId: string(),
14509
14536
  kind: MediaFileKindEnum.optional()
14510
- }), array(MediaFileSchema).readonly()), method(object({ trackId: string() }), array(MediaFileSchema).readonly()), object({
14537
+ }), array(MediaFileSchema).readonly()), method(object({ trackId: string() }), array(MediaFileSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), object({
14511
14538
  deviceId: number(),
14512
14539
  timestamp: number(),
14513
14540
  frameWidth: number(),
@@ -19157,6 +19184,12 @@ Object.freeze({
19157
19184
  addonId: null,
19158
19185
  access: "create"
19159
19186
  },
19187
+ "pipelineAnalytics.searchObjectEvents": {
19188
+ capName: "pipeline-analytics",
19189
+ capScope: "device",
19190
+ addonId: null,
19191
+ access: "view"
19192
+ },
19160
19193
  "pipelineExecutor.cacheFrameInPool": {
19161
19194
  capName: "pipeline-executor",
19162
19195
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-smtp-nodemailer",
3
- "version": "1.1.3",
3
+ "version": "1.1.5",
4
4
  "description": "SMTP email provider addon for CamStack — wraps `nodemailer` and registers a `smtp-provider` cap collection entry. Used by magic-link login + notifier addons.",
5
5
  "keywords": [
6
6
  "camstack",