@camstack/addon-agent-ui 1.2.31 → 1.2.32

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 +78 -3
  2. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -15483,7 +15483,23 @@ var NcHistoryEntrySchema = object({
15483
15483
  updatedAt: number(),
15484
15484
  /** Failure detail — present on a `dead` row. */
15485
15485
  error: string().optional(),
15486
- subject: NcHistorySubjectSchema
15486
+ subject: NcHistorySubjectSchema,
15487
+ /**
15488
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15489
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15490
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15491
+ * every delivery attempt). Absent on a row still pending/dead, a row
15492
+ * delivered before this field shipped, or a wiring with no artefact index.
15493
+ *
15494
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15495
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15496
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15497
+ * also answers `null` for an id whose artefact has since expired past the
15498
+ * retained shelf's own age bound — the degrade a caller (the Home
15499
+ * Assistant export) must render as "no image right now", never as a
15500
+ * broken link.
15501
+ */
15502
+ artifactIds: array(string().min(1)).optional()
15487
15503
  });
15488
15504
  /**
15489
15505
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -15710,7 +15726,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
15710
15726
  }), method(object({}), object({
15711
15727
  catalog: array(NcConditionDescriptorSchema),
15712
15728
  taxonomy: NcTaxonomySchema.optional()
15713
- })), method(object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), object({ entries: array(NcHistoryEntrySchema) }), { auth: "admin" }), method(object({}), object({ snoozes: array(NcSnoozeSchema) }), { caller: "required" }), method(object({ snooze: NcSnoozeInputSchema }), object({ snooze: NcSnoozeSchema }), {
15729
+ })), method(object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), object({ entries: array(NcHistoryEntrySchema) }), { auth: "admin" }), method(object({ artifactId: string().min(1) }), object({ url: string().nullable() }), { auth: "admin" }), method(object({}), object({ snoozes: array(NcSnoozeSchema) }), { caller: "required" }), method(object({ snooze: NcSnoozeInputSchema }), object({ snooze: NcSnoozeSchema }), {
15714
15730
  kind: "mutation",
15715
15731
  caller: "required"
15716
15732
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -25002,6 +25018,39 @@ var ReadGopBytesResultSchema = object({
25002
25018
  /** Media ms the returned fragment covers. */
25003
25019
  gopDurMs: number()
25004
25020
  });
25021
+ /**
25022
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
25023
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
25024
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
25025
+ * a replay needs several seconds of native pixels, not one frame.
25026
+ *
25027
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
25028
+ * is `false` when the returned bytes were cut short by the read's own safety
25029
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
25030
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
25031
+ * degradation: a window whose end falls past the covering segment would need
25032
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
25033
+ * not one standalone-demuxable stream — the caller's answer is to request a
25034
+ * shorter window or one aligned to a single segment, not to receive spliced
25035
+ * bytes nothing has proven decodable.
25036
+ */
25037
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
25038
+ kind: literal("ok"),
25039
+ data: _instanceof(Uint8Array),
25040
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
25041
+ * the requested `fromMs` (anchored on the nearest keyframe). */
25042
+ gopStartMs: number(),
25043
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
25044
+ gopDurMs: number(),
25045
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
25046
+ * the requested `toMs`; the caller got fewer frames than asked for. */
25047
+ reachesRequestedEnd: boolean()
25048
+ }), object({
25049
+ kind: literal("spans-multiple-segments"),
25050
+ /** Where the covering segment's own footage runs out — informational,
25051
+ * not a retry hint (retrying the same window would refuse again). */
25052
+ segmentEndMs: number()
25053
+ })]);
25005
25054
  method(object({
25006
25055
  deviceId: number(),
25007
25056
  fromMs: number(),
@@ -25052,6 +25101,15 @@ method(object({
25052
25101
  }), ReadGopBytesResultSchema, {
25053
25102
  kind: "query",
25054
25103
  auth: "admin"
25104
+ }), method(object({
25105
+ deviceId: number(),
25106
+ profile: string(),
25107
+ startMs: number(),
25108
+ fromMs: number(),
25109
+ toMs: number()
25110
+ }), ReadWindowBytesResultSchema, {
25111
+ kind: "query",
25112
+ auth: "admin"
25055
25113
  }), method(object({
25056
25114
  deviceId: number(),
25057
25115
  config: RecordingConfigSchema
@@ -29470,6 +29528,12 @@ Object.freeze({
29470
29528
  addonId: null,
29471
29529
  access: "view"
29472
29530
  },
29531
+ "notificationRules.resolveArtifactUrl": {
29532
+ capName: "notification-rules",
29533
+ capScope: "system",
29534
+ addonId: null,
29535
+ access: "view"
29536
+ },
29473
29537
  "notificationRules.setAlarmConfig": {
29474
29538
  capName: "notification-rules",
29475
29539
  capScope: "system",
@@ -30874,6 +30938,12 @@ Object.freeze({
30874
30938
  addonId: null,
30875
30939
  access: "view"
30876
30940
  },
30941
+ "recording.readWindowBytes": {
30942
+ capName: "recording",
30943
+ capScope: "system",
30944
+ addonId: null,
30945
+ access: "view"
30946
+ },
30877
30947
  "recording.refreshStorageLocationsForMigration": {
30878
30948
  capName: "recording",
30879
30949
  capScope: "system",
@@ -33704,6 +33774,11 @@ Object.freeze({
33704
33774
  form: "single",
33705
33775
  optional: false
33706
33776
  }],
33777
+ "recording.readWindowBytes": [{
33778
+ name: "deviceId",
33779
+ form: "single",
33780
+ optional: false
33781
+ }],
33707
33782
  "recording.relocateFootage": [{
33708
33783
  name: "deviceId",
33709
33784
  form: "single",
@@ -34550,7 +34625,7 @@ var AgentUIAddon = class extends BaseAddon {
34550
34625
  capability: adminUiCapability,
34551
34626
  provider: {
34552
34627
  getStaticDir: async () => ({ staticDir: path.resolve(__dirname) }),
34553
- getVersion: async () => ({ version: "1.2.31" })
34628
+ getVersion: async () => ({ version: "1.2.32" })
34554
34629
  }
34555
34630
  }];
34556
34631
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-agent-ui",
3
- "version": "1.2.31",
3
+ "version": "1.2.32",
4
4
  "description": "Agent UI — lightweight status dashboard served by every agent node",
5
5
  "keywords": [
6
6
  "camstack",