@camstack/addon-import-alexa 0.2.48 → 0.2.50

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 +236 -73
  2. package/dist/addon.mjs +236 -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()
@@ -16040,6 +16118,8 @@ var NcSystemEventKindSchema = _enum([
16040
16118
  "device-offline",
16041
16119
  "device-disabled",
16042
16120
  "device-enabled",
16121
+ "device-battery-low",
16122
+ "device-battery-normal",
16043
16123
  "stream-online",
16044
16124
  "stream-offline",
16045
16125
  "node-online",
@@ -19298,46 +19378,6 @@ var RecentTracksPageSchema = object({
19298
19378
  /** Cursor for the next page, or null when this page is the last. */
19299
19379
  nextCursor: string().nullable()
19300
19380
  });
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
19381
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19342
19382
  var KEY_EVENTS_MAX_LIMIT = 200;
19343
19383
  var KeyEventQueryInput = object({
@@ -19441,9 +19481,7 @@ var TrackCascadeCountsSchema = object({
19441
19481
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19442
19482
  plates: number().int(),
19443
19483
  /** 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()
19484
+ embeddings: number().int()
19447
19485
  });
19448
19486
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19449
19487
  var DiskReconcileCountsSchema = object({
@@ -19613,6 +19651,47 @@ var RebuildStatusSchema = object({
19613
19651
  /** Present when the pass ended by throwing. */
19614
19652
  error: string().nullable()
19615
19653
  });
19654
+ /**
19655
+ * Acknowledgement that a debug-media reclaim STARTED.
19656
+ *
19657
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19658
+ * it runs detached and this returns immediately. Awaiting it is how the
19659
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19660
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19661
+ */
19662
+ var MediaReclaimStartResultSchema = object({
19663
+ started: boolean(),
19664
+ /** True when a pass was already running; the new request is ignored. */
19665
+ alreadyRunning: boolean()
19666
+ });
19667
+ var MediaReclaimInputSchema = object({
19668
+ mode: _enum(["report", "reclaim"]).default("report"),
19669
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19670
+ deviceIds: array(number().int()).min(1).optional(),
19671
+ restart: boolean().optional(),
19672
+ pageSize: number().int().min(50).max(5e3).optional(),
19673
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19674
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19675
+ maxBytesPerRun: number().int().min(1).optional(),
19676
+ budgetMinutes: number().int().min(1).max(720).optional(),
19677
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19678
+ graceMinutes: number().int().min(1).max(10080).optional()
19679
+ });
19680
+ var MediaReclaimStatusSchema = object({
19681
+ running: boolean(),
19682
+ mode: _enum(["report", "reclaim"]).nullable(),
19683
+ totalExamined: number(),
19684
+ totalEligible: number(),
19685
+ totalReclaimed: number(),
19686
+ totalBytesReclaimed: number(),
19687
+ totalRefused: number(),
19688
+ /** Device+scope windows finished in this pass. */
19689
+ devicesDone: number(),
19690
+ complete: boolean().nullable(),
19691
+ startedAtMs: number().nullable(),
19692
+ finishedAtMs: number().nullable(),
19693
+ error: string().nullable()
19694
+ });
19616
19695
  var ReplayFrameInputSchema = object({
19617
19696
  timestamp: number(),
19618
19697
  frame: PipelineRunResultBridge
@@ -19651,10 +19730,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19651
19730
  * stationary registry). Default false: the timeline lists passages,
19652
19731
  * not parking records (operator decision, 2026-08-15). */
19653
19732
  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(), {
19733
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19658
19734
  kind: "mutation",
19659
19735
  auth: "admin"
19660
19736
  }), 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 +19830,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19754
19830
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19755
19831
  kind: "query",
19756
19832
  auth: "admin"
19833
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19834
+ kind: "mutation",
19835
+ auth: "admin"
19836
+ }), method(object({}), MediaReclaimStatusSchema, {
19837
+ kind: "query",
19838
+ auth: "admin"
19757
19839
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19758
19840
  kind: "query",
19759
19841
  auth: "admin"
@@ -21724,7 +21806,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21724
21806
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21725
21807
  kind: "mutation",
21726
21808
  auth: "admin"
21727
- });
21809
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21810
+ kind: "mutation",
21811
+ auth: "admin"
21812
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21813
+ kind: "mutation",
21814
+ auth: "admin"
21815
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21728
21816
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21729
21817
  providerId: string().min(1),
21730
21818
  displayName: string().min(1),
@@ -28834,6 +28922,33 @@ var RecordingRebalanceInputSchema = object({
28834
28922
  minMoveGb: number().min(0).optional()
28835
28923
  });
28836
28924
  /**
28925
+ * Operator-facing placement of one camera onto a recordings location.
28926
+ *
28927
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
28928
+ * Auto (the planner may move this camera). `locationId` is where high/mid
28929
+ * currently write — the plan, which may disagree with the pin when Auto.
28930
+ */
28931
+ var RecordingDevicePlacementSchema = object({
28932
+ deviceId: number().int(),
28933
+ profile: string(),
28934
+ locationId: string()
28935
+ });
28936
+ var RecordingDevicePinSchema = object({
28937
+ deviceId: number().int(),
28938
+ /** Recordings-class location this camera is pinned to. */
28939
+ locationId: string()
28940
+ });
28941
+ var RecordingPlacementViewSchema = object({
28942
+ assignments: array(RecordingDevicePlacementSchema),
28943
+ pins: array(RecordingDevicePinSchema),
28944
+ defaultLocations: record(string(), string())
28945
+ });
28946
+ var RecordingSetDevicePlacementInputSchema = object({
28947
+ deviceId: number().int(),
28948
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
28949
+ locationId: string().nullable()
28950
+ });
28951
+ /**
28837
28952
  * Result of locating footage at a wall-clock instant for one device/profile.
28838
28953
  * `segment` carries the covering segment's window; `gap` reports the forward
28839
28954
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -29059,6 +29174,12 @@ method(object({
29059
29174
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
29060
29175
  kind: "mutation",
29061
29176
  auth: "admin"
29177
+ }), method(object({}), RecordingPlacementViewSchema, {
29178
+ kind: "query",
29179
+ auth: "admin"
29180
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29181
+ kind: "mutation",
29182
+ auth: "admin"
29062
29183
  });
29063
29184
  /**
29064
29185
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -34128,6 +34249,12 @@ Object.freeze({
34128
34249
  addonId: null,
34129
34250
  access: "delete"
34130
34251
  },
34252
+ "deviceManager.renameLocation": {
34253
+ capName: "device-manager",
34254
+ capScope: "system",
34255
+ addonId: null,
34256
+ access: "create"
34257
+ },
34131
34258
  "deviceManager.runDeviceAction": {
34132
34259
  capName: "device-manager",
34133
34260
  capScope: "system",
@@ -35820,19 +35947,19 @@ Object.freeze({
35820
35947
  addonId: null,
35821
35948
  access: "view"
35822
35949
  },
35823
- "pipelineAnalytics.getGroup": {
35950
+ "pipelineAnalytics.getKeyEvents": {
35824
35951
  capName: "pipeline-analytics",
35825
35952
  capScope: "device",
35826
35953
  addonId: null,
35827
35954
  access: "view"
35828
35955
  },
35829
- "pipelineAnalytics.getKeyEvents": {
35956
+ "pipelineAnalytics.getKeyEventsBatch": {
35830
35957
  capName: "pipeline-analytics",
35831
35958
  capScope: "device",
35832
35959
  addonId: null,
35833
35960
  access: "view"
35834
35961
  },
35835
- "pipelineAnalytics.getKeyEventsBatch": {
35962
+ "pipelineAnalytics.getMediaReclaimStatus": {
35836
35963
  capName: "pipeline-analytics",
35837
35964
  capScope: "device",
35838
35965
  addonId: null,
@@ -35922,12 +36049,6 @@ Object.freeze({
35922
36049
  addonId: null,
35923
36050
  access: "view"
35924
36051
  },
35925
- "pipelineAnalytics.listGroups": {
35926
- capName: "pipeline-analytics",
35927
- capScope: "device",
35928
- addonId: null,
35929
- access: "view"
35930
- },
35931
36052
  "pipelineAnalytics.listOpsLog": {
35932
36053
  capName: "pipeline-analytics",
35933
36054
  capScope: "device",
@@ -36012,6 +36133,12 @@ Object.freeze({
36012
36133
  addonId: null,
36013
36134
  access: "create"
36014
36135
  },
36136
+ "pipelineAnalytics.reclaimDebugMedia": {
36137
+ capName: "pipeline-analytics",
36138
+ capScope: "device",
36139
+ addonId: null,
36140
+ access: "create"
36141
+ },
36015
36142
  "pipelineAnalytics.reconcileFromDisk": {
36016
36143
  capName: "pipeline-analytics",
36017
36144
  capScope: "device",
@@ -36936,6 +37063,12 @@ Object.freeze({
36936
37063
  addonId: null,
36937
37064
  access: "view"
36938
37065
  },
37066
+ "recording.getPlacement": {
37067
+ capName: "recording",
37068
+ capScope: "system",
37069
+ addonId: null,
37070
+ access: "view"
37071
+ },
36939
37072
  "recording.getPlaybackManifest": {
36940
37073
  capName: "recording",
36941
37074
  capScope: "system",
@@ -37062,6 +37195,12 @@ Object.freeze({
37062
37195
  addonId: null,
37063
37196
  access: "create"
37064
37197
  },
37198
+ "recording.setDevicePlacement": {
37199
+ capName: "recording",
37200
+ capScope: "system",
37201
+ addonId: null,
37202
+ access: "create"
37203
+ },
37065
37204
  "recording.startStorageMigrationMove": {
37066
37205
  capName: "recording",
37067
37206
  capScope: "system",
@@ -37506,12 +37645,36 @@ Object.freeze({
37506
37645
  addonId: null,
37507
37646
  access: "create"
37508
37647
  },
37648
+ "storageMigration.cleanupCancel": {
37649
+ capName: "storage-migration",
37650
+ capScope: "system",
37651
+ addonId: null,
37652
+ access: "create"
37653
+ },
37654
+ "storageMigration.cleanupStart": {
37655
+ capName: "storage-migration",
37656
+ capScope: "system",
37657
+ addonId: null,
37658
+ access: "create"
37659
+ },
37660
+ "storageMigration.cleanupStatus": {
37661
+ capName: "storage-migration",
37662
+ capScope: "system",
37663
+ addonId: null,
37664
+ access: "view"
37665
+ },
37509
37666
  "storageMigration.drain": {
37510
37667
  capName: "storage-migration",
37511
37668
  capScope: "system",
37512
37669
  addonId: null,
37513
37670
  access: "create"
37514
37671
  },
37672
+ "storageMigration.history": {
37673
+ capName: "storage-migration",
37674
+ capScope: "system",
37675
+ addonId: null,
37676
+ access: "view"
37677
+ },
37515
37678
  "storageMigration.movers": {
37516
37679
  capName: "storage-migration",
37517
37680
  capScope: "system",
@@ -39508,11 +39671,6 @@ Object.freeze({
39508
39671
  form: "single",
39509
39672
  optional: true
39510
39673
  }],
39511
- "pipelineAnalytics.getGroup": [{
39512
- name: "deviceId",
39513
- form: "single",
39514
- optional: false
39515
- }],
39516
39674
  "pipelineAnalytics.getKeyEvents": [{
39517
39675
  name: "deviceId",
39518
39676
  form: "single",
@@ -39578,11 +39736,6 @@ Object.freeze({
39578
39736
  form: "single",
39579
39737
  optional: false
39580
39738
  }],
39581
- "pipelineAnalytics.listGroups": [{
39582
- name: "deviceIds",
39583
- form: "array",
39584
- optional: false
39585
- }],
39586
39739
  "pipelineAnalytics.listOpsLog": [{
39587
39740
  name: "deviceId",
39588
39741
  form: "single",
@@ -39628,6 +39781,11 @@ Object.freeze({
39628
39781
  form: "single",
39629
39782
  optional: true
39630
39783
  }],
39784
+ "pipelineAnalytics.reclaimDebugMedia": [{
39785
+ name: "deviceIds",
39786
+ form: "array",
39787
+ optional: true
39788
+ }],
39631
39789
  "pipelineAnalytics.reconcileFromDisk": [{
39632
39790
  name: "deviceId",
39633
39791
  form: "single",
@@ -39993,6 +40151,11 @@ Object.freeze({
39993
40151
  form: "single",
39994
40152
  optional: false
39995
40153
  }],
40154
+ "recording.setDevicePlacement": [{
40155
+ name: "deviceId",
40156
+ form: "single",
40157
+ optional: false
40158
+ }],
39996
40159
  "recording.startStorageMigrationMove": [{
39997
40160
  name: "deviceId",
39998
40161
  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()
@@ -16040,6 +16118,8 @@ var NcSystemEventKindSchema = _enum([
16040
16118
  "device-offline",
16041
16119
  "device-disabled",
16042
16120
  "device-enabled",
16121
+ "device-battery-low",
16122
+ "device-battery-normal",
16043
16123
  "stream-online",
16044
16124
  "stream-offline",
16045
16125
  "node-online",
@@ -19298,46 +19378,6 @@ var RecentTracksPageSchema = object({
19298
19378
  /** Cursor for the next page, or null when this page is the last. */
19299
19379
  nextCursor: string().nullable()
19300
19380
  });
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
19381
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19342
19382
  var KEY_EVENTS_MAX_LIMIT = 200;
