@camstack/addon-export-alexa 1.2.55 → 1.2.57

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()
@@ -15790,6 +15868,8 @@ var NcSystemEventKindSchema = _enum([
15790
15868
  "device-offline",
15791
15869
  "device-disabled",
15792
15870
  "device-enabled",
15871
+ "device-battery-low",
15872
+ "device-battery-normal",
15793
15873
  "stream-online",
15794
15874
  "stream-offline",
15795
15875
  "node-online",
@@ -19024,46 +19104,6 @@ var RecentTracksPageSchema = object({
19024
19104
  /** Cursor for the next page, or null when this page is the last. */
19025
19105
  nextCursor: string().nullable()
19026
19106
  });
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
19107
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19068
19108
  var KEY_EVENTS_MAX_LIMIT = 200;
19069
19109
  var KeyEventQueryInput = object({
@@ -19167,9 +19207,7 @@ var TrackCascadeCountsSchema = object({
19167
19207
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19168
19208
  plates: number().int(),
19169
19209
  /** 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()
19210
+ embeddings: number().int()
19173
19211
  });
19174
19212
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19175
19213
  var DiskReconcileCountsSchema = object({
@@ -19339,6 +19377,47 @@ var RebuildStatusSchema = object({
19339
19377
  /** Present when the pass ended by throwing. */
19340
19378
  error: string().nullable()
19341
19379
  });
19380
+ /**
19381
+ * Acknowledgement that a debug-media reclaim STARTED.
19382
+ *
19383
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19384
+ * it runs detached and this returns immediately. Awaiting it is how the
19385
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19386
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19387
+ */
19388
+ var MediaReclaimStartResultSchema = object({
19389
+ started: boolean(),
19390
+ /** True when a pass was already running; the new request is ignored. */
19391
+ alreadyRunning: boolean()
19392
+ });
19393
+ var MediaReclaimInputSchema = object({
19394
+ mode: _enum(["report", "reclaim"]).default("report"),
19395
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19396
+ deviceIds: array(number().int()).min(1).optional(),
19397
+ restart: boolean().optional(),
19398
+ pageSize: number().int().min(50).max(5e3).optional(),
19399
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19400
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19401
+ maxBytesPerRun: number().int().min(1).optional(),
19402
+ budgetMinutes: number().int().min(1).max(720).optional(),
19403
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19404
+ graceMinutes: number().int().min(1).max(10080).optional()
19405
+ });
19406
+ var MediaReclaimStatusSchema = object({
19407
+ running: boolean(),
19408
+ mode: _enum(["report", "reclaim"]).nullable(),
19409
+ totalExamined: number(),
19410
+ totalEligible: number(),
19411
+ totalReclaimed: number(),
19412
+ totalBytesReclaimed: number(),
19413
+ totalRefused: number(),
19414
+ /** Device+scope windows finished in this pass. */
19415
+ devicesDone: number(),
19416
+ complete: boolean().nullable(),
19417
+ startedAtMs: number().nullable(),
19418
+ finishedAtMs: number().nullable(),
19419
+ error: string().nullable()
19420
+ });
19342
19421
  var ReplayFrameInputSchema = object({
19343
19422
  timestamp: number(),
19344
19423
  frame: PipelineRunResultBridge
@@ -19377,10 +19456,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19377
19456
  * stationary registry). Default false: the timeline lists passages,
19378
19457
  * not parking records (operator decision, 2026-08-15). */
19379
19458
  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(), {
19459
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19384
19460
  kind: "mutation",
19385
19461
  auth: "admin"
19386
19462
  }), 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 +19556,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19480
19556
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19481
19557
  kind: "query",
19482
19558
  auth: "admin"
19559
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19560
+ kind: "mutation",
19561
+ auth: "admin"
19562
+ }), method(object({}), MediaReclaimStatusSchema, {
19563
+ kind: "query",
19564
+ auth: "admin"
19483
19565
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19484
19566
  kind: "query",
19485
19567
  auth: "admin"
@@ -21450,7 +21532,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21450
21532
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21451
21533
  kind: "mutation",
21452
21534
  auth: "admin"
21453
- });
21535
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21536
+ kind: "mutation",
21537
+ auth: "admin"
21538
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21539
+ kind: "mutation",
21540
+ auth: "admin"
21541
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21454
21542
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21455
21543
  providerId: string().min(1),
21456
21544
  displayName: string().min(1),
@@ -26828,6 +26916,33 @@ var RecordingRebalanceInputSchema = object({
26828
26916
  minMoveGb: number().min(0).optional()
26829
26917
  });
26830
26918
  /**
26919
+ * Operator-facing placement of one camera onto a recordings location.
26920
+ *
26921
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
26922
+ * Auto (the planner may move this camera). `locationId` is where high/mid
26923
+ * currently write — the plan, which may disagree with the pin when Auto.
26924
+ */
26925
+ var RecordingDevicePlacementSchema = object({
26926
+ deviceId: number().int(),
26927
+ profile: string(),
26928
+ locationId: string()
26929
+ });
26930
+ var RecordingDevicePinSchema = object({
26931
+ deviceId: number().int(),
26932
+ /** Recordings-class location this camera is pinned to. */
26933
+ locationId: string()
26934
+ });
26935
+ var RecordingPlacementViewSchema = object({
26936
+ assignments: array(RecordingDevicePlacementSchema),
26937
+ pins: array(RecordingDevicePinSchema),
26938
+ defaultLocations: record(string(), string())
26939
+ });
26940
+ var RecordingSetDevicePlacementInputSchema = object({
26941
+ deviceId: number().int(),
26942
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
26943
+ locationId: string().nullable()
26944
+ });
26945
+ /**
26831
26946
  * Result of locating footage at a wall-clock instant for one device/profile.
26832
26947
  * `segment` carries the covering segment's window; `gap` reports the forward
26833
26948
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -27053,6 +27168,12 @@ method(object({
27053
27168
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
27054
27169
  kind: "mutation",
27055
27170
  auth: "admin"
27171
+ }), method(object({}), RecordingPlacementViewSchema, {
27172
+ kind: "query",
27173
+ auth: "admin"
27174
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
27175
+ kind: "mutation",
27176
+ auth: "admin"
27056
27177
  });
27057
27178
  /**
27058
27179
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -30423,6 +30544,12 @@ Object.freeze({
30423
30544
  addonId: null,
30424
30545
  access: "delete"
30425
30546
  },
30547
+ "deviceManager.renameLocation": {
30548
+ capName: "device-manager",
30549
+ capScope: "system",
30550
+ addonId: null,
30551
+ access: "create"
30552
+ },
30426
30553
  "deviceManager.runDeviceAction": {
30427
30554
  capName: "device-manager",
30428
30555
  capScope: "system",
@@ -32115,19 +32242,19 @@ Object.freeze({
32115
32242
  addonId: null,
32116
32243
  access: "view"
32117
32244
  },
32118
- "pipelineAnalytics.getGroup": {
32245
+ "pipelineAnalytics.getKeyEvents": {
32119
32246
  capName: "pipeline-analytics",
32120
32247
  capScope: "device",
32121
32248
  addonId: null,
32122
32249
  access: "view"
32123
32250
  },
32124
- "pipelineAnalytics.getKeyEvents": {
32251
+ "pipelineAnalytics.getKeyEventsBatch": {
32125
32252
  capName: "pipeline-analytics",
32126
32253
  capScope: "device",
32127
32254
  addonId: null,
32128
32255
  access: "view"
32129
32256
  },
32130
- "pipelineAnalytics.getKeyEventsBatch": {
32257
+ "pipelineAnalytics.getMediaReclaimStatus": {
32131
32258
  capName: "pipeline-analytics",
32132
32259
  capScope: "device",
32133
32260
  addonId: null,
@@ -32217,12 +32344,6 @@ Object.freeze({
32217
32344
  addonId: null,
32218
32345
  access: "view"
32219
32346
  },
32220
- "pipelineAnalytics.listGroups": {
32221
- capName: "pipeline-analytics",
32222
- capScope: "device",
32223
- addonId: null,
32224
- access: "view"
32225
- },
32226
32347
  "pipelineAnalytics.listOpsLog": {
32227
32348
  capName: "pipeline-analytics",
32228
32349
  capScope: "device",
@@ -32307,6 +32428,12 @@ Object.freeze({
32307
32428
  addonId: null,
32308
32429
  access: "create"
32309
32430
  },
32431
+ "pipelineAnalytics.reclaimDebugMedia": {
32432
+ capName: "pipeline-analytics",
32433
+ capScope: "device",
32434
+ addonId: null,
32435
+ access: "create"
32436
+ },
32310
32437
  "pipelineAnalytics.reconcileFromDisk": {
32311
32438
  capName: "pipeline-analytics",
32312
32439
  capScope: "device",
@@ -33231,6 +33358,12 @@ Object.freeze({
33231
33358
  addonId: null,
33232
33359
  access: "view"
33233
33360
  },
33361
+ "recording.getPlacement": {
33362
+ capName: "recording",
33363
+ capScope: "system",
33364
+ addonId: null,
33365
+ access: "view"
33366
+ },
33234
33367
  "recording.getPlaybackManifest": {
33235
33368
  capName: "recording",
33236
33369
  capScope: "system",
@@ -33357,6 +33490,12 @@ Object.freeze({
33357
33490
  addonId: null,
33358
33491
  access: "create"
33359
33492
  },
33493
+ "recording.setDevicePlacement": {
33494
+ capName: "recording",
33495
+ capScope: "system",
33496
+ addonId: null,
33497
+ access: "create"
33498
+ },
33360
33499
  "recording.startStorageMigrationMove": {
33361
33500
  capName: "recording",
33362
33501
  capScope: "system",
@@ -33801,12 +33940,36 @@ Object.freeze({
33801
33940
  addonId: null,
33802
33941
  access: "create"
33803
33942
  },
33943
+ "storageMigration.cleanupCancel": {
33944
+ capName: "storage-migration",
33945
+ capScope: "system",
33946
+ addonId: null,
33947
+ access: "create"
33948
+ },
33949
+ "storageMigration.cleanupStart": {
33950
+ capName: "storage-migration",
33951
+ capScope: "system",
33952
+ addonId: null,
33953
+ access: "create"
33954
+ },
33955
+ "storageMigration.cleanupStatus": {
33956
+ capName: "storage-migration",
33957
+ capScope: "system",
33958
+ addonId: null,
33959
+ access: "view"
33960
+ },
33804
33961
  "storageMigration.drain": {
33805
33962
  capName: "storage-migration",
33806
33963
  capScope: "system",
33807
33964
  addonId: null,
33808
33965
  access: "create"
33809
33966
  },
33967
+ "storageMigration.history": {
33968
+ capName: "storage-migration",
33969
+ capScope: "system",
33970
+ addonId: null,
33971
+ access: "view"
33972
+ },
33810
33973
  "storageMigration.movers": {
33811
33974
  capName: "storage-migration",
33812
33975
  capScope: "system",
@@ -35803,11 +35966,6 @@ Object.freeze({
35803
35966
  form: "single",
35804
35967
  optional: true
35805
35968
  }],
35806
- "pipelineAnalytics.getGroup": [{
35807
- name: "deviceId",
35808
- form: "single",
35809
- optional: false
35810
- }],
35811
35969
  "pipelineAnalytics.getKeyEvents": [{
35812
35970
  name: "deviceId",
35813
35971
  form: "single",
@@ -35873,11 +36031,6 @@ Object.freeze({
35873
36031
  form: "single",
35874
36032
  optional: false
35875
36033
  }],
35876
- "pipelineAnalytics.listGroups": [{
35877
- name: "deviceIds",
35878
- form: "array",
35879
- optional: false
35880
- }],
35881
36034
  "pipelineAnalytics.listOpsLog": [{
35882
36035
  name: "deviceId",
35883
36036
  form: "single",
@@ -35923,6 +36076,11 @@ Object.freeze({
35923
36076
  form: "single",
35924
36077
  optional: true
35925
36078
  }],
36079
+ "pipelineAnalytics.reclaimDebugMedia": [{
36080
+ name: "deviceIds",
36081
+ form: "array",
36082
+ optional: true
36083
+ }],
35926
36084
  "pipelineAnalytics.reconcileFromDisk": [{
35927
36085
  name: "deviceId",
35928
36086
  form: "single",
@@ -36288,6 +36446,11 @@ Object.freeze({
36288
36446
  form: "single",
36289
36447
  optional: false
36290
36448
  }],
36449
+ "recording.setDevicePlacement": [{
36450
+ name: "deviceId",
36451
+ form: "single",
36452
+ optional: false
36453
+ }],
36291
36454
  "recording.startStorageMigrationMove": [{
36292
36455
  name: "deviceId",
36293
36456
  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()
@@ -15763,6 +15841,8 @@ var NcSystemEventKindSchema = _enum([
15763
15841
  "device-offline",
15764
15842
  "device-disabled",
15765
15843
  "device-enabled",
15844
+ "device-battery-low",
15845
+ "device-battery-normal",
15766
15846
  "stream-online",
15767
15847
  "stream-offline",
15768
15848
  "node-online",
@@ -18997,46 +19077,6 @@ var RecentTracksPageSchema = object({
18997
19077
  /** Cursor for the next page, or null when this page is the last. */
18998
19078
  nextCursor: string().nullable()
18999
19079
  });
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
19080
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19041
19081
  var KEY_EVENTS_MAX_LIMIT = 200;
