@camstack/addon-export-alexa 1.2.55 → 1.2.56

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.
@@ -8264,6 +8264,13 @@ var MediaRelocateModeSchema = _enum([
8264
8264
  ]);
8265
8265
  var RelocateMediaInputSchema = object({
8266
8266
  toLocationId: string(),
8267
+ /**
8268
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8269
+ * every row that is not already on `toLocationId` (the historical
8270
+ * behaviour). A named source is what a from→to migration needs: without it
8271
+ * "move events off disk 2" also emptied disk 1.
8272
+ */
8273
+ fromLocationId: string().optional(),
8267
8274
  throttleMbps: number().min(1).max(1e3).optional(),
8268
8275
  /** Omitted = `move`, the pre-existing behaviour. */
8269
8276
  mode: MediaRelocateModeSchema.optional()
@@ -8331,6 +8338,19 @@ var StorageMigrationDestinationsSchema = object({
8331
8338
  galleryMedia: string().min(1).optional()
8332
8339
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8333
8340
  /**
8341
+ * Optional named source per class. Omitted = the class's current default
8342
+ * (the historical behaviour). A named source that is NOT the default is a
8343
+ * drain of that disk: bytes move, the default stays, and the source is
8344
+ * disabled when the move finishes.
8345
+ */
8346
+ var StorageMigrationSourcesSchema = object({
8347
+ recordings: string().min(1).optional(),
8348
+ recordingsLow: string().min(1).optional(),
8349
+ eventMedia: string().min(1).optional(),
8350
+ backups: string().min(1).optional(),
8351
+ galleryMedia: string().min(1).optional()
8352
+ }).optional();
8353
+ /**
8334
8354
  * How a migration sequences the cutover against the byte move.
8335
8355
  *
8336
8356
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8352,6 +8372,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8352
8372
  /** Shared input for planning and starting an orchestrated storage migration. */
8353
8373
  var StorageMigrationInputSchema = object({
8354
8374
  destinations: StorageMigrationDestinationsSchema,
8375
+ /** Omitted = each class's current default. */
8376
+ sources: StorageMigrationSourcesSchema,
8355
8377
  throttleMbps: number().min(1).max(1e3).optional(),
8356
8378
  /** Omitted = `blocking`, which stays the default. */
8357
8379
  mode: StorageMigrationModeSchema.optional()
@@ -8431,6 +8453,13 @@ var StorageMigrationMoveSchema = object({
8431
8453
  storageClass: StorageMigrationClassSchema,
8432
8454
  fromLocationId: string(),
8433
8455
  toLocationId: string(),
8456
+ /**
8457
+ * True when `from` was NOT the class default at plan time. The move still
8458
+ * copies bytes, but the default is left alone and the source is disabled
8459
+ * once the copy verifies. Absent on jobs planned before this field existed
8460
+ * — those jobs always repointed, which is `false`.
8461
+ */
8462
+ freezeSource: boolean().optional(),
8434
8463
  moverJobId: string().nullable(),
8435
8464
  state: RelocateJobStateSchema.nullable(),
8436
8465
  error: string().nullable(),
@@ -8444,6 +8473,7 @@ var StorageMigrationJobSchema = object({
8444
8473
  * can tell a seconds-long cutover from a thirty-hour one. */
8445
8474
  mode: StorageMigrationModeSchema,
8446
8475
  destinations: StorageMigrationDestinationsSchema,
8476
+ sources: StorageMigrationSourcesSchema,
8447
8477
  throttleMbps: number(),
8448
8478
  moves: array(StorageMigrationMoveSchema),
8449
8479
  pauseLeaseId: string().nullable(),
@@ -8469,6 +8499,7 @@ var StorageMigrationFindingSchema = object({
8469
8499
  });
8470
8500
  var StorageMigrationPlanSchema = object({
8471
8501
  destinations: StorageMigrationDestinationsSchema,
8502
+ sources: StorageMigrationSourcesSchema,
8472
8503
  /** The mode this plan was built for. A plan is only valid for its mode: the
8473
8504
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8474
8505
  * it. */
@@ -8476,7 +8507,8 @@ var StorageMigrationPlanSchema = object({
8476
8507
  moves: array(object({
8477
8508
  storageClass: StorageMigrationClassSchema,
8478
8509
  fromLocationId: string(),
8479
- toLocationId: string()
8510
+ toLocationId: string(),
8511
+ freezeSource: boolean().optional()
8480
8512
  })),
8481
8513
  findings: array(StorageMigrationFindingSchema)
8482
8514
  });
@@ -8654,10 +8686,51 @@ var LedgerWalkReportSchema = object({
8654
8686
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8655
8687
  var RelocatableMediaCountInputSchema = object({
8656
8688
  toLocationId: string().min(1),
8689
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8690
+ fromLocationId: string().optional(),
8657
8691
  /** Omitted = `move`. */
8658
8692
  mode: MediaRelocateModeSchema.optional()
8659
8693
  });
8660
8694
  /**
8695
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8696
+ * ghost ledger entries on frozen footage locations.
8697
+ *
8698
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8699
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8700
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8701
+ * with no operator-visible status.
8702
+ */
8703
+ var StorageCleanupPhaseSchema = _enum([
8704
+ "orphans",
8705
+ "debug-media",
8706
+ "ghost-ledger",
8707
+ "done",
8708
+ "failed",
8709
+ "cancelled"
8710
+ ]);
8711
+ var StorageCleanupInputSchema = object({
8712
+ /** Also walk motion stills / track filmstrips. Off by default. */
8713
+ includeDebugMedia: boolean().optional() });
8714
+ var StorageCleanupJobSchema = object({
8715
+ jobId: string(),
8716
+ phase: StorageCleanupPhaseSchema,
8717
+ includeDebugMedia: boolean(),
8718
+ orphansReclaimed: number().int().nonnegative(),
8719
+ orphanBytesReclaimed: number().int().nonnegative(),
8720
+ debugMediaReclaimed: number().int().nonnegative(),
8721
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8722
+ ghostsForgotten: number().int().nonnegative(),
8723
+ ghostBytesForgotten: number().int().nonnegative(),
8724
+ /** Short operator-facing line: current collection, pass, or location. */
8725
+ detail: string().nullable(),
8726
+ cancelRequested: boolean(),
8727
+ startedAt: number(),
8728
+ updatedAt: number(),
8729
+ finishedAt: number().nullable(),
8730
+ error: string().nullable()
8731
+ });
8732
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8733
+ /**
8661
8734
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8662
8735
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8663
8736
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8685,11 +8758,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8685
8758
  * The default location for a type uses `id === <type>:default` by
8686
8759
  * convention (the bare type ref like `'backups'` resolves to it).
8687
8760
  *
8688
- * `isSystem: true` marks a location as orchestrator-seeded and
8689
- * undeletable. The bootstrap-installed defaults (one per type) carry
8690
- * this flag; operator-added locations don't. Editing the config of
8691
- * a system location is allowed (path migration, provider swap) but
8692
- * deleting it is rejected at the cap level.
8761
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8762
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8763
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8764
+ * / last-enabled, not on this bit.
8693
8765
  */
8694
8766
  var StorageLocationSchema = object({
8695
8767
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -13078,6 +13150,12 @@ method(object({
13078
13150
  }), _void(), {
13079
13151
  kind: "mutation",
13080
13152
  auth: "admin"
13153
+ }), method(object({
13154
+ from: string(),
13155
+ to: string()
13156
+ }), object({ moved: number() }), {
13157
+ kind: "mutation",
13158
+ auth: "admin"
13081
13159
  }), method(object({
13082
13160
  deviceId: number(),
13083
13161
  disabled: boolean()
@@ -19024,46 +19102,6 @@ var RecentTracksPageSchema = object({
19024
19102
  /** Cursor for the next page, or null when this page is the last. */
19025
19103
  nextCursor: string().nullable()
19026
19104
  });
19027
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
19028
- var LIST_GROUPS_MAX_LIMIT = 100;
19029
- var AnalyticsGroupRecordSchema = object({
19030
- id: string(),
19031
- deviceId: number().int(),
19032
- openedAt: number().int(),
19033
- closedAt: number().int(),
19034
- timestamp: number().int(),
19035
- memberCount: number().int(),
19036
- memberTrackIds: array(string()).readonly(),
19037
- className: string(),
19038
- classes: array(string()).readonly(),
19039
- /** Relative event-media path, or null when the group has no picture yet. */
19040
- mediaUrl: string().nullable(),
19041
- singleton: boolean()
19042
- });
19043
- var AnalyticsGroupMemberSchema = object({
19044
- trackId: string(),
19045
- deviceId: number().int(),
19046
- className: string(),
19047
- firstSeen: number().int(),
19048
- lastSeen: number().int(),
19049
- mediaUrl: string().nullable()
19050
- });
19051
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
19052
- var ListGroupsQueryInput = object({
19053
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
19054
- deviceIds: array(number()),
19055
- /** Window lower bound on `closedAt` (inclusive). */
19056
- since: number().optional(),
19057
- /** Window upper bound on `openedAt` (inclusive). */
19058
- until: number().optional(),
19059
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
19060
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
19061
- cursor: string().optional()
19062
- });
19063
- var ListGroupsPageSchema = object({
19064
- groups: array(AnalyticsGroupRecordSchema).readonly(),
19065
- nextCursor: string().nullable()
19066
- });
19067
19105
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19068
19106
  var KEY_EVENTS_MAX_LIMIT = 200;
19069
19107
  var KeyEventQueryInput = object({
@@ -19167,9 +19205,7 @@ var TrackCascadeCountsSchema = object({
19167
19205
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19168
19206
  plates: number().int(),
19169
19207
  /** Per-track CLIP search vectors removed (best-effort). */
19170
- embeddings: number().int(),
19171
- /** Group membership + group rows removed with their last member (best-effort). */
19172
- groups: number().int()
19208
+ embeddings: number().int()
19173
19209
  });
19174
19210
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19175
19211
  var DiskReconcileCountsSchema = object({
@@ -19339,6 +19375,47 @@ var RebuildStatusSchema = object({
19339
19375
  /** Present when the pass ended by throwing. */
19340
19376
  error: string().nullable()
19341
19377
  });
19378
+ /**
19379
+ * Acknowledgement that a debug-media reclaim STARTED.
19380
+ *
19381
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19382
+ * it runs detached and this returns immediately. Awaiting it is how the
19383
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19384
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19385
+ */
19386
+ var MediaReclaimStartResultSchema = object({
19387
+ started: boolean(),
19388
+ /** True when a pass was already running; the new request is ignored. */
19389
+ alreadyRunning: boolean()
19390
+ });
19391
+ var MediaReclaimInputSchema = object({
19392
+ mode: _enum(["report", "reclaim"]).default("report"),
19393
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19394
+ deviceIds: array(number().int()).min(1).optional(),
19395
+ restart: boolean().optional(),
19396
+ pageSize: number().int().min(50).max(5e3).optional(),
19397
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19398
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19399
+ maxBytesPerRun: number().int().min(1).optional(),
19400
+ budgetMinutes: number().int().min(1).max(720).optional(),
19401
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19402
+ graceMinutes: number().int().min(1).max(10080).optional()
19403
+ });
19404
+ var MediaReclaimStatusSchema = object({
19405
+ running: boolean(),
19406
+ mode: _enum(["report", "reclaim"]).nullable(),
19407
+ totalExamined: number(),
19408
+ totalEligible: number(),
19409
+ totalReclaimed: number(),
19410
+ totalBytesReclaimed: number(),
19411
+ totalRefused: number(),
19412
+ /** Device+scope windows finished in this pass. */
19413
+ devicesDone: number(),
19414
+ complete: boolean().nullable(),
19415
+ startedAtMs: number().nullable(),
19416
+ finishedAtMs: number().nullable(),
19417
+ error: string().nullable()
19418
+ });
19342
19419
  var ReplayFrameInputSchema = object({
19343
19420
  timestamp: number(),
19344
19421
  frame: PipelineRunResultBridge
@@ -19377,10 +19454,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19377
19454
  * stationary registry). Default false: the timeline lists passages,
19378
19455
  * not parking records (operator decision, 2026-08-15). */
19379
19456
  includeStationary: boolean().optional()
19380
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19381
- deviceId: number(),
19382
- groupId: string().min(1)
19383
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19457
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19384
19458
  kind: "mutation",
19385
19459
  auth: "admin"
19386
19460
  }), 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({
@@ -19480,6 +19554,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19480
19554
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19481
19555
  kind: "query",
19482
19556
  auth: "admin"
19557
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19558
+ kind: "mutation",
19559
+ auth: "admin"
19560
+ }), method(object({}), MediaReclaimStatusSchema, {
19561
+ kind: "query",
19562
+ auth: "admin"
19483
19563
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19484
19564
  kind: "query",
19485
19565
  auth: "admin"
@@ -21450,7 +21530,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21450
21530
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21451
21531
  kind: "mutation",
21452
21532
  auth: "admin"
21453
- });
21533
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21534
+ kind: "mutation",
21535
+ auth: "admin"
21536
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21537
+ kind: "mutation",
21538
+ auth: "admin"
21539
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21454
21540
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21455
21541
  providerId: string().min(1),
21456
21542
  displayName: string().min(1),
@@ -26828,6 +26914,33 @@ var RecordingRebalanceInputSchema = object({
26828
26914
  minMoveGb: number().min(0).optional()
26829
26915
  });
26830
26916
  /**
26917
+ * Operator-facing placement of one camera onto a recordings location.
26918
+ *
26919
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
26920
+ * Auto (the planner may move this camera). `locationId` is where high/mid
26921
+ * currently write — the plan, which may disagree with the pin when Auto.
26922
+ */
26923
+ var RecordingDevicePlacementSchema = object({
26924
+ deviceId: number().int(),
26925
+ profile: string(),
26926
+ locationId: string()
26927
+ });
26928
+ var RecordingDevicePinSchema = object({
26929
+ deviceId: number().int(),
26930
+ /** Recordings-class location this camera is pinned to. */
26931
+ locationId: string()
26932
+ });
26933
+ var RecordingPlacementViewSchema = object({
26934
+ assignments: array(RecordingDevicePlacementSchema),
26935
+ pins: array(RecordingDevicePinSchema),
26936
+ defaultLocations: record(string(), string())
26937
+ });
26938
+ var RecordingSetDevicePlacementInputSchema = object({
26939
+ deviceId: number().int(),
26940
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
26941
+ locationId: string().nullable()
26942
+ });
26943
+ /**
26831
26944
  * Result of locating footage at a wall-clock instant for one device/profile.
26832
26945
  * `segment` carries the covering segment's window; `gap` reports the forward
26833
26946
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -27053,6 +27166,12 @@ method(object({
27053
27166
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
27054
27167
  kind: "mutation",
27055
27168
  auth: "admin"
27169
+ }), method(object({}), RecordingPlacementViewSchema, {
27170
+ kind: "query",
27171
+ auth: "admin"
27172
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
27173
+ kind: "mutation",
27174
+ auth: "admin"
27056
27175
  });
27057
27176
  /**
27058
27177
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -30423,6 +30542,12 @@ Object.freeze({
30423
30542
  addonId: null,
30424
30543
  access: "delete"
30425
30544
  },
30545
+ "deviceManager.renameLocation": {
30546
+ capName: "device-manager",
30547
+ capScope: "system",
30548
+ addonId: null,
30549
+ access: "create"
30550
+ },
30426
30551
  "deviceManager.runDeviceAction": {
30427
30552
  capName: "device-manager",
30428
30553
  capScope: "system",
@@ -32115,19 +32240,19 @@ Object.freeze({
32115
32240
  addonId: null,
32116
32241
  access: "view"
32117
32242
  },
32118
- "pipelineAnalytics.getGroup": {
32243
+ "pipelineAnalytics.getKeyEvents": {
32119
32244
  capName: "pipeline-analytics",
32120
32245
  capScope: "device",
32121
32246
  addonId: null,
32122
32247
  access: "view"
32123
32248
  },
32124
- "pipelineAnalytics.getKeyEvents": {
32249
+ "pipelineAnalytics.getKeyEventsBatch": {
32125
32250
  capName: "pipeline-analytics",
32126
32251
  capScope: "device",
32127
32252
  addonId: null,
32128
32253
  access: "view"
32129
32254
  },
32130
- "pipelineAnalytics.getKeyEventsBatch": {
32255
+ "pipelineAnalytics.getMediaReclaimStatus": {
32131
32256
  capName: "pipeline-analytics",
32132
32257
  capScope: "device",
32133
32258
  addonId: null,
@@ -32217,12 +32342,6 @@ Object.freeze({
32217
32342
  addonId: null,
32218
32343
  access: "view"
32219
32344
  },
32220
- "pipelineAnalytics.listGroups": {
32221
- capName: "pipeline-analytics",
32222
- capScope: "device",
32223
- addonId: null,
32224
- access: "view"
32225
- },
32226
32345
  "pipelineAnalytics.listOpsLog": {
32227
32346
  capName: "pipeline-analytics",
32228
32347
  capScope: "device",
@@ -32307,6 +32426,12 @@ Object.freeze({
32307
32426
  addonId: null,
32308
32427
  access: "create"
32309
32428
  },
32429
+ "pipelineAnalytics.reclaimDebugMedia": {
32430
+ capName: "pipeline-analytics",
32431
+ capScope: "device",
32432
+ addonId: null,
32433
+ access: "create"
32434
+ },
32310
32435
  "pipelineAnalytics.reconcileFromDisk": {
32311
32436
  capName: "pipeline-analytics",
32312
32437
  capScope: "device",
@@ -33231,6 +33356,12 @@ Object.freeze({
33231
33356
  addonId: null,
33232
33357
  access: "view"
33233
33358
  },
33359
+ "recording.getPlacement": {
33360
+ capName: "recording",
33361
+ capScope: "system",
33362
+ addonId: null,
33363
+ access: "view"
33364
+ },
33234
33365
  "recording.getPlaybackManifest": {
33235
33366
  capName: "recording",
33236
33367
  capScope: "system",
@@ -33357,6 +33488,12 @@ Object.freeze({
33357
33488
  addonId: null,
33358
33489
  access: "create"
33359
33490
  },
33491
+ "recording.setDevicePlacement": {
33492
+ capName: "recording",
33493
+ capScope: "system",
33494
+ addonId: null,
33495
+ access: "create"
33496
+ },
33360
33497
  "recording.startStorageMigrationMove": {
33361
33498
  capName: "recording",
33362
33499
  capScope: "system",
@@ -33801,12 +33938,36 @@ Object.freeze({
33801
33938
  addonId: null,
33802
33939
  access: "create"
33803
33940
  },
33941
+ "storageMigration.cleanupCancel": {
33942
+ capName: "storage-migration",
33943
+ capScope: "system",
33944
+ addonId: null,
33945
+ access: "create"
33946
+ },
33947
+ "storageMigration.cleanupStart": {
33948
+ capName: "storage-migration",
33949
+ capScope: "system",
33950
+ addonId: null,
33951
+ access: "create"
33952
+ },
33953
+ "storageMigration.cleanupStatus": {
33954
+ capName: "storage-migration",
33955
+ capScope: "system",
33956
+ addonId: null,
33957
+ access: "view"
33958
+ },
33804
33959
  "storageMigration.drain": {
33805
33960
  capName: "storage-migration",
33806
33961
  capScope: "system",
33807
33962
  addonId: null,
33808
33963
  access: "create"
33809
33964
  },
33965
+ "storageMigration.history": {
33966
+ capName: "storage-migration",
33967
+ capScope: "system",
33968
+ addonId: null,
33969
+ access: "view"
33970
+ },
33810
33971
  "storageMigration.movers": {
33811
33972
  capName: "storage-migration",
33812
33973
  capScope: "system",
@@ -35803,11 +35964,6 @@ Object.freeze({
35803
35964
  form: "single",
35804
35965
  optional: true
35805
35966
  }],
35806
- "pipelineAnalytics.getGroup": [{
35807
- name: "deviceId",
35808
- form: "single",
35809
- optional: false
35810
- }],
35811
35967
  "pipelineAnalytics.getKeyEvents": [{
35812
35968
  name: "deviceId",
35813
35969
  form: "single",
@@ -35873,11 +36029,6 @@ Object.freeze({
35873
36029
  form: "single",
35874
36030
  optional: false
35875
36031
  }],
35876
- "pipelineAnalytics.listGroups": [{
35877
- name: "deviceIds",
35878
- form: "array",
35879
- optional: false
35880
- }],
35881
36032
  "pipelineAnalytics.listOpsLog": [{
35882
36033
  name: "deviceId",
35883
36034
  form: "single",
@@ -35923,6 +36074,11 @@ Object.freeze({
35923
36074
  form: "single",
35924
36075
  optional: true
35925
36076
  }],
36077
+ "pipelineAnalytics.reclaimDebugMedia": [{
36078
+ name: "deviceIds",
36079
+ form: "array",
36080
+ optional: true
36081
+ }],
35926
36082
  "pipelineAnalytics.reconcileFromDisk": [{
35927
36083
  name: "deviceId",
35928
36084
  form: "single",
@@ -36288,6 +36444,11 @@ Object.freeze({
36288
36444
  form: "single",
36289
36445
  optional: false
36290
36446
  }],
36447
+ "recording.setDevicePlacement": [{
36448
+ name: "deviceId",
36449
+ form: "single",
36450
+ optional: false
36451
+ }],
36291
36452
  "recording.startStorageMigrationMove": [{
36292
36453
  name: "deviceId",
36293
36454
  form: "single",
@@ -8237,6 +8237,13 @@ var MediaRelocateModeSchema = _enum([
8237
8237
  ]);
8238
8238
  var RelocateMediaInputSchema = object({
8239
8239
  toLocationId: string(),
8240
+ /**
8241
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8242
+ * every row that is not already on `toLocationId` (the historical
8243
+ * behaviour). A named source is what a from→to migration needs: without it
8244
+ * "move events off disk 2" also emptied disk 1.
8245
+ */
8246
+ fromLocationId: string().optional(),
8240
8247
  throttleMbps: number().min(1).max(1e3).optional(),
8241
8248
  /** Omitted = `move`, the pre-existing behaviour. */
8242
8249
  mode: MediaRelocateModeSchema.optional()
@@ -8304,6 +8311,19 @@ var StorageMigrationDestinationsSchema = object({
8304
8311
  galleryMedia: string().min(1).optional()
8305
8312
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8306
8313
  /**
8314
+ * Optional named source per class. Omitted = the class's current default
8315
+ * (the historical behaviour). A named source that is NOT the default is a
8316
+ * drain of that disk: bytes move, the default stays, and the source is
8317
+ * disabled when the move finishes.
8318
+ */
8319
+ var StorageMigrationSourcesSchema = object({
8320
+ recordings: string().min(1).optional(),
8321
+ recordingsLow: string().min(1).optional(),
8322
+ eventMedia: string().min(1).optional(),
8323
+ backups: string().min(1).optional(),
8324
+ galleryMedia: string().min(1).optional()
8325
+ }).optional();
8326
+ /**
8307
8327
  * How a migration sequences the cutover against the byte move.
8308
8328
  *
8309
8329
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8325,6 +8345,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8325
8345
  /** Shared input for planning and starting an orchestrated storage migration. */
8326
8346
  var StorageMigrationInputSchema = object({
8327
8347
  destinations: StorageMigrationDestinationsSchema,
8348
+ /** Omitted = each class's current default. */
8349
+ sources: StorageMigrationSourcesSchema,
8328
8350
  throttleMbps: number().min(1).max(1e3).optional(),
8329
8351
  /** Omitted = `blocking`, which stays the default. */
8330
8352
  mode: StorageMigrationModeSchema.optional()
@@ -8404,6 +8426,13 @@ var StorageMigrationMoveSchema = object({
8404
8426
  storageClass: StorageMigrationClassSchema,
8405
8427
  fromLocationId: string(),
8406
8428
  toLocationId: string(),
8429
+ /**
8430
+ * True when `from` was NOT the class default at plan time. The move still
8431
+ * copies bytes, but the default is left alone and the source is disabled
8432
+ * once the copy verifies. Absent on jobs planned before this field existed
8433
+ * — those jobs always repointed, which is `false`.
8434
+ */
8435
+ freezeSource: boolean().optional(),
8407
8436
  moverJobId: string().nullable(),
8408
8437
  state: RelocateJobStateSchema.nullable(),
8409
8438
  error: string().nullable(),
@@ -8417,6 +8446,7 @@ var StorageMigrationJobSchema = object({
8417
8446
  * can tell a seconds-long cutover from a thirty-hour one. */
8418
8447
  mode: StorageMigrationModeSchema,
8419
8448
  destinations: StorageMigrationDestinationsSchema,
8449
+ sources: StorageMigrationSourcesSchema,
8420
8450
  throttleMbps: number(),
8421
8451
  moves: array(StorageMigrationMoveSchema),
8422
8452
  pauseLeaseId: string().nullable(),
@@ -8442,6 +8472,7 @@ var StorageMigrationFindingSchema = object({
8442
8472
  });
8443
8473
  var StorageMigrationPlanSchema = object({
8444
8474
  destinations: StorageMigrationDestinationsSchema,
8475
+ sources: StorageMigrationSourcesSchema,
8445
8476
  /** The mode this plan was built for. A plan is only valid for its mode: the
8446
8477
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8447
8478
  * it. */
@@ -8449,7 +8480,8 @@ var StorageMigrationPlanSchema = object({
8449
8480
  moves: array(object({
8450
8481
  storageClass: StorageMigrationClassSchema,
8451
8482
  fromLocationId: string(),
8452
- toLocationId: string()
8483
+ toLocationId: string(),
8484
+ freezeSource: boolean().optional()
8453
8485
  })),
8454
8486
  findings: array(StorageMigrationFindingSchema)
8455
8487
  });
@@ -8627,10 +8659,51 @@ var LedgerWalkReportSchema = object({
8627
8659
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8628
8660
  var RelocatableMediaCountInputSchema = object({
8629
8661
  toLocationId: string().min(1),
8662
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8663
+ fromLocationId: string().optional(),
8630
8664
  /** Omitted = `move`. */
8631
8665
  mode: MediaRelocateModeSchema.optional()
8632
8666
  });
8633
8667
  /**
8668
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8669
+ * ghost ledger entries on frozen footage locations.
8670
+ *
8671
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8672
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8673
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8674
+ * with no operator-visible status.
8675
+ */
8676
+ var StorageCleanupPhaseSchema = _enum([
8677
+ "orphans",
8678
+ "debug-media",
8679
+ "ghost-ledger",
8680
+ "done",
8681
+ "failed",
8682
+ "cancelled"
8683
+ ]);
8684
+ var StorageCleanupInputSchema = object({
8685
+ /** Also walk motion stills / track filmstrips. Off by default. */
8686
+ includeDebugMedia: boolean().optional() });
8687
+ var StorageCleanupJobSchema = object({
8688
+ jobId: string(),
8689
+ phase: StorageCleanupPhaseSchema,
8690
+ includeDebugMedia: boolean(),
8691
+ orphansReclaimed: number().int().nonnegative(),
8692
+ orphanBytesReclaimed: number().int().nonnegative(),
8693
+ debugMediaReclaimed: number().int().nonnegative(),
8694
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8695
+ ghostsForgotten: number().int().nonnegative(),
8696
+ ghostBytesForgotten: number().int().nonnegative(),
8697
+ /** Short operator-facing line: current collection, pass, or location. */
8698
+ detail: string().nullable(),
8699
+ cancelRequested: boolean(),
8700
+ startedAt: number(),
8701
+ updatedAt: number(),
8702
+ finishedAt: number().nullable(),
8703
+ error: string().nullable()
8704
+ });
8705
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8706
+ /**
8634
8707
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8635
8708
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8636
8709
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8658,11 +8731,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8658
8731
  * The default location for a type uses `id === <type>:default` by
8659
8732
  * convention (the bare type ref like `'backups'` resolves to it).
8660
8733
  *
8661
- * `isSystem: true` marks a location as orchestrator-seeded and
8662
- * undeletable. The bootstrap-installed defaults (one per type) carry
8663
- * this flag; operator-added locations don't. Editing the config of
8664
- * a system location is allowed (path migration, provider swap) but
8665
- * deleting it is rejected at the cap level.
8734
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8735
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8736
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8737
+ * / last-enabled, not on this bit.
8666
8738
  */
8667
8739
  var StorageLocationSchema = object({
8668
8740
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -13051,6 +13123,12 @@ method(object({
13051
13123
  }), _void(), {
13052
13124
  kind: "mutation",
13053
13125
  auth: "admin"
13126
+ }), method(object({
13127
+ from: string(),
13128
+ to: string()
13129
+ }), object({ moved: number() }), {
13130
+ kind: "mutation",
13131
+ auth: "admin"
13054
13132
  }), method(object({
13055
13133
  deviceId: number(),
13056
13134
  disabled: boolean()
@@ -18997,46 +19075,6 @@ var RecentTracksPageSchema = object({
18997
19075
  /** Cursor for the next page, or null when this page is the last. */
18998
19076
  nextCursor: string().nullable()
18999
19077
  });
19000
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
19001
- var LIST_GROUPS_MAX_LIMIT = 100;
19002
- var AnalyticsGroupRecordSchema = object({
19003
- id: string(),
19004
- deviceId: number().int(),
19005
- openedAt: number().int(),
19006
- closedAt: number().int(),
19007
- timestamp: number().int(),
19008
- memberCount: number().int(),
19009
- memberTrackIds: array(string()).readonly(),
19010
- className: string(),
19011
- classes: array(string()).readonly(),
19012
- /** Relative event-media path, or null when the group has no picture yet. */
19013
- mediaUrl: string().nullable(),
19014
- singleton: boolean()
19015
- });
19016
- var AnalyticsGroupMemberSchema = object({
19017
- trackId: string(),
19018
- deviceId: number().int(),
19019
- className: string(),
19020
- firstSeen: number().int(),
19021
- lastSeen: number().int(),
19022
- mediaUrl: string().nullable()
19023
- });
19024
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
19025
- var ListGroupsQueryInput = object({
19026
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
19027
- deviceIds: array(number()),
19028
- /** Window lower bound on `closedAt` (inclusive). */
19029
- since: number().optional(),
19030
- /** Window upper bound on `openedAt` (inclusive). */
19031
- until: number().optional(),
19032
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
19033
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
19034
- cursor: string().optional()
19035
- });
19036
- var ListGroupsPageSchema = object({
19037
- groups: array(AnalyticsGroupRecordSchema).readonly(),
19038
- nextCursor: string().nullable()
19039
- });
19040
19078
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19041
19079
  var KEY_EVENTS_MAX_LIMIT = 200;
19042
19080
  var KeyEventQueryInput = object({
@@ -19140,9 +19178,7 @@ var TrackCascadeCountsSchema = object({
19140
19178
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19141
19179
  plates: number().int(),
19142
19180
  /** Per-track CLIP search vectors removed (best-effort). */
19143
- embeddings: number().int(),
19144
- /** Group membership + group rows removed with their last member (best-effort). */
19145
- groups: number().int()
19181
+ embeddings: number().int()
19146
19182
  });
19147
19183
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19148
19184
  var DiskReconcileCountsSchema = object({
@@ -19312,6 +19348,47 @@ var RebuildStatusSchema = object({
19312
19348
  /** Present when the pass ended by throwing. */
19313
19349
  error: string().nullable()
19314
19350
  });
19351
+ /**
19352
+ * Acknowledgement that a debug-media reclaim STARTED.
19353
+ *
19354
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19355
+ * it runs detached and this returns immediately. Awaiting it is how the
19356
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19357
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19358
+ */
19359
+ var MediaReclaimStartResultSchema = object({
19360
+ started: boolean(),
19361
+ /** True when a pass was already running; the new request is ignored. */
19362
+ alreadyRunning: boolean()
19363
+ });
19364
+ var MediaReclaimInputSchema = object({
19365
+ mode: _enum(["report", "reclaim"]).default("report"),
19366
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19367
+ deviceIds: array(number().int()).min(1).optional(),
19368
+ restart: boolean().optional(),
19369
+ pageSize: number().int().min(50).max(5e3).optional(),
19370
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19371
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19372
+ maxBytesPerRun: number().int().min(1).optional(),
19373
+ budgetMinutes: number().int().min(1).max(720).optional(),
19374
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19375
+ graceMinutes: number().int().min(1).max(10080).optional()
19376
+ });
19377
+ var MediaReclaimStatusSchema = object({
19378
+ running: boolean(),
19379
+ mode: _enum(["report", "reclaim"]).nullable(),
19380
+ totalExamined: number(),
19381
+ totalEligible: number(),
19382
+ totalReclaimed: number(),
19383
+ totalBytesReclaimed: number(),
19384
+ totalRefused: number(),
19385
+ /** Device+scope windows finished in this pass. */
19386
+ devicesDone: number(),
19387
+ complete: boolean().nullable(),
19388
+ startedAtMs: number().nullable(),
19389
+ finishedAtMs: number().nullable(),
19390
+ error: string().nullable()
19391
+ });
19315
19392
  var ReplayFrameInputSchema = object({
19316
19393
  timestamp: number(),
19317
19394
  frame: PipelineRunResultBridge
@@ -19350,10 +19427,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19350
19427
  * stationary registry). Default false: the timeline lists passages,
19351
19428
  * not parking records (operator decision, 2026-08-15). */
19352
19429
  includeStationary: boolean().optional()
19353
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19354
- deviceId: number(),
19355
- groupId: string().min(1)
19356
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19430
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19357
19431
  kind: "mutation",
19358
19432
  auth: "admin"
19359
19433
  }), 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({
@@ -19453,6 +19527,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19453
19527
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19454
19528
  kind: "query",
19455
19529
  auth: "admin"
19530
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19531
+ kind: "mutation",
19532
+ auth: "admin"
19533
+ }), method(object({}), MediaReclaimStatusSchema, {
19534
+ kind: "query",
19535
+ auth: "admin"
19456
19536
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19457
19537
  kind: "query",
19458
19538
  auth: "admin"
@@ -21423,7 +21503,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21423
21503
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21424
21504
  kind: "mutation",
21425
21505
  auth: "admin"
21426
- });
21506
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21507
+ kind: "mutation",
21508
+ auth: "admin"
21509
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21510
+ kind: "mutation",
21511
+ auth: "admin"
21512
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21427
21513
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21428
21514
  providerId: string().min(1),
21429
21515
  displayName: string().min(1),
@@ -26801,6 +26887,33 @@ var RecordingRebalanceInputSchema = object({
26801
26887
  minMoveGb: number().min(0).optional()
26802
26888
  });
26803
26889
  /**
26890
+ * Operator-facing placement of one camera onto a recordings location.
26891
+ *
26892
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
26893
+ * Auto (the planner may move this camera). `locationId` is where high/mid
26894
+ * currently write — the plan, which may disagree with the pin when Auto.
26895
+ */
26896
+ var RecordingDevicePlacementSchema = object({
26897
+ deviceId: number().int(),
26898
+ profile: string(),
26899
+ locationId: string()
26900
+ });
26901
+ var RecordingDevicePinSchema = object({
26902
+ deviceId: number().int(),
26903
+ /** Recordings-class location this camera is pinned to. */
26904
+ locationId: string()
26905
+ });
26906
+ var RecordingPlacementViewSchema = object({
26907
+ assignments: array(RecordingDevicePlacementSchema),
26908
+ pins: array(RecordingDevicePinSchema),
26909
+ defaultLocations: record(string(), string())
26910
+ });
26911
+ var RecordingSetDevicePlacementInputSchema = object({
26912
+ deviceId: number().int(),
26913
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
26914
+ locationId: string().nullable()
26915
+ });
26916
+ /**
26804
26917
  * Result of locating footage at a wall-clock instant for one device/profile.
26805
26918
  * `segment` carries the covering segment's window; `gap` reports the forward
26806
26919
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -27026,6 +27139,12 @@ method(object({
27026
27139
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
27027
27140
  kind: "mutation",
27028
27141
  auth: "admin"
27142
+ }), method(object({}), RecordingPlacementViewSchema, {
27143
+ kind: "query",
27144
+ auth: "admin"
27145
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
27146
+ kind: "mutation",
27147
+ auth: "admin"
27029
27148
  });
27030
27149
  /**
27031
27150
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -30396,6 +30515,12 @@ Object.freeze({
30396
30515
  addonId: null,
30397
30516
  access: "delete"
30398
30517
  },
30518
+ "deviceManager.renameLocation": {
30519
+ capName: "device-manager",
30520
+ capScope: "system",
30521
+ addonId: null,
30522
+ access: "create"
30523
+ },
30399
30524
  "deviceManager.runDeviceAction": {
30400
30525
  capName: "device-manager",
30401
30526
  capScope: "system",
@@ -32088,19 +32213,19 @@ Object.freeze({
32088
32213
  addonId: null,
32089
32214
  access: "view"
32090
32215
  },
32091
- "pipelineAnalytics.getGroup": {
32216
+ "pipelineAnalytics.getKeyEvents": {
32092
32217
  capName: "pipeline-analytics",
32093
32218
  capScope: "device",
32094
32219
  addonId: null,
32095
32220
  access: "view"
32096
32221
  },
32097
- "pipelineAnalytics.getKeyEvents": {
32222
+ "pipelineAnalytics.getKeyEventsBatch": {
32098
32223
  capName: "pipeline-analytics",
32099
32224
  capScope: "device",
32100
32225
  addonId: null,
32101
32226
  access: "view"
32102
32227
  },
32103
- "pipelineAnalytics.getKeyEventsBatch": {
32228
+ "pipelineAnalytics.getMediaReclaimStatus": {
32104
32229
  capName: "pipeline-analytics",
32105
32230
  capScope: "device",
32106
32231
  addonId: null,
@@ -32190,12 +32315,6 @@ Object.freeze({
32190
32315
  addonId: null,
32191
32316
  access: "view"
32192
32317
  },
32193
- "pipelineAnalytics.listGroups": {
32194
- capName: "pipeline-analytics",
32195
- capScope: "device",
32196
- addonId: null,
32197
- access: "view"
32198
- },
32199
32318
  "pipelineAnalytics.listOpsLog": {
32200
32319
  capName: "pipeline-analytics",
32201
32320
  capScope: "device",
@@ -32280,6 +32399,12 @@ Object.freeze({
32280
32399
  addonId: null,
32281
32400
  access: "create"
32282
32401
  },
32402
+ "pipelineAnalytics.reclaimDebugMedia": {
32403
+ capName: "pipeline-analytics",
32404
+ capScope: "device",
32405
+ addonId: null,
32406
+ access: "create"
32407
+ },
32283
32408
  "pipelineAnalytics.reconcileFromDisk": {
32284
32409
  capName: "pipeline-analytics",
32285
32410
  capScope: "device",
@@ -33204,6 +33329,12 @@ Object.freeze({
33204
33329
  addonId: null,
33205
33330
  access: "view"
33206
33331
  },
33332
+ "recording.getPlacement": {
33333
+ capName: "recording",
33334
+ capScope: "system",
33335
+ addonId: null,
33336
+ access: "view"
33337
+ },
33207
33338
  "recording.getPlaybackManifest": {
33208
33339
  capName: "recording",
33209
33340
  capScope: "system",
@@ -33330,6 +33461,12 @@ Object.freeze({
33330
33461
  addonId: null,
33331
33462
  access: "create"
33332
33463
  },
33464
+ "recording.setDevicePlacement": {
33465
+ capName: "recording",
33466
+ capScope: "system",
33467
+ addonId: null,
33468
+ access: "create"
33469
+ },
33333
33470
  "recording.startStorageMigrationMove": {
33334
33471
  capName: "recording",
33335
33472
  capScope: "system",
@@ -33774,12 +33911,36 @@ Object.freeze({
33774
33911
  addonId: null,
33775
33912
  access: "create"
33776
33913
  },
33914
+ "storageMigration.cleanupCancel": {
33915
+ capName: "storage-migration",
33916
+ capScope: "system",
33917
+ addonId: null,
33918
+ access: "create"
33919
+ },
33920
+ "storageMigration.cleanupStart": {
33921
+ capName: "storage-migration",
33922
+ capScope: "system",
33923
+ addonId: null,
33924
+ access: "create"
33925
+ },
33926
+ "storageMigration.cleanupStatus": {
33927
+ capName: "storage-migration",
33928
+ capScope: "system",
33929
+ addonId: null,
33930
+ access: "view"
33931
+ },
33777
33932
  "storageMigration.drain": {
33778
33933
  capName: "storage-migration",
33779
33934
  capScope: "system",
33780
33935
  addonId: null,
33781
33936
  access: "create"
33782
33937
  },
33938
+ "storageMigration.history": {
33939
+ capName: "storage-migration",
33940
+ capScope: "system",
33941
+ addonId: null,
33942
+ access: "view"
33943
+ },
33783
33944
  "storageMigration.movers": {
33784
33945
  capName: "storage-migration",
33785
33946
  capScope: "system",
@@ -35776,11 +35937,6 @@ Object.freeze({
35776
35937
  form: "single",
35777
35938
  optional: true
35778
35939
  }],
35779
- "pipelineAnalytics.getGroup": [{
35780
- name: "deviceId",
35781
- form: "single",
35782
- optional: false
35783
- }],
35784
35940
  "pipelineAnalytics.getKeyEvents": [{
35785
35941
  name: "deviceId",
35786
35942
  form: "single",
@@ -35846,11 +36002,6 @@ Object.freeze({
35846
36002
  form: "single",
35847
36003
  optional: false
35848
36004
  }],
35849
- "pipelineAnalytics.listGroups": [{
35850
- name: "deviceIds",
35851
- form: "array",
35852
- optional: false
35853
- }],
35854
36005
  "pipelineAnalytics.listOpsLog": [{
35855
36006
  name: "deviceId",
35856
36007
  form: "single",
@@ -35896,6 +36047,11 @@ Object.freeze({
35896
36047
  form: "single",
35897
36048
  optional: true
35898
36049
  }],
36050
+ "pipelineAnalytics.reclaimDebugMedia": [{
36051
+ name: "deviceIds",
36052
+ form: "array",
36053
+ optional: true
36054
+ }],
35899
36055
  "pipelineAnalytics.reconcileFromDisk": [{
35900
36056
  name: "deviceId",
35901
36057
  form: "single",
@@ -36261,6 +36417,11 @@ Object.freeze({
36261
36417
  form: "single",
36262
36418
  optional: false
36263
36419
  }],
36420
+ "recording.setDevicePlacement": [{
36421
+ name: "deviceId",
36422
+ form: "single",
36423
+ optional: false
36424
+ }],
36264
36425
  "recording.startStorageMigrationMove": [{
36265
36426
  name: "deviceId",
36266
36427
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-export-alexa",
3
- "version": "1.2.55",
3
+ "version": "1.2.56",
4
4
  "description": "Alexa Smart Home Skill export — hub-side OAuth provider + directive handler. The companion AWS Lambda forwards Alexa directives to this addon's /addon/export-alexa/directive endpoint.",
5
5
  "keywords": [
6
6
  "camstack",