@camstack/addon-auth 1.2.141 → 1.2.142

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).
@@ -7977,6 +7987,21 @@ var ProfileRtspEntrySchema = object({
7977
7987
  codec: string().optional(),
7978
7988
  resolution: CamStreamResolutionSchema.optional()
7979
7989
  });
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
+ ];
7980
8005
  object({
7981
8006
  field: string().min(1),
7982
8007
  on: literal("advance")
@@ -8460,7 +8485,7 @@ function errMsg(err) {
8460
8485
  return String(err);
8461
8486
  }
8462
8487
  //#endregion
8463
- //#region ../types/dist/composition-Bzr7GwgP.mjs
8488
+ //#region ../types/dist/composition-C-WpVYTX.mjs
8464
8489
  /**
8465
8490
  * The ffmpeg build every CamStack node downloads, per platform and arch.
8466
8491
  *
@@ -8512,7 +8537,7 @@ var BASE = `https://github.com/jellyfin/jellyfin-ffmpeg/releases/download/v${FFM
8512
8537
  function portable(target) {
8513
8538
  return `${BASE}/jellyfin-ffmpeg_${FFMPEG_RELEASE}_portable_${target}-gpl.tar.xz`;
8514
8539
  }
8515
- portable("linux64"), portable("linuxarm64"), portable("macarm64"), portable("mac64");
8540
+ portable("linux64"), portable("linuxarm64"), portable("macarm64"), portable("mac64"), `${BASE}${FFMPEG_RELEASE}`;
8516
8541
  /**
8517
8542
  * THE table "which boolean of this device type counts as HIGH", and the
8518
8543
  * pure evaluator of its EDGE.
@@ -10204,6 +10229,15 @@ discriminatedUnion("type", [
10204
10229
  message: string()
10205
10230
  })
10206
10231
  ]);
10232
+ /** Every status, in the order a summary lists them. */
10233
+ var RETRAIN_REVIEW_STATUSES = [
10234
+ "unchanged",
10235
+ "adjusted",
10236
+ "reclassified",
10237
+ "added",
10238
+ "removed",
10239
+ "model-error"
10240
+ ];
10207
10241
  /**
10208
10242
  * What the gate decided about a birth, from the CALLER's point of view.
10209
10243
  *
@@ -11821,14 +11855,6 @@ var MASK_SUPPLY_STEP_IDS = ["segmentation"];
11821
11855
  ...CROP_SUPPLY_STEP_IDS,
11822
11856
  ...MASK_SUPPLY_STEP_IDS
11823
11857
  ];
11824
- var MODEL_FORMATS = [
11825
- "onnx",
11826
- "coreml",
11827
- "openvino",
11828
- "tflite",
11829
- "pt",
11830
- "gguf"
11831
- ];
11832
11858
  /**
11833
11859
  * Multi-file format payload.
11834
11860
  *
@@ -13171,6 +13197,329 @@ var authProviderCapability = {
13171
13197
  mount: { kind: "skip" }
13172
13198
  };
13173
13199
  /**
13200
+ * Query filter for settings-store collections.
13201
+ */
13202
+ var QueryFilterSchema = object({
13203
+ where: record(string(), unknown()).optional(),
13204
+ whereIn: record(string(), array(unknown())).optional(),
13205
+ whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
13206
+ /** NULL-safe exclusion: matches rows whose field is NULL OR != the value. */
13207
+ whereNot: record(string(), unknown()).optional(),
13208
+ /** NULL-safe exclusion of a SET — `whereNot` for more than one value. An
13209
+ * empty list excludes nothing. See `QueryFilter.whereNotIn`. */
13210
+ whereNotIn: record(string(), array(unknown())).optional(),
13211
+ orderBy: object({
13212
+ field: string(),
13213
+ direction: _enum(["asc", "desc"])
13214
+ }).optional(),
13215
+ limit: number().optional(),
13216
+ offset: number().optional()
13217
+ });
13218
+ /**
13219
+ * The predicate half of a filter, for BULK MUTATIONS.
13220
+ *
13221
+ * Deliberately not `QueryFilterSchema`: `orderBy` / `limit` / `offset` have no
13222
+ * meaning for a statement that rewrites a set, and accepting them would invite
13223
+ * a caller to believe `limit` bounds the damage. Every field is optional here
13224
+ * only so the shape stays composable — the implementation REJECTS a filter
13225
+ * that compiles to no predicate, because that is the whole collection.
13226
+ */
13227
+ var MutationFilterSchema = object({
13228
+ where: record(string(), unknown()).optional(),
13229
+ whereIn: record(string(), array(unknown())).optional(),
13230
+ whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
13231
+ whereNot: record(string(), unknown()).optional(),
13232
+ whereNotIn: record(string(), array(unknown())).optional()
13233
+ });
13234
+ /**
13235
+ * One scalar an {@link settingsStoreCapability.methods.aggregate} call asks for.
13236
+ *
13237
+ * `as` names the slot in the result, so the SAME column may be asked twice with
13238
+ * two operations (`MIN(startMs)` and `MAX(startMs)` in one round trip) — which
13239
+ * a `Record<column, op>` shape could not express.
13240
+ */
13241
+ var AggregateFieldSchema = object({
13242
+ /** Result key. */
13243
+ as: string().min(1),
13244
+ /** Column to aggregate. Must be a real column of a declared collection. */
13245
+ field: string().min(1),
13246
+ op: _enum([
13247
+ "sum",
13248
+ "min",
13249
+ "max"
13250
+ ])
13251
+ });
13252
+ /**
13253
+ * `COUNT(*)` plus one number per requested field.
13254
+ *
13255
+ * `null` means NO ROW MATCHED, never zero: a `SUM` over an empty set and a sum
13256
+ * that really is 0 are different facts, and an accounting caller that renders
13257
+ * "0 bytes, oldest = 0" for "nothing here" reports a lie about a disk.
13258
+ */
13259
+ var AggregateResultSchema = object({
13260
+ count: number().int(),
13261
+ values: record(string(), number().nullable())
13262
+ });
13263
+ /** A single stored record: `{ id, data }`. */
13264
+ var SettingsRecordSchema = object({
13265
+ id: string(),
13266
+ data: record(string(), unknown())
13267
+ });
13268
+ /**
13269
+ * One record of a BULK insert — {@link SettingsRecordSchema} with the id made
13270
+ * optional.
13271
+ *
13272
+ * A separate schema rather than loosening the shared one: every other method
13273
+ * on this cap addresses a row BY its id, and making that field optional
13274
+ * everywhere would turn a forgotten key into a silently generated one on
13275
+ * `update` and `delete` as well.
13276
+ */
13277
+ var BulkRecordSchema = object({
13278
+ id: string().optional(),
13279
+ data: record(string(), unknown())
13280
+ });
13281
+ /**
13282
+ * The database FILES one `sqlite-settings` engine process owns (D851).
13283
+ * Closed on purpose: a file is a thing the engine opens, backs up and gives a
13284
+ * serving thread, so a new one is a code change, never a string a caller
13285
+ * invents. `settings` is `camstack.db` and the default for every collection
13286
+ * that names no file.
13287
+ */
13288
+ var DataStoreDatabaseSchema = _enum([
13289
+ "settings",
13290
+ "events",
13291
+ "history"
13292
+ ]);
13293
+ DataStoreDatabaseSchema.options;
13294
+ /**
13295
+ * One write inside a {@link settingsStoreCapability.methods.transact} call.
13296
+ * The three that a "replace this set, bump that revision" write needs, plus
13297
+ * the batched upsert a rollup writer needs.
13298
+ */
13299
+ var TransactOpSchema = discriminatedUnion("op", [
13300
+ object({
13301
+ op: literal("deleteWhere"),
13302
+ collection: string(),
13303
+ filter: MutationFilterSchema
13304
+ }),
13305
+ object({
13306
+ op: literal("insertMany"),
13307
+ collection: string(),
13308
+ records: array(BulkRecordSchema).readonly()
13309
+ }),
13310
+ object({
13311
+ op: literal("update"),
13312
+ collection: string(),
13313
+ id: string(),
13314
+ data: record(string(), unknown())
13315
+ }),
13316
+ object({
13317
+ op: literal("upsertMany"),
13318
+ collection: string(),
13319
+ conflict: array(string()).readonly(),
13320
+ records: array(BulkRecordSchema).readonly()
13321
+ })
13322
+ ]);
13323
+ /**
13324
+ * The precondition of a transaction: the row `key` of `collection` must hold
13325
+ * `equals` in `column`, read INSIDE the transaction.
13326
+ */
13327
+ var TransactGuardSchema = object({
13328
+ collection: string(),
13329
+ key: string(),
13330
+ column: string(),
13331
+ equals: unknown()
13332
+ });
13333
+ /**
13334
+ * Column declaration for a structured (SQL-backed) collection.
13335
+ *
13336
+ * Logical types — the backend translates each to the matching SQLite
13337
+ * storage class and handles per-type marshaling:
13338
+ * - `TEXT` / `INTEGER` / `REAL` — native SQLite types, pass-through
13339
+ * - `JSON` — TEXT under the hood; serialised on write, parsed on read
13340
+ * - `BOOLEAN` — INTEGER 0/1 under the hood; coerced both directions
13341
+ */
13342
+ var CollectionColumnSchema = object({
13343
+ name: string(),
13344
+ type: _enum([
13345
+ "TEXT",
13346
+ "INTEGER",
13347
+ "REAL",
13348
+ "JSON",
13349
+ "BOOLEAN"
13350
+ ]),
13351
+ primaryKey: boolean().optional(),
13352
+ notNull: boolean().optional(),
13353
+ unique: boolean().optional(),
13354
+ /**
13355
+ * Column DEFAULT. Required for B2: the four `ensureTable` consumers declare
13356
+ * columns like `enabled INTEGER NOT NULL DEFAULT 1`, and without this the
13357
+ * collection surface simply cannot express their existing tables — which is
13358
+ * why they were still on the uncapped `table*` API.
13359
+ */
13360
+ defaultValue: union([
13361
+ string(),
13362
+ number(),
13363
+ boolean()
13364
+ ]).optional()
13365
+ });
13366
+ var CollectionIndexSchema = object({
13367
+ name: string(),
13368
+ columns: array(string()).readonly(),
13369
+ unique: boolean().optional()
13370
+ });
13371
+ /**
13372
+ * The input of `declareCollection` — ONE schema for the door and for the
13373
+ * engine behind it, so the two surfaces cannot drift (the dispatcher forwards
13374
+ * the payload untouched).
13375
+ *
13376
+ * - `database` — the file the collection lives in (D851). Absent means
13377
+ * `settings`. A declaration naming a file other than the one the table is
13378
+ * already in is REFUSED by the engine, never moved.
13379
+ * - `primaryKey` — a COMPOSITE key, as column names. A single name is the same
13380
+ * as `primaryKey: true` on that column. A composite-keyed collection has no
13381
+ * `id`: it is written with `insertMany` / `upsertMany` / `transact` and read
13382
+ * with `query` / `count` / `aggregate` / `deleteWhere`; the calls that
13383
+ * address one row by id are refused.
13384
+ * - `withoutRowid` — emit `WITHOUT ROWID`. Requires a primary key.
13385
+ */
13386
+ var DeclareCollectionInputSchema = object({
13387
+ namespace: string().optional(),
13388
+ collection: string(),
13389
+ columns: array(CollectionColumnSchema).readonly(),
13390
+ indexes: array(CollectionIndexSchema).readonly().optional(),
13391
+ database: DataStoreDatabaseSchema.optional(),
13392
+ primaryKey: array(string()).readonly().optional(),
13393
+ withoutRowid: boolean().optional()
13394
+ });
13395
+ method(object({
13396
+ namespace: string().optional(),
13397
+ collection: string(),
13398
+ key: string()
13399
+ }), unknown(), { auth: "admin" }), method(object({
13400
+ namespace: string().optional(),
13401
+ collection: string(),
13402
+ key: string(),
13403
+ value: unknown()
13404
+ }), _void(), {
13405
+ kind: "mutation",
13406
+ auth: "admin"
13407
+ }), method(object({
13408
+ namespace: string().optional(),
13409
+ collection: string(),
13410
+ filter: QueryFilterSchema.optional(),
13411
+ columns: array(string()).readonly().optional()
13412
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
13413
+ namespace: string().optional(),
13414
+ collection: string(),
13415
+ /** Declared columns identifying the slot; must be covered by a UNIQUE
13416
+ * index on the collection. Never empty. */
13417
+ conflict: array(string()).readonly(),
13418
+ record: BulkRecordSchema
13419
+ }), object({
13420
+ /** The id the row HAS: assigned by SQLite on an insert, or the existing
13421
+ * row's own id on an update. */
13422
+ id: union([string(), number()]) }), {
13423
+ kind: "mutation",
13424
+ auth: "admin"
13425
+ }), method(object({
13426
+ namespace: string().optional(),
13427
+ collection: string(),
13428
+ conflict: array(string()).readonly(),
13429
+ records: array(BulkRecordSchema).readonly()
13430
+ }), object({ upserted: number().int() }), {
13431
+ kind: "mutation",
13432
+ auth: "admin"
13433
+ }), method(object({
13434
+ namespace: string().optional(),
13435
+ collection: string(),
13436
+ record: object({
13437
+ id: string().optional(),
13438
+ data: record(string(), unknown())
13439
+ })
13440
+ }), object({
13441
+ /**
13442
+ * The id the row ACTUALLY got (D473): the one supplied, the UUID minted
13443
+ * for an absent one, or the ROWID SQLite assigned on an `INTEGER`
13444
+ * primary key — which is the only place an auto key is knowable.
13445
+ */
13446
+ id: union([string(), number()]) }), {
13447
+ kind: "mutation",
13448
+ auth: "admin"
13449
+ }), method(object({
13450
+ namespace: string().optional(),
13451
+ collection: string(),
13452
+ records: array(BulkRecordSchema).readonly()
13453
+ }), object({ inserted: number().int() }), {
13454
+ kind: "mutation",
13455
+ auth: "admin"
13456
+ }), method(object({
13457
+ namespace: string().optional(),
13458
+ guard: TransactGuardSchema.optional(),
13459
+ ops: array(TransactOpSchema).readonly()
13460
+ }), object({
13461
+ applied: boolean(),
13462
+ current: unknown().optional()
13463
+ }), {
13464
+ kind: "mutation",
13465
+ auth: "admin"
13466
+ }), method(object({
13467
+ namespace: string().optional(),
13468
+ collection: string(),
13469
+ id: string(),
13470
+ data: record(string(), unknown())
13471
+ }), _void(), {
13472
+ kind: "mutation",
13473
+ auth: "admin"
13474
+ }), method(object({
13475
+ namespace: string().optional(),
13476
+ collection: string(),
13477
+ key: string()
13478
+ }), _void(), {
13479
+ kind: "mutation",
13480
+ auth: "admin"
13481
+ }), method(object({
13482
+ namespace: string().optional(),
13483
+ collection: string(),
13484
+ filter: MutationFilterSchema
13485
+ }), object({ deleted: number().int() }), {
13486
+ kind: "mutation",
13487
+ auth: "admin"
13488
+ }), method(object({
13489
+ namespace: string().optional(),
13490
+ collection: string(),
13491
+ filter: MutationFilterSchema,
13492
+ data: record(string(), unknown())
13493
+ }), object({ updated: number().int() }), {
13494
+ kind: "mutation",
13495
+ auth: "admin"
13496
+ }), method(object({
13497
+ namespace: string().optional(),
13498
+ collection: string(),
13499
+ filter: QueryFilterSchema.optional()
13500
+ }), number(), { auth: "admin" }), method(object({
13501
+ namespace: string().optional(),
13502
+ collection: string(),
13503
+ fields: array(AggregateFieldSchema).readonly(),
13504
+ filter: QueryFilterSchema.optional()
13505
+ }), AggregateResultSchema, { auth: "admin" }), method(object({
13506
+ namespace: string().optional(),
13507
+ collection: string(),
13508
+ field: string(),
13509
+ bucketSize: number().int().positive(),
13510
+ origin: number().int(),
13511
+ filter: QueryFilterSchema.optional()
13512
+ }), array(object({
13513
+ bucket: number().int(),
13514
+ count: number().int()
13515
+ })).readonly(), { auth: "admin" }), method(object({
13516
+ namespace: string().optional(),
13517
+ collection: string()
13518
+ }), boolean(), { auth: "admin" }), method(DeclareCollectionInputSchema, _void(), {
13519
+ kind: "mutation",
13520
+ auth: "admin"
13521
+ });
13522
+ /**
13174
13523
  * How long one snapshot may take end to end: the pinned copy of the whole
13175
13524
  * database plus `PRAGMA integrity_check` over the copy, on the hub's slowest
13176
13525
  * disk. ~800 MB at a pessimistic 10 MB/s is under 3 minutes; the bound is
@@ -13183,7 +13532,11 @@ var DATABASE_SNAPSHOT_TIMEOUT_MS = 30 * 6e4;
13183
13532
  * database has no sidecars and is just as owned). Paths are absolute on the
13184
13533
  * owner's host.
13185
13534
  */
13186
- var DatabaseSnapshotTargetsSchema = object({ databases: array(object({ livePath: string() })) });
13535
+ var DatabaseSnapshotTargetsSchema = object({ databases: array(object({
13536
+ /** Which owned file this is — the handle `writeSnapshot` takes. */
13537
+ databaseId: DataStoreDatabaseSchema,
13538
+ livePath: string()
13539
+ })) });
13187
13540
  /** One b-tree table of the snapshot and the rows it holds. */
13188
13541
  var DatabaseSnapshotTableSchema = object({
13189
13542
  name: string(),
@@ -13216,6 +13569,10 @@ var DatabaseSnapshotResultSchema = object({
13216
13569
  /** When the pinned read transaction began (ms epoch) — the snapshot's instant. */
13217
13570
  takenAt: number()
13218
13571
  });
13572
+ /** A snapshot the owner wrote, with the file it belongs to. */
13573
+ var DatabaseSnapshotWrittenSchema = DatabaseSnapshotResultSchema.extend({ databaseId: DataStoreDatabaseSchema });
13574
+ /** Which database `writeSnapshot` copies. Required: an unstated ask is not guessed. */
13575
+ var DatabaseSnapshotRequestSchema = object({ databaseId: DataStoreDatabaseSchema });
13219
13576
  /**
13220
13577
  * A snapshot as an ARCHIVE records it (`ArchiveManifest.sqliteSnapshots`):
13221
13578
  * the same facts, with both paths relative to the archive root (the node's
@@ -13225,9 +13582,11 @@ var ArchiveSqliteSnapshotSchema = DatabaseSnapshotResultSchema.extend({
13225
13582
  /** Archive-relative path of the live database the archive does NOT carry. */
13226
13583
  livePath: string(),
13227
13584
  /** Archive-relative path of the verified copy it carries in its place. */
13228
- snapshotPath: string()
13585
+ snapshotPath: string(),
13586
+ /** Absent on an archive made before several files were owned: that was `settings`. */
13587
+ databaseId: DataStoreDatabaseSchema.optional()
13229
13588
  });
13230
- method(object({}), DatabaseSnapshotTargetsSchema, { auth: "admin" }), method(object({}), DatabaseSnapshotResultSchema, {
13589
+ method(object({}), DatabaseSnapshotTargetsSchema, { auth: "admin" }), method(DatabaseSnapshotRequestSchema, DatabaseSnapshotWrittenSchema, {
13231
13590
  kind: "mutation",
13232
13591
  auth: "admin",
13233
13592
  timeoutMs: DATABASE_SNAPSHOT_TIMEOUT_MS
@@ -13348,7 +13707,12 @@ var BackupArchiveEntrySchema = object({
13348
13707
  /** Top-level locations included in the archive (db, addons, tls, …). */
13349
13708
  locations: array(string()).readonly(),
13350
13709
  /** Present when the archive is encrypted; restore then needs that key. */
13351
- encryption: BackupArchiveEncryptionSchema.optional()
13710
+ encryption: BackupArchiveEncryptionSchema.optional(),
13711
+ /**
13712
+ * The databases the run asked to carry (its retention class). Absent on an
13713
+ * archive made before several files were owned: that was `['settings']`.
13714
+ */
13715
+ databases: array(DataStoreDatabaseSchema).readonly().optional()
13352
13716
  });
13353
13717
  var BackupEntrySchema = object({
13354
13718
  id: string(),
@@ -13382,7 +13746,12 @@ var ArchiveManifestSchema = object({
13382
13746
  * Live SQLite databases this archive carries as their OWNER's verified
13383
13747
  * snapshot instead of as files (D693). Absent on archives made before.
13384
13748
  */
13385
- sqliteSnapshots: array(ArchiveSqliteSnapshotSchema).optional()
13749
+ sqliteSnapshots: array(ArchiveSqliteSnapshotSchema).optional(),
13750
+ /**
13751
+ * Owned database files the run did NOT carry (not selected): left out of the
13752
+ * tar and the entry list alike. Absent when every owned file was carried.
13753
+ */
13754
+ omittedDatabases: array(DataStoreDatabaseSchema).optional()
13386
13755
  });
13387
13756
  var LocationStatSchema = object({
13388
13757
  name: string(),
@@ -13504,6 +13873,12 @@ var BackupScheduleSchema = object({
13504
13873
  /** Optional subset of source locations to include; omitted = all. */
13505
13874
  dataSources: array(string()).readonly().optional(),
13506
13875
  /**
13876
+ * Which database files this schedule carries. Absent = `['settings']`
13877
+ * (an unstated ask is the minimum, D382). Events and history run weekly,
13878
+ * settings nightly (D852).
13879
+ */
13880
+ databases: array(DataStoreDatabaseSchema).readonly().optional(),
13881
+ /**
13507
13882
  * ms-epoch of the last tick that FIRED this schedule. Stamped before the
13508
13883
  * archive runs (it is the dedupe anchor), so it says "attempted", never
13509
13884
  * "succeeded" — a run refused by every destination stamps it too.
@@ -13527,7 +13902,9 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
13527
13902
  * retention). Omitted = each destination's own policy
13528
13903
  * retention (manual runs).
13529
13904
  */
13530
- retentionCount: number().int().min(1).max(1e3).optional()
13905
+ retentionCount: number().int().min(1).max(1e3).optional(),
13906
+ /** Database files to carry; omitted = `['settings']`. */
13907
+ databases: array(DataStoreDatabaseSchema).optional()
13531
13908
  }).optional(), BackupTriggerResultSchema, {
13532
13909
  kind: "mutation",
13533
13910
  auth: "admin"
@@ -13602,14 +13979,18 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
13602
13979
  ok: boolean(),
13603
13980
  error: string().optional(),
13604
13981
  nextRuns: array(number()).readonly()
13605
- })), method(_void(), array(BackupScheduleSchema).readonly(), { auth: "admin" }), method(object({
13982
+ })), method(_void(), array(BackupScheduleSchema).readonly(), { auth: "admin" }), method(_void(), object({
13983
+ answered: boolean(),
13984
+ databases: array(DataStoreDatabaseSchema).readonly()
13985
+ }), { auth: "admin" }), method(object({
13606
13986
  id: string().optional(),
13607
13987
  label: string(),
13608
13988
  cron: string(),
13609
13989
  enabled: boolean(),
13610
13990
  locationIds: array(string()).readonly(),
13611
13991
  retentionCount: number().int().min(1).max(1e3),
13612
- dataSources: array(string()).readonly().optional()
13992
+ dataSources: array(string()).readonly().optional(),
13993
+ databases: array(DataStoreDatabaseSchema).readonly().optional()
13613
13994
  }), BackupScheduleSchema, {
13614
13995
  kind: "mutation",
13615
13996
  auth: "admin"
@@ -14040,6 +14421,16 @@ var BrokerClientsSchema = object({
14040
14421
  /** Total encoded + raw-RTP callback subscriber count (sum of `encoded[].length`). */
14041
14422
  encodedSubscribers: number()
14042
14423
  });
14424
+ /**
14425
+ * How many people are watching one camera LIVE right now — see
14426
+ * `getLiveViewerCounts`. A camera with nobody watching is absent from the list
14427
+ * (so `viewers` is always at least 1): the listing carries the cameras that
14428
+ * have viewers, never a row of zeros.
14429
+ */
14430
+ var LiveViewerCountSchema = object({
14431
+ deviceId: number().int().nonnegative(),
14432
+ viewers: number().int().positive()
14433
+ });
14043
14434
  _enum([
14044
14435
  "reconnecting",
14045
14436
  "sleeping",
@@ -14400,7 +14791,7 @@ method(object({
14400
14791
  }), {
14401
14792
  kind: "mutation",
14402
14793
  auth: "admin"
14403
- }), method(object({ brokerId: string() }), BrokerClientsSchema), method(object({
14794
+ }), method(object({ brokerId: string() }), BrokerClientsSchema), method(_void(), array(LiveViewerCountSchema).readonly()), method(object({
14404
14795
  brokerId: string(),
14405
14796
  channel: _enum(["rtsp", "audio"]),
14406
14797
  handle: string()
@@ -15266,240 +15657,6 @@ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" }
15266
15657
  timeoutMs: 30 * 6e4
15267
15658
  });
15268
15659
  /**
15269
- * Query filter for settings-store collections.
15270
- */
15271
- var QueryFilterSchema = object({
15272
- where: record(string(), unknown()).optional(),
15273
- whereIn: record(string(), array(unknown())).optional(),
15274
- whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
15275
- /** NULL-safe exclusion: matches rows whose field is NULL OR != the value. */
15276
- whereNot: record(string(), unknown()).optional(),
15277
- /** NULL-safe exclusion of a SET — `whereNot` for more than one value. An
15278
- * empty list excludes nothing. See `QueryFilter.whereNotIn`. */
15279
- whereNotIn: record(string(), array(unknown())).optional(),
15280
- orderBy: object({
15281
- field: string(),
15282
- direction: _enum(["asc", "desc"])
15283
- }).optional(),
15284
- limit: number().optional(),
15285
- offset: number().optional()
15286
- });
15287
- /**
15288
- * The predicate half of a filter, for BULK MUTATIONS.
15289
- *
15290
- * Deliberately not `QueryFilterSchema`: `orderBy` / `limit` / `offset` have no
15291
- * meaning for a statement that rewrites a set, and accepting them would invite
15292
- * a caller to believe `limit` bounds the damage. Every field is optional here
15293
- * only so the shape stays composable — the implementation REJECTS a filter
15294
- * that compiles to no predicate, because that is the whole collection.
15295
- */
15296
- var MutationFilterSchema = object({
15297
- where: record(string(), unknown()).optional(),
15298
- whereIn: record(string(), array(unknown())).optional(),
15299
- whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
15300
- whereNot: record(string(), unknown()).optional(),
15301
- whereNotIn: record(string(), array(unknown())).optional()
15302
- });
15303
- /**
15304
- * One scalar an {@link settingsStoreCapability.methods.aggregate} call asks for.
15305
- *
15306
- * `as` names the slot in the result, so the SAME column may be asked twice with
15307
- * two operations (`MIN(startMs)` and `MAX(startMs)` in one round trip) — which
15308
- * a `Record<column, op>` shape could not express.
15309
- */
15310
- var AggregateFieldSchema = object({
15311
- /** Result key. */
15312
- as: string().min(1),
15313
- /** Column to aggregate. Must be a real column of a declared collection. */
15314
- field: string().min(1),
15315
- op: _enum([
15316
- "sum",
15317
- "min",
15318
- "max"
15319
- ])
15320
- });
15321
- /**
15322
- * `COUNT(*)` plus one number per requested field.
15323
- *
15324
- * `null` means NO ROW MATCHED, never zero: a `SUM` over an empty set and a sum
15325
- * that really is 0 are different facts, and an accounting caller that renders
15326
- * "0 bytes, oldest = 0" for "nothing here" reports a lie about a disk.
15327
- */
15328
- var AggregateResultSchema = object({
15329
- count: number().int(),
15330
- values: record(string(), number().nullable())
15331
- });
15332
- /** A single stored record: `{ id, data }`. */
15333
- var SettingsRecordSchema = object({
15334
- id: string(),
15335
- data: record(string(), unknown())
15336
- });
15337
- /**
15338
- * One record of a BULK insert — {@link SettingsRecordSchema} with the id made
15339
- * optional.
15340
- *
15341
- * A separate schema rather than loosening the shared one: every other method
15342
- * on this cap addresses a row BY its id, and making that field optional
15343
- * everywhere would turn a forgotten key into a silently generated one on
15344
- * `update` and `delete` as well.
15345
- */
15346
- var BulkRecordSchema = object({
15347
- id: string().optional(),
15348
- data: record(string(), unknown())
15349
- });
15350
- /**
15351
- * Column declaration for a structured (SQL-backed) collection.
15352
- *
15353
- * Logical types — the backend translates each to the matching SQLite
15354
- * storage class and handles per-type marshaling:
15355
- * - `TEXT` / `INTEGER` / `REAL` — native SQLite types, pass-through
15356
- * - `JSON` — TEXT under the hood; serialised on write, parsed on read
15357
- * - `BOOLEAN` — INTEGER 0/1 under the hood; coerced both directions
15358
- */
15359
- var CollectionColumnSchema = object({
15360
- name: string(),
15361
- type: _enum([
15362
- "TEXT",
15363
- "INTEGER",
15364
- "REAL",
15365
- "JSON",
15366
- "BOOLEAN"
15367
- ]),
15368
- primaryKey: boolean().optional(),
15369
- notNull: boolean().optional(),
15370
- unique: boolean().optional(),
15371
- /**
15372
- * Column DEFAULT. Required for B2: the four `ensureTable` consumers declare
15373
- * columns like `enabled INTEGER NOT NULL DEFAULT 1`, and without this the
15374
- * collection surface simply cannot express their existing tables — which is
15375
- * why they were still on the uncapped `table*` API.
15376
- */
15377
- defaultValue: union([
15378
- string(),
15379
- number(),
15380
- boolean()
15381
- ]).optional()
15382
- });
15383
- var CollectionIndexSchema = object({
15384
- name: string(),
15385
- columns: array(string()).readonly(),
15386
- unique: boolean().optional()
15387
- });
15388
- method(object({
15389
- namespace: string().optional(),
15390
- collection: string(),
15391
- key: string()
15392
- }), unknown(), { auth: "admin" }), method(object({
15393
- namespace: string().optional(),
15394
- collection: string(),
15395
- key: string(),
15396
- value: unknown()
15397
- }), _void(), {
15398
- kind: "mutation",
15399
- auth: "admin"
15400
- }), method(object({
15401
- namespace: string().optional(),
15402
- collection: string(),
15403
- filter: QueryFilterSchema.optional(),
15404
- columns: array(string()).readonly().optional()
15405
- }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
15406
- namespace: string().optional(),
15407
- collection: string(),
15408
- /** Declared columns identifying the slot; must be covered by a UNIQUE
15409
- * index on the collection. Never empty. */
15410
- conflict: array(string()).readonly(),
15411
- record: BulkRecordSchema
15412
- }), object({
15413
- /** The id the row HAS: assigned by SQLite on an insert, or the existing
15414
- * row's own id on an update. */
15415
- id: union([string(), number()]) }), {
15416
- kind: "mutation",
15417
- auth: "admin"
15418
- }), method(object({
15419
- namespace: string().optional(),
15420
- collection: string(),
15421
- record: object({
15422
- id: string().optional(),
15423
- data: record(string(), unknown())
15424
- })
15425
- }), object({
15426
- /**
15427
- * The id the row ACTUALLY got (D473): the one supplied, the UUID minted
15428
- * for an absent one, or the ROWID SQLite assigned on an `INTEGER`
15429
- * primary key — which is the only place an auto key is knowable.
15430
- */
15431
- id: union([string(), number()]) }), {
15432
- kind: "mutation",
15433
- auth: "admin"
15434
- }), method(object({
15435
- namespace: string().optional(),
15436
- collection: string(),
15437
- records: array(BulkRecordSchema).readonly()
15438
- }), object({ inserted: number().int() }), {
15439
- kind: "mutation",
15440
- auth: "admin"
15441
- }), method(object({
15442
- namespace: string().optional(),
15443
- collection: string(),
15444
- id: string(),
15445
- data: record(string(), unknown())
15446
- }), _void(), {
15447
- kind: "mutation",
15448
- auth: "admin"
15449
- }), method(object({
15450
- namespace: string().optional(),
15451
- collection: string(),
15452
- key: string()
15453
- }), _void(), {
15454
- kind: "mutation",
15455
- auth: "admin"
15456
- }), method(object({
15457
- namespace: string().optional(),
15458
- collection: string(),
15459
- filter: MutationFilterSchema
15460
- }), object({ deleted: number().int() }), {
15461
- kind: "mutation",
15462
- auth: "admin"
15463
- }), method(object({
15464
- namespace: string().optional(),
15465
- collection: string(),
15466
- filter: MutationFilterSchema,
15467
- data: record(string(), unknown())
15468
- }), object({ updated: number().int() }), {
15469
- kind: "mutation",
15470
- auth: "admin"
15471
- }), method(object({
15472
- namespace: string().optional(),
15473
- collection: string(),
15474
- filter: QueryFilterSchema.optional()
15475
- }), number(), { auth: "admin" }), method(object({
15476
- namespace: string().optional(),
15477
- collection: string(),
15478
- fields: array(AggregateFieldSchema).readonly(),
15479
- filter: QueryFilterSchema.optional()
15480
- }), AggregateResultSchema, { auth: "admin" }), method(object({
15481
- namespace: string().optional(),
15482
- collection: string(),
15483
- field: string(),
15484
- bucketSize: number().int().positive(),
15485
- origin: number().int(),
15486
- filter: QueryFilterSchema.optional()
15487
- }), array(object({
15488
- bucket: number().int(),
15489
- count: number().int()
15490
- })).readonly(), { auth: "admin" }), method(object({
15491
- namespace: string().optional(),
15492
- collection: string()
15493
- }), boolean(), { auth: "admin" }), method(object({
15494
- namespace: string().optional(),
15495
- collection: string(),
15496
- columns: array(CollectionColumnSchema).readonly(),
15497
- indexes: array(CollectionIndexSchema).readonly().optional()
15498
- }), _void(), {
15499
- kind: "mutation",
15500
- auth: "admin"
15501
- });
15502
- /**
15503
15660
  * What one engine says about itself. The orchestrator uses `kind` to pick
15504
15661
  * a registrant for a collection; `engineId` is what a log line names when
15505
15662
  * a call is routed or refused.
@@ -15579,6 +15736,14 @@ id: union([string(), number()]) }), {
15579
15736
  }), object({ id: union([string(), number()]) }), {
15580
15737
  kind: "mutation",
15581
15738
  auth: "admin"
15739
+ }), method(object({
15740
+ namespace: string().optional(),
15741
+ collection: string(),
15742
+ conflict: array(string()).readonly(),
15743
+ records: array(BulkRecordSchema).readonly()
15744
+ }), object({ upserted: number().int() }), {
15745
+ kind: "mutation",
15746
+ auth: "admin"
15582
15747
  }), method(object({
15583
15748
  namespace: string().optional(),
15584
15749
  collection: string(),
@@ -15586,6 +15751,16 @@ id: union([string(), number()]) }), {
15586
15751
  }), object({ inserted: number().int() }), {
15587
15752
  kind: "mutation",
15588
15753
  auth: "admin"
15754
+ }), method(object({
15755
+ namespace: string().optional(),
15756
+ guard: TransactGuardSchema.optional(),
15757
+ ops: array(TransactOpSchema).readonly()
15758
+ }), object({
15759
+ applied: boolean(),
15760
+ current: unknown().optional()
15761
+ }), {
15762
+ kind: "mutation",
15763
+ auth: "admin"
15589
15764
  }), method(object({
15590
15765
  namespace: string().optional(),
15591
15766
  collection: string(),
@@ -15638,12 +15813,7 @@ id: union([string(), number()]) }), {
15638
15813
  })).readonly(), { auth: "admin" }), method(object({
15639
15814
  namespace: string().optional(),
15640
15815
  collection: string()
15641
- }), boolean(), { auth: "admin" }), method(object({
15642
- namespace: string().optional(),
15643
- collection: string(),
15644
- columns: array(CollectionColumnSchema).readonly(),
15645
- indexes: array(CollectionIndexSchema).readonly().optional()
15646
- }), _void(), {
15816
+ }), boolean(), { auth: "admin" }), method(DeclareCollectionInputSchema, _void(), {
15647
15817
  kind: "mutation",
15648
15818
  auth: "admin"
15649
15819
  });
@@ -20345,6 +20515,12 @@ var NcSystemEventKindSchema = _enum([
20345
20515
  "node-updating",
20346
20516
  "node-inference-unavailable",
20347
20517
  "detection-blind",
20518
+ "recording-stalled",
20519
+ "recording-healthy",
20520
+ "recording-degraded",
20521
+ "storage-location-low",
20522
+ "storage-location-critical",
20523
+ "storage-location-ok",
20348
20524
  "addon-crash-loop",
20349
20525
  "addon-update-available",
20350
20526
  "server-update-available",
@@ -24016,6 +24192,58 @@ var RetrainBboxSchema = object({
24016
24192
  h: number()
24017
24193
  });
24018
24194
  /**
24195
+ * What a box LOOKED LIKE when it was offered, snapshotted at the moment the
24196
+ * operator accepted it. The saved row keeps only the final rectangle; this is
24197
+ * the other half of the pair, and the pair is what says whether the operator
24198
+ * accepted, nudged, relabelled or replaced a proposal (`retrain-review.ts`).
24199
+ *
24200
+ * `ref` names the proposal inside its frame: `pipeline:<trackId>` for a box the
24201
+ * live pipeline drew, `assist:<n>` for the n-th box of a detector or LLM run,
24202
+ * and anything unique for an operator-drawn box (`operator:<n>`). Re-derived
24203
+ * pipeline boxes carry the same ref every time, which is what lets a dismissal
24204
+ * stay dismissed.
24205
+ */
24206
+ var RetrainOriginSchema = object({
24207
+ source: RetrainAnnotationSourceSchema,
24208
+ ref: string().min(1),
24209
+ bbox: RetrainBboxSchema,
24210
+ macroClass: RetrainMacroClassSchema,
24211
+ label: string().optional(),
24212
+ score: number().optional(),
24213
+ modelId: string().optional()
24214
+ });
24215
+ /**
24216
+ * A proposal the operator deleted. Durable on the frame, so a deleted pipeline
24217
+ * box does not come back as a draft every time the frame is reopened, and so
24218
+ * the deletion itself is a recorded fact rather than an absence.
24219
+ */
24220
+ var RetrainDismissedSchema = object({
24221
+ ref: string().min(1),
24222
+ snapshot: RetrainOriginSchema
24223
+ });
24224
+ /** What the operator did with a proposal (see `retrain-review.ts`). */
24225
+ var RetrainReviewStatusSchema = _enum(RETRAIN_REVIEW_STATUSES);
24226
+ var RetrainFrameReviewSchema = object({
24227
+ boxes: array(object({
24228
+ ref: string(),
24229
+ savedId: string().optional(),
24230
+ status: RetrainReviewStatusSchema,
24231
+ /** The baseline was re-derived, not snapshotted (a pre-origin row). */
24232
+ approximate: boolean(),
24233
+ origin: RetrainOriginSchema.optional(),
24234
+ /** The class / label the box carries NOW (a removed box: its origin's). Absent on an older hub. */
24235
+ macroClass: RetrainMacroClassSchema.optional(),
24236
+ label: string().optional(),
24237
+ iou: number().optional()
24238
+ })).readonly(),
24239
+ summary: object({
24240
+ counts: record(RetrainReviewStatusSchema, number().int()),
24241
+ total: number().int(),
24242
+ changed: number().int(),
24243
+ approximate: boolean()
24244
+ })
24245
+ });
24246
+ /**
24019
24247
  * One annotated subject.
24020
24248
  *
24021
24249
  * `bbox` is normalised against the full frame, ALWAYS. The per-model shapes
@@ -24039,6 +24267,9 @@ var RetrainAnnotationSchema = object({
24039
24267
  /** Which model proposed this box — or, on a `model_error`, drew the phantom. */
24040
24268
  assistModelId: string().optional(),
24041
24269
  assistScore: number().optional(),
24270
+ /** The proposal this box started from, snapshotted at accept time. `null` on
24271
+ * a row saved before origins existed; absent on a draft nobody snapshotted. */
24272
+ origin: RetrainOriginSchema.nullable().optional(),
24042
24273
  exportedInBatch: string().optional(),
24043
24274
  createdAt: number()
24044
24275
  });
@@ -24131,7 +24362,19 @@ var RetrainFrameSchema = object({
24131
24362
  * empty when nothing the track store holds can be placed on it. */
24132
24363
  pipelineBoxes: array(RetrainPipelineBoxSchema).readonly().optional(),
24133
24364
  /** The named collections this frame belongs to. Present on list answers. */
24134
- collectionIds: array(string()).readonly().optional()
24365
+ collectionIds: array(string()).readonly().optional(),
24366
+ /** Bumped by every annotation save. A save that names a stale
24367
+ * `expectedRevision` is refused, so two surfaces cannot overwrite each other. */
24368
+ revision: number().int().optional(),
24369
+ /** Proposals the operator deleted — never re-seeded as drafts. */
24370
+ dismissed: array(RetrainDismissedSchema).readonly().optional(),
24371
+ /** What the operator did with the proposals, computed by the server. */
24372
+ review: RetrainFrameReviewSchema.optional(),
24373
+ /** The frame's pixels over the admin data plane (full size). Fetch with the
24374
+ * admin bearer token; relative to the hub root. */
24375
+ imageUrl: string().optional(),
24376
+ /** The same, as a ~480 px thumbnail for grids. */
24377
+ thumbnailUrl: string().optional()
24135
24378
  });
24136
24379
  /** Why a copy-on-select could not be honoured — named, never a silent skip. */
24137
24380
  var RetrainCopyRefusalSchema = _enum([
@@ -25210,10 +25453,33 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
25210
25453
  /** The frame's track, when it has one — checked against the frame. */
25211
25454
  trackId: string().optional(),
25212
25455
  frameId: string(),
25213
- annotations: array(RetrainAnnotationDraftSchema)
25456
+ annotations: array(RetrainAnnotationDraftSchema),
25457
+ /** The frame's `revision` the caller saw. A different current revision
25458
+ * refuses the save with a `retrain-revision-conflict` error
25459
+ * (`parseRetrainRevisionConflict`). Absent ⇒ last write wins. */
25460
+ expectedRevision: number().int().optional(),
25461
+ /** The proposals the operator deleted. Absent ⇒ keep the frame's
25462
+ * current set; present ⇒ replace it (an empty array un-dismisses). */
25463
+ dismissed: array(RetrainDismissedSchema).optional()
25214
25464
  }), array(RetrainAnnotationSchema).readonly(), {
25215
25465
  kind: "mutation",
25216
25466
  auth: "admin"
25467
+ }), method(object({
25468
+ deviceId: number(),
25469
+ trackId: string().optional(),
25470
+ frameId: string(),
25471
+ expectedRevision: number().int().optional(),
25472
+ origins: array(object({
25473
+ annotationId: string(),
25474
+ origin: RetrainOriginSchema
25475
+ })).min(1).max(500)
25476
+ }), object({
25477
+ updated: number().int(),
25478
+ skipped: number().int(),
25479
+ revision: number().int()
25480
+ }), {
25481
+ kind: "mutation",
25482
+ auth: "admin"
25217
25483
  }), method(object({
25218
25484
  deviceId: number(),
25219
25485
  trackId: string()
@@ -27829,6 +28095,12 @@ var CameraStepOverridePatchSchema = object({
27829
28095
  settings: record(string(), unknown()).readonly().optional()
27830
28096
  });
27831
28097
  var CameraStepSettingsSchema = record(string(), record(string(), unknown()).readonly());
28098
+ /** The three root-detector choices a camera has (D507: at most one root). */
28099
+ var CameraDetectionSourceSchema = _enum([
28100
+ "pipeline",
28101
+ "onboard",
28102
+ "none"
28103
+ ]);
27832
28104
  var CameraPipelineSettingsSchema = object({
27833
28105
  stepToggles: record(string(), boolean()).optional(),
27834
28106
  stepSettings: CameraStepSettingsSchema.optional(),
@@ -28406,6 +28678,26 @@ method(object({
28406
28678
  }), object({ success: literal(true) }), {
28407
28679
  kind: "mutation",
28408
28680
  auth: "admin"
28681
+ }), method(object({ deviceId: number() }), object({
28682
+ source: CameraDetectionSourceSchema,
28683
+ explicit: boolean(),
28684
+ onboard: object({
28685
+ /** The camera has an onboard detector this system can read. */
28686
+ available: boolean(),
28687
+ /** What its detections carry — a camera with no box cannot be a root step. */
28688
+ geometry: _enum([
28689
+ "boxed",
28690
+ "while-streaming",
28691
+ "flag-only",
28692
+ "unknown"
28693
+ ])
28694
+ })
28695
+ })), method(object({
28696
+ deviceId: number(),
28697
+ source: CameraDetectionSourceSchema
28698
+ }), object({ success: literal(true) }), {
28699
+ kind: "mutation",
28700
+ auth: "admin"
28409
28701
  }), method(object({ deviceId: number() }), record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).nullable()), method(object({
28410
28702
  deviceId: number(),
28411
28703
  agentNodeId: string(),
@@ -31772,6 +32064,17 @@ var BatteryStatusSchema = object({
31772
32064
  */
31773
32065
  lastContactAt: number().optional(),
31774
32066
  /**
32067
+ * Ms epoch of the last COMPLETE scheduled refresh — every fact the provider
32068
+ * holds for the device (level, charging, link, device info, state slices) and
32069
+ * its cached snapshot, read together. Absent = never since this slice was
32070
+ * born. Unlike `lastUpdated` (any write, even a push of one field) this is
32071
+ * the staleness an operator can trust: the provider owns the device fact and
32072
+ * so owns the window on its age (D224, D847). Not a clock in the
32073
+ * runtime-state-durability sense: it moves once per window and must survive
32074
+ * a restart, or every restart would owe the camera a wake.
32075
+ */
32076
+ lastFullRefreshAt: number().optional(),
32077
+ /**
31775
32078
  * True when the source is a BINARY low-battery indicator (HA
31776
32079
  * `binary_sensor` device_class=battery / `LOW_BAT`) that has no real
31777
32080
  * charge level — `percentage` is then a coarse stand-in (100 = normal,
@@ -31835,6 +32138,18 @@ var CalendarInfoSchema = object({
31835
32138
  source: CalendarSourceKindSchema,
31836
32139
  enabled: boolean()
31837
32140
  });
32141
+ /**
32142
+ * Time contract of {@link CalendarEvent}.
32143
+ *
32144
+ * - Timed event: `startMs` / `endMs` are real instants; `endMs` is exclusive.
32145
+ * - All-day event (`allDay: true`): the event is a run of calendar DATES, not
32146
+ * instants. `startMs` is UTC midnight of the first date and `endMs` is UTC
32147
+ * midnight of the day AFTER the last date (RFC 5545 exclusive DTEND), so a
32148
+ * one-day event spans exactly 24 h. Every provider produces that and no
32149
+ * consumer may read the instants in a local timezone: use
32150
+ * {@link calendarEventLocalSpan}. Reading UTC midnight as local time put an
32151
+ * all-day event on the following day for any viewer ahead of UTC.
32152
+ */
31838
32153
  var CalendarEventSchema = object({
31839
32154
  id: string().min(1),
31840
32155
  calendarId: string().min(1),
@@ -33977,7 +34292,15 @@ var HubAddressBookSchema = object({
33977
34292
  publicEndpoint: HubAddressRoleResolutionSchema
33978
34293
  }),
33979
34294
  /** The `hub=` an app link carries (D709), or null. */
33980
- appLinkHub: string().nullable()
34295
+ appLinkHub: string().nullable(),
34296
+ /**
34297
+ * Every origin a browser can really reach this hub at, in the scheme each
34298
+ * listener serves: `https://<lan>:<httpsPort>`, and `http://<lan>:<httpPort>`
34299
+ * while LAN HTTP is on, plus the public and custom addresses. Distinct from
34300
+ * `rows`, which show `http://` only while LAN HTTP is on. Never loopback,
34301
+ * never the app link. Absent on a hub older than D794's amendment.
34302
+ */
34303
+ listenerOrigins: array(string()).readonly().optional()
33981
34304
  });
33982
34305
  var AllowedAddressesSchema = object({
33983
34306
  /**
@@ -34987,7 +35310,14 @@ var TopologyNodeSchema = object({
34987
35310
  * completed a mutual-TLS handshake, `clear` otherwise. Absent for the hub,
34988
35311
  * for offline rows and when the hub cannot tell.
34989
35312
  */
34990
- meshTransport: _enum(["tls", "clear"]).optional()
35313
+ meshTransport: _enum(["tls", "clear"]).optional(),
35314
+ /**
35315
+ * Whether the hub holds this online AGENT's capability registration (its
35316
+ * `registerNode` manifest). `false` = online in the mesh but not ready: the
35317
+ * hub dropped the registration on a disconnect only it saw and the agent has
35318
+ * not re-sent it. Absent for the hub and offline rows.
35319
+ */
35320
+ capabilitiesRegistered: boolean().optional()
34991
35321
  });
34992
35322
  var CapUsageEdgeSchema = object({
34993
35323
  callerAddonId: string(),
@@ -40829,6 +41159,12 @@ Object.freeze({
40829
41159
  addonId: null,
40830
41160
  access: "view"
40831
41161
  },
41162
+ "backup.listAvailableDatabases": {
41163
+ capName: "backup",
41164
+ capScope: "system",
41165
+ addonId: null,
41166
+ access: "view"
41167
+ },
40832
41168
  "backup.listDestinations": {
40833
41169
  capName: "backup",
40834
41170
  capScope: "system",
@@ -41525,6 +41861,12 @@ Object.freeze({
41525
41861
  addonId: null,
41526
41862
  access: "create"
41527
41863
  },
41864
+ "dataStoreProvider.transact": {
41865
+ capName: "data-store-provider",
41866
+ capScope: "system",
41867
+ addonId: null,
41868
+ access: "create"
41869
+ },
41528
41870
  "dataStoreProvider.update": {
41529
41871
  capName: "data-store-provider",
41530
41872
  capScope: "system",
@@ -41543,6 +41885,12 @@ Object.freeze({
41543
41885
  addonId: null,
41544
41886
  access: "create"
41545
41887
  },
41888
+ "dataStoreProvider.upsertMany": {
41889
+ capName: "data-store-provider",
41890
+ capScope: "system",
41891
+ addonId: null,
41892
+ access: "create"
41893
+ },
41546
41894
  "dayNight.getOptions": {
41547
41895
  capName: "day-night",
41548
41896
  capScope: "device",
@@ -44369,6 +44717,12 @@ Object.freeze({
44369
44717
  addonId: null,
44370
44718
  access: "create"
44371
44719
  },
44720
+ "pipelineAnalytics.backfillRetrainOrigins": {
44721
+ capName: "pipeline-analytics",
44722
+ capScope: "device",
44723
+ addonId: null,
44724
+ access: "create"
44725
+ },
44372
44726
  "pipelineAnalytics.cancelRelocateMedia": {
44373
44727
  capName: "pipeline-analytics",
44374
44728
  capScope: "device",
@@ -45149,6 +45503,12 @@ Object.freeze({
45149
45503
  addonId: null,
45150
45504
  access: "view"
45151
45505
  },
45506
+ "pipelineOrchestrator.getCameraDetectionSource": {
45507
+ capName: "pipeline-orchestrator",
45508
+ capScope: "system",
45509
+ addonId: null,
45510
+ access: "view"
45511
+ },
45152
45512
  "pipelineOrchestrator.getCameraMetrics": {
45153
45513
  capName: "pipeline-orchestrator",
45154
45514
  capScope: "system",
@@ -45377,6 +45737,12 @@ Object.freeze({
45377
45737
  addonId: null,
45378
45738
  access: "create"
45379
45739
  },
45740
+ "pipelineOrchestrator.setCameraDetectionSource": {
45741
+ capName: "pipeline-orchestrator",
45742
+ capScope: "system",
45743
+ addonId: null,
45744
+ access: "create"
45745
+ },
45380
45746
  "pipelineOrchestrator.setCameraPipelineForAgent": {
45381
45747
  capName: "pipeline-orchestrator",
45382
45748
  capScope: "system",
@@ -46349,6 +46715,12 @@ Object.freeze({
46349
46715
  addonId: null,
46350
46716
  access: "create"
46351
46717
  },
46718
+ "settingsStore.transact": {
46719
+ capName: "settings-store",
46720
+ capScope: "system",
46721
+ addonId: null,
46722
+ access: "create"
46723
+ },
46352
46724
  "settingsStore.update": {
46353
46725
  capName: "settings-store",
46354
46726
  capScope: "system",
@@ -46367,6 +46739,12 @@ Object.freeze({
46367
46739
  addonId: null,
46368
46740
  access: "create"
46369
46741
  },
46742
+ "settingsStore.upsertMany": {
46743
+ capName: "settings-store",
46744
+ capScope: "system",
46745
+ addonId: null,
46746
+ access: "create"
46747
+ },
46370
46748
  "smoke.getStatus": {
46371
46749
  capName: "smoke",
46372
46750
  capScope: "device",
@@ -46829,6 +47207,12 @@ Object.freeze({
46829
47207
  addonId: null,
46830
47208
  access: "view"
46831
47209
  },
47210
+ "streamBroker.getLiveViewerCounts": {
47211
+ capName: "stream-broker",
47212
+ capScope: "system",
47213
+ addonId: null,
47214
+ access: "view"
47215
+ },
46832
47216
  "streamBroker.getPreBufferInfo": {
46833
47217
  capName: "stream-broker",
46834
47218
  capScope: "system",
@@ -50673,6 +51057,11 @@ Object.freeze({
50673
51057
  form: "single",
50674
51058
  optional: false
50675
51059
  }],
51060
+ "pipelineAnalytics.backfillRetrainOrigins": [{
51061
+ name: "deviceId",
51062
+ form: "single",
51063
+ optional: false
51064
+ }],
50676
51065
  "pipelineAnalytics.clearTrackRelation": [{
50677
51066
  name: "deviceId",
50678
51067
  form: "single",
@@ -50978,6 +51367,11 @@ Object.freeze({
50978
51367
  form: "single",
50979
51368
  optional: false
50980
51369
  }],
51370
+ "pipelineOrchestrator.getCameraDetectionSource": [{
51371
+ name: "deviceId",
51372
+ form: "single",
51373
+ optional: false
51374
+ }],
50981
51375
  "pipelineOrchestrator.getCameraMetrics": [{
50982
51376
  name: "deviceId",
50983
51377
  form: "single",
@@ -51038,6 +51432,11 @@ Object.freeze({
51038
51432
  form: "single",
51039
51433
  optional: false
51040
51434
  }],
51435
+ "pipelineOrchestrator.setCameraDetectionSource": [{
51436
+ name: "deviceId",
51437
+ form: "single",
51438
+ optional: false
51439
+ }],
51041
51440
  "pipelineOrchestrator.setCameraPipelineForAgent": [{
51042
51441
  name: "deviceId",
51043
51442
  form: "single",
@@ -52067,6 +52466,9 @@ new Map(Object.entries({
52067
52466
  "stream-online": "device-events",
52068
52467
  "stream-offline": "device-events",
52069
52468
  "detection-blind": "device-events",
52469
+ "recording-stalled": "device-events",
52470
+ "recording-healthy": "device-events",
52471
+ "recording-degraded": "device-events",
52070
52472
  "node-online": "system",
52071
52473
  "node-offline": "system",
52072
52474
  "node-restarting": "system",
@@ -52080,6 +52482,9 @@ new Map(Object.entries({
52080
52482
  "wrapper-update-available": "system",
52081
52483
  "backup-completed": "system",
52082
52484
  "export-completed": "system",
52485
+ "storage-location-low": "system",
52486
+ "storage-location-critical": "system",
52487
+ "storage-location-ok": "system",
52083
52488
  "alarm-triggered": "alarm",
52084
52489
  "alarm-armed": "alarm",
52085
52490
  "alarm-disarmed": "alarm",
@@ -52141,6 +52546,16 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
52141
52546
  label: "Detecting nothing",
52142
52547
  kinds: ["detection-blind"]
52143
52548
  },
52549
+ {
52550
+ id: "recording",
52551
+ family: "device-events",
52552
+ label: "Recording",
52553
+ kinds: [
52554
+ "recording-stalled",
52555
+ "recording-healthy",
52556
+ "recording-degraded"
52557
+ ]
52558
+ },
52144
52559
  {
52145
52560
  id: "nodes",
52146
52561
  family: "system",
@@ -52181,6 +52596,16 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
52181
52596
  label: "Backups & exports",
52182
52597
  kinds: ["backup-completed", "export-completed"]
52183
52598
  },
52599
+ {
52600
+ id: "storage",
52601
+ family: "system",
52602
+ label: "Storage locations",
52603
+ kinds: [
52604
+ "storage-location-low",
52605
+ "storage-location-critical",
52606
+ "storage-location-ok"
52607
+ ]
52608
+ },
52184
52609
  {
52185
52610
  id: "alarm",
52186
52611
  family: "alarm",
@@ -52263,6 +52688,9 @@ var DEVICE_EVENTS = [
52263
52688
  "stream-online",
52264
52689
  "stream-offline",
52265
52690
  "detection-blind",
52691
+ "recording-stalled",
52692
+ "recording-healthy",
52693
+ "recording-degraded",
52266
52694
  ...ALARM
52267
52695
  ];
52268
52696
  /** Every kind a summary may speak about — the two summarisable families. */
@@ -52430,6 +52858,11 @@ var STATE_SUMMARY_VARS = [
52430
52858
  [...RULE_TEXT],
52431
52859
  [...RULE_TEXT],
52432
52860
  [...RULE_TEXT],
52861
+ [...RULE_TEXT],
52862
+ [...RULE_TEXT],
52863
+ [...RULE_TEXT],
52864
+ [...RULE_TEXT],
52865
+ [...RULE_TEXT],
52433
52866
  ([...RULE_TEXT], [...UPDATES]),
52434
52867
  ([...RULE_TEXT], [...PACKAGE_UPDATES]),
52435
52868
  ([...RULE_TEXT], [...PACKAGE_UPDATES]),