@camstack/addon-pipeline 1.2.271 → 1.2.273

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.
Files changed (33) hide show
  1. package/dist/audio-analyzer/index.js +2 -2
  2. package/dist/audio-analyzer/index.mjs +2 -2
  3. package/dist/{default-detection-model-CnHXu0T5.js → default-detection-model-9Solpn0K.js} +1 -1
  4. package/dist/{default-detection-model-DMz2NcwC.mjs → default-detection-model-DCFaNnYd.mjs} +1 -1
  5. package/dist/detection-pipeline/index.js +4 -4
  6. package/dist/detection-pipeline/index.mjs +4 -4
  7. package/dist/{dist-D6TktSdc.mjs → dist-BRT-qKlE.mjs} +335 -14
  8. package/dist/{dist-omV46PMG.js → dist-DRDzfOnl.js} +335 -14
  9. package/dist/motion-wasm/index.js +1 -1
  10. package/dist/motion-wasm/index.mjs +1 -1
  11. package/dist/{node-1Ai8jl-y.js → node-BmTPPuIg.js} +1 -1
  12. package/dist/{node-BR1TKkR_.mjs → node-Dwu66ZR4.mjs} +1 -1
  13. package/dist/pipeline-runner/index.js +3 -3
  14. package/dist/pipeline-runner/index.mjs +3 -3
  15. package/dist/{process-memory-CzAXrCOa.js → process-memory-BTwHfysZ.js} +1 -1
  16. package/dist/{process-memory-DL3690gA.mjs → process-memory-Cx4oDFz9.mjs} +1 -1
  17. package/dist/recorder/index.js +4 -3
  18. package/dist/recorder/index.mjs +4 -3
  19. package/dist/{segment-demux-js-D8bD_LBq.js → segment-demux-js--ePyI476.js} +1 -1
  20. package/dist/{segment-demux-js-Zm-FyEl6.mjs → segment-demux-js-BKvYCad_.mjs} +1 -1
  21. package/dist/stream-broker/_stub.js +2 -2
  22. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-MI6wy_av.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-shbmpL8E.mjs} +2 -2
  23. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-C_SEu7AC.mjs +26 -0
  24. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-C8RTK6nJ.mjs +26 -0
  25. package/dist/stream-broker/demux-worker-child.js +1 -1
  26. package/dist/stream-broker/demux-worker-child.mjs +1 -1
  27. package/dist/stream-broker/{hostInit-D51BPmpl.mjs → hostInit-CtVYKCNe.mjs} +2 -2
  28. package/dist/stream-broker/index.js +3 -3
  29. package/dist/stream-broker/index.mjs +3 -3
  30. package/dist/stream-broker/remoteEntry.js +1 -1
  31. package/package.json +1 -1
  32. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-GublMTFG.mjs +0 -26
  33. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-CeR_IxxU.mjs +0 -26
