@camstack/addon-import-alexa 0.2.48 → 0.2.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/addon.js +234 -73
  2. package/dist/addon.mjs +234 -73
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -8254,6 +8254,13 @@ var MediaRelocateModeSchema = _enum([
8254
8254
  ]);
8255
8255
  var RelocateMediaInputSchema = object({
8256
8256
  toLocationId: string(),
8257
+ /**
8258
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8259
+ * every row that is not already on `toLocationId` (the historical
8260
+ * behaviour). A named source is what a from→to migration needs: without it
8261
+ * "move events off disk 2" also emptied disk 1.
8262
+ */
8263
+ fromLocationId: string().optional(),
8257
8264
  throttleMbps: number().min(1).max(1e3).optional(),
8258
8265
  /** Omitted = `move`, the pre-existing behaviour. */
8259
8266
  mode: MediaRelocateModeSchema.optional()
@@ -8321,6 +8328,19 @@ var StorageMigrationDestinationsSchema = object({
8321
8328
  galleryMedia: string().min(1).optional()
8322
8329
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8323
8330
  /**
8331
+ * Optional named source per class. Omitted = the class's current default
8332
+ * (the historical behaviour). A named source that is NOT the default is a
8333
+ * drain of that disk: bytes move, the default stays, and the source is
8334
+ * disabled when the move finishes.
8335
+ */
8336
+ var StorageMigrationSourcesSchema = object({
8337
+ recordings: string().min(1).optional(),
8338
+ recordingsLow: string().min(1).optional(),
8339
+ eventMedia: string().min(1).optional(),
8340
+ backups: string().min(1).optional(),
8341
+ galleryMedia: string().min(1).optional()
8342
+ }).optional();
8343
+ /**
8324
8344
  * How a migration sequences the cutover against the byte move.
8325
8345
  *
8326
8346
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8342,6 +8362,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8342
8362
  /** Shared input for planning and starting an orchestrated storage migration. */
8343
8363
  var StorageMigrationInputSchema = object({
8344
8364
  destinations: StorageMigrationDestinationsSchema,
8365
+ /** Omitted = each class's current default. */
8366
+ sources: StorageMigrationSourcesSchema,
8345
8367
  throttleMbps: number().min(1).max(1e3).optional(),
8346
8368
  /** Omitted = `blocking`, which stays the default. */
8347
8369
  mode: StorageMigrationModeSchema.optional()
@@ -8421,6 +8443,13 @@ var StorageMigrationMoveSchema = object({
8421
8443
  storageClass: StorageMigrationClassSchema,
8422
8444
  fromLocationId: string(),
8423
8445
  toLocationId: string(),
8446
+ /**
8447
+ * True when `from` was NOT the class default at plan time. The move still
8448
+ * copies bytes, but the default is left alone and the source is disabled
8449
+ * once the copy verifies. Absent on jobs planned before this field existed
8450
+ * — those jobs always repointed, which is `false`.
8451
+ */
8452
+ freezeSource: boolean().optional(),
8424
8453
  moverJobId: string().nullable(),
8425
8454
  state: RelocateJobStateSchema.nullable(),
8426
8455
  error: string().nullable(),
@@ -8434,6 +8463,7 @@ var StorageMigrationJobSchema = object({
8434
8463
  * can tell a seconds-long cutover from a thirty-hour one. */
8435
8464
  mode: StorageMigrationModeSchema,
8436
8465
  destinations: StorageMigrationDestinationsSchema,
8466
+ sources: StorageMigrationSourcesSchema,
8437
8467
  throttleMbps: number(),
8438
8468
  moves: array(StorageMigrationMoveSchema),
8439
8469
  pauseLeaseId: string().nullable(),
@@ -8459,6 +8489,7 @@ var StorageMigrationFindingSchema = object({
8459
8489
  });
8460
8490
  var StorageMigrationPlanSchema = object({
8461
8491
  destinations: StorageMigrationDestinationsSchema,
8492
+ sources: StorageMigrationSourcesSchema,
8462
8493
  /** The mode this plan was built for. A plan is only valid for its mode: the
8463
8494
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8464
8495
  * it. */
@@ -8466,7 +8497,8 @@ var StorageMigrationPlanSchema = object({
8466
8497
  moves: array(object({
8467
8498
  storageClass: StorageMigrationClassSchema,
8468
8499
  fromLocationId: string(),
8469
- toLocationId: string()
8500
+ toLocationId: string(),
8501
+ freezeSource: boolean().optional()
8470
8502
  })),
8471
8503
  findings: array(StorageMigrationFindingSchema)
8472
8504
  });
@@ -8644,10 +8676,51 @@ var LedgerWalkReportSchema = object({
8644
8676
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8645
8677
  var RelocatableMediaCountInputSchema = object({
8646
8678
  toLocationId: string().min(1),
8679
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8680
+ fromLocationId: string().optional(),
8647
8681
  /** Omitted = `move`. */
8648
8682
  mode: MediaRelocateModeSchema.optional()
8649
8683
  });
8650
8684
  /**
8685
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8686
+ * ghost ledger entries on frozen footage locations.
8687
+ *
8688
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8689
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8690
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8691
+ * with no operator-visible status.
8692
+ */
8693
+ var StorageCleanupPhaseSchema = _enum([
8694
+ "orphans",
8695
+ "debug-media",
8696
+ "ghost-ledger",
8697
+ "done",
8698
+ "failed",
8699
+ "cancelled"
8700
+ ]);
8701
+ var StorageCleanupInputSchema = object({
8702
+ /** Also walk motion stills / track filmstrips. Off by default. */
8703
+ includeDebugMedia: boolean().optional() });
8704
+ var StorageCleanupJobSchema = object({
8705
+ jobId: string(),
8706
+ phase: StorageCleanupPhaseSchema,
8707
+ includeDebugMedia: boolean(),
8708
+ orphansReclaimed: number().int().nonnegative(),
8709
+ orphanBytesReclaimed: number().int().nonnegative(),
8710
+ debugMediaReclaimed: number().int().nonnegative(),
8711
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8712
+ ghostsForgotten: number().int().nonnegative(),
8713
+ ghostBytesForgotten: number().int().nonnegative(),
8714
+ /** Short operator-facing line: current collection, pass, or location. */
8715
+ detail: string().nullable(),
8716
+ cancelRequested: boolean(),
8717
+ startedAt: number(),
8718
+ updatedAt: number(),
8719
+ finishedAt: number().nullable(),
8720
+ error: string().nullable()
8721
+ });
8722
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8723
+ /**
8651
8724
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8652
8725
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8653
8726
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8675,11 +8748,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8675
8748
  * The default location for a type uses `id === <type>:default` by
8676
8749
  * convention (the bare type ref like `'backups'` resolves to it).
8677
8750
  *
8678
- * `isSystem: true` marks a location as orchestrator-seeded and
8679
- * undeletable. The bootstrap-installed defaults (one per type) carry
8680
- * this flag; operator-added locations don't. Editing the config of
8681
- * a system location is allowed (path migration, provider swap) but
8682
- * deleting it is rejected at the cap level.
8751
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8752
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8753
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8754
+ * / last-enabled, not on this bit.
8683
8755
  */
8684
8756
  var StorageLocationSchema = object({
8685
8757
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -13290,6 +13362,12 @@ method(object({
13290
13362
  }), _void(), {
13291
13363
  kind: "mutation",
13292
13364
  auth: "admin"
13365
+ }), method(object({
13366
+ from: string(),
13367
+ to: string()
13368
+ }), object({ moved: number() }), {
13369
+ kind: "mutation",
13370
+ auth: "admin"
13293
13371
  }), method(object({
13294
13372
  deviceId: number(),
13295
13373
  disabled: boolean()
@@ -19298,46 +19376,6 @@ var RecentTracksPageSchema = object({
19298
19376
  /** Cursor for the next page, or null when this page is the last. */
19299
19377
  nextCursor: string().nullable()
19300
19378
  });
19301
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
19302
- var LIST_GROUPS_MAX_LIMIT = 100;
19303
- var AnalyticsGroupRecordSchema = object({
19304
- id: string(),
19305
- deviceId: number().int(),
19306
- openedAt: number().int(),
19307
- closedAt: number().int(),
19308
- timestamp: number().int(),
19309
- memberCount: number().int(),
19310
- memberTrackIds: array(string()).readonly(),
19311
- className: string(),
19312
- classes: array(string()).readonly(),
19313
- /** Relative event-media path, or null when the group has no picture yet. */
19314
- mediaUrl: string().nullable(),
19315
- singleton: boolean()
19316
- });
19317
- var AnalyticsGroupMemberSchema = object({
19318
- trackId: string(),
19319
- deviceId: number().int(),
19320
- className: string(),
19321
- firstSeen: number().int(),
19322
- lastSeen: number().int(),
19323
- mediaUrl: string().nullable()
19324
- });
19325
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
19326
- var ListGroupsQueryInput = object({
19327
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
19328
- deviceIds: array(number()),
19329
- /** Window lower bound on `closedAt` (inclusive). */
19330
- since: number().optional(),
19331
- /** Window upper bound on `openedAt` (inclusive). */
19332
- until: number().optional(),
19333
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
19334
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
19335
- cursor: string().optional()
19336
- });
19337
- var ListGroupsPageSchema = object({
19338
- groups: array(AnalyticsGroupRecordSchema).readonly(),
19339
- nextCursor: string().nullable()
19340
- });
19341
19379
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19342
19380
  var KEY_EVENTS_MAX_LIMIT = 200;
19343
19381
  var KeyEventQueryInput = object({
@@ -19441,9 +19479,7 @@ var TrackCascadeCountsSchema = object({
19441
19479
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19442
19480
  plates: number().int(),
19443
19481
  /** Per-track CLIP search vectors removed (best-effort). */
19444
- embeddings: number().int(),
19445
- /** Group membership + group rows removed with their last member (best-effort). */
19446
- groups: number().int()
19482
+ embeddings: number().int()
19447
19483
  });
19448
19484
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19449
19485
  var DiskReconcileCountsSchema = object({
@@ -19613,6 +19649,47 @@ var RebuildStatusSchema = object({
19613
19649
  /** Present when the pass ended by throwing. */
19614
19650
  error: string().nullable()
19615
19651
  });
19652
+ /**
19653
+ * Acknowledgement that a debug-media reclaim STARTED.
19654
+ *
19655
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19656
+ * it runs detached and this returns immediately. Awaiting it is how the
19657
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19658
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19659
+ */
19660
+ var MediaReclaimStartResultSchema = object({
19661
+ started: boolean(),
19662
+ /** True when a pass was already running; the new request is ignored. */
19663
+ alreadyRunning: boolean()
19664
+ });
19665
+ var MediaReclaimInputSchema = object({
19666
+ mode: _enum(["report", "reclaim"]).default("report"),
19667
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19668
+ deviceIds: array(number().int()).min(1).optional(),
19669
+ restart: boolean().optional(),
19670
+ pageSize: number().int().min(50).max(5e3).optional(),
19671
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19672
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19673
+ maxBytesPerRun: number().int().min(1).optional(),
19674
+ budgetMinutes: number().int().min(1).max(720).optional(),
19675
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19676
+ graceMinutes: number().int().min(1).max(10080).optional()
19677
+ });
19678
+ var MediaReclaimStatusSchema = object({
19679
+ running: boolean(),
19680
+ mode: _enum(["report", "reclaim"]).nullable(),
19681
+ totalExamined: number(),
19682
+ totalEligible: number(),
19683
+ totalReclaimed: number(),
19684
+ totalBytesReclaimed: number(),
19685
+ totalRefused: number(),
19686
+ /** Device+scope windows finished in this pass. */
19687
+ devicesDone: number(),
19688
+ complete: boolean().nullable(),
19689
+ startedAtMs: number().nullable(),
19690
+ finishedAtMs: number().nullable(),
19691
+ error: string().nullable()
19692
+ });
19616
19693
  var ReplayFrameInputSchema = object({
19617
19694
  timestamp: number(),
19618
19695
  frame: PipelineRunResultBridge
@@ -19651,10 +19728,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19651
19728
  * stationary registry). Default false: the timeline lists passages,
19652
19729
  * not parking records (operator decision, 2026-08-15). */
19653
19730
  includeStationary: boolean().optional()
19654
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19655
- deviceId: number(),
19656
- groupId: string().min(1)
19657
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19731
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19658
19732
  kind: "mutation",
19659
19733
  auth: "admin"
19660
19734
  }), 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({
@@ -19754,6 +19828,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19754
19828
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19755
19829
  kind: "query",
19756
19830
  auth: "admin"
19831
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19832
+ kind: "mutation",
19833
+ auth: "admin"
19834
+ }), method(object({}), MediaReclaimStatusSchema, {
19835
+ kind: "query",
19836
+ auth: "admin"
19757
19837
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19758
19838
  kind: "query",
19759
19839
  auth: "admin"
@@ -21724,7 +21804,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21724
21804
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21725
21805
  kind: "mutation",
21726
21806
  auth: "admin"
21727
- });
21807
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21808
+ kind: "mutation",
21809
+ auth: "admin"
21810
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21811
+ kind: "mutation",
21812
+ auth: "admin"
21813
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21728
21814
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21729
21815
  providerId: string().min(1),
21730
21816
  displayName: string().min(1),
@@ -28834,6 +28920,33 @@ var RecordingRebalanceInputSchema = object({
28834
28920
  minMoveGb: number().min(0).optional()
28835
28921
  });
28836
28922
  /**
28923
+ * Operator-facing placement of one camera onto a recordings location.
28924
+ *
28925
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
28926
+ * Auto (the planner may move this camera). `locationId` is where high/mid
28927
+ * currently write — the plan, which may disagree with the pin when Auto.
28928
+ */
28929
+ var RecordingDevicePlacementSchema = object({
28930
+ deviceId: number().int(),
28931
+ profile: string(),
28932
+ locationId: string()
28933
+ });
28934
+ var RecordingDevicePinSchema = object({
28935
+ deviceId: number().int(),
28936
+ /** Recordings-class location this camera is pinned to. */
28937
+ locationId: string()
28938
+ });
28939
+ var RecordingPlacementViewSchema = object({
28940
+ assignments: array(RecordingDevicePlacementSchema),
28941
+ pins: array(RecordingDevicePinSchema),
28942
+ defaultLocations: record(string(), string())
28943
+ });
28944
+ var RecordingSetDevicePlacementInputSchema = object({
28945
+ deviceId: number().int(),
28946
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
28947
+ locationId: string().nullable()
28948
+ });
28949
+ /**
28837
28950
  * Result of locating footage at a wall-clock instant for one device/profile.
28838
28951
  * `segment` carries the covering segment's window; `gap` reports the forward
28839
28952
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -29059,6 +29172,12 @@ method(object({
29059
29172
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
29060
29173
  kind: "mutation",
29061
29174
  auth: "admin"
29175
+ }), method(object({}), RecordingPlacementViewSchema, {
29176
+ kind: "query",
29177
+ auth: "admin"
29178
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29179
+ kind: "mutation",
29180
+ auth: "admin"
29062
29181
  });
29063
29182
  /**
29064
29183
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -34128,6 +34247,12 @@ Object.freeze({
34128
34247
  addonId: null,
34129
34248
  access: "delete"
34130
34249
  },
34250
+ "deviceManager.renameLocation": {
34251
+ capName: "device-manager",
34252
+ capScope: "system",
34253
+ addonId: null,
34254
+ access: "create"
34255
+ },
34131
34256
  "deviceManager.runDeviceAction": {
34132
34257
  capName: "device-manager",
34133
34258
  capScope: "system",
@@ -35820,19 +35945,19 @@ Object.freeze({
35820
35945
  addonId: null,
35821
35946
  access: "view"
35822
35947
  },
35823
- "pipelineAnalytics.getGroup": {
35948
+ "pipelineAnalytics.getKeyEvents": {
35824
35949
  capName: "pipeline-analytics",
35825
35950
  capScope: "device",
35826
35951
  addonId: null,
35827
35952
  access: "view"
35828
35953
  },
35829
- "pipelineAnalytics.getKeyEvents": {
35954
+ "pipelineAnalytics.getKeyEventsBatch": {
35830
35955
  capName: "pipeline-analytics",
35831
35956
  capScope: "device",
35832
35957
  addonId: null,
35833
35958
  access: "view"
35834
35959
  },
35835
- "pipelineAnalytics.getKeyEventsBatch": {
35960
+ "pipelineAnalytics.getMediaReclaimStatus": {
35836
35961
  capName: "pipeline-analytics",
35837
35962
  capScope: "device",
35838
35963
  addonId: null,
@@ -35922,12 +36047,6 @@ Object.freeze({
35922
36047
  addonId: null,
35923
36048
  access: "view"
35924
36049
  },
35925
- "pipelineAnalytics.listGroups": {
35926
- capName: "pipeline-analytics",
35927
- capScope: "device",
35928
- addonId: null,
35929
- access: "view"
35930
- },
35931
36050
  "pipelineAnalytics.listOpsLog": {
35932
36051
  capName: "pipeline-analytics",
35933
36052
  capScope: "device",
@@ -36012,6 +36131,12 @@ Object.freeze({
36012
36131
  addonId: null,
36013
36132
  access: "create"
36014
36133
  },
36134
+ "pipelineAnalytics.reclaimDebugMedia": {
36135
+ capName: "pipeline-analytics",
36136
+ capScope: "device",
36137
+ addonId: null,
36138
+ access: "create"
36139
+ },
36015
36140
  "pipelineAnalytics.reconcileFromDisk": {
36016
36141
  capName: "pipeline-analytics",
36017
36142
  capScope: "device",
@@ -36936,6 +37061,12 @@ Object.freeze({
36936
37061
  addonId: null,
36937
37062
  access: "view"
36938
37063
  },
37064
+ "recording.getPlacement": {
37065
+ capName: "recording",
37066
+ capScope: "system",
37067
+ addonId: null,
37068
+ access: "view"
37069
+ },
36939
37070
  "recording.getPlaybackManifest": {
36940
37071
  capName: "recording",
36941
37072
  capScope: "system",
@@ -37062,6 +37193,12 @@ Object.freeze({
37062
37193
  addonId: null,
37063
37194
  access: "create"
37064
37195
  },
37196
+ "recording.setDevicePlacement": {
37197
+ capName: "recording",
37198
+ capScope: "system",
37199
+ addonId: null,
37200
+ access: "create"
37201
+ },
37065
37202
  "recording.startStorageMigrationMove": {
37066
37203
  capName: "recording",
37067
37204
  capScope: "system",
@@ -37506,12 +37643,36 @@ Object.freeze({
37506
37643
  addonId: null,
37507
37644
  access: "create"
37508
37645
  },
37646
+ "storageMigration.cleanupCancel": {
37647
+ capName: "storage-migration",
37648
+ capScope: "system",
37649
+ addonId: null,
37650
+ access: "create"
37651
+ },
37652
+ "storageMigration.cleanupStart": {
37653
+ capName: "storage-migration",
37654
+ capScope: "system",
37655
+ addonId: null,
37656
+ access: "create"
37657
+ },
37658
+ "storageMigration.cleanupStatus": {
37659
+ capName: "storage-migration",
37660
+ capScope: "system",
37661
+ addonId: null,
37662
+ access: "view"
37663
+ },
37509
37664
  "storageMigration.drain": {
37510
37665
  capName: "storage-migration",
37511
37666
  capScope: "system",
37512
37667
  addonId: null,
37513
37668
  access: "create"
37514
37669
  },
37670
+ "storageMigration.history": {
37671
+ capName: "storage-migration",
37672
+ capScope: "system",
37673
+ addonId: null,
37674
+ access: "view"
37675
+ },
37515
37676
  "storageMigration.movers": {
37516
37677
  capName: "storage-migration",
37517
37678
  capScope: "system",
@@ -39508,11 +39669,6 @@ Object.freeze({
39508
39669
  form: "single",
39509
39670
  optional: true
39510
39671
  }],
39511
- "pipelineAnalytics.getGroup": [{
39512
- name: "deviceId",
39513
- form: "single",
39514
- optional: false
39515
- }],
39516
39672
  "pipelineAnalytics.getKeyEvents": [{
39517
39673
  name: "deviceId",
39518
39674
  form: "single",
@@ -39578,11 +39734,6 @@ Object.freeze({
39578
39734
  form: "single",
39579
39735
  optional: false
39580
39736
  }],
39581
- "pipelineAnalytics.listGroups": [{
39582
- name: "deviceIds",
39583
- form: "array",
39584
- optional: false
39585
- }],
39586
39737
  "pipelineAnalytics.listOpsLog": [{
39587
39738
  name: "deviceId",
39588
39739
  form: "single",
@@ -39628,6 +39779,11 @@ Object.freeze({
39628
39779
  form: "single",
39629
39780
  optional: true
39630
39781
  }],
39782
+ "pipelineAnalytics.reclaimDebugMedia": [{
39783
+ name: "deviceIds",
39784
+ form: "array",
39785
+ optional: true
39786
+ }],
39631
39787
  "pipelineAnalytics.reconcileFromDisk": [{
39632
39788
  name: "deviceId",
39633
39789
  form: "single",
@@ -39993,6 +40149,11 @@ Object.freeze({
39993
40149
  form: "single",
39994
40150
  optional: false
39995
40151
  }],
40152
+ "recording.setDevicePlacement": [{
40153
+ name: "deviceId",
40154
+ form: "single",
40155
+ optional: false
40156
+ }],
39996
40157
  "recording.startStorageMigrationMove": [{
39997
40158
  name: "deviceId",
39998
40159
  form: "single",
package/dist/addon.mjs CHANGED
@@ -8254,6 +8254,13 @@ var MediaRelocateModeSchema = _enum([
8254
8254
  ]);
8255
8255
  var RelocateMediaInputSchema = object({
8256
8256
  toLocationId: string(),
8257
+ /**
8258
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8259
+ * every row that is not already on `toLocationId` (the historical
8260
+ * behaviour). A named source is what a from→to migration needs: without it
8261
+ * "move events off disk 2" also emptied disk 1.
8262
+ */
8263
+ fromLocationId: string().optional(),
8257
8264
  throttleMbps: number().min(1).max(1e3).optional(),
8258
8265
  /** Omitted = `move`, the pre-existing behaviour. */
8259
8266
  mode: MediaRelocateModeSchema.optional()
@@ -8321,6 +8328,19 @@ var StorageMigrationDestinationsSchema = object({
8321
8328
  galleryMedia: string().min(1).optional()
8322
8329
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8323
8330
  /**
8331
+ * Optional named source per class. Omitted = the class's current default
8332
+ * (the historical behaviour). A named source that is NOT the default is a
8333
+ * drain of that disk: bytes move, the default stays, and the source is
8334
+ * disabled when the move finishes.
8335
+ */
8336
+ var StorageMigrationSourcesSchema = object({
8337
+ recordings: string().min(1).optional(),
8338
+ recordingsLow: string().min(1).optional(),
8339
+ eventMedia: string().min(1).optional(),
8340
+ backups: string().min(1).optional(),
8341
+ galleryMedia: string().min(1).optional()
8342
+ }).optional();
8343
+ /**
8324
8344
  * How a migration sequences the cutover against the byte move.
8325
8345
  *
8326
8346
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8342,6 +8362,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8342
8362
  /** Shared input for planning and starting an orchestrated storage migration. */
8343
8363
  var StorageMigrationInputSchema = object({
8344
8364
  destinations: StorageMigrationDestinationsSchema,
8365
+ /** Omitted = each class's current default. */
8366
+ sources: StorageMigrationSourcesSchema,
8345
8367
  throttleMbps: number().min(1).max(1e3).optional(),
8346
8368
  /** Omitted = `blocking`, which stays the default. */
8347
8369
  mode: StorageMigrationModeSchema.optional()
@@ -8421,6 +8443,13 @@ var StorageMigrationMoveSchema = object({
8421
8443
  storageClass: StorageMigrationClassSchema,
8422
8444
  fromLocationId: string(),
8423
8445
  toLocationId: string(),
8446
+ /**
8447
+ * True when `from` was NOT the class default at plan time. The move still
8448
+ * copies bytes, but the default is left alone and the source is disabled
8449
+ * once the copy verifies. Absent on jobs planned before this field existed
8450
+ * — those jobs always repointed, which is `false`.
8451
+ */
8452
+ freezeSource: boolean().optional(),
8424
8453
  moverJobId: string().nullable(),
8425
8454
  state: RelocateJobStateSchema.nullable(),
8426
8455
  error: string().nullable(),
@@ -8434,6 +8463,7 @@ var StorageMigrationJobSchema = object({
8434
8463
  * can tell a seconds-long cutover from a thirty-hour one. */
8435
8464
  mode: StorageMigrationModeSchema,
8436
8465
  destinations: StorageMigrationDestinationsSchema,
8466
+ sources: StorageMigrationSourcesSchema,
8437
8467
  throttleMbps: number(),
8438
8468
  moves: array(StorageMigrationMoveSchema),
8439
8469
  pauseLeaseId: string().nullable(),
@@ -8459,6 +8489,7 @@ var StorageMigrationFindingSchema = object({
8459
8489
  });
8460
8490
  var StorageMigrationPlanSchema = object({
8461
8491
  destinations: StorageMigrationDestinationsSchema,
8492
+ sources: StorageMigrationSourcesSchema,
8462
8493
  /** The mode this plan was built for. A plan is only valid for its mode: the
8463
8494
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8464
8495
  * it. */
@@ -8466,7 +8497,8 @@ var StorageMigrationPlanSchema = object({
8466
8497
  moves: array(object({
8467
8498
  storageClass: StorageMigrationClassSchema,
8468
8499
  fromLocationId: string(),
8469
- toLocationId: string()
8500
+ toLocationId: string(),
8501
+ freezeSource: boolean().optional()
8470
8502
  })),
8471
8503
  findings: array(StorageMigrationFindingSchema)
8472
8504
  });
@@ -8644,10 +8676,51 @@ var LedgerWalkReportSchema = object({
8644
8676
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8645
8677
  var RelocatableMediaCountInputSchema = object({
8646
8678
  toLocationId: string().min(1),
8679
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8680
+ fromLocationId: string().optional(),
8647
8681
  /** Omitted = `move`. */
8648
8682
  mode: MediaRelocateModeSchema.optional()
8649
8683
  });
8650
8684
  /**
8685
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8686
+ * ghost ledger entries on frozen footage locations.
8687
+ *
8688
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8689
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8690
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8691
+ * with no operator-visible status.
8692
+ */
8693
+ var StorageCleanupPhaseSchema = _enum([
8694
+ "orphans",
8695
+ "debug-media",
8696
+ "ghost-ledger",
8697
+ "done",
8698
+ "failed",
8699
+ "cancelled"
8700
+ ]);
8701
+ var StorageCleanupInputSchema = object({
8702
+ /** Also walk motion stills / track filmstrips. Off by default. */
8703
+ includeDebugMedia: boolean().optional() });
8704
+ var StorageCleanupJobSchema = object({
8705
+ jobId: string(),
8706
+ phase: StorageCleanupPhaseSchema,
8707
+ includeDebugMedia: boolean(),
8708
+ orphansReclaimed: number().int().nonnegative(),
8709
+ orphanBytesReclaimed: number().int().nonnegative(),
8710
+ debugMediaReclaimed: number().int().nonnegative(),
8711
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8712
+ ghostsForgotten: number().int().nonnegative(),
8713
+ ghostBytesForgotten: number().int().nonnegative(),
8714
+ /** Short operator-facing line: current collection, pass, or location. */
8715
+ detail: string().nullable(),
8716
+ cancelRequested: boolean(),
8717
+ startedAt: number(),
8718
+ updatedAt: number(),
8719
+ finishedAt: number().nullable(),
8720
+ error: string().nullable()
8721
+ });
8722
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8723
+ /**
8651
8724
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8652
8725
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8653
8726
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8675,11 +8748,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8675
8748
  * The default location for a type uses `id === <type>:default` by
8676
8749
  * convention (the bare type ref like `'backups'` resolves to it).
8677
8750
  *
8678
- * `isSystem: true` marks a location as orchestrator-seeded and
8679
- * undeletable. The bootstrap-installed defaults (one per type) carry
8680
- * this flag; operator-added locations don't. Editing the config of
8681
- * a system location is allowed (path migration, provider swap) but
8682
- * deleting it is rejected at the cap level.
8751
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8752
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8753
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8754
+ * / last-enabled, not on this bit.
8683
8755
  */
8684
8756
  var StorageLocationSchema = object({
8685
8757
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -13290,6 +13362,12 @@ method(object({
13290
13362
  }), _void(), {
13291
13363
  kind: "mutation",
13292
13364
  auth: "admin"
13365
+ }), method(object({
13366
+ from: string(),
13367
+ to: string()
13368
+ }), object({ moved: number() }), {
13369
+ kind: "mutation",
13370
+ auth: "admin"
13293
13371
  }), method(object({
13294
13372
  deviceId: number(),
13295
13373
  disabled: boolean()
@@ -19298,46 +19376,6 @@ var RecentTracksPageSchema = object({
19298
19376
  /** Cursor for the next page, or null when this page is the last. */
19299
19377
  nextCursor: string().nullable()
19300
19378
  });
19301
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
19302
- var LIST_GROUPS_MAX_LIMIT = 100;
19303
- var AnalyticsGroupRecordSchema = object({
19304
- id: string(),
19305
- deviceId: number().int(),
19306
- openedAt: number().int(),
19307
- closedAt: number().int(),
19308
- timestamp: number().int(),
19309
- memberCount: number().int(),
19310
- memberTrackIds: array(string()).readonly(),
19311
- className: string(),
19312
- classes: array(string()).readonly(),
19313
- /** Relative event-media path, or null when the group has no picture yet. */
19314
- mediaUrl: string().nullable(),
19315
- singleton: boolean()
19316
- });
19317
- var AnalyticsGroupMemberSchema = object({
19318
- trackId: string(),
19319
- deviceId: number().int(),
19320
- className: string(),
19321
- firstSeen: number().int(),
19322
- lastSeen: number().int(),
19323
- mediaUrl: string().nullable()
19324
- });
19325
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
19326
- var ListGroupsQueryInput = object({
19327
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
19328
- deviceIds: array(number()),
19329
- /** Window lower bound on `closedAt` (inclusive). */
19330
- since: number().optional(),
19331
- /** Window upper bound on `openedAt` (inclusive). */
19332
- until: number().optional(),
19333
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
19334
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
19335
- cursor: string().optional()
19336
- });
19337
- var ListGroupsPageSchema = object({
19338
- groups: array(AnalyticsGroupRecordSchema).readonly(),
19339
- nextCursor: string().nullable()
19340
- });
19341
19379
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19342
19380
  var KEY_EVENTS_MAX_LIMIT = 200;
19343
19381
  var KeyEventQueryInput = object({
@@ -19441,9 +19479,7 @@ var TrackCascadeCountsSchema = object({
19441
19479
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19442
19480
  plates: number().int(),
19443
19481
  /** Per-track CLIP search vectors removed (best-effort). */
19444
- embeddings: number().int(),
19445
- /** Group membership + group rows removed with their last member (best-effort). */
19446
- groups: number().int()
19482
+ embeddings: number().int()
19447
19483
  });
19448
19484
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19449
19485
  var DiskReconcileCountsSchema = object({
@@ -19613,6 +19649,47 @@ var RebuildStatusSchema = object({
19613
19649
  /** Present when the pass ended by throwing. */
19614
19650
  error: string().nullable()
19615
19651
  });
19652
+ /**
19653
+ * Acknowledgement that a debug-media reclaim STARTED.
19654
+ *
19655
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19656
+ * it runs detached and this returns immediately. Awaiting it is how the
19657
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19658
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19659
+ */
19660
+ var MediaReclaimStartResultSchema = object({
19661
+ started: boolean(),
19662
+ /** True when a pass was already running; the new request is ignored. */
19663
+ alreadyRunning: boolean()
19664
+ });
19665
+ var MediaReclaimInputSchema = object({
19666
+ mode: _enum(["report", "reclaim"]).default("report"),
19667
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19668
+ deviceIds: array(number().int()).min(1).optional(),
19669
+ restart: boolean().optional(),
19670
+ pageSize: number().int().min(50).max(5e3).optional(),
19671
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19672
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19673
+ maxBytesPerRun: number().int().min(1).optional(),
19674
+ budgetMinutes: number().int().min(1).max(720).optional(),
19675
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19676
+ graceMinutes: number().int().min(1).max(10080).optional()
19677
+ });
19678
+ var MediaReclaimStatusSchema = object({
19679
+ running: boolean(),
19680
+ mode: _enum(["report", "reclaim"]).nullable(),
19681
+ totalExamined: number(),
19682
+ totalEligible: number(),
19683
+ totalReclaimed: number(),
19684
+ totalBytesReclaimed: number(),
19685
+ totalRefused: number(),
19686
+ /** Device+scope windows finished in this pass. */
19687
+ devicesDone: number(),
19688
+ complete: boolean().nullable(),
19689
+ startedAtMs: number().nullable(),
19690
+ finishedAtMs: number().nullable(),
19691
+ error: string().nullable()
19692
+ });
19616
19693
  var ReplayFrameInputSchema = object({
19617
19694
  timestamp: number(),
19618
19695
  frame: PipelineRunResultBridge
@@ -19651,10 +19728,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19651
19728
  * stationary registry). Default false: the timeline lists passages,
19652
19729
  * not parking records (operator decision, 2026-08-15). */
19653
19730
  includeStationary: boolean().optional()
19654
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19655
- deviceId: number(),
19656
- groupId: string().min(1)
19657
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19731
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19658
19732
  kind: "mutation",
19659
19733
  auth: "admin"
19660
19734
  }), 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({
@@ -19754,6 +19828,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19754
19828
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19755
19829
  kind: "query",
19756
19830
  auth: "admin"
19831
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19832
+ kind: "mutation",
19833
+ auth: "admin"
19834
+ }), method(object({}), MediaReclaimStatusSchema, {
19835
+ kind: "query",
19836
+ auth: "admin"
19757
19837
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19758
19838
  kind: "query",
19759
19839
  auth: "admin"
@@ -21724,7 +21804,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21724
21804
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21725
21805
  kind: "mutation",
21726
21806
  auth: "admin"
21727
- });
21807
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21808
+ kind: "mutation",
21809
+ auth: "admin"
21810
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21811
+ kind: "mutation",
21812
+ auth: "admin"
21813
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21728
21814
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21729
21815
  providerId: string().min(1),
21730
21816
  displayName: string().min(1),
@@ -28834,6 +28920,33 @@ var RecordingRebalanceInputSchema = object({
28834
28920
  minMoveGb: number().min(0).optional()
28835
28921
  });
28836
28922
  /**
28923
+ * Operator-facing placement of one camera onto a recordings location.
28924
+ *
28925
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
28926
+ * Auto (the planner may move this camera). `locationId` is where high/mid
28927
+ * currently write — the plan, which may disagree with the pin when Auto.
28928
+ */
28929
+ var RecordingDevicePlacementSchema = object({
28930
+ deviceId: number().int(),
28931
+ profile: string(),
28932
+ locationId: string()
28933
+ });
28934
+ var RecordingDevicePinSchema = object({
28935
+ deviceId: number().int(),
28936
+ /** Recordings-class location this camera is pinned to. */
28937
+ locationId: string()
28938
+ });
28939
+ var RecordingPlacementViewSchema = object({
28940
+ assignments: array(RecordingDevicePlacementSchema),
28941
+ pins: array(RecordingDevicePinSchema),
28942
+ defaultLocations: record(string(), string())
28943
+ });
28944
+ var RecordingSetDevicePlacementInputSchema = object({
28945
+ deviceId: number().int(),
28946
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
28947
+ locationId: string().nullable()
28948
+ });
28949
+ /**
28837
28950
  * Result of locating footage at a wall-clock instant for one device/profile.
28838
28951
  * `segment` carries the covering segment's window; `gap` reports the forward
28839
28952
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -29059,6 +29172,12 @@ method(object({
29059
29172
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
29060
29173
  kind: "mutation",
29061
29174
  auth: "admin"
29175
+ }), method(object({}), RecordingPlacementViewSchema, {
29176
+ kind: "query",
29177
+ auth: "admin"
29178
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29179
+ kind: "mutation",
29180
+ auth: "admin"
29062
29181
  });
29063
29182
  /**
29064
29183
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -34128,6 +34247,12 @@ Object.freeze({
34128
34247
  addonId: null,
34129
34248
  access: "delete"
34130
34249
  },
34250
+ "deviceManager.renameLocation": {
34251
+ capName: "device-manager",
34252
+ capScope: "system",
34253
+ addonId: null,
34254
+ access: "create"
34255
+ },
34131
34256
  "deviceManager.runDeviceAction": {
34132
34257
  capName: "device-manager",
34133
34258
  capScope: "system",
@@ -35820,19 +35945,19 @@ Object.freeze({
35820
35945
  addonId: null,
35821
35946
  access: "view"
35822
35947
  },
35823
- "pipelineAnalytics.getGroup": {
35948
+ "pipelineAnalytics.getKeyEvents": {
35824
35949
  capName: "pipeline-analytics",
35825
35950
  capScope: "device",
35826
35951
  addonId: null,
35827
35952
  access: "view"
35828
35953
  },
35829
- "pipelineAnalytics.getKeyEvents": {
35954
+ "pipelineAnalytics.getKeyEventsBatch": {
35830
35955
  capName: "pipeline-analytics",
35831
35956
  capScope: "device",
35832
35957
  addonId: null,
35833
35958
  access: "view"
35834
35959
  },
35835
- "pipelineAnalytics.getKeyEventsBatch": {
35960
+ "pipelineAnalytics.getMediaReclaimStatus": {
35836
35961
  capName: "pipeline-analytics",
35837
35962
  capScope: "device",
35838
35963
  addonId: null,
@@ -35922,12 +36047,6 @@ Object.freeze({
35922
36047
  addonId: null,
35923
36048
  access: "view"
35924
36049
  },
35925
- "pipelineAnalytics.listGroups": {
35926
- capName: "pipeline-analytics",
35927
- capScope: "device",
35928
- addonId: null,
35929
- access: "view"
35930
- },
35931
36050
  "pipelineAnalytics.listOpsLog": {
35932
36051
  capName: "pipeline-analytics",
35933
36052
  capScope: "device",
@@ -36012,6 +36131,12 @@ Object.freeze({
36012
36131
  addonId: null,
36013
36132
  access: "create"
36014
36133
  },
36134
+ "pipelineAnalytics.reclaimDebugMedia": {
36135
+ capName: "pipeline-analytics",
36136
+ capScope: "device",
36137
+ addonId: null,
36138
+ access: "create"
36139
+ },
36015
36140
  "pipelineAnalytics.reconcileFromDisk": {
36016
36141
  capName: "pipeline-analytics",
36017
36142
  capScope: "device",
@@ -36936,6 +37061,12 @@ Object.freeze({
36936
37061
  addonId: null,
36937
37062
  access: "view"
36938
37063
  },
37064
+ "recording.getPlacement": {
37065
+ capName: "recording",
37066
+ capScope: "system",
37067
+ addonId: null,
37068
+ access: "view"
37069
+ },
36939
37070
  "recording.getPlaybackManifest": {
36940
37071
  capName: "recording",
36941
37072
  capScope: "system",
@@ -37062,6 +37193,12 @@ Object.freeze({
37062
37193
  addonId: null,
37063
37194
  access: "create"
37064
37195
  },
37196
+ "recording.setDevicePlacement": {
37197
+ capName: "recording",
37198
+ capScope: "system",
37199
+ addonId: null,
37200
+ access: "create"
37201
+ },
37065
37202
  "recording.startStorageMigrationMove": {
37066
37203
  capName: "recording",
37067
37204
  capScope: "system",
@@ -37506,12 +37643,36 @@ Object.freeze({
37506
37643
  addonId: null,
37507
37644
  access: "create"
37508
37645
  },
37646
+ "storageMigration.cleanupCancel": {
37647
+ capName: "storage-migration",
37648
+ capScope: "system",
37649
+ addonId: null,
37650
+ access: "create"
37651
+ },
37652
+ "storageMigration.cleanupStart": {
37653
+ capName: "storage-migration",
37654
+ capScope: "system",
37655
+ addonId: null,
37656
+ access: "create"
37657
+ },
37658
+ "storageMigration.cleanupStatus": {
37659
+ capName: "storage-migration",
37660
+ capScope: "system",
37661
+ addonId: null,
37662
+ access: "view"
37663
+ },
37509
37664
  "storageMigration.drain": {
37510
37665
  capName: "storage-migration",
37511
37666
  capScope: "system",
37512
37667
  addonId: null,
37513
37668
  access: "create"
37514
37669
  },
37670
+ "storageMigration.history": {
37671
+ capName: "storage-migration",
37672
+ capScope: "system",
37673
+ addonId: null,
37674
+ access: "view"
37675
+ },
37515
37676
  "storageMigration.movers": {
37516
37677
  capName: "storage-migration",
37517
37678
  capScope: "system",
@@ -39508,11 +39669,6 @@ Object.freeze({
39508
39669
  form: "single",
39509
39670
  optional: true
39510
39671
  }],
39511
- "pipelineAnalytics.getGroup": [{
39512
- name: "deviceId",
39513
- form: "single",
39514
- optional: false
39515
- }],
39516
39672
  "pipelineAnalytics.getKeyEvents": [{
39517
39673
  name: "deviceId",
39518
39674
  form: "single",
@@ -39578,11 +39734,6 @@ Object.freeze({
39578
39734
  form: "single",
39579
39735
  optional: false
39580
39736
  }],
39581
- "pipelineAnalytics.listGroups": [{
39582
- name: "deviceIds",
39583
- form: "array",
39584
- optional: false
39585
- }],
39586
39737
  "pipelineAnalytics.listOpsLog": [{
39587
39738
  name: "deviceId",
39588
39739
  form: "single",
@@ -39628,6 +39779,11 @@ Object.freeze({
39628
39779
  form: "single",
39629
39780
  optional: true
39630
39781
  }],
39782
+ "pipelineAnalytics.reclaimDebugMedia": [{
39783
+ name: "deviceIds",
39784
+ form: "array",
39785
+ optional: true
39786
+ }],
39631
39787
  "pipelineAnalytics.reconcileFromDisk": [{
39632
39788
  name: "deviceId",
39633
39789
  form: "single",
@@ -39993,6 +40149,11 @@ Object.freeze({
39993
40149
  form: "single",
39994
40150
  optional: false
39995
40151
  }],
40152
+ "recording.setDevicePlacement": [{
40153
+ name: "deviceId",
40154
+ form: "single",
40155
+ optional: false
40156
+ }],
39996
40157
  "recording.startStorageMigrationMove": [{
39997
40158
  name: "deviceId",
39998
40159
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-import-alexa",
3
- "version": "0.2.48",
3
+ "version": "0.2.49",
4
4
  "description": "Alexa device-import provider for CamStack — imports the smart-home devices in a user's Alexa account via the unofficial alexa-remote2 cookie/token client (the inverse of the Alexa exporter)",
5
5
  "keywords": [
6
6
  "camstack",