@camstack/addon-waste-collections 0.1.12 → 0.1.13

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.
@@ -5554,7 +5554,7 @@ var ZodIssueCode = {
5554
5554
  var ZodFirstPartyTypeKind;
5555
5555
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5556
5556
  //#endregion
5557
- //#region ../types/dist/sleep-yKL5gfrH.mjs
5557
+ //#region ../types/dist/sleep-BSuCCFjf.mjs
5558
5558
  /**
5559
5559
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5560
5560
  * window to float samples (D455).
@@ -17245,7 +17245,19 @@ var DeviceHistorySubjectSchema = discriminatedUnion("kind", [object({
17245
17245
  kind: literal("node"),
17246
17246
  nodeId: string().min(1)
17247
17247
  })]);
17248
+ /**
17249
+ * `enum` stores a STATE as the ordinal of its value in the series' value list
17250
+ * (`DeviceHistorySeriesInfo.values`, append-only, so an ordinal never changes
17251
+ * meaning); a rollup keeps the time spent in each state (`states`).
17252
+ */
17248
17253
  var DeviceHistoryKindSchema = _enum([
17254
+ "gauge",
17255
+ "counter",
17256
+ "boolean",
17257
+ "enum"
17258
+ ]);
17259
+ /** What a PRODUCER may declare. `enum` is cap-only: its value list is the cap field's. */
17260
+ var DeviceHistoryProducerKindSchema = _enum([
17249
17261
  "gauge",
17250
17262
  "counter",
17251
17263
  "boolean"
@@ -17282,7 +17294,13 @@ var SeriesInfoSchema = object({
17282
17294
  /** `null` is unknown (a `unitFrom` series whose device does not state a unit right now), never a guess. */
17283
17295
  unit: string().nullable(),
17284
17296
  displayName: string(),
17285
- source: _enum(["cap", "addon"]),
17297
+ source: _enum([
17298
+ "cap",
17299
+ "addon",
17300
+ "derived"
17301
+ ]),
17302
+ /** `enum`: the value of each ordinal (index = ordinal); `null` for every other kind. */
17303
+ values: array(string()).readonly().nullable(),
17286
17304
  firstTs: number(),
17287
17305
  lastTs: number()
17288
17306
  });
@@ -17296,17 +17314,31 @@ var QueryPointSchema = object({
17296
17314
  twMean: number().nullable(),
17297
17315
  min: number(),
17298
17316
  max: number(),
17299
- /** `null` is unknown, never zero (D393). */
17300
- last: number().nullable()
17317
+ /** `null` is unknown, never zero (D393). For an `enum` series: the ordinal of {@link state}. */
17318
+ last: number().nullable(),
17319
+ /**
17320
+ * The increase over the point: a `counter`'s growth since the previous point
17321
+ * or bucket (a drop is a reset, counted from zero), and for
17322
+ * {@link DEVICE_HISTORY_ENERGY_KEY} the kWh used in the bucket. `null` for
17323
+ * every other kind, and when it cannot be known.
17324
+ */
17325
+ delta: number().nullable(),
17326
+ /** `enum`: the state in force at the end of the point (the name of `last`); `null` otherwise. */
17327
+ state: string().nullable(),
17328
+ /** `enum` rollup: milliseconds spent in each state inside the bucket; `null` for raw points and other kinds. */
17329
+ states: record(string(), number()).nullable()
17301
17330
  });
17302
17331
  var QuerySeriesSchema = object({
17303
17332
  scope: string(),
17304
17333
  /** The last point STRICTLY BEFORE `from` in the chosen tier, so a step chart can start at the held value. */
17305
17334
  before: object({
17306
17335
  t: number(),
17307
- value: number().nullable()
17336
+ value: number().nullable(),
17337
+ state: string().nullable()
17308
17338
  }).nullable(),
17309
- points: array(QueryPointSchema).readonly()
17339
+ points: array(QueryPointSchema).readonly(),
17340
+ /** A derived key: the stored key its points were computed from; `null` for a stored series. */
17341
+ derivedFrom: string().nullable()
17310
17342
  });
17311
17343
  /** The window part of a query, shared by the device and node forms. */
17312
17344
  var QueryWindowShape = {
@@ -17322,6 +17354,23 @@ var QueryResultSchema = object({
17322
17354
  series: array(QuerySeriesSchema).readonly(),
17323
17355
  truncated: boolean()
17324
17356
  });
17357
+ /** One read of a batch: a device's key or a node's key (exactly one subject). */
17358
+ var QueryManyItemSchema = union([object({
17359
+ deviceId: number().int(),
17360
+ key: string(),
17361
+ scope: string().optional()
17362
+ }), object({
17363
+ forNodeId: string().min(1),
17364
+ key: string(),
17365
+ scope: string().optional()
17366
+ })]);
17367
+ var QueryManyEntrySchema = discriminatedUnion("ok", [object({
17368
+ ok: literal(true),
17369
+ result: QueryResultSchema
17370
+ }), object({
17371
+ ok: literal(false),
17372
+ error: string()
17373
+ })]);
17325
17374
  var TierStatusSchema = object({
17326
17375
  tier: DeviceHistoryResolutionSchema,
17327
17376
  /** `null` until the first background count answered. */
@@ -17377,16 +17426,22 @@ var DeviceHistoryStatusSchema = object({
17377
17426
  lastRefreshAt: number().nullable()
17378
17427
  })
17379
17428
  });
17380
- method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly()), method(object({ nodeId: string().min(1) }), array(SeriesInfoSchema).readonly(), { auth: "admin" }), method(object({
17429
+ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly()), method(object({ forNodeId: string().min(1) }), array(SeriesInfoSchema).readonly(), { auth: "admin" }), method(object({
17381
17430
  deviceId: number().int(),
17382
17431
  ...QueryWindowShape
17383
17432
  }), QueryResultSchema), method(object({
17384
- nodeId: string().min(1),
17433
+ forNodeId: string().min(1),
17385
17434
  ...QueryWindowShape
17386
17435
  }), QueryResultSchema, { auth: "admin" }), method(object({
17436
+ items: array(QueryManyItemSchema).min(1).max(24),
17437
+ from: QueryWindowShape.from,
17438
+ to: QueryWindowShape.to,
17439
+ resolution: QueryWindowShape.resolution,
17440
+ maxPoints: QueryWindowShape.maxPoints
17441
+ }), object({ results: array(QueryManyEntrySchema).readonly() }), { auth: "admin" }), method(object({
17387
17442
  name: string().regex(/^[a-z0-9-]+$/),
17388
17443
  subjectKind: _enum(["device", "node"]),
17389
- kind: DeviceHistoryKindSchema,
17444
+ kind: DeviceHistoryProducerKindSchema,
17390
17445
  unit: string().optional(),
17391
17446
  displayName: string().min(1),
17392
17447
  ingest: _enum(["points", "buckets"])
@@ -40403,14 +40458,106 @@ var LogEntrySchema = object({
40403
40458
  meta: record(string(), unknown()).optional(),
40404
40459
  tags: record(string(), string()).optional()
40405
40460
  });
40406
- method(LogEntrySchema, _void(), { kind: "mutation" }), method(object({
40407
- scope: array(string()).optional(),
40461
+ /**
40462
+ * A history READ against one destination (D898).
40463
+ *
40464
+ * Every filter is applied by the PROVIDER, before the limit — a filter the
40465
+ * browser applied after the limit is what made a rare device's lines
40466
+ * unreachable behind a busy one's. `before` / `after` are cursors the provider
40467
+ * minted (opaque to everyone else): a file position for the rotated files, a
40468
+ * nanosecond timestamp for Loki.
40469
+ *
40470
+ * A read is BOUNDED by `budgetMs`: a filter that matches nothing on a 30-day
40471
+ * store answers `done: false` with the cursor it reached and the bytes it
40472
+ * scanned, and the caller decides whether to go on. That is what makes a long
40473
+ * scan show progress and stop when asked — `cancelRead` ends the slice in
40474
+ * flight, and not asking for the next slice ends the scan.
40475
+ */
40476
+ var LogReadQuerySchema = object({
40477
+ /** Correlates `cancelRead`. Caller-chosen, unique per in-flight read. */
40478
+ requestId: string().min(1).max(64).optional(),
40479
+ /** The device the line is about (`tags.deviceId`, numeric). */
40480
+ deviceId: number().int().optional(),
40481
+ /**
40482
+ * The emitting addon — bare manifest id; `@<version>` / `::<sub>` suffixes
40483
+ * match. Not `addonId`: a cap router reads that name as "which provider".
40484
+ */
40485
+ fromAddonId: string().min(1).max(200).optional(),
40486
+ /**
40487
+ * The emitting node: matches the agent that emitted the line, the node
40488
+ * itself, or a worker under it (`<agent>/<runner>`) — the `agentId`
40489
+ * semantics of `matchesLogTags`. Not `nodeId`: a cap router reads that
40490
+ * name as "which node's provider".
40491
+ */
40492
+ fromNodeId: string().min(1).max(200).optional(),
40493
+ /** Any other tag, exact match (AND). */
40494
+ tags: record(string(), union([string(), number()])).optional(),
40495
+ /** Severity FLOOR: this level and above. */
40408
40496
  level: LogLevelSchema.optional(),
40409
- since: date().optional(),
40410
- until: date().optional(),
40411
- limit: number().optional(),
40412
- tags: record(string(), string()).optional()
40413
- }), array(LogEntrySchema).readonly());
40497
+ /** Case-insensitive substring over message, scope, tag values and meta values. */
40498
+ text: string().min(1).max(200).optional(),
40499
+ /** Epoch ms, inclusive. */
40500
+ since: number().optional(),
40501
+ /** Epoch ms, inclusive. */
40502
+ until: number().optional(),
40503
+ /** Older than this cursor (exclusive). Absent with `after` absent ⇒ from the newest. */
40504
+ before: string().min(1).max(1024).optional(),
40505
+ /** Newer than this cursor (exclusive). */
40506
+ after: string().min(1).max(1024).optional(),
40507
+ limit: number().int().min(1).max(1e3).optional(),
40508
+ /** Wall-clock bound of this slice. The provider caps it. */
40509
+ budgetMs: number().int().min(50).max(1e4).optional()
40510
+ });
40511
+ var LogReadResultSchema = object({
40512
+ /** Newest first. */
40513
+ entries: array(object({
40514
+ /** `<bootId>.<seq>` minted by the emitting LogManager — the dedupe key. */
40515
+ id: string().optional(),
40516
+ /** Epoch ms. */
40517
+ timestamp: number(),
40518
+ level: LogLevelSchema,
40519
+ scope: string().optional(),
40520
+ message: string(),
40521
+ tags: record(string(), union([string(), number()])).optional(),
40522
+ meta: record(string(), unknown()).optional()
40523
+ })),
40524
+ /** Pass as `before` for the next older page; null when nothing older exists. */
40525
+ nextBefore: string().nullable(),
40526
+ /** Pass as `after` to read what arrived since; null when unknown. */
40527
+ nextAfter: string().nullable(),
40528
+ /** Bytes this slice read (files) or received (remote). Progress, not a promise. */
40529
+ scannedBytes: number().int().nonnegative(),
40530
+ /**
40531
+ * True when the scan in this direction reached the end of the store.
40532
+ * False with fewer than `limit` entries means the budget ran out first —
40533
+ * call again with `nextBefore` to go on.
40534
+ */
40535
+ done: boolean(),
40536
+ /** True when `cancelRead` ended this slice early. */
40537
+ cancelled: boolean().optional()
40538
+ });
40539
+ var LogReadCapabilitiesSchema = object({
40540
+ /** False ⇒ this destination only ships lines (console, forwarder, an unconfigured Loki). */
40541
+ readable: boolean(),
40542
+ /** Why not, when `readable` is false — rendered next to the source. */
40543
+ reason: string().nullable(),
40544
+ /** Filters the provider applies itself. A false one is applied by nobody. */
40545
+ filters: object({
40546
+ deviceId: boolean(),
40547
+ addonId: boolean(),
40548
+ nodeId: boolean(),
40549
+ tags: boolean(),
40550
+ level: boolean(),
40551
+ text: boolean(),
40552
+ timeRange: boolean()
40553
+ }),
40554
+ /** How far back the store reaches, when the provider knows (days). */
40555
+ retentionDays: number().nullable()
40556
+ });
40557
+ 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() }), {
40558
+ kind: "mutation",
40559
+ auth: "admin"
40560
+ });
40414
40561
  /**
40415
40562
  * `login-method` — collection cap through which auth addons contribute
40416
40563
  * their pre-auth login surfaces to the login page. This is the SINGLE,
@@ -42966,6 +43113,33 @@ var NcRuleTargetSchema = object({
42966
43113
  params: record(string(), unknown()).optional()
42967
43114
  });
42968
43115
  /**
43116
+ * WHAT THE NOTIFICATION'S PICTURE IS (D897) — the ONE media choice of a rule.
43117
+ *
43118
+ * Every mode starts from the same CLEAN source frame of the trigger moment
43119
+ * (keyFrame → sceneFrame → lastSceneFrame, narrowed to the trigger instant and
43120
+ * to the zone that fired the rule) and renders it once at send time:
43121
+ * - `scene-boxes` — the whole scene, the subject outlined thick in the accent
43122
+ * colour and every OTHER track visible at that instant outlined thin, each
43123
+ * labelled with class and confidence ("dog 87%").
43124
+ * - `crop` — the subject cut out of that frame around its box at that instant.
43125
+ * - `clean` — the whole scene with nothing drawn on it.
43126
+ * - `none` — no picture.
43127
+ *
43128
+ * A mode that cannot be honoured (no box at that instant, a photograph with no
43129
+ * tracked subject) ships `clean` and names the reason in the log, per camera.
43130
+ * It replaces the `attach` × `frame` × `zoneCrop` triple, which let one rule
43131
+ * ship a crop on one event and a boxed scene on the next depending on which
43132
+ * stored kind had landed.
43133
+ */
43134
+ var NcMediaImageSchema = _enum([
43135
+ "scene-boxes",
43136
+ "crop",
43137
+ "clean",
43138
+ "none"
43139
+ ]);
43140
+ /**
43141
+ * @deprecated Read only by `normalizeNcMediaPolicy` (D897) — see {@link NcMediaImageSchema}.
43142
+ *
42969
43143
  * Media attachment policy (P1 still-image subset).
42970
43144
  * - `best` — the best AVAILABLE subject image at dispatch time (D-3).
42971
43145
  * - `best-matching` — the media that explains WHY the rule fired: a rule
@@ -42979,6 +43153,8 @@ var NcRuleTargetSchema = object({
42979
43153
  * - `none` — no attachment.
42980
43154
  */
42981
43155
  /**
43156
+ * @deprecated Read only by `normalizeNcMediaPolicy` (D897) — see {@link NcMediaImageSchema}.
43157
+ *
42982
43158
  * WHAT THE PICTURE SHOWS — chosen explicitly, because the implicit ladders
42983
43159
  * conflate it with the selection strategy and betray the request: asking for
42984
43160
  * the clean scene frame on an object-event owner used to start at
@@ -43007,16 +43183,29 @@ var NcMediaFrameSchema = _enum([
43007
43183
  */
43008
43184
  var NcLinkedCameraModeSchema = _enum(["mosaic", "each"]);
43009
43185
  var NcMediaPolicySchema = object({
43186
+ /**
43187
+ * The picture — see {@link NcMediaImageSchema}. Absent on a rule nobody has
43188
+ * saved since D897: `normalizeNcMediaPolicy` derives it from the legacy
43189
+ * triple below, at load and at every write, and the store keeps only this.
43190
+ */
43191
+ image: NcMediaImageSchema.optional(),
43192
+ /**
43193
+ * Draw the zone that FIRED the rule on the picture (`scene-boxes` / `clean`;
43194
+ * a `crop` never shows it). Valid only on a rule whose trigger is a zone —
43195
+ * `conditions.zones` or an occupancy zone — and refused on save otherwise.
43196
+ * Replaces `zoneCrop`.
43197
+ */
43198
+ showTriggerZone: boolean().optional(),
43199
+ /** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
43010
43200
  attach: _enum([
43011
43201
  "best",
43012
43202
  "best-matching",
43013
43203
  "keyFrame",
43014
43204
  "none"
43015
- ]).default("best"),
43016
- /** What the still shows. Absent = `cropped` (the historical `best` shape). */
43205
+ ]).optional(),
43206
+ /** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
43017
43207
  frame: NcMediaFrameSchema.optional(),
43018
- /** Crop the attached still to the rule's condition-zone bbox (padded) —
43019
- * "show me the ZONE", not the whole scene or the subject crop. */
43208
+ /** @deprecated D897 — folded into `image: 'clean'` + `showTriggerZone` on save. */
43020
43209
  zoneCrop: boolean().optional(),
43021
43210
  /**
43022
43211
  * Also attach a short GIF cut from the stream broker's clip ring around the
@@ -43188,7 +43377,9 @@ var NcRuleInputSchema = object({
43188
43377
  * targets.
43189
43378
  */
43190
43379
  targetUsers: array(string()).optional(),
43191
- media: NcMediaPolicySchema.default({ attach: "best" }),
43380
+ /** Absent = the kind's default picture (`resolveNcMediaImage`): the subject crop for a
43381
+ * detection, the clean scene for a sensor or a sound. Set explicitly on save (D897). */
43382
+ media: NcMediaPolicySchema.default({}),
43192
43383
  throttle: NcThrottleSchema.default({
43193
43384
  cooldownSec: 60,
43194
43385
  scope: "rule-device"
@@ -44125,13 +44316,37 @@ var NcAlarmModeOpeningsSchema = object({
44125
44316
  /** Covered devices whose state could not be read (D49): neither open nor closed. */
44126
44317
  unknown: array(number().int())
44127
44318
  });
44319
+ /**
44320
+ * One alarm INPUT — a (rule, device) pair — the operator bypassed until the
44321
+ * next disarm ("Bypass this input until disarm" on a trigger notification, or
44322
+ * `nc.bypassAlarmInput`). Reported so an armed alarm with a silenced input
44323
+ * never looks fully armed (D62: off must never look like broken).
44324
+ */
44325
+ var NcAlarmInputBypassViewSchema = object({
44326
+ ruleId: string(),
44327
+ /** The rule's current name (its frozen name when the rule is gone). */
44328
+ ruleName: string(),
44329
+ /** The input: the sensor of the match, else its camera. */
44330
+ deviceId: number().int(),
44331
+ /** The input's current name. */
44332
+ name: string(),
44333
+ /** When it was bypassed (ms epoch). */
44334
+ since: number(),
44335
+ /** Triggers from this input dropped since. */
44336
+ dropped: number().int().min(0)
44337
+ });
44128
44338
  var NcAlarmLiveSchema = object({
44129
44339
  state: AlarmStateSchema,
44130
44340
  /** The mode being armed into (exit delay) or held; null when disarmed. */
44131
44341
  targetMode: AlarmArmModeSchema.nullable(),
44132
44342
  availableModes: array(AlarmArmModeSchema),
44133
44343
  openings: array(NcAlarmModeOpeningsSchema),
44134
- exclusions: array(NcAlarmExclusionViewSchema)
44344
+ exclusions: array(NcAlarmExclusionViewSchema),
44345
+ /**
44346
+ * Inputs bypassed for the rest of this arm session; cleared on disarm.
44347
+ * Defaulted so an older hub answer still parses (as "none known").
44348
+ */
44349
+ bypassedInputs: array(NcAlarmInputBypassViewSchema).default([])
44135
44350
  });
44136
44351
  var NcAlarmConfigSchema = object({
44137
44352
  /**
@@ -65780,7 +65995,19 @@ Object.freeze({
65780
65995
  addonId: null,
65781
65996
  access: "view"
65782
65997
  },
65783
- "logDestination.query": {
65998
+ "logDestination.cancelRead": {
65999
+ capName: "log-destination",
66000
+ capScope: "system",
66001
+ addonId: null,
66002
+ access: "create"
66003
+ },
66004
+ "logDestination.describeRead": {
66005
+ capName: "log-destination",
66006
+ capScope: "system",
66007
+ addonId: null,
66008
+ access: "view"
66009
+ },
66010
+ "logDestination.read": {
65784
66011
  capName: "log-destination",
65785
66012
  capScope: "system",
65786
66013
  addonId: null,
@@ -71787,6 +72014,11 @@ Object.freeze({
71787
72014
  form: "single",
71788
72015
  optional: false
71789
72016
  }],
72017
+ "logDestination.read": [{
72018
+ name: "deviceId",
72019
+ form: "single",
72020
+ optional: true
72021
+ }],
71790
72022
  "mediaPlayer.getStatus": [{
71791
72023
  name: "deviceId",
71792
72024
  form: "single",
@@ -5550,7 +5550,7 @@ var ZodIssueCode = {
5550
5550
  var ZodFirstPartyTypeKind;
5551
5551
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5552
5552
  //#endregion
5553
- //#region ../types/dist/sleep-yKL5gfrH.mjs
5553
+ //#region ../types/dist/sleep-BSuCCFjf.mjs
5554
5554
  /**
5555
5555
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5556
5556
  * window to float samples (D455).
@@ -17241,7 +17241,19 @@ var DeviceHistorySubjectSchema = discriminatedUnion("kind", [object({
17241
17241
  kind: literal("node"),
17242
17242
  nodeId: string().min(1)
17243
17243
  })]);
17244
+ /**
17245
+ * `enum` stores a STATE as the ordinal of its value in the series' value list
17246
+ * (`DeviceHistorySeriesInfo.values`, append-only, so an ordinal never changes
17247
+ * meaning); a rollup keeps the time spent in each state (`states`).
17248
+ */
17244
17249
  var DeviceHistoryKindSchema = _enum([
17250
+ "gauge",
17251
+ "counter",
17252
+ "boolean",
17253
+ "enum"
17254
+ ]);
17255
+ /** What a PRODUCER may declare. `enum` is cap-only: its value list is the cap field's. */
17256
+ var DeviceHistoryProducerKindSchema = _enum([
17245
17257
  "gauge",
17246
17258
  "counter",
17247
17259
  "boolean"
@@ -17278,7 +17290,13 @@ var SeriesInfoSchema = object({
17278
17290
  /** `null` is unknown (a `unitFrom` series whose device does not state a unit right now), never a guess. */
17279
17291
  unit: string().nullable(),
17280
17292
  displayName: string(),
17281
- source: _enum(["cap", "addon"]),
17293
+ source: _enum([
17294
+ "cap",
17295
+ "addon",
17296
+ "derived"
17297
+ ]),
17298
+ /** `enum`: the value of each ordinal (index = ordinal); `null` for every other kind. */
17299
+ values: array(string()).readonly().nullable(),
17282
17300
  firstTs: number(),
17283
17301
  lastTs: number()
17284
17302
  });
@@ -17292,17 +17310,31 @@ var QueryPointSchema = object({
17292
17310
  twMean: number().nullable(),
17293
17311
  min: number(),
17294
17312
  max: number(),
17295
- /** `null` is unknown, never zero (D393). */
17296
- last: number().nullable()
17313
+ /** `null` is unknown, never zero (D393). For an `enum` series: the ordinal of {@link state}. */
17314
+ last: number().nullable(),
17315
+ /**
17316
+ * The increase over the point: a `counter`'s growth since the previous point
17317
+ * or bucket (a drop is a reset, counted from zero), and for
17318
+ * {@link DEVICE_HISTORY_ENERGY_KEY} the kWh used in the bucket. `null` for
17319
+ * every other kind, and when it cannot be known.
17320
+ */
17321
+ delta: number().nullable(),
17322
+ /** `enum`: the state in force at the end of the point (the name of `last`); `null` otherwise. */
17323
+ state: string().nullable(),
17324
+ /** `enum` rollup: milliseconds spent in each state inside the bucket; `null` for raw points and other kinds. */
17325
+ states: record(string(), number()).nullable()
17297
17326
  });
17298
17327
  var QuerySeriesSchema = object({
17299
17328
  scope: string(),
17300
17329
  /** The last point STRICTLY BEFORE `from` in the chosen tier, so a step chart can start at the held value. */
17301
17330
  before: object({
17302
17331
  t: number(),
17303
- value: number().nullable()
17332
+ value: number().nullable(),
17333
+ state: string().nullable()
17304
17334
  }).nullable(),
17305
- points: array(QueryPointSchema).readonly()
17335
+ points: array(QueryPointSchema).readonly(),
17336
+ /** A derived key: the stored key its points were computed from; `null` for a stored series. */
17337
+ derivedFrom: string().nullable()
17306
17338
  });
17307
17339
  /** The window part of a query, shared by the device and node forms. */
17308
17340
  var QueryWindowShape = {
@@ -17318,6 +17350,23 @@ var QueryResultSchema = object({
17318
17350
  series: array(QuerySeriesSchema).readonly(),
17319
17351
  truncated: boolean()
17320
17352
  });
17353
+ /** One read of a batch: a device's key or a node's key (exactly one subject). */
17354
+ var QueryManyItemSchema = union([object({
17355
+ deviceId: number().int(),
17356
+ key: string(),
17357
+ scope: string().optional()
17358
+ }), object({
17359
+ forNodeId: string().min(1),
17360
+ key: string(),
17361
+ scope: string().optional()
17362
+ })]);
17363
+ var QueryManyEntrySchema = discriminatedUnion("ok", [object({
17364
+ ok: literal(true),
17365
+ result: QueryResultSchema
17366
+ }), object({
17367
+ ok: literal(false),
17368
+ error: string()
17369
+ })]);
17321
17370
  var TierStatusSchema = object({
17322
17371
  tier: DeviceHistoryResolutionSchema,
17323
17372
  /** `null` until the first background count answered. */
@@ -17373,16 +17422,22 @@ var DeviceHistoryStatusSchema = object({
17373
17422
  lastRefreshAt: number().nullable()
17374
17423
  })
17375
17424
  });
17376
- method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly()), method(object({ nodeId: string().min(1) }), array(SeriesInfoSchema).readonly(), { auth: "admin" }), method(object({
17425
+ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly()), method(object({ forNodeId: string().min(1) }), array(SeriesInfoSchema).readonly(), { auth: "admin" }), method(object({
17377
17426
  deviceId: number().int(),
17378
17427
  ...QueryWindowShape
17379
17428
  }), QueryResultSchema), method(object({
17380
- nodeId: string().min(1),
17429
+ forNodeId: string().min(1),
17381
17430
  ...QueryWindowShape
17382
17431
  }), QueryResultSchema, { auth: "admin" }), method(object({
17432
+ items: array(QueryManyItemSchema).min(1).max(24),
17433
+ from: QueryWindowShape.from,
17434
+ to: QueryWindowShape.to,
17435
+ resolution: QueryWindowShape.resolution,
17436
+ maxPoints: QueryWindowShape.maxPoints
17437
+ }), object({ results: array(QueryManyEntrySchema).readonly() }), { auth: "admin" }), method(object({
17383
17438
  name: string().regex(/^[a-z0-9-]+$/),
17384
17439
  subjectKind: _enum(["device", "node"]),
17385
- kind: DeviceHistoryKindSchema,
17440
+ kind: DeviceHistoryProducerKindSchema,
17386
17441
  unit: string().optional(),
17387
17442
  displayName: string().min(1),
17388
17443
  ingest: _enum(["points", "buckets"])
@@ -40399,14 +40454,106 @@ var LogEntrySchema = object({
40399
40454
  meta: record(string(), unknown()).optional(),
40400
40455
  tags: record(string(), string()).optional()
40401
40456
  });
40402
- method(LogEntrySchema, _void(), { kind: "mutation" }), method(object({
40403
- scope: array(string()).optional(),
40457
+ /**
40458
+ * A history READ against one destination (D898).
40459
+ *
40460
+ * Every filter is applied by the PROVIDER, before the limit — a filter the
40461
+ * browser applied after the limit is what made a rare device's lines
40462
+ * unreachable behind a busy one's. `before` / `after` are cursors the provider
40463
+ * minted (opaque to everyone else): a file position for the rotated files, a
40464
+ * nanosecond timestamp for Loki.
40465
+ *
40466
+ * A read is BOUNDED by `budgetMs`: a filter that matches nothing on a 30-day
40467
+ * store answers `done: false` with the cursor it reached and the bytes it
40468
+ * scanned, and the caller decides whether to go on. That is what makes a long
40469
+ * scan show progress and stop when asked — `cancelRead` ends the slice in
40470
+ * flight, and not asking for the next slice ends the scan.
40471
+ */
40472
+ var LogReadQuerySchema = object({
40473
+ /** Correlates `cancelRead`. Caller-chosen, unique per in-flight read. */
40474
+ requestId: string().min(1).max(64).optional(),
40475
+ /** The device the line is about (`tags.deviceId`, numeric). */
40476
+ deviceId: number().int().optional(),
40477
+ /**
40478
+ * The emitting addon — bare manifest id; `@<version>` / `::<sub>` suffixes
40479
+ * match. Not `addonId`: a cap router reads that name as "which provider".
40480
+ */
40481
+ fromAddonId: string().min(1).max(200).optional(),
40482
+ /**
40483
+ * The emitting node: matches the agent that emitted the line, the node
40484
+ * itself, or a worker under it (`<agent>/<runner>`) — the `agentId`
40485
+ * semantics of `matchesLogTags`. Not `nodeId`: a cap router reads that
40486
+ * name as "which node's provider".
40487
+ */
40488
+ fromNodeId: string().min(1).max(200).optional(),
40489
+ /** Any other tag, exact match (AND). */
40490
+ tags: record(string(), union([string(), number()])).optional(),
40491
+ /** Severity FLOOR: this level and above. */
40404
40492
  level: LogLevelSchema.optional(),
40405
- since: date().optional(),
40406
- until: date().optional(),
40407
- limit: number().optional(),
40408
- tags: record(string(), string()).optional()
40409
- }), array(LogEntrySchema).readonly());
40493
+ /** Case-insensitive substring over message, scope, tag values and meta values. */
40494
+ text: string().min(1).max(200).optional(),
40495
+ /** Epoch ms, inclusive. */
40496
+ since: number().optional(),
40497
+ /** Epoch ms, inclusive. */
40498
+ until: number().optional(),
40499
+ /** Older than this cursor (exclusive). Absent with `after` absent ⇒ from the newest. */
40500
+ before: string().min(1).max(1024).optional(),
40501
+ /** Newer than this cursor (exclusive). */
40502
+ after: string().min(1).max(1024).optional(),
40503
+ limit: number().int().min(1).max(1e3).optional(),
40504
+ /** Wall-clock bound of this slice. The provider caps it. */
40505
+ budgetMs: number().int().min(50).max(1e4).optional()
40506
+ });
40507
+ var LogReadResultSchema = object({
40508
+ /** Newest first. */
40509
+ entries: array(object({
40510
+ /** `<bootId>.<seq>` minted by the emitting LogManager — the dedupe key. */
40511
+ id: string().optional(),
40512
+ /** Epoch ms. */
40513
+ timestamp: number(),
40514
+ level: LogLevelSchema,
40515
+ scope: string().optional(),
40516
+ message: string(),
40517
+ tags: record(string(), union([string(), number()])).optional(),
40518
+ meta: record(string(), unknown()).optional()
40519
+ })),
40520
+ /** Pass as `before` for the next older page; null when nothing older exists. */
40521
+ nextBefore: string().nullable(),
40522
+ /** Pass as `after` to read what arrived since; null when unknown. */
40523
+ nextAfter: string().nullable(),
40524
+ /** Bytes this slice read (files) or received (remote). Progress, not a promise. */
40525
+ scannedBytes: number().int().nonnegative(),
40526
+ /**
40527
+ * True when the scan in this direction reached the end of the store.
40528
+ * False with fewer than `limit` entries means the budget ran out first —
40529
+ * call again with `nextBefore` to go on.
40530
+ */
40531
+ done: boolean(),
40532
+ /** True when `cancelRead` ended this slice early. */
40533
+ cancelled: boolean().optional()
40534
+ });
40535
+ var LogReadCapabilitiesSchema = object({
40536
+ /** False ⇒ this destination only ships lines (console, forwarder, an unconfigured Loki). */
40537
+ readable: boolean(),
40538
+ /** Why not, when `readable` is false — rendered next to the source. */
40539
+ reason: string().nullable(),
40540
+ /** Filters the provider applies itself. A false one is applied by nobody. */
40541
+ filters: object({
40542
+ deviceId: boolean(),
40543
+ addonId: boolean(),
40544
+ nodeId: boolean(),
40545
+ tags: boolean(),
40546
+ level: boolean(),
40547
+ text: boolean(),
40548
+ timeRange: boolean()
40549
+ }),
40550
+ /** How far back the store reaches, when the provider knows (days). */
40551
+ retentionDays: number().nullable()
40552
+ });
40553
+ 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() }), {
40554
+ kind: "mutation",
40555
+ auth: "admin"
40556
+ });
40410
40557
  /**
40411
40558
  * `login-method` — collection cap through which auth addons contribute
40412
40559
  * their pre-auth login surfaces to the login page. This is the SINGLE,
@@ -42962,6 +43109,33 @@ var NcRuleTargetSchema = object({
42962
43109
  params: record(string(), unknown()).optional()
42963
43110
  });
42964
43111
  /**
43112
+ * WHAT THE NOTIFICATION'S PICTURE IS (D897) — the ONE media choice of a rule.
43113
+ *
43114
+ * Every mode starts from the same CLEAN source frame of the trigger moment
43115
+ * (keyFrame → sceneFrame → lastSceneFrame, narrowed to the trigger instant and
43116
+ * to the zone that fired the rule) and renders it once at send time:
43117
+ * - `scene-boxes` — the whole scene, the subject outlined thick in the accent
43118
+ * colour and every OTHER track visible at that instant outlined thin, each
43119
+ * labelled with class and confidence ("dog 87%").
43120
+ * - `crop` — the subject cut out of that frame around its box at that instant.
43121
+ * - `clean` — the whole scene with nothing drawn on it.
43122
+ * - `none` — no picture.
43123
+ *
43124
+ * A mode that cannot be honoured (no box at that instant, a photograph with no
43125
+ * tracked subject) ships `clean` and names the reason in the log, per camera.
43126
+ * It replaces the `attach` × `frame` × `zoneCrop` triple, which let one rule
43127
+ * ship a crop on one event and a boxed scene on the next depending on which
43128
+ * stored kind had landed.
43129
+ */
43130
+ var NcMediaImageSchema = _enum([
43131
+ "scene-boxes",
43132
+ "crop",
43133
+ "clean",
43134
+ "none"
43135
+ ]);
43136
+ /**
43137
+ * @deprecated Read only by `normalizeNcMediaPolicy` (D897) — see {@link NcMediaImageSchema}.
43138
+ *
42965
43139
  * Media attachment policy (P1 still-image subset).
42966
43140
  * - `best` — the best AVAILABLE subject image at dispatch time (D-3).
42967
43141
  * - `best-matching` — the media that explains WHY the rule fired: a rule
@@ -42975,6 +43149,8 @@ var NcRuleTargetSchema = object({
42975
43149
  * - `none` — no attachment.
42976
43150
  */
42977
43151
  /**
43152
+ * @deprecated Read only by `normalizeNcMediaPolicy` (D897) — see {@link NcMediaImageSchema}.
43153
+ *
42978
43154
  * WHAT THE PICTURE SHOWS — chosen explicitly, because the implicit ladders
42979
43155
  * conflate it with the selection strategy and betray the request: asking for
42980
43156
  * the clean scene frame on an object-event owner used to start at
@@ -43003,16 +43179,29 @@ var NcMediaFrameSchema = _enum([
43003
43179
  */
43004
43180
  var NcLinkedCameraModeSchema = _enum(["mosaic", "each"]);
43005
43181
  var NcMediaPolicySchema = object({
43182
+ /**
43183
+ * The picture — see {@link NcMediaImageSchema}. Absent on a rule nobody has
43184
+ * saved since D897: `normalizeNcMediaPolicy` derives it from the legacy
43185
+ * triple below, at load and at every write, and the store keeps only this.
43186
+ */
43187
+ image: NcMediaImageSchema.optional(),
43188
+ /**
43189
+ * Draw the zone that FIRED the rule on the picture (`scene-boxes` / `clean`;
43190
+ * a `crop` never shows it). Valid only on a rule whose trigger is a zone —
43191
+ * `conditions.zones` or an occupancy zone — and refused on save otherwise.
43192
+ * Replaces `zoneCrop`.
43193
+ */
43194
+ showTriggerZone: boolean().optional(),
43195
+ /** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
43006
43196
  attach: _enum([
43007
43197
  "best",
43008
43198
  "best-matching",
43009
43199
  "keyFrame",
43010
43200
  "none"
43011
- ]).default("best"),
43012
- /** What the still shows. Absent = `cropped` (the historical `best` shape). */
43201
+ ]).optional(),
43202
+ /** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
43013
43203
  frame: NcMediaFrameSchema.optional(),
43014
- /** Crop the attached still to the rule's condition-zone bbox (padded) —
43015
- * "show me the ZONE", not the whole scene or the subject crop. */
43204
+ /** @deprecated D897 — folded into `image: 'clean'` + `showTriggerZone` on save. */
43016
43205
  zoneCrop: boolean().optional(),
43017
43206
  /**
43018
43207
  * Also attach a short GIF cut from the stream broker's clip ring around the
@@ -43184,7 +43373,9 @@ var NcRuleInputSchema = object({
43184
43373
  * targets.
43185
43374
  */
43186
43375
  targetUsers: array(string()).optional(),
43187
- media: NcMediaPolicySchema.default({ attach: "best" }),
43376
+ /** Absent = the kind's default picture (`resolveNcMediaImage`): the subject crop for a
43377
+ * detection, the clean scene for a sensor or a sound. Set explicitly on save (D897). */
43378
+ media: NcMediaPolicySchema.default({}),
43188
43379
  throttle: NcThrottleSchema.default({
43189
43380
  cooldownSec: 60,
43190
43381
  scope: "rule-device"
@@ -44121,13 +44312,37 @@ var NcAlarmModeOpeningsSchema = object({
44121
44312
  /** Covered devices whose state could not be read (D49): neither open nor closed. */
44122
44313
  unknown: array(number().int())
44123
44314
  });
44315
+ /**
44316
+ * One alarm INPUT — a (rule, device) pair — the operator bypassed until the
44317
+ * next disarm ("Bypass this input until disarm" on a trigger notification, or
44318
+ * `nc.bypassAlarmInput`). Reported so an armed alarm with a silenced input
44319
+ * never looks fully armed (D62: off must never look like broken).
44320
+ */
44321
+ var NcAlarmInputBypassViewSchema = object({
44322
+ ruleId: string(),
44323
+ /** The rule's current name (its frozen name when the rule is gone). */
44324
+ ruleName: string(),
44325
+ /** The input: the sensor of the match, else its camera. */
44326
+ deviceId: number().int(),
44327
+ /** The input's current name. */
44328
+ name: string(),
44329
+ /** When it was bypassed (ms epoch). */
44330
+ since: number(),
44331
+ /** Triggers from this input dropped since. */
44332
+ dropped: number().int().min(0)
44333
+ });
44124
44334
  var NcAlarmLiveSchema = object({
44125
44335
  state: AlarmStateSchema,
44126
44336
  /** The mode being armed into (exit delay) or held; null when disarmed. */
44127
44337
  targetMode: AlarmArmModeSchema.nullable(),
44128
44338
  availableModes: array(AlarmArmModeSchema),
44129
44339
  openings: array(NcAlarmModeOpeningsSchema),
44130
- exclusions: array(NcAlarmExclusionViewSchema)
44340
+ exclusions: array(NcAlarmExclusionViewSchema),
44341
+ /**
44342
+ * Inputs bypassed for the rest of this arm session; cleared on disarm.
44343
+ * Defaulted so an older hub answer still parses (as "none known").
44344
+ */
44345
+ bypassedInputs: array(NcAlarmInputBypassViewSchema).default([])
44131
44346
  });
44132
44347
  var NcAlarmConfigSchema = object({
44133
44348
  /**
@@ -65776,7 +65991,19 @@ Object.freeze({
65776
65991
  addonId: null,
65777
65992
  access: "view"
65778
65993
  },
65779
- "logDestination.query": {
65994
+ "logDestination.cancelRead": {
65995
+ capName: "log-destination",
65996
+ capScope: "system",
65997
+ addonId: null,
65998
+ access: "create"
65999
+ },
66000
+ "logDestination.describeRead": {
66001
+ capName: "log-destination",
66002
+ capScope: "system",
66003
+ addonId: null,
66004
+ access: "view"
66005
+ },
66006
+ "logDestination.read": {
65780
66007
  capName: "log-destination",
65781
66008
  capScope: "system",
65782
66009
  addonId: null,
@@ -71783,6 +72010,11 @@ Object.freeze({
71783
72010
  form: "single",
71784
72011
  optional: false
71785
72012
  }],
72013
+ "logDestination.read": [{
72014
+ name: "deviceId",
72015
+ form: "single",
72016
+ optional: true
72017
+ }],
71786
72018
  "mediaPlayer.getStatus": [{
71787
72019
  name: "deviceId",
71788
72020
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-waste-collections",
3
- "version": "0.1.12",
3
+ "version": "0.1.13",
4
4
  "description": "Waste collection schedules via the vendored HACS waste_collection_schedule Python core — full source catalog as calendar-source.",
5
5
  "keywords": [
6
6
  "camstack",