19343
19383
  var KeyEventQueryInput = object({
@@ -19441,9 +19481,7 @@ var TrackCascadeCountsSchema = object({
19441
19481
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19442
19482
  plates: number().int(),
19443
19483
  /** 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()
19484
+ embeddings: number().int()
19447
19485
  });
19448
19486
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19449
19487
  var DiskReconcileCountsSchema = object({
@@ -19613,6 +19651,47 @@ var RebuildStatusSchema = object({
19613
19651
  /** Present when the pass ended by throwing. */
19614
19652
  error: string().nullable()
19615
19653
  });
19654
+ /**
19655
+ * Acknowledgement that a debug-media reclaim STARTED.
19656
+ *
19657
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19658
+ * it runs detached and this returns immediately. Awaiting it is how the
19659
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19660
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19661
+ */
19662
+ var MediaReclaimStartResultSchema = object({
19663
+ started: boolean(),
19664
+ /** True when a pass was already running; the new request is ignored. */
19665
+ alreadyRunning: boolean()
19666
+ });
19667
+ var MediaReclaimInputSchema = object({
19668
+ mode: _enum(["report", "reclaim"]).default("report"),
19669
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19670
+ deviceIds: array(number().int()).min(1).optional(),
19671
+ restart: boolean().optional(),
19672
+ pageSize: number().int().min(50).max(5e3).optional(),
19673
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19674
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19675
+ maxBytesPerRun: number().int().min(1).optional(),
19676
+ budgetMinutes: number().int().min(1).max(720).optional(),
19677
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19678
+ graceMinutes: number().int().min(1).max(10080).optional()
19679
+ });
19680
+ var MediaReclaimStatusSchema = object({
19681
+ running: boolean(),
19682
+ mode: _enum(["report", "reclaim"]).nullable(),
19683
+ totalExamined: number(),
19684
+ totalEligible: number(),
19685
+ totalReclaimed: number(),
19686
+ totalBytesReclaimed: number(),
19687
+ totalRefused: number(),
19688
+ /** Device+scope windows finished in this pass. */
19689
+ devicesDone: number(),
19690
+ complete: boolean().nullable(),
19691
+ startedAtMs: number().nullable(),
19692
+ finishedAtMs: number().nullable(),
19693
+ error: string().nullable()
19694
+ });
19616
19695
  var ReplayFrameInputSchema = object({
19617
19696
  timestamp: number(),
19618
19697
  frame: PipelineRunResultBridge
@@ -19651,10 +19730,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19651
19730
  * stationary registry). Default false: the timeline lists passages,
19652
19731
  * not parking records (operator decision, 2026-08-15). */
19653
19732
  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(), {
19733
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19658
19734
  kind: "mutation",
19659
19735
  auth: "admin"
19660
19736
  }), 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 +19830,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19754
19830
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19755
19831
  kind: "query",
19756
19832
  auth: "admin"
19833
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19834
+ kind: "mutation",
19835
+ auth: "admin"
19836
+ }), method(object({}), MediaReclaimStatusSchema, {
19837
+ kind: "query",
19838
+ auth: "admin"
19757
19839
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19758
19840
  kind: "query",
19759
19841
  auth: "admin"
@@ -21724,7 +21806,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21724
21806
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21725
21807
  kind: "mutation",
21726
21808
  auth: "admin"
21727
- });
21809
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21810
+ kind: "mutation",
21811
+ auth: "admin"
21812
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21813
+ kind: "mutation",
21814
+ auth: "admin"
21815
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21728
21816
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21729
21817
  providerId: string().min(1),
