@camstack/addon-pipeline-orchestrator 1.2.129 → 1.2.131

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -8972,6 +8972,13 @@ var MediaRelocateModeSchema = _enum([
8972
8972
  ]);
8973
8973
  var RelocateMediaInputSchema = object({
8974
8974
  toLocationId: string(),
8975
+ /**
8976
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8977
+ * every row that is not already on `toLocationId` (the historical
8978
+ * behaviour). A named source is what a from→to migration needs: without it
8979
+ * "move events off disk 2" also emptied disk 1.
8980
+ */
8981
+ fromLocationId: string().optional(),
8975
8982
  throttleMbps: number().min(1).max(1e3).optional(),
8976
8983
  /** Omitted = `move`, the pre-existing behaviour. */
8977
8984
  mode: MediaRelocateModeSchema.optional()
@@ -9039,6 +9046,19 @@ var StorageMigrationDestinationsSchema = object({
9039
9046
  galleryMedia: string().min(1).optional()
9040
9047
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
9041
9048
  /**
9049
+ * Optional named source per class. Omitted = the class's current default
9050
+ * (the historical behaviour). A named source that is NOT the default is a
9051
+ * drain of that disk: bytes move, the default stays, and the source is
9052
+ * disabled when the move finishes.
9053
+ */
9054
+ var StorageMigrationSourcesSchema = object({
9055
+ recordings: string().min(1).optional(),
9056
+ recordingsLow: string().min(1).optional(),
9057
+ eventMedia: string().min(1).optional(),
9058
+ backups: string().min(1).optional(),
9059
+ galleryMedia: string().min(1).optional()
9060
+ }).optional();
9061
+ /**
9042
9062
  * How a migration sequences the cutover against the byte move.
9043
9063
  *
9044
9064
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -9060,6 +9080,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
9060
9080
  /** Shared input for planning and starting an orchestrated storage migration. */
9061
9081
  var StorageMigrationInputSchema = object({
9062
9082
  destinations: StorageMigrationDestinationsSchema,
9083
+ /** Omitted = each class's current default. */
9084
+ sources: StorageMigrationSourcesSchema,
9063
9085
  throttleMbps: number().min(1).max(1e3).optional(),
9064
9086
  /** Omitted = `blocking`, which stays the default. */
9065
9087
  mode: StorageMigrationModeSchema.optional()
@@ -9139,6 +9161,13 @@ var StorageMigrationMoveSchema = object({
9139
9161
  storageClass: StorageMigrationClassSchema,
9140
9162
  fromLocationId: string(),
9141
9163
  toLocationId: string(),
9164
+ /**
9165
+ * True when `from` was NOT the class default at plan time. The move still
9166
+ * copies bytes, but the default is left alone and the source is disabled
9167
+ * once the copy verifies. Absent on jobs planned before this field existed
9168
+ * — those jobs always repointed, which is `false`.
9169
+ */
9170
+ freezeSource: boolean().optional(),
9142
9171
  moverJobId: string().nullable(),
9143
9172
  state: RelocateJobStateSchema.nullable(),
9144
9173
  error: string().nullable(),
@@ -9152,6 +9181,7 @@ var StorageMigrationJobSchema = object({
9152
9181
  * can tell a seconds-long cutover from a thirty-hour one. */
9153
9182
  mode: StorageMigrationModeSchema,
9154
9183
  destinations: StorageMigrationDestinationsSchema,
9184
+ sources: StorageMigrationSourcesSchema,
9155
9185
  throttleMbps: number(),
9156
9186
  moves: array(StorageMigrationMoveSchema),
9157
9187
  pauseLeaseId: string().nullable(),
@@ -9177,6 +9207,7 @@ var StorageMigrationFindingSchema = object({
9177
9207
  });
9178
9208
  var StorageMigrationPlanSchema = object({
9179
9209
  destinations: StorageMigrationDestinationsSchema,
9210
+ sources: StorageMigrationSourcesSchema,
9180
9211
  /** The mode this plan was built for. A plan is only valid for its mode: the
9181
9212
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
9182
9213
  * it. */
@@ -9184,7 +9215,8 @@ var StorageMigrationPlanSchema = object({
9184
9215
  moves: array(object({
9185
9216
  storageClass: StorageMigrationClassSchema,
9186
9217
  fromLocationId: string(),
9187
- toLocationId: string()
9218
+ toLocationId: string(),
9219
+ freezeSource: boolean().optional()
9188
9220
  })),
9189
9221
  findings: array(StorageMigrationFindingSchema)
9190
9222
  });
@@ -9362,10 +9394,51 @@ var LedgerWalkReportSchema = object({
9362
9394
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
9363
9395
  var RelocatableMediaCountInputSchema = object({
9364
9396
  toLocationId: string().min(1),
9397
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
9398
+ fromLocationId: string().optional(),
9365
9399
  /** Omitted = `move`. */
9366
9400
  mode: MediaRelocateModeSchema.optional()
9367
9401
  });
9368
9402
  /**
9403
+ * Operator cleanup of leftover analytics rows, optional debug media, and
9404
+ * ghost ledger entries on frozen footage locations.
9405
+ *
9406
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
9407
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
9408
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
9409
+ * with no operator-visible status.
9410
+ */
9411
+ var StorageCleanupPhaseSchema = _enum([
9412
+ "orphans",
9413
+ "debug-media",
9414
+ "ghost-ledger",
9415
+ "done",
9416
+ "failed",
9417
+ "cancelled"
9418
+ ]);
9419
+ var StorageCleanupInputSchema = object({
9420
+ /** Also walk motion stills / track filmstrips. Off by default. */
9421
+ includeDebugMedia: boolean().optional() });
9422
+ var StorageCleanupJobSchema = object({
9423
+ jobId: string(),
9424
+ phase: StorageCleanupPhaseSchema,
9425
+ includeDebugMedia: boolean(),
9426
+ orphansReclaimed: number().int().nonnegative(),
9427
+ orphanBytesReclaimed: number().int().nonnegative(),
9428
+ debugMediaReclaimed: number().int().nonnegative(),
9429
+ debugMediaBytesReclaimed: number().int().nonnegative(),
9430
+ ghostsForgotten: number().int().nonnegative(),
9431
+ ghostBytesForgotten: number().int().nonnegative(),
9432
+ /** Short operator-facing line: current collection, pass, or location. */
9433
+ detail: string().nullable(),
9434
+ cancelRequested: boolean(),
9435
+ startedAt: number(),
9436
+ updatedAt: number(),
9437
+ finishedAt: number().nullable(),
9438
+ error: string().nullable()
9439
+ });
9440
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
9441
+ /**
9369
9442
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
9370
9443
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
9371
9444
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -9393,11 +9466,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
9393
9466
  * The default location for a type uses `id === <type>:default` by
9394
9467
  * convention (the bare type ref like `'backups'` resolves to it).
9395
9468
  *
9396
- * `isSystem: true` marks a location as orchestrator-seeded and
9397
- * undeletable. The bootstrap-installed defaults (one per type) carry
9398
- * this flag; operator-added locations don't. Editing the config of
9399
- * a system location is allowed (path migration, provider swap) but
9400
- * deleting it is rejected at the cap level.
9469
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
9470
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
9471
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
9472
+ * / last-enabled, not on this bit.
9401
9473
  */
9402
9474
  var StorageLocationSchema = object({
9403
9475
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -13738,6 +13810,12 @@ method(object({
13738
13810
  }), _void(), {
13739
13811
  kind: "mutation",
13740
13812
  auth: "admin"
13813
+ }), method(object({
13814
+ from: string(),
13815
+ to: string()
13816
+ }), object({ moved: number() }), {
13817
+ kind: "mutation",
13818
+ auth: "admin"
13741
13819
  }), method(object({
13742
13820
  deviceId: number(),
13743
13821
  disabled: boolean()
@@ -19892,46 +19970,6 @@ var RecentTracksPageSchema = object({
19892
19970
  /** Cursor for the next page, or null when this page is the last. */
19893
19971
  nextCursor: string().nullable()
19894
19972
  });
19895
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
19896
- var LIST_GROUPS_MAX_LIMIT = 100;
19897
- var AnalyticsGroupRecordSchema = object({
19898
- id: string(),
19899
- deviceId: number().int(),
19900
- openedAt: number().int(),
19901
- closedAt: number().int(),
19902
- timestamp: number().int(),
19903
- memberCount: number().int(),
19904
- memberTrackIds: array(string()).readonly(),
19905
- className: string(),
19906
- classes: array(string()).readonly(),
19907
- /** Relative event-media path, or null when the group has no picture yet. */
19908
- mediaUrl: string().nullable(),
19909
- singleton: boolean()
19910
- });
19911
- var AnalyticsGroupMemberSchema = object({
19912
- trackId: string(),
19913
- deviceId: number().int(),
19914
- className: string(),
19915
- firstSeen: number().int(),
19916
- lastSeen: number().int(),
19917
- mediaUrl: string().nullable()
19918
- });
19919
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
19920
- var ListGroupsQueryInput = object({
19921
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
19922
- deviceIds: array(number()),
19923
- /** Window lower bound on `closedAt` (inclusive). */
19924
- since: number().optional(),
19925
- /** Window upper bound on `openedAt` (inclusive). */
19926
- until: number().optional(),
19927
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
19928
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
19929
- cursor: string().optional()
19930
- });
19931
- var ListGroupsPageSchema = object({
19932
- groups: array(AnalyticsGroupRecordSchema).readonly(),
19933
- nextCursor: string().nullable()
19934
- });
19935
19973
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19936
19974
  var KEY_EVENTS_MAX_LIMIT = 200;
19937
19975
  var KeyEventQueryInput = object({
@@ -20035,9 +20073,7 @@ var TrackCascadeCountsSchema = object({
20035
20073
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
20036
20074
  plates: number().int(),
20037
20075
  /** Per-track CLIP search vectors removed (best-effort). */
20038
- embeddings: number().int(),
20039
- /** Group membership + group rows removed with their last member (best-effort). */
20040
- groups: number().int()
20076
+ embeddings: number().int()
20041
20077
  });
20042
20078
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
20043
20079
  var DiskReconcileCountsSchema = object({
@@ -20207,6 +20243,47 @@ var RebuildStatusSchema = object({
20207
20243
  /** Present when the pass ended by throwing. */
20208
20244
  error: string().nullable()
20209
20245
  });
20246
+ /**
20247
+ * Acknowledgement that a debug-media reclaim STARTED.
20248
+ *
20249
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
20250
+ * it runs detached and this returns immediately. Awaiting it is how the
20251
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
20252
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
20253
+ */
20254
+ var MediaReclaimStartResultSchema = object({
20255
+ started: boolean(),
20256
+ /** True when a pass was already running; the new request is ignored. */
20257
+ alreadyRunning: boolean()
20258
+ });
20259
+ var MediaReclaimInputSchema = object({
20260
+ mode: _enum(["report", "reclaim"]).default("report"),
20261
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
20262
+ deviceIds: array(number().int()).min(1).optional(),
20263
+ restart: boolean().optional(),
20264
+ pageSize: number().int().min(50).max(5e3).optional(),
20265
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
20266
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
20267
+ maxBytesPerRun: number().int().min(1).optional(),
20268
+ budgetMinutes: number().int().min(1).max(720).optional(),
20269
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
20270
+ graceMinutes: number().int().min(1).max(10080).optional()
20271
+ });
20272
+ var MediaReclaimStatusSchema = object({
20273
+ running: boolean(),
20274
+ mode: _enum(["report", "reclaim"]).nullable(),
20275
+ totalExamined: number(),
20276
+ totalEligible: number(),
20277
+ totalReclaimed: number(),
20278
+ totalBytesReclaimed: number(),
20279
+ totalRefused: number(),
20280
+ /** Device+scope windows finished in this pass. */
20281
+ devicesDone: number(),
20282
+ complete: boolean().nullable(),
20283
+ startedAtMs: number().nullable(),
20284
+ finishedAtMs: number().nullable(),
20285
+ error: string().nullable()
20286
+ });
20210
20287
  var ReplayFrameInputSchema = object({
20211
20288
  timestamp: number(),
20212
20289
  frame: PipelineRunResultBridge
@@ -20245,10 +20322,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20245
20322
  * stationary registry). Default false: the timeline lists passages,
20246
20323
  * not parking records (operator decision, 2026-08-15). */
20247
20324
  includeStationary: boolean().optional()
20248
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
20249
- deviceId: number(),
20250
- groupId: string().min(1)
20251
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
20325
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
20252
20326
  kind: "mutation",
20253
20327
  auth: "admin"
20254
20328
  }), 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({
@@ -20348,6 +20422,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20348
20422
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
20349
20423
  kind: "query",
20350
20424
  auth: "admin"
20425
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
20426
+ kind: "mutation",
20427
+ auth: "admin"
20428
+ }), method(object({}), MediaReclaimStatusSchema, {
20429
+ kind: "query",
20430
+ auth: "admin"
20351
20431
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
20352
20432
  kind: "query",
20353
20433
  auth: "admin"
@@ -22799,7 +22879,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
22799
22879
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
22800
22880
  kind: "mutation",
22801
22881
  auth: "admin"
22802
- });
22882
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
22883
+ kind: "mutation",
22884
+ auth: "admin"
22885
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
22886
+ kind: "mutation",
22887
+ auth: "admin"
22888
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
22803
22889
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
22804
22890
  providerId: string().min(1),
22805
22891
  displayName: string().min(1),
@@ -28177,6 +28263,33 @@ var RecordingRebalanceInputSchema = object({
28177
28263
  minMoveGb: number().min(0).optional()
28178
28264
  });
28179
28265
  /**
28266
+ * Operator-facing placement of one camera onto a recordings location.
28267
+ *
28268
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
28269
+ * Auto (the planner may move this camera). `locationId` is where high/mid
28270
+ * currently write — the plan, which may disagree with the pin when Auto.
28271
+ */
28272
+ var RecordingDevicePlacementSchema = object({
28273
+ deviceId: number().int(),
28274
+ profile: string(),
28275
+ locationId: string()
28276
+ });
28277
+ var RecordingDevicePinSchema = object({
28278
+ deviceId: number().int(),
28279
+ /** Recordings-class location this camera is pinned to. */
28280
+ locationId: string()
28281
+ });
28282
+ var RecordingPlacementViewSchema = object({
28283
+ assignments: array(RecordingDevicePlacementSchema),
28284
+ pins: array(RecordingDevicePinSchema),
28285
+ defaultLocations: record(string(), string())
28286
+ });
28287
+ var RecordingSetDevicePlacementInputSchema = object({
28288
+ deviceId: number().int(),
28289
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
28290
+ locationId: string().nullable()
28291
+ });
28292
+ /**
28180
28293
  * Result of locating footage at a wall-clock instant for one device/profile.
28181
28294
  * `segment` carries the covering segment's window; `gap` reports the forward
28182
28295
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -28402,6 +28515,12 @@ method(object({
28402
28515
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
28403
28516
  kind: "mutation",
28404
28517
  auth: "admin"
28518
+ }), method(object({}), RecordingPlacementViewSchema, {
28519
+ kind: "query",
28520
+ auth: "admin"
28521
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
28522
+ kind: "mutation",
28523
+ auth: "admin"
28405
28524
  });
28406
28525
  /**
28407
28526
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -31856,6 +31975,12 @@ Object.freeze({
31856
31975
  addonId: null,
31857
31976
  access: "delete"
31858
31977
  },
31978
+ "deviceManager.renameLocation": {
31979
+ capName: "device-manager",
31980
+ capScope: "system",
31981
+ addonId: null,
31982
+ access: "create"
31983
+ },
31859
31984
  "deviceManager.runDeviceAction": {
31860
31985
  capName: "device-manager",
31861
31986
  capScope: "system",
@@ -33548,19 +33673,19 @@ Object.freeze({
33548
33673
  addonId: null,
33549
33674
  access: "view"
33550
33675
  },
33551
- "pipelineAnalytics.getGroup": {
33676
+ "pipelineAnalytics.getKeyEvents": {
33552
33677
  capName: "pipeline-analytics",
33553
33678
  capScope: "device",
33554
33679
  addonId: null,
33555
33680
  access: "view"
33556
33681
  },
33557
- "pipelineAnalytics.getKeyEvents": {
33682
+ "pipelineAnalytics.getKeyEventsBatch": {
33558
33683
  capName: "pipeline-analytics",
33559
33684
  capScope: "device",
33560
33685
  addonId: null,
33561
33686
  access: "view"
33562
33687
  },
33563
- "pipelineAnalytics.getKeyEventsBatch": {
33688
+ "pipelineAnalytics.getMediaReclaimStatus": {
33564
33689
  capName: "pipeline-analytics",
33565
33690
  capScope: "device",
33566
33691
  addonId: null,
@@ -33650,12 +33775,6 @@ Object.freeze({
33650
33775
  addonId: null,
33651
33776
  access: "view"
33652
33777
  },
33653
- "pipelineAnalytics.listGroups": {
33654
- capName: "pipeline-analytics",
33655
- capScope: "device",
33656
- addonId: null,
33657
- access: "view"
33658
- },
33659
33778
  "pipelineAnalytics.listOpsLog": {
33660
33779
  capName: "pipeline-analytics",
33661
33780
  capScope: "device",
@@ -33740,6 +33859,12 @@ Object.freeze({
33740
33859
  addonId: null,
33741
33860
  access: "create"
33742
33861
  },
33862
+ "pipelineAnalytics.reclaimDebugMedia": {
33863
+ capName: "pipeline-analytics",
33864
+ capScope: "device",
33865
+ addonId: null,
33866
+ access: "create"
33867
+ },
33743
33868
  "pipelineAnalytics.reconcileFromDisk": {
33744
33869
  capName: "pipeline-analytics",
33745
33870
  capScope: "device",
@@ -34664,6 +34789,12 @@ Object.freeze({
34664
34789
  addonId: null,
34665
34790
  access: "view"
34666
34791
  },
34792
+ "recording.getPlacement": {
34793
+ capName: "recording",
34794
+ capScope: "system",
34795
+ addonId: null,
34796
+ access: "view"
34797
+ },
34667
34798
  "recording.getPlaybackManifest": {
34668
34799
  capName: "recording",
34669
34800
  capScope: "system",
@@ -34790,6 +34921,12 @@ Object.freeze({
34790
34921
  addonId: null,
34791
34922
  access: "create"
34792
34923
  },
34924
+ "recording.setDevicePlacement": {
34925
+ capName: "recording",
34926
+ capScope: "system",
34927
+ addonId: null,
34928
+ access: "create"
34929
+ },
34793
34930
  "recording.startStorageMigrationMove": {
34794
34931
  capName: "recording",
34795
34932
  capScope: "system",
@@ -35234,12 +35371,36 @@ Object.freeze({
35234
35371
  addonId: null,
35235
35372
  access: "create"
35236
35373
  },
35374
+ "storageMigration.cleanupCancel": {
35375
+ capName: "storage-migration",
35376
+ capScope: "system",
35377
+ addonId: null,
35378
+ access: "create"
35379
+ },
35380
+ "storageMigration.cleanupStart": {
35381
+ capName: "storage-migration",
35382
+ capScope: "system",
35383
+ addonId: null,
35384
+ access: "create"
35385
+ },
35386
+ "storageMigration.cleanupStatus": {
35387
+ capName: "storage-migration",
35388
+ capScope: "system",
35389
+ addonId: null,
35390
+ access: "view"
35391
+ },
35237
35392
  "storageMigration.drain": {
35238
35393
  capName: "storage-migration",
35239
35394
  capScope: "system",
35240
35395
  addonId: null,
35241
35396
  access: "create"
35242
35397
  },
35398
+ "storageMigration.history": {
35399
+ capName: "storage-migration",
35400
+ capScope: "system",
35401
+ addonId: null,
35402
+ access: "view"
35403
+ },
35243
35404
  "storageMigration.movers": {
35244
35405
  capName: "storage-migration",
35245
35406
  capScope: "system",
@@ -37236,11 +37397,6 @@ Object.freeze({
37236
37397
  form: "single",
37237
37398
  optional: true
37238
37399
  }],
37239
- "pipelineAnalytics.getGroup": [{
37240
- name: "deviceId",
37241
- form: "single",
37242
- optional: false
37243
- }],
37244
37400
  "pipelineAnalytics.getKeyEvents": [{
37245
37401
  name: "deviceId",
37246
37402
  form: "single",
@@ -37306,11 +37462,6 @@ Object.freeze({
37306
37462
  form: "single",
37307
37463
  optional: false
37308
37464
  }],
37309
- "pipelineAnalytics.listGroups": [{
37310
- name: "deviceIds",
37311
- form: "array",
37312
- optional: false
37313
- }],
37314
37465
  "pipelineAnalytics.listOpsLog": [{
37315
37466
  name: "deviceId",
37316
37467
  form: "single",
@@ -37356,6 +37507,11 @@ Object.freeze({
37356
37507
  form: "single",
37357
37508
  optional: true
37358
37509
  }],
37510
+ "pipelineAnalytics.reclaimDebugMedia": [{
37511
+ name: "deviceIds",
37512
+ form: "array",
37513
+ optional: true
37514
+ }],
37359
37515
  "pipelineAnalytics.reconcileFromDisk": [{
37360
37516
  name: "deviceId",
37361
37517
  form: "single",
@@ -37721,6 +37877,11 @@ Object.freeze({
37721
37877
  form: "single",
37722
37878
  optional: false
37723
37879
  }],
37880
+ "recording.setDevicePlacement": [{
37881
+ name: "deviceId",
37882
+ form: "single",
37883
+ optional: false
37884
+ }],
37724
37885
  "recording.startStorageMigrationMove": [{
37725
37886
  name: "deviceId",
37726
37887
  form: "single",