@camstack/addon-provider-hikvision 1.2.57 → 1.2.58

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 +234 -73
  2. package/dist/addon.mjs +234 -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()
@@ -19362,46 +19440,6 @@ var RecentTracksPageSchema = object({
19362
19440
  /** Cursor for the next page, or null when this page is the last. */
19363
19441
  nextCursor: string().nullable()
19364
19442
  });
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
19443
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19406
19444
  var KEY_EVENTS_MAX_LIMIT = 200;
19407
19445
  var KeyEventQueryInput = object({
@@ -19505,9 +19543,7 @@ var TrackCascadeCountsSchema = object({
19505
19543
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19506
19544
  plates: number().int(),
19507
19545
  /** 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()
19546
+ embeddings: number().int()
19511
19547
  });
19512
19548
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19513
19549
  var DiskReconcileCountsSchema = object({
@@ -19677,6 +19713,47 @@ var RebuildStatusSchema = object({
19677
19713
  /** Present when the pass ended by throwing. */
19678
19714
  error: string().nullable()
19679
19715
  });
19716
+ /**
19717
+ * Acknowledgement that a debug-media reclaim STARTED.
19718
+ *
19719
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19720
+ * it runs detached and this returns immediately. Awaiting it is how the
19721
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19722
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19723
+ */
19724
+ var MediaReclaimStartResultSchema = object({
19725
+ started: boolean(),
19726
+ /** True when a pass was already running; the new request is ignored. */
19727
+ alreadyRunning: boolean()
19728
+ });
19729
+ var MediaReclaimInputSchema = object({
19730
+ mode: _enum(["report", "reclaim"]).default("report"),
19731
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19732
+ deviceIds: array(number().int()).min(1).optional(),
19733
+ restart: boolean().optional(),
19734
+ pageSize: number().int().min(50).max(5e3).optional(),
19735
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19736
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19737
+ maxBytesPerRun: number().int().min(1).optional(),
19738
+ budgetMinutes: number().int().min(1).max(720).optional(),
19739
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19740
+ graceMinutes: number().int().min(1).max(10080).optional()
19741
+ });
19742
+ var MediaReclaimStatusSchema = object({
19743
+ running: boolean(),
19744
+ mode: _enum(["report", "reclaim"]).nullable(),
19745
+ totalExamined: number(),
19746
+ totalEligible: number(),
19747
+ totalReclaimed: number(),
19748
+ totalBytesReclaimed: number(),
19749
+ totalRefused: number(),
19750
+ /** Device+scope windows finished in this pass. */
19751
+ devicesDone: number(),
19752
+ complete: boolean().nullable(),
19753
+ startedAtMs: number().nullable(),
19754
+ finishedAtMs: number().nullable(),
19755
+ error: string().nullable()
19756
+ });
19680
19757
  var ReplayFrameInputSchema = object({
19681
19758
  timestamp: number(),
19682
19759
  frame: PipelineRunResultBridge
@@ -19715,10 +19792,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19715
19792
  * stationary registry). Default false: the timeline lists passages,
19716
19793
  * not parking records (operator decision, 2026-08-15). */
19717
19794
  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(), {
19795
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19722
19796
  kind: "mutation",
19723
19797
  auth: "admin"
19724
19798
  }), 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 +19892,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19818
19892
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19819
19893
  kind: "query",
19820
19894
  auth: "admin"
19895
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19896
+ kind: "mutation",
19897
+ auth: "admin"
19898
+ }), method(object({}), MediaReclaimStatusSchema, {
19899
+ kind: "query",
19900
+ auth: "admin"
19821
19901
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19822
19902
  kind: "query",
19823
19903
  auth: "admin"
@@ -21892,7 +21972,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21892
21972
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21893
21973
  kind: "mutation",
21894
21974
  auth: "admin"
21895
- });
21975
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21976
+ kind: "mutation",
21977
+ auth: "admin"
21978
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21979
+ kind: "mutation",
21980
+ auth: "admin"
21981
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21896
21982
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21897
21983
  providerId: string().min(1),
21898
21984
  displayName: string().min(1),
@@ -29118,6 +29204,33 @@ var RecordingRebalanceInputSchema = object({
29118
29204
  minMoveGb: number().min(0).optional()
29119
29205
  });
