@camstack/addon-smtp-nodemailer 1.2.29 → 1.2.30

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.
@@ -15501,7 +15501,23 @@ var NcHistoryEntrySchema = object({
15501
15501
  updatedAt: number(),
15502
15502
  /** Failure detail — present on a `dead` row. */
15503
15503
  error: string().optional(),
15504
- subject: NcHistorySubjectSchema
15504
+ subject: NcHistorySubjectSchema,
15505
+ /**
15506
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15507
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15508
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15509
+ * every delivery attempt). Absent on a row still pending/dead, a row
15510
+ * delivered before this field shipped, or a wiring with no artefact index.
15511
+ *
15512
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15513
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15514
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15515
+ * also answers `null` for an id whose artefact has since expired past the
15516
+ * retained shelf's own age bound — the degrade a caller (the Home
15517
+ * Assistant export) must render as "no image right now", never as a
15518
+ * broken link.
15519
+ */
15520
+ artifactIds: array(string().min(1)).optional()
15505
15521
  });
15506
15522
  /**
15507
15523
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -15728,7 +15744,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
15728
15744
  }), method(object({}), object({
15729
15745
  catalog: array(NcConditionDescriptorSchema),
15730
15746
  taxonomy: NcTaxonomySchema.optional()
15731
- })), method(object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), object({ entries: array(NcHistoryEntrySchema) }), { auth: "admin" }), method(object({}), object({ snoozes: array(NcSnoozeSchema) }), { caller: "required" }), method(object({ snooze: NcSnoozeInputSchema }), object({ snooze: NcSnoozeSchema }), {
15747
+ })), method(object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), object({ entries: array(NcHistoryEntrySchema) }), { auth: "admin" }), method(object({ artifactId: string().min(1) }), object({ url: string().nullable() }), { auth: "admin" }), method(object({}), object({ snoozes: array(NcSnoozeSchema) }), { caller: "required" }), method(object({ snooze: NcSnoozeInputSchema }), object({ snooze: NcSnoozeSchema }), {
15732
15748
  kind: "mutation",
15733
15749
  caller: "required"
15734
15750
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -25033,6 +25049,39 @@ var ReadGopBytesResultSchema = object({
25033
25049
  /** Media ms the returned fragment covers. */
25034
25050
  gopDurMs: number()
25035
25051
  });