19042
19082
  var KeyEventQueryInput = object({
@@ -19140,9 +19180,7 @@ var TrackCascadeCountsSchema = object({
19140
19180
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19141
19181
  plates: number().int(),
19142
19182
  /** 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()
19183
+ embeddings: number().int()
19146
19184
  });
19147
19185
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19148
19186
  var DiskReconcileCountsSchema = object({
@@ -19312,6 +19350,47 @@ var RebuildStatusSchema = object({
19312
19350
  /** Present when the pass ended by throwing. */
19313
19351
  error: string().nullable()
19314
19352
  });
19353
+ /**
19354
+ * Acknowledgement that a debug-media reclaim STARTED.
19355
+ *
19356
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19357
+ * it runs detached and this returns immediately. Awaiting it is how the
19358
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19359
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19360
+ */
19361
+ var MediaReclaimStartResultSchema = object({
19362
+ started: boolean(),
19363
+ /** True when a pass was already running; the new request is ignored. */
19364
+ alreadyRunning: boolean()
19365
+ });
19366
+ var MediaReclaimInputSchema = object({
19367
+ mode: _enum(["report", "reclaim"]).default("report"),
19368
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19369
+ deviceIds: array(number().int()).min(1).optional(),
19370
+ restart: boolean().optional(),
19371
+ pageSize: number().int().min(50).max(5e3).optional(),
19372
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19373
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19374
+ maxBytesPerRun: number().int().min(1).optional(),
19375
+ budgetMinutes: number().int().min(1).max(720).optional(),
19376
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19377
+ graceMinutes: number().int().min(1).max(10080).optional()
19378
+ });
19379
+ var MediaReclaimStatusSchema = object({
19380
+ running: boolean(),
19381
+ mode: _enum(["report", "reclaim"]).nullable(),
19382
+ totalExamined: number(),
19383
+ totalEligible: number(),
19384
+ totalReclaimed: number(),
19385
+ totalBytesReclaimed: number(),
19386
+ totalRefused: number(),
19387
+ /** Device+scope windows finished in this pass. */
19388
+ devicesDone: number(),
19389
+ complete: boolean().nullable(),
19390
+ startedAtMs: number().nullable(),
19391
+ finishedAtMs: number().nullable(),
19392
+ error: string().nullable()
19393
+ });
19315
19394
  var ReplayFrameInputSchema = object({
19316
19395
  timestamp: number(),
19317
19396
  frame: PipelineRunResultBridge
@@ -19350,10 +19429,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19350
19429
  * stationary registry). Default false: the timeline lists passages,
19351
19430
  * not parking records (operator decision, 2026-08-15). */
19352
19431
  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(), {
19432
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19357
19433
  kind: "mutation",
19358
19434
  auth: "admin"
19359
19435
  }), 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 +19529,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19453
19529
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19454
19530
  kind: "query",
19455
19531
  auth: "admin"
19532
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19533
+ kind: "mutation",
19534
+ auth: "admin"
19535
+ }), method(object({}), MediaReclaimStatusSchema, {
19536
+ kind: "query",
19537
+ auth: "admin"
19456
19538
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19457
19539
  kind: "query",
19458
19540
  auth: "admin"
@@ -21423,7 +21505,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21423
21505
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21424
21506
  kind: "mutation",
21425
21507
  auth: "admin"
21426
- });
21508
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21509
+ kind: "mutation",
21510
+ auth: "admin"
21511
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21512
+ kind: "mutation",
21513
+ auth: "admin"
21514
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21427
21515
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21428
21516
  providerId: string().min(1),