29120
29206
  /**
29207
+ * Operator-facing placement of one camera onto a recordings location.
29208
+ *
29209
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
29210
+ * Auto (the planner may move this camera). `locationId` is where high/mid
29211
+ * currently write — the plan, which may disagree with the pin when Auto.
29212
+ */
29213
+ var RecordingDevicePlacementSchema = object({
29214
+ deviceId: number().int(),
29215
+ profile: string(),
29216
+ locationId: string()
29217
+ });
29218
+ var RecordingDevicePinSchema = object({
29219
+ deviceId: number().int(),
29220
+ /** Recordings-class location this camera is pinned to. */
29221
+ locationId: string()
29222
+ });
29223
+ var RecordingPlacementViewSchema = object({
29224
+ assignments: array(RecordingDevicePlacementSchema),
29225
+ pins: array(RecordingDevicePinSchema),
29226
+ defaultLocations: record(string(), string())
29227
+ });
29228
+ var RecordingSetDevicePlacementInputSchema = object({
29229
+ deviceId: number().int(),
29230
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
29231
+ locationId: string().nullable()
29232
+ });
29233
+ /**
29121
29234
  * Result of locating footage at a wall-clock instant for one device/profile.
29122
29235
  * `segment` carries the covering segment's window; `gap` reports the forward
29123
29236
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -29343,6 +29456,12 @@ method(object({
29343
29456
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
29344
29457
  kind: "mutation",
29345
29458
  auth: "admin"
29459
+ }), method(object({}), RecordingPlacementViewSchema, {
29460
+ kind: "query",
29461
+ auth: "admin"
29462
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29463
+ kind: "mutation",
29464
+ auth: "admin"
29346
29465
  });
29347
29466
  /**
29348
29467
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -34843,6 +34962,12 @@ Object.freeze({
34843
34962
  addonId: null,
34844
34963
  access: "delete"
34845
34964
  },
34965
+ "deviceManager.renameLocation": {
34966
+ capName: "device-manager",
34967
+ capScope: "system",
34968
+ addonId: null,
34969
+ access: "create"
34970
+ },
34846
34971
  "deviceManager.runDeviceAction": {
34847
34972
  capName: "device-manager",
34848
34973
  capScope: "system",
@@ -36535,19 +36660,19 @@ Object.freeze({
36535
36660
  addonId: null,
36536
36661
  access: "view"
36537
36662
  },
36538
- "pipelineAnalytics.getGroup": {
36663
+ "pipelineAnalytics.getKeyEvents": {
36539
36664
  capName: "pipeline-analytics",
36540
36665
  capScope: "device",
36541
36666
  addonId: null,
36542
36667
  access: "view"
36543
36668
  },
36544
- "pipelineAnalytics.getKeyEvents": {
36669
+ "pipelineAnalytics.getKeyEventsBatch": {
36545
36670
  capName: "pipeline-analytics",
36546
36671
  capScope: "device",
36547
36672
  addonId: null,
36548
36673
  access: "view"
36549
36674
  },
36550
- "pipelineAnalytics.getKeyEventsBatch": {
36675
+ "pipelineAnalytics.getMediaReclaimStatus": {
36551
36676
  capName: "pipeline-analytics",
36552
36677
  capScope: "device",
36553
36678
  addonId: null,
@@ -36637,12 +36762,6 @@ Object.freeze({
36637
36762
  addonId: null,
36638
36763
  access: "view"
36639
36764
  },
36640
- "pipelineAnalytics.listGroups": {
36641
- capName: "pipeline-analytics",
36642
- capScope: "device",
36643
- addonId: null,
36644
- access: "view"
36645
- },
36646
36765
  "pipelineAnalytics.listOpsLog": {
36647
36766
  capName: "pipeline-analytics",
36648
36767
  capScope: "device",
@@ -36727,6 +36846,12 @@ Object.freeze({
36727
36846
  addonId: null,
36728
36847
  access: "create"
36729
36848
  },
36849
+ "pipelineAnalytics.reclaimDebugMedia": {
36850
+ capName: "pipeline-analytics",
36851
+ capScope: "device",
36852
+ addonId: null,
36853
+ access: "create"
36854
+ },
36730
36855
  "pipelineAnalytics.reconcileFromDisk": {
36731
36856
  capName: "pipeline-analytics",
36732
36857
  capScope: "device",
@@ -37651,6 +37776,12 @@ Object.freeze({
37651
37776
  addonId: null,
37652
37777
  access: "view"
37653
37778
  },
37779
+ "recording.getPlacement": {
37780
+ capName: "recording",
37781
+ capScope: "system",
37782
+ addonId: null,
37783
+ access: "view"
37784
+ },
37654
37785
  "recording.getPlaybackManifest": {
37655
37786
  capName: "recording",
37656
37787
  capScope: "system",
@@ -37777,6 +37908,12 @@ Object.freeze({
37777
37908
  addonId: null,
37778
37909
  access: "create"
37779
37910
  },
37911
+ "recording.setDevicePlacement": {
37912
+ capName: "recording",
37913
+ capScope: "system",
37914
+ addonId: null,
37915
+ access: "create"
37916
+ },
37780
37917
  "recording.startStorageMigrationMove": {
37781
37918
  capName: "recording",
37782
37919
  capScope: "system",
@@ -38221,12 +38358,36 @@ Object.freeze({
38221
38358
  addonId: null,
38222
38359
  access: "create"
38223
38360
  },
38361
+ "storageMigration.cleanupCancel": {
38362
+ capName: "storage-migration",
38363
+ capScope: "system",
38364
+ addonId: null,
38365
+ access: "create"
38366
+ },
38367
+ "storageMigration.cleanupStart": {
38368
+ capName: "storage-migration",
38369
+ capScope: "system",
38370
+ addonId: null,
38371
+ access: "create"
38372
+ },
38373
+ "storageMigration.cleanupStatus": {
38374
+ capName: "storage-migration",
38375
+ capScope: "system",
38376
+ addonId: null,
38377
+ access: "view"
38378
+ },
38224
38379
  "storageMigration.drain": {
38225
38380
  capName: "storage-migration",
38226
38381
  capScope: "system",
38227
38382
  addonId: null,
38228
38383
  access: "create"
38229
38384
  },
38385
+ "storageMigration.history": {
38386
+ capName: "storage-migration",
38387
+ capScope: "system",
38388
+ addonId: null,
38389
+ access: "view"
38390
+ },
38230
38391
  "storageMigration.movers": {
38231
38392
  capName: "storage-migration",
38232
38393
  capScope: "system",
@@ -40223,11 +40384,6 @@ Object.freeze({
40223
40384
  form: "single",
40224
40385
  optional: true
40225
40386
  }],
40226
- "pipelineAnalytics.getGroup": [{
40227
- name: "deviceId",
40228
- form: "single",
40229
- optional: false
40230
- }],
40231
40387
  "pipelineAnalytics.getKeyEvents": [{
40232
40388
  name: "deviceId",
40233
40389
  form: "single",
@@ -40293,11 +40449,6 @@ Object.freeze({
40293
40449
  form: "single",
40294
40450
  optional: false
40295
40451
  }],
40296
- "pipelineAnalytics.listGroups": [{
40297
- name: "deviceIds",
40298
- form: "array",
40299
- optional: false
40300
- }],
40301
40452
  "pipelineAnalytics.listOpsLog": [{
40302
40453
  name: "deviceId",
40303
40454
  form: "single",
@@ -40343,6 +40494,11 @@ Object.freeze({
40343
40494
  form: "single",
40344
40495
  optional: true
40345
40496
  }],
40497
+ "pipelineAnalytics.reclaimDebugMedia": [{
40498
+ name: "deviceIds",
40499
+ form: "array",
40500
+ optional: true
40501
+ }],
40346
40502
  "pipelineAnalytics.reconcileFromDisk": [{
40347
40503
  name: "deviceId",
40348
40504
  form: "single",
@@ -40708,6 +40864,11 @@ Object.freeze({
40708
40864
  form: "single",
40709
40865
  optional: false
40710
40866
  }],
40867
+ "recording.setDevicePlacement": [{
40868
+ name: "deviceId",
40869
+ form: "single",
40870
+ optional: false
40871
+ }],
40711
40872
  "recording.startStorageMigrationMove": [{
40712
40873
  name: "deviceId",
40713
40874
  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()
@@ -19363,46 +19441,6 @@ var RecentTracksPageSchema = object({
19363
19441
  /** Cursor for the next page, or null when this page is the last. */
