@camstack/addon-provider-homeassistant 1.2.170 → 1.2.171

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- //#region ../types/dist/event-category-DaIZi00R.mjs
1
+ //#region ../types/dist/event-category-C4hVnRo8.mjs
2
2
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
3
3
  EventCategory["SystemBoot"] = "system.boot";
4
4
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -217,7 +217,17 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
217
217
  EventCategory["RecordingStopped"] = "recording.stopped";
218
218
  EventCategory["RecordingError"] = "recording.error";
219
219
  EventCategory["RecordingHealthDegraded"] = "recording.health.degraded";
220
+ /** Recording enabled but no segment finalized for the NC stall window. */
221
+ EventCategory["RecordingHealthStalled"] = "recording.health.stalled";
222
+ /** Recovery from {@link RecordingHealthStalled}. */
223
+ EventCategory["RecordingHealthOk"] = "recording.health.ok";
220
224
  EventCategory["RecordingStorageCritical"] = "recording.storage.critical";
225
+ /** Free space on a storage location crossed the warn bar. */
226
+ EventCategory["StorageLocationLow"] = "storage.location.low";
227
+ /** Free space at/under the critical bar, or capacity probe failed (`null`). */
228
+ EventCategory["StorageLocationCritical"] = "storage.location.critical";
229
+ /** Recovery from low/critical on a storage location. */
230
+ EventCategory["StorageLocationOk"] = "storage.location.ok";
221
231
  EventCategory["RecordingSegmentWritten"] = "recording.segment.written";
222
232
  EventCategory["RecordingPolicyFallback"] = "recording.policy.fallback";
223
233
  EventCategory["RecordingRetentionCompleted"] = "recording.retention.completed";
