@camstack/addon-auth 1.2.52 → 1.2.54

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.
@@ -8210,6 +8210,13 @@ var MediaRelocateModeSchema = _enum([
8210
8210
  ]);
8211
8211
  var RelocateMediaInputSchema = object({
8212
8212
  toLocationId: string(),
8213
+ /**
8214
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8215
+ * every row that is not already on `toLocationId` (the historical
8216
+ * behaviour). A named source is what a from→to migration needs: without it
8217
+ * "move events off disk 2" also emptied disk 1.
8218
+ */
8219
+ fromLocationId: string().optional(),
8213
8220
  throttleMbps: number().min(1).max(1e3).optional(),
8214
8221
  /** Omitted = `move`, the pre-existing behaviour. */
8215
8222
  mode: MediaRelocateModeSchema.optional()
@@ -8277,6 +8284,19 @@ var StorageMigrationDestinationsSchema = object({
8277
8284
  galleryMedia: string().min(1).optional()
8278
8285
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8279
8286
  /**
8287
+ * Optional named source per class. Omitted = the class's current default
8288
+ * (the historical behaviour). A named source that is NOT the default is a
8289
+ * drain of that disk: bytes move, the default stays, and the source is
8290
+ * disabled when the move finishes.
8291
+ */
8292
+ var StorageMigrationSourcesSchema = object({
8293
+ recordings: string().min(1).optional(),
8294
+ recordingsLow: string().min(1).optional(),
8295
+ eventMedia: string().min(1).optional(),
8296
+ backups: string().min(1).optional(),
8297
+ galleryMedia: string().min(1).optional()
8298
+ }).optional();
8299
+ /**
8280
8300
  * How a migration sequences the cutover against the byte move.
8281
8301
  *
8282
8302
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8298,6 +8318,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8298
8318
  /** Shared input for planning and starting an orchestrated storage migration. */
8299
8319
  var StorageMigrationInputSchema = object({
8300
8320
  destinations: StorageMigrationDestinationsSchema,
8321
+ /** Omitted = each class's current default. */
8322
+ sources: StorageMigrationSourcesSchema,
8301
8323
  throttleMbps: number().min(1).max(1e3).optional(),
8302
8324
  /** Omitted = `blocking`, which stays the default. */
8303
8325
  mode: StorageMigrationModeSchema.optional()
@@ -8377,6 +8399,13 @@ var StorageMigrationMoveSchema = object({
8377
8399
  storageClass: StorageMigrationClassSchema,
8378
8400
  fromLocationId: string(),
8379
8401
  toLocationId: string(),
8402
+ /**
8403
+ * True when `from` was NOT the class default at plan time. The move still
8404
+ * copies bytes, but the default is left alone and the source is disabled
8405
+ * once the copy verifies. Absent on jobs planned before this field existed
8406
+ * — those jobs always repointed, which is `false`.
8407
+ */
8408
+ freezeSource: boolean().optional(),
8380
8409
  moverJobId: string().nullable(),
8381
8410
  state: RelocateJobStateSchema.nullable(),
8382
8411
  error: string().nullable(),
@@ -8390,6 +8419,7 @@ var StorageMigrationJobSchema = object({
8390
8419
  * can tell a seconds-long cutover from a thirty-hour one. */
8391
8420
  mode: StorageMigrationModeSchema,
8392
8421
  destinations: StorageMigrationDestinationsSchema,
8422
+ sources: StorageMigrationSourcesSchema,
8393
8423
  throttleMbps: number(),
8394
8424
  moves: array(StorageMigrationMoveSchema),
8395
8425
  pauseLeaseId: string().nullable(),
@@ -8415,6 +8445,7 @@ var StorageMigrationFindingSchema = object({
8415
8445
  });
8416
8446
  var StorageMigrationPlanSchema = object({
8417
8447
  destinations: StorageMigrationDestinationsSchema,
8448
+ sources: StorageMigrationSourcesSchema,
8418
8449
  /** The mode this plan was built for. A plan is only valid for its mode: the
8419
8450
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8420
8451
  * it. */
@@ -8422,7 +8453,8 @@ var StorageMigrationPlanSchema = object({
8422
8453
  moves: array(object({
8423
8454
  storageClass: StorageMigrationClassSchema,
8424
8455
  fromLocationId: string(),
8425
- toLocationId: string()
8456
+ toLocationId: string(),
8457
+ freezeSource: boolean().optional()
8426
8458
  })),
8427
8459
  findings: array(StorageMigrationFindingSchema)
8428
8460
  });
@@ -8600,10 +8632,51 @@ var LedgerWalkReportSchema = object({
8600
8632
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8601
8633
  var RelocatableMediaCountInputSchema = object({
8602
8634
  toLocationId: string().min(1),
8635
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8636
+ fromLocationId: string().optional(),
8603
8637
  /** Omitted = `move`. */
8604
8638
  mode: MediaRelocateModeSchema.optional()
8605
8639
  });
8606
8640
  /**
8641
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8642
+ * ghost ledger entries on frozen footage locations.
8643
+ *
8644
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8645
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8646
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8647
+ * with no operator-visible status.
8648
+ */
8649
+ var StorageCleanupPhaseSchema = _enum([
8650
+ "orphans",
8651
+ "debug-media",
8652
+ "ghost-ledger",
8653
+ "done",
8654
+ "failed",
8655
+ "cancelled"
8656
+ ]);
8657
+ var StorageCleanupInputSchema = object({
8658
+ /** Also walk motion stills / track filmstrips. Off by default. */
8659
+ includeDebugMedia: boolean().optional() });
8660
+ var StorageCleanupJobSchema = object({
8661
+ jobId: string(),
8662
+ phase: StorageCleanupPhaseSchema,
8663
+ includeDebugMedia: boolean(),
8664
+ orphansReclaimed: number().int().nonnegative(),
8665
+ orphanBytesReclaimed: number().int().nonnegative(),
8666
+ debugMediaReclaimed: number().int().nonnegative(),
8667
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8668
+ ghostsForgotten: number().int().nonnegative(),
8669
+ ghostBytesForgotten: number().int().nonnegative(),
8670
+ /** Short operator-facing line: current collection, pass, or location. */
8671
+ detail: string().nullable(),
8672
+ cancelRequested: boolean(),
8673
+ startedAt: number(),
8674
+ updatedAt: number(),
8675
+ finishedAt: number().nullable(),
8676
+ error: string().nullable()
8677
+ });
8678
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8679
+ /**
8607
8680
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8608
8681
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8609
8682
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8631,11 +8704,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8631
8704
  * The default location for a type uses `id === <type>:default` by
8632
8705
  * convention (the bare type ref like `'backups'` resolves to it).
8633
8706
  *
8634
- * `isSystem: true` marks a location as orchestrator-seeded and
8635
- * undeletable. The bootstrap-installed defaults (one per type) carry
8636
- * this flag; operator-added locations don't. Editing the config of
8637
- * a system location is allowed (path migration, provider swap) but
8638
- * deleting it is rejected at the cap level.
8707
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8708
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8709
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8710
+ * / last-enabled, not on this bit.
8639
8711
  */
8640
8712
  var StorageLocationSchema = object({
8641
8713
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -12948,6 +13020,12 @@ method(object({
12948
13020
  }), _void(), {
12949
13021
  kind: "mutation",
12950
13022
  auth: "admin"
13023
+ }), method(object({
13024
+ from: string(),
13025
+ to: string()
13026
+ }), object({ moved: number() }), {
13027
+ kind: "mutation",
13028
+ auth: "admin"
12951
13029
  }), method(object({
12952
13030
  deviceId: number(),
12953
13031
  disabled: boolean()
@@ -18886,46 +18964,6 @@ var RecentTracksPageSchema = object({
18886
18964
  /** Cursor for the next page, or null when this page is the last. */
18887
18965
  nextCursor: string().nullable()
18888
18966
  });
18889
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
18890
- var LIST_GROUPS_MAX_LIMIT = 100;
18891
- var AnalyticsGroupRecordSchema = object({
18892
- id: string(),
18893
- deviceId: number().int(),
18894
- openedAt: number().int(),
18895
- closedAt: number().int(),
18896
- timestamp: number().int(),
18897
- memberCount: number().int(),
18898
- memberTrackIds: array(string()).readonly(),
18899
- className: string(),
18900
- classes: array(string()).readonly(),
18901
- /** Relative event-media path, or null when the group has no picture yet. */
18902
- mediaUrl: string().nullable(),
18903
- singleton: boolean()
18904
- });
18905
- var AnalyticsGroupMemberSchema = object({
18906
- trackId: string(),
18907
- deviceId: number().int(),
18908
- className: string(),
18909
- firstSeen: number().int(),
18910
- lastSeen: number().int(),
18911
- mediaUrl: string().nullable()
18912
- });
18913
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
18914
- var ListGroupsQueryInput = object({
18915
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
18916
- deviceIds: array(number()),
18917
- /** Window lower bound on `closedAt` (inclusive). */
18918
- since: number().optional(),
18919
- /** Window upper bound on `openedAt` (inclusive). */
18920
- until: number().optional(),
18921
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
18922
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
18923
- cursor: string().optional()
18924
- });
18925
- var ListGroupsPageSchema = object({
18926
- groups: array(AnalyticsGroupRecordSchema).readonly(),
18927
- nextCursor: string().nullable()
18928
- });
18929
18967
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
18930
18968
  var KEY_EVENTS_MAX_LIMIT = 200;
18931
18969
  var KeyEventQueryInput = object({
@@ -19029,9 +19067,7 @@ var TrackCascadeCountsSchema = object({
19029
19067
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19030
19068
  plates: number().int(),
19031
19069
  /** Per-track CLIP search vectors removed (best-effort). */
19032
- embeddings: number().int(),
19033
- /** Group membership + group rows removed with their last member (best-effort). */
19034
- groups: number().int()
19070
+ embeddings: number().int()
19035
19071
  });
19036
19072
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19037
19073
  var DiskReconcileCountsSchema = object({
@@ -19201,6 +19237,47 @@ var RebuildStatusSchema = object({
19201
19237
  /** Present when the pass ended by throwing. */
19202
19238
  error: string().nullable()
19203
19239
  });
19240
+ /**
19241
+ * Acknowledgement that a debug-media reclaim STARTED.
19242
+ *
19243
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19244
+ * it runs detached and this returns immediately. Awaiting it is how the
19245
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19246
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19247
+ */
19248
+ var MediaReclaimStartResultSchema = object({
19249
+ started: boolean(),
19250
+ /** True when a pass was already running; the new request is ignored. */
19251
+ alreadyRunning: boolean()
19252
+ });
19253
+ var MediaReclaimInputSchema = object({
19254
+ mode: _enum(["report", "reclaim"]).default("report"),
19255
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19256
+ deviceIds: array(number().int()).min(1).optional(),
19257
+ restart: boolean().optional(),
19258
+ pageSize: number().int().min(50).max(5e3).optional(),
19259
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19260
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19261
+ maxBytesPerRun: number().int().min(1).optional(),
19262
+ budgetMinutes: number().int().min(1).max(720).optional(),
19263
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19264
+ graceMinutes: number().int().min(1).max(10080).optional()
19265
+ });
19266
+ var MediaReclaimStatusSchema = object({
19267
+ running: boolean(),
19268
+ mode: _enum(["report", "reclaim"]).nullable(),
19269
+ totalExamined: number(),
19270
+ totalEligible: number(),
19271
+ totalReclaimed: number(),
19272
+ totalBytesReclaimed: number(),
19273
+ totalRefused: number(),
19274
+ /** Device+scope windows finished in this pass. */
19275
+ devicesDone: number(),
19276
+ complete: boolean().nullable(),
19277
+ startedAtMs: number().nullable(),
19278
+ finishedAtMs: number().nullable(),
19279
+ error: string().nullable()
19280
+ });
19204
19281
  var ReplayFrameInputSchema = object({
19205
19282
  timestamp: number(),
19206
19283
  frame: PipelineRunResultBridge
@@ -19239,10 +19316,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19239
19316
  * stationary registry). Default false: the timeline lists passages,
19240
19317
  * not parking records (operator decision, 2026-08-15). */
19241
19318
  includeStationary: boolean().optional()
19242
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19243
- deviceId: number(),
19244
- groupId: string().min(1)
19245
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19319
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19246
19320
  kind: "mutation",
19247
19321
  auth: "admin"
19248
19322
  }), 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({
@@ -19342,6 +19416,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19342
19416
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19343
19417
  kind: "query",
19344
19418
  auth: "admin"
19419
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19420
+ kind: "mutation",
19421
+ auth: "admin"
19422
+ }), method(object({}), MediaReclaimStatusSchema, {
19423
+ kind: "query",
19424
+ auth: "admin"
19345
19425
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19346
19426
  kind: "query",
19347
19427
  auth: "admin"
@@ -21312,7 +21392,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21312
21392
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21313
21393
  kind: "mutation",
21314
21394
  auth: "admin"
21315
- });
21395
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21396
+ kind: "mutation",
21397
+ auth: "admin"
21398
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21399
+ kind: "mutation",
21400
+ auth: "admin"
21401
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21316
21402
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21317
21403
  providerId: string().min(1),
21318
21404
  displayName: string().min(1),
@@ -26725,6 +26811,33 @@ var RecordingRebalanceInputSchema = object({
26725
26811
  minMoveGb: number().min(0).optional()
26726
26812
  });
26727
26813
  /**
26814
+ * Operator-facing placement of one camera onto a recordings location.
26815
+ *
26816
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
26817
+ * Auto (the planner may move this camera). `locationId` is where high/mid
26818
+ * currently write — the plan, which may disagree with the pin when Auto.
26819
+ */
26820
+ var RecordingDevicePlacementSchema = object({
26821
+ deviceId: number().int(),
26822
+ profile: string(),
26823
+ locationId: string()
26824
+ });
26825
+ var RecordingDevicePinSchema = object({
26826
+ deviceId: number().int(),
26827
+ /** Recordings-class location this camera is pinned to. */
26828
+ locationId: string()
26829
+ });
26830
+ var RecordingPlacementViewSchema = object({
26831
+ assignments: array(RecordingDevicePlacementSchema),
26832
+ pins: array(RecordingDevicePinSchema),
26833
+ defaultLocations: record(string(), string())
26834
+ });
26835
+ var RecordingSetDevicePlacementInputSchema = object({
26836
+ deviceId: number().int(),
26837
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
26838
+ locationId: string().nullable()
26839
+ });
26840
+ /**
26728
26841
  * Result of locating footage at a wall-clock instant for one device/profile.
26729
26842
  * `segment` carries the covering segment's window; `gap` reports the forward
26730
26843
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -26950,6 +27063,12 @@ method(object({
26950
27063
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
26951
27064
  kind: "mutation",
26952
27065
  auth: "admin"
27066
+ }), method(object({}), RecordingPlacementViewSchema, {
27067
+ kind: "query",
27068
+ auth: "admin"
27069
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
27070
+ kind: "mutation",
27071
+ auth: "admin"
26953
27072
  });
26954
27073
  /**
26955
27074
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -30320,6 +30439,12 @@ Object.freeze({
30320
30439
  addonId: null,
30321
30440
  access: "delete"
30322
30441
  },
30442
+ "deviceManager.renameLocation": {
30443
+ capName: "device-manager",
30444
+ capScope: "system",
30445
+ addonId: null,
30446
+ access: "create"
30447
+ },
30323
30448
  "deviceManager.runDeviceAction": {
30324
30449
  capName: "device-manager",
30325
30450
  capScope: "system",
@@ -32012,19 +32137,19 @@ Object.freeze({
32012
32137
  addonId: null,
32013
32138
  access: "view"
32014
32139
  },
32015
- "pipelineAnalytics.getGroup": {
32140
+ "pipelineAnalytics.getKeyEvents": {
32016
32141
  capName: "pipeline-analytics",
32017
32142
  capScope: "device",
32018
32143
  addonId: null,
32019
32144
  access: "view"
32020
32145
  },
32021
- "pipelineAnalytics.getKeyEvents": {
32146
+ "pipelineAnalytics.getKeyEventsBatch": {
32022
32147
  capName: "pipeline-analytics",
32023
32148
  capScope: "device",
32024
32149
  addonId: null,
32025
32150
  access: "view"
32026
32151
  },
32027
- "pipelineAnalytics.getKeyEventsBatch": {
32152
+ "pipelineAnalytics.getMediaReclaimStatus": {
32028
32153
  capName: "pipeline-analytics",
32029
32154
  capScope: "device",
32030
32155
  addonId: null,
@@ -32114,12 +32239,6 @@ Object.freeze({
32114
32239
  addonId: null,
32115
32240
  access: "view"
32116
32241
  },
32117
- "pipelineAnalytics.listGroups": {
32118
- capName: "pipeline-analytics",
32119
- capScope: "device",
32120
- addonId: null,
32121
- access: "view"
32122
- },
32123
32242
  "pipelineAnalytics.listOpsLog": {
32124
32243
  capName: "pipeline-analytics",
32125
32244
  capScope: "device",
@@ -32204,6 +32323,12 @@ Object.freeze({
32204
32323
  addonId: null,
32205
32324
  access: "create"
32206
32325
  },
32326
+ "pipelineAnalytics.reclaimDebugMedia": {
32327
+ capName: "pipeline-analytics",
32328
+ capScope: "device",
32329
+ addonId: null,
32330
+ access: "create"
32331
+ },
32207
32332
  "pipelineAnalytics.reconcileFromDisk": {
32208
32333
  capName: "pipeline-analytics",
32209
32334
  capScope: "device",
@@ -33128,6 +33253,12 @@ Object.freeze({
33128
33253
  addonId: null,
33129
33254
  access: "view"
33130
33255
  },
33256
+ "recording.getPlacement": {
33257
+ capName: "recording",
33258
+ capScope: "system",
33259
+ addonId: null,
33260
+ access: "view"
33261
+ },
33131
33262
  "recording.getPlaybackManifest": {
33132
33263
  capName: "recording",
33133
33264
  capScope: "system",
@@ -33254,6 +33385,12 @@ Object.freeze({
33254
33385
  addonId: null,
33255
33386
  access: "create"
33256
33387
  },
33388
+ "recording.setDevicePlacement": {
33389
+ capName: "recording",
33390
+ capScope: "system",
33391
+ addonId: null,
33392
+ access: "create"
33393
+ },
33257
33394
  "recording.startStorageMigrationMove": {
33258
33395
  capName: "recording",
33259
33396
  capScope: "system",
@@ -33698,12 +33835,36 @@ Object.freeze({
33698
33835
  addonId: null,
33699
33836
  access: "create"
33700
33837
  },
33838
+ "storageMigration.cleanupCancel": {
33839
+ capName: "storage-migration",
33840
+ capScope: "system",
33841
+ addonId: null,
33842
+ access: "create"
33843
+ },
33844
+ "storageMigration.cleanupStart": {
33845
+ capName: "storage-migration",
33846
+ capScope: "system",
33847
+ addonId: null,
33848
+ access: "create"
33849
+ },
33850
+ "storageMigration.cleanupStatus": {
33851
+ capName: "storage-migration",
33852
+ capScope: "system",
33853
+ addonId: null,
33854
+ access: "view"
33855
+ },
33701
33856
  "storageMigration.drain": {
33702
33857
  capName: "storage-migration",
33703
33858
  capScope: "system",
33704
33859
  addonId: null,
33705
33860
  access: "create"
33706
33861
  },
33862
+ "storageMigration.history": {
33863
+ capName: "storage-migration",
33864
+ capScope: "system",
33865
+ addonId: null,
33866
+ access: "view"
33867
+ },
33707
33868
  "storageMigration.movers": {
33708
33869
  capName: "storage-migration",
33709
33870
  capScope: "system",
@@ -35700,11 +35861,6 @@ Object.freeze({
35700
35861
  form: "single",
35701
35862
  optional: true
35702
35863
  }],
35703
- "pipelineAnalytics.getGroup": [{
35704
- name: "deviceId",
35705
- form: "single",
35706
- optional: false
35707
- }],
35708
35864
  "pipelineAnalytics.getKeyEvents": [{
35709
35865
  name: "deviceId",
35710
35866
  form: "single",
@@ -35770,11 +35926,6 @@ Object.freeze({
35770
35926
  form: "single",
35771
35927
  optional: false
35772
35928
  }],
35773
- "pipelineAnalytics.listGroups": [{
35774
- name: "deviceIds",
35775
- form: "array",
35776
- optional: false
35777
- }],
35778
35929
  "pipelineAnalytics.listOpsLog": [{
35779
35930
  name: "deviceId",
35780
35931
  form: "single",
@@ -35820,6 +35971,11 @@ Object.freeze({
35820
35971
  form: "single",
35821
35972
  optional: true
35822
35973
  }],
35974
+ "pipelineAnalytics.reclaimDebugMedia": [{
35975
+ name: "deviceIds",
35976
+ form: "array",
35977
+ optional: true
35978
+ }],
35823
35979
  "pipelineAnalytics.reconcileFromDisk": [{
35824
35980
  name: "deviceId",
35825
35981
  form: "single",
@@ -36185,6 +36341,11 @@ Object.freeze({
36185
36341
  form: "single",
36186
36342
  optional: false
36187
36343
  }],
36344
+ "recording.setDevicePlacement": [{
36345
+ name: "deviceId",
36346
+ form: "single",
36347
+ optional: false
36348
+ }],
36188
36349
  "recording.startStorageMigrationMove": [{
36189
36350
  name: "deviceId",
36190
36351
  form: "single",