19364
19442
  nextCursor: string().nullable()
19365
19443
  });
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
19444
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19407
19445
  var KEY_EVENTS_MAX_LIMIT = 200;
19408
19446
  var KeyEventQueryInput = object({
@@ -19506,9 +19544,7 @@ var TrackCascadeCountsSchema = object({
19506
19544
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19507
19545
  plates: number().int(),
19508
19546
  /** 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()
19547
+ embeddings: number().int()
19512
19548
  });
19513
19549
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19514
19550
  var DiskReconcileCountsSchema = object({
@@ -19678,6 +19714,47 @@ var RebuildStatusSchema = object({
19678
19714
  /** Present when the pass ended by throwing. */
19679
19715
  error: string().nullable()
19680
19716
  });
19717
+ /**
19718
+ * Acknowledgement that a debug-media reclaim STARTED.
19719
+ *
19720
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19721
+ * it runs detached and this returns immediately. Awaiting it is how the
19722
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19723
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19724
+ */
19725
+ var MediaReclaimStartResultSchema = object({
19726
+ started: boolean(),
19727
+ /** True when a pass was already running; the new request is ignored. */
19728
+ alreadyRunning: boolean()
19729
+ });
19730
+ var MediaReclaimInputSchema = object({
19731
+ mode: _enum(["report", "reclaim"]).default("report"),
19732
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19733
+ deviceIds: array(number().int()).min(1).optional(),
19734
+ restart: boolean().optional(),
19735
+ pageSize: number().int().min(50).max(5e3).optional(),
19736
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19737
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19738
+ maxBytesPerRun: number().int().min(1).optional(),
19739
+ budgetMinutes: number().int().min(1).max(720).optional(),
19740
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19741
+ graceMinutes: number().int().min(1).max(10080).optional()
19742
+ });
19743
+ var MediaReclaimStatusSchema = object({
19744
+ running: boolean(),
19745
+ mode: _enum(["report", "reclaim"]).nullable(),
19746
+ totalExamined: number(),
19747
+ totalEligible: number(),
19748
+ totalReclaimed: number(),
19749
+ totalBytesReclaimed: number(),
19750
+ totalRefused: number(),
19751
+ /** Device+scope windows finished in this pass. */
19752
+ devicesDone: number(),
19753
+ complete: boolean().nullable(),
19754
+ startedAtMs: number().nullable(),
19755
+ finishedAtMs: number().nullable(),
19756
+ error: string().nullable()
19757
+ });
19681
19758
  var ReplayFrameInputSchema = object({
19682
19759
  timestamp: number(),
19683
19760
  frame: PipelineRunResultBridge
@@ -19716,10 +19793,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19716
19793
  * stationary registry). Default false: the timeline lists passages,
19717
19794
  * not parking records (operator decision, 2026-08-15). */
19718
19795
  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(), {
19796
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19723
19797
  kind: "mutation",
19724
19798
  auth: "admin"
19725
19799
  }), 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 +19893,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19819
19893
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19820
19894
  kind: "query",
19821
19895
  auth: "admin"
19896
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19897
+ kind: "mutation",
19898
+ auth: "admin"
19899
+ }), method(object({}), MediaReclaimStatusSchema, {
19900
+ kind: "query",
19901
+ auth: "admin"
19822
19902
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19823
19903
  kind: "query",
19824
19904
  auth: "admin"
@@ -21893,7 +21973,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21893
21973
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21894
21974
  kind: "mutation",
21895
21975
  auth: "admin"
21896
- });
21976
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21977
+ kind: "mutation",
21978
+ auth: "admin"
21979
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21980
+ kind: "mutation",
21981
+ auth: "admin"
21982
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21897
21983
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21898
21984
  providerId: string().min(1),