21429
21517
  displayName: string().min(1),
@@ -26801,6 +26889,33 @@ var RecordingRebalanceInputSchema = object({
26801
26889
  minMoveGb: number().min(0).optional()
26802
26890
  });
26803
26891
  /**
26892
+ * Operator-facing placement of one camera onto a recordings location.
26893
+ *
26894
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
26895
+ * Auto (the planner may move this camera). `locationId` is where high/mid
26896
+ * currently write — the plan, which may disagree with the pin when Auto.
26897
+ */
26898
+ var RecordingDevicePlacementSchema = object({
26899
+ deviceId: number().int(),
26900
+ profile: string(),
26901
+ locationId: string()
26902
+ });
26903
+ var RecordingDevicePinSchema = object({
26904
+ deviceId: number().int(),
26905
+ /** Recordings-class location this camera is pinned to. */
26906
+ locationId: string()
26907
+ });
26908
+ var RecordingPlacementViewSchema = object({
26909
+ assignments: array(RecordingDevicePlacementSchema),
26910
+ pins: array(RecordingDevicePinSchema),
26911
+ defaultLocations: record(string(), string())
26912
+ });
26913
+ var RecordingSetDevicePlacementInputSchema = object({
26914
+ deviceId: number().int(),
26915
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
26916
+ locationId: string().nullable()
26917
+ });
26918
+ /**
26804
26919
  * Result of locating footage at a wall-clock instant for one device/profile.
26805
26920
  * `segment` carries the covering segment's window; `gap` reports the forward
26806
26921
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -27026,6 +27141,12 @@ method(object({
27026
27141
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
27027
27142
  kind: "mutation",
27028
27143
  auth: "admin"
27144
+ }), method(object({}), RecordingPlacementViewSchema, {
27145
+ kind: "query",
27146
+ auth: "admin"
27147
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
27148
+ kind: "mutation",
27149
+ auth: "admin"
27029
27150
  });
27030
27151
  /**
27031
27152
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -30396,6 +30517,12 @@ Object.freeze({
30396
30517
  addonId: null,
30397
30518
  access: "delete"
30398
30519
  },
30520
+ "deviceManager.renameLocation": {
30521
+ capName: "device-manager",
30522
+ capScope: "system",
30523
+ addonId: null,
30524
+ access: "create"
30525
+ },
30399
30526
  "deviceManager.runDeviceAction": {
30400
30527
  capName: "device-manager",
30401
30528
  capScope: "system",
@@ -32088,19 +32215,19 @@ Object.freeze({
32088
32215
  addonId: null,
32089
32216
  access: "view"
32090
32217
  },
32091
- "pipelineAnalytics.getGroup": {
32218
+ "pipelineAnalytics.getKeyEvents": {
32092
32219
  capName: "pipeline-analytics",
32093
32220
  capScope: "device",
32094
32221
  addonId: null,
32095
32222
  access: "view"
32096
32223
  },
32097
- "pipelineAnalytics.getKeyEvents": {
32224
+ "pipelineAnalytics.getKeyEventsBatch": {
32098
32225
  capName: "pipeline-analytics",
32099
32226
  capScope: "device",
32100
32227
  addonId: null,
32101
32228
  access: "view"
32102
32229
  },
32103
- "pipelineAnalytics.getKeyEventsBatch": {
32230
+ "pipelineAnalytics.getMediaReclaimStatus": {
32104
32231
  capName: "pipeline-analytics",
32105
32232
  capScope: "device",
32106
32233
  addonId: null,
@@ -32190,12 +32317,6 @@ Object.freeze({
32190
32317
  addonId: null,
32191
32318
  access: "view"
32192
32319
  },
32193
- "pipelineAnalytics.listGroups": {
32194
- capName: "pipeline-analytics",
32195
- capScope: "device",
32196
- addonId: null,
32197
- access: "view"
32198
- },
32199
32320
  "pipelineAnalytics.listOpsLog": {
32200
32321
  capName: "pipeline-analytics",
32201
32322
  capScope: "device",
@@ -32280,6 +32401,12 @@ Object.freeze({
32280
32401
  addonId: null,
32281
32402
  access: "create"
32282
32403
  },
32404
+ "pipelineAnalytics.reclaimDebugMedia": {
32405
+ capName: "pipeline-analytics",
32406
+ capScope: "device",
32407
+ addonId: null,
32408
+ access: "create"
32409
+ },
32283
32410
  "pipelineAnalytics.reconcileFromDisk": {
32284
32411
  capName: "pipeline-analytics",
32285
32412
  capScope: "device",
@@ -33204,6 +33331,12 @@ Object.freeze({
33204
33331
  addonId: null,
33205
33332
  access: "view"
33206
33333
  },
33334
+ "recording.getPlacement": {
33335
+ capName: "recording",
33336
+ capScope: "system",
33337
+ addonId: null,
33338
+ access: "view"
33339
+ },
33207
33340
  "recording.getPlaybackManifest": {
33208
33341
  capName: "recording",
33209
33342
  capScope: "system",
@@ -33330,6 +33463,12 @@ Object.freeze({
33330
33463
  addonId: null,
33331
33464
  access: "create"
33332
33465
  },
33466
+ "recording.setDevicePlacement": {
33467
+ capName: "recording",
33468
+ capScope: "system",
33469
+ addonId: null,
33470
+ access: "create"
33471
+ },
33333
33472
  "recording.startStorageMigrationMove": {
33334
33473
  capName: "recording",
33335
33474
  capScope: "system",
@@ -33774,12 +33913,36 @@ Object.freeze({
33774
33913
  addonId: null,
33775
33914
  access: "create"
33776
33915
  },
33916
+ "storageMigration.cleanupCancel": {
33917
+ capName: "storage-migration",
33918
+ capScope: "system",
33919
+ addonId: null,
33920
+ access: "create"
33921
+ },
33922
+ "storageMigration.cleanupStart": {
33923
+ capName: "storage-migration",
33924
+ capScope: "system",
33925
+ addonId: null,
33926
+ access: "create"
33927
+ },
33928
+ "storageMigration.cleanupStatus": {
33929
+ capName: "storage-migration",
33930
+ capScope: "system",
33931
+ addonId: null,
33932
+ access: "view"
33933
+ },
33777
33934
  "storageMigration.drain": {
33778
33935
  capName: "storage-migration",
33779
33936
  capScope: "system",
33780
33937
  addonId: null,
33781
33938
  access: "create"
33782
33939
  },
33940
+ "storageMigration.history": {
33941
+ capName: "storage-migration",
33942
+ capScope: "system",
33943
+ addonId: null,
33944
+ access: "view"
33945
+ },
33783
33946
  "storageMigration.movers": {
33784
33947
  capName: "storage-migration",
33785
33948
  capScope: "system",
@@ -35776,11 +35939,6 @@ Object.freeze({
35776
35939
  form: "single",
35777
35940
  optional: true
35778
35941
  }],
35779
- "pipelineAnalytics.getGroup": [{
35780
- name: "deviceId",
35781
- form: "single",
35782
- optional: false
35783
- }],
35784
35942
  "pipelineAnalytics.getKeyEvents": [{
35785
35943
  name: "deviceId",
35786
35944
  form: "single",
@@ -35846,11 +36004,6 @@ Object.freeze({
35846
36004
  form: "single",
35847
36005
  optional: false
35848
36006
  }],
35849
- "pipelineAnalytics.listGroups": [{
35850
- name: "deviceIds",
35851
- form: "array",
35852
- optional: false
35853
- }],
35854
36007
  "pipelineAnalytics.listOpsLog": [{
35855
36008
  name: "deviceId",
35856
36009
  form: "single",
@@ -35896,6 +36049,11 @@ Object.freeze({
35896
36049
  form: "single",
35897
36050
  optional: true
35898
36051
  }],
36052
+ "pipelineAnalytics.reclaimDebugMedia": [{
36053
+ name: "deviceIds",
36054
+ form: "array",
36055
+ optional: true
36056
+ }],
35899
36057
  "pipelineAnalytics.reconcileFromDisk": [{
35900
36058
  name: "deviceId",
35901
36059
  form: "single",
@@ -36261,6 +36419,11 @@ Object.freeze({
36261
36419
  form: "single",
36262
36420
  optional: false
36263
36421
  }],
36422
+ "recording.setDevicePlacement": [{
36423
+ name: "deviceId",
36424
+ form: "single",
36425
+ optional: false
36426
+ }],
36264
36427
  "recording.startStorageMigrationMove": [{
36265
36428
  name: "deviceId",
36266
36429
  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.57",
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",