@camstack/addon-ai 0.4.47 → 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
@@ -15870,6 +15870,8 @@ var NcSystemEventKindSchema = _enum([
15870
15870
  "device-offline",
15871
15871
  "device-disabled",
15872
15872
  "device-enabled",
15873
+ "device-battery-low",
15874
+ "device-battery-normal",
15873
15875
  "stream-online",
15874
15876
  "stream-offline",
15875
15877
  "node-online",
@@ -19144,6 +19146,34 @@ var KeyEventsForDeviceSchema = object({
19144
19146
  deviceId: number$1(),
19145
19147
  events: array(KeyEventSchema).readonly()
19146
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
+ });
19147
19177
  object({
19148
19178
  trackId: string(),
19149
19179
  className: string(),
@@ -19454,12 +19484,12 @@ DeviceType.Camera, method(object({ deviceId: number$1() }), array(TrackSchema).r
19454
19484
  since: number$1(),
19455
19485
  until: number$1(),
19456
19486
  bucketMs: number$1().int().positive()
19457
- }), array(object({
19458
- bucketStart: number$1(),
19459
- motion: number$1().int(),
19460
- object: number$1().int(),
19461
- audio: number$1().int()
19462
- })).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({
19463
19493
  deviceId: number$1(),
19464
19494
  cutoffMs: number$1()
19465
19495
  }), object({
@@ -26769,6 +26799,39 @@ var RecordingDaysSchema = object({
26769
26799
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
26770
26800
  days: array(number$1())
26771
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
+ });
26772
26835
  var RecordingManifestSchema = object({
26773
26836
  deviceId: number$1(),
26774
26837
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -27003,6 +27066,13 @@ method(object({
27003
27066
  }), RecordingAvailabilitySchema, {
27004
27067
  kind: "query",
27005
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"
27006
27076
  }), method(object({
27007
27077
  deviceId: number$1(),
27008
27078
  fromMs: number$1(),
@@ -27011,6 +27081,14 @@ method(object({
27011
27081
  }), RecordingDaysSchema, {
27012
27082
  kind: "query",
27013
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"
27014
27092
  }), method(object({
27015
27093
  deviceId: number$1(),
27016
27094
  fromMs: number$1(),
@@ -32208,6 +32286,12 @@ Object.freeze({
32208
32286
  addonId: null,
32209
32287
  access: "view"
32210
32288
  },
32289
+ "pipelineAnalytics.getEventDensityBatch": {
32290
+ capName: "pipeline-analytics",
32291
+ capScope: "device",
32292
+ addonId: null,
32293
+ access: "view"
32294
+ },
32211
32295
  "pipelineAnalytics.getEventMedia": {
32212
32296
  capName: "pipeline-analytics",
32213
32297
  capScope: "device",
@@ -33330,12 +33414,24 @@ Object.freeze({
33330
33414
  addonId: null,
33331
33415
  access: "view"
33332
33416
  },
33417
+ "recording.getAvailabilityBatch": {
33418
+ capName: "recording",
33419
+ capScope: "system",
33420
+ addonId: null,
33421
+ access: "view"
33422
+ },
33333
33423
  "recording.getDaysWithRecordings": {
33334
33424
  capName: "recording",
33335
33425
  capScope: "system",
33336
33426
  addonId: null,
33337
33427
  access: "view"
33338
33428
  },
33429
+ "recording.getDaysWithRecordingsBatch": {
33430
+ capName: "recording",
33431
+ capScope: "system",
33432
+ addonId: null,
33433
+ access: "view"
33434
+ },
33339
33435
  "recording.getDeviceConfig": {
33340
33436
  capName: "recording",
33341
33437
  capScope: "system",
@@ -35940,6 +36036,11 @@ Object.freeze({
35940
36036
  form: "single",
35941
36037
  optional: false
35942
36038
  }],
36039
+ "pipelineAnalytics.getEventDensityBatch": [{
36040
+ name: "deviceIds",
36041
+ form: "array",
36042
+ optional: false
36043
+ }],
35943
36044
  "pipelineAnalytics.getEventMedia": [{
35944
36045
  name: "deviceId",
35945
36046
  form: "single",
@@ -36355,11 +36456,21 @@ Object.freeze({
36355
36456
  form: "single",
36356
36457
  optional: false
36357
36458
  }],
36459
+ "recording.getAvailabilityBatch": [{
36460
+ name: "deviceIds",
36461
+ form: "array",
36462
+ optional: false
36463
+ }],
36358
36464
  "recording.getDaysWithRecordings": [{
36359
36465
  name: "deviceId",
36360
36466
  form: "single",
36361
36467
  optional: false
36362
36468
  }],
36469
+ "recording.getDaysWithRecordingsBatch": [{
36470
+ name: "deviceIds",
36471
+ form: "array",
36472
+ optional: false
36473
+ }],
36363
36474
  "recording.getDeviceConfig": [{
36364
36475
  name: "deviceId",
36365
36476
  form: "single",
package/dist/addon.mjs CHANGED
@@ -15897,6 +15897,8 @@ var NcSystemEventKindSchema = _enum([
15897
15897
  "device-offline",
15898
15898
  "device-disabled",
15899
15899
  "device-enabled",
15900
+ "device-battery-low",
15901
+ "device-battery-normal",
15900
15902
  "stream-online",
15901
15903
  "stream-offline",
15902
15904
  "node-online",
@@ -19171,6 +19173,34 @@ var KeyEventsForDeviceSchema = object({
19171
19173
  deviceId: number$1(),
19172
19174
  events: array(KeyEventSchema).readonly()
19173
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
+ });
19174
19204
  object({
19175
19205
  trackId: string(),
19176
19206
  className: string(),
@@ -19481,12 +19511,12 @@ DeviceType.Camera, method(object({ deviceId: number$1() }), array(TrackSchema).r
19481
19511
  since: number$1(),
19482
19512
  until: number$1(),
19483
19513
  bucketMs: number$1().int().positive()
19484
- }), array(object({
19485
- bucketStart: number$1(),
19486
- motion: number$1().int(),
19487
- object: number$1().int(),
19488
- audio: number$1().int()
19489
- })).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({
19490
19520
  deviceId: number$1(),
19491
19521
  cutoffMs: number$1()
19492
19522
  }), object({
@@ -26796,6 +26826,39 @@ var RecordingDaysSchema = object({
26796
26826
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
26797
26827
  days: array(number$1())
26798
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
+ });
26799
26862
  var RecordingManifestSchema = object({
26800
26863
  deviceId: number$1(),
26801
26864
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -27030,6 +27093,13 @@ method(object({
27030
27093
  }), RecordingAvailabilitySchema, {
27031
27094
  kind: "query",
27032
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"
27033
27103
  }), method(object({
27034
27104
  deviceId: number$1(),
27035
27105
  fromMs: number$1(),
@@ -27038,6 +27108,14 @@ method(object({
27038
27108
  }), RecordingDaysSchema, {
27039
27109
  kind: "query",
27040
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"
27041
27119
  }), method(object({
27042
27120
  deviceId: number$1(),
27043
27121
  fromMs: number$1(),
@@ -32235,6 +32313,12 @@ Object.freeze({
32235
32313
  addonId: null,
32236
32314
  access: "view"
32237
32315
  },
32316
+ "pipelineAnalytics.getEventDensityBatch": {
32317
+ capName: "pipeline-analytics",
32318
+ capScope: "device",
32319
+ addonId: null,
32320
+ access: "view"
32321
+ },
32238
32322
  "pipelineAnalytics.getEventMedia": {
32239
32323
  capName: "pipeline-analytics",
32240
32324
  capScope: "device",
@@ -33357,12 +33441,24 @@ Object.freeze({
33357
33441
  addonId: null,
33358
33442
  access: "view"
33359
33443
  },
33444
+ "recording.getAvailabilityBatch": {
33445
+ capName: "recording",
33446
+ capScope: "system",
33447
+ addonId: null,
33448
+ access: "view"
33449
+ },
33360
33450
  "recording.getDaysWithRecordings": {
33361
33451
  capName: "recording",
33362
33452
  capScope: "system",
33363
33453
  addonId: null,
33364
33454
  access: "view"
33365
33455
  },
33456
+ "recording.getDaysWithRecordingsBatch": {
33457
+ capName: "recording",
33458
+ capScope: "system",
33459
+ addonId: null,
33460
+ access: "view"
33461
+ },
33366
33462
  "recording.getDeviceConfig": {
33367
33463
  capName: "recording",
33368
33464
  capScope: "system",
@@ -35967,6 +36063,11 @@ Object.freeze({
35967
36063
  form: "single",
35968
36064
  optional: false
35969
36065
  }],
36066
+ "pipelineAnalytics.getEventDensityBatch": [{
36067
+ name: "deviceIds",
36068
+ form: "array",
36069
+ optional: false
36070
+ }],
35970
36071
  "pipelineAnalytics.getEventMedia": [{
35971
36072
  name: "deviceId",
35972
36073
  form: "single",
@@ -36382,11 +36483,21 @@ Object.freeze({
36382
36483
  form: "single",
36383
36484
  optional: false
36384
36485
  }],
36486
+ "recording.getAvailabilityBatch": [{
36487
+ name: "deviceIds",
36488
+ form: "array",
36489
+ optional: false
36490
+ }],
36385
36491
  "recording.getDaysWithRecordings": [{
36386
36492
  name: "deviceId",
36387
36493
  form: "single",
36388
36494
  optional: false
36389
36495
  }],
36496
+ "recording.getDaysWithRecordingsBatch": [{
36497
+ name: "deviceIds",
36498
+ form: "array",
36499
+ optional: false
36500
+ }],
36390
36501
  "recording.getDeviceConfig": [{
36391
36502
  name: "deviceId",
36392
36503
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-ai",
3
- "version": "0.4.47",
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",