@camstack/addon-smtp-nodemailer 1.2.126 → 1.2.128

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.
@@ -5451,7 +5451,7 @@ var ZodIssueCode = {
5451
5451
  var ZodFirstPartyTypeKind;
5452
5452
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5453
5453
  //#endregion
5454
- //#region ../types/dist/sleep-yKL5gfrH.mjs
5454
+ //#region ../types/dist/sleep-BSuCCFjf.mjs
5455
5455
  /**
5456
5456
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5457
5457
  * window to float samples (D455).
@@ -16844,7 +16844,19 @@ var DeviceHistorySubjectSchema = discriminatedUnion("kind", [object({
16844
16844
  kind: literal("node"),
16845
16845
  nodeId: string().min(1)
16846
16846
  })]);
16847
+ /**
16848
+ * `enum` stores a STATE as the ordinal of its value in the series' value list
16849
+ * (`DeviceHistorySeriesInfo.values`, append-only, so an ordinal never changes
16850
+ * meaning); a rollup keeps the time spent in each state (`states`).
16851
+ */
16847
16852
  var DeviceHistoryKindSchema = _enum([
16853
+ "gauge",
16854
+ "counter",
16855
+ "boolean",
16856
+ "enum"
16857
+ ]);
16858
+ /** What a PRODUCER may declare. `enum` is cap-only: its value list is the cap field's. */
16859
+ var DeviceHistoryProducerKindSchema = _enum([
16848
16860
  "gauge",
16849
16861
  "counter",
16850
16862
  "boolean"
@@ -16881,7 +16893,13 @@ var SeriesInfoSchema = object({
16881
16893
  /** `null` is unknown (a `unitFrom` series whose device does not state a unit right now), never a guess. */
16882
16894
  unit: string().nullable(),
16883
16895
  displayName: string(),
16884
- source: _enum(["cap", "addon"]),
16896
+ source: _enum([
16897
+ "cap",
16898
+ "addon",
16899
+ "derived"
16900
+ ]),
16901
+ /** `enum`: the value of each ordinal (index = ordinal); `null` for every other kind. */
16902
+ values: array(string()).readonly().nullable(),
16885
16903
  firstTs: number(),
16886
16904
  lastTs: number()
16887
16905
  });
@@ -16895,17 +16913,31 @@ var QueryPointSchema = object({
16895
16913
  twMean: number().nullable(),
16896
16914
  min: number(),
16897
16915
  max: number(),
16898
- /** `null` is unknown, never zero (D393). */
16899
- last: number().nullable()
16916
+ /** `null` is unknown, never zero (D393). For an `enum` series: the ordinal of {@link state}. */
16917
+ last: number().nullable(),
16918
+ /**
16919
+ * The increase over the point: a `counter`'s growth since the previous point
16920
+ * or bucket (a drop is a reset, counted from zero), and for
16921
+ * {@link DEVICE_HISTORY_ENERGY_KEY} the kWh used in the bucket. `null` for
16922
+ * every other kind, and when it cannot be known.
16923
+ */
16924
+ delta: number().nullable(),
16925
+ /** `enum`: the state in force at the end of the point (the name of `last`); `null` otherwise. */
16926
+ state: string().nullable(),
16927
+ /** `enum` rollup: milliseconds spent in each state inside the bucket; `null` for raw points and other kinds. */
16928
+ states: record(string(), number()).nullable()
16900
16929
  });
16901
16930
  var QuerySeriesSchema = object({
16902
16931
  scope: string(),
16903
16932
  /** The last point STRICTLY BEFORE `from` in the chosen tier, so a step chart can start at the held value. */
16904
16933
  before: object({
16905
16934
  t: number(),
16906
- value: number().nullable()
16935
+ value: number().nullable(),
16936
+ state: string().nullable()
16907
16937
  }).nullable(),
16908
- points: array(QueryPointSchema).readonly()
16938
+ points: array(QueryPointSchema).readonly(),
16939
+ /** A derived key: the stored key its points were computed from; `null` for a stored series. */
16940
+ derivedFrom: string().nullable()
16909
16941
  });
16910
16942
  /** The window part of a query, shared by the device and node forms. */
16911
16943
  var QueryWindowShape = {
@@ -16921,6 +16953,23 @@ var QueryResultSchema = object({
16921
16953
  series: array(QuerySeriesSchema).readonly(),
16922
16954
  truncated: boolean()
16923
16955
  });
16956
+ /** One read of a batch: a device's key or a node's key (exactly one subject). */
16957
+ var QueryManyItemSchema = union([object({
16958
+ deviceId: number().int(),
16959
+ key: string(),
16960
+ scope: string().optional()
16961
+ }), object({
16962
+ forNodeId: string().min(1),
16963
+ key: string(),
16964
+ scope: string().optional()
16965
+ })]);
16966
+ var QueryManyEntrySchema = discriminatedUnion("ok", [object({
16967
+ ok: literal(true),
16968
+ result: QueryResultSchema
16969
+ }), object({
16970
+ ok: literal(false),
16971
+ error: string()
16972
+ })]);
16924
16973
  var TierStatusSchema = object({
16925
16974
  tier: DeviceHistoryResolutionSchema,
16926
16975
  /** `null` until the first background count answered. */
@@ -16976,16 +17025,22 @@ var DeviceHistoryStatusSchema = object({
16976
17025
  lastRefreshAt: number().nullable()
16977
17026
  })
16978
17027
  });
16979
- method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly()), method(object({ nodeId: string().min(1) }), array(SeriesInfoSchema).readonly(), { auth: "admin" }), method(object({
17028
+ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly()), method(object({ forNodeId: string().min(1) }), array(SeriesInfoSchema).readonly(), { auth: "admin" }), method(object({
16980
17029
  deviceId: number().int(),
16981
17030
  ...QueryWindowShape
16982
17031
  }), QueryResultSchema), method(object({
16983
- nodeId: string().min(1),
17032
+ forNodeId: string().min(1),
16984
17033
  ...QueryWindowShape
16985
17034
  }), QueryResultSchema, { auth: "admin" }), method(object({
17035
+ items: array(QueryManyItemSchema).min(1).max(24),
17036
+ from: QueryWindowShape.from,
17037
+ to: QueryWindowShape.to,
17038
+ resolution: QueryWindowShape.resolution,
17039
+ maxPoints: QueryWindowShape.maxPoints
17040
+ }), object({ results: array(QueryManyEntrySchema).readonly() }), { auth: "admin" }), method(object({
16986
17041
  name: string().regex(/^[a-z0-9-]+$/),
16987
17042
  subjectKind: _enum(["device", "node"]),
16988
- kind: DeviceHistoryKindSchema,
17043
+ kind: DeviceHistoryProducerKindSchema,
16989
17044
  unit: string().optional(),
16990
17045
  displayName: string().min(1),
16991
17046
  ingest: _enum(["points", "buckets"])
@@ -40002,14 +40057,106 @@ var LogEntrySchema = object({
40002
40057
  meta: record(string(), unknown()).optional(),
40003
40058
  tags: record(string(), string()).optional()
40004
40059
  });
40005
- method(LogEntrySchema, _void(), { kind: "mutation" }), method(object({
40006
- scope: array(string()).optional(),
40060
+ /**
40061
+ * A history READ against one destination (D898).
40062
+ *
40063
+ * Every filter is applied by the PROVIDER, before the limit — a filter the
40064
+ * browser applied after the limit is what made a rare device's lines
40065
+ * unreachable behind a busy one's. `before` / `after` are cursors the provider
40066
+ * minted (opaque to everyone else): a file position for the rotated files, a
40067
+ * nanosecond timestamp for Loki.
40068
+ *
40069
+ * A read is BOUNDED by `budgetMs`: a filter that matches nothing on a 30-day
40070
+ * store answers `done: false` with the cursor it reached and the bytes it
40071
+ * scanned, and the caller decides whether to go on. That is what makes a long
40072
+ * scan show progress and stop when asked — `cancelRead` ends the slice in
40073
+ * flight, and not asking for the next slice ends the scan.
40074
+ */
40075
+ var LogReadQuerySchema = object({
40076
+ /** Correlates `cancelRead`. Caller-chosen, unique per in-flight read. */
40077
+ requestId: string().min(1).max(64).optional(),
40078
+ /** The device the line is about (`tags.deviceId`, numeric). */
40079
+ deviceId: number().int().optional(),
40080
+ /**
40081
+ * The emitting addon — bare manifest id; `@<version>` / `::<sub>` suffixes
40082
+ * match. Not `addonId`: a cap router reads that name as "which provider".
40083
+ */
40084
+ fromAddonId: string().min(1).max(200).optional(),
40085
+ /**
40086
+ * The emitting node: matches the agent that emitted the line, the node
40087
+ * itself, or a worker under it (`<agent>/<runner>`) — the `agentId`
40088
+ * semantics of `matchesLogTags`. Not `nodeId`: a cap router reads that
40089
+ * name as "which node's provider".
40090
+ */
40091
+ fromNodeId: string().min(1).max(200).optional(),
40092
+ /** Any other tag, exact match (AND). */
40093
+ tags: record(string(), union([string(), number()])).optional(),
40094
+ /** Severity FLOOR: this level and above. */
40007
40095
  level: LogLevelSchema.optional(),
40008
- since: date().optional(),
40009
- until: date().optional(),
40010
- limit: number().optional(),
40011
- tags: record(string(), string()).optional()
40012
- }), array(LogEntrySchema).readonly());
40096
+ /** Case-insensitive substring over message, scope, tag values and meta values. */
40097
+ text: string().min(1).max(200).optional(),
40098
+ /** Epoch ms, inclusive. */
40099
+ since: number().optional(),
40100
+ /** Epoch ms, inclusive. */
40101
+ until: number().optional(),
40102
+ /** Older than this cursor (exclusive). Absent with `after` absent ⇒ from the newest. */
40103
+ before: string().min(1).max(1024).optional(),
40104
+ /** Newer than this cursor (exclusive). */
40105
+ after: string().min(1).max(1024).optional(),
40106
+ limit: number().int().min(1).max(1e3).optional(),
40107
+ /** Wall-clock bound of this slice. The provider caps it. */
40108
+ budgetMs: number().int().min(50).max(1e4).optional()
40109
+ });
40110
+ var LogReadResultSchema = object({
40111
+ /** Newest first. */
40112
+ entries: array(object({
40113
+ /** `<bootId>.<seq>` minted by the emitting LogManager — the dedupe key. */
40114
+ id: string().optional(),
40115
+ /** Epoch ms. */
40116
+ timestamp: number(),
40117
+ level: LogLevelSchema,
40118
+ scope: string().optional(),
40119
+ message: string(),
40120
+ tags: record(string(), union([string(), number()])).optional(),
40121
+ meta: record(string(), unknown()).optional()
40122
+ })),
40123
+ /** Pass as `before` for the next older page; null when nothing older exists. */
40124
+ nextBefore: string().nullable(),
40125
+ /** Pass as `after` to read what arrived since; null when unknown. */
40126
+ nextAfter: string().nullable(),
40127
+ /** Bytes this slice read (files) or received (remote). Progress, not a promise. */
40128
+ scannedBytes: number().int().nonnegative(),
40129
+ /**
40130
+ * True when the scan in this direction reached the end of the store.
40131
+ * False with fewer than `limit` entries means the budget ran out first —
40132
+ * call again with `nextBefore` to go on.
40133
+ */
40134
+ done: boolean(),
40135
+ /** True when `cancelRead` ended this slice early. */
40136
+ cancelled: boolean().optional()
40137
+ });
40138
+ var LogReadCapabilitiesSchema = object({
40139
+ /** False ⇒ this destination only ships lines (console, forwarder, an unconfigured Loki). */
40140
+ readable: boolean(),
40141
+ /** Why not, when `readable` is false — rendered next to the source. */
40142
+ reason: string().nullable(),
40143
+ /** Filters the provider applies itself. A false one is applied by nobody. */
40144
+ filters: object({
40145
+ deviceId: boolean(),
40146
+ addonId: boolean(),
40147
+ nodeId: boolean(),
40148
+ tags: boolean(),
40149
+ level: boolean(),
40150
+ text: boolean(),
40151
+ timeRange: boolean()
40152
+ }),
40153
+ /** How far back the store reaches, when the provider knows (days). */
40154
+ retentionDays: number().nullable()
40155
+ });
40156
+ method(LogEntrySchema, _void(), { kind: "mutation" }), optionalMethod(_void(), LogReadCapabilitiesSchema, { auth: "admin" }), optionalMethod(LogReadQuerySchema, LogReadResultSchema, { auth: "admin" }), optionalMethod(object({ requestId: string().min(1).max(64) }), object({ cancelled: boolean() }), {
40157
+ kind: "mutation",
40158
+ auth: "admin"
40159
+ });
40013
40160
  /**
40014
40161
  * `login-method` — collection cap through which auth addons contribute
40015
40162
  * their pre-auth login surfaces to the login page. This is the SINGLE,
@@ -42565,6 +42712,33 @@ var NcRuleTargetSchema = object({
42565
42712
  params: record(string(), unknown()).optional()
42566
42713
  });
42567
42714
  /**
42715
+ * WHAT THE NOTIFICATION'S PICTURE IS (D897) — the ONE media choice of a rule.
42716
+ *
42717
+ * Every mode starts from the same CLEAN source frame of the trigger moment
42718
+ * (keyFrame → sceneFrame → lastSceneFrame, narrowed to the trigger instant and
42719
+ * to the zone that fired the rule) and renders it once at send time:
42720
+ * - `scene-boxes` — the whole scene, the subject outlined thick in the accent
42721
+ * colour and every OTHER track visible at that instant outlined thin, each
42722
+ * labelled with class and confidence ("dog 87%").
42723
+ * - `crop` — the subject cut out of that frame around its box at that instant.
42724
+ * - `clean` — the whole scene with nothing drawn on it.
42725
+ * - `none` — no picture.
42726
+ *
42727
+ * A mode that cannot be honoured (no box at that instant, a photograph with no
42728
+ * tracked subject) ships `clean` and names the reason in the log, per camera.
42729
+ * It replaces the `attach` × `frame` × `zoneCrop` triple, which let one rule
42730
+ * ship a crop on one event and a boxed scene on the next depending on which
42731
+ * stored kind had landed.
42732
+ */
42733
+ var NcMediaImageSchema = _enum([
42734
+ "scene-boxes",
42735
+ "crop",
42736
+ "clean",
42737
+ "none"
42738
+ ]);
42739
+ /**
42740
+ * @deprecated Read only by `normalizeNcMediaPolicy` (D897) — see {@link NcMediaImageSchema}.
42741
+ *
42568
42742
  * Media attachment policy (P1 still-image subset).
42569
42743
  * - `best` — the best AVAILABLE subject image at dispatch time (D-3).
42570
42744
  * - `best-matching` — the media that explains WHY the rule fired: a rule
@@ -42578,6 +42752,8 @@ var NcRuleTargetSchema = object({
42578
42752
  * - `none` — no attachment.
42579
42753
  */
42580
42754
  /**
42755
+ * @deprecated Read only by `normalizeNcMediaPolicy` (D897) — see {@link NcMediaImageSchema}.
42756
+ *
42581
42757
  * WHAT THE PICTURE SHOWS — chosen explicitly, because the implicit ladders
42582
42758
  * conflate it with the selection strategy and betray the request: asking for
42583
42759
  * the clean scene frame on an object-event owner used to start at
@@ -42606,16 +42782,29 @@ var NcMediaFrameSchema = _enum([
42606
42782
  */
42607
42783
  var NcLinkedCameraModeSchema = _enum(["mosaic", "each"]);
42608
42784
  var NcMediaPolicySchema = object({
42785
+ /**
42786
+ * The picture — see {@link NcMediaImageSchema}. Absent on a rule nobody has
42787
+ * saved since D897: `normalizeNcMediaPolicy` derives it from the legacy
42788
+ * triple below, at load and at every write, and the store keeps only this.
42789
+ */
42790
+ image: NcMediaImageSchema.optional(),
42791
+ /**
42792
+ * Draw the zone that FIRED the rule on the picture (`scene-boxes` / `clean`;
42793
+ * a `crop` never shows it). Valid only on a rule whose trigger is a zone —
42794
+ * `conditions.zones` or an occupancy zone — and refused on save otherwise.
42795
+ * Replaces `zoneCrop`.
42796
+ */
42797
+ showTriggerZone: boolean().optional(),
42798
+ /** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
42609
42799
  attach: _enum([
42610
42800
  "best",
42611
42801
  "best-matching",
42612
42802
  "keyFrame",
42613
42803
  "none"
42614
- ]).default("best"),
42615
- /** What the still shows. Absent = `cropped` (the historical `best` shape). */
42804
+ ]).optional(),
42805
+ /** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
42616
42806
  frame: NcMediaFrameSchema.optional(),
42617
- /** Crop the attached still to the rule's condition-zone bbox (padded) —
42618
- * "show me the ZONE", not the whole scene or the subject crop. */
42807
+ /** @deprecated D897 — folded into `image: 'clean'` + `showTriggerZone` on save. */
42619
42808
  zoneCrop: boolean().optional(),
42620
42809
  /**
42621
42810
  * Also attach a short GIF cut from the stream broker's clip ring around the
@@ -42787,7 +42976,9 @@ var NcRuleInputSchema = object({
42787
42976
  * targets.
42788
42977
  */
42789
42978
  targetUsers: array(string()).optional(),
42790
- media: NcMediaPolicySchema.default({ attach: "best" }),
42979
+ /** Absent = the kind's default picture (`resolveNcMediaImage`): the subject crop for a
42980
+ * detection, the clean scene for a sensor or a sound. Set explicitly on save (D897). */
42981
+ media: NcMediaPolicySchema.default({}),
42791
42982
  throttle: NcThrottleSchema.default({
42792
42983
  cooldownSec: 60,
42793
42984
  scope: "rule-device"
@@ -43724,13 +43915,37 @@ var NcAlarmModeOpeningsSchema = object({
43724
43915
  /** Covered devices whose state could not be read (D49): neither open nor closed. */
43725
43916
  unknown: array(number().int())
43726
43917
  });
43918
+ /**
43919
+ * One alarm INPUT — a (rule, device) pair — the operator bypassed until the
43920
+ * next disarm ("Bypass this input until disarm" on a trigger notification, or
43921
+ * `nc.bypassAlarmInput`). Reported so an armed alarm with a silenced input
43922
+ * never looks fully armed (D62: off must never look like broken).
43923
+ */
43924
+ var NcAlarmInputBypassViewSchema = object({
43925
+ ruleId: string(),
43926
+ /** The rule's current name (its frozen name when the rule is gone). */
43927
+ ruleName: string(),
43928
+ /** The input: the sensor of the match, else its camera. */
43929
+ deviceId: number().int(),
43930
+ /** The input's current name. */
43931
+ name: string(),
43932
+ /** When it was bypassed (ms epoch). */
43933
+ since: number(),
43934
+ /** Triggers from this input dropped since. */
43935
+ dropped: number().int().min(0)
43936
+ });
43727
43937
  var NcAlarmLiveSchema = object({
43728
43938
  state: AlarmStateSchema,
43729
43939
  /** The mode being armed into (exit delay) or held; null when disarmed. */
43730
43940
  targetMode: AlarmArmModeSchema.nullable(),
43731
43941
  availableModes: array(AlarmArmModeSchema),
43732
43942
  openings: array(NcAlarmModeOpeningsSchema),
43733
- exclusions: array(NcAlarmExclusionViewSchema)
43943
+ exclusions: array(NcAlarmExclusionViewSchema),
43944
+ /**
43945
+ * Inputs bypassed for the rest of this arm session; cleared on disarm.
43946
+ * Defaulted so an older hub answer still parses (as "none known").
43947
+ */
43948
+ bypassedInputs: array(NcAlarmInputBypassViewSchema).default([])
43734
43949
  });
43735
43950
  var NcAlarmConfigSchema = object({
43736
43951
  /**
@@ -57640,9 +57855,24 @@ var NpuInfoSchema = object({
57640
57855
  name: string().optional(),
57641
57856
  generation: _enum(["xdna1", "xdna2"]).optional()
57642
57857
  });
57858
+ var CoralBusSchema = _enum(["usb", "pci"]);
57643
57859
  var CoralInfoSchema = object({
57644
57860
  type: literal("coral-edgetpu"),
57645
- bus: string().optional()
57861
+ /** Legacy single-bus report (older nodes) — read via `coralUsableUnits`. */
57862
+ bus: string().optional(),
57863
+ /** Legacy USB unit count (older nodes) — read via `coralUsableUnits`. */
57864
+ count: number().int().nonnegative().optional(),
57865
+ /** Usable units per bus — each one is its own `edgetpu:<bus>[:N]` device. */
57866
+ units: array(object({
57867
+ bus: CoralBusSchema,
57868
+ count: number().int().nonnegative()
57869
+ })).readonly().optional(),
57870
+ /** Present-but-unusable units, each with its typed reason (never "absent"). */
57871
+ unavailable: array(object({
57872
+ bus: CoralBusSchema,
57873
+ count: number().int().nonnegative(),
57874
+ reason: _enum(["driver-missing", "device-not-accessible"])
57875
+ })).readonly().optional()
57646
57876
  });
57647
57877
  var HardwareInfoSchema = object({
57648
57878
  platform: HardwarePlatformSchema,
@@ -65382,7 +65612,19 @@ Object.freeze({
65382
65612
  addonId: null,
65383
65613
  access: "view"
65384
65614
  },
65385
- "logDestination.query": {
65615
+ "logDestination.cancelRead": {
65616
+ capName: "log-destination",
65617
+ capScope: "system",
65618
+ addonId: null,
65619
+ access: "create"
65620
+ },
65621
+ "logDestination.describeRead": {
65622
+ capName: "log-destination",
65623
+ capScope: "system",
65624
+ addonId: null,
65625
+ access: "view"
65626
+ },
65627
+ "logDestination.read": {
65386
65628
  capName: "log-destination",
65387
65629
  capScope: "system",
65388
65630
  addonId: null,
@@ -71389,6 +71631,11 @@ Object.freeze({
71389
71631
  form: "single",
71390
71632
  optional: false
71391
71633
  }],
71634
+ "logDestination.read": [{
71635
+ name: "deviceId",
71636
+ form: "single",
71637
+ optional: true
71638
+ }],
71392
71639
  "mediaPlayer.getStatus": [{
71393
71640
  name: "deviceId",
71394
71641
  form: "single",
@@ -5449,7 +5449,7 @@ var ZodIssueCode = {
5449
5449
  var ZodFirstPartyTypeKind;
5450
5450
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5451
5451
  //#endregion
5452
- //#region ../types/dist/sleep-yKL5gfrH.mjs
5452
+ //#region ../types/dist/sleep-BSuCCFjf.mjs
5453
5453
  /**
5454
5454
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5455
5455
  * window to float samples (D455).
@@ -16842,7 +16842,19 @@ var DeviceHistorySubjectSchema = discriminatedUnion("kind", [object({
16842
16842
  kind: literal("node"),
16843
16843
  nodeId: string().min(1)
16844
16844
  })]);
16845
+ /**
16846
+ * `enum` stores a STATE as the ordinal of its value in the series' value list
16847
+ * (`DeviceHistorySeriesInfo.values`, append-only, so an ordinal never changes
16848
+ * meaning); a rollup keeps the time spent in each state (`states`).
16849
+ */
16845
16850
  var DeviceHistoryKindSchema = _enum([
16851
+ "gauge",
16852
+ "counter",
16853
+ "boolean",
16854
+ "enum"
16855
+ ]);
16856
+ /** What a PRODUCER may declare. `enum` is cap-only: its value list is the cap field's. */
16857
+ var DeviceHistoryProducerKindSchema = _enum([
16846
16858
  "gauge",
16847
16859
  "counter",
16848
16860
  "boolean"
@@ -16879,7 +16891,13 @@ var SeriesInfoSchema = object({
16879
16891
  /** `null` is unknown (a `unitFrom` series whose device does not state a unit right now), never a guess. */
16880
16892
  unit: string().nullable(),
16881
16893
  displayName: string(),
16882
- source: _enum(["cap", "addon"]),
16894
+ source: _enum([
16895
+ "cap",
16896
+ "addon",
16897
+ "derived"
16898
+ ]),
16899
+ /** `enum`: the value of each ordinal (index = ordinal); `null` for every other kind. */
16900
+ values: array(string()).readonly().nullable(),
16883
16901
  firstTs: number(),
16884
16902
  lastTs: number()
16885
16903
  });
@@ -16893,17 +16911,31 @@ var QueryPointSchema = object({
16893
16911
  twMean: number().nullable(),
16894
16912
  min: number(),
16895
16913
  max: number(),
16896
- /** `null` is unknown, never zero (D393). */
16897
- last: number().nullable()
16914
+ /** `null` is unknown, never zero (D393). For an `enum` series: the ordinal of {@link state}. */
16915
+ last: number().nullable(),
16916
+ /**
16917
+ * The increase over the point: a `counter`'s growth since the previous point
16918
+ * or bucket (a drop is a reset, counted from zero), and for
16919
+ * {@link DEVICE_HISTORY_ENERGY_KEY} the kWh used in the bucket. `null` for
16920
+ * every other kind, and when it cannot be known.
16921
+ */
16922
+ delta: number().nullable(),
16923
+ /** `enum`: the state in force at the end of the point (the name of `last`); `null` otherwise. */
16924
+ state: string().nullable(),
16925
+ /** `enum` rollup: milliseconds spent in each state inside the bucket; `null` for raw points and other kinds. */
16926
+ states: record(string(), number()).nullable()
16898
16927
  });
16899
16928
  var QuerySeriesSchema = object({
16900
16929
  scope: string(),
16901
16930
  /** The last point STRICTLY BEFORE `from` in the chosen tier, so a step chart can start at the held value. */
16902
16931
  before: object({
16903
16932
  t: number(),
16904
- value: number().nullable()
16933
+ value: number().nullable(),
16934
+ state: string().nullable()
16905
16935
  }).nullable(),
16906
- points: array(QueryPointSchema).readonly()
16936
+ points: array(QueryPointSchema).readonly(),
16937
+ /** A derived key: the stored key its points were computed from; `null` for a stored series. */
16938
+ derivedFrom: string().nullable()
16907
16939
  });
16908
16940
  /** The window part of a query, shared by the device and node forms. */
16909
16941
  var QueryWindowShape = {
@@ -16919,6 +16951,23 @@ var QueryResultSchema = object({
16919
16951
  series: array(QuerySeriesSchema).readonly(),
16920
16952
  truncated: boolean()
16921
16953
  });
16954
+ /** One read of a batch: a device's key or a node's key (exactly one subject). */
16955
+ var QueryManyItemSchema = union([object({
16956
+ deviceId: number().int(),
16957
+ key: string(),
16958
+ scope: string().optional()
16959
+ }), object({
16960
+ forNodeId: string().min(1),
16961
+ key: string(),
16962
+ scope: string().optional()
16963
+ })]);
16964
+ var QueryManyEntrySchema = discriminatedUnion("ok", [object({
16965
+ ok: literal(true),
16966
+ result: QueryResultSchema
16967
+ }), object({
16968
+ ok: literal(false),
16969
+ error: string()
16970
+ })]);
16922
16971
  var TierStatusSchema = object({
16923
16972
  tier: DeviceHistoryResolutionSchema,
16924
16973
  /** `null` until the first background count answered. */
@@ -16974,16 +17023,22 @@ var DeviceHistoryStatusSchema = object({
16974
17023
  lastRefreshAt: number().nullable()
16975
17024
  })
16976
17025
  });
16977
- method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly()), method(object({ nodeId: string().min(1) }), array(SeriesInfoSchema).readonly(), { auth: "admin" }), method(object({
17026
+ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly()), method(object({ forNodeId: string().min(1) }), array(SeriesInfoSchema).readonly(), { auth: "admin" }), method(object({
16978
17027
  deviceId: number().int(),
16979
17028
  ...QueryWindowShape
16980
17029
  }), QueryResultSchema), method(object({
16981
- nodeId: string().min(1),
17030
+ forNodeId: string().min(1),
16982
17031
  ...QueryWindowShape
16983
17032
  }), QueryResultSchema, { auth: "admin" }), method(object({
17033
+ items: array(QueryManyItemSchema).min(1).max(24),
17034
+ from: QueryWindowShape.from,
17035
+ to: QueryWindowShape.to,
17036
+ resolution: QueryWindowShape.resolution,
17037
+ maxPoints: QueryWindowShape.maxPoints
17038
+ }), object({ results: array(QueryManyEntrySchema).readonly() }), { auth: "admin" }), method(object({
16984
17039
  name: string().regex(/^[a-z0-9-]+$/),
16985
17040
  subjectKind: _enum(["device", "node"]),
16986
- kind: DeviceHistoryKindSchema,
17041
+ kind: DeviceHistoryProducerKindSchema,
16987
17042
  unit: string().optional(),
16988
17043
  displayName: string().min(1),
16989
17044
  ingest: _enum(["points", "buckets"])
@@ -40000,14 +40055,106 @@ var LogEntrySchema = object({
40000
40055
  meta: record(string(), unknown()).optional(),
40001
40056
  tags: record(string(), string()).optional()
40002
40057
  });
40003
- method(LogEntrySchema, _void(), { kind: "mutation" }), method(object({
40004
- scope: array(string()).optional(),
40058
+ /**
40059
+ * A history READ against one destination (D898).
40060
+ *
40061
+ * Every filter is applied by the PROVIDER, before the limit — a filter the
40062
+ * browser applied after the limit is what made a rare device's lines
40063
+ * unreachable behind a busy one's. `before` / `after` are cursors the provider
40064
+ * minted (opaque to everyone else): a file position for the rotated files, a
40065
+ * nanosecond timestamp for Loki.
40066
+ *
40067
+ * A read is BOUNDED by `budgetMs`: a filter that matches nothing on a 30-day
40068
+ * store answers `done: false` with the cursor it reached and the bytes it
40069
+ * scanned, and the caller decides whether to go on. That is what makes a long
40070
+ * scan show progress and stop when asked — `cancelRead` ends the slice in
40071
+ * flight, and not asking for the next slice ends the scan.
40072
+ */
40073
+ var LogReadQuerySchema = object({
40074
+ /** Correlates `cancelRead`. Caller-chosen, unique per in-flight read. */
40075
+ requestId: string().min(1).max(64).optional(),
40076
+ /** The device the line is about (`tags.deviceId`, numeric). */
40077
+ deviceId: number().int().optional(),
40078
+ /**
40079
+ * The emitting addon — bare manifest id; `@<version>` / `::<sub>` suffixes
40080
+ * match. Not `addonId`: a cap router reads that name as "which provider".
40081
+ */
40082
+ fromAddonId: string().min(1).max(200).optional(),
40083
+ /**
40084
+ * The emitting node: matches the agent that emitted the line, the node
40085
+ * itself, or a worker under it (`<agent>/<runner>`) — the `agentId`
40086
+ * semantics of `matchesLogTags`. Not `nodeId`: a cap router reads that
40087
+ * name as "which node's provider".
40088
+ */
40089
+ fromNodeId: string().min(1).max(200).optional(),
40090
+ /** Any other tag, exact match (AND). */
40091
+ tags: record(string(), union([string(), number()])).optional(),
40092
+ /** Severity FLOOR: this level and above. */
40005
40093
  level: LogLevelSchema.optional(),
40006
- since: date().optional(),
40007
- until: date().optional(),
40008
- limit: number().optional(),
40009
- tags: record(string(), string()).optional()
40010
- }), array(LogEntrySchema).readonly());
40094
+ /** Case-insensitive substring over message, scope, tag values and meta values. */
40095
+ text: string().min(1).max(200).optional(),
40096
+ /** Epoch ms, inclusive. */
40097
+ since: number().optional(),
40098
+ /** Epoch ms, inclusive. */
40099
+ until: number().optional(),
40100
+ /** Older than this cursor (exclusive). Absent with `after` absent ⇒ from the newest. */
40101
+ before: string().min(1).max(1024).optional(),
40102
+ /** Newer than this cursor (exclusive). */
40103
+ after: string().min(1).max(1024).optional(),
40104
+ limit: number().int().min(1).max(1e3).optional(),
40105
+ /** Wall-clock bound of this slice. The provider caps it. */
40106
+ budgetMs: number().int().min(50).max(1e4).optional()
40107
+ });
40108
+ var LogReadResultSchema = object({
40109
+ /** Newest first. */
40110
+ entries: array(object({
40111
+ /** `<bootId>.<seq>` minted by the emitting LogManager — the dedupe key. */
40112
+ id: string().optional(),
40113
+ /** Epoch ms. */
40114
+ timestamp: number(),
40115
+ level: LogLevelSchema,
40116
+ scope: string().optional(),
40117
+ message: string(),
40118
+ tags: record(string(), union([string(), number()])).optional(),
40119
+ meta: record(string(), unknown()).optional()
40120
+ })),
40121
+ /** Pass as `before` for the next older page; null when nothing older exists. */
40122
+ nextBefore: string().nullable(),
40123
+ /** Pass as `after` to read what arrived since; null when unknown. */
40124
+ nextAfter: string().nullable(),
40125
+ /** Bytes this slice read (files) or received (remote). Progress, not a promise. */
40126
+ scannedBytes: number().int().nonnegative(),
40127
+ /**
40128
+ * True when the scan in this direction reached the end of the store.
40129
+ * False with fewer than `limit` entries means the budget ran out first —
40130
+ * call again with `nextBefore` to go on.
40131
+ */
40132
+ done: boolean(),
40133
+ /** True when `cancelRead` ended this slice early. */
40134
+ cancelled: boolean().optional()
40135
+ });
40136
+ var LogReadCapabilitiesSchema = object({
40137
+ /** False ⇒ this destination only ships lines (console, forwarder, an unconfigured Loki). */
40138
+ readable: boolean(),
40139
+ /** Why not, when `readable` is false — rendered next to the source. */
40140
+ reason: string().nullable(),
40141
+ /** Filters the provider applies itself. A false one is applied by nobody. */
40142
+ filters: object({
40143
+ deviceId: boolean(),
40144
+ addonId: boolean(),
40145
+ nodeId: boolean(),
40146
+ tags: boolean(),
40147
+ level: boolean(),
40148
+ text: boolean(),
40149
+ timeRange: boolean()
40150
+ }),
40151
+ /** How far back the store reaches, when the provider knows (days). */
40152
+ retentionDays: number().nullable()
40153
+ });
40154
+ method(LogEntrySchema, _void(), { kind: "mutation" }), optionalMethod(_void(), LogReadCapabilitiesSchema, { auth: "admin" }), optionalMethod(LogReadQuerySchema, LogReadResultSchema, { auth: "admin" }), optionalMethod(object({ requestId: string().min(1).max(64) }), object({ cancelled: boolean() }), {
40155
+ kind: "mutation",
40156
+ auth: "admin"
40157
+ });
40011
40158
  /**
40012
40159
  * `login-method` — collection cap through which auth addons contribute
40013
40160
  * their pre-auth login surfaces to the login page. This is the SINGLE,
@@ -42563,6 +42710,33 @@ var NcRuleTargetSchema = object({
42563
42710
  params: record(string(), unknown()).optional()
42564
42711
  });
42565
42712
  /**
42713
+ * WHAT THE NOTIFICATION'S PICTURE IS (D897) — the ONE media choice of a rule.
42714
+ *
42715
+ * Every mode starts from the same CLEAN source frame of the trigger moment
42716
+ * (keyFrame → sceneFrame → lastSceneFrame, narrowed to the trigger instant and
42717
+ * to the zone that fired the rule) and renders it once at send time:
42718
+ * - `scene-boxes` — the whole scene, the subject outlined thick in the accent
42719
+ * colour and every OTHER track visible at that instant outlined thin, each
42720
+ * labelled with class and confidence ("dog 87%").
42721
+ * - `crop` — the subject cut out of that frame around its box at that instant.
42722
+ * - `clean` — the whole scene with nothing drawn on it.
42723
+ * - `none` — no picture.
42724
+ *
42725
+ * A mode that cannot be honoured (no box at that instant, a photograph with no
42726
+ * tracked subject) ships `clean` and names the reason in the log, per camera.
42727
+ * It replaces the `attach` × `frame` × `zoneCrop` triple, which let one rule
42728
+ * ship a crop on one event and a boxed scene on the next depending on which
42729
+ * stored kind had landed.
42730
+ */
42731
+ var NcMediaImageSchema = _enum([
42732
+ "scene-boxes",
42733
+ "crop",
42734
+ "clean",
42735
+ "none"
42736
+ ]);
42737
+ /**
42738
+ * @deprecated Read only by `normalizeNcMediaPolicy` (D897) — see {@link NcMediaImageSchema}.
42739
+ *
42566
42740
  * Media attachment policy (P1 still-image subset).
42567
42741
  * - `best` — the best AVAILABLE subject image at dispatch time (D-3).
42568
42742
  * - `best-matching` — the media that explains WHY the rule fired: a rule
@@ -42576,6 +42750,8 @@ var NcRuleTargetSchema = object({
42576
42750
  * - `none` — no attachment.
42577
42751
  */
42578
42752
  /**
42753
+ * @deprecated Read only by `normalizeNcMediaPolicy` (D897) — see {@link NcMediaImageSchema}.
42754
+ *
42579
42755
  * WHAT THE PICTURE SHOWS — chosen explicitly, because the implicit ladders
42580
42756
  * conflate it with the selection strategy and betray the request: asking for
42581
42757
  * the clean scene frame on an object-event owner used to start at
@@ -42604,16 +42780,29 @@ var NcMediaFrameSchema = _enum([
42604
42780
  */
42605
42781
  var NcLinkedCameraModeSchema = _enum(["mosaic", "each"]);
42606
42782
  var NcMediaPolicySchema = object({
42783
+ /**
42784
+ * The picture — see {@link NcMediaImageSchema}. Absent on a rule nobody has
42785
+ * saved since D897: `normalizeNcMediaPolicy` derives it from the legacy
42786
+ * triple below, at load and at every write, and the store keeps only this.
42787
+ */
42788
+ image: NcMediaImageSchema.optional(),
42789
+ /**
42790
+ * Draw the zone that FIRED the rule on the picture (`scene-boxes` / `clean`;
42791
+ * a `crop` never shows it). Valid only on a rule whose trigger is a zone —
42792
+ * `conditions.zones` or an occupancy zone — and refused on save otherwise.
42793
+ * Replaces `zoneCrop`.
42794
+ */
42795
+ showTriggerZone: boolean().optional(),
42796
+ /** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
42607
42797
  attach: _enum([
42608
42798
  "best",
42609
42799
  "best-matching",
42610
42800
  "keyFrame",
42611
42801
  "none"
42612
- ]).default("best"),
42613
- /** What the still shows. Absent = `cropped` (the historical `best` shape). */
42802
+ ]).optional(),
42803
+ /** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
42614
42804
  frame: NcMediaFrameSchema.optional(),
42615
- /** Crop the attached still to the rule's condition-zone bbox (padded) —
42616
- * "show me the ZONE", not the whole scene or the subject crop. */
42805
+ /** @deprecated D897 — folded into `image: 'clean'` + `showTriggerZone` on save. */
42617
42806
  zoneCrop: boolean().optional(),
42618
42807
  /**
42619
42808
  * Also attach a short GIF cut from the stream broker's clip ring around the
@@ -42785,7 +42974,9 @@ var NcRuleInputSchema = object({
42785
42974
  * targets.
42786
42975
  */
42787
42976
  targetUsers: array(string()).optional(),
42788
- media: NcMediaPolicySchema.default({ attach: "best" }),
42977
+ /** Absent = the kind's default picture (`resolveNcMediaImage`): the subject crop for a
42978
+ * detection, the clean scene for a sensor or a sound. Set explicitly on save (D897). */
42979
+ media: NcMediaPolicySchema.default({}),
42789
42980
  throttle: NcThrottleSchema.default({
42790
42981
  cooldownSec: 60,
42791
42982
  scope: "rule-device"
@@ -43722,13 +43913,37 @@ var NcAlarmModeOpeningsSchema = object({
43722
43913
  /** Covered devices whose state could not be read (D49): neither open nor closed. */
43723
43914
  unknown: array(number().int())
43724
43915
  });
43916
+ /**
43917
+ * One alarm INPUT — a (rule, device) pair — the operator bypassed until the
43918
+ * next disarm ("Bypass this input until disarm" on a trigger notification, or
43919
+ * `nc.bypassAlarmInput`). Reported so an armed alarm with a silenced input
43920
+ * never looks fully armed (D62: off must never look like broken).
43921
+ */
43922
+ var NcAlarmInputBypassViewSchema = object({
43923
+ ruleId: string(),
43924
+ /** The rule's current name (its frozen name when the rule is gone). */
43925
+ ruleName: string(),
43926
+ /** The input: the sensor of the match, else its camera. */
43927
+ deviceId: number().int(),
43928
+ /** The input's current name. */
43929
+ name: string(),
43930
+ /** When it was bypassed (ms epoch). */
43931
+ since: number(),
43932
+ /** Triggers from this input dropped since. */
43933
+ dropped: number().int().min(0)
43934
+ });
43725
43935
  var NcAlarmLiveSchema = object({
43726
43936
  state: AlarmStateSchema,
43727
43937
  /** The mode being armed into (exit delay) or held; null when disarmed. */
43728
43938
  targetMode: AlarmArmModeSchema.nullable(),
43729
43939
  availableModes: array(AlarmArmModeSchema),
43730
43940
  openings: array(NcAlarmModeOpeningsSchema),
43731
- exclusions: array(NcAlarmExclusionViewSchema)
43941
+ exclusions: array(NcAlarmExclusionViewSchema),
43942
+ /**
43943
+ * Inputs bypassed for the rest of this arm session; cleared on disarm.
43944
+ * Defaulted so an older hub answer still parses (as "none known").
43945
+ */
43946
+ bypassedInputs: array(NcAlarmInputBypassViewSchema).default([])
43732
43947
  });
43733
43948
  var NcAlarmConfigSchema = object({
43734
43949
  /**
@@ -57638,9 +57853,24 @@ var NpuInfoSchema = object({
57638
57853
  name: string().optional(),
57639
57854
  generation: _enum(["xdna1", "xdna2"]).optional()
57640
57855
  });
57856
+ var CoralBusSchema = _enum(["usb", "pci"]);
57641
57857
  var CoralInfoSchema = object({
57642
57858
  type: literal("coral-edgetpu"),
57643
- bus: string().optional()
57859
+ /** Legacy single-bus report (older nodes) — read via `coralUsableUnits`. */
57860
+ bus: string().optional(),
57861
+ /** Legacy USB unit count (older nodes) — read via `coralUsableUnits`. */
57862
+ count: number().int().nonnegative().optional(),
57863
+ /** Usable units per bus — each one is its own `edgetpu:<bus>[:N]` device. */
57864
+ units: array(object({
57865
+ bus: CoralBusSchema,
57866
+ count: number().int().nonnegative()
57867
+ })).readonly().optional(),
57868
+ /** Present-but-unusable units, each with its typed reason (never "absent"). */
57869
+ unavailable: array(object({
57870
+ bus: CoralBusSchema,
57871
+ count: number().int().nonnegative(),
57872
+ reason: _enum(["driver-missing", "device-not-accessible"])
57873
+ })).readonly().optional()
57644
57874
  });
57645
57875
  var HardwareInfoSchema = object({
57646
57876
  platform: HardwarePlatformSchema,
@@ -65380,7 +65610,19 @@ Object.freeze({
65380
65610
  addonId: null,
65381
65611
  access: "view"
65382
65612
  },
65383
- "logDestination.query": {
65613
+ "logDestination.cancelRead": {
65614
+ capName: "log-destination",
65615
+ capScope: "system",
65616
+ addonId: null,
65617
+ access: "create"
65618
+ },
65619
+ "logDestination.describeRead": {
65620
+ capName: "log-destination",
65621
+ capScope: "system",
65622
+ addonId: null,
65623
+ access: "view"
65624
+ },
65625
+ "logDestination.read": {
65384
65626
  capName: "log-destination",
65385
65627
  capScope: "system",
65386
65628
  addonId: null,
@@ -71387,6 +71629,11 @@ Object.freeze({
71387
71629
  form: "single",
71388
71630
  optional: false
71389
71631
  }],
71632
+ "logDestination.read": [{
71633
+ name: "deviceId",
71634
+ form: "single",
71635
+ optional: true
71636
+ }],
71390
71637
  "mediaPlayer.getStatus": [{
71391
71638
  name: "deviceId",
71392
71639
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-smtp-nodemailer",
3
- "version": "1.2.126",
3
+ "version": "1.2.128",
4
4
  "description": "SMTP email provider addon for CamStack — wraps `nodemailer` and registers a `smtp-provider` cap collection entry. Used by notifier addons.",
5
5
  "keywords": [
6
6
  "camstack",