25052
+ /**
25053
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
25054
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
25055
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
25056
+ * a replay needs several seconds of native pixels, not one frame.
25057
+ *
25058
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
25059
+ * is `false` when the returned bytes were cut short by the read's own safety
25060
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
25061
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
25062
+ * degradation: a window whose end falls past the covering segment would need
25063
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
25064
+ * not one standalone-demuxable stream — the caller's answer is to request a
25065
+ * shorter window or one aligned to a single segment, not to receive spliced
25066
+ * bytes nothing has proven decodable.
25067
+ */
25068
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
25069
+ kind: literal("ok"),
25070
+ data: _instanceof(Uint8Array),
25071
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
25072
+ * the requested `fromMs` (anchored on the nearest keyframe). */
25073
+ gopStartMs: number(),
25074
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
25075
+ gopDurMs: number(),
25076
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
25077
+ * the requested `toMs`; the caller got fewer frames than asked for. */
25078
+ reachesRequestedEnd: boolean()
25079
+ }), object({
25080
+ kind: literal("spans-multiple-segments"),
25081
+ /** Where the covering segment's own footage runs out — informational,
25082
+ * not a retry hint (retrying the same window would refuse again). */
25083
+ segmentEndMs: number()
25084
+ })]);
25036
25085
  method(object({
25037
25086
  deviceId: number(),
25038
25087
  fromMs: number(),
@@ -25083,6 +25132,15 @@ method(object({
25083
25132
  }), ReadGopBytesResultSchema, {
25084
25133
  kind: "query",
25085
25134
  auth: "admin"
25135
+ }), method(object({
25136
+ deviceId: number(),
25137
+ profile: string(),
25138
+ startMs: number(),
25139
+ fromMs: number(),
25140
+ toMs: number()
25141
+ }), ReadWindowBytesResultSchema, {
25142
+ kind: "query",
25143
+ auth: "admin"
25086
25144
  }), method(object({
25087
25145
  deviceId: number(),
25088
25146
  config: RecordingConfigSchema
@@ -29501,6 +29559,12 @@ Object.freeze({
29501
29559
  addonId: null,
29502
29560
  access: "view"
29503
29561
  },
29562
+ "notificationRules.resolveArtifactUrl": {
29563
+ capName: "notification-rules",
29564
+ capScope: "system",
29565
+ addonId: null,
29566
+ access: "view"
29567
+ },
29504
29568
  "notificationRules.setAlarmConfig": {
29505
29569
  capName: "notification-rules",
29506
29570
  capScope: "system",
@@ -30905,6 +30969,12 @@ Object.freeze({
30905
30969
  addonId: null,
30906
30970
  access: "view"
30907
30971
  },
30972
+ "recording.readWindowBytes": {
30973
+ capName: "recording",
30974
+ capScope: "system",
30975
+ addonId: null,
30976
+ access: "view"
30977
+ },
30908
30978
  "recording.refreshStorageLocationsForMigration": {
30909
30979
  capName: "recording",
30910
30980
  capScope: "system",
@@ -33735,6 +33805,11 @@ Object.freeze({
33735
33805
  form: "single",
33736
33806
  optional: false
33737
33807
  }],
33808
+ "recording.readWindowBytes": [{
33809
+ name: "deviceId",
33810
+ form: "single",
33811
+ optional: false
33812
+ }],
33738
33813
  "recording.relocateFootage": [{
33739
33814
  name: "deviceId",
33740
33815
  form: "single",
@@ -15499,7 +15499,23 @@ var NcHistoryEntrySchema = object({
15499
15499
  updatedAt: number(),
15500
15500
  /** Failure detail — present on a `dead` row. */
15501
15501
  error: string().optional(),
15502
- subject: NcHistorySubjectSchema
15502
+ subject: NcHistorySubjectSchema,
15503
+ /**
15504
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15505
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15506
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15507
+ * every delivery attempt). Absent on a row still pending/dead, a row
15508
+ * delivered before this field shipped, or a wiring with no artefact index.
15509
+ *
15510
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15511
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15512
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15513
+ * also answers `null` for an id whose artefact has since expired past the
15514
+ * retained shelf's own age bound — the degrade a caller (the Home
15515
+ * Assistant export) must render as "no image right now", never as a
15516
+ * broken link.
15517
+ */
15518
+ artifactIds: array(string().min(1)).optional()
15503
15519
  });
15504
15520
  /**
15505
15521
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -15726,7 +15742,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
15726
15742
  }), method(object({}), object({
15727
15743
  catalog: array(NcConditionDescriptorSchema),
15728
15744
  taxonomy: NcTaxonomySchema.optional()
15729
- })), method(object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), object({ entries: array(NcHistoryEntrySchema) }), { auth: "admin" }), method(object({}), object({ snoozes: array(NcSnoozeSchema) }), { caller: "required" }), method(object({ snooze: NcSnoozeInputSchema }), object({ snooze: NcSnoozeSchema }), {
15745
+ })), method(object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), object({ entries: array(NcHistoryEntrySchema) }), { auth: "admin" }), method(object({ artifactId: string().min(1) }), object({ url: string().nullable() }), { auth: "admin" }), method(object({}), object({ snoozes: array(NcSnoozeSchema) }), { caller: "required" }), method(object({ snooze: NcSnoozeInputSchema }), object({ snooze: NcSnoozeSchema }), {
15730
15746
  kind: "mutation",
15731
15747
  caller: "required"
15732
15748
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -25031,6 +25047,39 @@ var ReadGopBytesResultSchema = object({
25031
25047
  /** Media ms the returned fragment covers. */
25032
25048
  gopDurMs: number()
25033
25049
  });
25050
+ /**
25051
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
25052
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
25053
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
25054
+ * a replay needs several seconds of native pixels, not one frame.
25055
+ *
25056
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
25057
+ * is `false` when the returned bytes were cut short by the read's own safety
25058
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
25059
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
25060
+ * degradation: a window whose end falls past the covering segment would need
25061
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
25062
+ * not one standalone-demuxable stream — the caller's answer is to request a
25063
+ * shorter window or one aligned to a single segment, not to receive spliced
25064
+ * bytes nothing has proven decodable.
25065
+ */
25066
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
25067
+ kind: literal("ok"),
25068
+ data: _instanceof(Uint8Array),
25069
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
25070
+ * the requested `fromMs` (anchored on the nearest keyframe). */
25071
+ gopStartMs: number(),
25072
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
25073
+ gopDurMs: number(),
25074
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
25075
+ * the requested `toMs`; the caller got fewer frames than asked for. */
25076
+ reachesRequestedEnd: boolean()
25077
+ }), object({
25078
+ kind: literal("spans-multiple-segments"),
25079
+ /** Where the covering segment's own footage runs out — informational,
25080
+ * not a retry hint (retrying the same window would refuse again). */
25081
+ segmentEndMs: number()
25082
+ })]);
25034
25083
  method(object({
25035
25084
  deviceId: number(),
25036
25085
  fromMs: number(),
@@ -25081,6 +25130,15 @@ method(object({
25081
25130
  }), ReadGopBytesResultSchema, {
25082
25131
  kind: "query",
25083
25132
  auth: "admin"
25133
+ }), method(object({
25134
+ deviceId: number(),
25135
+ profile: string(),
25136
+ startMs: number(),
25137
+ fromMs: number(),
25138
+ toMs: number()
25139
+ }), ReadWindowBytesResultSchema, {
25140
+ kind: "query",
25141
+ auth: "admin"
25084
25142
  }), method(object({
25085
25143
  deviceId: number(),
25086
25144
  config: RecordingConfigSchema
@@ -29499,6 +29557,12 @@ Object.freeze({
29499
29557
  addonId: null,
29500
29558
  access: "view"
29501
29559
  },
29560
+ "notificationRules.resolveArtifactUrl": {
29561
+ capName: "notification-rules",
29562
+ capScope: "system",
29563
+ addonId: null,
29564
+ access: "view"
29565
+ },
29502
29566
  "notificationRules.setAlarmConfig": {
29503
29567
  capName: "notification-rules",
29504
29568
  capScope: "system",
@@ -30903,6 +30967,12 @@ Object.freeze({
30903
30967
  addonId: null,
30904
30968
  access: "view"
30905
30969
  },
30970
+ "recording.readWindowBytes": {
30971
+ capName: "recording",
30972
+ capScope: "system",
30973
+ addonId: null,
30974
+ access: "view"
30975
+ },
30906
30976
  "recording.refreshStorageLocationsForMigration": {
30907
30977
  capName: "recording",
30908
30978
  capScope: "system",
@@ -33733,6 +33803,11 @@ Object.freeze({
33733
33803
  form: "single",
33734
33804
  optional: false
33735
33805
  }],
33806
+ "recording.readWindowBytes": [{
33807
+ name: "deviceId",
33808
+ form: "single",
33809
+ optional: false
33810
+ }],
33736
33811
  "recording.relocateFootage": [{
33737
33812
  name: "deviceId",
33738
33813
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-smtp-nodemailer",
3
- "version": "1.2.29",
3
+ "version": "1.2.30",
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",