@camstack/types 1.2.245 → 1.2.246

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_sleep = require("./sleep-Da9UCU5_.js");
2
+ const require_sleep = require("./sleep-DWUJM120.js");
3
3
  const require_event_category = require("./event-category-BVfsrBYA.js");
4
4
  const require_canonical_hash = require("./canonical-hash-CSE4ioRi.js");
5
5
  const require_enums = require("./enums.js");
@@ -858,6 +858,56 @@ function isIsolatedBuiltin(decl) {
858
858
  return decl.execution?.isolate === true;
859
859
  }
860
860
  //#endregion
861
+ //#region src/interfaces/addon-peer-bytes.ts
862
+ /**
863
+ * How long a minted ticket stays takeable.
864
+ *
865
+ * The consumer's dial is the next thing that happens after the cap call that
866
+ * minted it returns — measured well under 100 ms on the same host for the clip
867
+ * dial this is generalised from. Thirty seconds covers a busy hub and is short
868
+ * enough that a ticket which leaked into a log is worth nothing by the time
869
+ * anybody reads it.
870
+ */
871
+ var PEER_BYTES_TICKET_TTL_MS = 3e4;
872
+ /**
873
+ * Tickets minted and not yet taken or expired, per addon process.
874
+ *
875
+ * A bound, not a budget: it exists so a caller that mints and never dials
876
+ * cannot grow a map without limit, and so a per-frame misuse of this facility
877
+ * is refused by name rather than working slowly.
878
+ */
879
+ var PEER_BYTES_MAX_OUTSTANDING = 64;
880
+ /**
881
+ * How long the producer waits on a consumer that has stopped reading before it
882
+ * cuts the body.
883
+ *
884
+ * D447: a raw HTTP stream reads no chunk the socket has not taken. The producer
885
+ * honours `write()`'s return and awaits `drain`; a peer that never drains is
886
+ * a peer that is gone, and holding the body for it is the unbounded buffer this
887
+ * whole facility exists to avoid.
888
+ */
889
+ var PEER_BYTES_STALL_MS = 15e3;
890
+ /** Bytes handed to the socket per `write()` when the producer holds a buffer. */
891
+ var PEER_BYTES_CHUNK_BYTES = 256 * 1024;
892
+ /** The wire shape of {@link PeerBytesTicket} — see the type for what it is. */
893
+ var PeerBytesTicketSchema = zod.z.object({
894
+ /** `http://127.0.0.1:<port>/<token>`. One `GET` takes it. */
895
+ url: zod.z.string().min(1),
896
+ /**
897
+ * The HOST node this URL means something on — the hub or a named agent,
898
+ * never a runner. {@link AddonPeerBytes.open} compares it to its own and
899
+ * refuses `cross-node` by name when they differ, without dialling.
900
+ */
901
+ hostNodeId: zod.z.string().min(1),
902
+ expiresAtMs: zod.z.number().int().nonnegative(),
903
+ /**
904
+ * What the producer DECLARED the body to be, when it knows — `null` when it
905
+ * does not. Never `0` for unknown (D393): a consumer sizing a bound off this
906
+ * must be able to tell "the producer did not say" from "the body is empty".
907
+ */
908
+ declaredBytes: zod.z.number().int().nonnegative().nullable()
909
+ });
910
+ //#endregion
861
911
  //#region src/interfaces/adoption-job.ts
