@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.
- package/dist/addon.js +332 -40
- package/dist/addon.mjs +332 -40
- 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-
|
|
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([
|
|
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({
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
40493
|
-
|
|
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
|
-
|
|
40496
|
-
|
|
40497
|
-
|
|
40498
|
-
|
|
40499
|
-
|
|
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):
|
|
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: "
|
|
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
|
-
]).
|
|
43144
|
-
/**
|
|
43335
|
+
]).optional(),
|
|
43336
|
+
/** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
|
|
43145
43337
|
frame: NcMediaFrameSchema.optional(),
|
|
43146
|
-
/**
|
|
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
|
-
|
|
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):
|
|
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: "
|
|
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: {
|
|
55920
|
-
|
|
55921
|
-
|
|
55922
|
-
|
|
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):
|
|
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:
|
|
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):
|
|
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: "
|
|
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):
|
|
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:
|
|
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):
|
|
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:
|
|
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.
|
|
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-
|
|
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([
|
|
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({
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
40469
|
-
|
|
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
|
-
|
|
40472
|
-
|
|
40473
|
-
|
|
40474
|
-
|
|
40475
|
-
|
|
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):
|
|
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: "
|
|
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
|
-
]).
|
|
43120
|
-
/**
|
|
43311
|
+
]).optional(),
|
|
43312
|
+
/** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
|
|
43121
43313
|
frame: NcMediaFrameSchema.optional(),
|
|
43122
|
-
/**
|
|
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
|
-
|
|
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):
|
|
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: "
|
|
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: {
|
|
55896
|
-
|
|
55897
|
-
|
|
55898
|
-
|
|
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):
|
|
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:
|
|
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):
|
|
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: "
|
|
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):
|
|
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:
|
|
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):
|
|
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:
|
|
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.
|
|
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",
|