@camstack/addon-ai 0.4.48 → 0.4.49

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/addon.js CHANGED
@@ -19146,6 +19146,34 @@ var KeyEventsForDeviceSchema = object({
19146
19146
  deviceId: number$1(),
19147
19147
  events: array(KeyEventSchema).readonly()
19148
19148
  });
19149
+ /** One non-empty bucket of the timeline histogram. */
19150
+ var EventDensityBucketSchema = object({
19151
+ bucketStart: number$1(),
19152
+ motion: number$1().int(),
19153
+ object: number$1().int(),
19154
+ audio: number$1().int()
19155
+ });
19156
+ /**
19157
+ * One camera's row in a `getEventDensityBatch` answer.
19158
+ *
19159
+ * TWO facts, and the timeline draws them differently:
19160
+ *
19161
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
19162
+ * claim: read, and nothing happened in the window.
19163
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
19164
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
19165
+ * not quiet.
19166
+ *
19167
+ * Fanned out per camera the difference was free — one query rejected while the
19168
+ * others resolved — and collapsing to a batch is the exact moment it is lost
19169
+ * silently. Every requested id gets a row: a caller that asked for twelve and
19170
+ * got eleven cannot tell which one is missing, or that any is.
19171
+ */
19172
+ var EventDensityForDeviceSchema = object({
19173
+ deviceId: number$1(),
19174
+ read: _enum(["read", "unreadable"]),
19175
+ buckets: array(EventDensityBucketSchema).readonly()
19176
+ });
19149
19177
  object({
19150
19178
  trackId: string(),
19151
19179
  className: string(),
@@ -19456,12 +19484,12 @@ DeviceType.Camera, method(object({ deviceId: number$1() }), array(TrackSchema).r
19456
19484
  since: number$1(),
19457
19485
  until: number$1(),
19458
19486
  bucketMs: number$1().int().positive()
19459
- }), array(object({
19460
- bucketStart: number$1(),
19461
- motion: number$1().int(),
19462
- object: number$1().int(),
19463
- audio: number$1().int()
19464
- })).readonly()), method(object({
19487
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19488
+ deviceIds: array(number$1()).min(1).max(200),
19489
+ since: number$1(),
19490
+ until: number$1(),
19491
+ bucketMs: number$1().int().positive()
19492
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19465
19493
  deviceId: number$1(),
19466
19494
  cutoffMs: number$1()
19467
19495
  }), object({
@@ -26771,6 +26799,39 @@ var RecordingDaysSchema = object({
26771
26799
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
26772
26800
  days: array(number$1())
26773
26801
  });
26802
+ /**
26803
+ * One camera's row in a `getAvailabilityBatch` answer.
26804
+ *
26805
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
26806
+ * batch collapses the transport, not the work — plus the one thing the singular
26807
+ * method never had to say:
26808
+ *
26809
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
26810
+ * no footage in the window", which is a real claim.
26811
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
26812
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
26813
+ * that emptiness means NOTHING.
26814
+ *
26815
+ * A timeline that renders the second as the first tells an operator there is no
26816
+ * footage when the truth is that nobody looked.
26817
+ */
26818
+ var RecordingAvailabilityForDeviceSchema = object({
26819
+ deviceId: number$1(),
26820
+ read: _enum(["read", "unreadable"]),
26821
+ ranges: array(RecordingRangeSchema).readonly()
26822
+ });
26823
+ /**
26824
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
26825
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
26826
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
26827
+ * the date-picker's day dots must not spell them the same.
26828
+ */
26829
+ var RecordingDaysForDeviceSchema = object({
26830
+ deviceId: number$1(),
26831
+ read: _enum(["read", "unreadable"]),
26832
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
26833
+ days: array(number$1()).readonly()
26834
+ });
26774
26835
  var RecordingManifestSchema = object({
26775
26836
  deviceId: number$1(),
26776
26837
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -27005,6 +27066,13 @@ method(object({
27005
27066
  }), RecordingAvailabilitySchema, {
27006
27067
  kind: "query",
27007
27068
  auth: "protected"
27069
+ }), method(object({
27070
+ deviceIds: array(number$1()).min(1).max(200),
27071
+ fromMs: number$1(),
27072
+ toMs: number$1()
27073
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
27074
+ kind: "query",
27075
+ auth: "protected"
27008
27076
  }), method(object({
27009
27077
  deviceId: number$1(),
27010
27078
  fromMs: number$1(),
@@ -27013,6 +27081,14 @@ method(object({
27013
27081
  }), RecordingDaysSchema, {
27014
27082
  kind: "query",
27015
27083
  auth: "protected"
27084
+ }), method(object({
27085
+ deviceIds: array(number$1()).min(1).max(200),
27086
+ fromMs: number$1(),
27087
+ toMs: number$1(),
27088
+ tzOffsetMinutes: number$1()
27089
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
27090
+ kind: "query",
27091
+ auth: "protected"
27016
27092
  }), method(object({
27017
27093
  deviceId: number$1(),
27018
27094
  fromMs: number$1(),
@@ -32210,6 +32286,12 @@ Object.freeze({
32210
32286
  addonId: null,
32211
32287
  access: "view"
32212
32288
  },
32289
+ "pipelineAnalytics.getEventDensityBatch": {
32290
+ capName: "pipeline-analytics",
32291
+ capScope: "device",
32292
+ addonId: null,
32293
+ access: "view"
32294
+ },
32213
32295
  "pipelineAnalytics.getEventMedia": {
32214
32296
  capName: "pipeline-analytics",
32215
32297
  capScope: "device",
@@ -33332,12 +33414,24 @@ Object.freeze({
33332
33414
  addonId: null,
33333
33415
  access: "view"
33334
33416
  },
33417
+ "recording.getAvailabilityBatch": {
33418
+ capName: "recording",
33419
+ capScope: "system",
33420
+ addonId: null,
33421
+ access: "view"
33422
+ },
33335
33423
  "recording.getDaysWithRecordings": {
33336
33424
  capName: "recording",
33337
33425
  capScope: "system",
33338
33426
  addonId: null,
33339
33427
  access: "view"
33340
33428
  },
33429
+ "recording.getDaysWithRecordingsBatch": {
33430
+ capName: "recording",
33431
+ capScope: "system",
33432
+ addonId: null,
33433
+ access: "view"
33434
+ },
33341
33435
  "recording.getDeviceConfig": {
33342
33436
  capName: "recording",
33343
33437
  capScope: "system",
@@ -35942,6 +36036,11 @@ Object.freeze({
35942
36036
  form: "single",
35943
36037
  optional: false
35944
36038
  }],
36039
+ "pipelineAnalytics.getEventDensityBatch": [{
36040
+ name: "deviceIds",
36041
+ form: "array",
36042
+ optional: false
36043
+ }],
35945
36044
  "pipelineAnalytics.getEventMedia": [{
35946
36045
  name: "deviceId",
35947
36046
  form: "single",
@@ -36357,11 +36456,21 @@ Object.freeze({
36357
36456
  form: "single",
36358
36457
  optional: false
36359
36458
  }],
36459
+ "recording.getAvailabilityBatch": [{
36460
+ name: "deviceIds",
36461
+ form: "array",
36462
+ optional: false
36463
+ }],
36360
36464
  "recording.getDaysWithRecordings": [{
36361
36465
  name: "deviceId",
36362
36466
  form: "single",
36363
36467
  optional: false
36364
36468
  }],
36469
+ "recording.getDaysWithRecordingsBatch": [{
36470
+ name: "deviceIds",
36471
+ form: "array",
36472
+ optional: false
36473
+ }],
36365
36474
  "recording.getDeviceConfig": [{
36366
36475
  name: "deviceId",
36367
36476
  form: "single",
package/dist/addon.mjs CHANGED
@@ -19173,6 +19173,34 @@ var KeyEventsForDeviceSchema = object({
19173
19173
  deviceId: number$1(),
19174
19174
  events: array(KeyEventSchema).readonly()
19175
19175
  });
19176
+ /** One non-empty bucket of the timeline histogram. */
19177
+ var EventDensityBucketSchema = object({
19178
+ bucketStart: number$1(),
19179
+ motion: number$1().int(),
19180
+ object: number$1().int(),
19181
+ audio: number$1().int()
19182
+ });
19183
+ /**
19184
+ * One camera's row in a `getEventDensityBatch` answer.
19185
+ *
19186
+ * TWO facts, and the timeline draws them differently:
19187
+ *
19188
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
19189
+ * claim: read, and nothing happened in the window.
19190
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
19191
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
19192
+ * not quiet.
19193
+ *
19194
+ * Fanned out per camera the difference was free — one query rejected while the
19195
+ * others resolved — and collapsing to a batch is the exact moment it is lost
19196
+ * silently. Every requested id gets a row: a caller that asked for twelve and
19197
+ * got eleven cannot tell which one is missing, or that any is.
19198
+ */
19199
+ var EventDensityForDeviceSchema = object({
19200
+ deviceId: number$1(),
19201
+ read: _enum(["read", "unreadable"]),
19202
+ buckets: array(EventDensityBucketSchema).readonly()
19203
+ });
19176
19204
  object({
19177
19205
  trackId: string(),
19178
19206
  className: string(),
@@ -19483,12 +19511,12 @@ DeviceType.Camera, method(object({ deviceId: number$1() }), array(TrackSchema).r
19483
19511
  since: number$1(),
19484
19512
  until: number$1(),
19485
19513
  bucketMs: number$1().int().positive()
19486
- }), array(object({
19487
- bucketStart: number$1(),
19488
- motion: number$1().int(),
19489
- object: number$1().int(),
19490
- audio: number$1().int()
19491
- })).readonly()), method(object({
19514
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19515
+ deviceIds: array(number$1()).min(1).max(200),
19516
+ since: number$1(),
19517
+ until: number$1(),
19518
+ bucketMs: number$1().int().positive()
19519
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19492
19520
  deviceId: number$1(),
19493
19521
  cutoffMs: number$1()
19494
19522
  }), object({
@@ -26798,6 +26826,39 @@ var RecordingDaysSchema = object({
26798
26826
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
26799
26827
  days: array(number$1())
26800
26828
  });
26829
+ /**
26830
+ * One camera's row in a `getAvailabilityBatch` answer.
26831
+ *
26832
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
26833
+ * batch collapses the transport, not the work — plus the one thing the singular
26834
+ * method never had to say:
26835
+ *
26836
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
26837
+ * no footage in the window", which is a real claim.
26838
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
26839
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
26840
+ * that emptiness means NOTHING.
26841
+ *
26842
+ * A timeline that renders the second as the first tells an operator there is no
26843
+ * footage when the truth is that nobody looked.
26844
+ */
26845
+ var RecordingAvailabilityForDeviceSchema = object({
26846
+ deviceId: number$1(),
26847
+ read: _enum(["read", "unreadable"]),
26848
+ ranges: array(RecordingRangeSchema).readonly()
26849
+ });
26850
+ /**
26851
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
26852
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
26853
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
26854
+ * the date-picker's day dots must not spell them the same.
26855
+ */
26856
+ var RecordingDaysForDeviceSchema = object({
26857
+ deviceId: number$1(),
26858
+ read: _enum(["read", "unreadable"]),
26859
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
26860
+ days: array(number$1()).readonly()
26861
+ });
26801
26862
  var RecordingManifestSchema = object({
26802
26863
  deviceId: number$1(),
26803
26864
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -27032,6 +27093,13 @@ method(object({
27032
27093
  }), RecordingAvailabilitySchema, {
27033
27094
  kind: "query",
27034
27095
  auth: "protected"
27096
+ }), method(object({
27097
+ deviceIds: array(number$1()).min(1).max(200),
27098
+ fromMs: number$1(),
27099
+ toMs: number$1()
27100
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
27101
+ kind: "query",
27102
+ auth: "protected"
27035
27103
  }), method(object({
27036
27104
  deviceId: number$1(),
27037
27105
  fromMs: number$1(),
@@ -27040,6 +27108,14 @@ method(object({
27040
27108
  }), RecordingDaysSchema, {
27041
27109
  kind: "query",
27042
27110
  auth: "protected"
27111
+ }), method(object({
27112
+ deviceIds: array(number$1()).min(1).max(200),
27113
+ fromMs: number$1(),
27114
+ toMs: number$1(),
27115
+ tzOffsetMinutes: number$1()
27116
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
27117
+ kind: "query",
27118
+ auth: "protected"
27043
27119
  }), method(object({
27044
27120
  deviceId: number$1(),
27045
27121
  fromMs: number$1(),
@@ -32237,6 +32313,12 @@ Object.freeze({
32237
32313
  addonId: null,
32238
32314
  access: "view"
32239
32315
  },
32316
+ "pipelineAnalytics.getEventDensityBatch": {
32317
+ capName: "pipeline-analytics",
32318
+ capScope: "device",
32319
+ addonId: null,
32320
+ access: "view"
32321
+ },
32240
32322
  "pipelineAnalytics.getEventMedia": {
32241
32323
  capName: "pipeline-analytics",
32242
32324
  capScope: "device",
@@ -33359,12 +33441,24 @@ Object.freeze({
33359
33441
  addonId: null,
33360
33442
  access: "view"
33361
33443
  },
33444
+ "recording.getAvailabilityBatch": {
33445
+ capName: "recording",
33446
+ capScope: "system",
33447
+ addonId: null,
33448
+ access: "view"
33449
+ },
33362
33450
  "recording.getDaysWithRecordings": {
33363
33451
  capName: "recording",
33364
33452
  capScope: "system",
33365
33453
  addonId: null,
33366
33454
  access: "view"
33367
33455
  },
33456
+ "recording.getDaysWithRecordingsBatch": {
33457
+ capName: "recording",
33458
+ capScope: "system",
33459
+ addonId: null,
33460
+ access: "view"
33461
+ },
33368
33462
  "recording.getDeviceConfig": {
33369
33463
  capName: "recording",
33370
33464
  capScope: "system",
@@ -35969,6 +36063,11 @@ Object.freeze({
35969
36063
  form: "single",
35970
36064
  optional: false
35971
36065
  }],
36066
+ "pipelineAnalytics.getEventDensityBatch": [{
36067
+ name: "deviceIds",
36068
+ form: "array",
36069
+ optional: false
36070
+ }],
35972
36071
  "pipelineAnalytics.getEventMedia": [{
35973
36072
  name: "deviceId",
35974
36073
  form: "single",
@@ -36384,11 +36483,21 @@ Object.freeze({
36384
36483
  form: "single",
36385
36484
  optional: false
36386
36485
  }],
36486
+ "recording.getAvailabilityBatch": [{
36487
+ name: "deviceIds",
36488
+ form: "array",
36489
+ optional: false
36490
+ }],
36387
36491
  "recording.getDaysWithRecordings": [{
36388
36492
  name: "deviceId",
36389
36493
  form: "single",
36390
36494
  optional: false
36391
36495
  }],
36496
+ "recording.getDaysWithRecordingsBatch": [{
36497
+ name: "deviceIds",
36498
+ form: "array",
36499
+ optional: false
36500
+ }],
36392
36501
  "recording.getDeviceConfig": [{
36393
36502
  name: "deviceId",
36394
36503
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-ai",
3
- "version": "0.4.48",
3
+ "version": "0.4.49",
4
4
  "description": "AI addon for CamStack — the `llm` collection provider (cloud, LAN, and camstack-managed local llama.cpp profiles) plus the per-node `llm-runtime` managed executor.",
5
5
  "keywords": [
6
6
  "camstack",