@camstack/addon-smtp-nodemailer 1.1.25 → 1.1.26

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.
@@ -7365,6 +7365,62 @@ var RecordingConfigSchema = object({
7365
7365
  scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7366
7366
  });
7367
7367
  /**
7368
+ * Ops-log — the durable, append-only operations audit shared by the
7369
+ * recordings and events management surfaces.
7370
+ *
7371
+ * ONE row shape is reused for both domains so a single "Activity" view can
7372
+ * merge the recorder's DurableState ring (recordings ops-log) and the
7373
+ * pipeline-analytics SQLite collection (events ops-log). Each row records a
7374
+ * management operation, WHY it ran (reason), and its measurable effect
7375
+ * (itemsAffected + bytesReclaimed). Writes are best-effort — a failed log must
7376
+ * never fail the operation it records.
7377
+ */
7378
+ /** Which management domain the operation belongs to. */
7379
+ var OpsLogDomainSchema = _enum(["recording", "events"]);
7380
+ /** The kind of management operation performed. */
7381
+ var OpsLogOpSchema = _enum([
7382
+ "prune",
7383
+ "manual-delete",
7384
+ "rescan",
7385
+ "retention-run"
7386
+ ]);
7387
+ /** Why the operation ran. */
7388
+ var OpsLogReasonSchema = _enum([
7389
+ "retention",
7390
+ "quota",
7391
+ "manual",
7392
+ "operator"
7393
+ ]);
7394
+ /** One audit row, shared verbatim by both domains. */
7395
+ var OpsLogEntrySchema = object({
7396
+ /** Unique row id. */
7397
+ id: string(),
7398
+ /** Epoch ms the operation completed. */
7399
+ at: number(),
7400
+ domain: OpsLogDomainSchema,
7401
+ op: OpsLogOpSchema,
7402
+ reason: OpsLogReasonSchema,
7403
+ /** The camera the op targeted; null for a cluster/global op. */
7404
+ deviceId: number().nullable(),
7405
+ /** Node that performed the op (the log carries nodeId — no cross-node aggregation). */
7406
+ nodeId: string(),
7407
+ /** Buckets / rows deleted (op-specific unit). */
7408
+ itemsAffected: number(),
7409
+ /** Bytes reclaimed by the op (0 when not measurable). */
7410
+ bytesReclaimed: number(),
7411
+ /** Free-text detail (e.g. "floor moved to <ts>"); null when none. */
7412
+ detail: string().nullable(),
7413
+ /** Who/what triggered the op. */
7414
+ actor: string()
7415
+ });
7416
+ /** Shared query input for the per-domain `listOpsLog` cap methods. */
7417
+ var OpsLogQueryInputSchema = object({
7418
+ /** Restrict to a single camera; omit for every row. */
7419
+ deviceId: number().optional(),
7420
+ /** Max rows returned, newest-first. */
7421
+ limit: number().int().min(1).max(1e3).optional()
7422
+ });
7423
+ /**
7368
7424
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
7369
7425
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
7370
7426
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -16165,6 +16221,26 @@ var TrackCascadeCountsSchema = object({
16165
16221
  /** Per-track CLIP search vectors removed (best-effort). */
16166
16222
  embeddings: number().int()
16167
16223
  });
16224
+ /** Event-store footprint for one camera. */
16225
+ var EventStoreDeviceFootprintSchema = object({
16226
+ deviceId: number(),
16227
+ /** Persisted event rows (motion + object + audio) for the camera. */
16228
+ rows: number().int(),
16229
+ /** Event-owned media bytes on disk for the camera. */
16230
+ bytes: number().int()
16231
+ });
16232
+ /** Aggregate event-store footprint: global totals + per-camera breakdown. */
16233
+ var EventStoreFootprintSchema = object({
16234
+ totalRows: number().int(),
16235
+ totalBytes: number().int(),
16236
+ devices: array(EventStoreDeviceFootprintSchema).readonly()
16237
+ });
16238
+ /** Per-kind counts returned by the event-prune / device-delete mutations. */
16239
+ var EventPruneCountsSchema = object({
16240
+ motion: number().int(),
16241
+ object: number().int(),
16242
+ audio: number().int()
16243
+ });
16168
16244
  DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
16169
16245
  deviceId: number(),
16170
16246
  trackId: string()