862
912
  /**
863
913
  * Adoption job — the background form of `device-adoption.adopt`.
@@ -27482,6 +27532,7 @@ var ClipStillRefusalCodeSchema = zod.z.enum([
27482
27532
  "sleeping",
27483
27533
  "camera-refused",
27484
27534
  "no-keyframe",
27535
+ "decode-failed",
27485
27536
  "no-catalog-row",
27486
27537
  "unsupported",
27487
27538
  "unknown-device",
@@ -27799,12 +27850,37 @@ var ClipWakeSchema = zod.z.enum(["authorised"]);
27799
27850
  * the size in the message, never truncates. Half a video is worse than an
27800
27851
  * honest refusal.
27801
27852
  *
27802
- * The clean follow-on is a CHUNKED read so a `high` twin of a long clip stops
27803
- * being refusable at all. That is a later slice, named here so the bound is
27804
- * not mistaken for a design ceiling.
27853
+ * **Superseded as the way a clip export gets its bytes** (D613). The bound is
27854
+ * a property of the ENVELOPE, not of clips, so the cure was a transport with
27855
+ * no envelope: {@link videoclipsCapability.methods.offerClipBytes} hands back
27856
+ * a one-shot `peerBytes` ticket and the consumer streams it straight to disk,
27857
+ * holding nothing. This method stays for a consumer that genuinely wants the
27858
+ * bytes in hand, and for a provider not yet redeployed — with this bound,
27859
+ * which for an inline read is not going to move.
27805
27860
  */
27806
27861
  var VIDEOCLIPS_MAX_READ_BYTES = 50 * 1024 * 1024;
27807
27862
  /**
27863
+ * Hard ceiling on ONE {@link videoclipsCapability.methods.offerClipBytes}
27864
+ * transfer — ten times {@link VIDEOCLIPS_MAX_READ_BYTES}, and the reasoning is
27865
+ * not "ten times more comfortable".
27866
+ *
27867
+ * The inline bound is set by what is HELD: a base64 envelope is the payload at
27868
+ * ~1.33× in the provider AND the same again in the caller, so 50 MiB of clip
27869
+ * is ~133 MiB of heap across two processes. Over `peerBytes` the consumer
27870
+ * holds one socket chunk at a time and writes straight through to the export
27871
+ * file, so its contribution is flat whatever the clip weighs. What is left is
27872
+ * the PRODUCER's own copy, and that is a property of how each provider makes a
27873
+ * clip rather than of this transport: Hikvision's fetch writes to a scratch
27874
+ * FILE and offers it (nothing is held), Reolink's cmd-5 transfer is collected
27875
+ * in memory and offered from there (one copy, the one it already had).
27876
+ *
27877
+ * So this number bounds the worst provider, not the transport, and it is named
27878
+ * separately so that lifting it is a statement about a provider rather than
27879
+ * about clips. Above it the provider REFUSES with the size in the message and
27880
+ * never truncates: half a video is worse than an honest refusal.
27881
+ */
27882
+ var VIDEOCLIPS_MAX_OFFER_BYTES = 500 * 1024 * 1024;
27883
+ /**
27808
27884
  * A clip's finished bytes, inline — the twin of `recordingExport.readExportBytes`.
27809
27885
  *
27810
27886
  * `bytes` is the DECODED length, so nobody infers it from the base64 length,
@@ -27836,6 +27912,32 @@ var ClipBytesSchema = zod.z.object({
27836
27912
  durationMs: zod.z.number().positive().optional()
27837
27913
  });
27838
27914
  /**
27915
+ * Where a clip's finished bytes can be TAKEN (D613) — the answer to
27916
+ * {@link videoclipsCapability.methods.offerClipBytes}.
27917
+ *
27918
+ * Everything {@link ClipBytesSchema} carries except the bytes themselves, plus
27919
+ * the one-shot ticket that leads to them. The metadata is answered BEFORE the
27920
+ * transfer on purpose: a consumer learns which twin it got, what to call the
27921
+ * file and how long the clip runs without having to read a byte, so a decision
27922
+ * it would make on that metadata (a wrong twin, an implausible duration) costs
27923
+ * no transfer at all.
27924
+ */
27925
+ var ClipBytesOfferSchema = zod.z.object({
27926
+ /**
27927
+ * One shot, seconds-long, loopback, on the PROVIDER's own host. Open it with
27928
+ * `ctx.peerBytes.open(...)`, which refuses a ticket from another node by
27929
+ * name rather than dialling a port that means something else here.
27930
+ */
27931
+ ticket: PeerBytesTicketSchema,
27932
+ contentType: zod.z.string(),
27933
+ /** Suggested filename, extension included. */
27934
+ name: zod.z.string(),
27935
+ /** Which twin was actually served — see {@link ClipBytesSchema.served}. */
27936
+ served: require_sleep.CamProfileSchema,
27937
+ /** See {@link ClipBytesSchema.durationMs}. Absent when nothing measured it. */
27938
+ durationMs: zod.z.number().positive().optional()
27939
+ });
27940
+ /**
27839
27941
  * Where a clip's STREAM can be dialled (D597) — the answer to
27840
27942
  * {@link videoclipsCapability.methods.dialClipStream}.
27841
27943
  *
@@ -27911,6 +28013,105 @@ var ClipStreamDialSchema = zod.z.object({
27911
28013
  /** Why `servedAudio` is `none` although sound was asked for. */
