@camstack/addon-agent-ui 1.2.53 → 1.2.55

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 +116 -7
  2. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -18852,6 +18852,34 @@ var KeyEventsForDeviceSchema = object({
18852
18852
  deviceId: number(),
18853
18853
  events: array(KeyEventSchema).readonly()
18854
18854
  });
18855
+ /** One non-empty bucket of the timeline histogram. */
18856
+ var EventDensityBucketSchema = object({
18857
+ bucketStart: number(),
18858
+ motion: number().int(),
18859
+ object: number().int(),
18860
+ audio: number().int()
18861
+ });
18862
+ /**
18863
+ * One camera's row in a `getEventDensityBatch` answer.
18864
+ *
18865
+ * TWO facts, and the timeline draws them differently:
18866
+ *
18867
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
18868
+ * claim: read, and nothing happened in the window.
18869
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
18870
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
18871
+ * not quiet.
18872
+ *
18873
+ * Fanned out per camera the difference was free — one query rejected while the
18874
+ * others resolved — and collapsing to a batch is the exact moment it is lost
18875
+ * silently. Every requested id gets a row: a caller that asked for twelve and
18876
+ * got eleven cannot tell which one is missing, or that any is.
18877
+ */
18878
+ var EventDensityForDeviceSchema = object({
18879
+ deviceId: number(),
18880
+ read: _enum(["read", "unreadable"]),
18881
+ buckets: array(EventDensityBucketSchema).readonly()
18882
+ });
18855
18883
  object({
18856
18884
  trackId: string(),
18857
18885
  className: string(),
@@ -19162,12 +19190,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19162
19190
  since: number(),
19163
19191
  until: number(),
19164
19192
  bucketMs: number().int().positive()
19165
- }), array(object({
19166
- bucketStart: number(),
19167
- motion: number().int(),
19168
- object: number().int(),
19169
- audio: number().int()
19170
- })).readonly()), method(object({
19193
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19194
+ deviceIds: array(number()).min(1).max(200),
19195
+ since: number(),
19196
+ until: number(),
19197
+ bucketMs: number().int().positive()
19198
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19171
19199
  deviceId: number(),
19172
19200
  cutoffMs: number()
19173
19201
  }), object({
@@ -26477,6 +26505,39 @@ var RecordingDaysSchema = object({
26477
26505
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
26478
26506
  days: array(number())
26479
26507
  });
26508
+ /**
26509
+ * One camera's row in a `getAvailabilityBatch` answer.
26510
+ *
26511
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
26512
+ * batch collapses the transport, not the work — plus the one thing the singular
26513
+ * method never had to say:
26514
+ *
26515
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
26516
+ * no footage in the window", which is a real claim.
26517
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
26518
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
26519
+ * that emptiness means NOTHING.
26520
+ *
26521
+ * A timeline that renders the second as the first tells an operator there is no
26522
+ * footage when the truth is that nobody looked.
26523
+ */
26524
+ var RecordingAvailabilityForDeviceSchema = object({
26525
+ deviceId: number(),
26526
+ read: _enum(["read", "unreadable"]),
26527
+ ranges: array(RecordingRangeSchema).readonly()
26528
+ });
26529
+ /**
26530
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
26531
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
26532
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
26533
+ * the date-picker's day dots must not spell them the same.
26534
+ */
26535
+ var RecordingDaysForDeviceSchema = object({
26536
+ deviceId: number(),
26537
+ read: _enum(["read", "unreadable"]),
26538
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
26539
+ days: array(number()).readonly()
26540
+ });
26480
26541
  var RecordingManifestSchema = object({
26481
26542
  deviceId: number(),
26482
26543
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -26711,6 +26772,13 @@ method(object({
26711
26772
  }), RecordingAvailabilitySchema, {
26712
26773
  kind: "query",
26713
26774
  auth: "protected"
26775
+ }), method(object({
26776
+ deviceIds: array(number()).min(1).max(200),
26777
+ fromMs: number(),
26778
+ toMs: number()
26779
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
26780
+ kind: "query",
26781
+ auth: "protected"
26714
26782
  }), method(object({
26715
26783
  deviceId: number(),
26716
26784
  fromMs: number(),
@@ -26719,6 +26787,14 @@ method(object({
26719
26787
  }), RecordingDaysSchema, {
26720
26788
  kind: "query",
26721
26789
  auth: "protected"
26790
+ }), method(object({
26791
+ deviceIds: array(number()).min(1).max(200),
26792
+ fromMs: number(),
26793
+ toMs: number(),
26794
+ tzOffsetMinutes: number()
26795
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
26796
+ kind: "query",
26797
+ auth: "protected"
26722
26798
  }), method(object({
26723
26799
  deviceId: number(),
26724
26800
  fromMs: number(),
@@ -31916,6 +31992,12 @@ Object.freeze({
31916
31992
  addonId: null,
31917
31993
  access: "view"
31918
31994
  },
31995
+ "pipelineAnalytics.getEventDensityBatch": {
31996
+ capName: "pipeline-analytics",
31997
+ capScope: "device",
31998
+ addonId: null,
31999
+ access: "view"
32000
+ },
31919
32001
  "pipelineAnalytics.getEventMedia": {
31920
32002
  capName: "pipeline-analytics",
31921
32003
  capScope: "device",
@@ -33038,12 +33120,24 @@ Object.freeze({
33038
33120
  addonId: null,
33039
33121
  access: "view"
33040
33122
  },
33123
+ "recording.getAvailabilityBatch": {
33124
+ capName: "recording",
33125
+ capScope: "system",
33126
+ addonId: null,
33127
+ access: "view"
33128
+ },
33041
33129
  "recording.getDaysWithRecordings": {
33042
33130
  capName: "recording",
33043
33131
  capScope: "system",
33044
33132
  addonId: null,
33045
33133
  access: "view"
33046
33134
  },
33135
+ "recording.getDaysWithRecordingsBatch": {
33136
+ capName: "recording",
33137
+ capScope: "system",
33138
+ addonId: null,
33139
+ access: "view"
33140
+ },
33047
33141
  "recording.getDeviceConfig": {
33048
33142
  capName: "recording",
33049
33143
  capScope: "system",
@@ -35648,6 +35742,11 @@ Object.freeze({
35648
35742
  form: "single",
35649
35743
  optional: false
35650
35744
  }],
35745
+ "pipelineAnalytics.getEventDensityBatch": [{
35746
+ name: "deviceIds",
35747
+ form: "array",
35748
+ optional: false
35749
+ }],
35651
35750
  "pipelineAnalytics.getEventMedia": [{
35652
35751
  name: "deviceId",
35653
35752
  form: "single",
@@ -36063,11 +36162,21 @@ Object.freeze({
36063
36162
  form: "single",
36064
36163
  optional: false
36065
36164
  }],
36165
+ "recording.getAvailabilityBatch": [{
36166
+ name: "deviceIds",
36167
+ form: "array",
36168
+ optional: false
36169
+ }],
36066
36170
  "recording.getDaysWithRecordings": [{
36067
36171
  name: "deviceId",
36068
36172
  form: "single",
36069
36173
  optional: false
36070
36174
  }],
36175
+ "recording.getDaysWithRecordingsBatch": [{
36176
+ name: "deviceIds",
36177
+ form: "array",
36178
+ optional: false
36179
+ }],
36071
36180
  "recording.getDeviceConfig": [{
36072
36181
  name: "deviceId",
36073
36182
  form: "single",
@@ -37007,7 +37116,7 @@ var AgentUIAddon = class extends BaseAddon {
37007
37116
  capability: adminUiCapability,
37008
37117
  provider: {
37009
37118
  getStaticDir: async () => ({ staticDir: path.resolve(__dirname) }),
37010
- getVersion: async () => ({ version: "1.2.53" })
37119
+ getVersion: async () => ({ version: "1.2.55" })
37011
37120
  }
37012
37121
  }];
37013
37122
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-agent-ui",
3
- "version": "1.2.53",
3
+ "version": "1.2.55",
4
4
  "description": "Agent UI — lightweight status dashboard served by every agent node",
5
5
  "keywords": [
6
6
  "camstack",