@camstack/addon-provider-hikvision 1.2.57 → 1.2.59

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 (3) hide show
  1. package/dist/addon.js +236 -73
  2. package/dist/addon.mjs +236 -73
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -8091,6 +8091,13 @@ var MediaRelocateModeSchema = _enum([
8091
8091
  ]);
8092
8092
  var RelocateMediaInputSchema = object({
8093
8093
  toLocationId: string(),
8094
+ /**
8095
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8096
+ * every row that is not already on `toLocationId` (the historical
8097
+ * behaviour). A named source is what a from→to migration needs: without it
8098
+ * "move events off disk 2" also emptied disk 1.
8099
+ */
8100
+ fromLocationId: string().optional(),
8094
8101
  throttleMbps: number().min(1).max(1e3).optional(),
8095
8102
  /** Omitted = `move`, the pre-existing behaviour. */
8096
8103
  mode: MediaRelocateModeSchema.optional()
@@ -8158,6 +8165,19 @@ var StorageMigrationDestinationsSchema = object({
8158
8165
  galleryMedia: string().min(1).optional()
8159
8166
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8160
8167
  /**
8168
+ * Optional named source per class. Omitted = the class's current default
8169
+ * (the historical behaviour). A named source that is NOT the default is a
8170
+ * drain of that disk: bytes move, the default stays, and the source is
8171
+ * disabled when the move finishes.
8172
+ */
8173
+ var StorageMigrationSourcesSchema = object({
8174
+ recordings: string().min(1).optional(),
8175
+ recordingsLow: string().min(1).optional(),
8176
+ eventMedia: string().min(1).optional(),
8177
+ backups: string().min(1).optional(),
8178
+ galleryMedia: string().min(1).optional()
8179
+ }).optional();
8180
+ /**
8161
8181
  * How a migration sequences the cutover against the byte move.
8162
8182
  *
8163
8183
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8179,6 +8199,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8179
8199
  /** Shared input for planning and starting an orchestrated storage migration. */
8180
8200
  var StorageMigrationInputSchema = object({
8181
8201
  destinations: StorageMigrationDestinationsSchema,
8202
+ /** Omitted = each class's current default. */
8203
+ sources: StorageMigrationSourcesSchema,
8182
8204
  throttleMbps: number().min(1).max(1e3).optional(),
8183
8205
  /** Omitted = `blocking`, which stays the default. */
8184
8206
  mode: StorageMigrationModeSchema.optional()
@@ -8258,6 +8280,13 @@ var StorageMigrationMoveSchema = object({
8258
8280
  storageClass: StorageMigrationClassSchema,
8259
8281
  fromLocationId: string(),
8260
8282
  toLocationId: string(),
8283
+ /**
8284
+ * True when `from` was NOT the class default at plan time. The move still
8285
+ * copies bytes, but the default is left alone and the source is disabled
8286
+ * once the copy verifies. Absent on jobs planned before this field existed
8287
+ * — those jobs always repointed, which is `false`.
8288
+ */
8289
+ freezeSource: boolean().optional(),
8261
8290
  moverJobId: string().nullable(),
8262
8291
  state: RelocateJobStateSchema.nullable(),
8263
8292
  error: string().nullable(),
@@ -8271,6 +8300,7 @@ var StorageMigrationJobSchema = object({
8271
8300
  * can tell a seconds-long cutover from a thirty-hour one. */
8272
8301
  mode: StorageMigrationModeSchema,
8273
8302
  destinations: StorageMigrationDestinationsSchema,
8303
+ sources: StorageMigrationSourcesSchema,
8274
8304
  throttleMbps: number(),
8275
8305
  moves: array(StorageMigrationMoveSchema),
8276
8306
  pauseLeaseId: string().nullable(),
@@ -8296,6 +8326,7 @@ var StorageMigrationFindingSchema = object({
8296
8326
  });
8297
8327
  var StorageMigrationPlanSchema = object({
8298
8328
  destinations: StorageMigrationDestinationsSchema,
8329
+ sources: StorageMigrationSourcesSchema,
8299
8330
  /** The mode this plan was built for. A plan is only valid for its mode: the
8300
8331
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8301
8332
  * it. */
@@ -8303,7 +8334,8 @@ var StorageMigrationPlanSchema = object({
8303
8334
  moves: array(object({
8304
8335
  storageClass: StorageMigrationClassSchema,
8305
8336
  fromLocationId: string(),
8306
- toLocationId: string()
8337
+ toLocationId: string(),
8338
+ freezeSource: boolean().optional()
8307
8339
  })),
8308
8340
  findings: array(StorageMigrationFindingSchema)
8309
8341
  });
@@ -8481,10 +8513,51 @@ var LedgerWalkReportSchema = object({
8481
8513
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8482
8514
  var RelocatableMediaCountInputSchema = object({
8483
8515
  toLocationId: string().min(1),
8516
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8517
+ fromLocationId: string().optional(),
8484
8518
  /** Omitted = `move`. */
8485
8519
  mode: MediaRelocateModeSchema.optional()
8486
8520
  });
8487
8521
  /**
8522
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8523
+ * ghost ledger entries on frozen footage locations.
8524
+ *
8525
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8526
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8527
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8528
+ * with no operator-visible status.
8529
+ */
8530
+ var StorageCleanupPhaseSchema = _enum([
8531
+ "orphans",
8532
+ "debug-media",
8533
+ "ghost-ledger",
8534
+ "done",
8535
+ "failed",
8536
+ "cancelled"
8537
+ ]);
8538
+ var StorageCleanupInputSchema = object({
8539
+ /** Also walk motion stills / track filmstrips. Off by default. */
8540
+ includeDebugMedia: boolean().optional() });
8541
+ var StorageCleanupJobSchema = object({
8542
+ jobId: string(),
8543
+ phase: StorageCleanupPhaseSchema,
8544
+ includeDebugMedia: boolean(),
8545
+ orphansReclaimed: number().int().nonnegative(),
8546
+ orphanBytesReclaimed: number().int().nonnegative(),
8547
+ debugMediaReclaimed: number().int().nonnegative(),
8548
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8549
+ ghostsForgotten: number().int().nonnegative(),
8550
+ ghostBytesForgotten: number().int().nonnegative(),
8551
+ /** Short operator-facing line: current collection, pass, or location. */
8552
+ detail: string().nullable(),
8553
+ cancelRequested: boolean(),
8554
+ startedAt: number(),
8555
+ updatedAt: number(),
8556
+ finishedAt: number().nullable(),
8557
+ error: string().nullable()
8558
+ });
8559
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8560
+ /**
8488
8561
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8489
8562
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8490
8563
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8512,11 +8585,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8512
8585
  * The default location for a type uses `id === <type>:default` by
8513
8586
  * convention (the bare type ref like `'backups'` resolves to it).
8514
8587
  *
8515
- * `isSystem: true` marks a location as orchestrator-seeded and
8516
- * undeletable. The bootstrap-installed defaults (one per type) carry
8517
- * this flag; operator-added locations don't. Editing the config of
8518
- * a system location is allowed (path migration, provider swap) but
8519
- * deleting it is rejected at the cap level.
8588
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8589
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8590
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8591
+ * / last-enabled, not on this bit.
8520
8592
  */
8521
8593
  var StorageLocationSchema = object({
8522
8594
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -13335,6 +13407,12 @@ method(object({
13335
13407
  }), _void(), {
13336
13408
  kind: "mutation",
13337
13409
  auth: "admin"
13410
+ }), method(object({
13411
+ from: string(),
13412
+ to: string()
13413
+ }), object({ moved: number() }), {
13414
+ kind: "mutation",
13415
+ auth: "admin"
13338
13416
  }), method(object({
13339
13417
  deviceId: number(),
13340
13418
  disabled: boolean()
@@ -16104,6 +16182,8 @@ var NcSystemEventKindSchema = _enum([
16104
16182
  "device-offline",
16105
16183
  "device-disabled",
16106
16184
  "device-enabled",
16185
+ "device-battery-low",
16186
+ "device-battery-normal",
16107
16187
  "stream-online",
16108
16188
  "stream-offline",
16109
16189
  "node-online",
@@ -19362,46 +19442,6 @@ var RecentTracksPageSchema = object({
19362
19442
  /** Cursor for the next page, or null when this page is the last. */
19363
19443
  nextCursor: string().nullable()
19364
19444
  });
19365
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
19366
- var LIST_GROUPS_MAX_LIMIT = 100;
19367
- var AnalyticsGroupRecordSchema = object({
19368
- id: string(),
19369
- deviceId: number().int(),
19370
- openedAt: number().int(),
19371
- closedAt: number().int(),
19372
- timestamp: number().int(),
19373
- memberCount: number().int(),
19374
- memberTrackIds: array(string()).readonly(),
19375
- className: string(),
19376
- classes: array(string()).readonly(),
19377
- /** Relative event-media path, or null when the group has no picture yet. */
19378
- mediaUrl: string().nullable(),
19379
- singleton: boolean()
19380
- });
19381
- var AnalyticsGroupMemberSchema = object({
19382
- trackId: string(),
19383
- deviceId: number().int(),
19384
- className: string(),
19385
- firstSeen: number().int(),
19386
- lastSeen: number().int(),
19387
- mediaUrl: string().nullable()
19388
- });
19389
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
19390
- var ListGroupsQueryInput = object({
19391
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
19392
- deviceIds: array(number()),
19393
- /** Window lower bound on `closedAt` (inclusive). */
19394
- since: number().optional(),
19395
- /** Window upper bound on `openedAt` (inclusive). */
19396
- until: number().optional(),
19397
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
19398
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
19399
- cursor: string().optional()
19400
- });
19401
- var ListGroupsPageSchema = object({
19402
- groups: array(AnalyticsGroupRecordSchema).readonly(),
19403
- nextCursor: string().nullable()
19404
- });
19405
19445
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19406
19446
  var KEY_EVENTS_MAX_LIMIT = 200;
19407
19447
  var KeyEventQueryInput = object({
@@ -19505,9 +19545,7 @@ var TrackCascadeCountsSchema = object({
19505
19545
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19506
19546
  plates: number().int(),
19507
19547
  /** Per-track CLIP search vectors removed (best-effort). */
19508
- embeddings: number().int(),
19509
- /** Group membership + group rows removed with their last member (best-effort). */
19510
- groups: number().int()
19548
+ embeddings: number().int()
19511
19549
  });
19512
19550
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19513
19551
  var DiskReconcileCountsSchema = object({
@@ -19677,6 +19715,47 @@ var RebuildStatusSchema = object({
19677
19715
  /** Present when the pass ended by throwing. */
19678
19716
  error: string().nullable()
19679
19717
  });
19718
+ /**
19719
+ * Acknowledgement that a debug-media reclaim STARTED.
19720
+ *
19721
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19722
+ * it runs detached and this returns immediately. Awaiting it is how the
19723
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19724
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19725
+ */
19726
+ var MediaReclaimStartResultSchema = object({
19727
+ started: boolean(),
19728
+ /** True when a pass was already running; the new request is ignored. */
19729
+ alreadyRunning: boolean()
19730
+ });
19731
+ var MediaReclaimInputSchema = object({
19732
+ mode: _enum(["report", "reclaim"]).default("report"),
19733
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19734
+ deviceIds: array(number().int()).min(1).optional(),
19735
+ restart: boolean().optional(),
19736
+ pageSize: number().int().min(50).max(5e3).optional(),
19737
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19738
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19739
+ maxBytesPerRun: number().int().min(1).optional(),
19740
+ budgetMinutes: number().int().min(1).max(720).optional(),
19741
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19742
+ graceMinutes: number().int().min(1).max(10080).optional()
19743
+ });
19744
+ var MediaReclaimStatusSchema = object({
19745
+ running: boolean(),
19746
+ mode: _enum(["report", "reclaim"]).nullable(),
19747
+ totalExamined: number(),
19748
+ totalEligible: number(),
19749
+ totalReclaimed: number(),
19750
+ totalBytesReclaimed: number(),
19751
+ totalRefused: number(),
19752
+ /** Device+scope windows finished in this pass. */
19753
+ devicesDone: number(),
19754
+ complete: boolean().nullable(),
19755
+ startedAtMs: number().nullable(),
19756
+ finishedAtMs: number().nullable(),
19757
+ error: string().nullable()
19758
+ });
19680
19759
  var ReplayFrameInputSchema = object({
19681
19760
  timestamp: number(),
19682
19761
  frame: PipelineRunResultBridge
@@ -19715,10 +19794,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19715
19794
  * stationary registry). Default false: the timeline lists passages,
19716
19795
  * not parking records (operator decision, 2026-08-15). */
19717
19796
  includeStationary: boolean().optional()
19718
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19719
- deviceId: number(),
19720
- groupId: string().min(1)
19721
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19797
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19722
19798
  kind: "mutation",
19723
19799
  auth: "admin"
19724
19800
  }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({ deviceId: number() }), array(EventKindDescriptorSchema).readonly()), method(object({ deviceIds: array(number()).min(1).max(200) }), array(EventKindsForDeviceSchema).readonly()), method(object({
@@ -19818,6 +19894,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19818
19894
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19819
19895
  kind: "query",
19820
19896
  auth: "admin"
19897
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19898
+ kind: "mutation",
19899
+ auth: "admin"
19900
+ }), method(object({}), MediaReclaimStatusSchema, {
19901
+ kind: "query",
19902
+ auth: "admin"
19821
19903
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19822
19904
  kind: "query",
19823
19905
  auth: "admin"
@@ -21892,7 +21974,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21892
21974
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21893
21975
  kind: "mutation",
21894
21976
  auth: "admin"
21895
- });
21977
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21978
+ kind: "mutation",
21979
+ auth: "admin"
21980
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21981
+ kind: "mutation",
21982
+ auth: "admin"
21983
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21896
21984
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21897
21985
  providerId: string().min(1),
21898
21986
  displayName: string().min(1),
@@ -29118,6 +29206,33 @@ var RecordingRebalanceInputSchema = object({
29118
29206
  minMoveGb: number().min(0).optional()
29119
29207
  });
29120
29208
  /**
29209
+ * Operator-facing placement of one camera onto a recordings location.
29210
+ *
29211
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
29212
+ * Auto (the planner may move this camera). `locationId` is where high/mid
29213
+ * currently write — the plan, which may disagree with the pin when Auto.
29214
+ */
29215
+ var RecordingDevicePlacementSchema = object({
29216
+ deviceId: number().int(),
29217
+ profile: string(),
29218
+ locationId: string()
29219
+ });
29220
+ var RecordingDevicePinSchema = object({
29221
+ deviceId: number().int(),
29222
+ /** Recordings-class location this camera is pinned to. */
29223
+ locationId: string()
29224
+ });
29225
+ var RecordingPlacementViewSchema = object({
29226
+ assignments: array(RecordingDevicePlacementSchema),
29227
+ pins: array(RecordingDevicePinSchema),
29228
+ defaultLocations: record(string(), string())
29229
+ });
29230
+ var RecordingSetDevicePlacementInputSchema = object({
29231
+ deviceId: number().int(),
29232
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
29233
+ locationId: string().nullable()
29234
+ });
29235
+ /**
29121
29236
  * Result of locating footage at a wall-clock instant for one device/profile.
29122
29237
  * `segment` carries the covering segment's window; `gap` reports the forward
29123
29238
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -29343,6 +29458,12 @@ method(object({
29343
29458
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
29344
29459
  kind: "mutation",
29345
29460
  auth: "admin"
29461
+ }), method(object({}), RecordingPlacementViewSchema, {
29462
+ kind: "query",
29463
+ auth: "admin"
29464
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29465
+ kind: "mutation",
29466
+ auth: "admin"
29346
29467
  });
29347
29468
  /**
29348
29469
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -34843,6 +34964,12 @@ Object.freeze({
34843
34964
  addonId: null,
34844
34965
  access: "delete"
34845
34966
  },
34967
+ "deviceManager.renameLocation": {
34968
+ capName: "device-manager",
34969
+ capScope: "system",
34970
+ addonId: null,
34971
+ access: "create"
34972
+ },
34846
34973
  "deviceManager.runDeviceAction": {
34847
34974
  capName: "device-manager",
34848
34975
  capScope: "system",
@@ -36535,19 +36662,19 @@ Object.freeze({
36535
36662
  addonId: null,
36536
36663
  access: "view"
36537
36664
  },
36538
- "pipelineAnalytics.getGroup": {
36665
+ "pipelineAnalytics.getKeyEvents": {
36539
36666
  capName: "pipeline-analytics",
36540
36667
  capScope: "device",
36541
36668
  addonId: null,
36542
36669
  access: "view"
36543
36670
  },
36544
- "pipelineAnalytics.getKeyEvents": {
36671
+ "pipelineAnalytics.getKeyEventsBatch": {
36545
36672
  capName: "pipeline-analytics",
36546
36673
  capScope: "device",
36547
36674
  addonId: null,
36548
36675
  access: "view"
36549
36676
  },
36550
- "pipelineAnalytics.getKeyEventsBatch": {
36677
+ "pipelineAnalytics.getMediaReclaimStatus": {
36551
36678
  capName: "pipeline-analytics",
36552
36679
  capScope: "device",
36553
36680
  addonId: null,
@@ -36637,12 +36764,6 @@ Object.freeze({
36637
36764
  addonId: null,
36638
36765
  access: "view"
36639
36766
  },
36640
- "pipelineAnalytics.listGroups": {
36641
- capName: "pipeline-analytics",
36642
- capScope: "device",
36643
- addonId: null,
36644
- access: "view"
36645
- },
36646
36767
  "pipelineAnalytics.listOpsLog": {
36647
36768
  capName: "pipeline-analytics",
36648
36769
  capScope: "device",
@@ -36727,6 +36848,12 @@ Object.freeze({
36727
36848
  addonId: null,
36728
36849
  access: "create"
36729
36850
  },
36851
+ "pipelineAnalytics.reclaimDebugMedia": {
36852
+ capName: "pipeline-analytics",
36853
+ capScope: "device",
36854
+ addonId: null,
36855
+ access: "create"
36856
+ },
36730
36857
  "pipelineAnalytics.reconcileFromDisk": {
36731
36858
  capName: "pipeline-analytics",
36732
36859
  capScope: "device",
@@ -37651,6 +37778,12 @@ Object.freeze({
37651
37778
  addonId: null,
37652
37779
  access: "view"
37653
37780
  },
37781
+ "recording.getPlacement": {
37782
+ capName: "recording",
37783
+ capScope: "system",
37784
+ addonId: null,
37785
+ access: "view"
37786
+ },
37654
37787
  "recording.getPlaybackManifest": {
37655
37788
  capName: "recording",
37656
37789
  capScope: "system",
@@ -37777,6 +37910,12 @@ Object.freeze({
37777
37910
  addonId: null,
37778
37911
  access: "create"
37779
37912
  },
37913
+ "recording.setDevicePlacement": {
37914
+ capName: "recording",
37915
+ capScope: "system",
37916
+ addonId: null,
37917
+ access: "create"
37918
+ },
37780
37919
  "recording.startStorageMigrationMove": {
37781
37920
  capName: "recording",
37782
37921
  capScope: "system",
@@ -38221,12 +38360,36 @@ Object.freeze({
38221
38360
  addonId: null,
38222
38361
  access: "create"
38223
38362
  },
38363
+ "storageMigration.cleanupCancel": {
38364
+ capName: "storage-migration",
38365
+ capScope: "system",
38366
+ addonId: null,
38367
+ access: "create"
38368
+ },
38369
+ "storageMigration.cleanupStart": {
38370
+ capName: "storage-migration",
38371
+ capScope: "system",
38372
+ addonId: null,
38373
+ access: "create"
38374
+ },
38375
+ "storageMigration.cleanupStatus": {
38376
+ capName: "storage-migration",
38377
+ capScope: "system",
38378
+ addonId: null,
38379
+ access: "view"
38380
+ },
38224
38381
  "storageMigration.drain": {
38225
38382
  capName: "storage-migration",
38226
38383
  capScope: "system",
38227
38384
  addonId: null,
38228
38385
  access: "create"
38229
38386
  },
38387
+ "storageMigration.history": {
38388
+ capName: "storage-migration",
38389
+ capScope: "system",
38390
+ addonId: null,
38391
+ access: "view"
38392
+ },
38230
38393
  "storageMigration.movers": {
38231
38394
  capName: "storage-migration",
38232
38395
  capScope: "system",
@@ -40223,11 +40386,6 @@ Object.freeze({
40223
40386
  form: "single",
40224
40387
  optional: true
40225
40388
  }],
40226
- "pipelineAnalytics.getGroup": [{
40227
- name: "deviceId",
40228
- form: "single",
40229
- optional: false
40230
- }],
40231
40389
  "pipelineAnalytics.getKeyEvents": [{
40232
40390
  name: "deviceId",
40233
40391
  form: "single",
@@ -40293,11 +40451,6 @@ Object.freeze({
40293
40451
  form: "single",
40294
40452
  optional: false
40295
40453
  }],
40296
- "pipelineAnalytics.listGroups": [{
40297
- name: "deviceIds",
40298
- form: "array",
40299
- optional: false
40300
- }],
40301
40454
  "pipelineAnalytics.listOpsLog": [{
40302
40455
  name: "deviceId",
40303
40456
  form: "single",
@@ -40343,6 +40496,11 @@ Object.freeze({
40343
40496
  form: "single",
40344
40497
  optional: true
40345
40498
  }],
40499
+ "pipelineAnalytics.reclaimDebugMedia": [{
40500
+ name: "deviceIds",
40501
+ form: "array",
40502
+ optional: true
40503
+ }],
40346
40504
  "pipelineAnalytics.reconcileFromDisk": [{
40347
40505
  name: "deviceId",
40348
40506
  form: "single",
@@ -40708,6 +40866,11 @@ Object.freeze({
40708
40866
  form: "single",
40709
40867
  optional: false
40710
40868
  }],
40869
+ "recording.setDevicePlacement": [{
40870
+ name: "deviceId",
40871
+ form: "single",
40872
+ optional: false
40873
+ }],
40711
40874
  "recording.startStorageMigrationMove": [{
40712
40875
  name: "deviceId",
40713
40876
  form: "single",
package/dist/addon.mjs CHANGED
@@ -8092,6 +8092,13 @@ var MediaRelocateModeSchema = _enum([
8092
8092
  ]);
8093
8093
  var RelocateMediaInputSchema = object({
8094
8094
  toLocationId: string(),
8095
+ /**
8096
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8097
+ * every row that is not already on `toLocationId` (the historical
8098
+ * behaviour). A named source is what a from→to migration needs: without it
8099
+ * "move events off disk 2" also emptied disk 1.
8100
+ */
8101
+ fromLocationId: string().optional(),
8095
8102
  throttleMbps: number().min(1).max(1e3).optional(),
8096
8103
  /** Omitted = `move`, the pre-existing behaviour. */
8097
8104
  mode: MediaRelocateModeSchema.optional()
@@ -8159,6 +8166,19 @@ var StorageMigrationDestinationsSchema = object({
8159
8166
  galleryMedia: string().min(1).optional()
8160
8167
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8161
8168
  /**
8169
+ * Optional named source per class. Omitted = the class's current default
8170
+ * (the historical behaviour). A named source that is NOT the default is a
8171
+ * drain of that disk: bytes move, the default stays, and the source is
8172
+ * disabled when the move finishes.
8173
+ */
8174
+ var StorageMigrationSourcesSchema = object({
8175
+ recordings: string().min(1).optional(),
8176
+ recordingsLow: string().min(1).optional(),
8177
+ eventMedia: string().min(1).optional(),
8178
+ backups: string().min(1).optional(),
8179
+ galleryMedia: string().min(1).optional()
8180
+ }).optional();
8181
+ /**
8162
8182
  * How a migration sequences the cutover against the byte move.
8163
8183
  *
8164
8184
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8180,6 +8200,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8180
8200
  /** Shared input for planning and starting an orchestrated storage migration. */
8181
8201
  var StorageMigrationInputSchema = object({
8182
8202
  destinations: StorageMigrationDestinationsSchema,
8203
+ /** Omitted = each class's current default. */
8204
+ sources: StorageMigrationSourcesSchema,
8183
8205
  throttleMbps: number().min(1).max(1e3).optional(),
8184
8206
  /** Omitted = `blocking`, which stays the default. */
8185
8207
  mode: StorageMigrationModeSchema.optional()
@@ -8259,6 +8281,13 @@ var StorageMigrationMoveSchema = object({
8259
8281
  storageClass: StorageMigrationClassSchema,
8260
8282
  fromLocationId: string(),
8261
8283
  toLocationId: string(),
8284
+ /**
8285
+ * True when `from` was NOT the class default at plan time. The move still
8286
+ * copies bytes, but the default is left alone and the source is disabled
8287
+ * once the copy verifies. Absent on jobs planned before this field existed
8288
+ * — those jobs always repointed, which is `false`.
8289
+ */
8290
+ freezeSource: boolean().optional(),
8262
8291
  moverJobId: string().nullable(),
8263
8292
  state: RelocateJobStateSchema.nullable(),
8264
8293
  error: string().nullable(),
@@ -8272,6 +8301,7 @@ var StorageMigrationJobSchema = object({
8272
8301
  * can tell a seconds-long cutover from a thirty-hour one. */
8273
8302
  mode: StorageMigrationModeSchema,
8274
8303
  destinations: StorageMigrationDestinationsSchema,
8304
+ sources: StorageMigrationSourcesSchema,
8275
8305
  throttleMbps: number(),
8276
8306
  moves: array(StorageMigrationMoveSchema),
8277
8307
  pauseLeaseId: string().nullable(),
@@ -8297,6 +8327,7 @@ var StorageMigrationFindingSchema = object({
8297
8327
  });
8298
8328
  var StorageMigrationPlanSchema = object({
8299
8329
  destinations: StorageMigrationDestinationsSchema,
8330
+ sources: StorageMigrationSourcesSchema,
8300
8331
  /** The mode this plan was built for. A plan is only valid for its mode: the
8301
8332
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8302
8333
  * it. */
@@ -8304,7 +8335,8 @@ var StorageMigrationPlanSchema = object({
8304
8335
  moves: array(object({
8305
8336
  storageClass: StorageMigrationClassSchema,
8306
8337
  fromLocationId: string(),
8307
- toLocationId: string()
8338
+ toLocationId: string(),
8339
+ freezeSource: boolean().optional()
8308
8340
  })),
8309
8341
  findings: array(StorageMigrationFindingSchema)
8310
8342
  });
@@ -8482,10 +8514,51 @@ var LedgerWalkReportSchema = object({
8482
8514
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8483
8515
  var RelocatableMediaCountInputSchema = object({
8484
8516
  toLocationId: string().min(1),
8517
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8518
+ fromLocationId: string().optional(),
8485
8519
  /** Omitted = `move`. */
8486
8520
  mode: MediaRelocateModeSchema.optional()
8487
8521
  });
8488
8522
  /**
8523
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8524
+ * ghost ledger entries on frozen footage locations.
8525
+ *
8526
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8527
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8528
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8529
+ * with no operator-visible status.
8530
+ */
8531
+ var StorageCleanupPhaseSchema = _enum([
8532
+ "orphans",
8533
+ "debug-media",
8534
+ "ghost-ledger",
8535
+ "done",
8536
+ "failed",
8537
+ "cancelled"
8538
+ ]);
8539
+ var StorageCleanupInputSchema = object({
8540
+ /** Also walk motion stills / track filmstrips. Off by default. */
8541
+ includeDebugMedia: boolean().optional() });
8542
+ var StorageCleanupJobSchema = object({
8543
+ jobId: string(),
8544
+ phase: StorageCleanupPhaseSchema,
8545
+ includeDebugMedia: boolean(),
8546
+ orphansReclaimed: number().int().nonnegative(),
8547
+ orphanBytesReclaimed: number().int().nonnegative(),
8548
+ debugMediaReclaimed: number().int().nonnegative(),
8549
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8550
+ ghostsForgotten: number().int().nonnegative(),
8551
+ ghostBytesForgotten: number().int().nonnegative(),
8552
+ /** Short operator-facing line: current collection, pass, or location. */
8553
+ detail: string().nullable(),
8554
+ cancelRequested: boolean(),
8555
+ startedAt: number(),
8556
+ updatedAt: number(),
8557
+ finishedAt: number().nullable(),
8558
+ error: string().nullable()
8559
+ });
8560
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8561
+ /**
8489
8562
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8490
8563
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8491
8564
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8513,11 +8586,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8513
8586
  * The default location for a type uses `id === <type>:default` by
8514
8587
  * convention (the bare type ref like `'backups'` resolves to it).
8515
8588
  *
8516
- * `isSystem: true` marks a location as orchestrator-seeded and
8517
- * undeletable. The bootstrap-installed defaults (one per type) carry
8518
- * this flag; operator-added locations don't. Editing the config of
8519
- * a system location is allowed (path migration, provider swap) but
8520
- * deleting it is rejected at the cap level.
8589
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8590
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8591
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8592
+ * / last-enabled, not on this bit.
8521
8593
  */
8522
8594
  var StorageLocationSchema = object({
8523
8595
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -13336,6 +13408,12 @@ method(object({
13336
13408
  }), _void(), {
13337
13409
  kind: "mutation",
13338
13410
  auth: "admin"
13411
+ }), method(object({
13412
+ from: string(),
13413
+ to: string()
13414
+ }), object({ moved: number() }), {
13415
+ kind: "mutation",
13416
+ auth: "admin"
13339
13417
  }), method(object({
13340
13418
  deviceId: number(),
13341
13419
  disabled: boolean()
@@ -16105,6 +16183,8 @@ var NcSystemEventKindSchema = _enum([
16105
16183
  "device-offline",
16106
16184
  "device-disabled",
16107
16185
  "device-enabled",
16186
+ "device-battery-low",
16187
+ "device-battery-normal",
16108
16188
  "stream-online",
16109
16189
  "stream-offline",
16110
16190
  "node-online",
@@ -19363,46 +19443,6 @@ var RecentTracksPageSchema = object({
19363
19443
  /** Cursor for the next page, or null when this page is the last. */
19364
19444
  nextCursor: string().nullable()
19365
19445
  });
19366
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
19367
- var LIST_GROUPS_MAX_LIMIT = 100;
19368
- var AnalyticsGroupRecordSchema = object({
19369
- id: string(),
19370
- deviceId: number().int(),
19371
- openedAt: number().int(),
19372
- closedAt: number().int(),
19373
- timestamp: number().int(),
19374
- memberCount: number().int(),
19375
- memberTrackIds: array(string()).readonly(),
19376
- className: string(),
19377
- classes: array(string()).readonly(),
19378
- /** Relative event-media path, or null when the group has no picture yet. */
19379
- mediaUrl: string().nullable(),
19380
- singleton: boolean()
19381
- });
19382
- var AnalyticsGroupMemberSchema = object({
19383
- trackId: string(),
19384
- deviceId: number().int(),
19385
- className: string(),
19386
- firstSeen: number().int(),
19387
- lastSeen: number().int(),
19388
- mediaUrl: string().nullable()
19389
- });
19390
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
19391
- var ListGroupsQueryInput = object({
19392
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
19393
- deviceIds: array(number()),
19394
- /** Window lower bound on `closedAt` (inclusive). */
19395
- since: number().optional(),
19396
- /** Window upper bound on `openedAt` (inclusive). */
19397
- until: number().optional(),
19398
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
19399
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
19400
- cursor: string().optional()
19401
- });
19402
- var ListGroupsPageSchema = object({
19403
- groups: array(AnalyticsGroupRecordSchema).readonly(),
19404
- nextCursor: string().nullable()
19405
- });
19406
19446
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19407
19447
  var KEY_EVENTS_MAX_LIMIT = 200;
19408
19448
  var KeyEventQueryInput = object({
@@ -19506,9 +19546,7 @@ var TrackCascadeCountsSchema = object({
19506
19546
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19507
19547
  plates: number().int(),
19508
19548
  /** Per-track CLIP search vectors removed (best-effort). */
19509
- embeddings: number().int(),
19510
- /** Group membership + group rows removed with their last member (best-effort). */
19511
- groups: number().int()
19549
+ embeddings: number().int()
19512
19550
  });
19513
19551
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19514
19552
  var DiskReconcileCountsSchema = object({
@@ -19678,6 +19716,47 @@ var RebuildStatusSchema = object({
19678
19716
  /** Present when the pass ended by throwing. */
19679
19717
  error: string().nullable()
19680
19718
  });
19719
+ /**
19720
+ * Acknowledgement that a debug-media reclaim STARTED.
19721
+ *
19722
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19723
+ * it runs detached and this returns immediately. Awaiting it is how the
19724
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19725
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19726
+ */
19727
+ var MediaReclaimStartResultSchema = object({
19728
+ started: boolean(),
19729
+ /** True when a pass was already running; the new request is ignored. */
19730
+ alreadyRunning: boolean()
19731
+ });
19732
+ var MediaReclaimInputSchema = object({
19733
+ mode: _enum(["report", "reclaim"]).default("report"),
19734
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19735
+ deviceIds: array(number().int()).min(1).optional(),
19736
+ restart: boolean().optional(),
19737
+ pageSize: number().int().min(50).max(5e3).optional(),
19738
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19739
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19740
+ maxBytesPerRun: number().int().min(1).optional(),
19741
+ budgetMinutes: number().int().min(1).max(720).optional(),
19742
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19743
+ graceMinutes: number().int().min(1).max(10080).optional()
19744
+ });
19745
+ var MediaReclaimStatusSchema = object({
19746
+ running: boolean(),
19747
+ mode: _enum(["report", "reclaim"]).nullable(),
19748
+ totalExamined: number(),
19749
+ totalEligible: number(),
19750
+ totalReclaimed: number(),
19751
+ totalBytesReclaimed: number(),
19752
+ totalRefused: number(),
19753
+ /** Device+scope windows finished in this pass. */
19754
+ devicesDone: number(),
19755
+ complete: boolean().nullable(),
19756
+ startedAtMs: number().nullable(),
19757
+ finishedAtMs: number().nullable(),
19758
+ error: string().nullable()
19759
+ });
19681
19760
  var ReplayFrameInputSchema = object({
19682
19761
  timestamp: number(),
19683
19762
  frame: PipelineRunResultBridge
@@ -19716,10 +19795,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19716
19795
  * stationary registry). Default false: the timeline lists passages,
19717
19796
  * not parking records (operator decision, 2026-08-15). */
19718
19797
  includeStationary: boolean().optional()
19719
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19720
- deviceId: number(),
19721
- groupId: string().min(1)
19722
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19798
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19723
19799
  kind: "mutation",
19724
19800
  auth: "admin"
19725
19801
  }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({ deviceId: number() }), array(EventKindDescriptorSchema).readonly()), method(object({ deviceIds: array(number()).min(1).max(200) }), array(EventKindsForDeviceSchema).readonly()), method(object({
@@ -19819,6 +19895,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19819
19895
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19820
19896
  kind: "query",
19821
19897
  auth: "admin"
19898
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19899
+ kind: "mutation",
19900
+ auth: "admin"
19901
+ }), method(object({}), MediaReclaimStatusSchema, {
19902
+ kind: "query",
19903
+ auth: "admin"
19822
19904
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19823
19905
  kind: "query",
19824
19906
  auth: "admin"
@@ -21893,7 +21975,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21893
21975
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21894
21976
  kind: "mutation",
21895
21977
  auth: "admin"
21896
- });
21978
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21979
+ kind: "mutation",
21980
+ auth: "admin"
21981
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21982
+ kind: "mutation",
21983
+ auth: "admin"
21984
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21897
21985
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21898
21986
  providerId: string().min(1),
21899
21987
  displayName: string().min(1),
@@ -29119,6 +29207,33 @@ var RecordingRebalanceInputSchema = object({
29119
29207
  minMoveGb: number().min(0).optional()
29120
29208
  });
29121
29209
  /**
29210
+ * Operator-facing placement of one camera onto a recordings location.
29211
+ *
29212
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
29213
+ * Auto (the planner may move this camera). `locationId` is where high/mid
29214
+ * currently write — the plan, which may disagree with the pin when Auto.
29215
+ */
29216
+ var RecordingDevicePlacementSchema = object({
29217
+ deviceId: number().int(),
29218
+ profile: string(),
29219
+ locationId: string()
29220
+ });
29221
+ var RecordingDevicePinSchema = object({
29222
+ deviceId: number().int(),
29223
+ /** Recordings-class location this camera is pinned to. */
29224
+ locationId: string()
29225
+ });
29226
+ var RecordingPlacementViewSchema = object({
29227
+ assignments: array(RecordingDevicePlacementSchema),
29228
+ pins: array(RecordingDevicePinSchema),
29229
+ defaultLocations: record(string(), string())
29230
+ });
29231
+ var RecordingSetDevicePlacementInputSchema = object({
29232
+ deviceId: number().int(),
29233
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
29234
+ locationId: string().nullable()
29235
+ });
29236
+ /**
29122
29237
  * Result of locating footage at a wall-clock instant for one device/profile.
29123
29238
  * `segment` carries the covering segment's window; `gap` reports the forward
29124
29239
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -29344,6 +29459,12 @@ method(object({
29344
29459
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
29345
29460
  kind: "mutation",
29346
29461
  auth: "admin"
29462
+ }), method(object({}), RecordingPlacementViewSchema, {
29463
+ kind: "query",
29464
+ auth: "admin"
29465
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29466
+ kind: "mutation",
29467
+ auth: "admin"
29347
29468
  });
29348
29469
  /**
29349
29470
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -34844,6 +34965,12 @@ Object.freeze({
34844
34965
  addonId: null,
34845
34966
  access: "delete"
34846
34967
  },
34968
+ "deviceManager.renameLocation": {
34969
+ capName: "device-manager",
34970
+ capScope: "system",
34971
+ addonId: null,
34972
+ access: "create"
34973
+ },
34847
34974
  "deviceManager.runDeviceAction": {
34848
34975
  capName: "device-manager",
34849
34976
  capScope: "system",
@@ -36536,19 +36663,19 @@ Object.freeze({
36536
36663
  addonId: null,
36537
36664
  access: "view"
36538
36665
  },
36539
- "pipelineAnalytics.getGroup": {
36666
+ "pipelineAnalytics.getKeyEvents": {
36540
36667
  capName: "pipeline-analytics",
36541
36668
  capScope: "device",
36542
36669
  addonId: null,
36543
36670
  access: "view"
36544
36671
  },
36545
- "pipelineAnalytics.getKeyEvents": {
36672
+ "pipelineAnalytics.getKeyEventsBatch": {
36546
36673
  capName: "pipeline-analytics",
36547
36674
  capScope: "device",
36548
36675
  addonId: null,
36549
36676
  access: "view"
36550
36677
  },
36551
- "pipelineAnalytics.getKeyEventsBatch": {
36678
+ "pipelineAnalytics.getMediaReclaimStatus": {
36552
36679
  capName: "pipeline-analytics",
36553
36680
  capScope: "device",
36554
36681
  addonId: null,
@@ -36638,12 +36765,6 @@ Object.freeze({
36638
36765
  addonId: null,
36639
36766
  access: "view"
36640
36767
  },
36641
- "pipelineAnalytics.listGroups": {
36642
- capName: "pipeline-analytics",
36643
- capScope: "device",
36644
- addonId: null,
36645
- access: "view"
36646
- },
36647
36768
  "pipelineAnalytics.listOpsLog": {
36648
36769
  capName: "pipeline-analytics",
36649
36770
  capScope: "device",
@@ -36728,6 +36849,12 @@ Object.freeze({
36728
36849
  addonId: null,
36729
36850
  access: "create"
36730
36851
  },
36852
+ "pipelineAnalytics.reclaimDebugMedia": {
36853
+ capName: "pipeline-analytics",
36854
+ capScope: "device",
36855
+ addonId: null,
36856
+ access: "create"
36857
+ },
36731
36858
  "pipelineAnalytics.reconcileFromDisk": {
36732
36859
  capName: "pipeline-analytics",
36733
36860
  capScope: "device",
@@ -37652,6 +37779,12 @@ Object.freeze({
37652
37779
  addonId: null,
37653
37780
  access: "view"
37654
37781
  },
37782
+ "recording.getPlacement": {
37783
+ capName: "recording",
37784
+ capScope: "system",
37785
+ addonId: null,
37786
+ access: "view"
37787
+ },
37655
37788
  "recording.getPlaybackManifest": {
37656
37789
  capName: "recording",
37657
37790
  capScope: "system",
@@ -37778,6 +37911,12 @@ Object.freeze({
37778
37911
  addonId: null,
37779
37912
  access: "create"
37780
37913
  },
37914
+ "recording.setDevicePlacement": {
37915
+ capName: "recording",
37916
+ capScope: "system",
37917
+ addonId: null,
37918
+ access: "create"
37919
+ },
37781
37920
  "recording.startStorageMigrationMove": {
37782
37921
  capName: "recording",
37783
37922
  capScope: "system",
@@ -38222,12 +38361,36 @@ Object.freeze({
38222
38361
  addonId: null,
38223
38362
  access: "create"
38224
38363
  },
38364
+ "storageMigration.cleanupCancel": {
38365
+ capName: "storage-migration",
38366
+ capScope: "system",
38367
+ addonId: null,
38368
+ access: "create"
38369
+ },
38370
+ "storageMigration.cleanupStart": {
38371
+ capName: "storage-migration",
38372
+ capScope: "system",
38373
+ addonId: null,
38374
+ access: "create"
38375
+ },
38376
+ "storageMigration.cleanupStatus": {
38377
+ capName: "storage-migration",
38378
+ capScope: "system",
38379
+ addonId: null,
38380
+ access: "view"
38381
+ },
38225
38382
  "storageMigration.drain": {
38226
38383
  capName: "storage-migration",
38227
38384
  capScope: "system",
38228
38385
  addonId: null,
38229
38386
  access: "create"
38230
38387
  },
38388
+ "storageMigration.history": {
38389
+ capName: "storage-migration",
38390
+ capScope: "system",
38391
+ addonId: null,
38392
+ access: "view"
38393
+ },
38231
38394
  "storageMigration.movers": {
38232
38395
  capName: "storage-migration",
38233
38396
  capScope: "system",
@@ -40224,11 +40387,6 @@ Object.freeze({
40224
40387
  form: "single",
40225
40388
  optional: true
40226
40389
  }],
40227
- "pipelineAnalytics.getGroup": [{
40228
- name: "deviceId",
40229
- form: "single",
40230
- optional: false
40231
- }],
40232
40390
  "pipelineAnalytics.getKeyEvents": [{
40233
40391
  name: "deviceId",
40234
40392
  form: "single",
@@ -40294,11 +40452,6 @@ Object.freeze({
40294
40452
  form: "single",
40295
40453
  optional: false
40296
40454
  }],
40297
- "pipelineAnalytics.listGroups": [{
40298
- name: "deviceIds",
40299
- form: "array",
40300
- optional: false
40301
- }],
40302
40455
  "pipelineAnalytics.listOpsLog": [{
40303
40456
  name: "deviceId",
40304
40457
  form: "single",
@@ -40344,6 +40497,11 @@ Object.freeze({
40344
40497
  form: "single",
40345
40498
  optional: true
40346
40499
  }],
40500
+ "pipelineAnalytics.reclaimDebugMedia": [{
40501
+ name: "deviceIds",
40502
+ form: "array",
40503
+ optional: true
40504
+ }],
40347
40505
  "pipelineAnalytics.reconcileFromDisk": [{
40348
40506
  name: "deviceId",
40349
40507
  form: "single",
@@ -40709,6 +40867,11 @@ Object.freeze({
40709
40867
  form: "single",
40710
40868
  optional: false
40711
40869
  }],
40870
+ "recording.setDevicePlacement": [{
40871
+ name: "deviceId",
40872
+ form: "single",
40873
+ optional: false
40874
+ }],
40712
40875
  "recording.startStorageMigrationMove": [{
40713
40876
  name: "deviceId",
40714
40877
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-hikvision",
3
- "version": "1.2.57",
3
+ "version": "1.2.59",
4
4
  "description": "Hikvision camera device provider addon for CamStack — ISAPI over HTTP(S) with digest auth (snapshot, alarm stream, RTSP discovery)",
5
5
  "keywords": [
6
6
  "camstack",