@@ -16228,6 +16304,21 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
16228
16304
  }), {
16229
16305
  kind: "mutation",
16230
16306
  auth: "admin"
16307
+ }), method(object({}), EventStoreFootprintSchema, {
16308
+ kind: "query",
16309
+ auth: "admin"
16310
+ }), method(object({
16311
+ olderThanMs: number(),
16312
+ reason: OpsLogReasonSchema.optional()
16313
+ }), EventPruneCountsSchema, {
16314
+ kind: "mutation",
16315
+ auth: "admin"
16316
+ }), method(object({ deviceId: number() }), EventPruneCountsSchema, {
16317
+ kind: "mutation",
16318
+ auth: "admin"
16319
+ }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
16320
+ kind: "query",
16321
+ auth: "admin"
16231
16322
  }), method(object({
16232
16323
  eventId: string(),
16233
16324
  kind: MediaFileKindEnum.optional()
@@ -19474,13 +19565,29 @@ method(object({
19474
19565
  }), method(object({ deviceId: number() }), RecordingStatusSchema, {
19475
19566
  kind: "mutation",
19476
19567
  auth: "admin"
19477
- }), method(object({ deviceId: number() }), object({
19568
+ }), method(object({
19569
+ deviceId: number(),
19570
+ reason: OpsLogReasonSchema.optional()
19571
+ }), object({
19478
19572
  floorMs: number().nullable(),
19479
19573
  deletedBuckets: number().int(),
19480
19574
  reclaimedBytes: number().int()
19481
19575
  }), {
19482
19576
  kind: "mutation",
19483
19577
  auth: "admin"
19578
+ }), method(object({
19579
+ deviceId: number(),
19580
+ fromMs: number().optional(),
19581
+ toMs: number().optional()
19582
+ }), object({
19583
+ deletedBuckets: number().int(),
19584
+ reclaimedBytes: number().int()
19585
+ }), {
19586
+ kind: "mutation",
19587
+ auth: "admin"
19588
+ }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19589
+ kind: "query",
19590
+ auth: "admin"
19484
19591
  });
19485
19592
  /**
19486
19593
  * `recordingExport` cap — render a footage time range into a single downloadable
@@ -22602,6 +22709,12 @@ Object.freeze({
22602
22709
  addonId: null,
22603
22710
  access: "delete"
22604
22711
  },
22712
+ "pipelineAnalytics.deleteDeviceEvents": {
22713
+ capName: "pipeline-analytics",
22714
+ capScope: "device",
22715
+ addonId: null,
22716
+ access: "delete"
22717
+ },
22605
22718
  "pipelineAnalytics.deleteTracks": {
22606
22719
  capName: "pipeline-analytics",
22607
22720
  capScope: "device",
@@ -22632,6 +22745,12 @@ Object.freeze({
22632
22745
  addonId: null,
22633
22746
  access: "view"
22634
22747
  },
22748
+ "pipelineAnalytics.getEventStoreFootprint": {
22749
+ capName: "pipeline-analytics",
22750
+ capScope: "device",
22751
+ addonId: null,
22752
+ access: "view"
22753
+ },
22635
22754
  "pipelineAnalytics.getKeyEvents": {
22636
22755
  capName: "pipeline-analytics",
22637
22756
  capScope: "device",
@@ -22674,6 +22793,12 @@ Object.freeze({
22674
22793
  addonId: null,
22675
22794
  access: "view"
22676
22795
  },
22796
+ "pipelineAnalytics.listOpsLog": {
22797
+ capName: "pipeline-analytics",
22798
+ capScope: "device",
22799
+ addonId: null,
22800
+ access: "view"
22801
+ },
22677
22802
  "pipelineAnalytics.listRecentTracks": {
22678
22803
  capName: "pipeline-analytics",
22679
22804
  capScope: "device",
@@ -22686,6 +22811,12 @@ Object.freeze({
22686
22811
  addonId: null,
22687
22812
  access: "view"
22688
22813
  },
22814
+ "pipelineAnalytics.pruneEvents": {
22815
+ capName: "pipeline-analytics",
22816
+ capScope: "device",
22817
+ addonId: null,
22818
+ access: "create"
22819
+ },
22689
22820
  "pipelineAnalytics.pruneEventsBefore": {
22690
22821
  capName: "pipeline-analytics",
22691
22822
  capScope: "device",
@@ -23448,6 +23579,12 @@ Object.freeze({
23448
23579
  addonId: null,
23449
23580
  access: "create"
23450
23581
  },
23582
+ "recording.deleteFootprint": {
23583
+ capName: "recording",
23584
+ capScope: "system",
23585
+ addonId: null,
23586
+ access: "delete"
23587
+ },
23451
23588
  "recording.getAvailability": {
23452
23589
  capName: "recording",
23453
23590
  capScope: "system",
@@ -23478,6 +23615,12 @@ Object.freeze({
23478
23615
  addonId: null,
23479
23616
  access: "view"
23480
23617
  },
23618
+ "recording.listOpsLog": {
23619
+ capName: "recording",
23620
+ capScope: "system",
23621
+ addonId: null,
23622
+ access: "view"
23623
+ },
23481
23624
  "recording.locateSegment": {
23482
23625
  capName: "recording",
23483
23626
  capScope: "system",
@@ -7363,6 +7363,62 @@ var RecordingConfigSchema = object({
7363
7363
  scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7364
7364
  });
7365
7365
  /**
7366
+ * Ops-log — the durable, append-only operations audit shared by the
7367
+ * recordings and events management surfaces.
7368
+ *
7369
+ * ONE row shape is reused for both domains so a single "Activity" view can
7370
+ * merge the recorder's DurableState ring (recordings ops-log) and the
7371
+ * pipeline-analytics SQLite collection (events ops-log). Each row records a
7372
+ * management operation, WHY it ran (reason), and its measurable effect
7373
+ * (itemsAffected + bytesReclaimed). Writes are best-effort — a failed log must
7374
+ * never fail the operation it records.
7375
+ */
7376
+ /** Which management domain the operation belongs to. */
7377
+ var OpsLogDomainSchema = _enum(["recording", "events"]);
7378
+ /** The kind of management operation performed. */
7379
+ var OpsLogOpSchema = _enum([
7380
+ "prune",
7381
+ "manual-delete",
7382
+ "rescan",
7383
+ "retention-run"
7384
+ ]);
7385
+ /** Why the operation ran. */
7386
+ var OpsLogReasonSchema = _enum([
7387
+ "retention",
7388
+ "quota",
7389
+ "manual",
7390
+ "operator"
7391
+ ]);
7392
+ /** One audit row, shared verbatim by both domains. */
7393
+ var OpsLogEntrySchema = object({
7394
+ /** Unique row id. */
7395
+ id: string(),
7396
+ /** Epoch ms the operation completed. */
7397
+ at: number(),
7398
+ domain: OpsLogDomainSchema,
7399
+ op: OpsLogOpSchema,
7400
+ reason: OpsLogReasonSchema,
7401
+ /** The camera the op targeted; null for a cluster/global op. */
7402
+ deviceId: number().nullable(),
7403
+ /** Node that performed the op (the log carries nodeId — no cross-node aggregation). */
7404
+ nodeId: string(),
7405
+ /** Buckets / rows deleted (op-specific unit). */
7406
+ itemsAffected: number(),
7407
+ /** Bytes reclaimed by the op (0 when not measurable). */
7408
+ bytesReclaimed: number(),
7409
+ /** Free-text detail (e.g. "floor moved to <ts>"); null when none. */
7410
+ detail: string().nullable(),
7411
+ /** Who/what triggered the op. */
7412
+ actor: string()
7413
+ });
7414
+ /** Shared query input for the per-domain `listOpsLog` cap methods. */
7415
+ var OpsLogQueryInputSchema = object({
7416
+ /** Restrict to a single camera; omit for every row. */
7417
+ deviceId: number().optional(),
7418
+ /** Max rows returned, newest-first. */
7419
+ limit: number().int().min(1).max(1e3).optional()
7420
+ });
7421
+ /**
7366
7422
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
7367
7423
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
7368
7424
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -16163,6 +16219,26 @@ var TrackCascadeCountsSchema = object({
16163
16219
  /** Per-track CLIP search vectors removed (best-effort). */
16164
16220
  embeddings: number().int()
16165
16221
  });
16222
+ /** Event-store footprint for one camera. */
16223
+ var EventStoreDeviceFootprintSchema = object({
16224
+ deviceId: number(),
16225
+ /** Persisted event rows (motion + object + audio) for the camera. */
16226
+ rows: number().int(),
16227
+ /** Event-owned media bytes on disk for the camera. */
16228
+ bytes: number().int()
16229
+ });
16230
+ /** Aggregate event-store footprint: global totals + per-camera breakdown. */
16231
+ var EventStoreFootprintSchema = object({
16232
+ totalRows: number().int(),
16233
+ totalBytes: number().int(),
16234
+ devices: array(EventStoreDeviceFootprintSchema).readonly()
16235
+ });
16236
+ /** Per-kind counts returned by the event-prune / device-delete mutations. */
16237
+ var EventPruneCountsSchema = object({
16238
+ motion: number().int(),
16239
+ object: number().int(),
16240
+ audio: number().int()
16241
+ });
16166
16242
  DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
16167
16243
  deviceId: number(),
16168
16244
  trackId: string()
@@ -16226,6 +16302,21 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
16226
16302
  }), {
16227
16303
  kind: "mutation",
16228
16304
  auth: "admin"
16305
+ }), method(object({}), EventStoreFootprintSchema, {
16306
+ kind: "query",
16307
+ auth: "admin"
16308
+ }), method(object({
16309
+ olderThanMs: number(),
16310
+ reason: OpsLogReasonSchema.optional()
16311
+ }), EventPruneCountsSchema, {
16312
+ kind: "mutation",
16313
+ auth: "admin"
16314
+ }), method(object({ deviceId: number() }), EventPruneCountsSchema, {
16315
+ kind: "mutation",
16316
+ auth: "admin"
16317
+ }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
16318
+ kind: "query",
16319
+ auth: "admin"
16229
16320
  }), method(object({
16230
16321
  eventId: string(),
16231
16322
  kind: MediaFileKindEnum.optional()
@@ -19472,13 +19563,29 @@ method(object({
19472
19563
  }), method(object({ deviceId: number() }), RecordingStatusSchema, {
19473
19564
  kind: "mutation",
19474
19565
  auth: "admin"
19475
- }), method(object({ deviceId: number() }), object({
19566
+ }), method(object({
19567
+ deviceId: number(),
19568
+ reason: OpsLogReasonSchema.optional()
19569
+ }), object({
19476
19570
  floorMs: number().nullable(),
19477
19571
  deletedBuckets: number().int(),
19478
19572
  reclaimedBytes: number().int()
19479
19573
  }), {
19480
19574
  kind: "mutation",
19481
19575
  auth: "admin"
19576
+ }), method(object({
19577
+ deviceId: number(),
19578
+ fromMs: number().optional(),
19579
+ toMs: number().optional()
19580
+ }), object({
19581
+ deletedBuckets: number().int(),
19582
+ reclaimedBytes: number().int()
19583
+ }), {
19584
+ kind: "mutation",
19585
+ auth: "admin"
19586
+ }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19587
+ kind: "query",
19588
+ auth: "admin"
19482
19589
  });
19483
19590
  /**
19484
19591
  * `recordingExport` cap — render a footage time range into a single downloadable
@@ -22600,6 +22707,12 @@ Object.freeze({
22600
22707
  addonId: null,
22601
22708
  access: "delete"
22602
22709
  },
22710
+ "pipelineAnalytics.deleteDeviceEvents": {
22711
+ capName: "pipeline-analytics",
22712
+ capScope: "device",
22713
+ addonId: null,
22714
+ access: "delete"
22715
+ },
22603
22716
  "pipelineAnalytics.deleteTracks": {
22604
22717
  capName: "pipeline-analytics",
22605
22718
  capScope: "device",
@@ -22630,6 +22743,12 @@ Object.freeze({
22630
22743
  addonId: null,
22631
22744
  access: "view"
22632
22745
  },
22746
+ "pipelineAnalytics.getEventStoreFootprint": {
22747
+ capName: "pipeline-analytics",
22748
+ capScope: "device",
22749
+ addonId: null,
22750
+ access: "view"
22751
+ },
22633
22752
  "pipelineAnalytics.getKeyEvents": {
22634
22753
  capName: "pipeline-analytics",
22635
22754
  capScope: "device",
@@ -22672,6 +22791,12 @@ Object.freeze({
22672
22791
  addonId: null,
22673
22792
  access: "view"
22674
22793
  },
22794
+ "pipelineAnalytics.listOpsLog": {
22795
+ capName: "pipeline-analytics",
22796
+ capScope: "device",
22797
+ addonId: null,
22798
+ access: "view"
22799
+ },
22675
22800
  "pipelineAnalytics.listRecentTracks": {
22676
22801
  capName: "pipeline-analytics",
22677
22802
  capScope: "device",
@@ -22684,6 +22809,12 @@ Object.freeze({
22684
22809
  addonId: null,
22685
22810
  access: "view"
22686
22811
  },
22812
+ "pipelineAnalytics.pruneEvents": {
22813
+ capName: "pipeline-analytics",
22814
+ capScope: "device",
22815
+ addonId: null,
22816
+ access: "create"
22817
+ },
22687
22818
  "pipelineAnalytics.pruneEventsBefore": {
22688
22819
  capName: "pipeline-analytics",
22689
22820
  capScope: "device",
@@ -23446,6 +23577,12 @@ Object.freeze({
23446
23577
  addonId: null,
23447
23578
  access: "create"
23448
23579
  },
23580
+ "recording.deleteFootprint": {
23581
+ capName: "recording",
23582
+ capScope: "system",
23583
+ addonId: null,
23584
+ access: "delete"
23585
+ },
23449
23586
  "recording.getAvailability": {
23450
23587
  capName: "recording",
23451
23588
  capScope: "system",
@@ -23476,6 +23613,12 @@ Object.freeze({
23476
23613
  addonId: null,
23477
23614
  access: "view"
23478
23615
  },
23616
+ "recording.listOpsLog": {
23617
+ capName: "recording",
23618
+ capScope: "system",
23619
+ addonId: null,
23620
+ access: "view"
23621
+ },
23479
23622
  "recording.locateSegment": {
23480
23623
  capName: "recording",
23481
23624
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-smtp-nodemailer",
3
- "version": "1.1.25",
3
+ "version": "1.1.26",
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",