@camstack/addon-provider-bosch 0.1.5 → 0.1.7

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.
@@ -1,4 +1,4 @@
1
- import { b as errMsg } from "./dist-DNznrlG_.mjs";
1
+ import { b as errMsg } from "./dist-Bq7pq5mZ.mjs";
2
2
  //#region src/shared/oauth-callback.ts
3
3
  /** A code on its own: no scheme, no query, no separators. */
4
4
  var BARE_CODE = /^[A-Za-z0-9._~-]+$/;
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-CIIror0W.js");
1
+ const require_dist = require("./dist-DabGJIyi.js");
2
2
  //#region src/shared/oauth-callback.ts
3
3
  /** A code on its own: no scheme, no query, no separators. */
4
4
  var BARE_CODE = /^[A-Za-z0-9._~-]+$/;
@@ -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).
@@ -17020,7 +17020,19 @@ var DeviceHistorySubjectSchema = discriminatedUnion("kind", [object({
17020
17020
  kind: literal("node"),
17021
17021
  nodeId: string().min(1)
17022
17022
  })]);
17023
+ /**
17024
+ * `enum` stores a STATE as the ordinal of its value in the series' value list
17025
+ * (`DeviceHistorySeriesInfo.values`, append-only, so an ordinal never changes
17026
+ * meaning); a rollup keeps the time spent in each state (`states`).
17027
+ */
17023
17028
  var DeviceHistoryKindSchema = _enum([
17029
+ "gauge",
17030
+ "counter",
17031
+ "boolean",
17032
+ "enum"
17033
+ ]);
17034
+ /** What a PRODUCER may declare. `enum` is cap-only: its value list is the cap field's. */
17035
+ var DeviceHistoryProducerKindSchema = _enum([
17024
17036
  "gauge",
17025
17037
  "counter",
17026
17038
  "boolean"
@@ -17057,7 +17069,13 @@ var SeriesInfoSchema = object({
17057
17069
  /** `null` is unknown (a `unitFrom` series whose device does not state a unit right now), never a guess. */
17058
17070
  unit: string().nullable(),
17059
17071
  displayName: string(),
17060
- source: _enum(["cap", "addon"]),
17072
+ source: _enum([
17073
+ "cap",
17074
+ "addon",
17075
+ "derived"
17076
+ ]),
17077
+ /** `enum`: the value of each ordinal (index = ordinal); `null` for every other kind. */
17078
+ values: array(string()).readonly().nullable(),
17061
17079
  firstTs: number(),
17062
17080
  lastTs: number()
17063
17081
  });
@@ -17071,17 +17089,31 @@ var QueryPointSchema = object({
17071
17089
  twMean: number().nullable(),
17072
17090
  min: number(),
17073
17091
  max: number(),
17074
- /** `null` is unknown, never zero (D393). */
17075
- last: number().nullable()
17092
+ /** `null` is unknown, never zero (D393). For an `enum` series: the ordinal of {@link state}. */
17093
+ last: number().nullable(),
17094
+ /**
17095
+ * The increase over the point: a `counter`'s growth since the previous point
17096
+ * or bucket (a drop is a reset, counted from zero), and for
17097
+ * {@link DEVICE_HISTORY_ENERGY_KEY} the kWh used in the bucket. `null` for
17098
+ * every other kind, and when it cannot be known.
17099
+ */
17100
+ delta: number().nullable(),
17101
+ /** `enum`: the state in force at the end of the point (the name of `last`); `null` otherwise. */
17102
+ state: string().nullable(),
17103
+ /** `enum` rollup: milliseconds spent in each state inside the bucket; `null` for raw points and other kinds. */
17104
+ states: record(string(), number()).nullable()
17076
17105
  });
17077
17106
  var QuerySeriesSchema = object({
17078
17107
  scope: string(),
17079
17108
  /** The last point STRICTLY BEFORE `from` in the chosen tier, so a step chart can start at the held value. */
17080
17109
  before: object({
17081
17110
  t: number(),
17082
- value: number().nullable()
17111
+ value: number().nullable(),
17112
+ state: string().nullable()
17083
17113
  }).nullable(),
17084
- points: array(QueryPointSchema).readonly()
17114
+ points: array(QueryPointSchema).readonly(),
17115
+ /** A derived key: the stored key its points were computed from; `null` for a stored series. */
17116
+ derivedFrom: string().nullable()
17085
17117
  });
17086
17118
  /** The window part of a query, shared by the device and node forms. */
17087
17119
  var QueryWindowShape = {
@@ -17097,6 +17129,23 @@ var QueryResultSchema = object({
17097
17129
  series: array(QuerySeriesSchema).readonly(),
17098
17130
  truncated: boolean()
17099
17131
  });
17132
+ /** One read of a batch: a device's key or a node's key (exactly one subject). */
17133
+ var QueryManyItemSchema = union([object({
17134
+ deviceId: number().int(),
17135
+ key: string(),
17136
+ scope: string().optional()
17137
+ }), object({
17138
+ forNodeId: string().min(1),
17139
+ key: string(),
17140
+ scope: string().optional()
17141
+ })]);
17142
+ var QueryManyEntrySchema = discriminatedUnion("ok", [object({
17143
+ ok: literal(true),
17144
+ result: QueryResultSchema
17145
+ }), object({
17146
+ ok: literal(false),
17147
+ error: string()
17148
+ })]);
17100
17149
  var TierStatusSchema = object({
17101
17150
  tier: DeviceHistoryResolutionSchema,
17102
17151
  /** `null` until the first background count answered. */
@@ -17152,16 +17201,22 @@ var DeviceHistoryStatusSchema = object({
17152
17201
  lastRefreshAt: number().nullable()
17153
17202
  })
17154
17203
  });
17155
- method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly()), method(object({ nodeId: string().min(1) }), array(SeriesInfoSchema).readonly(), { auth: "admin" }), method(object({
17204
+ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly()), method(object({ forNodeId: string().min(1) }), array(SeriesInfoSchema).readonly(), { auth: "admin" }), method(object({
17156
17205
  deviceId: number().int(),
17157
17206
  ...QueryWindowShape
17158
17207
  }), QueryResultSchema), method(object({
17159
- nodeId: string().min(1),
17208
+ forNodeId: string().min(1),
17160
17209
  ...QueryWindowShape
17161
17210
  }), QueryResultSchema, { auth: "admin" }), method(object({
17211
+ items: array(QueryManyItemSchema).min(1).max(24),
17212
+ from: QueryWindowShape.from,
17213
+ to: QueryWindowShape.to,
17214
+ resolution: QueryWindowShape.resolution,
17215
+ maxPoints: QueryWindowShape.maxPoints
17216
+ }), object({ results: array(QueryManyEntrySchema).readonly() }), { auth: "admin" }), method(object({
17162
17217
  name: string().regex(/^[a-z0-9-]+$/),
17163
17218
  subjectKind: _enum(["device", "node"]),
17164
- kind: DeviceHistoryKindSchema,
17219
+ kind: DeviceHistoryProducerKindSchema,
17165
17220
  unit: string().optional(),
17166
17221
  displayName: string().min(1),
17167
17222
  ingest: _enum(["points", "buckets"])
@@ -40387,14 +40442,106 @@ var LogEntrySchema = object({
40387
40442
  meta: record(string(), unknown()).optional(),
40388
40443
  tags: record(string(), string()).optional()
40389
40444
  });
40390
- method(LogEntrySchema, _void(), { kind: "mutation" }), method(object({
40391
- scope: array(string()).optional(),
40445
+ /**
40446
+ * A history READ against one destination (D898).
40447
+ *
40448
+ * Every filter is applied by the PROVIDER, before the limit — a filter the
40449
+ * browser applied after the limit is what made a rare device's lines
40450
+ * unreachable behind a busy one's. `before` / `after` are cursors the provider
40451
+ * minted (opaque to everyone else): a file position for the rotated files, a
40452
+ * nanosecond timestamp for Loki.
40453
+ *
40454
+ * A read is BOUNDED by `budgetMs`: a filter that matches nothing on a 30-day
40455
+ * store answers `done: false` with the cursor it reached and the bytes it
40456
+ * scanned, and the caller decides whether to go on. That is what makes a long
40457
+ * scan show progress and stop when asked — `cancelRead` ends the slice in
40458
+ * flight, and not asking for the next slice ends the scan.
40459
+ */
40460
+ var LogReadQuerySchema = object({
40461
+ /** Correlates `cancelRead`. Caller-chosen, unique per in-flight read. */
40462
+ requestId: string().min(1).max(64).optional(),
40463
+ /** The device the line is about (`tags.deviceId`, numeric). */
40464
+ deviceId: number().int().optional(),
40465
+ /**
40466
+ * The emitting addon — bare manifest id; `@<version>` / `::<sub>` suffixes
40467
+ * match. Not `addonId`: a cap router reads that name as "which provider".
40468
+ */
40469
+ fromAddonId: string().min(1).max(200).optional(),
40470
+ /**
40471
+ * The emitting node: matches the agent that emitted the line, the node
40472
+ * itself, or a worker under it (`<agent>/<runner>`) — the `agentId`
40473
+ * semantics of `matchesLogTags`. Not `nodeId`: a cap router reads that
40474
+ * name as "which node's provider".
40475
+ */
40476
+ fromNodeId: string().min(1).max(200).optional(),
40477
+ /** Any other tag, exact match (AND). */
40478
+ tags: record(string(), union([string(), number()])).optional(),
40479
+ /** Severity FLOOR: this level and above. */
40392
40480
  level: LogLevelSchema.optional(),
40393
- since: date().optional(),
40394
- until: date().optional(),
40395
- limit: number().optional(),
40396
- tags: record(string(), string()).optional()
40397
- }), array(LogEntrySchema).readonly());
40481
+ /** Case-insensitive substring over message, scope, tag values and meta values. */
40482
+ text: string().min(1).max(200).optional(),
40483
+ /** Epoch ms, inclusive. */
40484
+ since: number().optional(),
40485
+ /** Epoch ms, inclusive. */
40486
+ until: number().optional(),
40487
+ /** Older than this cursor (exclusive). Absent with `after` absent ⇒ from the newest. */
40488
+ before: string().min(1).max(1024).optional(),
40489
+ /** Newer than this cursor (exclusive). */
40490
+ after: string().min(1).max(1024).optional(),
40491
+ limit: number().int().min(1).max(1e3).optional(),
40492
+ /** Wall-clock bound of this slice. The provider caps it. */
40493
+ budgetMs: number().int().min(50).max(1e4).optional()
40494
+ });
40495
+ var LogReadResultSchema = object({
40496
+ /** Newest first. */
40497
+ entries: array(object({
40498
+ /** `<bootId>.<seq>` minted by the emitting LogManager — the dedupe key. */
40499
+ id: string().optional(),
40500
+ /** Epoch ms. */
40501
+ timestamp: number(),
40502
+ level: LogLevelSchema,
40503
+ scope: string().optional(),
40504
+ message: string(),
40505
+ tags: record(string(), union([string(), number()])).optional(),
40506
+ meta: record(string(), unknown()).optional()
40507
+ })),
40508
+ /** Pass as `before` for the next older page; null when nothing older exists. */
40509
+ nextBefore: string().nullable(),
40510
+ /** Pass as `after` to read what arrived since; null when unknown. */
40511
+ nextAfter: string().nullable(),
40512
+ /** Bytes this slice read (files) or received (remote). Progress, not a promise. */
40513
+ scannedBytes: number().int().nonnegative(),
40514
+ /**
40515
+ * True when the scan in this direction reached the end of the store.
40516
+ * False with fewer than `limit` entries means the budget ran out first —
40517
+ * call again with `nextBefore` to go on.
40518
+ */
40519
+ done: boolean(),
40520
+ /** True when `cancelRead` ended this slice early. */
40521
+ cancelled: boolean().optional()
40522
+ });
40523
+ var LogReadCapabilitiesSchema = object({
40524
+ /** False ⇒ this destination only ships lines (console, forwarder, an unconfigured Loki). */
40525
+ readable: boolean(),
40526
+ /** Why not, when `readable` is false — rendered next to the source. */
40527
+ reason: string().nullable(),
40528
+ /** Filters the provider applies itself. A false one is applied by nobody. */
40529
+ filters: object({
40530
+ deviceId: boolean(),
40531
+ addonId: boolean(),
40532
+ nodeId: boolean(),
40533
+ tags: boolean(),
40534
+ level: boolean(),
40535
+ text: boolean(),
40536
+ timeRange: boolean()
40537
+ }),
40538
+ /** How far back the store reaches, when the provider knows (days). */
40539
+ retentionDays: number().nullable()
40540
+ });
40541
+ 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() }), {
40542
+ kind: "mutation",
40543
+ auth: "admin"
40544
+ });
40398
40545
  /**
40399
40546
  * `login-method` — collection cap through which auth addons contribute
40400
40547
  * their pre-auth login surfaces to the login page. This is the SINGLE,
@@ -42112,9 +42259,11 @@ var alarmPanelCapability = {
42112
42259
  */
42113
42260
  durability: "restored",
42114
42261
  /**
42115
- * History (D850): none — enum state; arm/disarm history belongs in the events ledger.
42262
+ * History (D850): the panel's lifecycle state as an `enum` series —
42263
+ * change-only, no floor, so an `arming -> pending -> triggered` sequence of a
42264
+ * few seconds keeps every step. Who armed it stays in the events ledger.
42116
42265
  */
42117
- history: "none",
42266
+ history: { fields: { state: { kind: "enum" } } },
42118
42267
  /** Clock fields: written, but excluded from the compare that decides
42119
42268
  * whether persisting is worth a SQLite commit. */
42120
42269
  volatileStateFields: ["lastChangedAt"]
@@ -42992,6 +43141,33 @@ var NcRuleTargetSchema = object({
42992
43141
  params: record(string(), unknown()).optional()
42993
43142
  });
42994
43143
  /**
43144
+ * WHAT THE NOTIFICATION'S PICTURE IS (D897) — the ONE media choice of a rule.
43145
+ *
43146
+ * Every mode starts from the same CLEAN source frame of the trigger moment
43147
+ * (keyFrame → sceneFrame → lastSceneFrame, narrowed to the trigger instant and
43148
+ * to the zone that fired the rule) and renders it once at send time:
43149
+ * - `scene-boxes` — the whole scene, the subject outlined thick in the accent
43150
+ * colour and every OTHER track visible at that instant outlined thin, each
43151
+ * labelled with class and confidence ("dog 87%").
43152
+ * - `crop` — the subject cut out of that frame around its box at that instant.
43153
+ * - `clean` — the whole scene with nothing drawn on it.
43154
+ * - `none` — no picture.
43155
+ *
43156
+ * A mode that cannot be honoured (no box at that instant, a photograph with no
43157
+ * tracked subject) ships `clean` and names the reason in the log, per camera.
43158
+ * It replaces the `attach` × `frame` × `zoneCrop` triple, which let one rule
43159
+ * ship a crop on one event and a boxed scene on the next depending on which
43160
+ * stored kind had landed.
43161
+ */
43162
+ var NcMediaImageSchema = _enum([
43163
+ "scene-boxes",
43164
+ "crop",
43165
+ "clean",
43166
+ "none"
43167
+ ]);
43168
+ /**
43169
+ * @deprecated Read only by `normalizeNcMediaPolicy` (D897) — see {@link NcMediaImageSchema}.
43170
+ *
42995
43171
  * Media attachment policy (P1 still-image subset).
42996
43172
  * - `best` — the best AVAILABLE subject image at dispatch time (D-3).
42997
43173
  * - `best-matching` — the media that explains WHY the rule fired: a rule
@@ -43005,6 +43181,8 @@ var NcRuleTargetSchema = object({
43005
43181
  * - `none` — no attachment.
43006
43182
  */
43007
43183
  /**
43184
+ * @deprecated Read only by `normalizeNcMediaPolicy` (D897) — see {@link NcMediaImageSchema}.
43185
+ *
43008
43186
  * WHAT THE PICTURE SHOWS — chosen explicitly, because the implicit ladders
43009
43187
  * conflate it with the selection strategy and betray the request: asking for
43010
43188
  * the clean scene frame on an object-event owner used to start at
@@ -43033,16 +43211,29 @@ var NcMediaFrameSchema = _enum([
43033
43211
  */
43034
43212
  var NcLinkedCameraModeSchema = _enum(["mosaic", "each"]);
43035
43213
  var NcMediaPolicySchema = object({
43214
+ /**
43215
+ * The picture — see {@link NcMediaImageSchema}. Absent on a rule nobody has
43216
+ * saved since D897: `normalizeNcMediaPolicy` derives it from the legacy
43217
+ * triple below, at load and at every write, and the store keeps only this.
43218
+ */
43219
+ image: NcMediaImageSchema.optional(),
43220
+ /**
43221
+ * Draw the zone that FIRED the rule on the picture (`scene-boxes` / `clean`;
43222
+ * a `crop` never shows it). Valid only on a rule whose trigger is a zone —
43223
+ * `conditions.zones` or an occupancy zone — and refused on save otherwise.
43224
+ * Replaces `zoneCrop`.
43225
+ */
43226
+ showTriggerZone: boolean().optional(),
43227
+ /** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
43036
43228
  attach: _enum([
43037
43229
  "best",
43038
43230
  "best-matching",
43039
43231
  "keyFrame",
43040
43232
  "none"
43041
- ]).default("best"),
43042
- /** What the still shows. Absent = `cropped` (the historical `best` shape). */
43233
+ ]).optional(),
43234
+ /** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
43043
43235
  frame: NcMediaFrameSchema.optional(),
43044
- /** Crop the attached still to the rule's condition-zone bbox (padded) —
43045
- * "show me the ZONE", not the whole scene or the subject crop. */
43236
+ /** @deprecated D897 — folded into `image: 'clean'` + `showTriggerZone` on save. */
43046
43237
  zoneCrop: boolean().optional(),
43047
43238
  /**
43048
43239
  * Also attach a short GIF cut from the stream broker's clip ring around the
@@ -43214,7 +43405,9 @@ var NcRuleInputSchema = object({
43214
43405
  * targets.
43215
43406
  */
43216
43407
  targetUsers: array(string()).optional(),
43217
- media: NcMediaPolicySchema.default({ attach: "best" }),
43408
+ /** Absent = the kind's default picture (`resolveNcMediaImage`): the subject crop for a
43409
+ * detection, the clean scene for a sensor or a sound. Set explicitly on save (D897). */
43410
+ media: NcMediaPolicySchema.default({}),
43218
43411
  throttle: NcThrottleSchema.default({
43219
43412
  cooldownSec: 60,
43220
43413
  scope: "rule-device"
@@ -44151,13 +44344,37 @@ var NcAlarmModeOpeningsSchema = object({
44151
44344
  /** Covered devices whose state could not be read (D49): neither open nor closed. */
44152
44345
  unknown: array(number().int())
44153
44346
  });
44347
+ /**
44348
+ * One alarm INPUT — a (rule, device) pair — the operator bypassed until the
44349
+ * next disarm ("Bypass this input until disarm" on a trigger notification, or
44350
+ * `nc.bypassAlarmInput`). Reported so an armed alarm with a silenced input
44351
+ * never looks fully armed (D62: off must never look like broken).
44352
+ */
44353
+ var NcAlarmInputBypassViewSchema = object({
44354
+ ruleId: string(),
44355
+ /** The rule's current name (its frozen name when the rule is gone). */
44356
+ ruleName: string(),
44357
+ /** The input: the sensor of the match, else its camera. */
44358
+ deviceId: number().int(),
44359
+ /** The input's current name. */
44360
+ name: string(),
44361
+ /** When it was bypassed (ms epoch). */
44362
+ since: number(),
44363
+ /** Triggers from this input dropped since. */
44364
+ dropped: number().int().min(0)
44365
+ });
44154
44366
  var NcAlarmLiveSchema = object({
44155
44367
  state: AlarmStateSchema,
44156
44368
  /** The mode being armed into (exit delay) or held; null when disarmed. */
44157
44369
  targetMode: AlarmArmModeSchema.nullable(),
44158
44370
  availableModes: array(AlarmArmModeSchema),
44159
44371
  openings: array(NcAlarmModeOpeningsSchema),
44160
- exclusions: array(NcAlarmExclusionViewSchema)
44372
+ exclusions: array(NcAlarmExclusionViewSchema),
44373
+ /**
44374
+ * Inputs bypassed for the rest of this arm session; cleared on disarm.
44375
+ * Defaulted so an older hub answer still parses (as "none known").
44376
+ */
44377
+ bypassedInputs: array(NcAlarmInputBypassViewSchema).default([])
44161
44378
  });
44162
44379
  var NcAlarmConfigSchema = object({
44163
44380
  /**
@@ -54884,9 +55101,11 @@ var connectivityCapability = {
54884
55101
  */
54885
55102
  durability: "restored",
54886
55103
  /**
54887
- * History (D850): none — duplicates device-status.online (one authority for availability).
55104
+ * History (D850): `connected` as a boolean series — change-only, no floor. It
55105
+ * is the upstream entity's own link (a HA connectivity sensor), not the
55106
+ * device's reachability, which stays `device-status.online`.
54888
55107
  */
54889
- history: "none",
55108
+ history: { fields: { connected: { kind: "boolean" } } },
54890
55109
  /** Clock fields: written, but excluded from the compare that decides
54891
55110
  * whether persisting is worth a SQLite commit. */
54892
55111
  volatileStateFields: ["lastChangedAt"]
@@ -55710,11 +55929,22 @@ var dishwasherCapability = {
55710
55929
  },
55711
55930
  runtimeState: DishwasherStatusSchema,
55712
55931
  durability: "session",
55713
- history: { fields: { progressPercent: {
55714
- kind: "gauge",
55715
- unit: "%",
55716
- deadband: 2
55717
- } } }
55932
+ history: { fields: {
55933
+ progressPercent: {
55934
+ kind: "gauge",
55935
+ unit: "%",
55936
+ deadband: 2
55937
+ },
55938
+ state: { kind: "enum" },
55939
+ operationState: { kind: "enum" },
55940
+ remainingSeconds: {
55941
+ kind: "gauge",
55942
+ unit: "s",
55943
+ minIntervalMs: 6e4
55944
+ },
55945
+ doorOpen: { kind: "boolean" },
55946
+ powerOn: { kind: "boolean" }
55947
+ } }
55718
55948
  };
55719
55949
  var DoorbellStatusSchema = object({
55720
55950
  /** Ms epoch of the last press. null = never observed since this provider started. */
@@ -55831,9 +56061,15 @@ var enumSensorCapability = {
55831
56061
  */
55832
56062
  durability: "restored",
55833
56063
  /**
55834
- * History (D850): none — text/enum state has no history (non-goal).
56064
+ * History (D850): the value as an `enum` series (an appliance's program or
56065
+ * operation state, an HVAC action). The option set is per device, so the
56066
+ * value list is LEARNED as values are first seen (bounded). A sensor with a
56067
+ * `format` carries a timestamp, not a state, and is not recorded.
55835
56068
  */
55836
- history: "none",
56069
+ history: { fields: { value: {
56070
+ kind: "enum",
56071
+ skipWhenSet: "format"
56072
+ } } },
55837
56073
  /** Clock fields: written, but excluded from the compare that decides
55838
56074
  * whether persisting is worth a SQLite commit. */
55839
56075
  volatileStateFields: ["lastFetchedAt"]
@@ -57807,9 +58043,10 @@ var lockControlCapability = {
57807
58043
  */
57808
58044
  durability: "restored",
57809
58045
  /**
57810
- * History (D850): none — enum state; lock events belong in the events ledger.
58046
+ * History (D850): the lock's state as an `enum` series — change-only, no
58047
+ * floor: a jam or an unlock lasting seconds is the edge an operator looks for.
57811
58048
  */
57812
- history: "none",
58049
+ history: { fields: { state: { kind: "enum" } } },
57813
58050
  /** Clock fields: written, but excluded from the compare that decides
57814
58051
  * whether persisting is worth a SQLite commit. */
57815
58052
  volatileStateFields: ["lastChangedAt"]
@@ -57983,9 +58220,18 @@ var mediaPlayerCapability = {
57983
58220
  */
57984
58221
  durability: "session",
57985
58222
  /**
57986
- * History (D850): none — `positionMs` moves continuously while playing; volume is transient.
58223
+ * History (D850): volume (a level an operator or an automation sets; the
58224
+ * default 10 s floor folds a slider drag into its end value) and mute.
58225
+ * `positionMs` is not recorded: it moves continuously while playing.
57987
58226
  */
57988
- history: "none"
58227
+ history: { fields: {
58228
+ volumeLevel: {
58229
+ kind: "gauge",
58230
+ unit: "%",
58231
+ deadband: 1
58232
+ },
58233
+ isMuted: { kind: "boolean" }
58234
+ } }
57989
58235
  };
57990
58236
  /**
57991
58237
  * mesh-network — collection cap for mesh-VPN providers.
@@ -60129,9 +60375,24 @@ var NpuInfoSchema = object({
60129
60375
  name: string().optional(),
60130
60376
  generation: _enum(["xdna1", "xdna2"]).optional()
60131
60377
  });
60378
+ var CoralBusSchema = _enum(["usb", "pci"]);
60132
60379
  var CoralInfoSchema = object({
60133
60380
  type: literal("coral-edgetpu"),
60134
- bus: string().optional()
60381
+ /** Legacy single-bus report (older nodes) — read via `coralUsableUnits`. */
60382
+ bus: string().optional(),
60383
+ /** Legacy USB unit count (older nodes) — read via `coralUsableUnits`. */
60384
+ count: number().int().nonnegative().optional(),
60385
+ /** Usable units per bus — each one is its own `edgetpu:<bus>[:N]` device. */
60386
+ units: array(object({
60387
+ bus: CoralBusSchema,
60388
+ count: number().int().nonnegative()
60389
+ })).readonly().optional(),
60390
+ /** Present-but-unusable units, each with its typed reason (never "absent"). */
60391
+ unavailable: array(object({
60392
+ bus: CoralBusSchema,
60393
+ count: number().int().nonnegative(),
60394
+ reason: _enum(["driver-missing", "device-not-accessible"])
60395
+ })).readonly().optional()
60135
60396
  });
60136
60397
  var HardwareInfoSchema = object({
60137
60398
  platform: HardwarePlatformSchema,
@@ -63278,9 +63539,29 @@ var streamParamsCapability = {
63278
63539
  */
63279
63540
  durability: "restored",
63280
63541
  /**
63281
- * History (D850): none — encoder configuration.
63542
+ * History (D850): the configured bitrate and frame rate of the main and sub
63543
+ * profiles. Configuration, so change-only on the default floor: a point is an
63544
+ * operator's (or a tuner's) edit, which is exactly what a chart of a stream's
63545
+ * quality over time must show.
63282
63546
  */
63283
- history: "none",
63547
+ history: { fields: {
63548
+ "main.bitrate": {
63549
+ kind: "gauge",
63550
+ unit: "kbps"
63551
+ },
63552
+ "main.framerate": {
63553
+ kind: "gauge",
63554
+ unit: "fps"
63555
+ },
63556
+ "sub.bitrate": {
63557
+ kind: "gauge",
63558
+ unit: "kbps"
63559
+ },
63560
+ "sub.framerate": {
63561
+ kind: "gauge",
63562
+ unit: "fps"
63563
+ }
63564
+ } },
63284
63565
  /** Clock fields: written, but excluded from the compare that decides
63285
63566
  * whether persisting is worth a SQLite commit. */
63286
63567
  volatileStateFields: ["lastFetchedAt"]
@@ -66458,6 +66739,15 @@ var BaseDevice = class {
66458
66739
  * Drivers can use the `getProbeFlags()` helper to read the flag bag
66459
66740
  * with a typed cast.
66460
66741
  *
66742
+ * Answer what you KNOW. A plain array is read as the complete list only
66743
+ * while this device is `online` and probed; return
66744
+ * `accessoryChildrenUnknown(reason)` whenever you cannot know the list right
66745
+ * now (no credentials, parent not connected, a failed or partial read) —
66746
+ * the kernel then deletes nothing. Return `accessoryChildrenComplete(list)`
66747
+ * to say "connected, and this is the complete list" explicitly. A shrink is
66748
+ * deleted only after a second agreeing complete read on a later probe (D49;
66749
+ * `packages/system/src/kernel/moleculer/accessory-prune-gate.ts`).
66750
+ *
66461
66751
  * Default: no children.
66462
66752
  */
66463
66753
  getAccessoryChildren() {
@@ -70589,7 +70879,19 @@ Object.freeze({
70589
70879
  addonId: null,
70590
70880
  access: "view"
70591
70881
  },
70592
- "logDestination.query": {
70882
+ "logDestination.cancelRead": {
70883
+ capName: "log-destination",
70884
+ capScope: "system",
70885
+ addonId: null,
70886
+ access: "create"
70887
+ },
70888
+ "logDestination.describeRead": {
70889
+ capName: "log-destination",
70890
+ capScope: "system",
70891
+ addonId: null,
70892
+ access: "view"
70893
+ },
70894
+ "logDestination.read": {
70593
70895
  capName: "log-destination",
70594
70896
  capScope: "system",
70595
70897
  addonId: null,
@@ -76596,6 +76898,11 @@ Object.freeze({
76596
76898
  form: "single",
76597
76899
  optional: false
76598
76900
  }],
76901
+ "logDestination.read": [{
76902
+ name: "deviceId",
76903
+ form: "single",
76904
+ optional: true
76905
+ }],
76599
76906
  "mediaPlayer.getStatus": [{
76600
76907
  name: "deviceId",
76601
76908
  form: "single",