@@ -5360,7 +5360,7 @@ var ZodIssueCode = {
5360
5360
  var ZodFirstPartyTypeKind;
5361
5361
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5362
5362
  //#endregion
5363
- //#region ../types/dist/sleep-CiR4z7r9.mjs
5363
+ //#region ../types/dist/sleep-CopaBJss.mjs
5364
5364
  /**
5365
5365
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5366
5366
  * window to float samples (D455).
@@ -5592,6 +5592,12 @@ Object.fromEntries([
5592
5592
  icon: "circle-dot",
5593
5593
  order: 40
5594
5594
  },
5595
+ {
5596
+ id: "clips",
5597
+ label: "Clips",
5598
+ icon: "clapperboard",
5599
+ order: 41
5600
+ },
5595
5601
  {
5596
5602
  id: "engine",
5597
5603
  label: "Inference Engine",
@@ -16436,6 +16442,8 @@ method(object({
16436
16442
  deviceId: number(),
16437
16443
  capName: string(),
16438
16444
  wrapperAddonId: string(),
16445
+ /** The `ClipSource.source` id to toggle. Absent = all of the addon's. */
16446
+ sourceId: string().optional(),
16439
16447
  active: boolean()
16440
16448
  }), _void(), {
16441
16449
  kind: "mutation",
@@ -25786,10 +25794,9 @@ var ServerBootModeSchema = _enum([
25786
25794
  * - `idle` / `checking` / `staging` — steady / in-flight registry work.
25787
25795
  * - `pending-restart` — a version is staged and the node has NOT yet
25788
25796
  * restarted onto it (still running the OLD version).
25789
- * - `awaiting-confirmation` — the node HAS restarted onto the staged version
25790
- * (it is the active probation boot) and is waiting to confirm boot-health.
25791
- * Apply/rollback are refused in this state and the node must NOT be
25792
- * manually restarted, or the probation boot auto-rolls-back.
25797
+ * - `awaiting-confirmation` — RETIRED with the probation boot (single-copy
25798
+ * collapse, 2026-07-18). Kept in the enum so an older client still parses;
25799
+ * no provider emits it.
25793
25800
  */
25794
25801
  var ServerUpdateStateSchema = _enum([
25795
25802
  "idle",
@@ -25878,12 +25885,35 @@ var ServerRollbackInfoSchema = object({
25878
25885
  var ServerPackageStatusSchema = object({
25879
25886
  /** Root package name (`@camstack/server` on the hub). */
25880
25887
  packageName: string(),
25881
- /** Version of the code the running process ACTUALLY loaded. */
25888
+ /**
25889
+ * Version of the code THIS PROCESS loaded — captured once, at boot, from the
25890
+ * package.json of the copy the code was loaded from, and never re-read. A
25891
+ * copy replaced on disk under a live process must not move this number;
25892
+ * that divergence is what `installedVersion` is for. Before 2026-09-20 this
25893
+ * was a lazy disk read that would have followed such a swap silently.
25894
+ */
25882
25895
  runningVersion: string().nullable(),
25883
25896
  /** Node.js runtime version the node's process runs on (`process.versions.node`). */
25884
25897
  nodeRuntimeVersion: string().nullable(),
25885
25898
  /** Active data-dir root version; null when booted from seed/workspace. */
25886
25899
  activeVersion: string().nullable(),
25900
+ /**
25901
+ * Version of the root package in the data-root `current/` copy RIGHT NOW —
25902
+ * what the next boot would load if nothing is staged. Normally equal to
25903
+ * `runningVersion`; differs only when the copy on disk changed under the
25904
+ * live process. `null` when there is no data-root copy (baked seed or
25905
+ * workspace boot). Optional for version skew: an older provider omits it.
25906
+ */
25907
+ installedVersion: string().nullable().optional(),
25908
+ /**
25909
+ * True when the code that would run after a restart is NOT the code running
25910
+ * now: a version is staged (`pendingVersion`), or `installedVersion` differs
25911
+ * from `runningVersion`. Derived on every read, never stored. This is the
25912
+ * one field that lets an operator or a script say "1.2.353 is installed and
25913
+ * will run after a restart" instead of reading it off a number that means
25914
+ * "installed". Optional for version skew.
25915
+ */
25916
+ restartRequired: boolean().optional(),
25887
25917
  /** N-1 version kept for rollback; null when no previous version exists. */
25888
25918
  previousVersion: string().nullable(),
25889
25919
  /** Version of the immutable baked seed closure (image fallback). */
@@ -25918,19 +25948,71 @@ var ServerPackageStatusSchema = object({
25918
25948
  });
25919
25949
  var ServerUpdateCheckResultSchema = object({
25920
25950
  packageName: string(),
25951
+ /** Same meaning as on the status payload: what THIS process loaded. */
25921
25952
  runningVersion: string().nullable(),
25922
25953
  latestVersion: string().nullable(),
25954
+ /**
25955
+ * `latestVersion` is newer than `runningVersion` AND is not the version
25956
+ * already staged on this node. A staged-and-waiting version is not "an
25957
+ * update available" — applying it again is refused (`already-staged`), and
25958
+ * a button that announced "updating…" on this boolean then got refused
25959
+ * would be lying. It is reported through `pendingVersion` instead.
25960
+ */
25923
25961
  updateAvailable: boolean(),
25924
25962
  checkedAtMs: number(),
25925
25963
  /** Non-null when the registry lookup failed (offline, bad registry, …). */
25926
- error: string().nullable()
25964
+ error: string().nullable(),
25965
+ /**
25966
+ * Version staged on this node and awaiting its restart, when one is. Before
25967
+ * 2026-09-20 a check answered `{runningVersion, updateAvailable:false}` for a
25968
+ * node whose staged closure had never booted, and the caller had no way to
25969
+ * see the difference. Optional for version skew.
25970
+ */
25971
+ pendingVersion: string().nullable().optional(),
25972
+ /** See the status payload: staged, or installed-on-disk ≠ running. Optional for skew. */
25973
+ restartRequired: boolean().optional()
25927
25974
  });
25975
+ /**
25976
+ * What an action DID — the discriminant `accepted` cannot carry. Before
25977
+ * 2026-09-20 `applyServerUpdate` answered `accepted:false` both for a refusal
25978
+ * where nothing was wrong (already current, already staged) and for a staging
25979
+ * install that died on `npm error code ECONNRESET`; the only difference was
25980
+ * prose in `message`, and an operator restarted a container on the strength of
25981
+ * it, booting the previous version.
25982
+ *
25983
+ * - `staged` — the closure is installed and validated; the node
25984
+ * restarts to apply it (`restarting:true`). NOTHING
25985
+ * runs the new code until that restart completes.
25986
+ * - `restart-scheduled` — a plain, version-preserving restart was accepted.
25987
+ * - `already-current` — the target IS the running version; nothing done.
25988
+ * - `refused` — dropped by a gate; `reason` names which.
25989
+ * - `failed` — attempted and did not land; `error` says why.
25990
+ */
25991
+ var ServerUpdateOutcomeSchema = _enum([
25992
+ "staged",
25993
+ "restart-scheduled",
25994
+ "already-current",
25995
+ "refused",
25996
+ "failed"
25997
+ ]);
25928
25998
  var ServerUpdateActionResultSchema = object({
25929
25999
  accepted: boolean(),
25930
26000
  targetVersion: string().nullable(),
25931
26001
  /** True when a graceful restart was scheduled to apply the change. */
25932
26002
  restarting: boolean(),
25933
- message: string()
26003
+ message: string(),
26004
+ /** See {@link ServerUpdateOutcomeSchema}. Optional for version skew. */
26005
+ outcome: ServerUpdateOutcomeSchema.optional(),
26006
+ /**
26007
+ * Stable, greppable cause for `refused` / `failed` (the engine's
26008
+ * `UpdateRefusalReason`, `staging-failed`, …). `null` on success.
26009
+ */
26010
+ reason: string().nullable().optional(),
26011
+ /**
26012
+ * The failure itself, verbatim enough to act on (the npm output for a
26013
+ * staging install). Non-null only for `failed`.
26014
+ */
26015
+ error: string().nullable().optional()
25934
26016
  });
25935
26017
  method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), ServerUpdateCheckResultSchema, {
25936
26018
  kind: "mutation",
@@ -27155,29 +27237,257 @@ var ClipSchema = object({
27155
27237
  holes: array(object({
27156
27238
  startMs: number(),
27157
27239
  endMs: number()
27158
- })).optional()
27240
+ })).optional(),
27241
+ /**
27242
+ * A URL that MAY produce this clip's still, asked only for rows actually on
27243
+ * screen. The opposite of {@link ClipSchema.thumbnail}: that one is VOUCHED
27244
+ * (a JPEG is already on disk), this one is an offer. The route answers 200
27245
+ * with the image, or 204 with `x-camstack-reason` when it could not mint one
27246
+ * — a surface latches that refusal to the instant rather than retrying.
27247
+ *
27248
+ * Never both: a clip with a vouched `thumbnail` needs no mint.
27249
+ */
27250
+ thumbnailMint: string().optional(),
27251
+ /**
27252
+ * Why no still will be produced for this clip RIGHT NOW — set when the
27253
+ * provider already knows, so the surface draws the glyph and the reason
27254
+ * instead of firing a mint that cannot succeed.
27255
+ *
27256
+ * `sleeping` — a standalone battery camera; a read would be a wake (D549 4).
27257
+ * `camera-refused` — the camera answered the CoverPreview with a refusal.
27258
+ * `no-keyframe` — the window holds no decodable I-frame (an event that sits
27259
+ * inside no file is the measured case).
27260
+ * `unsupported` — this source cannot mint stills at all.
27261
+ */
27262
+ thumbnailUnavailable: object({ reason: _enum([
27263
+ "sleeping",
27264
+ "camera-refused",
27265
+ "no-keyframe",
27266
+ "unsupported"
27267
+ ]) }).optional(),
27268
+ /**
27269
+ * When the catalog this row came from was last CONFIRMED against the device.
27270
+ * Absent means "this row was read live". A persisted catalog served while a
27271
+ * camera sleeps carries the age it really has — a cached list is never drawn
27272
+ * as current (D549 13).
27273
+ */
27274
+ catalogAsOf: number().optional(),
27275
+ /**
27276
+ * The camera's OWN type strings for this clip, all of them, unmapped
27277
+ * (`md`, `people`, `dog_cat`, `sched`, …). Kept beside {@link labels}
27278
+ * because a firmware inventing a type must not vanish: the mapping into our
27279
+ * filter vocabulary is lossy on purpose and this is the lossless copy
27280
+ * (D549 20).
27281
+ */
27282
+ nativeTypes: array(string()).optional(),
27283
+ /**
27284
+ * What the subject DID — `crossline`, `intrude`, `loitering`. A behaviour
27285
+ * travels BESIDE a class, never instead of one, and the class filter ignores
27286
+ * it: "a person crossed a line" is still a person (D549 20).
27287
+ */
27288
+ behaviours: array(string()).optional(),
27289
+ /**
27290
+ * The same recording as two files — the sub twin (what the row and its
27291
+ * thumbnail are) and its main twin, matched at listing time so a quality
27292
+ * change never re-searches the camera (D549 15). `getClipPlayback`'s
27293
+ * `profile` picks between them: `low | mid` → sub, `high` → main.
27294
+ */
27295
+ streams: object({
27296
+ sub: object({
27297
+ id: string(),
27298
+ bytes: number().optional()
27299
+ }).optional(),
27300
+ main: object({
27301
+ id: string(),
27302
+ bytes: number().optional()
27303
+ }).optional()
27304
+ }).optional(),
27305
+ /** The camera says it holds a sub-stream copy of this recording. */
27306
+ supportSub: boolean().optional(),
27307
+ /**
27308
+ * Whether this row has bytes behind it. ABSENT means yes — every clip that
27309
+ * IS a file is playable, and only a source that lists EVENTS can produce a
27310
+ * row with nothing to play (the measured case: 1 of 29 hub events on 3628
27311
+ * fell inside no file). Such a row is shown, never dropped and never offered
27312
+ * as playable-then-failing (D549 19).
27313
+ */
27314
+ playable: boolean().optional(),
27315
+ /** Why {@link playable} is false, verbatim (`no-file-for-window`). */
27316
+ unplayableReason: string().optional()
27159
27317
  });
27160
27318
  var ClipPlaybackSchema = object({
27161
- /** HLS master URL through the hub data-plane (Range + token in path). */
27319
+ /**
27320
+ * A media URL through the hub data-plane. {@link ClipPlaybackSchema.format}
27321
+ * says what kind — an HLS master playlist for a recording-derived clip, a
27322
+ * progressive MP4 for a native file the vendor addon muxed and serves with
27323
+ * `Range`. The URL is NOT a credential: both planes are registered
27324
+ * `access: 'authenticated'` and the hub's `/addon/<id>/<prefix>` proxy takes
27325
+ * the session cookie, so nothing is appended to it (D549 22).
27326
+ */
27162
27327
  playbackUrl: string(),
27328
+ /**
27329
+ * How to play {@link playbackUrl}. Absent means `hls` — the shape every
27330
+ * existing consumer already assumes. A player that branches on this is the
27331
+ * one change a native clip needs; a player that ignores it will hand an MP4
27332
+ * to hls.js and fail parsing it as a manifest.
27333
+ */
27334
+ format: _enum(["hls", "mp4"]).optional(),
27335
+ /**
27336
+ * Which twin was actually served. A clip that holds only one stream answers
27337
+ * with the one it has, and the surface SAYS so — a missing main twin is
27338
+ * never served silently as if it were the asked-for quality (D549 15).
27339
+ */
27340
+ served: CamProfileSchema.optional(),
27163
27341
  /** Optional LAN/remote alternates for the same clip. */
27164
27342
  playbackEndpoints: array(string()).optional(),
27165
27343
  token: string().optional()
27166
27344
  });
27345
+ /**
27346
+ * Why a source cannot answer right now — per SOURCE, never fleet-wide.
27347
+ *
27348
+ * `ok` is the only state whose clip list may be read as complete. The other
27349
+ * three exist because an empty list from a sleeping camera reads as "this
27350
+ * camera has no recordings", which is the defect this whole line of work is
27351
+ * about: a battery camera nobody woke (`sleeping`), a camera that could not be
27352
+ * reached at all (`unreachable`, also what a provider that THREW reports), a
27353
+ * camera whose SD card is not mounted (`no-storage`, measured on 640 —
27354
+ * `HddInfo mount 0`, honestly nothing to list rather than "no clips"), and a
27355
+ * camera whose OWN index disagrees with its OWN calendar (`index-empty`,
27356
+ * measured on 618: the calendar marks 3–20 September, days 6–20 list zero
27357
+ * files on both streams and both filters, with 177 GB free). That last one is
27358
+ * a defect ON THE CAMERA, and the only honest thing a provider can do is say
27359
+ * which days it asked for and got nothing — "no clips" would be a lie about a
27360
+ * card that is full of them.
27361
+ */
27362
+ var ClipSourceAvailabilitySchema = object({
27363
+ state: _enum([
27364
+ "ok",
27365
+ "sleeping",
27366
+ "unreachable",
27367
+ "no-storage",
27368
+ "index-empty"
27369
+ ]),
27370
+ /** Free text, shown verbatim. Names the camera's own refusal when there is one. */
27371
+ reason: string().optional(),
27372
+ /** When this source's catalog was last CONFIRMED. A cached list is never
27373
+ * drawn as current: the surface shows the age whenever it is older than the
27374
+ * refresh interval. */
27375
+ catalogAsOf: number().optional()
27376
+ });
27377
+ /**
27378
+ * One SOURCE of clips for a camera — a row of the picker, and the namespace
27379
+ * every clip id from it is prefixed with (`analytics`,
27380
+ * `native:reolink:onboard`, `hksv`, …).
27381
+ *
27382
+ * A provider lists the sources IT serves for that device, and answers for each
27383
+ * of them whether it can answer at all. A provider with nothing to offer on a
27384
+ * camera returns `[]` — it is not that camera's business.
27385
+ */
27386
+ var ClipSourceSchema = object({
27387
+ /** The value this source stamps on {@link ClipSchema.source}, and the prefix
27388
+ * of every clip id it mints. `getClipPlayback` routes on it. */
27389
+ source: string(),
27390
+ /** Operator-facing name of the source ("CamStack recordings", "SD card"). */
27391
+ label: string(),
27392
+ /**
27393
+ * The addon that SERVES this row.
27394
+ *
27395
+ * A surface cannot otherwise resolve a source to who answers it, and the
27396
+ * alternative — a `native:reolink:* → provider-reolink` table inside the
27397
+ * widget — is a second authority on provider identity living in the one
27398
+ * package with no business knowing it, wrong the day a third source appears
27399
+ * (D557). One addon may serve SEVERAL sources: `addon-provider-reolink`
27400
+ * answers a hub child with both `native:reolink:onboard` and
27401
+ * `native:reolink:hub`, which is why the per-device switch is keyed by
27402
+ * SOURCE and not by this (D555).
27403
+ *
27404
+ * Optional for version skew only. The collection dispatcher stamps it from
27405
+ * the registry, so a row that travelled through the fan-out carries the
27406
+ * authoritative id whatever the provider filled in.
27407
+ */
27408
+ addonId: string().optional(),
27409
+ /**
27410
+ * Which API this source resolved to FOR THIS CAMERA, when it has a choice.
27411
+ *
27412
+ * A source may cover one store through more than one surface — the Reolink
27413
+ * provider reads a hub child through the parent's event log and a standalone
27414
+ * through its own file list, because that is what each camera answers. The
27415
+ * CHOICE is the provider's, made from what the camera is, and is never a row
27416
+ * the operator has to understand; but it is REPORTED, because a source that
27417
+ * silently reads a different API on two cameras and then behaves differently
27418
+ * is the thing nobody can debug later. Absent when the source has only one
27419
+ * way to read its store.
27420
+ */
27421
+ via: string().optional(),
27422
+ availability: ClipSourceAvailabilitySchema,
27423
+ /**
27424
+ * The operator switched this source OFF for this camera.
27425
+ *
27426
+ * Deliberately NOT a member of {@link ClipSourceAvailabilitySchema}'s
27427
+ * vocabulary. That enum models what the source CAN do — a sleeping camera, an
27428
+ * unmounted card, an index that disagrees with its own calendar — and a
27429
+ * switched-off source could answer perfectly well; the operator decided it
27430
+ * should not. Folding the choice in is how `disabled` and `broken` stop being
27431
+ * distinguishable, which is the D62 rule this repo has already paid for twice:
27432
+ * an off switch is REPORTED off (`CameraStatus.switchedOff`, the same word),
27433
+ * and disabled must never look like broken. It is also what lets every
27434
+ * exhaustive consumer of the availability enum keep compiling.
27435
+ *
27436
+ * A switched-off source contributes NO clips (`listClips` never calls it) and
27437
+ * its row carries no `catalogAsOf`: nothing confirms a catalog it is not
27438
+ * allowed to serve, and a frozen age that can only grow draws a stalling
27439
+ * source rather than an off switch.
27440
+ *
27441
+ * The row survives BECAUSE it is the control the operator switches the source
27442
+ * back on from — D554 decision 4's rule ("a source that cannot answer
27443
+ * produces a ROW, not an absence") applied to the one case D556 carved out of
27444
+ * it, and D557's own kept property ("a source is never hidden, only its
27445
+ * rows"). Absent means on.
27446
+ *
27447
+ * A provider never sets this — like {@link ClipSourceSchema.addonId} it is
27448
+ * stamped by the collection dispatcher, which holds the registry's projection
27449
+ * of the persisted authority (D556) and is the only place that knows it.
27450
+ */
27451
+ switchedOff: boolean().optional()
27452
+ });
27167
27453
  DeviceType.Camera, method(object({
27168
27454
  deviceId: number(),
27169
27455
  since: number(),
27170
27456
  until: number(),
27171
- limit: number().int().positive().optional()
27457
+ limit: number().int().positive().optional(),
27458
+ /**
27459
+ * View filter over {@link ClipSourceSchema.source} values — the
27460
+ * picker's selection, forwarded so a provider need not list what
27461
+ * nobody is looking at. ABSENT means every source this camera has,
27462
+ * which is the honest default for a surface whose whole point is that
27463
+ * nothing is hidden (D554 3). A provider with one source ignores it.
27464
+ */
27465
+ sources: array(string()).optional()
27172
27466
  }), array(ClipSchema).readonly(), {
27173
27467
  kind: "query",
27174
- auth: "admin"
27468
+ auth: "protected"
27469
+ }), method(object({ deviceId: number() }), array(ClipSourceSchema).readonly(), {
27470
+ kind: "query",
27471
+ auth: "protected"
27175
27472
  }), method(object({
27176
27473
  deviceId: number(),
27177
- clipId: string()
27474
+ clipId: string(),
27475
+ /**
27476
+ * Which twin to serve, on the ONE quality scale the system already has
27477
+ * (`CamProfileSchema`). `low | mid` → the sub file, `high` → the main
27478
+ * twin; both ids are already on the row so this never re-searches the
27479
+ * camera. Absent means the provider's own default (the sub file, which
27480
+ * every source is measured to hold).
27481
+ *
27482
+ * `auto` is deliberately NOT accepted here: a stored file has no
27483
+ * broker session, so the adaptive tier cannot be resolved for it. The
27484
+ * viewer resolves `auto` to a profile the same way live does, before
27485
+ * it calls (D549 15).
27486
+ */
27487
+ profile: CamProfileSchema.optional()
27178
27488
  }), ClipPlaybackSchema, {
27179
27489
  kind: "query",
27180
- auth: "admin"
27490
+ auth: "protected"
27181
27491
  });
27182
27492
  /**
27183
27493
  * Optional client-side hints sent at session creation to help the provider
@@ -41751,6 +42061,12 @@ Object.freeze({
41751
42061
  addonId: null,
41752
42062
  access: "view"
41753
42063
  },
42064
+ "videoclips.listSources": {
42065
+ capName: "videoclips",
42066
+ capScope: "device",
42067
+ addonId: null,
42068
+ access: "view"
42069
+ },
41754
42070
  "viewerUi.getStaticDir": {
41755
42071
  capName: "viewer-ui",
41756
42072
  capScope: "system",
@@ -43759,6 +44075,11 @@ Object.freeze({
43759
44075
  form: "single",
43760
44076
  optional: false
43761
44077
  }],
44078
+ "videoclips.listSources": [{
44079
+ name: "deviceId",
44080
+ form: "single",
44081
+ optional: false
44082
+ }],
43762
44083
  "waterHeater.setAway": [{
43763
44084
  name: "deviceId",
43764
44085
  form: "single",
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-omV46PMG.js");
5
+ const require_dist = require("../dist-DRDzfOnl.js");
6
6
  const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
7
7
  let node_fs = require("node:fs");
8
8
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { $t as hydrateSchema, Wt as BaseAddon, X as evaluateZoneRules, ft as motionDetectionCapability, qt as DeviceType } from "../dist-D6TktSdc.mjs";
1
+ import { $t as hydrateSchema, Wt as BaseAddon, X as evaluateZoneRules, ft as motionDetectionCapability, qt as DeviceType } from "../dist-BRT-qKlE.mjs";
2
2
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
3
3
  import { readFileSync } from "node:fs";
4
4
  import { join } from "node:path";
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require("./chunk-emK7D4bc.js");
2
- const require_dist = require("./dist-omV46PMG.js");
2
+ const require_dist = require("./dist-DRDzfOnl.js");
3
3
  let node_crypto = require("node:crypto");
4
4
  let node_fs = require("node:fs");
5
5
  node_fs = require_chunk.__toESM(node_fs, 1);
@@ -1,4 +1,4 @@
1
- import { Bt as buildFfmpegArgs, Ht as isSoftwareDecode, Lt as errMsg, zt as Fmp4BoxSplitter } from "./dist-D6TktSdc.mjs";
1
+ import { Bt as buildFfmpegArgs, Ht as isSoftwareDecode, Lt as errMsg, zt as Fmp4BoxSplitter } from "./dist-BRT-qKlE.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { realpathSync } from "node:fs";
4
4
  import path from "node:path";
@@ -3,9 +3,9 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-emK7D4bc.js");
6
- const require_dist = require("../dist-omV46PMG.js");
7
- const require_node = require("../node-1Ai8jl-y.js");
8
- const require_default_detection_model = require("../default-detection-model-CnHXu0T5.js");
6
+ const require_dist = require("../dist-DRDzfOnl.js");
7
+ const require_node = require("../node-BmTPPuIg.js");
8
+ const require_default_detection_model = require("../default-detection-model-9Solpn0K.js");
9
9
  const require_worker_protocol = require("../worker-protocol-B2MfQLlu.js");
10
10
  const require_hub_hostname = require("../hub-hostname-DAJXlOgV.js");
11
11
  const require_lazy_sharp = require("../lazy-sharp-BuwKlQLR.js");
@@ -1,6 +1,6 @@
1
- import { $ as failureContributionCapability, Lt as errMsg, S as NativeLeaseSettingsSchema, U as deriveDetailCropRect, Wt as BaseAddon, Xt as customAction, Yt as createEvent, Zt as defineCustomActions, _ as FailureCounters, _t as pickDetailCropConvention, b as MOTION_CLOSE_AFTER_MS, bn as EventCategory, bt as pipelineRunnerCapability, cn as _enum, fn as lazy, hn as object, it as loadContributionCapability, ln as array, m as DEVICE_BACKEND_TO_FORMAT, mn as number, p as DEFAULT_NATIVE_LEASE_SETTINGS, pn as literal, rn as nodePin, u as DEFAULT_DETAIL_CROP_CONVENTION, un as boolean, vn as string, vt as pickNativeLeaseOverride, x as NativeLeaseAdmissionSchema } from "../dist-D6TktSdc.mjs";
2
- import { i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-BR1TKkR_.mjs";
3
- import { a as localFrameRegistry, d as getStepDefinition, i as rootObjectGate, o as resolveFrameViewGeometry, r as macroGateVerdict } from "../default-detection-model-DMz2NcwC.mjs";
1
+ import { $ as failureContributionCapability, Lt as errMsg, S as NativeLeaseSettingsSchema, U as deriveDetailCropRect, Wt as BaseAddon, Xt as customAction, Yt as createEvent, Zt as defineCustomActions, _ as FailureCounters, _t as pickDetailCropConvention, b as MOTION_CLOSE_AFTER_MS, bn as EventCategory, bt as pipelineRunnerCapability, cn as _enum, fn as lazy, hn as object, it as loadContributionCapability, ln as array, m as DEVICE_BACKEND_TO_FORMAT, mn as number, p as DEFAULT_NATIVE_LEASE_SETTINGS, pn as literal, rn as nodePin, u as DEFAULT_DETAIL_CROP_CONVENTION, un as boolean, vn as string, vt as pickNativeLeaseOverride, x as NativeLeaseAdmissionSchema } from "../dist-BRT-qKlE.mjs";
2
+ import { i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-Dwu66ZR4.mjs";
3
+ import { a as localFrameRegistry, d as getStepDefinition, i as rootObjectGate, o as resolveFrameViewGeometry, r as macroGateVerdict } from "../default-detection-model-DCFaNnYd.mjs";
4
4
  import { t as isWorkerReply } from "../worker-protocol-C_W-P_g-.mjs";
5
5
  import { t as resolveHubHostname } from "../hub-hostname-cCknRYKj.mjs";
6
6
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require("./chunk-emK7D4bc.js");
2
- const require_dist = require("./dist-omV46PMG.js");
2
+ const require_dist = require("./dist-DRDzfOnl.js");
3
3
  let node_fs = require("node:fs");
4
4
  node_fs = require_chunk.__toESM(node_fs);
5
5
  let node_child_process = require("node:child_process");
@@ -1,4 +1,4 @@
1
- import { mt as parseProcStatus } from "./dist-D6TktSdc.mjs";
1
+ import { mt as parseProcStatus } from "./dist-BRT-qKlE.mjs";
2
2
  import * as fs from "node:fs";
3
3
  import { execFile } from "node:child_process";
4
4
  //#region src/shared/node-topology-platform.ts
@@ -3,8 +3,8 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-emK7D4bc.js");
6
- const require_dist = require("../dist-omV46PMG.js");
7
- const require_node = require("../node-1Ai8jl-y.js");
6
+ const require_dist = require("../dist-DRDzfOnl.js");
7
+ const require_node = require("../node-BmTPPuIg.js");
8
8
  const require_hub_hostname = require("../hub-hostname-DAJXlOgV.js");
9
9
  const require_restream_intent = require("../restream-intent-7uDNqMKs.js");
10
10
  const require_retire_root_keys = require("../retire-root-keys-Csb8z2f3.js");
@@ -11091,7 +11091,8 @@ Object.freeze({
11091
11091
  "storage-occupancy": ["getOccupancy"],
11092
11092
  "storage-provider": ["list"],
11093
11093
  "turn-provider": ["getTurnServers"],
11094
- "user-passkeys": ["listPasskeys"]
11094
+ "user-passkeys": ["listPasskeys"],
11095
+ "videoclips": ["listClips", "listSources"]
11095
11096
  });
11096
11097
  /**
11097
11098
  * Build the recorder's config mirror.
@@ -1,5 +1,5 @@
1
- import { $t as hydrateSchema, C as OpsLogEntrySchema, Ct as recordingExportCapability, D as RECORDING_EXPORT_MAX_READ_BYTES, Dt as resolveLocationMode, H as deriveBatteryPresence, I as batteryCapability, Kt as DeviceFeature, Lt as errMsg, Mt as storageOccupancyCapability, O as RecordingConfigSchema, Pt as stripRetiredBandPreBufferSec, Q as evictionPolicyOfLocation, St as recordingCapability, W as deriveRecordingMode, Wt as BaseAddon, Xt as customAction, Y as evaluateSensorEdge, Z as evictionPolicyForMode, Zt as defineCustomActions, _n as record, bn as EventCategory, cn as _enum, ct as mayReadLocation, d as DEFAULT_EVENTS_BAND_BUFFER_SEC, dt as modeMayWrite, et as gbToBytes, g as ExportRecordSchema, gn as preprocess, hn as object, i as BatteryStatusSchema, it as loadContributionCapability, jt as storageEvictableCapability, k as RecordingSignalStatusSchema, kt as resolveRecordingProfiles, ln as array, lt as mayWriteToLocation, mn as number, on as selectAssignedProfileSlots, qt as DeviceType, rn as nodePin, rt as isFirstLevelMacroClass, sn as sleep$1, un as boolean, ut as migrateLegacyDeviceSignalConfig, vn as string, wt as recordingSignalCapability } from "../dist-D6TktSdc.mjs";
2
- import { a as physicalRootOf, i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-BR1TKkR_.mjs";
1
+ import { $t as hydrateSchema, C as OpsLogEntrySchema, Ct as recordingExportCapability, D as RECORDING_EXPORT_MAX_READ_BYTES, Dt as resolveLocationMode, H as deriveBatteryPresence, I as batteryCapability, Kt as DeviceFeature, Lt as errMsg, Mt as storageOccupancyCapability, O as RecordingConfigSchema, Pt as stripRetiredBandPreBufferSec, Q as evictionPolicyOfLocation, St as recordingCapability, W as deriveRecordingMode, Wt as BaseAddon, Xt as customAction, Y as evaluateSensorEdge, Z as evictionPolicyForMode, Zt as defineCustomActions, _n as record, bn as EventCategory, cn as _enum, ct as mayReadLocation, d as DEFAULT_EVENTS_BAND_BUFFER_SEC, dt as modeMayWrite, et as gbToBytes, g as ExportRecordSchema, gn as preprocess, hn as object, i as BatteryStatusSchema, it as loadContributionCapability, jt as storageEvictableCapability, k as RecordingSignalStatusSchema, kt as resolveRecordingProfiles, ln as array, lt as mayWriteToLocation, mn as number, on as selectAssignedProfileSlots, qt as DeviceType, rn as nodePin, rt as isFirstLevelMacroClass, sn as sleep$1, un as boolean, ut as migrateLegacyDeviceSignalConfig, vn as string, wt as recordingSignalCapability } from "../dist-BRT-qKlE.mjs";
2
+ import { a as physicalRootOf, i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-Dwu66ZR4.mjs";
3
3
  import { t as resolveHubHostname } from "../hub-hostname-cCknRYKj.mjs";
4
4
  import { d as PREBUFFER_MAX_MS, l as withRecordingIntent, r as RECORDING_PRE_ROLL_REQUEST_MS } from "../restream-intent-DyGmLAU9.mjs";
5
5
  import { n as RowMapStore, t as retireRootKeys } from "../retire-root-keys-DZvlso2l.mjs";
@@ -11084,7 +11084,8 @@ Object.freeze({
11084
11084
  "storage-occupancy": ["getOccupancy"],
11085
11085
  "storage-provider": ["list"],
11086
11086
  "turn-provider": ["getTurnServers"],
11087
- "user-passkeys": ["listPasskeys"]
11087
+ "user-passkeys": ["listPasskeys"],
11088
+ "videoclips": ["listClips", "listSources"]
11088
11089
  });
11089
11090
  /**
11090
11091
  * Build the recorder's config mirror.
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require("./chunk-emK7D4bc.js");
2
- const require_dist = require("./dist-omV46PMG.js");
2
+ const require_dist = require("./dist-DRDzfOnl.js");
3
3
  let node_child_process = require("node:child_process");
4
4
  //#region ../../node_modules/mp4box/dist/mp4box.all.js
5
5
  var require_mp4box_all = /* @__PURE__ */ require_chunk.__commonJSMin(((exports) => {
@@ -1,5 +1,5 @@
1
1
  import { r as __toESM, t as __commonJSMin } from "./chunk-DnnnRqeS.mjs";
2
- import { Lt as errMsg } from "./dist-D6TktSdc.mjs";
2
+ import { Lt as errMsg } from "./dist-BRT-qKlE.mjs";
3
3
  import { spawn } from "node:child_process";
4
4
  //#region ../../node_modules/mp4box/dist/mp4box.all.js
5
5
  var require_mp4box_all = /* @__PURE__ */ __commonJSMin(((exports) => {
@@ -1,7 +1,7 @@
1
- import { a as e, c as t, d as n, f as r, i, l as a, n as o, o as s, p as c, r as l, s as u, t as d, u as f } from "./_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-CeR_IxxU.mjs";
1
+ import { a as e, c as t, d as n, f as r, i, l as a, n as o, o as s, p as c, r as l, s as u, t as d, u as f } from "./_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-C8RTK6nJ.mjs";
2
2
  import { a as p, i as m, n as h, o as g, r as _, t as v } from "./_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare__react__loadShare__.js-C9j-2lBe.mjs";
3
3
  import { n as y, r as b, t as x } from "./_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-XO0-Pyu6.mjs";
4
- import { t as S } from "./_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-GublMTFG.mjs";
4
+ import { t as S } from "./_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-C_SEu7AC.mjs";
5
5
  import { n as C, t as w } from "./_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-BO7TIbJV.mjs";
6
6
  //#region ../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
7
7
  var T = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim(), E = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), D = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), O = (e) => {
@@ -18,7 +18,7 @@ var e = {
18
18
  },
19
19
  "@camstack/types": {
20
20
  name: "@camstack/types",
21
- version: "1.2.231",
21
+ version: "1.2.234",
22
22
  scope: ["default"],
23
23
  loaded: !1,
24
24
  from: "addon_stream_broker_widgets",
@@ -33,7 +33,7 @@ var e = {
33
33
  },
34
34
  "@camstack/ui-library": {
35
35
  name: "@camstack/ui-library",
36
- version: "1.2.189",
36
+ version: "1.2.190",
37
37
  scope: ["default"],
38
38
  loaded: !1,
39
39
  from: "addon_stream_broker_widgets",