@camstack/addon-smtp-nodemailer 1.2.100 → 1.2.101

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.
@@ -36,7 +36,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
36
36
  }) : target, mod));
37
37
  var __toCommonJS = (mod) => __hasOwnProp.call(mod, "module.exports") ? mod["module.exports"] : __copyProps(__defProp({}, "__esModule", { value: true }), mod);
38
38
  //#endregion
39
- //#region ../types/dist/event-category-ZyX6jcse.mjs
39
+ //#region ../types/dist/event-category-BVDXG4tB.mjs
40
40
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
41
41
  EventCategory["SystemBoot"] = "system.boot";
42
42
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -653,6 +653,20 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
653
653
  * pull-reconcile from the provider's `getStatus` on reconnect. */
654
654
  EventCategory["MeshNetworkChanged"] = "network.mesh.changed";
655
655
  EventCategory["BackupCompleted"] = "backup.completed";
656
+ /**
657
+ * A whole backup RUN finished — every destination attempted, win or lose.
658
+ *
659
+ * `backup.completed` fires once per DESTINATION, which is the right grain for
660
+ * a progress UI and the wrong one for a notification: an operator with three
661
+ * destinations would be told three times. And a run where two of three
662
+ * destinations succeeded is not a clean success — a single "backup
663
+ * completed" that hid the failed one would be a lie, so the count of each is
664
+ * carried here and the message says both.
665
+ *
666
+ * Emitted by the backup orchestrator only after the destination loop, so a
667
+ * run that dies during the BUILD phase produces no completion at all.
668
+ */
669
+ EventCategory["BackupRunCompleted"] = "backup.run-completed";
656
670
  EventCategory["BackupRestored"] = "backup.restored";
657
671
  EventCategory["NotificationDispatched"] = "notification.dispatched";
658
672
  EventCategory["NotificationFailed"] = "notification.failed";
