@camstack/addon-agent-ui 1.2.139 → 1.2.140

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 (2) hide show
  1. package/dist/addon.js +139 -2
  2. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -5361,7 +5361,7 @@ var ZodIssueCode = {
5361
5361
  var ZodFirstPartyTypeKind;
5362
5362
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5363
5363
  //#endregion
5364
- //#region ../types/dist/sleep-i3eUVc-d.mjs
5364
+ //#region ../types/dist/sleep-COWaSCAi.mjs
5365
5365
  /**
5366
5366
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5367
5367
  * window to float samples (D455).
@@ -7533,6 +7533,24 @@ object({
7533
7533
  unreachable: number()
7534
7534
  })
7535
7535
  });
7536
+ /** The wire shape of {@link PeerBytesTicket} — see the type for what it is. */
7537
+ var PeerBytesTicketSchema = object({
7538
+ /** `http://127.0.0.1:<port>/<token>`. One `GET` takes it. */
7539
+ url: string().min(1),
7540
+ /**
7541
+ * The HOST node this URL means something on — the hub or a named agent,
7542
+ * never a runner. {@link AddonPeerBytes.open} compares it to its own and
7543
+ * refuses `cross-node` by name when they differ, without dialling.
7544
+ */
7545
+ hostNodeId: string().min(1),
7546
+ expiresAtMs: number().int().nonnegative(),
7547
+ /**
7548
+ * What the producer DECLARED the body to be, when it knows — `null` when it
7549
+ * does not. Never `0` for unknown (D393): a consumer sizing a bound off this
7550
+ * must be able to tell "the producer did not say" from "the body is empty".
7551
+ */
7552
+ declaredBytes: number().int().nonnegative().nullable()
7553
+ });
7536
7554
  /**
7537
7555
  * Adoption job — the background form of `device-adoption.adopt`.
7538
7556
  *
@@ -24092,6 +24110,7 @@ _enum([
24092
24110
  "sleeping",
24093
24111
  "camera-refused",
24094
24112
  "no-keyframe",
24113
+ "decode-failed",
24095
24114
  "no-catalog-row",
24096
24115
  "unsupported",
24097
24116
  "unknown-device",
@@ -24366,6 +24385,32 @@ var ClipBytesSchema = object({
24366
24385
  durationMs: number().positive().optional()
24367
24386
  });
24368
24387
  /**
24388
+ * Where a clip's finished bytes can be TAKEN (D613) — the answer to
24389
+ * {@link videoclipsCapability.methods.offerClipBytes}.
24390
+ *
24391
+ * Everything {@link ClipBytesSchema} carries except the bytes themselves, plus
24392
+ * the one-shot ticket that leads to them. The metadata is answered BEFORE the
24393
+ * transfer on purpose: a consumer learns which twin it got, what to call the
24394
+ * file and how long the clip runs without having to read a byte, so a decision
24395
+ * it would make on that metadata (a wrong twin, an implausible duration) costs
24396
+ * no transfer at all.
24397
+ */
24398
+ var ClipBytesOfferSchema = object({
24399
+ /**
24400
+ * One shot, seconds-long, loopback, on the PROVIDER's own host. Open it with
24401
+ * `ctx.peerBytes.open(...)`, which refuses a ticket from another node by
24402
+ * name rather than dialling a port that means something else here.
24403
+ */
24404
+ ticket: PeerBytesTicketSchema,
24405
+ contentType: string(),
24406
+ /** Suggested filename, extension included. */
24407
+ name: string(),
24408
+ /** Which twin was actually served — see {@link ClipBytesSchema.served}. */
24409
+ served: CamProfileSchema,
24410
+ /** See {@link ClipBytesSchema.durationMs}. Absent when nothing measured it. */
24411
+ durationMs: number().positive().optional()
24412
+ });
24413
+ /**
24369
24414
  * Where a clip's STREAM can be dialled (D597) — the answer to
24370
24415
  * {@link videoclipsCapability.methods.dialClipStream}.
24371
24416
  *
@@ -24441,6 +24486,44 @@ var ClipStreamDialSchema = object({
24441
24486
  /** Why `servedAudio` is `none` although sound was asked for. */
24442
24487
  audioReason: ClipStreamAudioReasonSchema.optional()
24443
24488
  });