21899
21985
  displayName: string().min(1),
@@ -29119,6 +29205,33 @@ var RecordingRebalanceInputSchema = object({
29119
29205
  minMoveGb: number().min(0).optional()
29120
29206
  });
29121
29207
  /**
29208
+ * Operator-facing placement of one camera onto a recordings location.
29209
+ *
29210
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
29211
+ * Auto (the planner may move this camera). `locationId` is where high/mid
29212
+ * currently write — the plan, which may disagree with the pin when Auto.
29213
+ */
29214
+ var RecordingDevicePlacementSchema = object({
29215
+ deviceId: number().int(),
29216
+ profile: string(),
29217
+ locationId: string()
29218
+ });
29219
+ var RecordingDevicePinSchema = object({
29220
+ deviceId: number().int(),
29221
+ /** Recordings-class location this camera is pinned to. */
29222
+ locationId: string()
29223
+ });
29224
+ var RecordingPlacementViewSchema = object({
29225
+ assignments: array(RecordingDevicePlacementSchema),
29226
+ pins: array(RecordingDevicePinSchema),
29227
+ defaultLocations: record(string(), string())
29228
+ });
29229
+ var RecordingSetDevicePlacementInputSchema = object({
29230
+ deviceId: number().int(),
29231
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
29232
+ locationId: string().nullable()
29233
+ });
29234
+ /**
29122
29235
  * Result of locating footage at a wall-clock instant for one device/profile.
29123
29236
  * `segment` carries the covering segment's window; `gap` reports the forward
29124
29237
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -29344,6 +29457,12 @@ method(object({
29344
29457
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
29345
29458
  kind: "mutation",
29346
29459
  auth: "admin"
29460
+ }), method(object({}), RecordingPlacementViewSchema, {
29461
+ kind: "query",
29462
+ auth: "admin"
29463
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29464
+ kind: "mutation",
29465
+ auth: "admin"
29347
29466
  });
29348
29467
  /**
29349
29468
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -34844,6 +34963,12 @@ Object.freeze({
34844
34963
  addonId: null,
34845
34964
  access: "delete"
34846
34965
  },
34966
+ "deviceManager.renameLocation": {
34967
+ capName: "device-manager",
34968
+ capScope: "system",
34969
+ addonId: null,
34970
+ access: "create"
34971
+ },
34847
34972
  "deviceManager.runDeviceAction": {
34848
34973
  capName: "device-manager",
34849
34974
  capScope: "system",
@@ -36536,19 +36661,19 @@ Object.freeze({
36536
36661
  addonId: null,
36537
36662
  access: "view"
36538
36663
  },
36539
- "pipelineAnalytics.getGroup": {
36664
+ "pipelineAnalytics.getKeyEvents": {
36540
36665
  capName: "pipeline-analytics",
36541
36666
  capScope: "device",
36542
36667
  addonId: null,
36543
36668
  access: "view"
36544
36669
  },
36545
- "pipelineAnalytics.getKeyEvents": {
36670
+ "pipelineAnalytics.getKeyEventsBatch": {
36546
36671
  capName: "pipeline-analytics",
36547
36672
  capScope: "device",
36548
36673
  addonId: null,
36549
36674
  access: "view"
36550
36675
  },
36551
- "pipelineAnalytics.getKeyEventsBatch": {
36676
+ "pipelineAnalytics.getMediaReclaimStatus": {
36552
36677
  capName: "pipeline-analytics",
36553
36678
  capScope: "device",
36554
36679
  addonId: null,
@@ -36638,12 +36763,6 @@ Object.freeze({
36638
36763
  addonId: null,
36639
36764
  access: "view"
36640
36765
  },
36641
- "pipelineAnalytics.listGroups": {
36642
- capName: "pipeline-analytics",
36643
- capScope: "device",
36644
- addonId: null,
36645
- access: "view"
36646
- },
36647
36766
  "pipelineAnalytics.listOpsLog": {
36648
36767
  capName: "pipeline-analytics",
36649
36768
  capScope: "device",
@@ -36728,6 +36847,12 @@ Object.freeze({
36728
36847
  addonId: null,
36729
36848
  access: "create"
36730
36849
  },
36850
+ "pipelineAnalytics.reclaimDebugMedia": {
36851
+ capName: "pipeline-analytics",
36852
+ capScope: "device",
36853
+ addonId: null,
36854
+ access: "create"
36855
+ },
36731
36856
  "pipelineAnalytics.reconcileFromDisk": {
36732
36857
  capName: "pipeline-analytics",
36733
36858
  capScope: "device",
@@ -37652,6 +37777,12 @@ Object.freeze({
37652
37777
  addonId: null,
37653
37778
  access: "view"
37654
37779
  },
37780
+ "recording.getPlacement": {
37781
+ capName: "recording",
37782
+ capScope: "system",
37783
+ addonId: null,
37784
+ access: "view"
37785
+ },
37655
37786
  "recording.getPlaybackManifest": {
37656
37787
  capName: "recording",
37657
37788
  capScope: "system",
@@ -37778,6 +37909,12 @@ Object.freeze({
37778
37909
  addonId: null,
37779
37910
  access: "create"
37780
37911
  },
37912
+ "recording.setDevicePlacement": {
37913
+ capName: "recording",
37914
+ capScope: "system",
37915
+ addonId: null,
37916
+ access: "create"
37917
+ },
37781
37918
  "recording.startStorageMigrationMove": {
37782
37919
  capName: "recording",
37783
37920
  capScope: "system",
@@ -38222,12 +38359,36 @@ Object.freeze({
38222
38359
  addonId: null,
38223
38360
  access: "create"
38224
38361
  },
38362
+ "storageMigration.cleanupCancel": {
38363
+ capName: "storage-migration",
38364
+ capScope: "system",
38365
+ addonId: null,
38366
+ access: "create"
38367
+ },
38368
+ "storageMigration.cleanupStart": {
38369
+ capName: "storage-migration",
38370
+ capScope: "system",
38371
+ addonId: null,
38372
+ access: "create"
38373
+ },
38374
+ "storageMigration.cleanupStatus": {
38375
+ capName: "storage-migration",
38376
+ capScope: "system",
38377
+ addonId: null,
38378
+ access: "view"
38379
+ },
38225
38380
  "storageMigration.drain": {
38226
38381
  capName: "storage-migration",
38227
38382
  capScope: "system",
38228
38383
  addonId: null,
38229
38384
  access: "create"
38230
38385
  },
38386
+ "storageMigration.history": {
38387
+ capName: "storage-migration",
38388
+ capScope: "system",
38389
+ addonId: null,
38390
+ access: "view"
38391
+ },
38231
38392
  "storageMigration.movers": {
38232
38393
  capName: "storage-migration",
38233
38394
  capScope: "system",
@@ -40224,11 +40385,6 @@ Object.freeze({
40224
40385
  form: "single",
40225
40386
  optional: true
40226
40387
  }],
40227
- "pipelineAnalytics.getGroup": [{
40228
- name: "deviceId",
40229
- form: "single",
40230
- optional: false
40231
- }],
40232
40388
  "pipelineAnalytics.getKeyEvents": [{
40233
40389
  name: "deviceId",
40234
40390
  form: "single",
@@ -40294,11 +40450,6 @@ Object.freeze({
40294
40450
  form: "single",
40295
40451
  optional: false
40296
40452
  }],
40297
- "pipelineAnalytics.listGroups": [{
40298
- name: "deviceIds",
40299
- form: "array",
40300
- optional: false
40301
- }],
40302
40453
  "pipelineAnalytics.listOpsLog": [{
40303
40454
  name: "deviceId",
40304
40455
  form: "single",
@@ -40344,6 +40495,11 @@ Object.freeze({
40344
40495
  form: "single",
40345
40496
  optional: true
40346
40497
  }],
40498
+ "pipelineAnalytics.reclaimDebugMedia": [{
40499
+ name: "deviceIds",
40500
+ form: "array",
40501
+ optional: true
40502
+ }],
40347
40503
  "pipelineAnalytics.reconcileFromDisk": [{
40348
40504
  name: "deviceId",
40349
40505
  form: "single",
@@ -40709,6 +40865,11 @@ Object.freeze({
40709
40865
  form: "single",
40710
40866
  optional: false
40711
40867
  }],
40868
+ "recording.setDevicePlacement": [{
40869
+ name: "deviceId",
40870
+ form: "single",
40871
+ optional: false
40872
+ }],
40712
40873
  "recording.startStorageMigrationMove": [{
40713
40874
  name: "deviceId",
40714
40875
  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.58",
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",