21730
21818
  displayName: string().min(1),
@@ -28834,6 +28922,33 @@ var RecordingRebalanceInputSchema = object({
28834
28922
  minMoveGb: number().min(0).optional()
28835
28923
  });
28836
28924
  /**
28925
+ * Operator-facing placement of one camera onto a recordings location.
28926
+ *
28927
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
28928
+ * Auto (the planner may move this camera). `locationId` is where high/mid
28929
+ * currently write — the plan, which may disagree with the pin when Auto.
28930
+ */
28931
+ var RecordingDevicePlacementSchema = object({
28932
+ deviceId: number().int(),
28933
+ profile: string(),
28934
+ locationId: string()
28935
+ });
28936
+ var RecordingDevicePinSchema = object({
28937
+ deviceId: number().int(),
28938
+ /** Recordings-class location this camera is pinned to. */
28939
+ locationId: string()
28940
+ });
28941
+ var RecordingPlacementViewSchema = object({
28942
+ assignments: array(RecordingDevicePlacementSchema),
28943
+ pins: array(RecordingDevicePinSchema),
28944
+ defaultLocations: record(string(), string())
28945
+ });
28946
+ var RecordingSetDevicePlacementInputSchema = object({
28947
+ deviceId: number().int(),
28948
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
28949
+ locationId: string().nullable()
28950
+ });
28951
+ /**
28837
28952
  * Result of locating footage at a wall-clock instant for one device/profile.
28838
28953
  * `segment` carries the covering segment's window; `gap` reports the forward
28839
28954
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -29059,6 +29174,12 @@ method(object({
29059
29174
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
29060
29175
  kind: "mutation",
29061
29176
  auth: "admin"
29177
+ }), method(object({}), RecordingPlacementViewSchema, {
29178
+ kind: "query",
29179
+ auth: "admin"
29180
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29181
+ kind: "mutation",
29182
+ auth: "admin"
29062
29183
  });
29063
29184
  /**
29064
29185
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -34128,6 +34249,12 @@ Object.freeze({
34128
34249
  addonId: null,
34129
34250
  access: "delete"
34130
34251
  },
34252
+ "deviceManager.renameLocation": {
34253
+ capName: "device-manager",
34254
+ capScope: "system",
34255
+ addonId: null,
34256
+ access: "create"
34257
+ },
34131
34258
  "deviceManager.runDeviceAction": {
34132
34259
  capName: "device-manager",
34133
34260
  capScope: "system",
@@ -35820,19 +35947,19 @@ Object.freeze({
35820
35947
  addonId: null,
35821
35948
  access: "view"
35822
35949
  },
35823
- "pipelineAnalytics.getGroup": {
35950
+ "pipelineAnalytics.getKeyEvents": {
35824
35951
  capName: "pipeline-analytics",
35825
35952
  capScope: "device",
35826
35953
  addonId: null,
35827
35954
  access: "view"
35828
35955
  },
35829
- "pipelineAnalytics.getKeyEvents": {
35956
+ "pipelineAnalytics.getKeyEventsBatch": {
35830
35957
  capName: "pipeline-analytics",
35831
35958
  capScope: "device",
35832
35959
  addonId: null,
35833
35960
  access: "view"
35834
35961
  },
35835
- "pipelineAnalytics.getKeyEventsBatch": {
35962
+ "pipelineAnalytics.getMediaReclaimStatus": {
35836
35963
  capName: "pipeline-analytics",
35837
35964
  capScope: "device",
35838
35965
  addonId: null,
@@ -35922,12 +36049,6 @@ Object.freeze({
35922
36049
  addonId: null,
35923
36050
  access: "view"
35924
36051
  },
35925
- "pipelineAnalytics.listGroups": {
35926
- capName: "pipeline-analytics",
35927
- capScope: "device",
35928
- addonId: null,
35929
- access: "view"
35930
- },
35931
36052
  "pipelineAnalytics.listOpsLog": {
35932
36053
  capName: "pipeline-analytics",
35933
36054
  capScope: "device",
@@ -36012,6 +36133,12 @@ Object.freeze({
36012
36133
  addonId: null,
36013
36134
  access: "create"
36014
36135
  },
36136
+ "pipelineAnalytics.reclaimDebugMedia": {
36137
+ capName: "pipeline-analytics",
36138
+ capScope: "device",
36139
+ addonId: null,
36140
+ access: "create"
36141
+ },
36015
36142
  "pipelineAnalytics.reconcileFromDisk": {
36016
36143
  capName: "pipeline-analytics",
36017
36144
  capScope: "device",
@@ -36936,6 +37063,12 @@ Object.freeze({
36936
37063
  addonId: null,
36937
37064
  access: "view"
36938
37065
  },
37066
+ "recording.getPlacement": {
37067
+ capName: "recording",
37068
+ capScope: "system",
37069
+ addonId: null,
37070
+ access: "view"
37071
+ },
36939
37072
  "recording.getPlaybackManifest": {
36940
37073
  capName: "recording",
36941
37074
  capScope: "system",
@@ -37062,6 +37195,12 @@ Object.freeze({
37062
37195
  addonId: null,
37063
37196
  access: "create"
37064
37197
  },
37198
+ "recording.setDevicePlacement": {
37199
+ capName: "recording",
37200
+ capScope: "system",
37201
+ addonId: null,
37202
+ access: "create"
37203
+ },
37065
37204
  "recording.startStorageMigrationMove": {
37066
37205
  capName: "recording",
37067
37206
  capScope: "system",
@@ -37506,12 +37645,36 @@ Object.freeze({
37506
37645
  addonId: null,
37507
37646
  access: "create"
37508
37647
  },
37648
+ "storageMigration.cleanupCancel": {
37649
+ capName: "storage-migration",
37650
+ capScope: "system",
37651
+ addonId: null,
37652
+ access: "create"
37653
+ },
37654
+ "storageMigration.cleanupStart": {
37655
+ capName: "storage-migration",
37656
+ capScope: "system",
37657
+ addonId: null,
37658
+ access: "create"
37659
+ },
37660
+ "storageMigration.cleanupStatus": {
37661
+ capName: "storage-migration",
37662
+ capScope: "system",
37663
+ addonId: null,
37664
+ access: "view"
37665
+ },
37509
37666
  "storageMigration.drain": {
37510
37667
  capName: "storage-migration",
37511
37668
  capScope: "system",
37512
37669
  addonId: null,
37513
37670
  access: "create"
37514
37671
  },
37672
+ "storageMigration.history": {
37673
+ capName: "storage-migration",
37674
+ capScope: "system",
37675
+ addonId: null,
37676
+ access: "view"
37677
+ },
37515
37678
  "storageMigration.movers": {
37516
37679
  capName: "storage-migration",
37517
37680
  capScope: "system",
@@ -39508,11 +39671,6 @@ Object.freeze({
39508
39671
  form: "single",
39509
39672
  optional: true
39510
39673
  }],
39511
- "pipelineAnalytics.getGroup": [{
39512
- name: "deviceId",
39513
- form: "single",
39514
- optional: false
39515
- }],
39516
39674
  "pipelineAnalytics.getKeyEvents": [{
39517
39675
  name: "deviceId",
39518
39676
  form: "single",
@@ -39578,11 +39736,6 @@ Object.freeze({
39578
39736
  form: "single",
39579
39737
  optional: false
39580
39738
  }],
39581
- "pipelineAnalytics.listGroups": [{
39582
- name: "deviceIds",
39583
- form: "array",
39584
- optional: false
39585
- }],
39586
39739
  "pipelineAnalytics.listOpsLog": [{
39587
39740
  name: "deviceId",
39588
39741
  form: "single",
@@ -39628,6 +39781,11 @@ Object.freeze({
39628
39781
  form: "single",
39629
39782
  optional: true
39630
39783
  }],
39784
+ "pipelineAnalytics.reclaimDebugMedia": [{
39785
+ name: "deviceIds",
39786
+ form: "array",
39787
+ optional: true
39788
+ }],
39631
39789
  "pipelineAnalytics.reconcileFromDisk": [{
39632
39790
  name: "deviceId",
39633
39791
  form: "single",
@@ -39993,6 +40151,11 @@ Object.freeze({
39993
40151
  form: "single",
39994
40152
  optional: false
39995
40153
  }],
40154
+ "recording.setDevicePlacement": [{
40155
+ name: "deviceId",
40156
+ form: "single",
40157
+ optional: false
40158
+ }],
39996
40159
  "recording.startStorageMigrationMove": [{
39997
40160
  name: "deviceId",
39998
40161
  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.50",
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",