24489
+ /**
24490
+ * What a surface may DRAW for this provider's clips — the answer to
24491
+ * {@link videoclipsCapability.methods.getPlaybackOptions} (D612).
24492
+ *
24493
+ * The envelope is a PROVIDER fact, not a clip fact, and that is measured, not
24494
+ * assumed: the broker's `chooseClipPath` reads exactly two inputs — whether
24495
+ * `dialClipStream` and `readClipBytes` are wired — and both are constants of
24496
+ * the broker's own closure over the provider's methods. The `profile` it is
24497
+ * handed is explicitly not read. So every clip of a provider is served the
24498
+ * same way, and a per-clip channel carried a value that could not vary. The
24499
+ * per-clip `clipTransport` server message was removed for exactly that reason.
24500
+ *
24501
+ * Queried per camera, before a clip is picked, so a control is rendered or
24502
+ * DISABLED rather than offered and refused at play time (D62: a disabled
24503
+ * control reads as unavailable, one that undoes the gesture reads as broken).
24504
+ */
24505
+ var ClipPlaybackOptionsSchema = object({
24506
+ /**
24507
+ * How this provider's clips reach the player. `stream` is the provider's
24508
+ * forward-only fMP4 (D597); `file` is one bounded by-handle fetch of the
24509
+ * whole clip, `stbl` indexed (D575).
24510
+ */
24511
+ transport: _enum(["stream", "file"]),
24512
+ /** `forward` = only ahead of the playhead. `free` = anywhere. */
24513
+ seek: _enum(["forward", "free"]),
24514
+ /** Frame-step BACKWARD is meaningful. Forward always is. */
24515
+ stepBack: boolean(),
24516
+ /** Whether the scrub gesture is served, as opposed to refused by name. */
24517
+ scrub: boolean(),
24518
+ /**
24519
+ * The rates that can be delivered, ascending, always containing `1`. The
24520
+ * viewer draws its picker from this and from nothing else — a constant it
24521
+ * keeps instead is the second authority that produced the defect: `8` and
24522
+ * `16` were offered, the broker clamped them to `4`, and no line anywhere
24523
+ * said so. `0` is not a member: pause is the absence of a rate.
24524
+ */
24525
+ rates: array(number().positive()).min(1).readonly()
24526
+ });
24444
24527
  var ClipSourceAvailabilitySchema = object({
24445
24528
  state: _enum([
24446
24529
  "ok",
@@ -24600,6 +24683,29 @@ DeviceType.Camera, method(object({
24600
24683
  }), ClipBytesSchema, {
24601
24684
  kind: "query",
24602
24685
  auth: "protected"
24686
+ }), optionalMethod(object({
24687
+ deviceId: number(),
24688
+ clipId: string().min(1),
24689
+ /** WHICH provider holds the bytes — see `readClipBytes.provider`. */
24690
+ provider: string().min(1),
24691
+ /** Which twin — `low | mid` → the sub file, `high` → the main twin. */
24692
+ profile: CamProfileSchema.optional(),
24693
+ /**
24694
+ * The CALLER's byte bound, so an over-size clip is refused before the
24695
+ * camera is touched rather than after. Capped by
24696
+ * {@link VIDEOCLIPS_MAX_OFFER_BYTES} whatever is passed; absent means
24697
+ * that ceiling.
24698
+ */
24699
+ maxBytes: number().int().positive().optional(),
24700
+ /**
24701
+ * The operator's authorisation to wake a sleeping camera for this
24702
+ * read. Absent — the default — means a sleeping standalone battery
24703
+ * camera is REFUSED by name, before any session is opened.
24704
+ */
24705
+ wake: ClipWakeSchema.optional()
24706
+ }), ClipBytesOfferSchema, {
24707
+ kind: "query",
24708
+ auth: "protected"
24603
24709
  }), optionalMethod(object({
24604
24710
  deviceId: number(),
24605
24711
  clipId: string().min(1),
@@ -24621,6 +24727,15 @@ DeviceType.Camera, method(object({
24621
24727
  }), ClipStreamDialSchema, {
24622
24728
  kind: "query",
24623
24729
  auth: "protected"
24730
+ }), optionalMethod(object({
24731
+ deviceId: number(),
24732
+ /** WHICH provider to ask — the `addonId` a {@link ClipSourceSchema}
24733
+ * row carries. Required for the same reason `listClips` requires it:
24734
+ * a collection cap has no "the bound one" to resolve to (D554). */
24735
+ provider: string().min(1)
24736
+ }), ClipPlaybackOptionsSchema, {
24737
+ kind: "query",
24738
+ auth: "protected"
24624
24739
  });
24625
24740
  /**
24626
24741
  * Optional client-side hints sent at session creation to help the provider
@@ -40997,6 +41112,12 @@ Object.freeze({
40997
41112
  addonId: null,
40998
41113
  access: "view"
40999
41114
  },
41115
+ "videoclips.getPlaybackOptions": {
41116
+ capName: "videoclips",
41117
+ capScope: "device",
41118
+ addonId: null,
41119
+ access: "view"
41120
+ },
41000
41121
  "videoclips.listClips": {
41001
41122
  capName: "videoclips",
41002
41123
  capScope: "device",
@@ -41009,6 +41130,12 @@ Object.freeze({
41009
41130
  addonId: null,
41010
41131
  access: "view"
41011
41132
  },
41133
+ "videoclips.offerClipBytes": {
41134
+ capName: "videoclips",
41135
+ capScope: "device",
41136
+ addonId: null,
41137
+ access: "view"
41138
+ },
41012
41139
  "videoclips.readClipBytes": {
41013
41140
  capName: "videoclips",
41014
41141
  capScope: "device",
@@ -43055,6 +43182,11 @@ Object.freeze({
43055
43182
  form: "single",
43056
43183
  optional: false
43057
43184
  }],
43185
+ "videoclips.getPlaybackOptions": [{
43186
+ name: "deviceId",
43187
+ form: "single",
43188
+ optional: false
43189
+ }],
43058
43190
  "videoclips.listClips": [{
43059
43191
  name: "deviceId",
43060
43192
  form: "single",
@@ -43065,6 +43197,11 @@ Object.freeze({
43065
43197
  form: "single",
43066
43198
  optional: false
43067
43199
  }],
43200
+ "videoclips.offerClipBytes": [{
43201
+ name: "deviceId",
43202
+ form: "single",
43203
+ optional: false
43204
+ }],
43068
43205
  "videoclips.readClipBytes": [{
43069
43206
  name: "deviceId",
43070
43207
  form: "single",
@@ -43749,7 +43886,7 @@ var AgentUIAddon = class extends BaseAddon {
43749
43886
  capability: adminUiCapability,
43750
43887
  provider: {
43751
43888
  getStaticDir: async () => ({ staticDir: path.resolve(__dirname) }),
43752
- getVersion: async () => ({ version: "1.2.139" })
43889
+ getVersion: async () => ({ version: "1.2.140" })
43753
43890
  }
43754
43891
  }];
43755
43892
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-agent-ui",
3
- "version": "1.2.139",
3
+ "version": "1.2.140",
4
4
  "description": "Agent UI — lightweight status dashboard served by every agent node",
5
5
  "keywords": [
6
6
  "camstack",