@@ -5383,7 +5397,7 @@ var ZodIssueCode = {
5383
5397
  var ZodFirstPartyTypeKind;
5384
5398
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5385
5399
  //#endregion
5386
- //#region ../types/dist/sleep-DBKu2-U5.mjs
5400
+ //#region ../types/dist/sleep-DEuj7E3j.mjs
5387
5401
  /**
5388
5402
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5389
5403
  * window to float samples (D455).
@@ -11511,6 +11525,58 @@ method(ListInputSchema, array(BrokerInfoSchema$1)), method(GetInputSchema, Broke
11511
11525
  auth: "admin"
11512
11526
  }), method(GetStateInputSchema, unknown().nullable()), method(_void(), RegistryStatusSchema);
11513
11527
  DeviceType.Camera;
11528
+ /**
11529
+ * The signals a device can emit to WAKE its own stream.
11530
+ *
11531
+ * A camera whose stream is built on demand sleeps until something asks for it,
11532
+ * and "something" cannot be a consumer that is merely attached — a Frigate-style
11533
+ * puller holds a session open for ever, and treating that as demand would keep
11534
+ * a battery camera awake for ever, which is the whole thing the battery is for
11535
+ * (D173). So the wake has to come from the CAMERA: an event it noticed by
11536
+ * itself, with no stream running.
11537
+ *
11538
+ * ## The vocabulary is the PROVIDER'S, not ours
11539
+ *
11540
+ * Like `consumables`, this cap declares no vocabulary of its own. A provider
11541
+ * names each signal with a `code` it chooses and a `label` an operator reads.
11542
+ * Reolink offers motion and camera-native detection; another provider may offer
11543
+ * a tamper, a doorbell press, a PIR, or something no camera in this fleet has
11544
+ * yet. A fixed enum here would mean every new signal is a framework release.
11545
+ *
11546
+ * It is deliberately NOT derived from the caps a device already binds. Whether
11547
+ * a camera CAN push firmware motion is expressed by `motionSources` containing
11548
+ * `'onboard'`, and whether it does AI on-camera by the `native-object-detection`
11549
+ * binding — but both answer "what drives the detection pipeline", which is a
11550
+ * different question from "what may wake a sleeping stream". A camera can do
11551
+ * the first and not be trusted with the second, and the operator picks per
11552
+ * camera. Two questions, two authorities.
11553
+ *
11554
+ * ## Availability is not permission
11555
+ *
11556
+ * `listSignals` says what the device CAN emit. Whether a given signal actually
11557
+ * wakes the stream is the operator's per-camera choice, held by the broker
11558
+ * alongside the cooldown — see the stream-broker cap's wake settings. A
11559
+ * provider declaring a signal is not a provider enabling it.
11560
+ */
11561
+ /** One signal a device can emit. */
11562
+ var StreamSignalSchema = object({
11563
+ /** Stable id chosen by the provider, e.g. `'motion'`, `'person'`, `'tamper'`. */
11564
+ code: string().min(1),
11565
+ /** What an operator reads in the picker. The provider's own wording. */
11566
+ label: string().min(1),
11567
+ /**
11568
+ * Whether the provider recommends this signal ON when a camera is first set
11569
+ * up. A provider knows which of its signals are cheap and reliable; an
11570
+ * operator should not have to discover that by trial. Reolink recommends
11571
+ * both of its own.
11572
+ */
11573
+ recommended: boolean()
11574
+ });
11575
+ object({
11576
+ signals: array(StreamSignalSchema),
11577
+ lastFetchedAt: number()
11578
+ });
11579
+ Object.values(DeviceType), method(_void(), array(StreamSignalSchema).readonly());
11514
11580
  /** Stream delivery format. (Relocated from the retired `streaming-engine` cap.) */
11515
11581
  var StreamFormatSchema = _enum([
11516
11582
  "webrtc",
@@ -11907,6 +11973,22 @@ var EgressTranscodeSchema = object({
11907
11973
  camStreamId: string().nullable()
11908
11974
  });
11909
11975
  method(object({
11976
+ deviceId: number().int().nonnegative(),
11977
+ /** The provider's signal code. */
11978
+ code: string().min(1),
11979
+ /** Ms epoch. Absent ⇒ now. */
11980
+ at: number().optional()
11981
+ }), object({
11982
+ /** Whether the broker acted on it, and if not, why. */
11983
+ accepted: boolean(),
11984
+ reason: _enum([
11985
+ "woke",
11986
+ "hold-extended",
11987
+ "not-enabled",
11988
+ "no-consumer",
11989
+ "unknown-code"
11990
+ ])
11991
+ }), { kind: "mutation" }), method(object({
11910
11992
  deviceId: number().int().nonnegative(),
11911
11993
  camStreamId: string().min(1),
11912
11994
  kind: CamStreamKindSchema,
@@ -12161,6 +12243,16 @@ var PickStreamRequirementsSchema = object({
12161
12243
  acceptCodecs: array(StreamCodecSchema).readonly().optional(),
12162
12244
  /** Minimum vertical resolution. Streams shorter than this are dropped. */
12163
12245
  minHeight: number().int().positive().optional(),
12246
+ /**
12247
+ * Maximum vertical resolution. Streams TALLER than this are dropped.
12248
+ *
12249
+ * A consumer can have a ceiling as real as its floor: Alexa documents
12250
+ * 480p to 1080p, and a 4K stream is as unusable to an Echo as a 360p one.
12251
+ * Without this the ceiling had to be re-implemented by every caller — and
12252
+ * one caller implementing it privately is how a second scoring authority
12253
+ * gets born.
12254
+ */
12255
+ maxHeight: number().int().positive().optional(),
12164
12256
  /** Minimum horizontal resolution. */
12165
12257
  minWidth: number().int().positive().optional(),
12166
12258
  /**
@@ -12177,7 +12269,22 @@ var PickStreamRequirementsSchema = object({
12177
12269
  * transcoded" guard: if the device is already serving the consumer's
12178
12270
  * codec end-to-end, there's nothing to optimise.
12179
12271
  */
12180
- requireSiblingCodec: array(StreamCodecSchema).readonly().optional()
12272
+ requireSiblingCodec: array(StreamCodecSchema).readonly().optional(),
12273
+ /**
12274
+ * Whether a stream the consumer CANNOT decode may still be picked, on the
12275
+ * understanding that it will be transcoded.
12276
+ *
12277
+ * Default `false` — today's behaviour, and the right one for a bypass
12278
+ * question ("is there a stream I can forward untouched?"). Set `true` to
12279
+ * ask the larger question: "what is the best stream for me, transcoding if
12280
+ * I must?" A stream that satisfies `acceptCodecs` always outranks one that
12281
+ * does not, so a passthrough is never lost to a transcode; the answer says
12282
+ * which it is in {@link PickedCamStreamSchema.transcodes}.
12283
+ *
12284
+ * This is what lets one picker serve both the bypass and the full source
12285
+ * choice, instead of a consumer scoring privately when the bypass misses.
12286
+ */
12287
+ allowTranscode: boolean().optional()
12181
12288
  }).readonly();
12182
12289
  var PickStreamPreferencesSchema = object({
12183
12290
  /**
@@ -12191,12 +12298,32 @@ var PickStreamPreferencesSchema = object({
12191
12298
  * picks the tallest stream; `'lowest'` picks the shortest (used by
12192
12299
  * memory-constrained consumers / Apple Home guest sessions).
12193
12300
  */
12194
- resolutionPreference: _enum(["highest", "lowest"]).optional()
12301
+ resolutionPreference: _enum(["highest", "lowest"]).optional(),
12302
+ /**
12303
+ * The height the consumer actually wants to DELIVER.
12304
+ *
12305
+ * Not a constraint — an ordering. With it set, the SMALLEST stream at or
12306
+ * above the target wins, and only if nothing reaches it does the tallest
12307
+ * take over. Pulling 1296 lines to draw 720 on a 1280x800 Echo panel costs
12308
+ * a decode and buys nothing, and `resolutionPreference: 'highest'` cannot
12309
+ * express that: it says "as big as possible", which is a different wish.
12310
+ *
12311
+ * Ignored when absent, so every existing caller keeps its ordering.
12312
+ */
12313
+ targetHeight: number().int().positive().optional()
12195
12314
  }).readonly();
12196
12315
  var PickedCamStreamSchema = object({
12197
12316
  camStreamId: string(),
12198
12317
  codec: string().optional(),
12199
12318
  resolution: CamStreamResolutionSchema.optional(),
12319
+ /**
12320
+ * Whether serving this stream requires a decode + re-encode.
12321
+ *
12322
+ * `false` is a stream the consumer can take as it stands. Only ever `true`
12323
+ * when the caller asked for it with `allowTranscode`, so a caller that did
12324
+ * not ask cannot be handed a cost it never agreed to pay.
12325
+ */
12326
+ transcodes: boolean(),
12200
12327
  /** One-line explanation of why this stream won — for logs / debug UI. */
12201
12328
  reason: string()
12202
12329
  });
@@ -16385,6 +16512,8 @@ var NcSystemEventKindSchema = _enum([
16385
16512
  "device-enabled",
16386
16513
  "device-battery-low",
16387
16514
  "device-battery-normal",
16515
+ "device-consumable-low",
16516
+ "device-consumable-normal",
16388
16517
  "stream-online",
16389
16518
  "stream-offline",
16390
16519
  "node-online",
@@ -16403,6 +16532,7 @@ var NcSystemEventKindSchema = _enum([
16403
16532
  "addon-updated",
16404
16533
  "server-updated",
16405
16534
  "export-completed",
16535
+ "backup-completed",
16406
16536
  "camera-online",
16407
16537
  "camera-offline",
16408
16538
  "camera-disabled",
@@ -23657,10 +23787,28 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
23657
23787
  }), boolean()), method(object({
23658
23788
  deviceId: number().int().nonnegative(),
23659
23789
  sessionId: string()
23660
- }), object({ pendingRenegotiation: object({
23661
- target: WebrtcStreamTargetSchema,
23662
- epoch: number()
23663
- }).nullable() }));
23790
+ }), object({
23791
+ pendingRenegotiation: object({
23792
+ target: WebrtcStreamTargetSchema,
23793
+ epoch: number()
23794
+ }).nullable(),
23795
+ /**
23796
+ * Whether the session still EXISTS.
23797
+ *
23798
+ * A consumer that holds a resource for the life of a session needs to
23799
+ * be able to ask, because a session does not always end the way it
23800
+ * began. Measured on this hub 2026-09-13: an Echo that got stuck never
23801
+ * sent `SessionDisconnected`, so the Alexa exporter's
23802
+ * `releaseEgressTranscode` never ran, and a 2304x1296 HEVC to 720p
23803
+ * H.264 transcode kept running for NOBODY for more than twenty
23804
+ * minutes. The WebRTC session had logged `WebRTC session closed`
23805
+ * minutes earlier — the broker knew; the holder had no way to ask.
23806
+ *
23807
+ * `false` for a session id the provider has never heard of, which is
23808
+ * the same answer as "it ended": either way nothing is holding it up.
23809
+ */
23810
+ alive: boolean()
23811
+ }));
23664
23812
  object({
23665
23813
  /** All accessory children of the parent. */
23666
23814
  childDeviceIds: array(number()).readonly(),
@@ -36164,6 +36312,12 @@ Object.freeze({
36164
36312
  addonId: null,
36165
36313
  access: "create"
36166
36314
  },
36315
+ "streamBroker.reportStreamSignal": {
36316
+ capName: "stream-broker",
36317
+ capScope: "system",
36318
+ addonId: null,
36319
+ access: "create"
36320
+ },
36167
36321
  "streamBroker.restartProfile": {
36168
36322
  capName: "stream-broker",
36169
36323
  capScope: "system",
@@ -36248,6 +36402,12 @@ Object.freeze({
36248
36402
  addonId: null,
36249
36403
  access: "create"
36250
36404
  },
36405
+ "streamSignals.listSignals": {
36406
+ capName: "stream-signals",
36407
+ capScope: "device",
36408
+ addonId: null,
36409
+ access: "view"
36410
+ },
36251
36411
  "switch.setState": {
36252
36412
  capName: "switch",
36253
36413
  capScope: "device",
@@ -38620,6 +38780,11 @@ Object.freeze({
38620
38780
  form: "single",
38621
38781
  optional: false
38622
38782
  }],
38783
+ "streamBroker.reportStreamSignal": [{
38784
+ name: "deviceId",
38785
+ form: "single",
38786
+ optional: false
38787
+ }],
38623
38788
  "streamBroker.restartProfile": [{
38624
38789
  name: "deviceId",
38625
38790
  form: "single",
@@ -34,7 +34,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
34
34
  var __toCommonJS = (mod) => __hasOwnProp.call(mod, "module.exports") ? mod["module.exports"] : __copyProps(__defProp({}, "__esModule", { value: true }), mod);
35
35
  var __require = /* @__PURE__ */ createRequire(import.meta.url);
36
36
  //#endregion
37
- //#region ../types/dist/event-category-ZyX6jcse.mjs
37
+ //#region ../types/dist/event-category-BVDXG4tB.mjs
38
38
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
39
39
  EventCategory["SystemBoot"] = "system.boot";
40
40
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -651,6 +651,20 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
651
651
  * pull-reconcile from the provider's `getStatus` on reconnect. */
652
652
  EventCategory["MeshNetworkChanged"] = "network.mesh.changed";
653
653
  EventCategory["BackupCompleted"] = "backup.completed";
654
+ /**
655
+ * A whole backup RUN finished — every destination attempted, win or lose.
656
+ *
657
+ * `backup.completed` fires once per DESTINATION, which is the right grain for
658
+ * a progress UI and the wrong one for a notification: an operator with three
659
+ * destinations would be told three times. And a run where two of three
660
+ * destinations succeeded is not a clean success — a single "backup
661
+ * completed" that hid the failed one would be a lie, so the count of each is
662
+ * carried here and the message says both.
663
+ *
664
+ * Emitted by the backup orchestrator only after the destination loop, so a
665
+ * run that dies during the BUILD phase produces no completion at all.
666
+ */
667
+ EventCategory["BackupRunCompleted"] = "backup.run-completed";
654
668
  EventCategory["BackupRestored"] = "backup.restored";
655
669
  EventCategory["NotificationDispatched"] = "notification.dispatched";
656
670
  EventCategory["NotificationFailed"] = "notification.failed";
@@ -5381,7 +5395,7 @@ var ZodIssueCode = {
5381
5395
  var ZodFirstPartyTypeKind;
5382
5396
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5383
5397
  //#endregion
5384
- //#region ../types/dist/sleep-DBKu2-U5.mjs
5398
+ //#region ../types/dist/sleep-DEuj7E3j.mjs
5385
5399
  /**
5386
5400
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5387
5401
  * window to float samples (D455).
@@ -11509,6 +11523,58 @@ method(ListInputSchema, array(BrokerInfoSchema$1)), method(GetInputSchema, Broke
11509
11523
  auth: "admin"
11510
11524
  }), method(GetStateInputSchema, unknown().nullable()), method(_void(), RegistryStatusSchema);
11511
11525
  DeviceType.Camera;
11526
+ /**
11527
+ * The signals a device can emit to WAKE its own stream.
11528
+ *
11529
+ * A camera whose stream is built on demand sleeps until something asks for it,
11530
+ * and "something" cannot be a consumer that is merely attached — a Frigate-style
11531
+ * puller holds a session open for ever, and treating that as demand would keep
11532
+ * a battery camera awake for ever, which is the whole thing the battery is for
11533
+ * (D173). So the wake has to come from the CAMERA: an event it noticed by
11534
+ * itself, with no stream running.
11535
+ *
11536
+ * ## The vocabulary is the PROVIDER'S, not ours
11537
+ *
11538
+ * Like `consumables`, this cap declares no vocabulary of its own. A provider
11539
+ * names each signal with a `code` it chooses and a `label` an operator reads.
11540
+ * Reolink offers motion and camera-native detection; another provider may offer
11541
+ * a tamper, a doorbell press, a PIR, or something no camera in this fleet has
11542
+ * yet. A fixed enum here would mean every new signal is a framework release.
11543
+ *
11544
+ * It is deliberately NOT derived from the caps a device already binds. Whether
11545
+ * a camera CAN push firmware motion is expressed by `motionSources` containing
11546
+ * `'onboard'`, and whether it does AI on-camera by the `native-object-detection`
11547
+ * binding — but both answer "what drives the detection pipeline", which is a
11548
+ * different question from "what may wake a sleeping stream". A camera can do
11549
+ * the first and not be trusted with the second, and the operator picks per
11550
+ * camera. Two questions, two authorities.
11551
+ *
11552
+ * ## Availability is not permission
11553
+ *
11554
+ * `listSignals` says what the device CAN emit. Whether a given signal actually
11555
+ * wakes the stream is the operator's per-camera choice, held by the broker
11556
+ * alongside the cooldown — see the stream-broker cap's wake settings. A
11557
+ * provider declaring a signal is not a provider enabling it.
11558
+ */
11559
+ /** One signal a device can emit. */
11560
+ var StreamSignalSchema = object({
11561
+ /** Stable id chosen by the provider, e.g. `'motion'`, `'person'`, `'tamper'`. */
11562
+ code: string().min(1),
11563
+ /** What an operator reads in the picker. The provider's own wording. */
11564
+ label: string().min(1),
11565
+ /**
11566
+ * Whether the provider recommends this signal ON when a camera is first set
11567
+ * up. A provider knows which of its signals are cheap and reliable; an
11568
+ * operator should not have to discover that by trial. Reolink recommends
11569
+ * both of its own.
11570
+ */
11571
+ recommended: boolean()
11572
+ });
11573
+ object({
11574
+ signals: array(StreamSignalSchema),
11575
+ lastFetchedAt: number()
11576
+ });
11577
+ Object.values(DeviceType), method(_void(), array(StreamSignalSchema).readonly());
11512
11578
  /** Stream delivery format. (Relocated from the retired `streaming-engine` cap.) */
11513
11579
  var StreamFormatSchema = _enum([
11514
11580
  "webrtc",
@@ -11905,6 +11971,22 @@ var EgressTranscodeSchema = object({
11905
11971
  camStreamId: string().nullable()
11906
11972
  });
11907
11973
  method(object({
11974
+ deviceId: number().int().nonnegative(),
11975
+ /** The provider's signal code. */
11976
+ code: string().min(1),
11977
+ /** Ms epoch. Absent ⇒ now. */
11978
+ at: number().optional()
11979
+ }), object({
11980
+ /** Whether the broker acted on it, and if not, why. */
11981
+ accepted: boolean(),
11982
+ reason: _enum([
11983
+ "woke",
11984
+ "hold-extended",
11985
+ "not-enabled",
11986
+ "no-consumer",
11987
+ "unknown-code"
11988
+ ])
11989
+ }), { kind: "mutation" }), method(object({
11908
11990
  deviceId: number().int().nonnegative(),
11909
11991
  camStreamId: string().min(1),
11910
11992
  kind: CamStreamKindSchema,
@@ -12159,6 +12241,16 @@ var PickStreamRequirementsSchema = object({
12159
12241
  acceptCodecs: array(StreamCodecSchema).readonly().optional(),
12160
12242
  /** Minimum vertical resolution. Streams shorter than this are dropped. */
12161
12243
  minHeight: number().int().positive().optional(),
12244
+ /**
12245
+ * Maximum vertical resolution. Streams TALLER than this are dropped.
12246
+ *
12247
+ * A consumer can have a ceiling as real as its floor: Alexa documents
12248
+ * 480p to 1080p, and a 4K stream is as unusable to an Echo as a 360p one.
12249
+ * Without this the ceiling had to be re-implemented by every caller — and
12250
+ * one caller implementing it privately is how a second scoring authority
12251
+ * gets born.
12252
+ */
12253
+ maxHeight: number().int().positive().optional(),
12162
12254
  /** Minimum horizontal resolution. */
12163
12255
  minWidth: number().int().positive().optional(),
12164
12256
  /**
@@ -12175,7 +12267,22 @@ var PickStreamRequirementsSchema = object({
12175
12267
  * transcoded" guard: if the device is already serving the consumer's
12176
12268
  * codec end-to-end, there's nothing to optimise.
12177
12269
  */
12178
- requireSiblingCodec: array(StreamCodecSchema).readonly().optional()
12270
+ requireSiblingCodec: array(StreamCodecSchema).readonly().optional(),
12271
+ /**
12272
+ * Whether a stream the consumer CANNOT decode may still be picked, on the
12273
+ * understanding that it will be transcoded.
12274
+ *
12275
+ * Default `false` — today's behaviour, and the right one for a bypass
12276
+ * question ("is there a stream I can forward untouched?"). Set `true` to
12277
+ * ask the larger question: "what is the best stream for me, transcoding if
12278
+ * I must?" A stream that satisfies `acceptCodecs` always outranks one that
12279
+ * does not, so a passthrough is never lost to a transcode; the answer says
12280
+ * which it is in {@link PickedCamStreamSchema.transcodes}.
12281
+ *
12282
+ * This is what lets one picker serve both the bypass and the full source
12283
+ * choice, instead of a consumer scoring privately when the bypass misses.
12284
+ */
12285
+ allowTranscode: boolean().optional()
12179
12286
  }).readonly();
12180
12287
  var PickStreamPreferencesSchema = object({
12181
12288
  /**
@@ -12189,12 +12296,32 @@ var PickStreamPreferencesSchema = object({
12189
12296
  * picks the tallest stream; `'lowest'` picks the shortest (used by
12190
12297
  * memory-constrained consumers / Apple Home guest sessions).
12191
12298
  */
12192
- resolutionPreference: _enum(["highest", "lowest"]).optional()
12299
+ resolutionPreference: _enum(["highest", "lowest"]).optional(),
12300
+ /**
12301
+ * The height the consumer actually wants to DELIVER.
12302
+ *
12303
+ * Not a constraint — an ordering. With it set, the SMALLEST stream at or
12304
+ * above the target wins, and only if nothing reaches it does the tallest
12305
+ * take over. Pulling 1296 lines to draw 720 on a 1280x800 Echo panel costs
12306
+ * a decode and buys nothing, and `resolutionPreference: 'highest'` cannot
12307
+ * express that: it says "as big as possible", which is a different wish.
12308
+ *
12309
+ * Ignored when absent, so every existing caller keeps its ordering.
12310
+ */
12311
+ targetHeight: number().int().positive().optional()
12193
12312
  }).readonly();
12194
12313
  var PickedCamStreamSchema = object({
12195
12314
  camStreamId: string(),
12196
12315
  codec: string().optional(),
12197
12316
  resolution: CamStreamResolutionSchema.optional(),
12317
+ /**
12318
+ * Whether serving this stream requires a decode + re-encode.
12319
+ *
12320
+ * `false` is a stream the consumer can take as it stands. Only ever `true`
12321
+ * when the caller asked for it with `allowTranscode`, so a caller that did
12322
+ * not ask cannot be handed a cost it never agreed to pay.
12323
+ */
12324
+ transcodes: boolean(),
12198
12325
  /** One-line explanation of why this stream won — for logs / debug UI. */
12199
12326
  reason: string()
12200
12327
  });
@@ -16383,6 +16510,8 @@ var NcSystemEventKindSchema = _enum([
16383
16510
  "device-enabled",
16384
16511
  "device-battery-low",
16385
16512
  "device-battery-normal",
16513
+ "device-consumable-low",
16514
+ "device-consumable-normal",
16386
16515
  "stream-online",
16387
16516
  "stream-offline",
16388
16517
  "node-online",
@@ -16401,6 +16530,7 @@ var NcSystemEventKindSchema = _enum([
16401
16530
  "addon-updated",
16402
16531
  "server-updated",
16403
16532
  "export-completed",
16533
+ "backup-completed",
16404
16534
  "camera-online",
16405
16535
  "camera-offline",
16406
16536
  "camera-disabled",
@@ -23655,10 +23785,28 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
23655
23785
  }), boolean()), method(object({
23656
23786
  deviceId: number().int().nonnegative(),
23657
23787
  sessionId: string()
23658
- }), object({ pendingRenegotiation: object({
23659
- target: WebrtcStreamTargetSchema,
23660
- epoch: number()
23661
- }).nullable() }));
23788
+ }), object({
23789
+ pendingRenegotiation: object({
23790
+ target: WebrtcStreamTargetSchema,
23791
+ epoch: number()
23792
+ }).nullable(),
23793
+ /**
23794
+ * Whether the session still EXISTS.
23795
+ *
23796
+ * A consumer that holds a resource for the life of a session needs to
23797
+ * be able to ask, because a session does not always end the way it
23798
+ * began. Measured on this hub 2026-09-13: an Echo that got stuck never
23799
+ * sent `SessionDisconnected`, so the Alexa exporter's
23800
+ * `releaseEgressTranscode` never ran, and a 2304x1296 HEVC to 720p
23801
+ * H.264 transcode kept running for NOBODY for more than twenty
23802
+ * minutes. The WebRTC session had logged `WebRTC session closed`
23803
+ * minutes earlier — the broker knew; the holder had no way to ask.
23804
+ *
23805
+ * `false` for a session id the provider has never heard of, which is
23806
+ * the same answer as "it ended": either way nothing is holding it up.
23807
+ */
23808
+ alive: boolean()
23809
+ }));
23662
23810
  object({
23663
23811
  /** All accessory children of the parent. */
23664
23812
  childDeviceIds: array(number()).readonly(),
@@ -36162,6 +36310,12 @@ Object.freeze({
36162
36310
  addonId: null,
36163
36311
  access: "create"
36164
36312
  },
36313
+ "streamBroker.reportStreamSignal": {
36314
+ capName: "stream-broker",
36315
+ capScope: "system",
36316
+ addonId: null,
36317
+ access: "create"
36318
+ },
36165
36319
  "streamBroker.restartProfile": {
36166
36320
  capName: "stream-broker",
36167
36321
  capScope: "system",
@@ -36246,6 +36400,12 @@ Object.freeze({
36246
36400
  addonId: null,
36247
36401
  access: "create"
36248
36402
  },
36403
+ "streamSignals.listSignals": {
36404
+ capName: "stream-signals",
36405
+ capScope: "device",
36406
+ addonId: null,
36407
+ access: "view"
36408
+ },
36249
36409
  "switch.setState": {
36250
36410
  capName: "switch",
36251
36411
  capScope: "device",
@@ -38618,6 +38778,11 @@ Object.freeze({
38618
38778
  form: "single",
38619
38779
  optional: false
38620
38780
  }],
38781
+ "streamBroker.reportStreamSignal": [{
38782
+ name: "deviceId",
38783
+ form: "single",
38784
+ optional: false
38785
+ }],
38621
38786
  "streamBroker.restartProfile": [{
38622
38787
  name: "deviceId",
38623
38788
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-smtp-nodemailer",
3
- "version": "1.2.100",
3
+ "version": "1.2.101",
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",