27912
28014
  audioReason: ClipStreamAudioReasonSchema.optional()
27913
28015
  });
28016
+ /**
28017
+ * The playback rates a clip can be DELIVERED at, ascending, always with `1`.
28018
+ *
28019
+ * These are the BROKER's: it re-paces frames it has already demuxed — the
28020
+ * `MonotonicClock` divides source elapsed time by the factor and the pacer
28021
+ * pushes that much faster — so the domain is the recorded one, {0} ∪ [0.25, 4],
28022
+ * and this is the discrete ladder drawn from it. `1.5` is in it because a
28023
+ * re-pacer has no reason to refuse it.
28024
+ *
28025
+ * `8` and `16` are deliberately NOT here. They are the CAMERA's own
28026
+ * `<playSpeed>` (Reolink cmd-5 replay), a different mechanism, still unwired
28027
+ * (D597, D600) — a rate change there costs a new dial and a new stream, and
28028
+ * the camera's 8x would need a resample the clip audio path has no decoder
28029
+ * for. Offering them today accepts a rate and delivers 1x, which is the whole
28030
+ * defect this list exists to end (D612). When `playSpeed` IS wired its rates
28031
+ * join THIS array — a second list elsewhere is the second authority D62
28032
+ * forbids.
28033
+ *
28034
+ * Every entry must survive the broker's `clampPlaybackRate` unchanged: a set
28035
+ * that offers what the clamp then moves is the same lie one step later.
28036
+ */
28037
+ var CLIP_BROKER_PACED_RATES = [
28038
+ .25,
28039
+ .5,
28040
+ 1,
28041
+ 1.5,
28042
+ 2,
28043
+ 4
28044
+ ];
28045
+ /**
28046
+ * The rates a REALTIME-BOUND stream can be delivered at.
28047
+ *
28048
+ * **Measured, and it is the whole reason this second ladder exists.** A
28049
+ * Hikvision RTSP replay is not a fast fetch: it delivers the recording at the
28050
+ * speed it was recorded. On 1436, 2026-09-23, one stream carried 176 access
28051
+ * units in 14 274 ms of wall clock at a measured 12.5 fps — 14.08 s of media
28052
+ * in 14.27 s, **1.01× realtime** — and a whole 18 s clip took 22.3 s to fetch
28053
+ * end to end. Reolink's cmd-5 transfer, which {@link CLIP_BROKER_PACED_RATES}
28054
+ * was written for, lands the same bytes at 49–62× and therefore has the entire
28055
+ * clip in hand within the first second.
28056
+ *
28057
+ * The broker's pacer consumes `rate` seconds of media per second of wall
28058
+ * clock while the socket supplies one. So at any rate above 1 the buffer
28059
+ * drains at `(rate − 1)×` and a stream that is only seconds old runs dry
28060
+ * almost at once — the viewer stops, the queue empties, and the provider's
28061
+ * own drain gate eventually reports `peer-stalled`. Nothing about that is a
28062
+ * bug to be fixed with a bigger buffer: there is no buffer, because the bytes
28063
+ * do not exist yet.
28064
+ *
28065
+ * So the honest answer is the DECLARATION (D612's own rule, applied to the
28066
+ * case it did not yet have): a rate this transport cannot deliver is never
28067
+ * offered. Below 1 is free — a slower pacer only lets the buffer grow.
28068
+ *
28069
+ * When a clip is served from a FILE the constraint is gone with the transport,
28070
+ * which is why `file` keeps the full ladder.
28071
+ */
28072
+ var CLIP_REALTIME_SOURCE_RATES = [
28073
+ .25,
28074
+ .5,
28075
+ 1
28076
+ ];
28077
+ /**
28078
+ * What a surface may DRAW for this provider's clips — the answer to
28079
+ * {@link videoclipsCapability.methods.getPlaybackOptions} (D612).
28080
+ *
28081
+ * The envelope is a PROVIDER fact, not a clip fact, and that is measured, not
28082
+ * assumed: the broker's `chooseClipPath` reads exactly two inputs — whether
28083
+ * `dialClipStream` and `readClipBytes` are wired — and both are constants of
28084
+ * the broker's own closure over the provider's methods. The `profile` it is
28085
+ * handed is explicitly not read. So every clip of a provider is served the
28086
+ * same way, and a per-clip channel carried a value that could not vary. The
28087
+ * per-clip `clipTransport` server message was removed for exactly that reason.
28088
+ *
28089
+ * Queried per camera, before a clip is picked, so a control is rendered or
28090
+ * DISABLED rather than offered and refused at play time (D62: a disabled
28091
+ * control reads as unavailable, one that undoes the gesture reads as broken).
28092
+ */
28093
+ var ClipPlaybackOptionsSchema = zod.z.object({
28094
+ /**
28095
+ * How this provider's clips reach the player. `stream` is the provider's
28096
+ * forward-only fMP4 (D597); `file` is one bounded by-handle fetch of the
28097
+ * whole clip, `stbl` indexed (D575).
28098
+ */
28099
+ transport: zod.z.enum(["stream", "file"]),
28100
+ /** `forward` = only ahead of the playhead. `free` = anywhere. */
28101
+ seek: zod.z.enum(["forward", "free"]),
28102
+ /** Frame-step BACKWARD is meaningful. Forward always is. */
28103
+ stepBack: zod.z.boolean(),
28104
+ /** Whether the scrub gesture is served, as opposed to refused by name. */
28105
+ scrub: zod.z.boolean(),
28106
+ /**
28107
+ * The rates that can be delivered, ascending, always containing `1`. The
28108
+ * viewer draws its picker from this and from nothing else — a constant it
28109
+ * keeps instead is the second authority that produced the defect: `8` and
28110
+ * `16` were offered, the broker clamped them to `4`, and no line anywhere
28111
+ * said so. `0` is not a member: pause is the absence of a rate.
28112
+ */
28113
+ rates: zod.z.array(zod.z.number().positive()).min(1).readonly()
28114
+ });
27914
28115
  var ClipSourceAvailabilitySchema = zod.z.object({
27915
28116
  state: zod.z.enum([
27916
28117
  "ok",
@@ -28089,14 +28290,18 @@ var videoclipsCapability = {
28089
28290
  *
28090
28291
  * `getClipPlayback` is the right answer for a player: it hands back a URL
28091
28292
  * on a plane the hub serves `access:'authenticated'`, which a browser and a
28092
- * viewer session satisfy. It is the wrong answer for another ADDON. There
28093
- * is no addon→addon byte transport in this framework — `AddonDataPlane`
28094
- * only lets an addon SERVE, on `127.0.0.1` behind a per-listener secret
28095
- * only the hub may present — so a recorder that wants a camera's clip
28096
- * cannot fetch that URL. This method is the one seam that exists for it,
28097
- * and it is deliberately the same shape (and the same bound) as
28098
- * `recordingExport.readExportBytes`, which exists for the mirror-image
28099
- * reason.
28293
+ * viewer session satisfy. It is the wrong answer for another ADDON: the
28294
+ * hub's proxy in front of that plane takes only a user credential, which
28295
+ * an addon does not hold, so a recorder that wants a camera's clip cannot
28296
+ * fetch that URL. This method is the shape that answer forced — the same
28297
+ * one (and the same bound) as `recordingExport.readExportBytes`.
28298
+ *
28299
+ * **It is no longer the only seam.** Until D613 there was no addon→addon
28300
+ * byte transport at all; there is now
28301
+ * ({@link offerClipBytes}, over `ctx.peerBytes`), it holds nothing on
28302
+ * either side, and it is what a clip EXPORT uses. This method remains for
28303
+ * a consumer that genuinely wants the bytes in hand, and as the named
28304
+ * fallback for a provider not yet redeployed.
28100
28305
  *
28101
28306
  * Routing needs no `provider` pin: the id is source-prefixed and
28102
28307
  * self-contained, so `device-collection-dispatch.ts` rule 3 hands the call
@@ -28163,6 +28368,65 @@ var videoclipsCapability = {
28163
28368
  auth: "protected"
28164
28369
  }),
28165
28370
  /**
28371
+ * Where this clip's finished bytes can be TAKEN — the by-handle read a
28372
+ * clip EXPORT pulls, over the addon→addon byte transport (D613).
28373
+ *
28374
+ * This is {@link readClipBytes} with the envelope removed. Same gates,
28375
+ * same vocabulary, same completion rules, same `served` contract — the
28376
+ * only difference is that the bytes travel over a one-shot loopback
28377
+ * socket instead of inside a base64 field, so neither side holds the
28378
+ * payload whole and the 50 MiB refusal on a long `high` twin stops
28379
+ * existing. The bound that remains is
28380
+ * {@link VIDEOCLIPS_MAX_OFFER_BYTES}, and it bounds the PRODUCER's own
28381
+ * copy rather than the transport.
28382
+ *
28383
+ * **The ticket is loopback and same-host.** A provider on an agent mints a
28384
+ * URL that means nothing on the hub, and `ctx.peerBytes.open` refuses it
28385
+ * `cross-node` by name rather than dialling whatever else holds that port
28386
+ * here. A consumer that can be on the other side of a node boundary from
28387
+ * its provider must be able to read that refusal and say so; it must not
28388
+ * treat it as "no bytes".
28389
+ *
28390
+ * **A ticket is a one-shot bearer credential with a seconds-long life.**
28391
+ * Take it immediately, never persist it, never log its `url`. An untaken
28392
+ * ticket costs the provider one map entry until its TTL, and outstanding
28393
+ * tickets are bounded — which is also what makes a per-frame misuse of
28394
+ * this method refuse by name rather than work slowly (D9/D18: this is a
28395
+ * by-handle fetch of finished media, not a frame pipe).
28396
+ *
28397
+ * Optional on the provider for the same reason `readClipBytes` is: a
28398
+ * source with no camera socket behind it has no bytes. A provider that
28399
+ * predates this method answers `NOT_IMPLEMENTED`, and a consumer may fall
28400
+ * back to `readClipBytes` — but it says so in the log, with the deploy
28401
+ * hint, because that fallback re-imposes the 50 MiB refusal and an
28402
+ * operator who sees `too-large-to-transfer` after this shipped is looking
28403
+ * at a stale addon, not at a clip that cannot be exported.
28404
+ */
28405
+ offerClipBytes: require_sleep.optionalMethod(zod.z.object({
28406
+ deviceId: zod.z.number(),
28407
+ clipId: zod.z.string().min(1),
28408
+ /** WHICH provider holds the bytes — see `readClipBytes.provider`. */
28409
+ provider: zod.z.string().min(1),
28410
+ /** Which twin — `low | mid` → the sub file, `high` → the main twin. */
28411
+ profile: require_sleep.CamProfileSchema.optional(),
28412
+ /**
28413
+ * The CALLER's byte bound, so an over-size clip is refused before the
28414
+ * camera is touched rather than after. Capped by
28415
+ * {@link VIDEOCLIPS_MAX_OFFER_BYTES} whatever is passed; absent means
28416
+ * that ceiling.
28417
+ */
28418
+ maxBytes: zod.z.number().int().positive().optional(),
28419
+ /**
28420
+ * The operator's authorisation to wake a sleeping camera for this
28421
+ * read. Absent — the default — means a sleeping standalone battery
28422
+ * camera is REFUSED by name, before any session is opened.
28423
+ */
28424
+ wake: ClipWakeSchema.optional()
28425
+ }), ClipBytesOfferSchema, {
28426
+ kind: "query",
28427
+ auth: "protected"
28428
+ }),
28429
+ /**
28166
28430
  * Where this clip's STREAM can be dialled (D597) — the forward-only
28167
28431
  * fMP4 the provider writes from the first muxed byte, for the broker to
28168
28432
  * play through the same WebRTC session as recorded footage, with the
@@ -28199,9 +28463,87 @@ var videoclipsCapability = {
28199
28463
  }), ClipStreamDialSchema, {
28200
28464
  kind: "query",
28201
28465
  auth: "protected"
28466
+ }),
28467
+ /**
28468
+ * What a surface may DRAW for this provider's clips: the rates it can be
28469
+ * played at, whether scrub is served, how far a position may be moved,
28470
+ * and whether a backward frame-step means anything (D612).
28471
+ *
28472
+ * **The only authority.** The per-clip `clipTransport` server message
28473
+ * that used to carry the same answer was removed: the broker's transport
28474
+ * choice reads nothing that varies per clip, so the clip level had no
28475
+ * information the provider does not already have, and two channels that
28476
+ * can disagree are worse than one (D62).
28477
+ *
28478
+ * Asked per camera and per provider, so it must stay CHEAP — it is a
28479
+ * statement about wiring, answered from a constant, never a call to the
28480
+ * camera. A provider answers with one of {@link CLIP_PLAYBACK_OPTIONS}
28481
+ * and never composes an envelope of its own.
28482
+ *
28483
+ * Optional, and absence is load-bearing: a provider that has not answered
28484
+ * has not restricted anything, and a viewer reads it as the freedom it
28485
+ * always had. See D612 on the rollout order that absence implies.
28486
+ */
28487
+ getPlaybackOptions: require_sleep.optionalMethod(zod.z.object({
28488
+ deviceId: zod.z.number(),
28489
+ /** WHICH provider to ask — the `addonId` a {@link ClipSourceSchema}
28490
+ * row carries. Required for the same reason `listClips` requires it:
28491
+ * a collection cap has no "the bound one" to resolve to (D554). */
28492
+ provider: zod.z.string().min(1)
28493
+ }), ClipPlaybackOptionsSchema, {
28494
+ kind: "query",
28495
+ auth: "protected"
28202
28496
  })
28203
28497
  }
28204
28498
  };
28499
+ /**
28500
+ * NOTE ON PLACEMENT: this block lives AFTER the capability definition on
28501
+ * purpose. `scripts/lib/parse-cap.ts` finds a cap by the FIRST
28502
+ * `export const <X> = {` in the file, so an object literal declared above
28503
+ * `videoclipsCapability` is silently taken for the capability itself and
28504
+ * codegen emits a `DeviceProxy` entry that does not type-check. Found the
28505
+ * hard way, 2026-09-23.
28506
+ */
28507
+ /**
28508
+ * The two envelopes, spelled ONCE.
28509
+ *
28510
+ * A provider answers with the entry for the transport its own wiring buys —
28511
+ * `stream` if it implements `dialClipStream`, `file` if it implements only
28512
+ * `readClipBytes` — and never composes one of its own. One table is what
28513
+ * makes "the provider may not promise what no clip can be given" structural
28514
+ * instead of a discipline: there is nothing else to promise.
28515
+ */
28516
+ var CLIP_PLAYBACK_OPTIONS = {
28517
+ stream: {
28518
+ transport: "stream",
28519
+ seek: "forward",
28520
+ stepBack: false,
28521
+ scrub: false,
28522
+ rates: CLIP_BROKER_PACED_RATES
28523
+ },
28524
+ /**
28525
+ * A `stream` whose SOURCE runs at realtime — a Hikvision RTSP replay.
28526
+ *
28527
+ * Same verbs as `stream`, a shorter rate ladder, and the difference is a
28528
+ * measurement rather than a preference: see
28529
+ * {@link CLIP_REALTIME_SOURCE_RATES}. A third entry rather than a parameter,
28530
+ * because a provider must still be able to do nothing but NAME one of these.
28531
+ */
28532
+ realtimeStream: {
28533
+ transport: "stream",
28534
+ seek: "forward",
28535
+ stepBack: false,
28536
+ scrub: false,
28537
+ rates: CLIP_REALTIME_SOURCE_RATES
28538
+ },
28539
+ file: {
28540
+ transport: "file",
28541
+ seek: "free",
28542
+ stepBack: true,
28543
+ scrub: true,
28544
+ rates: CLIP_BROKER_PACED_RATES
28545
+ }
28546
+ };
28205
28547
  //#endregion
28206
28548
  //#region src/capabilities/webrtc-session.cap.ts
28207
28549
  /**
@@ -54706,6 +55048,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
54706
55048
  addonId: null,
54707
55049
  access: "view"
54708
55050
  },
55051
+ "videoclips.getPlaybackOptions": {
55052
+ capName: "videoclips",
55053
+ capScope: "device",
55054
+ addonId: null,
55055
+ access: "view"
55056
+ },
54709
55057
  "videoclips.listClips": {
54710
55058
  capName: "videoclips",
54711
55059
  capScope: "device",
@@ -54718,6 +55066,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
54718
55066
  addonId: null,
54719
55067
  access: "view"
54720
55068
  },
55069
+ "videoclips.offerClipBytes": {
55070
+ capName: "videoclips",
55071
+ capScope: "device",
55072
+ addonId: null,
55073
+ access: "view"
55074
+ },
54721
55075
  "videoclips.readClipBytes": {
54722
55076
  capName: "videoclips",
54723
55077
  capScope: "device",
@@ -57095,6 +57449,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
57095
57449
  form: "single",
57096
57450
  optional: false
57097
57451
  }],
57452
+ "videoclips.getPlaybackOptions": [{
57453
+ name: "deviceId",
57454
+ form: "single",
57455
+ optional: false
57456
+ }],
57098
57457
  "videoclips.listClips": [{
57099
57458
  name: "deviceId",
57100
57459
  form: "single",
@@ -57105,6 +57464,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
57105
57464
  form: "single",
57106
57465
  optional: false
57107
57466
  }],
57467
+ "videoclips.offerClipBytes": [{
57468
+ name: "deviceId",
57469
+ form: "single",
57470
+ optional: false
57471
+ }],
57108
57472
  "videoclips.readClipBytes": [{
57109
57473
  name: "deviceId",
57110
57474
  form: "single",
@@ -62727,6 +63091,9 @@ exports.CAP_NAMES_WITH_STATUS = CAP_NAMES_WITH_STATUS;
62727
63091
  exports.CAP_NODE_PIN_CONTEXT_KEY = require_sleep.CAP_NODE_PIN_CONTEXT_KEY;
62728
63092
  exports.CAP_PROVIDER_KIND_MAP = CAP_PROVIDER_KIND_MAP;
62729
63093
  exports.CLASS_MAP_MACRO_TARGETS = CLASS_MAP_MACRO_TARGETS;
63094
+ exports.CLIP_BROKER_PACED_RATES = CLIP_BROKER_PACED_RATES;
63095
+ exports.CLIP_PLAYBACK_OPTIONS = CLIP_PLAYBACK_OPTIONS;
63096
+ exports.CLIP_REALTIME_SOURCE_RATES = CLIP_REALTIME_SOURCE_RATES;
62730
63097
  exports.CLIP_REASON_HEADER_MAX = CLIP_REASON_HEADER_MAX;
62731
63098
  exports.CLIP_STILL_DISPOSITION_HEADER = CLIP_STILL_DISPOSITION_HEADER;
62732
63099
  exports.CLIP_STILL_REASON_CODE_HEADER = CLIP_STILL_REASON_CODE_HEADER;
@@ -62783,8 +63150,10 @@ exports.CarbonMonoxideStatusSchema = CarbonMonoxideStatusSchema;
62783
63150
  exports.ChargingStatus = require_sleep.ChargingStatus;
62784
63151
  exports.ClientNetworkStatsSchema = ClientNetworkStatsSchema;
62785
63152
  exports.ClimateControlStatusSchema = ClimateControlStatusSchema;
63153
+ exports.ClipBytesOfferSchema = ClipBytesOfferSchema;
62786
63154
  exports.ClipBytesSchema = ClipBytesSchema;
62787
63155
  exports.ClipExportFailureSchema = ClipExportFailureSchema;
63156
+ exports.ClipPlaybackOptionsSchema = ClipPlaybackOptionsSchema;
62788
63157
  exports.ClipPlaybackSchema = ClipPlaybackSchema;
62789
63158
  exports.ClipSchema = ClipSchema;
62790
63159
  exports.ClipSourceAvailabilitySchema = ClipSourceAvailabilitySchema;
@@ -63358,6 +63727,10 @@ exports.OsdSourceOptionSchema = OsdSourceOptionSchema;
63358
63727
  exports.OsdSourceSchema = OsdSourceSchema;
63359
63728
  exports.OsdSourceValueTypeEnum = OsdSourceValueTypeEnum;
63360
63729
  exports.OsdStatusSchema = OsdStatusSchema;
63730
+ exports.PEER_BYTES_CHUNK_BYTES = PEER_BYTES_CHUNK_BYTES;
63731
+ exports.PEER_BYTES_MAX_OUTSTANDING = PEER_BYTES_MAX_OUTSTANDING;
63732
+ exports.PEER_BYTES_STALL_MS = PEER_BYTES_STALL_MS;
63733
+ exports.PEER_BYTES_TICKET_TTL_MS = PEER_BYTES_TICKET_TTL_MS;
63361
63734
  exports.PET_FEEDER_MANUAL_FEED_MAX = PET_FEEDER_MANUAL_FEED_MAX;
63362
63735
  exports.PET_FEEDER_MANUAL_FEED_MIN = PET_FEEDER_MANUAL_FEED_MIN;
63363
63736
  exports.PIPELINE_ANALYTICS_CAP_NAME = PIPELINE_ANALYTICS_CAP_NAME;
@@ -63376,6 +63749,7 @@ exports.ParkedTrackFrameSchema = ParkedTrackFrameSchema;
63376
63749
  exports.PasskeyLoginMethodSchema = PasskeyLoginMethodSchema;
63377
63750
  exports.PasskeySummarySchema = PasskeySummarySchema;
63378
63751
  exports.PcmSampleFormatSchema = PcmSampleFormatSchema;
63752
+ exports.PeerBytesTicketSchema = PeerBytesTicketSchema;
63379
63753
  exports.PerScopeBreakdownSchema = PerScopeBreakdownSchema;
63380
63754
  exports.PetFeederStatusSchema = PetFeederStatusSchema;
63381
63755
  exports.PickStreamPreferencesSchema = PickStreamPreferencesSchema;
@@ -63712,6 +64086,7 @@ exports.UpdateStatusSchema = UpdateStatusSchema;
63712
64086
  exports.UpdateUserInputSchema = UpdateUserInputSchema;
63713
64087
  exports.UserRecordSchema = UserRecordSchema;
63714
64088
  exports.UserSummarySchema = UserSummarySchema;
64089
+ exports.VIDEOCLIPS_MAX_OFFER_BYTES = VIDEOCLIPS_MAX_OFFER_BYTES;
63715
64090
  exports.VIDEOCLIPS_MAX_READ_BYTES = VIDEOCLIPS_MAX_READ_BYTES;
63716
64091
  exports.VISIT_MERGE_GAP_MS = VISIT_MERGE_GAP_MS;
63717
64092
  exports.VacuumControlStatusSchema = VacuumControlStatusSchema;