@camstack/addon-provider-rtsp 1.2.131 → 1.2.132

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.
Files changed (3) hide show
  1. package/dist/addon.js +332 -40
  2. package/dist/addon.mjs +332 -40
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -5438,7 +5438,7 @@ var ZodIssueCode = {
5438
5438
  var ZodFirstPartyTypeKind;
5439
5439
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5440
5440
  //#endregion
5441
- //#region ../types/dist/sleep-yKL5gfrH.mjs
5441
+ //#region ../types/dist/sleep-BSuCCFjf.mjs
5442
5442
  /**
5443
5443
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5444
5444
  * window to float samples (D455).
@@ -17139,7 +17139,19 @@ var DeviceHistorySubjectSchema = discriminatedUnion("kind", [object({
17139
17139
  kind: literal("node"),
17140
17140
  nodeId: string().min(1)
17141
17141
  })]);
17142
+ /**
17143
+ * `enum` stores a STATE as the ordinal of its value in the series' value list
17144
+ * (`DeviceHistorySeriesInfo.values`, append-only, so an ordinal never changes
17145
+ * meaning); a rollup keeps the time spent in each state (`states`).
17146
+ */
17142
17147
  var DeviceHistoryKindSchema = _enum([
17148
+ "gauge",
17149
+ "counter",
17150
+ "boolean",
17151
+ "enum"
17152
+ ]);
17153
+ /** What a PRODUCER may declare. `enum` is cap-only: its value list is the cap field's. */
17154
+ var DeviceHistoryProducerKindSchema = _enum([
17143
17155
  "gauge",
17144
17156
  "counter",
17145
17157
  "boolean"
@@ -17176,7 +17188,13 @@ var SeriesInfoSchema = object({
17176
17188
  /** `null` is unknown (a `unitFrom` series whose device does not state a unit right now), never a guess. */
17177
17189
  unit: string().nullable(),
17178
17190
  displayName: string(),
17179
- source: _enum(["cap", "addon"]),
17191
+ source: _enum([
17192
+ "cap",
17193
+ "addon",
17194
+ "derived"
17195
+ ]),
17196
+ /** `enum`: the value of each ordinal (index = ordinal); `null` for every other kind. */
17197
+ values: array(string()).readonly().nullable(),
17180
17198
  firstTs: number(),
17181
17199
  lastTs: number()
17182
17200
  });
@@ -17190,17 +17208,31 @@ var QueryPointSchema = object({
17190
17208
  twMean: number().nullable(),
17191
17209
  min: number(),
17192
17210
  max: number(),
17193
- /** `null` is unknown, never zero (D393). */
17194
- last: number().nullable()
17211
+ /** `null` is unknown, never zero (D393). For an `enum` series: the ordinal of {@link state}. */
17212
+ last: number().nullable(),
17213
+ /**
17214
+ * The increase over the point: a `counter`'s growth since the previous point
17215
+ * or bucket (a drop is a reset, counted from zero), and for
17216
+ * {@link DEVICE_HISTORY_ENERGY_KEY} the kWh used in the bucket. `null` for
17217
+ * every other kind, and when it cannot be known.
17218
+ */
17219
+ delta: number().nullable(),
17220
+ /** `enum`: the state in force at the end of the point (the name of `last`); `null` otherwise. */
17221
+ state: string().nullable(),
17222
+ /** `enum` rollup: milliseconds spent in each state inside the bucket; `null` for raw points and other kinds. */
17223
+ states: record(string(), number()).nullable()
17195
17224
  });
17196
17225
  var QuerySeriesSchema = object({
17197
17226
  scope: string(),
17198
17227
  /** The last point STRICTLY BEFORE `from` in the chosen tier, so a step chart can start at the held value. */
17199
17228
  before: object({
17200
17229
  t: number(),
17201
- value: number().nullable()
17230
+ value: number().nullable(),
17231
+ state: string().nullable()
17202
17232
  }).nullable(),
17203
- points: array(QueryPointSchema).readonly()
17233
+ points: array(QueryPointSchema).readonly(),
17234
+ /** A derived key: the stored key its points were computed from; `null` for a stored series. */
17235
+ derivedFrom: string().nullable()
17204
17236
  });
17205
17237
  /** The window part of a query, shared by the device and node forms. */
17206
17238
  var QueryWindowShape = {
@@ -17216,6 +17248,23 @@ var QueryResultSchema = object({
17216
17248
  series: array(QuerySeriesSchema).readonly(),
17217
17249
  truncated: boolean()
17218
17250
  });
17251
+ /** One read of a batch: a device's key or a node's key (exactly one subject). */
17252
+ var QueryManyItemSchema = union([object({
17253
+ deviceId: number().int(),
17254
+ key: string(),
17255
+ scope: string().optional()
17256
+ }), object({
17257
+ forNodeId: string().min(1),
17258
+ key: string(),
17259
+ scope: string().optional()
17260
+ })]);
17261
+ var QueryManyEntrySchema = discriminatedUnion("ok", [object({
17262
+ ok: literal(true),
17263
+ result: QueryResultSchema
17264
+ }), object({
17265
+ ok: literal(false),
17266
+ error: string()
17267
+ })]);
17219
17268
  var TierStatusSchema = object({
17220
17269
  tier: DeviceHistoryResolutionSchema,
17221
17270
  /** `null` until the first background count answered. */
@@ -17271,16 +17320,22 @@ var DeviceHistoryStatusSchema = object({
17271
17320
  lastRefreshAt: number().nullable()
17272
17321
  })
17273
17322
  });
17274
- method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly()), method(object({ nodeId: string().min(1) }), array(SeriesInfoSchema).readonly(), { auth: "admin" }), method(object({
17323
+ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly()), method(object({ forNodeId: string().min(1) }), array(SeriesInfoSchema).readonly(), { auth: "admin" }), method(object({
17275
17324
  deviceId: number().int(),
17276
17325
  ...QueryWindowShape
17277
17326
  }), QueryResultSchema), method(object({
17278
- nodeId: string().min(1),
17327
+ forNodeId: string().min(1),
17279
17328
  ...QueryWindowShape
17280
17329
  }), QueryResultSchema, { auth: "admin" }), method(object({
17330
+ items: array(QueryManyItemSchema).min(1).max(24),
17331
+ from: QueryWindowShape.from,
17332
+ to: QueryWindowShape.to,
17333
+ resolution: QueryWindowShape.resolution,
17334
+ maxPoints: QueryWindowShape.maxPoints
17335
+ }), object({ results: array(QueryManyEntrySchema).readonly() }), { auth: "admin" }), method(object({
17281
17336
  name: string().regex(/^[a-z0-9-]+$/),
17282
17337
  subjectKind: _enum(["device", "node"]),
17283
- kind: DeviceHistoryKindSchema,
17338
+ kind: DeviceHistoryProducerKindSchema,
17284
17339
  unit: string().optional(),
17285
17340
  displayName: string().min(1),
17286
17341
  ingest: _enum(["points", "buckets"])
@@ -40489,14 +40544,106 @@ var LogEntrySchema = object({
40489
40544
  meta: record(string(), unknown()).optional(),
40490
40545
  tags: record(string(), string()).optional()
40491
40546
  });
40492
- method(LogEntrySchema, _void(), { kind: "mutation" }), method(object({
40493
- scope: array(string()).optional(),
40547
+ /**
40548
+ * A history READ against one destination (D898).
40549
+ *
40550
+ * Every filter is applied by the PROVIDER, before the limit — a filter the
40551
+ * browser applied after the limit is what made a rare device's lines
40552
+ * unreachable behind a busy one's. `before` / `after` are cursors the provider
40553
+ * minted (opaque to everyone else): a file position for the rotated files, a
40554
+ * nanosecond timestamp for Loki.
40555
+ *
40556
+ * A read is BOUNDED by `budgetMs`: a filter that matches nothing on a 30-day
40557
+ * store answers `done: false` with the cursor it reached and the bytes it
40558
+ * scanned, and the caller decides whether to go on. That is what makes a long
40559
+ * scan show progress and stop when asked — `cancelRead` ends the slice in
40560
+ * flight, and not asking for the next slice ends the scan.
40561
+ */
40562
+ var LogReadQuerySchema = object({
40563
+ /** Correlates `cancelRead`. Caller-chosen, unique per in-flight read. */
40564
+ requestId: string().min(1).max(64).optional(),
40565
+ /** The device the line is about (`tags.deviceId`, numeric). */
40566
+ deviceId: number().int().optional(),
40567
+ /**
40568
+ * The emitting addon — bare manifest id; `@<version>` / `::<sub>` suffixes
40569
+ * match. Not `addonId`: a cap router reads that name as "which provider".
40570
+ */
40571
+ fromAddonId: string().min(1).max(200).optional(),
40572
+ /**
40573
+ * The emitting node: matches the agent that emitted the line, the node
40574
+ * itself, or a worker under it (`<agent>/<runner>`) — the `agentId`
40575
+ * semantics of `matchesLogTags`. Not `nodeId`: a cap router reads that
40576
+ * name as "which node's provider".
40577
+ */
40578
+ fromNodeId: string().min(1).max(200).optional(),
40579
+ /** Any other tag, exact match (AND). */
40580
+ tags: record(string(), union([string(), number()])).optional(),
40581
+ /** Severity FLOOR: this level and above. */
40494
40582
  level: LogLevelSchema.optional(),
40495
- since: date().optional(),
40496
- until: date().optional(),
40497
- limit: number().optional(),
40498
- tags: record(string(), string()).optional()
40499
- }), array(LogEntrySchema).readonly());
40583
+ /** Case-insensitive substring over message, scope, tag values and meta values. */
40584
+ text: string().min(1).max(200).optional(),
40585
+ /** Epoch ms, inclusive. */
40586
+ since: number().optional(),
40587
+ /** Epoch ms, inclusive. */
40588
+ until: number().optional(),
40589
+ /** Older than this cursor (exclusive). Absent with `after` absent ⇒ from the newest. */
40590
+ before: string().min(1).max(1024).optional(),
40591
+ /** Newer than this cursor (exclusive). */
40592
+ after: string().min(1).max(1024).optional(),
40593
+ limit: number().int().min(1).max(1e3).optional(),
40594
+ /** Wall-clock bound of this slice. The provider caps it. */
40595
+ budgetMs: number().int().min(50).max(1e4).optional()
40596
+ });
40597
+ var LogReadResultSchema = object({
40598
+ /** Newest first. */
40599
+ entries: array(object({
40600
+ /** `<bootId>.<seq>` minted by the emitting LogManager — the dedupe key. */
40601
+ id: string().optional(),
40602
+ /** Epoch ms. */
40603
+ timestamp: number(),
40604
+ level: LogLevelSchema,
40605
+ scope: string().optional(),
40606
+ message: string(),
40607
+ tags: record(string(), union([string(), number()])).optional(),
40608
+ meta: record(string(), unknown()).optional()
40609
+ })),
40610
+ /** Pass as `before` for the next older page; null when nothing older exists. */
40611
+ nextBefore: string().nullable(),
40612
+ /** Pass as `after` to read what arrived since; null when unknown. */
40613
+ nextAfter: string().nullable(),
40614
+ /** Bytes this slice read (files) or received (remote). Progress, not a promise. */
40615
+ scannedBytes: number().int().nonnegative(),
40616
+ /**
40617
+ * True when the scan in this direction reached the end of the store.
40618
+ * False with fewer than `limit` entries means the budget ran out first —
40619
+ * call again with `nextBefore` to go on.
40620
+ */
40621
+ done: boolean(),
40622
+ /** True when `cancelRead` ended this slice early. */
40623
+ cancelled: boolean().optional()
40624
+ });
40625
+ var LogReadCapabilitiesSchema = object({
40626
+ /** False ⇒ this destination only ships lines (console, forwarder, an unconfigured Loki). */
40627
+ readable: boolean(),
40628
+ /** Why not, when `readable` is false — rendered next to the source. */
40629
+ reason: string().nullable(),
40630
+ /** Filters the provider applies itself. A false one is applied by nobody. */
40631
+ filters: object({
40632
+ deviceId: boolean(),
40633
+ addonId: boolean(),
40634
+ nodeId: boolean(),
40635
+ tags: boolean(),
40636
+ level: boolean(),
40637
+ text: boolean(),
40638
+ timeRange: boolean()
40639
+ }),
40640
+ /** How far back the store reaches, when the provider knows (days). */
40641
+ retentionDays: number().nullable()
40642
+ });
40643
+ 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() }), {
40644
+ kind: "mutation",
40645
+ auth: "admin"
40646
+ });
40500
40647
  /**
40501
40648
  * `login-method` — collection cap through which auth addons contribute
40502
40649
  * their pre-auth login surfaces to the login page. This is the SINGLE,
@@ -42214,9 +42361,11 @@ var alarmPanelCapability = {
42214
42361
  */
42215
42362
  durability: "restored",
42216
42363
  /**
42217
- * History (D850): none — enum state; arm/disarm history belongs in the events ledger.
42364
+ * History (D850): the panel's lifecycle state as an `enum` series —
42365
+ * change-only, no floor, so an `arming -> pending -> triggered` sequence of a
42366
+ * few seconds keeps every step. Who armed it stays in the events ledger.
42218
42367
  */
42219
- history: "none",
42368
+ history: { fields: { state: { kind: "enum" } } },
42220
42369
  /** Clock fields: written, but excluded from the compare that decides
42221
42370
  * whether persisting is worth a SQLite commit. */
42222
42371
  volatileStateFields: ["lastChangedAt"]
@@ -43094,6 +43243,33 @@ var NcRuleTargetSchema = object({
43094
43243
  params: record(string(), unknown()).optional()
43095
43244
  });
43096
43245
  /**
43246
+ * WHAT THE NOTIFICATION'S PICTURE IS (D897) — the ONE media choice of a rule.
43247
+ *
43248
+ * Every mode starts from the same CLEAN source frame of the trigger moment
43249
+ * (keyFrame → sceneFrame → lastSceneFrame, narrowed to the trigger instant and
43250
+ * to the zone that fired the rule) and renders it once at send time:
43251
+ * - `scene-boxes` — the whole scene, the subject outlined thick in the accent
43252
+ * colour and every OTHER track visible at that instant outlined thin, each
43253
+ * labelled with class and confidence ("dog 87%").
43254
+ * - `crop` — the subject cut out of that frame around its box at that instant.
43255
+ * - `clean` — the whole scene with nothing drawn on it.
43256
+ * - `none` — no picture.
43257
+ *
43258
+ * A mode that cannot be honoured (no box at that instant, a photograph with no
43259
+ * tracked subject) ships `clean` and names the reason in the log, per camera.
43260
+ * It replaces the `attach` × `frame` × `zoneCrop` triple, which let one rule
43261
+ * ship a crop on one event and a boxed scene on the next depending on which
43262
+ * stored kind had landed.
43263
+ */
43264
+ var NcMediaImageSchema = _enum([
43265
+ "scene-boxes",
43266
+ "crop",
43267
+ "clean",
43268
+ "none"
43269
+ ]);
43270
+ /**
43271
+ * @deprecated Read only by `normalizeNcMediaPolicy` (D897) — see {@link NcMediaImageSchema}.
43272
+ *
43097
43273
  * Media attachment policy (P1 still-image subset).
43098
43274
  * - `best` — the best AVAILABLE subject image at dispatch time (D-3).
43099
43275
  * - `best-matching` — the media that explains WHY the rule fired: a rule
@@ -43107,6 +43283,8 @@ var NcRuleTargetSchema = object({
43107
43283
  * - `none` — no attachment.
43108
43284
  */
43109
43285
  /**
43286
+ * @deprecated Read only by `normalizeNcMediaPolicy` (D897) — see {@link NcMediaImageSchema}.
43287
+ *
43110
43288
  * WHAT THE PICTURE SHOWS — chosen explicitly, because the implicit ladders
43111
43289
  * conflate it with the selection strategy and betray the request: asking for
43112
43290
  * the clean scene frame on an object-event owner used to start at
@@ -43135,16 +43313,29 @@ var NcMediaFrameSchema = _enum([
43135
43313
  */
43136
43314
  var NcLinkedCameraModeSchema = _enum(["mosaic", "each"]);
43137
43315
  var NcMediaPolicySchema = object({
43316
+ /**
43317
+ * The picture — see {@link NcMediaImageSchema}. Absent on a rule nobody has
43318
+ * saved since D897: `normalizeNcMediaPolicy` derives it from the legacy
43319
+ * triple below, at load and at every write, and the store keeps only this.
43320
+ */
43321
+ image: NcMediaImageSchema.optional(),
43322
+ /**
43323
+ * Draw the zone that FIRED the rule on the picture (`scene-boxes` / `clean`;
43324
+ * a `crop` never shows it). Valid only on a rule whose trigger is a zone —
43325
+ * `conditions.zones` or an occupancy zone — and refused on save otherwise.
43326
+ * Replaces `zoneCrop`.
43327
+ */
43328
+ showTriggerZone: boolean().optional(),
43329
+ /** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
43138
43330
  attach: _enum([
43139
43331
  "best",
43140
43332
  "best-matching",
43141
43333
  "keyFrame",
43142
43334
  "none"
43143
- ]).default("best"),
43144
- /** What the still shows. Absent = `cropped` (the historical `best` shape). */
43335
+ ]).optional(),
43336
+ /** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
43145
43337
  frame: NcMediaFrameSchema.optional(),
43146
- /** Crop the attached still to the rule's condition-zone bbox (padded) —
43147
- * "show me the ZONE", not the whole scene or the subject crop. */
43338
+ /** @deprecated D897 — folded into `image: 'clean'` + `showTriggerZone` on save. */
43148
43339
  zoneCrop: boolean().optional(),
43149
43340
  /**
43150
43341
  * Also attach a short GIF cut from the stream broker's clip ring around the
@@ -43316,7 +43507,9 @@ var NcRuleInputSchema = object({
43316
43507
  * targets.
43317
43508
  */
43318
43509
  targetUsers: array(string()).optional(),
43319
- media: NcMediaPolicySchema.default({ attach: "best" }),
43510
+ /** Absent = the kind's default picture (`resolveNcMediaImage`): the subject crop for a
43511
+ * detection, the clean scene for a sensor or a sound. Set explicitly on save (D897). */
43512
+ media: NcMediaPolicySchema.default({}),
43320
43513
  throttle: NcThrottleSchema.default({
43321
43514
  cooldownSec: 60,
43322
43515
  scope: "rule-device"
@@ -44253,13 +44446,37 @@ var NcAlarmModeOpeningsSchema = object({
44253
44446
  /** Covered devices whose state could not be read (D49): neither open nor closed. */
44254
44447
  unknown: array(number().int())
44255
44448
  });
44449
+ /**
44450
+ * One alarm INPUT — a (rule, device) pair — the operator bypassed until the
44451
+ * next disarm ("Bypass this input until disarm" on a trigger notification, or
44452
+ * `nc.bypassAlarmInput`). Reported so an armed alarm with a silenced input
44453
+ * never looks fully armed (D62: off must never look like broken).
44454
+ */
44455
+ var NcAlarmInputBypassViewSchema = object({
44456
+ ruleId: string(),
44457
+ /** The rule's current name (its frozen name when the rule is gone). */
44458
+ ruleName: string(),
44459
+ /** The input: the sensor of the match, else its camera. */
44460
+ deviceId: number().int(),
44461
+ /** The input's current name. */
44462
+ name: string(),
44463
+ /** When it was bypassed (ms epoch). */
44464
+ since: number(),
44465
+ /** Triggers from this input dropped since. */
44466
+ dropped: number().int().min(0)
44467
+ });
44256
44468
  var NcAlarmLiveSchema = object({
44257
44469
  state: AlarmStateSchema,
44258
44470
  /** The mode being armed into (exit delay) or held; null when disarmed. */
44259
44471
  targetMode: AlarmArmModeSchema.nullable(),
44260
44472
  availableModes: array(AlarmArmModeSchema),
44261
44473
  openings: array(NcAlarmModeOpeningsSchema),
44262
- exclusions: array(NcAlarmExclusionViewSchema)
44474
+ exclusions: array(NcAlarmExclusionViewSchema),
44475
+ /**
44476
+ * Inputs bypassed for the rest of this arm session; cleared on disarm.
44477
+ * Defaulted so an older hub answer still parses (as "none known").
44478
+ */
44479
+ bypassedInputs: array(NcAlarmInputBypassViewSchema).default([])
44263
44480
  });
44264
44481
  var NcAlarmConfigSchema = object({
44265
44482
  /**
@@ -55090,9 +55307,11 @@ var connectivityCapability = {
55090
55307
  */
55091
55308
  durability: "restored",
55092
55309
  /**
55093
- * History (D850): none — duplicates device-status.online (one authority for availability).
55310
+ * History (D850): `connected` as a boolean series — change-only, no floor. It
55311
+ * is the upstream entity's own link (a HA connectivity sensor), not the
55312
+ * device's reachability, which stays `device-status.online`.
55094
55313
  */
55095
- history: "none",
55314
+ history: { fields: { connected: { kind: "boolean" } } },
55096
55315
  /** Clock fields: written, but excluded from the compare that decides
55097
55316
  * whether persisting is worth a SQLite commit. */
55098
55317
  volatileStateFields: ["lastChangedAt"]
@@ -55916,11 +56135,22 @@ var dishwasherCapability = {
55916
56135
  },
55917
56136
  runtimeState: DishwasherStatusSchema,
55918
56137
  durability: "session",
55919
- history: { fields: { progressPercent: {
55920
- kind: "gauge",
55921
- unit: "%",
55922
- deadband: 2
55923
- } } }
56138
+ history: { fields: {
56139
+ progressPercent: {
56140
+ kind: "gauge",
56141
+ unit: "%",
56142
+ deadband: 2
56143
+ },
56144
+ state: { kind: "enum" },
56145
+ operationState: { kind: "enum" },
56146
+ remainingSeconds: {
56147
+ kind: "gauge",
56148
+ unit: "s",
56149
+ minIntervalMs: 6e4
56150
+ },
56151
+ doorOpen: { kind: "boolean" },
56152
+ powerOn: { kind: "boolean" }
56153
+ } }
55924
56154
  };
55925
56155
  var DoorbellStatusSchema = object({
55926
56156
  /** Ms epoch of the last press. null = never observed since this provider started. */
@@ -56037,9 +56267,15 @@ var enumSensorCapability = {
56037
56267
  */
56038
56268
  durability: "restored",
56039
56269
  /**
56040
- * History (D850): none — text/enum state has no history (non-goal).
56270
+ * History (D850): the value as an `enum` series (an appliance's program or
56271
+ * operation state, an HVAC action). The option set is per device, so the
56272
+ * value list is LEARNED as values are first seen (bounded). A sensor with a
56273
+ * `format` carries a timestamp, not a state, and is not recorded.
56041
56274
  */
56042
- history: "none",
56275
+ history: { fields: { value: {
56276
+ kind: "enum",
56277
+ skipWhenSet: "format"
56278
+ } } },
56043
56279
  /** Clock fields: written, but excluded from the compare that decides
56044
56280
  * whether persisting is worth a SQLite commit. */
56045
56281
  volatileStateFields: ["lastFetchedAt"]
@@ -58013,9 +58249,10 @@ var lockControlCapability = {
58013
58249
  */
58014
58250
  durability: "restored",
58015
58251
  /**
58016
- * History (D850): none — enum state; lock events belong in the events ledger.
58252
+ * History (D850): the lock's state as an `enum` series — change-only, no
58253
+ * floor: a jam or an unlock lasting seconds is the edge an operator looks for.
58017
58254
  */
58018
- history: "none",
58255
+ history: { fields: { state: { kind: "enum" } } },
58019
58256
  /** Clock fields: written, but excluded from the compare that decides
58020
58257
  * whether persisting is worth a SQLite commit. */
58021
58258
  volatileStateFields: ["lastChangedAt"]
@@ -58189,9 +58426,18 @@ var mediaPlayerCapability = {
58189
58426
  */
58190
58427
  durability: "session",
58191
58428
  /**
58192
- * History (D850): none — `positionMs` moves continuously while playing; volume is transient.
58429
+ * History (D850): volume (a level an operator or an automation sets; the
58430
+ * default 10 s floor folds a slider drag into its end value) and mute.
58431
+ * `positionMs` is not recorded: it moves continuously while playing.
58193
58432
  */
58194
- history: "none"
58433
+ history: { fields: {
58434
+ volumeLevel: {
58435
+ kind: "gauge",
58436
+ unit: "%",
58437
+ deadband: 1
58438
+ },
58439
+ isMuted: { kind: "boolean" }
58440
+ } }
58195
58441
  };
58196
58442
  /**
58197
58443
  * mesh-network — collection cap for mesh-VPN providers.
@@ -63484,9 +63730,29 @@ var streamParamsCapability = {
63484
63730
  */
63485
63731
  durability: "restored",
63486
63732
  /**
63487
- * History (D850): none — encoder configuration.
63733
+ * History (D850): the configured bitrate and frame rate of the main and sub
63734
+ * profiles. Configuration, so change-only on the default floor: a point is an
63735
+ * operator's (or a tuner's) edit, which is exactly what a chart of a stream's
63736
+ * quality over time must show.
63488
63737
  */
63489
- history: "none",
63738
+ history: { fields: {
63739
+ "main.bitrate": {
63740
+ kind: "gauge",
63741
+ unit: "kbps"
63742
+ },
63743
+ "main.framerate": {
63744
+ kind: "gauge",
63745
+ unit: "fps"
63746
+ },
63747
+ "sub.bitrate": {
63748
+ kind: "gauge",
63749
+ unit: "kbps"
63750
+ },
63751
+ "sub.framerate": {
63752
+ kind: "gauge",
63753
+ unit: "fps"
63754
+ }
63755
+ } },
63490
63756
  /** Clock fields: written, but excluded from the compare that decides
63491
63757
  * whether persisting is worth a SQLite commit. */
63492
63758
  volatileStateFields: ["lastFetchedAt"]
@@ -66664,6 +66930,15 @@ var BaseDevice = class {
66664
66930
  * Drivers can use the `getProbeFlags()` helper to read the flag bag
66665
66931
  * with a typed cast.
66666
66932
  *
66933
+ * Answer what you KNOW. A plain array is read as the complete list only
66934
+ * while this device is `online` and probed; return
66935
+ * `accessoryChildrenUnknown(reason)` whenever you cannot know the list right
66936
+ * now (no credentials, parent not connected, a failed or partial read) —
66937
+ * the kernel then deletes nothing. Return `accessoryChildrenComplete(list)`
66938
+ * to say "connected, and this is the complete list" explicitly. A shrink is
66939
+ * deleted only after a second agreeing complete read on a later probe (D49;
66940
+ * `packages/system/src/kernel/moleculer/accessory-prune-gate.ts`).
66941
+ *
66667
66942
  * Default: no children.
66668
66943
  */
66669
66944
  getAccessoryChildren() {
@@ -70795,7 +71070,19 @@ Object.freeze({
70795
71070
  addonId: null,
70796
71071
  access: "view"
70797
71072
  },
70798
- "logDestination.query": {
71073
+ "logDestination.cancelRead": {
71074
+ capName: "log-destination",
71075
+ capScope: "system",
71076
+ addonId: null,
71077
+ access: "create"
71078
+ },
71079
+ "logDestination.describeRead": {
71080
+ capName: "log-destination",
71081
+ capScope: "system",
71082
+ addonId: null,
71083
+ access: "view"
71084
+ },
71085
+ "logDestination.read": {
70799
71086
  capName: "log-destination",
70800
71087
  capScope: "system",
70801
71088
  addonId: null,
@@ -76868,6 +77155,11 @@ Object.freeze({
76868
77155
  form: "single",
76869
77156
  optional: false
76870
77157
  }],
77158
+ "logDestination.read": [{
77159
+ name: "deviceId",
77160
+ form: "single",
77161
+ optional: true
77162
+ }],
76871
77163
  "mediaPlayer.getStatus": [{
76872
77164
  name: "deviceId",
76873
77165
  form: "single",
package/dist/addon.mjs CHANGED
@@ -5414,7 +5414,7 @@ var ZodIssueCode = {
5414
5414
  var ZodFirstPartyTypeKind;
5415
5415
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5416
5416
  //#endregion
5417
- //#region ../types/dist/sleep-yKL5gfrH.mjs
5417
+ //#region ../types/dist/sleep-BSuCCFjf.mjs
5418
5418
  /**
5419
5419
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5420
5420
  * window to float samples (D455).
@@ -17115,7 +17115,19 @@ var DeviceHistorySubjectSchema = discriminatedUnion("kind", [object({
17115
17115
  kind: literal("node"),
17116
17116
  nodeId: string().min(1)
17117
17117
  })]);
17118
+ /**
17119
+ * `enum` stores a STATE as the ordinal of its value in the series' value list
17120
+ * (`DeviceHistorySeriesInfo.values`, append-only, so an ordinal never changes
17121
+ * meaning); a rollup keeps the time spent in each state (`states`).
17122
+ */
17118
17123
  var DeviceHistoryKindSchema = _enum([
17124
+ "gauge",
17125
+ "counter",
17126
+ "boolean",
17127
+ "enum"
17128
+ ]);
17129
+ /** What a PRODUCER may declare. `enum` is cap-only: its value list is the cap field's. */
17130
+ var DeviceHistoryProducerKindSchema = _enum([
17119
17131
  "gauge",
17120
17132
  "counter",
17121
17133
  "boolean"
@@ -17152,7 +17164,13 @@ var SeriesInfoSchema = object({
17152
17164
  /** `null` is unknown (a `unitFrom` series whose device does not state a unit right now), never a guess. */
17153
17165
  unit: string().nullable(),
17154
17166
  displayName: string(),
17155
- source: _enum(["cap", "addon"]),
17167
+ source: _enum([
17168
+ "cap",
17169
+ "addon",
17170
+ "derived"
17171
+ ]),
17172
+ /** `enum`: the value of each ordinal (index = ordinal); `null` for every other kind. */
17173
+ values: array(string()).readonly().nullable(),
17156
17174
  firstTs: number(),
17157
17175
  lastTs: number()
17158
17176
  });
@@ -17166,17 +17184,31 @@ var QueryPointSchema = object({
17166
17184
  twMean: number().nullable(),
17167
17185
  min: number(),
17168
17186
  max: number(),
17169
- /** `null` is unknown, never zero (D393). */
17170
- last: number().nullable()
17187
+ /** `null` is unknown, never zero (D393). For an `enum` series: the ordinal of {@link state}. */
17188
+ last: number().nullable(),
17189
+ /**
17190
+ * The increase over the point: a `counter`'s growth since the previous point
17191
+ * or bucket (a drop is a reset, counted from zero), and for
17192
+ * {@link DEVICE_HISTORY_ENERGY_KEY} the kWh used in the bucket. `null` for
17193
+ * every other kind, and when it cannot be known.
17194
+ */
17195
+ delta: number().nullable(),
17196
+ /** `enum`: the state in force at the end of the point (the name of `last`); `null` otherwise. */
17197
+ state: string().nullable(),
17198
+ /** `enum` rollup: milliseconds spent in each state inside the bucket; `null` for raw points and other kinds. */
17199
+ states: record(string(), number()).nullable()
17171
17200
  });
17172
17201
  var QuerySeriesSchema = object({
17173
17202
  scope: string(),
17174
17203
  /** The last point STRICTLY BEFORE `from` in the chosen tier, so a step chart can start at the held value. */
17175
17204
  before: object({
17176
17205
  t: number(),
17177
- value: number().nullable()
17206
+ value: number().nullable(),
17207
+ state: string().nullable()
17178
17208
  }).nullable(),
17179
- points: array(QueryPointSchema).readonly()
17209
+ points: array(QueryPointSchema).readonly(),
17210
+ /** A derived key: the stored key its points were computed from; `null` for a stored series. */
17211
+ derivedFrom: string().nullable()
17180
17212
  });
17181
17213
  /** The window part of a query, shared by the device and node forms. */
17182
17214
  var QueryWindowShape = {
@@ -17192,6 +17224,23 @@ var QueryResultSchema = object({
17192
17224
  series: array(QuerySeriesSchema).readonly(),
17193
17225
  truncated: boolean()
17194
17226
  });
17227
+ /** One read of a batch: a device's key or a node's key (exactly one subject). */
17228
+ var QueryManyItemSchema = union([object({
17229
+ deviceId: number().int(),
17230
+ key: string(),
17231
+ scope: string().optional()
17232
+ }), object({
17233
+ forNodeId: string().min(1),
17234
+ key: string(),
17235
+ scope: string().optional()
17236
+ })]);
17237
+ var QueryManyEntrySchema = discriminatedUnion("ok", [object({
17238
+ ok: literal(true),
17239
+ result: QueryResultSchema
17240
+ }), object({
17241
+ ok: literal(false),
17242
+ error: string()
17243
+ })]);
17195
17244
  var TierStatusSchema = object({
17196
17245
  tier: DeviceHistoryResolutionSchema,
17197
17246
  /** `null` until the first background count answered. */
@@ -17247,16 +17296,22 @@ var DeviceHistoryStatusSchema = object({
17247
17296
  lastRefreshAt: number().nullable()
17248
17297
  })
17249
17298
  });
17250
- method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly()), method(object({ nodeId: string().min(1) }), array(SeriesInfoSchema).readonly(), { auth: "admin" }), method(object({
17299
+ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly()), method(object({ forNodeId: string().min(1) }), array(SeriesInfoSchema).readonly(), { auth: "admin" }), method(object({
17251
17300
  deviceId: number().int(),
17252
17301
  ...QueryWindowShape
17253
17302
  }), QueryResultSchema), method(object({
17254
- nodeId: string().min(1),
17303
+ forNodeId: string().min(1),
17255
17304
  ...QueryWindowShape
17256
17305
  }), QueryResultSchema, { auth: "admin" }), method(object({
17306
+ items: array(QueryManyItemSchema).min(1).max(24),
17307
+ from: QueryWindowShape.from,
17308
+ to: QueryWindowShape.to,
17309
+ resolution: QueryWindowShape.resolution,
17310
+ maxPoints: QueryWindowShape.maxPoints
17311
+ }), object({ results: array(QueryManyEntrySchema).readonly() }), { auth: "admin" }), method(object({
17257
17312
  name: string().regex(/^[a-z0-9-]+$/),
17258
17313
  subjectKind: _enum(["device", "node"]),
17259
- kind: DeviceHistoryKindSchema,
17314
+ kind: DeviceHistoryProducerKindSchema,
17260
17315
  unit: string().optional(),
17261
17316
  displayName: string().min(1),
17262
17317
  ingest: _enum(["points", "buckets"])
@@ -40465,14 +40520,106 @@ var LogEntrySchema = object({
40465
40520
  meta: record(string(), unknown()).optional(),
40466
40521
  tags: record(string(), string()).optional()
40467
40522
  });
40468
- method(LogEntrySchema, _void(), { kind: "mutation" }), method(object({
40469
- scope: array(string()).optional(),
40523
+ /**
40524
+ * A history READ against one destination (D898).
40525
+ *
40526
+ * Every filter is applied by the PROVIDER, before the limit — a filter the
40527
+ * browser applied after the limit is what made a rare device's lines
40528
+ * unreachable behind a busy one's. `before` / `after` are cursors the provider
40529
+ * minted (opaque to everyone else): a file position for the rotated files, a
40530
+ * nanosecond timestamp for Loki.
40531
+ *
40532
+ * A read is BOUNDED by `budgetMs`: a filter that matches nothing on a 30-day
40533
+ * store answers `done: false` with the cursor it reached and the bytes it
40534
+ * scanned, and the caller decides whether to go on. That is what makes a long
40535
+ * scan show progress and stop when asked — `cancelRead` ends the slice in
40536
+ * flight, and not asking for the next slice ends the scan.
40537
+ */
40538
+ var LogReadQuerySchema = object({
40539
+ /** Correlates `cancelRead`. Caller-chosen, unique per in-flight read. */
40540
+ requestId: string().min(1).max(64).optional(),
40541
+ /** The device the line is about (`tags.deviceId`, numeric). */
40542
+ deviceId: number().int().optional(),
40543
+ /**
40544
+ * The emitting addon — bare manifest id; `@<version>` / `::<sub>` suffixes
40545
+ * match. Not `addonId`: a cap router reads that name as "which provider".
40546
+ */
40547
+ fromAddonId: string().min(1).max(200).optional(),
40548
+ /**
40549
+ * The emitting node: matches the agent that emitted the line, the node
40550
+ * itself, or a worker under it (`<agent>/<runner>`) — the `agentId`
40551
+ * semantics of `matchesLogTags`. Not `nodeId`: a cap router reads that
40552
+ * name as "which node's provider".
40553
+ */
40554
+ fromNodeId: string().min(1).max(200).optional(),
40555
+ /** Any other tag, exact match (AND). */
40556
+ tags: record(string(), union([string(), number()])).optional(),
40557
+ /** Severity FLOOR: this level and above. */
40470
40558
  level: LogLevelSchema.optional(),
40471
- since: date().optional(),
40472
- until: date().optional(),
40473
- limit: number().optional(),
40474
- tags: record(string(), string()).optional()
40475
- }), array(LogEntrySchema).readonly());
40559
+ /** Case-insensitive substring over message, scope, tag values and meta values. */
40560
+ text: string().min(1).max(200).optional(),
40561
+ /** Epoch ms, inclusive. */
40562
+ since: number().optional(),
40563
+ /** Epoch ms, inclusive. */
40564
+ until: number().optional(),
40565
+ /** Older than this cursor (exclusive). Absent with `after` absent ⇒ from the newest. */
40566
+ before: string().min(1).max(1024).optional(),
40567
+ /** Newer than this cursor (exclusive). */
40568
+ after: string().min(1).max(1024).optional(),
40569
+ limit: number().int().min(1).max(1e3).optional(),
40570
+ /** Wall-clock bound of this slice. The provider caps it. */
40571
+ budgetMs: number().int().min(50).max(1e4).optional()
40572
+ });
40573
+ var LogReadResultSchema = object({
40574
+ /** Newest first. */
40575
+ entries: array(object({
40576
+ /** `<bootId>.<seq>` minted by the emitting LogManager — the dedupe key. */
40577
+ id: string().optional(),
40578
+ /** Epoch ms. */
40579
+ timestamp: number(),
40580
+ level: LogLevelSchema,
40581
+ scope: string().optional(),
40582
+ message: string(),
40583
+ tags: record(string(), union([string(), number()])).optional(),
40584
+ meta: record(string(), unknown()).optional()
40585
+ })),
40586
+ /** Pass as `before` for the next older page; null when nothing older exists. */
40587
+ nextBefore: string().nullable(),
40588
+ /** Pass as `after` to read what arrived since; null when unknown. */
40589
+ nextAfter: string().nullable(),
40590
+ /** Bytes this slice read (files) or received (remote). Progress, not a promise. */
40591
+ scannedBytes: number().int().nonnegative(),
40592
+ /**
40593
+ * True when the scan in this direction reached the end of the store.
40594
+ * False with fewer than `limit` entries means the budget ran out first —
40595
+ * call again with `nextBefore` to go on.
40596
+ */
40597
+ done: boolean(),
40598
+ /** True when `cancelRead` ended this slice early. */
40599
+ cancelled: boolean().optional()
40600
+ });
40601
+ var LogReadCapabilitiesSchema = object({
40602
+ /** False ⇒ this destination only ships lines (console, forwarder, an unconfigured Loki). */
40603
+ readable: boolean(),
40604
+ /** Why not, when `readable` is false — rendered next to the source. */
40605
+ reason: string().nullable(),
40606
+ /** Filters the provider applies itself. A false one is applied by nobody. */
40607
+ filters: object({
40608
+ deviceId: boolean(),
40609
+ addonId: boolean(),
40610
+ nodeId: boolean(),
40611
+ tags: boolean(),
40612
+ level: boolean(),
40613
+ text: boolean(),
40614
+ timeRange: boolean()
40615
+ }),
40616
+ /** How far back the store reaches, when the provider knows (days). */
40617
+ retentionDays: number().nullable()
40618
+ });
40619
+ 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() }), {
40620
+ kind: "mutation",
40621
+ auth: "admin"
40622
+ });
40476
40623
  /**
40477
40624
  * `login-method` — collection cap through which auth addons contribute
40478
40625
  * their pre-auth login surfaces to the login page. This is the SINGLE,
@@ -42190,9 +42337,11 @@ var alarmPanelCapability = {
42190
42337
  */
42191
42338
  durability: "restored",
42192
42339
  /**
42193
- * History (D850): none — enum state; arm/disarm history belongs in the events ledger.
42340
+ * History (D850): the panel's lifecycle state as an `enum` series —
42341
+ * change-only, no floor, so an `arming -> pending -> triggered` sequence of a
42342
+ * few seconds keeps every step. Who armed it stays in the events ledger.
42194
42343
  */
42195
- history: "none",
42344
+ history: { fields: { state: { kind: "enum" } } },
42196
42345
  /** Clock fields: written, but excluded from the compare that decides
42197
42346
  * whether persisting is worth a SQLite commit. */
42198
42347
  volatileStateFields: ["lastChangedAt"]
@@ -43070,6 +43219,33 @@ var NcRuleTargetSchema = object({
43070
43219
  params: record(string(), unknown()).optional()
43071
43220
  });
43072
43221
  /**
43222
+ * WHAT THE NOTIFICATION'S PICTURE IS (D897) — the ONE media choice of a rule.
43223
+ *
43224
+ * Every mode starts from the same CLEAN source frame of the trigger moment
43225
+ * (keyFrame → sceneFrame → lastSceneFrame, narrowed to the trigger instant and
43226
+ * to the zone that fired the rule) and renders it once at send time:
43227
+ * - `scene-boxes` — the whole scene, the subject outlined thick in the accent
43228
+ * colour and every OTHER track visible at that instant outlined thin, each
43229
+ * labelled with class and confidence ("dog 87%").
43230
+ * - `crop` — the subject cut out of that frame around its box at that instant.
43231
+ * - `clean` — the whole scene with nothing drawn on it.
43232
+ * - `none` — no picture.
43233
+ *
43234
+ * A mode that cannot be honoured (no box at that instant, a photograph with no
43235
+ * tracked subject) ships `clean` and names the reason in the log, per camera.
43236
+ * It replaces the `attach` × `frame` × `zoneCrop` triple, which let one rule
43237
+ * ship a crop on one event and a boxed scene on the next depending on which
43238
+ * stored kind had landed.
43239
+ */
43240
+ var NcMediaImageSchema = _enum([
43241
+ "scene-boxes",
43242
+ "crop",
43243
+ "clean",
43244
+ "none"
43245
+ ]);
43246
+ /**
43247
+ * @deprecated Read only by `normalizeNcMediaPolicy` (D897) — see {@link NcMediaImageSchema}.
43248
+ *
43073
43249
  * Media attachment policy (P1 still-image subset).
43074
43250
  * - `best` — the best AVAILABLE subject image at dispatch time (D-3).
43075
43251
  * - `best-matching` — the media that explains WHY the rule fired: a rule
@@ -43083,6 +43259,8 @@ var NcRuleTargetSchema = object({
43083
43259
  * - `none` — no attachment.
43084
43260
  */
43085
43261
  /**
43262
+ * @deprecated Read only by `normalizeNcMediaPolicy` (D897) — see {@link NcMediaImageSchema}.
43263
+ *
43086
43264
  * WHAT THE PICTURE SHOWS — chosen explicitly, because the implicit ladders
43087
43265
  * conflate it with the selection strategy and betray the request: asking for
43088
43266
  * the clean scene frame on an object-event owner used to start at
@@ -43111,16 +43289,29 @@ var NcMediaFrameSchema = _enum([
43111
43289
  */
43112
43290
  var NcLinkedCameraModeSchema = _enum(["mosaic", "each"]);
43113
43291
  var NcMediaPolicySchema = object({
43292
+ /**
43293
+ * The picture — see {@link NcMediaImageSchema}. Absent on a rule nobody has
43294
+ * saved since D897: `normalizeNcMediaPolicy` derives it from the legacy
43295
+ * triple below, at load and at every write, and the store keeps only this.
43296
+ */
43297
+ image: NcMediaImageSchema.optional(),
43298
+ /**
43299
+ * Draw the zone that FIRED the rule on the picture (`scene-boxes` / `clean`;
43300
+ * a `crop` never shows it). Valid only on a rule whose trigger is a zone —
43301
+ * `conditions.zones` or an occupancy zone — and refused on save otherwise.
43302
+ * Replaces `zoneCrop`.
43303
+ */
43304
+ showTriggerZone: boolean().optional(),
43305
+ /** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
43114
43306
  attach: _enum([
43115
43307
  "best",
43116
43308
  "best-matching",
43117
43309
  "keyFrame",
43118
43310
  "none"
43119
- ]).default("best"),
43120
- /** What the still shows. Absent = `cropped` (the historical `best` shape). */
43311
+ ]).optional(),
43312
+ /** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
43121
43313
  frame: NcMediaFrameSchema.optional(),
43122
- /** Crop the attached still to the rule's condition-zone bbox (padded) —
43123
- * "show me the ZONE", not the whole scene or the subject crop. */
43314
+ /** @deprecated D897 — folded into `image: 'clean'` + `showTriggerZone` on save. */
43124
43315
  zoneCrop: boolean().optional(),
43125
43316
  /**
43126
43317
  * Also attach a short GIF cut from the stream broker's clip ring around the
@@ -43292,7 +43483,9 @@ var NcRuleInputSchema = object({
43292
43483
  * targets.
43293
43484
  */
43294
43485
  targetUsers: array(string()).optional(),
43295
- media: NcMediaPolicySchema.default({ attach: "best" }),
43486
+ /** Absent = the kind's default picture (`resolveNcMediaImage`): the subject crop for a
43487
+ * detection, the clean scene for a sensor or a sound. Set explicitly on save (D897). */
43488
+ media: NcMediaPolicySchema.default({}),
43296
43489
  throttle: NcThrottleSchema.default({
43297
43490
  cooldownSec: 60,
43298
43491
  scope: "rule-device"
@@ -44229,13 +44422,37 @@ var NcAlarmModeOpeningsSchema = object({
44229
44422
  /** Covered devices whose state could not be read (D49): neither open nor closed. */
44230
44423
  unknown: array(number().int())
44231
44424
  });
44425
+ /**
44426
+ * One alarm INPUT — a (rule, device) pair — the operator bypassed until the
44427
+ * next disarm ("Bypass this input until disarm" on a trigger notification, or
44428
+ * `nc.bypassAlarmInput`). Reported so an armed alarm with a silenced input
44429
+ * never looks fully armed (D62: off must never look like broken).
44430
+ */
44431
+ var NcAlarmInputBypassViewSchema = object({
44432
+ ruleId: string(),
44433
+ /** The rule's current name (its frozen name when the rule is gone). */
44434
+ ruleName: string(),
44435
+ /** The input: the sensor of the match, else its camera. */
44436
+ deviceId: number().int(),
44437
+ /** The input's current name. */
44438
+ name: string(),
44439
+ /** When it was bypassed (ms epoch). */
44440
+ since: number(),
44441
+ /** Triggers from this input dropped since. */
44442
+ dropped: number().int().min(0)
44443
+ });
44232
44444
  var NcAlarmLiveSchema = object({
44233
44445
  state: AlarmStateSchema,
44234
44446
  /** The mode being armed into (exit delay) or held; null when disarmed. */
44235
44447
  targetMode: AlarmArmModeSchema.nullable(),
44236
44448
  availableModes: array(AlarmArmModeSchema),
44237
44449
  openings: array(NcAlarmModeOpeningsSchema),
44238
- exclusions: array(NcAlarmExclusionViewSchema)
44450
+ exclusions: array(NcAlarmExclusionViewSchema),
44451
+ /**
44452
+ * Inputs bypassed for the rest of this arm session; cleared on disarm.
44453
+ * Defaulted so an older hub answer still parses (as "none known").
44454
+ */
44455
+ bypassedInputs: array(NcAlarmInputBypassViewSchema).default([])
44239
44456
  });
44240
44457
  var NcAlarmConfigSchema = object({
44241
44458
  /**
@@ -55066,9 +55283,11 @@ var connectivityCapability = {
55066
55283
  */
55067
55284
  durability: "restored",
55068
55285
  /**
55069
- * History (D850): none — duplicates device-status.online (one authority for availability).
55286
+ * History (D850): `connected` as a boolean series — change-only, no floor. It
55287
+ * is the upstream entity's own link (a HA connectivity sensor), not the
55288
+ * device's reachability, which stays `device-status.online`.
55070
55289
  */
55071
- history: "none",
55290
+ history: { fields: { connected: { kind: "boolean" } } },
55072
55291
  /** Clock fields: written, but excluded from the compare that decides
55073
55292
  * whether persisting is worth a SQLite commit. */
55074
55293
  volatileStateFields: ["lastChangedAt"]
@@ -55892,11 +56111,22 @@ var dishwasherCapability = {
55892
56111
  },
55893
56112
  runtimeState: DishwasherStatusSchema,
55894
56113
  durability: "session",
55895
- history: { fields: { progressPercent: {
55896
- kind: "gauge",
55897
- unit: "%",
55898
- deadband: 2
55899
- } } }
56114
+ history: { fields: {
56115
+ progressPercent: {
56116
+ kind: "gauge",
56117
+ unit: "%",
56118
+ deadband: 2
56119
+ },
56120
+ state: { kind: "enum" },
56121
+ operationState: { kind: "enum" },
56122
+ remainingSeconds: {
56123
+ kind: "gauge",
56124
+ unit: "s",
56125
+ minIntervalMs: 6e4
56126
+ },
56127
+ doorOpen: { kind: "boolean" },
56128
+ powerOn: { kind: "boolean" }
56129
+ } }
55900
56130
  };
55901
56131
  var DoorbellStatusSchema = object({
55902
56132
  /** Ms epoch of the last press. null = never observed since this provider started. */
@@ -56013,9 +56243,15 @@ var enumSensorCapability = {
56013
56243
  */
56014
56244
  durability: "restored",
56015
56245
  /**
56016
- * History (D850): none — text/enum state has no history (non-goal).
56246
+ * History (D850): the value as an `enum` series (an appliance's program or
56247
+ * operation state, an HVAC action). The option set is per device, so the
56248
+ * value list is LEARNED as values are first seen (bounded). A sensor with a
56249
+ * `format` carries a timestamp, not a state, and is not recorded.
56017
56250
  */
56018
- history: "none",
56251
+ history: { fields: { value: {
56252
+ kind: "enum",
56253
+ skipWhenSet: "format"
56254
+ } } },
56019
56255
  /** Clock fields: written, but excluded from the compare that decides
56020
56256
  * whether persisting is worth a SQLite commit. */
56021
56257
  volatileStateFields: ["lastFetchedAt"]
@@ -57989,9 +58225,10 @@ var lockControlCapability = {
57989
58225
  */
57990
58226
  durability: "restored",
57991
58227
  /**
57992
- * History (D850): none — enum state; lock events belong in the events ledger.
58228
+ * History (D850): the lock's state as an `enum` series — change-only, no
58229
+ * floor: a jam or an unlock lasting seconds is the edge an operator looks for.
57993
58230
  */
57994
- history: "none",
58231
+ history: { fields: { state: { kind: "enum" } } },
57995
58232
  /** Clock fields: written, but excluded from the compare that decides
57996
58233
  * whether persisting is worth a SQLite commit. */
57997
58234
  volatileStateFields: ["lastChangedAt"]
@@ -58165,9 +58402,18 @@ var mediaPlayerCapability = {
58165
58402
  */
58166
58403
  durability: "session",
58167
58404
  /**
58168
- * History (D850): none — `positionMs` moves continuously while playing; volume is transient.
58405
+ * History (D850): volume (a level an operator or an automation sets; the
58406
+ * default 10 s floor folds a slider drag into its end value) and mute.
58407
+ * `positionMs` is not recorded: it moves continuously while playing.
58169
58408
  */
58170
- history: "none"
58409
+ history: { fields: {
58410
+ volumeLevel: {
58411
+ kind: "gauge",
58412
+ unit: "%",
58413
+ deadband: 1
58414
+ },
58415
+ isMuted: { kind: "boolean" }
58416
+ } }
58171
58417
  };
58172
58418
  /**
58173
58419
  * mesh-network — collection cap for mesh-VPN providers.
@@ -63460,9 +63706,29 @@ var streamParamsCapability = {
63460
63706
  */
63461
63707
  durability: "restored",
63462
63708
  /**
63463
- * History (D850): none — encoder configuration.
63709
+ * History (D850): the configured bitrate and frame rate of the main and sub
63710
+ * profiles. Configuration, so change-only on the default floor: a point is an
63711
+ * operator's (or a tuner's) edit, which is exactly what a chart of a stream's
63712
+ * quality over time must show.
63464
63713
  */
63465
- history: "none",
63714
+ history: { fields: {
63715
+ "main.bitrate": {
63716
+ kind: "gauge",
63717
+ unit: "kbps"
63718
+ },
63719
+ "main.framerate": {
63720
+ kind: "gauge",
63721
+ unit: "fps"
63722
+ },
63723
+ "sub.bitrate": {
63724
+ kind: "gauge",
63725
+ unit: "kbps"
63726
+ },
63727
+ "sub.framerate": {
63728
+ kind: "gauge",
63729
+ unit: "fps"
63730
+ }
63731
+ } },
63466
63732
  /** Clock fields: written, but excluded from the compare that decides
63467
63733
  * whether persisting is worth a SQLite commit. */
63468
63734
  volatileStateFields: ["lastFetchedAt"]
@@ -66640,6 +66906,15 @@ var BaseDevice = class {
66640
66906
  * Drivers can use the `getProbeFlags()` helper to read the flag bag
66641
66907
  * with a typed cast.
66642
66908
  *
66909
+ * Answer what you KNOW. A plain array is read as the complete list only
66910
+ * while this device is `online` and probed; return
66911
+ * `accessoryChildrenUnknown(reason)` whenever you cannot know the list right
66912
+ * now (no credentials, parent not connected, a failed or partial read) —
66913
+ * the kernel then deletes nothing. Return `accessoryChildrenComplete(list)`
66914
+ * to say "connected, and this is the complete list" explicitly. A shrink is
66915
+ * deleted only after a second agreeing complete read on a later probe (D49;
66916
+ * `packages/system/src/kernel/moleculer/accessory-prune-gate.ts`).
66917
+ *
66643
66918
  * Default: no children.
66644
66919
  */
66645
66920
  getAccessoryChildren() {
@@ -70771,7 +71046,19 @@ Object.freeze({
70771
71046
  addonId: null,
70772
71047
  access: "view"
70773
71048
  },
70774
- "logDestination.query": {
71049
+ "logDestination.cancelRead": {
71050
+ capName: "log-destination",
71051
+ capScope: "system",
71052
+ addonId: null,
71053
+ access: "create"
71054
+ },
71055
+ "logDestination.describeRead": {
71056
+ capName: "log-destination",
71057
+ capScope: "system",
71058
+ addonId: null,
71059
+ access: "view"
71060
+ },
71061
+ "logDestination.read": {
70775
71062
  capName: "log-destination",
70776
71063
  capScope: "system",
70777
71064
  addonId: null,
@@ -76844,6 +77131,11 @@ Object.freeze({
76844
77131
  form: "single",
76845
77132
  optional: false
76846
77133
  }],
77134
+ "logDestination.read": [{
77135
+ name: "deviceId",
77136
+ form: "single",
77137
+ optional: true
77138
+ }],
76847
77139
  "mediaPlayer.getStatus": [{
76848
77140
  name: "deviceId",
76849
77141
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-rtsp",
3
- "version": "1.2.131",
3
+ "version": "1.2.132",
4
4
  "description": "Generic RTSP camera device provider addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",