@@ -5376,7 +5386,7 @@ var ZodIssueCode = {
5376
5386
  var ZodFirstPartyTypeKind;
5377
5387
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5378
5388
  //#endregion
5379
- //#region ../types/dist/sleep-DwAQ9sqX.mjs
5389
+ //#region ../types/dist/sleep-BBF1iXUi.mjs
5380
5390
  /**
5381
5391
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5382
5392
  * window to float samples (D455).
@@ -7978,6 +7988,21 @@ var ProfileRtspEntrySchema = object({
7978
7988
  resolution: CamStreamResolutionSchema.optional()
7979
7989
  });
7980
7990
  /**
7991
+ * The model weight formats a catalog entry can ship. Schema-free on purpose:
7992
+ * `types/models.ts` builds Zod schemas from it, but a runner-closure consumer
7993
+ * (the model downloader in `@camstack/system`) needs only the list and must
7994
+ * reach it through `@camstack/types/addon` without building the cap schema
7995
+ * graph (D28).
7996
+ */
7997
+ var MODEL_FORMATS = [
7998
+ "onnx",
7999
+ "coreml",
8000
+ "openvino",
8001
+ "tflite",
8002
+ "pt",
8003
+ "gguf"
8004
+ ];
8005
+ /**
7981
8006
  * Per-call node pinning for `ctx.api` capability calls.
7982
8007
  *
7983
8008
  * A capability call normally resolves to its DEFAULT provider — a `singleton`
@@ -8586,7 +8611,7 @@ function errMsg(err) {
8586
8611
  return String(err);
8587
8612
  }
8588
8613
  //#endregion
8589
- //#region ../types/dist/composition-Bzr7GwgP.mjs
8614
+ //#region ../types/dist/composition-C-WpVYTX.mjs
8590
8615
  /**
8591
8616
  * The ffmpeg build every CamStack node downloads, per platform and arch.
8592
8617
  *
@@ -8638,7 +8663,7 @@ var BASE = `https://github.com/jellyfin/jellyfin-ffmpeg/releases/download/v${FFM
8638
8663
  function portable(target) {
8639
8664
  return `${BASE}/jellyfin-ffmpeg_${FFMPEG_RELEASE}_portable_${target}-gpl.tar.xz`;
8640
8665
  }
8641
- portable("linux64"), portable("linuxarm64"), portable("macarm64"), portable("mac64");
8666
+ portable("linux64"), portable("linuxarm64"), portable("macarm64"), portable("mac64"), `${BASE}${FFMPEG_RELEASE}`;
8642
8667
  /**
8643
8668
  * THE table "which boolean of this device type counts as HIGH", and the
8644
8669
  * pure evaluator of its EDGE.
@@ -10357,6 +10382,15 @@ discriminatedUnion("type", [
10357
10382
  message: string()
10358
10383
  })
10359
10384
  ]);
10385
+ /** Every status, in the order a summary lists them. */
10386
+ var RETRAIN_REVIEW_STATUSES = [
10387
+ "unchanged",
10388
+ "adjusted",
10389
+ "reclassified",
10390
+ "added",
10391
+ "removed",
10392
+ "model-error"
10393
+ ];
10360
10394
  /**
10361
10395
  * What the gate decided about a birth, from the CALLER's point of view.
10362
10396
  *
@@ -11974,14 +12008,6 @@ var MASK_SUPPLY_STEP_IDS = ["segmentation"];
11974
12008
  ...CROP_SUPPLY_STEP_IDS,
11975
12009
  ...MASK_SUPPLY_STEP_IDS
11976
12010
  ];
11977
- var MODEL_FORMATS = [
11978
- "onnx",
11979
- "coreml",
11980
- "openvino",
11981
- "tflite",
11982
- "pt",
11983
- "gguf"
11984
- ];
11985
12011
  /**
11986
12012
  * Multi-file format payload.
11987
12013
  *
@@ -13278,6 +13304,329 @@ method(object({
13278
13304
  password: string()
13279
13305
  }), AuthResultSchema.nullable(), { kind: "mutation" }), method(object({ state: string() }), string()), method(record(string(), string()), AuthResultSchema, { kind: "mutation" }), method(object({ token: string() }), AuthResultSchema.nullable());
13280
13306
  /**
13307
+ * Query filter for settings-store collections.
13308
+ */
13309
+ var QueryFilterSchema = object({
13310
+ where: record(string(), unknown()).optional(),
13311
+ whereIn: record(string(), array(unknown())).optional(),
13312
+ whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
13313
+ /** NULL-safe exclusion: matches rows whose field is NULL OR != the value. */
13314
+ whereNot: record(string(), unknown()).optional(),
13315
+ /** NULL-safe exclusion of a SET — `whereNot` for more than one value. An
13316
+ * empty list excludes nothing. See `QueryFilter.whereNotIn`. */
13317
+ whereNotIn: record(string(), array(unknown())).optional(),
13318
+ orderBy: object({
13319
+ field: string(),
13320
+ direction: _enum(["asc", "desc"])
13321
+ }).optional(),
13322
+ limit: number().optional(),
13323
+ offset: number().optional()
13324
+ });
13325
+ /**
13326
+ * The predicate half of a filter, for BULK MUTATIONS.
13327
+ *
13328
+ * Deliberately not `QueryFilterSchema`: `orderBy` / `limit` / `offset` have no
13329
+ * meaning for a statement that rewrites a set, and accepting them would invite
13330
+ * a caller to believe `limit` bounds the damage. Every field is optional here
13331
+ * only so the shape stays composable — the implementation REJECTS a filter
13332
+ * that compiles to no predicate, because that is the whole collection.
13333
+ */
13334
+ var MutationFilterSchema = object({
13335
+ where: record(string(), unknown()).optional(),
13336
+ whereIn: record(string(), array(unknown())).optional(),
13337
+ whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
13338
+ whereNot: record(string(), unknown()).optional(),
13339
+ whereNotIn: record(string(), array(unknown())).optional()
13340
+ });
13341
+ /**
13342
+ * One scalar an {@link settingsStoreCapability.methods.aggregate} call asks for.
13343
+ *
13344
+ * `as` names the slot in the result, so the SAME column may be asked twice with
13345
+ * two operations (`MIN(startMs)` and `MAX(startMs)` in one round trip) — which
13346
+ * a `Record<column, op>` shape could not express.
13347
+ */
13348
+ var AggregateFieldSchema = object({
13349
+ /** Result key. */
13350
+ as: string().min(1),
13351
+ /** Column to aggregate. Must be a real column of a declared collection. */
13352
+ field: string().min(1),
13353
+ op: _enum([
13354
+ "sum",
13355
+ "min",
13356
+ "max"
13357
+ ])
13358
+ });
13359
+ /**
13360
+ * `COUNT(*)` plus one number per requested field.
13361
+ *
13362
+ * `null` means NO ROW MATCHED, never zero: a `SUM` over an empty set and a sum
13363
+ * that really is 0 are different facts, and an accounting caller that renders
13364
+ * "0 bytes, oldest = 0" for "nothing here" reports a lie about a disk.
13365
+ */
13366
+ var AggregateResultSchema = object({
13367
+ count: number().int(),
13368
+ values: record(string(), number().nullable())
13369
+ });
13370
+ /** A single stored record: `{ id, data }`. */
13371
+ var SettingsRecordSchema = object({
13372
+ id: string(),
13373
+ data: record(string(), unknown())
13374
+ });
13375
+ /**
13376
+ * One record of a BULK insert — {@link SettingsRecordSchema} with the id made
13377
+ * optional.
13378
+ *
13379
+ * A separate schema rather than loosening the shared one: every other method
13380
+ * on this cap addresses a row BY its id, and making that field optional
13381
+ * everywhere would turn a forgotten key into a silently generated one on
13382
+ * `update` and `delete` as well.
13383
+ */
13384
+ var BulkRecordSchema = object({
13385
+ id: string().optional(),
13386
+ data: record(string(), unknown())
13387
+ });
13388
+ /**
13389
+ * The database FILES one `sqlite-settings` engine process owns (D851).
13390
+ * Closed on purpose: a file is a thing the engine opens, backs up and gives a
13391
+ * serving thread, so a new one is a code change, never a string a caller
13392
+ * invents. `settings` is `camstack.db` and the default for every collection
13393
+ * that names no file.
13394
+ */
13395
+ var DataStoreDatabaseSchema = _enum([
13396
+ "settings",
13397
+ "events",
13398
+ "history"
13399
+ ]);
13400
+ DataStoreDatabaseSchema.options;
13401
+ /**
13402
+ * One write inside a {@link settingsStoreCapability.methods.transact} call.
13403
+ * The three that a "replace this set, bump that revision" write needs, plus
13404
+ * the batched upsert a rollup writer needs.
13405
+ */
13406
+ var TransactOpSchema = discriminatedUnion("op", [
13407
+ object({
13408
+ op: literal("deleteWhere"),
13409
+ collection: string(),
13410
+ filter: MutationFilterSchema
13411
+ }),
13412
+ object({
13413
+ op: literal("insertMany"),
13414
+ collection: string(),
13415
+ records: array(BulkRecordSchema).readonly()
13416
+ }),
13417
+ object({
13418
+ op: literal("update"),
13419
+ collection: string(),
13420
+ id: string(),
13421
+ data: record(string(), unknown())
13422
+ }),
13423
+ object({
13424
+ op: literal("upsertMany"),
13425
+ collection: string(),
13426
+ conflict: array(string()).readonly(),
13427
+ records: array(BulkRecordSchema).readonly()
13428
+ })
13429
+ ]);
13430
+ /**
13431
+ * The precondition of a transaction: the row `key` of `collection` must hold
13432
+ * `equals` in `column`, read INSIDE the transaction.
13433
+ */
13434
+ var TransactGuardSchema = object({
13435
+ collection: string(),
13436
+ key: string(),
13437
+ column: string(),
13438
+ equals: unknown()
13439
+ });
13440
+ /**
13441
+ * Column declaration for a structured (SQL-backed) collection.
13442
+ *
13443
+ * Logical types — the backend translates each to the matching SQLite
13444
+ * storage class and handles per-type marshaling:
13445
+ * - `TEXT` / `INTEGER` / `REAL` — native SQLite types, pass-through
13446
+ * - `JSON` — TEXT under the hood; serialised on write, parsed on read
13447
+ * - `BOOLEAN` — INTEGER 0/1 under the hood; coerced both directions
13448
+ */
13449
+ var CollectionColumnSchema = object({
13450
+ name: string(),
13451
+ type: _enum([
13452
+ "TEXT",
13453
+ "INTEGER",
13454
+ "REAL",
13455
+ "JSON",
13456
+ "BOOLEAN"
13457
+ ]),
13458
+ primaryKey: boolean().optional(),
13459
+ notNull: boolean().optional(),
13460
+ unique: boolean().optional(),
13461
+ /**
13462
+ * Column DEFAULT. Required for B2: the four `ensureTable` consumers declare
13463
+ * columns like `enabled INTEGER NOT NULL DEFAULT 1`, and without this the
13464
+ * collection surface simply cannot express their existing tables — which is
13465
+ * why they were still on the uncapped `table*` API.
13466
+ */
13467
+ defaultValue: union([
13468
+ string(),
13469
+ number(),
13470
+ boolean()
13471
+ ]).optional()
13472
+ });
13473
+ var CollectionIndexSchema = object({
13474
+ name: string(),
13475
+ columns: array(string()).readonly(),
13476
+ unique: boolean().optional()
13477
+ });
13478
+ /**
13479
+ * The input of `declareCollection` — ONE schema for the door and for the
13480
+ * engine behind it, so the two surfaces cannot drift (the dispatcher forwards
13481
+ * the payload untouched).
13482
+ *
13483
+ * - `database` — the file the collection lives in (D851). Absent means
13484
+ * `settings`. A declaration naming a file other than the one the table is
13485
+ * already in is REFUSED by the engine, never moved.
13486
+ * - `primaryKey` — a COMPOSITE key, as column names. A single name is the same
13487
+ * as `primaryKey: true` on that column. A composite-keyed collection has no
13488
+ * `id`: it is written with `insertMany` / `upsertMany` / `transact` and read
13489
+ * with `query` / `count` / `aggregate` / `deleteWhere`; the calls that
13490
+ * address one row by id are refused.
13491
+ * - `withoutRowid` — emit `WITHOUT ROWID`. Requires a primary key.
13492
+ */
13493
+ var DeclareCollectionInputSchema = object({
13494
+ namespace: string().optional(),
13495
+ collection: string(),
13496
+ columns: array(CollectionColumnSchema).readonly(),
13497
+ indexes: array(CollectionIndexSchema).readonly().optional(),
13498
+ database: DataStoreDatabaseSchema.optional(),
13499
+ primaryKey: array(string()).readonly().optional(),
13500
+ withoutRowid: boolean().optional()
13501
+ });
13502
+ method(object({
13503
+ namespace: string().optional(),
13504
+ collection: string(),
13505
+ key: string()
13506
+ }), unknown(), { auth: "admin" }), method(object({
13507
+ namespace: string().optional(),
13508
+ collection: string(),
13509
+ key: string(),
13510
+ value: unknown()
13511
+ }), _void(), {
13512
+ kind: "mutation",
13513
+ auth: "admin"
13514
+ }), method(object({
13515
+ namespace: string().optional(),
13516
+ collection: string(),
13517
+ filter: QueryFilterSchema.optional(),
13518
+ columns: array(string()).readonly().optional()
13519
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
13520
+ namespace: string().optional(),
13521
+ collection: string(),
13522
+ /** Declared columns identifying the slot; must be covered by a UNIQUE
13523
+ * index on the collection. Never empty. */
13524
+ conflict: array(string()).readonly(),
13525
+ record: BulkRecordSchema
13526
+ }), object({
13527
+ /** The id the row HAS: assigned by SQLite on an insert, or the existing
13528
+ * row's own id on an update. */
13529
+ id: union([string(), number()]) }), {
13530
+ kind: "mutation",
13531
+ auth: "admin"
13532
+ }), method(object({
13533
+ namespace: string().optional(),
13534
+ collection: string(),
13535
+ conflict: array(string()).readonly(),
13536
+ records: array(BulkRecordSchema).readonly()
13537
+ }), object({ upserted: number().int() }), {
13538
+ kind: "mutation",
13539
+ auth: "admin"
13540
+ }), method(object({
13541
+ namespace: string().optional(),
13542
+ collection: string(),
13543
+ record: object({
13544
+ id: string().optional(),
13545
+ data: record(string(), unknown())
13546
+ })
13547
+ }), object({
13548
+ /**
13549
+ * The id the row ACTUALLY got (D473): the one supplied, the UUID minted
13550
+ * for an absent one, or the ROWID SQLite assigned on an `INTEGER`
13551
+ * primary key — which is the only place an auto key is knowable.
13552
+ */
13553
+ id: union([string(), number()]) }), {
13554
+ kind: "mutation",
13555
+ auth: "admin"
13556
+ }), method(object({
13557
+ namespace: string().optional(),
13558
+ collection: string(),
13559
+ records: array(BulkRecordSchema).readonly()
13560
+ }), object({ inserted: number().int() }), {
13561
+ kind: "mutation",
13562
+ auth: "admin"
13563
+ }), method(object({
13564
+ namespace: string().optional(),
13565
+ guard: TransactGuardSchema.optional(),
13566
+ ops: array(TransactOpSchema).readonly()
13567
+ }), object({
13568
+ applied: boolean(),
13569
+ current: unknown().optional()
13570
+ }), {
13571
+ kind: "mutation",
13572
+ auth: "admin"
13573
+ }), method(object({
13574
+ namespace: string().optional(),
13575
+ collection: string(),
13576
+ id: string(),
13577
+ data: record(string(), unknown())
13578
+ }), _void(), {
13579
+ kind: "mutation",
13580
+ auth: "admin"
13581
+ }), method(object({
13582
+ namespace: string().optional(),
13583
+ collection: string(),
13584
+ key: string()
13585
+ }), _void(), {
13586
+ kind: "mutation",
13587
+ auth: "admin"
13588
+ }), method(object({
13589
+ namespace: string().optional(),
13590
+ collection: string(),
13591
+ filter: MutationFilterSchema
13592
+ }), object({ deleted: number().int() }), {
13593
+ kind: "mutation",
13594
+ auth: "admin"
13595
+ }), method(object({
13596
+ namespace: string().optional(),
13597
+ collection: string(),
13598
+ filter: MutationFilterSchema,
13599
+ data: record(string(), unknown())
13600
+ }), object({ updated: number().int() }), {
13601
+ kind: "mutation",
13602
+ auth: "admin"
13603
+ }), method(object({
13604
+ namespace: string().optional(),
13605
+ collection: string(),
13606
+ filter: QueryFilterSchema.optional()
13607
+ }), number(), { auth: "admin" }), method(object({
13608
+ namespace: string().optional(),
13609
+ collection: string(),
13610
+ fields: array(AggregateFieldSchema).readonly(),
13611
+ filter: QueryFilterSchema.optional()
13612
+ }), AggregateResultSchema, { auth: "admin" }), method(object({
13613
+ namespace: string().optional(),
13614
+ collection: string(),
13615
+ field: string(),
13616
+ bucketSize: number().int().positive(),
13617
+ origin: number().int(),
13618
+ filter: QueryFilterSchema.optional()
13619
+ }), array(object({
13620
+ bucket: number().int(),
13621
+ count: number().int()
13622
+ })).readonly(), { auth: "admin" }), method(object({
13623
+ namespace: string().optional(),
13624
+ collection: string()
13625
+ }), boolean(), { auth: "admin" }), method(DeclareCollectionInputSchema, _void(), {
13626
+ kind: "mutation",
13627
+ auth: "admin"
13628
+ });
13629
+ /**
13281
13630
  * How long one snapshot may take end to end: the pinned copy of the whole
13282
13631
  * database plus `PRAGMA integrity_check` over the copy, on the hub's slowest
13283
13632
  * disk. ~800 MB at a pessimistic 10 MB/s is under 3 minutes; the bound is
@@ -13290,7 +13639,11 @@ var DATABASE_SNAPSHOT_TIMEOUT_MS = 30 * 6e4;
13290
13639
  * database has no sidecars and is just as owned). Paths are absolute on the
13291
13640
  * owner's host.
13292
13641
  */
13293
- var DatabaseSnapshotTargetsSchema = object({ databases: array(object({ livePath: string() })) });
13642
+ var DatabaseSnapshotTargetsSchema = object({ databases: array(object({
13643
+ /** Which owned file this is — the handle `writeSnapshot` takes. */
13644
+ databaseId: DataStoreDatabaseSchema,
13645
+ livePath: string()
13646
+ })) });
13294
13647
  /** One b-tree table of the snapshot and the rows it holds. */
13295
13648
  var DatabaseSnapshotTableSchema = object({
13296
13649
  name: string(),
@@ -13323,6 +13676,10 @@ var DatabaseSnapshotResultSchema = object({
13323
13676
  /** When the pinned read transaction began (ms epoch) — the snapshot's instant. */
13324
13677
  takenAt: number()
13325
13678
  });
13679
+ /** A snapshot the owner wrote, with the file it belongs to. */
13680
+ var DatabaseSnapshotWrittenSchema = DatabaseSnapshotResultSchema.extend({ databaseId: DataStoreDatabaseSchema });
13681
+ /** Which database `writeSnapshot` copies. Required: an unstated ask is not guessed. */
13682
+ var DatabaseSnapshotRequestSchema = object({ databaseId: DataStoreDatabaseSchema });
13326
13683
  /**
13327
13684
  * A snapshot as an ARCHIVE records it (`ArchiveManifest.sqliteSnapshots`):
13328
13685
  * the same facts, with both paths relative to the archive root (the node's
@@ -13332,9 +13689,11 @@ var ArchiveSqliteSnapshotSchema = DatabaseSnapshotResultSchema.extend({
13332
13689
  /** Archive-relative path of the live database the archive does NOT carry. */
13333
13690
  livePath: string(),
13334
13691
  /** Archive-relative path of the verified copy it carries in its place. */
13335
- snapshotPath: string()
13692
+ snapshotPath: string(),
13693
+ /** Absent on an archive made before several files were owned: that was `settings`. */
13694
+ databaseId: DataStoreDatabaseSchema.optional()
13336
13695
  });
13337
- method(object({}), DatabaseSnapshotTargetsSchema, { auth: "admin" }), method(object({}), DatabaseSnapshotResultSchema, {
13696
+ method(object({}), DatabaseSnapshotTargetsSchema, { auth: "admin" }), method(DatabaseSnapshotRequestSchema, DatabaseSnapshotWrittenSchema, {
13338
13697
  kind: "mutation",
13339
13698
  auth: "admin",
13340
13699
  timeoutMs: DATABASE_SNAPSHOT_TIMEOUT_MS
@@ -13455,7 +13814,12 @@ var BackupArchiveEntrySchema = object({
13455
13814
  /** Top-level locations included in the archive (db, addons, tls, …). */
13456
13815
  locations: array(string()).readonly(),
13457
13816
  /** Present when the archive is encrypted; restore then needs that key. */
13458
- encryption: BackupArchiveEncryptionSchema.optional()
13817
+ encryption: BackupArchiveEncryptionSchema.optional(),
13818
+ /**
13819
+ * The databases the run asked to carry (its retention class). Absent on an
13820
+ * archive made before several files were owned: that was `['settings']`.
13821
+ */
13822
+ databases: array(DataStoreDatabaseSchema).readonly().optional()
13459
13823
  });
13460
13824
  var BackupEntrySchema = object({
13461
13825
  id: string(),
@@ -13489,7 +13853,12 @@ var ArchiveManifestSchema = object({
13489
13853
  * Live SQLite databases this archive carries as their OWNER's verified
13490
13854
  * snapshot instead of as files (D693). Absent on archives made before.
13491
13855
  */
13492
- sqliteSnapshots: array(ArchiveSqliteSnapshotSchema).optional()
13856
+ sqliteSnapshots: array(ArchiveSqliteSnapshotSchema).optional(),
13857
+ /**
13858
+ * Owned database files the run did NOT carry (not selected): left out of the
13859
+ * tar and the entry list alike. Absent when every owned file was carried.
13860
+ */
13861
+ omittedDatabases: array(DataStoreDatabaseSchema).optional()
13493
13862
  });
13494
13863
  var LocationStatSchema = object({
13495
13864
  name: string(),
@@ -13611,6 +13980,12 @@ var BackupScheduleSchema = object({
13611
13980
  /** Optional subset of source locations to include; omitted = all. */
13612
13981
  dataSources: array(string()).readonly().optional(),
13613
13982
  /**
13983
+ * Which database files this schedule carries. Absent = `['settings']`
13984
+ * (an unstated ask is the minimum, D382). Events and history run weekly,
13985
+ * settings nightly (D852).
13986
+ */
13987
+ databases: array(DataStoreDatabaseSchema).readonly().optional(),
13988
+ /**
13614
13989
  * ms-epoch of the last tick that FIRED this schedule. Stamped before the
13615
13990
  * archive runs (it is the dedupe anchor), so it says "attempted", never
13616
13991
  * "succeeded" — a run refused by every destination stamps it too.
@@ -13634,7 +14009,9 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
13634
14009
  * retention). Omitted = each destination's own policy
13635
14010
  * retention (manual runs).
13636
14011
  */
13637
- retentionCount: number().int().min(1).max(1e3).optional()
14012
+ retentionCount: number().int().min(1).max(1e3).optional(),
14013
+ /** Database files to carry; omitted = `['settings']`. */
14014
+ databases: array(DataStoreDatabaseSchema).optional()
13638
14015
  }).optional(), BackupTriggerResultSchema, {
13639
14016
  kind: "mutation",
13640
14017
  auth: "admin"
@@ -13709,14 +14086,18 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
13709
14086
  ok: boolean(),
13710
14087
  error: string().optional(),
13711
14088
  nextRuns: array(number()).readonly()
13712
- })), method(_void(), array(BackupScheduleSchema).readonly(), { auth: "admin" }), method(object({
14089
+ })), method(_void(), array(BackupScheduleSchema).readonly(), { auth: "admin" }), method(_void(), object({
14090
+ answered: boolean(),
14091
+ databases: array(DataStoreDatabaseSchema).readonly()
14092
+ }), { auth: "admin" }), method(object({
13713
14093
  id: string().optional(),
13714
14094
  label: string(),
13715
14095
  cron: string(),
13716
14096
  enabled: boolean(),
13717
14097
  locationIds: array(string()).readonly(),
13718
14098
  retentionCount: number().int().min(1).max(1e3),
13719
- dataSources: array(string()).readonly().optional()
14099
+ dataSources: array(string()).readonly().optional(),
14100
+ databases: array(DataStoreDatabaseSchema).readonly().optional()
13720
14101
  }), BackupScheduleSchema, {
13721
14102
  kind: "mutation",
13722
14103
  auth: "admin"
@@ -14196,6 +14577,16 @@ var BrokerClientsSchema = object({
14196
14577
  /** Total encoded + raw-RTP callback subscriber count (sum of `encoded[].length`). */
14197
14578
  encodedSubscribers: number()
14198
14579
  });
14580
+ /**
14581
+ * How many people are watching one camera LIVE right now — see
14582
+ * `getLiveViewerCounts`. A camera with nobody watching is absent from the list
14583
+ * (so `viewers` is always at least 1): the listing carries the cameras that
14584
+ * have viewers, never a row of zeros.
14585
+ */
14586
+ var LiveViewerCountSchema = object({
14587
+ deviceId: number().int().nonnegative(),
14588
+ viewers: number().int().positive()
14589
+ });
14199
14590
  _enum([
14200
14591
  "reconnecting",
14201
14592
  "sleeping",
@@ -14556,7 +14947,7 @@ method(object({
14556
14947
  }), {
14557
14948
  kind: "mutation",
14558
14949
  auth: "admin"
14559
- }), method(object({ brokerId: string() }), BrokerClientsSchema), method(object({
14950
+ }), method(object({ brokerId: string() }), BrokerClientsSchema), method(_void(), array(LiveViewerCountSchema).readonly()), method(object({
14560
14951
  brokerId: string(),
14561
14952
  channel: _enum(["rtsp", "audio"]),
14562
14953
  handle: string()
@@ -15524,240 +15915,6 @@ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" }
15524
15915
  timeoutMs: 30 * 6e4
15525
15916
  });
15526
15917
  /**
15527
- * Query filter for settings-store collections.
15528
- */
15529
- var QueryFilterSchema = object({
15530
- where: record(string(), unknown()).optional(),
15531
- whereIn: record(string(), array(unknown())).optional(),
15532
- whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
15533
- /** NULL-safe exclusion: matches rows whose field is NULL OR != the value. */
15534
- whereNot: record(string(), unknown()).optional(),
15535
- /** NULL-safe exclusion of a SET — `whereNot` for more than one value. An
15536
- * empty list excludes nothing. See `QueryFilter.whereNotIn`. */
15537
- whereNotIn: record(string(), array(unknown())).optional(),
15538
- orderBy: object({
15539
- field: string(),
15540
- direction: _enum(["asc", "desc"])
15541
- }).optional(),
15542
- limit: number().optional(),
15543
- offset: number().optional()
15544
- });
15545
- /**
15546
- * The predicate half of a filter, for BULK MUTATIONS.
15547
- *
15548
- * Deliberately not `QueryFilterSchema`: `orderBy` / `limit` / `offset` have no
15549
- * meaning for a statement that rewrites a set, and accepting them would invite
15550
- * a caller to believe `limit` bounds the damage. Every field is optional here
15551
- * only so the shape stays composable — the implementation REJECTS a filter
15552
- * that compiles to no predicate, because that is the whole collection.
15553
- */
15554
- var MutationFilterSchema = object({
15555
- where: record(string(), unknown()).optional(),
15556
- whereIn: record(string(), array(unknown())).optional(),
15557
- whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
15558
- whereNot: record(string(), unknown()).optional(),
15559
- whereNotIn: record(string(), array(unknown())).optional()
15560
- });
15561
- /**
15562
- * One scalar an {@link settingsStoreCapability.methods.aggregate} call asks for.
15563
- *
15564
- * `as` names the slot in the result, so the SAME column may be asked twice with
15565
- * two operations (`MIN(startMs)` and `MAX(startMs)` in one round trip) — which
15566
- * a `Record<column, op>` shape could not express.
15567
- */
15568
- var AggregateFieldSchema = object({
15569
- /** Result key. */
15570
- as: string().min(1),
15571
- /** Column to aggregate. Must be a real column of a declared collection. */
15572
- field: string().min(1),
15573
- op: _enum([
15574
- "sum",
15575
- "min",
15576
- "max"
15577
- ])
15578
- });
15579
- /**
15580
- * `COUNT(*)` plus one number per requested field.
15581
- *
15582
- * `null` means NO ROW MATCHED, never zero: a `SUM` over an empty set and a sum
15583
- * that really is 0 are different facts, and an accounting caller that renders
15584
- * "0 bytes, oldest = 0" for "nothing here" reports a lie about a disk.
15585
- */
15586
- var AggregateResultSchema = object({
15587
- count: number().int(),
15588
- values: record(string(), number().nullable())
15589
- });
15590
- /** A single stored record: `{ id, data }`. */
15591
- var SettingsRecordSchema = object({
15592
- id: string(),
15593
- data: record(string(), unknown())
15594
- });
15595
- /**
15596
- * One record of a BULK insert — {@link SettingsRecordSchema} with the id made
15597
- * optional.
15598
- *
15599
- * A separate schema rather than loosening the shared one: every other method
15600
- * on this cap addresses a row BY its id, and making that field optional
15601
- * everywhere would turn a forgotten key into a silently generated one on
15602
- * `update` and `delete` as well.
15603
- */
15604
- var BulkRecordSchema = object({
15605
- id: string().optional(),
15606
- data: record(string(), unknown())
15607
- });
15608
- /**
15609
- * Column declaration for a structured (SQL-backed) collection.
15610
- *
15611
- * Logical types — the backend translates each to the matching SQLite
15612
- * storage class and handles per-type marshaling:
15613
- * - `TEXT` / `INTEGER` / `REAL` — native SQLite types, pass-through
15614
- * - `JSON` — TEXT under the hood; serialised on write, parsed on read
15615
- * - `BOOLEAN` — INTEGER 0/1 under the hood; coerced both directions
15616
- */
15617
- var CollectionColumnSchema = object({
15618
- name: string(),
15619
- type: _enum([
15620
- "TEXT",
15621
- "INTEGER",
15622
- "REAL",
15623
- "JSON",
15624
- "BOOLEAN"
15625
- ]),
15626
- primaryKey: boolean().optional(),
15627
- notNull: boolean().optional(),
15628
- unique: boolean().optional(),
15629
- /**
15630
- * Column DEFAULT. Required for B2: the four `ensureTable` consumers declare
15631
- * columns like `enabled INTEGER NOT NULL DEFAULT 1`, and without this the
15632
- * collection surface simply cannot express their existing tables — which is
15633
- * why they were still on the uncapped `table*` API.
15634
- */
15635
- defaultValue: union([
15636
- string(),
15637
- number(),
15638
- boolean()
15639
- ]).optional()
15640
- });
15641
- var CollectionIndexSchema = object({
15642
- name: string(),
15643
- columns: array(string()).readonly(),
15644
- unique: boolean().optional()
15645
- });
15646
- method(object({
15647
- namespace: string().optional(),
15648
- collection: string(),
15649
- key: string()
15650
- }), unknown(), { auth: "admin" }), method(object({
15651
- namespace: string().optional(),
15652
- collection: string(),
15653
- key: string(),
15654
- value: unknown()
15655
- }), _void(), {
15656
- kind: "mutation",
15657
- auth: "admin"
15658
- }), method(object({
15659
- namespace: string().optional(),
15660
- collection: string(),
15661
- filter: QueryFilterSchema.optional(),
15662
- columns: array(string()).readonly().optional()
15663
- }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
15664
- namespace: string().optional(),
15665
- collection: string(),
15666
- /** Declared columns identifying the slot; must be covered by a UNIQUE
15667
- * index on the collection. Never empty. */
15668
- conflict: array(string()).readonly(),
15669
- record: BulkRecordSchema
15670
- }), object({
15671
- /** The id the row HAS: assigned by SQLite on an insert, or the existing
15672
- * row's own id on an update. */
15673
- id: union([string(), number()]) }), {
15674
- kind: "mutation",
15675
- auth: "admin"
15676
- }), method(object({
15677
- namespace: string().optional(),
15678
- collection: string(),
15679
- record: object({
15680
- id: string().optional(),
15681
- data: record(string(), unknown())
15682
- })
15683
- }), object({
15684
- /**
15685
- * The id the row ACTUALLY got (D473): the one supplied, the UUID minted
15686
- * for an absent one, or the ROWID SQLite assigned on an `INTEGER`
15687
- * primary key — which is the only place an auto key is knowable.
15688
- */
15689
- id: union([string(), number()]) }), {
15690
- kind: "mutation",
15691
- auth: "admin"
15692
- }), method(object({
15693
- namespace: string().optional(),
15694
- collection: string(),
15695
- records: array(BulkRecordSchema).readonly()
15696
- }), object({ inserted: number().int() }), {
15697
- kind: "mutation",
15698
- auth: "admin"
15699
- }), method(object({
15700
- namespace: string().optional(),
15701
- collection: string(),
15702
- id: string(),
15703
- data: record(string(), unknown())
15704
- }), _void(), {
15705
- kind: "mutation",
15706
- auth: "admin"
15707
- }), method(object({
15708
- namespace: string().optional(),
15709
- collection: string(),
15710
- key: string()
15711
- }), _void(), {
15712
- kind: "mutation",
15713
- auth: "admin"
15714
- }), method(object({
15715
- namespace: string().optional(),
15716
- collection: string(),
15717
- filter: MutationFilterSchema
15718
- }), object({ deleted: number().int() }), {
15719
- kind: "mutation",
15720
- auth: "admin"
15721
- }), method(object({
15722
- namespace: string().optional(),
15723
- collection: string(),
15724
- filter: MutationFilterSchema,
15725
- data: record(string(), unknown())
15726
- }), object({ updated: number().int() }), {
15727
- kind: "mutation",
15728
- auth: "admin"
15729
- }), method(object({
15730
- namespace: string().optional(),
15731
- collection: string(),
15732
- filter: QueryFilterSchema.optional()
15733
- }), number(), { auth: "admin" }), method(object({
15734
- namespace: string().optional(),
15735
- collection: string(),
15736
- fields: array(AggregateFieldSchema).readonly(),
15737
- filter: QueryFilterSchema.optional()
15738
- }), AggregateResultSchema, { auth: "admin" }), method(object({
15739
- namespace: string().optional(),
15740
- collection: string(),
15741
- field: string(),
15742
- bucketSize: number().int().positive(),
15743
- origin: number().int(),
15744
- filter: QueryFilterSchema.optional()
15745
- }), array(object({
15746
- bucket: number().int(),
15747
- count: number().int()
15748
- })).readonly(), { auth: "admin" }), method(object({
15749
- namespace: string().optional(),
15750
- collection: string()
15751
- }), boolean(), { auth: "admin" }), method(object({
15752
- namespace: string().optional(),
15753
- collection: string(),
15754
- columns: array(CollectionColumnSchema).readonly(),
15755
- indexes: array(CollectionIndexSchema).readonly().optional()
15756
- }), _void(), {
15757
- kind: "mutation",
15758
- auth: "admin"
15759
- });
15760
- /**
15761
15918
  * What one engine says about itself. The orchestrator uses `kind` to pick
15762
15919
  * a registrant for a collection; `engineId` is what a log line names when
15763
15920
  * a call is routed or refused.
@@ -15837,6 +15994,14 @@ id: union([string(), number()]) }), {
15837
15994
  }), object({ id: union([string(), number()]) }), {
15838
15995
  kind: "mutation",
15839
15996
  auth: "admin"
15997
+ }), method(object({
15998
+ namespace: string().optional(),
15999
+ collection: string(),
16000
+ conflict: array(string()).readonly(),
16001
+ records: array(BulkRecordSchema).readonly()
16002
+ }), object({ upserted: number().int() }), {
16003
+ kind: "mutation",
16004
+ auth: "admin"
15840
16005
  }), method(object({
15841
16006
  namespace: string().optional(),
15842
16007
  collection: string(),
@@ -15844,6 +16009,16 @@ id: union([string(), number()]) }), {
15844
16009
  }), object({ inserted: number().int() }), {
15845
16010
  kind: "mutation",
15846
16011
  auth: "admin"
16012
+ }), method(object({
16013
+ namespace: string().optional(),
16014
+ guard: TransactGuardSchema.optional(),
16015
+ ops: array(TransactOpSchema).readonly()
16016
+ }), object({
16017
+ applied: boolean(),
16018
+ current: unknown().optional()
16019
+ }), {
16020
+ kind: "mutation",
16021
+ auth: "admin"
15847
16022
  }), method(object({
15848
16023
  namespace: string().optional(),
15849
16024
  collection: string(),
@@ -15896,12 +16071,7 @@ id: union([string(), number()]) }), {
15896
16071
  })).readonly(), { auth: "admin" }), method(object({
15897
16072
  namespace: string().optional(),
15898
16073
  collection: string()
15899
- }), boolean(), { auth: "admin" }), method(object({
15900
- namespace: string().optional(),
15901
- collection: string(),
15902
- columns: array(CollectionColumnSchema).readonly(),
15903
- indexes: array(CollectionIndexSchema).readonly().optional()
15904
- }), _void(), {
16074
+ }), boolean(), { auth: "admin" }), method(DeclareCollectionInputSchema, _void(), {
15905
16075
  kind: "mutation",
15906
16076
  auth: "admin"
15907
16077
  });
@@ -21077,6 +21247,12 @@ var NcSystemEventKindSchema = _enum([
21077
21247
  "node-updating",
21078
21248
  "node-inference-unavailable",
21079
21249
  "detection-blind",
21250
+ "recording-stalled",
21251
+ "recording-healthy",
21252
+ "recording-degraded",
21253
+ "storage-location-low",
21254
+ "storage-location-critical",
21255
+ "storage-location-ok",
21080
21256
  "addon-crash-loop",
21081
21257
  "addon-update-available",
21082
21258
  "server-update-available",
@@ -24748,6 +24924,58 @@ var RetrainBboxSchema = object({
24748
24924
  h: number()
24749
24925
  });
24750
24926
  /**
24927
+ * What a box LOOKED LIKE when it was offered, snapshotted at the moment the
24928
+ * operator accepted it. The saved row keeps only the final rectangle; this is
24929
+ * the other half of the pair, and the pair is what says whether the operator
24930
+ * accepted, nudged, relabelled or replaced a proposal (`retrain-review.ts`).
24931
+ *
24932
+ * `ref` names the proposal inside its frame: `pipeline:<trackId>` for a box the
24933
+ * live pipeline drew, `assist:<n>` for the n-th box of a detector or LLM run,
24934
+ * and anything unique for an operator-drawn box (`operator:<n>`). Re-derived
24935
+ * pipeline boxes carry the same ref every time, which is what lets a dismissal
24936
+ * stay dismissed.
24937
+ */
24938
+ var RetrainOriginSchema = object({
24939
+ source: RetrainAnnotationSourceSchema,
24940
+ ref: string().min(1),
24941
+ bbox: RetrainBboxSchema,
24942
+ macroClass: RetrainMacroClassSchema,
24943
+ label: string().optional(),
24944
+ score: number().optional(),
24945
+ modelId: string().optional()
24946
+ });
24947
+ /**
24948
+ * A proposal the operator deleted. Durable on the frame, so a deleted pipeline
24949
+ * box does not come back as a draft every time the frame is reopened, and so
24950
+ * the deletion itself is a recorded fact rather than an absence.
24951
+ */
24952
+ var RetrainDismissedSchema = object({
24953
+ ref: string().min(1),
24954
+ snapshot: RetrainOriginSchema
24955
+ });
24956
+ /** What the operator did with a proposal (see `retrain-review.ts`). */
24957
+ var RetrainReviewStatusSchema = _enum(RETRAIN_REVIEW_STATUSES);
24958
+ var RetrainFrameReviewSchema = object({
24959
+ boxes: array(object({
24960
+ ref: string(),
24961
+ savedId: string().optional(),
24962
+ status: RetrainReviewStatusSchema,
24963
+ /** The baseline was re-derived, not snapshotted (a pre-origin row). */
24964
+ approximate: boolean(),
24965
+ origin: RetrainOriginSchema.optional(),
24966
+ /** The class / label the box carries NOW (a removed box: its origin's). Absent on an older hub. */
24967
+ macroClass: RetrainMacroClassSchema.optional(),
24968
+ label: string().optional(),
24969
+ iou: number().optional()
24970
+ })).readonly(),
24971
+ summary: object({
24972
+ counts: record(RetrainReviewStatusSchema, number().int()),
24973
+ total: number().int(),
24974
+ changed: number().int(),
24975
+ approximate: boolean()
24976
+ })
24977
+ });
24978
+ /**
24751
24979
  * One annotated subject.
24752
24980
  *
24753
24981
  * `bbox` is normalised against the full frame, ALWAYS. The per-model shapes
@@ -24771,6 +24999,9 @@ var RetrainAnnotationSchema = object({
24771
24999
  /** Which model proposed this box — or, on a `model_error`, drew the phantom. */
24772
25000
  assistModelId: string().optional(),
24773
25001
  assistScore: number().optional(),
25002
+ /** The proposal this box started from, snapshotted at accept time. `null` on
25003
+ * a row saved before origins existed; absent on a draft nobody snapshotted. */
25004
+ origin: RetrainOriginSchema.nullable().optional(),
24774
25005
  exportedInBatch: string().optional(),
24775
25006
  createdAt: number()
24776
25007
  });
@@ -24863,7 +25094,19 @@ var RetrainFrameSchema = object({
24863
25094
  * empty when nothing the track store holds can be placed on it. */
24864
25095
  pipelineBoxes: array(RetrainPipelineBoxSchema).readonly().optional(),
24865
25096
  /** The named collections this frame belongs to. Present on list answers. */
24866
- collectionIds: array(string()).readonly().optional()
25097
+ collectionIds: array(string()).readonly().optional(),
25098
+ /** Bumped by every annotation save. A save that names a stale
25099
+ * `expectedRevision` is refused, so two surfaces cannot overwrite each other. */
25100
+ revision: number().int().optional(),
25101
+ /** Proposals the operator deleted — never re-seeded as drafts. */
25102
+ dismissed: array(RetrainDismissedSchema).readonly().optional(),
25103
+ /** What the operator did with the proposals, computed by the server. */
25104
+ review: RetrainFrameReviewSchema.optional(),
25105
+ /** The frame's pixels over the admin data plane (full size). Fetch with the
25106
+ * admin bearer token; relative to the hub root. */
25107
+ imageUrl: string().optional(),
25108
+ /** The same, as a ~480 px thumbnail for grids. */
25109
+ thumbnailUrl: string().optional()
24867
25110
  });
24868
25111
  /** Why a copy-on-select could not be honoured — named, never a silent skip. */
24869
25112
  var RetrainCopyRefusalSchema = _enum([
@@ -25942,10 +26185,33 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
25942
26185
  /** The frame's track, when it has one — checked against the frame. */
25943
26186
  trackId: string().optional(),
25944
26187
  frameId: string(),
25945
- annotations: array(RetrainAnnotationDraftSchema)
26188
+ annotations: array(RetrainAnnotationDraftSchema),
26189
+ /** The frame's `revision` the caller saw. A different current revision
26190
+ * refuses the save with a `retrain-revision-conflict` error
26191
+ * (`parseRetrainRevisionConflict`). Absent ⇒ last write wins. */
26192
+ expectedRevision: number().int().optional(),
26193
+ /** The proposals the operator deleted. Absent ⇒ keep the frame's
26194
+ * current set; present ⇒ replace it (an empty array un-dismisses). */
26195
+ dismissed: array(RetrainDismissedSchema).optional()
25946
26196
  }), array(RetrainAnnotationSchema).readonly(), {
25947
26197
  kind: "mutation",
25948
26198
  auth: "admin"
26199
+ }), method(object({
26200
+ deviceId: number(),
26201
+ trackId: string().optional(),
26202
+ frameId: string(),
26203
+ expectedRevision: number().int().optional(),
26204
+ origins: array(object({
26205
+ annotationId: string(),
26206
+ origin: RetrainOriginSchema
26207
+ })).min(1).max(500)
26208
+ }), object({
26209
+ updated: number().int(),
26210
+ skipped: number().int(),
26211
+ revision: number().int()
26212
+ }), {
26213
+ kind: "mutation",
26214
+ auth: "admin"
25949
26215
  }), method(object({
25950
26216
  deviceId: number(),
25951
26217
  trackId: string()
@@ -28601,6 +28867,12 @@ var CameraStepOverridePatchSchema = object({
28601
28867
  settings: record(string(), unknown()).readonly().optional()
28602
28868
  });
28603
28869
  var CameraStepSettingsSchema = record(string(), record(string(), unknown()).readonly());
28870
+ /** The three root-detector choices a camera has (D507: at most one root). */
28871
+ var CameraDetectionSourceSchema = _enum([
28872
+ "pipeline",
28873
+ "onboard",
28874
+ "none"
28875
+ ]);
28604
28876
  var CameraPipelineSettingsSchema = object({
28605
28877
  stepToggles: record(string(), boolean()).optional(),
28606
28878
  stepSettings: CameraStepSettingsSchema.optional(),
@@ -29178,6 +29450,26 @@ method(object({
29178
29450
  }), object({ success: literal(true) }), {
29179
29451
  kind: "mutation",
29180
29452
  auth: "admin"
29453
+ }), method(object({ deviceId: number() }), object({
29454
+ source: CameraDetectionSourceSchema,
29455
+ explicit: boolean(),
29456
+ onboard: object({
29457
+ /** The camera has an onboard detector this system can read. */
29458
+ available: boolean(),
29459
+ /** What its detections carry — a camera with no box cannot be a root step. */
29460
+ geometry: _enum([
29461
+ "boxed",
29462
+ "while-streaming",
29463
+ "flag-only",
29464
+ "unknown"
29465
+ ])
29466
+ })
29467
+ })), method(object({
29468
+ deviceId: number(),
29469
+ source: CameraDetectionSourceSchema
29470
+ }), object({ success: literal(true) }), {
29471
+ kind: "mutation",
29472
+ auth: "admin"
29181
29473
  }), method(object({ deviceId: number() }), record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).nullable()), method(object({
29182
29474
  deviceId: number(),
29183
29475
  agentNodeId: string(),
@@ -32742,6 +33034,17 @@ var BatteryStatusSchema = object({
32742
33034
  */
32743
33035
  lastContactAt: number().optional(),
32744
33036
  /**
33037
+ * Ms epoch of the last COMPLETE scheduled refresh — every fact the provider
33038
+ * holds for the device (level, charging, link, device info, state slices) and
33039
+ * its cached snapshot, read together. Absent = never since this slice was
33040
+ * born. Unlike `lastUpdated` (any write, even a push of one field) this is
33041
+ * the staleness an operator can trust: the provider owns the device fact and
33042
+ * so owns the window on its age (D224, D847). Not a clock in the
33043
+ * runtime-state-durability sense: it moves once per window and must survive
33044
+ * a restart, or every restart would owe the camera a wake.
33045
+ */
33046
+ lastFullRefreshAt: number().optional(),
33047
+ /**
32745
33048
  * True when the source is a BINARY low-battery indicator (HA
32746
33049
  * `binary_sensor` device_class=battery / `LOW_BAT`) that has no real
32747
33050
  * charge level — `percentage` is then a coarse stand-in (100 = normal,
@@ -32980,6 +33283,18 @@ var CalendarInfoSchema = object({
32980
33283
  source: CalendarSourceKindSchema,
32981
33284
  enabled: boolean()
32982
33285
  });
33286
+ /**
33287
+ * Time contract of {@link CalendarEvent}.
33288
+ *
33289
+ * - Timed event: `startMs` / `endMs` are real instants; `endMs` is exclusive.
33290
+ * - All-day event (`allDay: true`): the event is a run of calendar DATES, not
33291
+ * instants. `startMs` is UTC midnight of the first date and `endMs` is UTC
33292
+ * midnight of the day AFTER the last date (RFC 5545 exclusive DTEND), so a
33293
+ * one-day event spans exactly 24 h. Every provider produces that and no
33294
+ * consumer may read the instants in a local timezone: use
33295
+ * {@link calendarEventLocalSpan}. Reading UTC midnight as local time put an
33296
+ * all-day event on the following day for any viewer ahead of UTC.
33297
+ */
32983
33298
  var CalendarEventSchema = object({
32984
33299
  id: string().min(1),
32985
33300
  calendarId: string().min(1),
@@ -35978,7 +36293,15 @@ var HubAddressBookSchema = object({
35978
36293
  publicEndpoint: HubAddressRoleResolutionSchema
35979
36294
  }),
35980
36295
  /** The `hub=` an app link carries (D709), or null. */
35981
- appLinkHub: string().nullable()
36296
+ appLinkHub: string().nullable(),
36297
+ /**
36298
+ * Every origin a browser can really reach this hub at, in the scheme each
36299
+ * listener serves: `https://<lan>:<httpsPort>`, and `http://<lan>:<httpPort>`
36300
+ * while LAN HTTP is on, plus the public and custom addresses. Distinct from
36301
+ * `rows`, which show `http://` only while LAN HTTP is on. Never loopback,
36302
+ * never the app link. Absent on a hub older than D794's amendment.
36303
+ */
36304
+ listenerOrigins: array(string()).readonly().optional()
35982
36305
  });
35983
36306
  var AllowedAddressesSchema = object({
35984
36307
  /**
@@ -37367,7 +37690,14 @@ var TopologyNodeSchema = object({
37367
37690
  * completed a mutual-TLS handshake, `clear` otherwise. Absent for the hub,
37368
37691
  * for offline rows and when the hub cannot tell.
37369
37692
  */
37370
- meshTransport: _enum(["tls", "clear"]).optional()
37693
+ meshTransport: _enum(["tls", "clear"]).optional(),
37694
+ /**
37695
+ * Whether the hub holds this online AGENT's capability registration (its
37696
+ * `registerNode` manifest). `false` = online in the mesh but not ready: the
37697
+ * hub dropped the registration on a disconnect only it saw and the agent has
37698
+ * not re-sent it. Absent for the hub and offline rows.
37699
+ */
37700
+ capabilitiesRegistered: boolean().optional()
37371
37701
  });
37372
37702
  var CapUsageEdgeSchema = object({
37373
37703
  callerAddonId: string(),
@@ -45839,6 +46169,12 @@ Object.freeze({
45839
46169
  addonId: null,
45840
46170
  access: "view"
45841
46171
  },
46172
+ "backup.listAvailableDatabases": {
46173
+ capName: "backup",
46174
+ capScope: "system",
46175
+ addonId: null,
46176
+ access: "view"
46177
+ },
45842
46178
  "backup.listDestinations": {
45843
46179
  capName: "backup",
45844
46180
  capScope: "system",
@@ -46535,6 +46871,12 @@ Object.freeze({
46535
46871
  addonId: null,
46536
46872
  access: "create"
46537
46873
  },
46874
+ "dataStoreProvider.transact": {
46875
+ capName: "data-store-provider",
46876
+ capScope: "system",
46877
+ addonId: null,
46878
+ access: "create"
46879
+ },
46538
46880
  "dataStoreProvider.update": {
46539
46881
  capName: "data-store-provider",
46540
46882
  capScope: "system",
@@ -46553,6 +46895,12 @@ Object.freeze({
46553
46895
  addonId: null,
46554
46896
  access: "create"
46555
46897
  },
46898
+ "dataStoreProvider.upsertMany": {
46899
+ capName: "data-store-provider",
46900
+ capScope: "system",
46901
+ addonId: null,
46902
+ access: "create"
46903
+ },
46556
46904
  "dayNight.getOptions": {
46557
46905
  capName: "day-night",
46558
46906
  capScope: "device",
@@ -49379,6 +49727,12 @@ Object.freeze({
49379
49727
  addonId: null,
49380
49728
  access: "create"
49381
49729
  },
49730
+ "pipelineAnalytics.backfillRetrainOrigins": {
49731
+ capName: "pipeline-analytics",
49732
+ capScope: "device",
49733
+ addonId: null,
49734
+ access: "create"
49735
+ },
49382
49736
  "pipelineAnalytics.cancelRelocateMedia": {
49383
49737
  capName: "pipeline-analytics",
49384
49738
  capScope: "device",
@@ -50159,6 +50513,12 @@ Object.freeze({
50159
50513
  addonId: null,
50160
50514
  access: "view"
50161
50515
  },
50516
+ "pipelineOrchestrator.getCameraDetectionSource": {
50517
+ capName: "pipeline-orchestrator",
50518
+ capScope: "system",
50519
+ addonId: null,
50520
+ access: "view"
50521
+ },
50162
50522
  "pipelineOrchestrator.getCameraMetrics": {
50163
50523
  capName: "pipeline-orchestrator",
50164
50524
  capScope: "system",
@@ -50387,6 +50747,12 @@ Object.freeze({
50387
50747
  addonId: null,
50388
50748
  access: "create"
50389
50749
  },
50750
+ "pipelineOrchestrator.setCameraDetectionSource": {
50751
+ capName: "pipeline-orchestrator",
50752
+ capScope: "system",
50753
+ addonId: null,
50754
+ access: "create"
50755
+ },
50390
50756
  "pipelineOrchestrator.setCameraPipelineForAgent": {
50391
50757
  capName: "pipeline-orchestrator",
50392
50758
  capScope: "system",
@@ -51359,6 +51725,12 @@ Object.freeze({
51359
51725
  addonId: null,
51360
51726
  access: "create"
51361
51727
  },
51728
+ "settingsStore.transact": {
51729
+ capName: "settings-store",
51730
+ capScope: "system",
51731
+ addonId: null,
51732
+ access: "create"
51733
+ },
51362
51734
  "settingsStore.update": {
51363
51735
  capName: "settings-store",
51364
51736
  capScope: "system",
@@ -51377,6 +51749,12 @@ Object.freeze({
51377
51749
  addonId: null,
51378
51750
  access: "create"
51379
51751
  },
51752
+ "settingsStore.upsertMany": {
51753
+ capName: "settings-store",
51754
+ capScope: "system",
51755
+ addonId: null,
51756
+ access: "create"
51757
+ },
51380
51758
  "smoke.getStatus": {
51381
51759
  capName: "smoke",
51382
51760
  capScope: "device",
@@ -51839,6 +52217,12 @@ Object.freeze({
51839
52217
  addonId: null,
51840
52218
  access: "view"
51841
52219
  },
52220
+ "streamBroker.getLiveViewerCounts": {
52221
+ capName: "stream-broker",
52222
+ capScope: "system",
52223
+ addonId: null,
52224
+ access: "view"
52225
+ },
51842
52226
  "streamBroker.getPreBufferInfo": {
51843
52227
  capName: "stream-broker",
51844
52228
  capScope: "system",
@@ -55679,6 +56063,11 @@ Object.freeze({
55679
56063
  form: "single",
55680
56064
  optional: false
55681
56065
  }],
56066
+ "pipelineAnalytics.backfillRetrainOrigins": [{
56067
+ name: "deviceId",
56068
+ form: "single",
56069
+ optional: false
56070
+ }],
55682
56071
  "pipelineAnalytics.clearTrackRelation": [{
55683
56072
  name: "deviceId",
55684
56073
  form: "single",
@@ -55984,6 +56373,11 @@ Object.freeze({
55984
56373
  form: "single",
55985
56374
  optional: false
55986
56375
  }],
56376
+ "pipelineOrchestrator.getCameraDetectionSource": [{
56377
+ name: "deviceId",
56378
+ form: "single",
56379
+ optional: false
56380
+ }],
55987
56381
  "pipelineOrchestrator.getCameraMetrics": [{
55988
56382
  name: "deviceId",
55989
56383
  form: "single",
@@ -56044,6 +56438,11 @@ Object.freeze({
56044
56438
  form: "single",
56045
56439
  optional: false
56046
56440
  }],
56441
+ "pipelineOrchestrator.setCameraDetectionSource": [{
56442
+ name: "deviceId",
56443
+ form: "single",
56444
+ optional: false
56445
+ }],
56047
56446
  "pipelineOrchestrator.setCameraPipelineForAgent": [{
56048
56447
  name: "deviceId",
56049
56448
  form: "single",
@@ -57280,6 +57679,9 @@ new Map(Object.entries({
57280
57679
  "stream-online": "device-events",
57281
57680
  "stream-offline": "device-events",
57282
57681
  "detection-blind": "device-events",
57682
+ "recording-stalled": "device-events",
57683
+ "recording-healthy": "device-events",
57684
+ "recording-degraded": "device-events",
57283
57685
  "node-online": "system",
57284
57686
  "node-offline": "system",
57285
57687
  "node-restarting": "system",
@@ -57293,6 +57695,9 @@ new Map(Object.entries({
57293
57695
  "wrapper-update-available": "system",
57294
57696
  "backup-completed": "system",
57295
57697
  "export-completed": "system",
57698
+ "storage-location-low": "system",
57699
+ "storage-location-critical": "system",
57700
+ "storage-location-ok": "system",
57296
57701
  "alarm-triggered": "alarm",
57297
57702
  "alarm-armed": "alarm",
57298
57703
  "alarm-disarmed": "alarm",
@@ -57354,6 +57759,16 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
57354
57759
  label: "Detecting nothing",
57355
57760
  kinds: ["detection-blind"]
57356
57761
  },
57762
+ {
57763
+ id: "recording",
57764
+ family: "device-events",
57765
+ label: "Recording",
57766
+ kinds: [
57767
+ "recording-stalled",
57768
+ "recording-healthy",
57769
+ "recording-degraded"
57770
+ ]
57771
+ },
57357
57772
  {
57358
57773
  id: "nodes",
57359
57774
  family: "system",
@@ -57394,6 +57809,16 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
57394
57809
  label: "Backups & exports",
57395
57810
  kinds: ["backup-completed", "export-completed"]
57396
57811
  },
57812
+ {
57813
+ id: "storage",
57814
+ family: "system",
57815
+ label: "Storage locations",
57816
+ kinds: [
57817
+ "storage-location-low",
57818
+ "storage-location-critical",
57819
+ "storage-location-ok"
57820
+ ]
57821
+ },
57397
57822
  {
57398
57823
  id: "alarm",
57399
57824
  family: "alarm",
@@ -57476,6 +57901,9 @@ var DEVICE_EVENTS = [
57476
57901
  "stream-online",
57477
57902
  "stream-offline",
57478
57903
  "detection-blind",
57904
+ "recording-stalled",
57905
+ "recording-healthy",
57906
+ "recording-degraded",
57479
57907
  ...ALARM
57480
57908
  ];
57481
57909
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -57643,6 +58071,11 @@ var STATE_SUMMARY_VARS = [
57643
58071
  [...RULE_TEXT],
57644
58072
  [...RULE_TEXT],
57645
58073
  [...RULE_TEXT],
58074
+ [...RULE_TEXT],
58075
+ [...RULE_TEXT],
58076
+ [...RULE_TEXT],
58077
+ [...RULE_TEXT],
58078
+ [...RULE_TEXT],
57646
58079
  ([...RULE_TEXT], [...UPDATES]),
57647
58080
  ([...RULE_TEXT], [...PACKAGE_UPDATES]),
57648
58081
  ([...RULE_TEXT], [...PACKAGE_UPDATES]),