@camstack/addon-decoder-ffmpeg 1.2.49 → 1.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/index.js +234 -73
  2. package/dist/index.mjs +234 -73
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -8097,6 +8097,13 @@ var MediaRelocateModeSchema = _enum([
8097
8097
  ]);
8098
8098
  var RelocateMediaInputSchema = object({
8099
8099
  toLocationId: string(),
8100
+ /**
8101
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8102
+ * every row that is not already on `toLocationId` (the historical
8103
+ * behaviour). A named source is what a from→to migration needs: without it
8104
+ * "move events off disk 2" also emptied disk 1.
8105
+ */
8106
+ fromLocationId: string().optional(),
8100
8107
  throttleMbps: number().min(1).max(1e3).optional(),
8101
8108
  /** Omitted = `move`, the pre-existing behaviour. */
8102
8109
  mode: MediaRelocateModeSchema.optional()
@@ -8164,6 +8171,19 @@ var StorageMigrationDestinationsSchema = object({
8164
8171
  galleryMedia: string().min(1).optional()
8165
8172
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8166
8173
  /**
8174
+ * Optional named source per class. Omitted = the class's current default
8175
+ * (the historical behaviour). A named source that is NOT the default is a
8176
+ * drain of that disk: bytes move, the default stays, and the source is
8177
+ * disabled when the move finishes.
8178
+ */
8179
+ var StorageMigrationSourcesSchema = object({
8180
+ recordings: string().min(1).optional(),
8181
+ recordingsLow: string().min(1).optional(),
8182
+ eventMedia: string().min(1).optional(),
8183
+ backups: string().min(1).optional(),
8184
+ galleryMedia: string().min(1).optional()
8185
+ }).optional();
8186
+ /**
8167
8187
  * How a migration sequences the cutover against the byte move.
8168
8188
  *
8169
8189
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8185,6 +8205,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8185
8205
  /** Shared input for planning and starting an orchestrated storage migration. */
8186
8206
  var StorageMigrationInputSchema = object({
8187
8207
  destinations: StorageMigrationDestinationsSchema,
8208
+ /** Omitted = each class's current default. */
8209
+ sources: StorageMigrationSourcesSchema,
8188
8210
  throttleMbps: number().min(1).max(1e3).optional(),
8189
8211
  /** Omitted = `blocking`, which stays the default. */
8190
8212
  mode: StorageMigrationModeSchema.optional()
@@ -8264,6 +8286,13 @@ var StorageMigrationMoveSchema = object({
8264
8286
  storageClass: StorageMigrationClassSchema,
8265
8287
  fromLocationId: string(),
8266
8288
  toLocationId: string(),
8289
+ /**
8290
+ * True when `from` was NOT the class default at plan time. The move still
8291
+ * copies bytes, but the default is left alone and the source is disabled
8292
+ * once the copy verifies. Absent on jobs planned before this field existed
8293
+ * — those jobs always repointed, which is `false`.
8294
+ */
8295
+ freezeSource: boolean().optional(),
8267
8296
  moverJobId: string().nullable(),
8268
8297
  state: RelocateJobStateSchema.nullable(),
8269
8298
  error: string().nullable(),
@@ -8277,6 +8306,7 @@ var StorageMigrationJobSchema = object({
8277
8306
  * can tell a seconds-long cutover from a thirty-hour one. */
8278
8307
  mode: StorageMigrationModeSchema,
8279
8308
  destinations: StorageMigrationDestinationsSchema,
8309
+ sources: StorageMigrationSourcesSchema,
8280
8310
  throttleMbps: number(),
8281
8311
  moves: array(StorageMigrationMoveSchema),
8282
8312
  pauseLeaseId: string().nullable(),
@@ -8302,6 +8332,7 @@ var StorageMigrationFindingSchema = object({
8302
8332
  });
8303
8333
  var StorageMigrationPlanSchema = object({
8304
8334
  destinations: StorageMigrationDestinationsSchema,
8335
+ sources: StorageMigrationSourcesSchema,
8305
8336
  /** The mode this plan was built for. A plan is only valid for its mode: the
8306
8337
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8307
8338
  * it. */
@@ -8309,7 +8340,8 @@ var StorageMigrationPlanSchema = object({
8309
8340
  moves: array(object({
8310
8341
  storageClass: StorageMigrationClassSchema,
8311
8342
  fromLocationId: string(),
8312
- toLocationId: string()
8343
+ toLocationId: string(),
8344
+ freezeSource: boolean().optional()
8313
8345
  })),
8314
8346
  findings: array(StorageMigrationFindingSchema)
8315
8347
  });
@@ -8487,10 +8519,51 @@ var LedgerWalkReportSchema = object({
8487
8519
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8488
8520
  var RelocatableMediaCountInputSchema = object({
8489
8521
  toLocationId: string().min(1),
8522
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8523
+ fromLocationId: string().optional(),
8490
8524
  /** Omitted = `move`. */
8491
8525
  mode: MediaRelocateModeSchema.optional()
8492
8526
  });
8493
8527
  /**
8528
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8529
+ * ghost ledger entries on frozen footage locations.
8530
+ *
8531
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8532
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8533
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8534
+ * with no operator-visible status.
8535
+ */
8536
+ var StorageCleanupPhaseSchema = _enum([
8537
+ "orphans",
8538
+ "debug-media",
8539
+ "ghost-ledger",
8540
+ "done",
8541
+ "failed",
8542
+ "cancelled"
8543
+ ]);
8544
+ var StorageCleanupInputSchema = object({
8545
+ /** Also walk motion stills / track filmstrips. Off by default. */
8546
+ includeDebugMedia: boolean().optional() });
8547
+ var StorageCleanupJobSchema = object({
8548
+ jobId: string(),
8549
+ phase: StorageCleanupPhaseSchema,
8550
+ includeDebugMedia: boolean(),
8551
+ orphansReclaimed: number().int().nonnegative(),
8552
+ orphanBytesReclaimed: number().int().nonnegative(),
8553
+ debugMediaReclaimed: number().int().nonnegative(),
8554
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8555
+ ghostsForgotten: number().int().nonnegative(),
8556
+ ghostBytesForgotten: number().int().nonnegative(),
8557
+ /** Short operator-facing line: current collection, pass, or location. */
8558
+ detail: string().nullable(),
8559
+ cancelRequested: boolean(),
8560
+ startedAt: number(),
8561
+ updatedAt: number(),
8562
+ finishedAt: number().nullable(),
8563
+ error: string().nullable()
8564
+ });
8565
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8566
+ /**
8494
8567
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8495
8568
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8496
8569
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8518,11 +8591,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8518
8591
  * The default location for a type uses `id === <type>:default` by
8519
8592
  * convention (the bare type ref like `'backups'` resolves to it).
8520
8593
  *
8521
- * `isSystem: true` marks a location as orchestrator-seeded and
8522
- * undeletable. The bootstrap-installed defaults (one per type) carry
8523
- * this flag; operator-added locations don't. Editing the config of
8524
- * a system location is allowed (path migration, provider swap) but
8525
- * deleting it is rejected at the cap level.
8594
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8595
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8596
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8597
+ * / last-enabled, not on this bit.
8526
8598
  */
8527
8599
  var StorageLocationSchema = object({
8528
8600
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -12914,6 +12986,12 @@ method(object({
12914
12986
  }), _void(), {
12915
12987
  kind: "mutation",
12916
12988
  auth: "admin"
12989
+ }), method(object({
12990
+ from: string(),
12991
+ to: string()
12992
+ }), object({ moved: number() }), {
12993
+ kind: "mutation",
12994
+ auth: "admin"
12917
12995
  }), method(object({
12918
12996
  deviceId: number(),
12919
12997
  disabled: boolean()
@@ -18844,46 +18922,6 @@ var RecentTracksPageSchema = object({
18844
18922
  /** Cursor for the next page, or null when this page is the last. */
18845
18923
  nextCursor: string().nullable()
18846
18924
  });
18847
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
18848
- var LIST_GROUPS_MAX_LIMIT = 100;
18849
- var AnalyticsGroupRecordSchema = object({
18850
- id: string(),
18851
- deviceId: number().int(),
18852
- openedAt: number().int(),
18853
- closedAt: number().int(),
18854
- timestamp: number().int(),
18855
- memberCount: number().int(),
18856
- memberTrackIds: array(string()).readonly(),
18857
- className: string(),
18858
- classes: array(string()).readonly(),
18859
- /** Relative event-media path, or null when the group has no picture yet. */
18860
- mediaUrl: string().nullable(),
18861
- singleton: boolean()
18862
- });
18863
- var AnalyticsGroupMemberSchema = object({
18864
- trackId: string(),
18865
- deviceId: number().int(),
18866
- className: string(),
18867
- firstSeen: number().int(),
18868
- lastSeen: number().int(),
18869
- mediaUrl: string().nullable()
18870
- });
18871
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
18872
- var ListGroupsQueryInput = object({
18873
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
18874
- deviceIds: array(number()),
18875
- /** Window lower bound on `closedAt` (inclusive). */
18876
- since: number().optional(),
18877
- /** Window upper bound on `openedAt` (inclusive). */
18878
- until: number().optional(),
18879
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
18880
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
18881
- cursor: string().optional()
18882
- });
18883
- var ListGroupsPageSchema = object({
18884
- groups: array(AnalyticsGroupRecordSchema).readonly(),
18885
- nextCursor: string().nullable()
18886
- });
18887
18925
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
18888
18926
  var KEY_EVENTS_MAX_LIMIT = 200;
18889
18927
  var KeyEventQueryInput = object({
@@ -18987,9 +19025,7 @@ var TrackCascadeCountsSchema = object({
18987
19025
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
18988
19026
  plates: number().int(),
18989
19027
  /** Per-track CLIP search vectors removed (best-effort). */
18990
- embeddings: number().int(),
18991
- /** Group membership + group rows removed with their last member (best-effort). */
18992
- groups: number().int()
19028
+ embeddings: number().int()
18993
19029
  });
18994
19030
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
18995
19031
  var DiskReconcileCountsSchema = object({
@@ -19159,6 +19195,47 @@ var RebuildStatusSchema = object({
19159
19195
  /** Present when the pass ended by throwing. */
19160
19196
  error: string().nullable()
19161
19197
  });
19198
+ /**
19199
+ * Acknowledgement that a debug-media reclaim STARTED.
19200
+ *
19201
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19202
+ * it runs detached and this returns immediately. Awaiting it is how the
19203
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19204
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19205
+ */
19206
+ var MediaReclaimStartResultSchema = object({
19207
+ started: boolean(),
19208
+ /** True when a pass was already running; the new request is ignored. */
19209
+ alreadyRunning: boolean()
19210
+ });
19211
+ var MediaReclaimInputSchema = object({
19212
+ mode: _enum(["report", "reclaim"]).default("report"),
19213
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19214
+ deviceIds: array(number().int()).min(1).optional(),
19215
+ restart: boolean().optional(),
19216
+ pageSize: number().int().min(50).max(5e3).optional(),
19217
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19218
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19219
+ maxBytesPerRun: number().int().min(1).optional(),
19220
+ budgetMinutes: number().int().min(1).max(720).optional(),
19221
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19222
+ graceMinutes: number().int().min(1).max(10080).optional()
19223
+ });
19224
+ var MediaReclaimStatusSchema = object({
19225
+ running: boolean(),
19226
+ mode: _enum(["report", "reclaim"]).nullable(),
19227
+ totalExamined: number(),
19228
+ totalEligible: number(),
19229
+ totalReclaimed: number(),
19230
+ totalBytesReclaimed: number(),
19231
+ totalRefused: number(),
19232
+ /** Device+scope windows finished in this pass. */
19233
+ devicesDone: number(),
19234
+ complete: boolean().nullable(),
19235
+ startedAtMs: number().nullable(),
19236
+ finishedAtMs: number().nullable(),
19237
+ error: string().nullable()
19238
+ });
19162
19239
  var ReplayFrameInputSchema = object({
19163
19240
  timestamp: number(),
19164
19241
  frame: PipelineRunResultBridge
@@ -19197,10 +19274,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19197
19274
  * stationary registry). Default false: the timeline lists passages,
19198
19275
  * not parking records (operator decision, 2026-08-15). */
19199
19276
  includeStationary: boolean().optional()
19200
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19201
- deviceId: number(),
19202
- groupId: string().min(1)
19203
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19277
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19204
19278
  kind: "mutation",
19205
19279
  auth: "admin"
19206
19280
  }), 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({
@@ -19300,6 +19374,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19300
19374
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19301
19375
  kind: "query",
19302
19376
  auth: "admin"
19377
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19378
+ kind: "mutation",
19379
+ auth: "admin"
19380
+ }), method(object({}), MediaReclaimStatusSchema, {
19381
+ kind: "query",
19382
+ auth: "admin"
19303
19383
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19304
19384
  kind: "query",
19305
19385
  auth: "admin"
@@ -21270,7 +21350,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21270
21350
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21271
21351
  kind: "mutation",
21272
21352
  auth: "admin"
21273
- });
21353
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21354
+ kind: "mutation",
21355
+ auth: "admin"
21356
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21357
+ kind: "mutation",
21358
+ auth: "admin"
21359
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21274
21360
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21275
21361
  providerId: string().min(1),
21276
21362
  displayName: string().min(1),
@@ -26648,6 +26734,33 @@ var RecordingRebalanceInputSchema = object({
26648
26734
  minMoveGb: number().min(0).optional()
26649
26735
  });
26650
26736
  /**
26737
+ * Operator-facing placement of one camera onto a recordings location.
26738
+ *
26739
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
26740
+ * Auto (the planner may move this camera). `locationId` is where high/mid
26741
+ * currently write — the plan, which may disagree with the pin when Auto.
26742
+ */
26743
+ var RecordingDevicePlacementSchema = object({
26744
+ deviceId: number().int(),
26745
+ profile: string(),
26746
+ locationId: string()
26747
+ });
26748
+ var RecordingDevicePinSchema = object({
26749
+ deviceId: number().int(),
26750
+ /** Recordings-class location this camera is pinned to. */
26751
+ locationId: string()
26752
+ });
26753
+ var RecordingPlacementViewSchema = object({
26754
+ assignments: array(RecordingDevicePlacementSchema),
26755
+ pins: array(RecordingDevicePinSchema),
26756
+ defaultLocations: record(string(), string())
26757
+ });
26758
+ var RecordingSetDevicePlacementInputSchema = object({
26759
+ deviceId: number().int(),
26760
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
26761
+ locationId: string().nullable()
26762
+ });
26763
+ /**
26651
26764
  * Result of locating footage at a wall-clock instant for one device/profile.
26652
26765
  * `segment` carries the covering segment's window; `gap` reports the forward
26653
26766
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -26873,6 +26986,12 @@ method(object({
26873
26986
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
26874
26987
  kind: "mutation",
26875
26988
  auth: "admin"
26989
+ }), method(object({}), RecordingPlacementViewSchema, {
26990
+ kind: "query",
26991
+ auth: "admin"
26992
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
26993
+ kind: "mutation",
26994
+ auth: "admin"
26876
26995
  });
26877
26996
  /**
26878
26997
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -30243,6 +30362,12 @@ Object.freeze({
30243
30362
  addonId: null,
30244
30363
  access: "delete"
30245
30364
  },
30365
+ "deviceManager.renameLocation": {
30366
+ capName: "device-manager",
30367
+ capScope: "system",
30368
+ addonId: null,
30369
+ access: "create"
30370
+ },
30246
30371
  "deviceManager.runDeviceAction": {
30247
30372
  capName: "device-manager",
30248
30373
  capScope: "system",
@@ -31935,19 +32060,19 @@ Object.freeze({
31935
32060
  addonId: null,
31936
32061
  access: "view"
31937
32062
  },
31938
- "pipelineAnalytics.getGroup": {
32063
+ "pipelineAnalytics.getKeyEvents": {
31939
32064
  capName: "pipeline-analytics",
31940
32065
  capScope: "device",
31941
32066
  addonId: null,
31942
32067
  access: "view"
31943
32068
  },
31944
- "pipelineAnalytics.getKeyEvents": {
32069
+ "pipelineAnalytics.getKeyEventsBatch": {
31945
32070
  capName: "pipeline-analytics",
31946
32071
  capScope: "device",
31947
32072
  addonId: null,
31948
32073
  access: "view"
31949
32074
  },
31950
- "pipelineAnalytics.getKeyEventsBatch": {
32075
+ "pipelineAnalytics.getMediaReclaimStatus": {
31951
32076
  capName: "pipeline-analytics",
31952
32077
  capScope: "device",
31953
32078
  addonId: null,
@@ -32037,12 +32162,6 @@ Object.freeze({
32037
32162
  addonId: null,
32038
32163
  access: "view"
32039
32164
  },
32040
- "pipelineAnalytics.listGroups": {
32041
- capName: "pipeline-analytics",
32042
- capScope: "device",
32043
- addonId: null,
32044
- access: "view"
32045
- },
32046
32165
  "pipelineAnalytics.listOpsLog": {
32047
32166
  capName: "pipeline-analytics",
32048
32167
  capScope: "device",
@@ -32127,6 +32246,12 @@ Object.freeze({
32127
32246
  addonId: null,
32128
32247
  access: "create"
32129
32248
  },
32249
+ "pipelineAnalytics.reclaimDebugMedia": {
32250
+ capName: "pipeline-analytics",
32251
+ capScope: "device",
32252
+ addonId: null,
32253
+ access: "create"
32254
+ },
32130
32255
  "pipelineAnalytics.reconcileFromDisk": {
32131
32256
  capName: "pipeline-analytics",
32132
32257
  capScope: "device",
@@ -33051,6 +33176,12 @@ Object.freeze({
33051
33176
  addonId: null,
33052
33177
  access: "view"
33053
33178
  },
33179
+ "recording.getPlacement": {
33180
+ capName: "recording",
33181
+ capScope: "system",
33182
+ addonId: null,
33183
+ access: "view"
33184
+ },
33054
33185
  "recording.getPlaybackManifest": {
33055
33186
  capName: "recording",
33056
33187
  capScope: "system",
@@ -33177,6 +33308,12 @@ Object.freeze({
33177
33308
  addonId: null,
33178
33309
  access: "create"
33179
33310
  },
33311
+ "recording.setDevicePlacement": {
33312
+ capName: "recording",
33313
+ capScope: "system",
33314
+ addonId: null,
33315
+ access: "create"
33316
+ },
33180
33317
  "recording.startStorageMigrationMove": {
33181
33318
  capName: "recording",
33182
33319
  capScope: "system",
@@ -33621,12 +33758,36 @@ Object.freeze({
33621
33758
  addonId: null,
33622
33759
  access: "create"
33623
33760
  },
33761
+ "storageMigration.cleanupCancel": {
33762
+ capName: "storage-migration",
33763
+ capScope: "system",
33764
+ addonId: null,
33765
+ access: "create"
33766
+ },
33767
+ "storageMigration.cleanupStart": {
33768
+ capName: "storage-migration",
33769
+ capScope: "system",
33770
+ addonId: null,
33771
+ access: "create"
33772
+ },
33773
+ "storageMigration.cleanupStatus": {
33774
+ capName: "storage-migration",
33775
+ capScope: "system",
33776
+ addonId: null,
33777
+ access: "view"
33778
+ },
33624
33779
  "storageMigration.drain": {
33625
33780
  capName: "storage-migration",
33626
33781
  capScope: "system",
33627
33782
  addonId: null,
33628
33783
  access: "create"
33629
33784
  },
33785
+ "storageMigration.history": {
33786
+ capName: "storage-migration",
33787
+ capScope: "system",
33788
+ addonId: null,
33789
+ access: "view"
33790
+ },
33630
33791
  "storageMigration.movers": {
33631
33792
  capName: "storage-migration",
33632
33793
  capScope: "system",
@@ -35623,11 +35784,6 @@ Object.freeze({
35623
35784
  form: "single",
35624
35785
  optional: true
35625
35786
  }],
35626
- "pipelineAnalytics.getGroup": [{
35627
- name: "deviceId",
35628
- form: "single",
35629
- optional: false
35630
- }],
35631
35787
  "pipelineAnalytics.getKeyEvents": [{
35632
35788
  name: "deviceId",
35633
35789
  form: "single",
@@ -35693,11 +35849,6 @@ Object.freeze({
35693
35849
  form: "single",
35694
35850
  optional: false
35695
35851
  }],
35696
- "pipelineAnalytics.listGroups": [{
35697
- name: "deviceIds",
35698
- form: "array",
35699
- optional: false
35700
- }],
35701
35852
  "pipelineAnalytics.listOpsLog": [{
35702
35853
  name: "deviceId",
35703
35854
  form: "single",
@@ -35743,6 +35894,11 @@ Object.freeze({
35743
35894
  form: "single",
35744
35895
  optional: true
35745
35896
  }],
35897
+ "pipelineAnalytics.reclaimDebugMedia": [{
35898
+ name: "deviceIds",
35899
+ form: "array",
35900
+ optional: true
35901
+ }],
35746
35902
  "pipelineAnalytics.reconcileFromDisk": [{
35747
35903
  name: "deviceId",
35748
35904
  form: "single",
@@ -36108,6 +36264,11 @@ Object.freeze({
36108
36264
  form: "single",
36109
36265
  optional: false
36110
36266
  }],
36267
+ "recording.setDevicePlacement": [{
36268
+ name: "deviceId",
36269
+ form: "single",
36270
+ optional: false
36271
+ }],
36111
36272
  "recording.startStorageMigrationMove": [{
36112
36273
  name: "deviceId",
36113
36274
  form: "single",
package/dist/index.mjs CHANGED
@@ -8093,6 +8093,13 @@ var MediaRelocateModeSchema = _enum([
8093
8093
  ]);
8094
8094
  var RelocateMediaInputSchema = object({
8095
8095
  toLocationId: string(),
8096
+ /**
8097
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8098
+ * every row that is not already on `toLocationId` (the historical
8099
+ * behaviour). A named source is what a from→to migration needs: without it
8100
+ * "move events off disk 2" also emptied disk 1.
8101
+ */
8102
+ fromLocationId: string().optional(),
8096
8103
  throttleMbps: number().min(1).max(1e3).optional(),
8097
8104
  /** Omitted = `move`, the pre-existing behaviour. */
8098
8105
  mode: MediaRelocateModeSchema.optional()
@@ -8160,6 +8167,19 @@ var StorageMigrationDestinationsSchema = object({
8160
8167
  galleryMedia: string().min(1).optional()
8161
8168
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8162
8169
  /**
8170
+ * Optional named source per class. Omitted = the class's current default
8171
+ * (the historical behaviour). A named source that is NOT the default is a
8172
+ * drain of that disk: bytes move, the default stays, and the source is
8173
+ * disabled when the move finishes.
8174
+ */
8175
+ var StorageMigrationSourcesSchema = object({
8176
+ recordings: string().min(1).optional(),
8177
+ recordingsLow: string().min(1).optional(),
8178
+ eventMedia: string().min(1).optional(),
8179
+ backups: string().min(1).optional(),
8180
+ galleryMedia: string().min(1).optional()
8181
+ }).optional();
8182
+ /**
8163
8183
  * How a migration sequences the cutover against the byte move.
8164
8184
  *
8165
8185
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8181,6 +8201,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8181
8201
  /** Shared input for planning and starting an orchestrated storage migration. */
8182
8202
  var StorageMigrationInputSchema = object({
8183
8203
  destinations: StorageMigrationDestinationsSchema,
8204
+ /** Omitted = each class's current default. */
8205
+ sources: StorageMigrationSourcesSchema,
8184
8206
  throttleMbps: number().min(1).max(1e3).optional(),
8185
8207
  /** Omitted = `blocking`, which stays the default. */
8186
8208
  mode: StorageMigrationModeSchema.optional()
@@ -8260,6 +8282,13 @@ var StorageMigrationMoveSchema = object({
8260
8282
  storageClass: StorageMigrationClassSchema,
8261
8283
  fromLocationId: string(),
8262
8284
  toLocationId: string(),
8285
+ /**
8286
+ * True when `from` was NOT the class default at plan time. The move still
8287
+ * copies bytes, but the default is left alone and the source is disabled
8288
+ * once the copy verifies. Absent on jobs planned before this field existed
8289
+ * — those jobs always repointed, which is `false`.
8290
+ */
8291
+ freezeSource: boolean().optional(),
8263
8292
  moverJobId: string().nullable(),
8264
8293
  state: RelocateJobStateSchema.nullable(),
8265
8294
  error: string().nullable(),
@@ -8273,6 +8302,7 @@ var StorageMigrationJobSchema = object({
8273
8302
  * can tell a seconds-long cutover from a thirty-hour one. */
8274
8303
  mode: StorageMigrationModeSchema,
8275
8304
  destinations: StorageMigrationDestinationsSchema,
8305
+ sources: StorageMigrationSourcesSchema,
8276
8306
  throttleMbps: number(),
8277
8307
  moves: array(StorageMigrationMoveSchema),
8278
8308
  pauseLeaseId: string().nullable(),
@@ -8298,6 +8328,7 @@ var StorageMigrationFindingSchema = object({
8298
8328
  });
8299
8329
  var StorageMigrationPlanSchema = object({
8300
8330
  destinations: StorageMigrationDestinationsSchema,
8331
+ sources: StorageMigrationSourcesSchema,
8301
8332
  /** The mode this plan was built for. A plan is only valid for its mode: the
8302
8333
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8303
8334
  * it. */
@@ -8305,7 +8336,8 @@ var StorageMigrationPlanSchema = object({
8305
8336
  moves: array(object({
8306
8337
  storageClass: StorageMigrationClassSchema,
8307
8338
  fromLocationId: string(),
8308
- toLocationId: string()
8339
+ toLocationId: string(),
8340
+ freezeSource: boolean().optional()
8309
8341
  })),
8310
8342
  findings: array(StorageMigrationFindingSchema)
8311
8343
  });
@@ -8483,10 +8515,51 @@ var LedgerWalkReportSchema = object({
8483
8515
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8484
8516
  var RelocatableMediaCountInputSchema = object({
8485
8517
  toLocationId: string().min(1),
8518
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8519
+ fromLocationId: string().optional(),
8486
8520
  /** Omitted = `move`. */
8487
8521
  mode: MediaRelocateModeSchema.optional()
8488
8522
  });
8489
8523
  /**
8524
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8525
+ * ghost ledger entries on frozen footage locations.
8526
+ *
8527
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8528
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8529
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8530
+ * with no operator-visible status.
8531
+ */
8532
+ var StorageCleanupPhaseSchema = _enum([
8533
+ "orphans",
8534
+ "debug-media",
8535
+ "ghost-ledger",
8536
+ "done",
8537
+ "failed",
8538
+ "cancelled"
8539
+ ]);
8540
+ var StorageCleanupInputSchema = object({
8541
+ /** Also walk motion stills / track filmstrips. Off by default. */
8542
+ includeDebugMedia: boolean().optional() });
8543
+ var StorageCleanupJobSchema = object({
8544
+ jobId: string(),
8545
+ phase: StorageCleanupPhaseSchema,
8546
+ includeDebugMedia: boolean(),
8547
+ orphansReclaimed: number().int().nonnegative(),
8548
+ orphanBytesReclaimed: number().int().nonnegative(),
8549
+ debugMediaReclaimed: number().int().nonnegative(),
8550
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8551
+ ghostsForgotten: number().int().nonnegative(),
8552
+ ghostBytesForgotten: number().int().nonnegative(),
8553
+ /** Short operator-facing line: current collection, pass, or location. */
8554
+ detail: string().nullable(),
8555
+ cancelRequested: boolean(),
8556
+ startedAt: number(),
8557
+ updatedAt: number(),
8558
+ finishedAt: number().nullable(),
8559
+ error: string().nullable()
8560
+ });
8561
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8562
+ /**
8490
8563
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8491
8564
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8492
8565
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8514,11 +8587,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8514
8587
  * The default location for a type uses `id === <type>:default` by
8515
8588
  * convention (the bare type ref like `'backups'` resolves to it).
8516
8589
  *
8517
- * `isSystem: true` marks a location as orchestrator-seeded and
8518
- * undeletable. The bootstrap-installed defaults (one per type) carry
8519
- * this flag; operator-added locations don't. Editing the config of
8520
- * a system location is allowed (path migration, provider swap) but
8521
- * deleting it is rejected at the cap level.
8590
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8591
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8592
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8593
+ * / last-enabled, not on this bit.
8522
8594
  */
8523
8595
  var StorageLocationSchema = object({
8524
8596
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -12910,6 +12982,12 @@ method(object({
12910
12982
  }), _void(), {
12911
12983
  kind: "mutation",
12912
12984
  auth: "admin"
12985
+ }), method(object({
12986
+ from: string(),
12987
+ to: string()
12988
+ }), object({ moved: number() }), {
12989
+ kind: "mutation",
12990
+ auth: "admin"
12913
12991
  }), method(object({
12914
12992
  deviceId: number(),
12915
12993
  disabled: boolean()
@@ -18840,46 +18918,6 @@ var RecentTracksPageSchema = object({
18840
18918
  /** Cursor for the next page, or null when this page is the last. */
18841
18919
  nextCursor: string().nullable()
18842
18920
  });
18843
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
18844
- var LIST_GROUPS_MAX_LIMIT = 100;
18845
- var AnalyticsGroupRecordSchema = object({
18846
- id: string(),
18847
- deviceId: number().int(),
18848
- openedAt: number().int(),
18849
- closedAt: number().int(),
18850
- timestamp: number().int(),
18851
- memberCount: number().int(),
18852
- memberTrackIds: array(string()).readonly(),
18853
- className: string(),
18854
- classes: array(string()).readonly(),
18855
- /** Relative event-media path, or null when the group has no picture yet. */
18856
- mediaUrl: string().nullable(),
18857
- singleton: boolean()
18858
- });
18859
- var AnalyticsGroupMemberSchema = object({
18860
- trackId: string(),
18861
- deviceId: number().int(),
18862
- className: string(),
18863
- firstSeen: number().int(),
18864
- lastSeen: number().int(),
18865
- mediaUrl: string().nullable()
18866
- });
18867
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
18868
- var ListGroupsQueryInput = object({
18869
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
18870
- deviceIds: array(number()),
18871
- /** Window lower bound on `closedAt` (inclusive). */
18872
- since: number().optional(),
18873
- /** Window upper bound on `openedAt` (inclusive). */
18874
- until: number().optional(),
18875
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
18876
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
18877
- cursor: string().optional()
18878
- });
18879
- var ListGroupsPageSchema = object({
18880
- groups: array(AnalyticsGroupRecordSchema).readonly(),
18881
- nextCursor: string().nullable()
18882
- });
18883
18921
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
18884
18922
  var KEY_EVENTS_MAX_LIMIT = 200;
18885
18923
  var KeyEventQueryInput = object({
@@ -18983,9 +19021,7 @@ var TrackCascadeCountsSchema = object({
18983
19021
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
18984
19022
  plates: number().int(),
18985
19023
  /** Per-track CLIP search vectors removed (best-effort). */
18986
- embeddings: number().int(),
18987
- /** Group membership + group rows removed with their last member (best-effort). */
18988
- groups: number().int()
19024
+ embeddings: number().int()
18989
19025
  });
18990
19026
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
18991
19027
  var DiskReconcileCountsSchema = object({
@@ -19155,6 +19191,47 @@ var RebuildStatusSchema = object({
19155
19191
  /** Present when the pass ended by throwing. */
19156
19192
  error: string().nullable()
19157
19193
  });
19194
+ /**
19195
+ * Acknowledgement that a debug-media reclaim STARTED.
19196
+ *
19197
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19198
+ * it runs detached and this returns immediately. Awaiting it is how the
19199
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19200
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19201
+ */
19202
+ var MediaReclaimStartResultSchema = object({
19203
+ started: boolean(),
19204
+ /** True when a pass was already running; the new request is ignored. */
19205
+ alreadyRunning: boolean()
19206
+ });
19207
+ var MediaReclaimInputSchema = object({
19208
+ mode: _enum(["report", "reclaim"]).default("report"),
19209
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19210
+ deviceIds: array(number().int()).min(1).optional(),
19211
+ restart: boolean().optional(),
19212
+ pageSize: number().int().min(50).max(5e3).optional(),
19213
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19214
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19215
+ maxBytesPerRun: number().int().min(1).optional(),
19216
+ budgetMinutes: number().int().min(1).max(720).optional(),
19217
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19218
+ graceMinutes: number().int().min(1).max(10080).optional()
19219
+ });
19220
+ var MediaReclaimStatusSchema = object({
19221
+ running: boolean(),
19222
+ mode: _enum(["report", "reclaim"]).nullable(),
19223
+ totalExamined: number(),
19224
+ totalEligible: number(),
19225
+ totalReclaimed: number(),
19226
+ totalBytesReclaimed: number(),
19227
+ totalRefused: number(),
19228
+ /** Device+scope windows finished in this pass. */
19229
+ devicesDone: number(),
19230
+ complete: boolean().nullable(),
19231
+ startedAtMs: number().nullable(),
19232
+ finishedAtMs: number().nullable(),
19233
+ error: string().nullable()
19234
+ });
19158
19235
  var ReplayFrameInputSchema = object({
19159
19236
  timestamp: number(),
19160
19237
  frame: PipelineRunResultBridge
@@ -19193,10 +19270,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19193
19270
  * stationary registry). Default false: the timeline lists passages,
19194
19271
  * not parking records (operator decision, 2026-08-15). */
19195
19272
  includeStationary: boolean().optional()
19196
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19197
- deviceId: number(),
19198
- groupId: string().min(1)
19199
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19273
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19200
19274
  kind: "mutation",
19201
19275
  auth: "admin"
19202
19276
  }), 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({
@@ -19296,6 +19370,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19296
19370
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19297
19371
  kind: "query",
19298
19372
  auth: "admin"
19373
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19374
+ kind: "mutation",
19375
+ auth: "admin"
19376
+ }), method(object({}), MediaReclaimStatusSchema, {
19377
+ kind: "query",
19378
+ auth: "admin"
19299
19379
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19300
19380
  kind: "query",
19301
19381
  auth: "admin"
@@ -21266,7 +21346,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21266
21346
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21267
21347
  kind: "mutation",
21268
21348
  auth: "admin"
21269
- });
21349
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21350
+ kind: "mutation",
21351
+ auth: "admin"
21352
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21353
+ kind: "mutation",
21354
+ auth: "admin"
21355
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21270
21356
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21271
21357
  providerId: string().min(1),
21272
21358
  displayName: string().min(1),
@@ -26644,6 +26730,33 @@ var RecordingRebalanceInputSchema = object({
26644
26730
  minMoveGb: number().min(0).optional()
26645
26731
  });
26646
26732
  /**
26733
+ * Operator-facing placement of one camera onto a recordings location.
26734
+ *
26735
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
26736
+ * Auto (the planner may move this camera). `locationId` is where high/mid
26737
+ * currently write — the plan, which may disagree with the pin when Auto.
26738
+ */
26739
+ var RecordingDevicePlacementSchema = object({
26740
+ deviceId: number().int(),
26741
+ profile: string(),
26742
+ locationId: string()
26743
+ });
26744
+ var RecordingDevicePinSchema = object({
26745
+ deviceId: number().int(),
26746
+ /** Recordings-class location this camera is pinned to. */
26747
+ locationId: string()
26748
+ });
26749
+ var RecordingPlacementViewSchema = object({
26750
+ assignments: array(RecordingDevicePlacementSchema),
26751
+ pins: array(RecordingDevicePinSchema),
26752
+ defaultLocations: record(string(), string())
26753
+ });
26754
+ var RecordingSetDevicePlacementInputSchema = object({
26755
+ deviceId: number().int(),
26756
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
26757
+ locationId: string().nullable()
26758
+ });
26759
+ /**
26647
26760
  * Result of locating footage at a wall-clock instant for one device/profile.
26648
26761
  * `segment` carries the covering segment's window; `gap` reports the forward
26649
26762
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -26869,6 +26982,12 @@ method(object({
26869
26982
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
26870
26983
  kind: "mutation",
26871
26984
  auth: "admin"
26985
+ }), method(object({}), RecordingPlacementViewSchema, {
26986
+ kind: "query",
26987
+ auth: "admin"
26988
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
26989
+ kind: "mutation",
26990
+ auth: "admin"
26872
26991
  });
26873
26992
  /**
26874
26993
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -30239,6 +30358,12 @@ Object.freeze({
30239
30358
  addonId: null,
30240
30359
  access: "delete"
30241
30360
  },
30361
+ "deviceManager.renameLocation": {
30362
+ capName: "device-manager",
30363
+ capScope: "system",
30364
+ addonId: null,
30365
+ access: "create"
30366
+ },
30242
30367
  "deviceManager.runDeviceAction": {
30243
30368
  capName: "device-manager",
30244
30369
  capScope: "system",
@@ -31931,19 +32056,19 @@ Object.freeze({
31931
32056
  addonId: null,
31932
32057
  access: "view"
31933
32058
  },
31934
- "pipelineAnalytics.getGroup": {
32059
+ "pipelineAnalytics.getKeyEvents": {
31935
32060
  capName: "pipeline-analytics",
31936
32061
  capScope: "device",
31937
32062
  addonId: null,
31938
32063
  access: "view"
31939
32064
  },
31940
- "pipelineAnalytics.getKeyEvents": {
32065
+ "pipelineAnalytics.getKeyEventsBatch": {
31941
32066
  capName: "pipeline-analytics",
31942
32067
  capScope: "device",
31943
32068
  addonId: null,
31944
32069
  access: "view"
31945
32070
  },
31946
- "pipelineAnalytics.getKeyEventsBatch": {
32071
+ "pipelineAnalytics.getMediaReclaimStatus": {
31947
32072
  capName: "pipeline-analytics",
31948
32073
  capScope: "device",
31949
32074
  addonId: null,
@@ -32033,12 +32158,6 @@ Object.freeze({
32033
32158
  addonId: null,
32034
32159
  access: "view"
32035
32160
  },
32036
- "pipelineAnalytics.listGroups": {
32037
- capName: "pipeline-analytics",
32038
- capScope: "device",
32039
- addonId: null,
32040
- access: "view"
32041
- },
32042
32161
  "pipelineAnalytics.listOpsLog": {
32043
32162
  capName: "pipeline-analytics",
32044
32163
  capScope: "device",
@@ -32123,6 +32242,12 @@ Object.freeze({
32123
32242
  addonId: null,
32124
32243
  access: "create"
32125
32244
  },
32245
+ "pipelineAnalytics.reclaimDebugMedia": {
32246
+ capName: "pipeline-analytics",
32247
+ capScope: "device",
32248
+ addonId: null,
32249
+ access: "create"
32250
+ },
32126
32251
  "pipelineAnalytics.reconcileFromDisk": {
32127
32252
  capName: "pipeline-analytics",
32128
32253
  capScope: "device",
@@ -33047,6 +33172,12 @@ Object.freeze({
33047
33172
  addonId: null,
33048
33173
  access: "view"
33049
33174
  },
33175
+ "recording.getPlacement": {
33176
+ capName: "recording",
33177
+ capScope: "system",
33178
+ addonId: null,
33179
+ access: "view"
33180
+ },
33050
33181
  "recording.getPlaybackManifest": {
33051
33182
  capName: "recording",
33052
33183
  capScope: "system",
@@ -33173,6 +33304,12 @@ Object.freeze({
33173
33304
  addonId: null,
33174
33305
  access: "create"
33175
33306
  },
33307
+ "recording.setDevicePlacement": {
33308
+ capName: "recording",
33309
+ capScope: "system",
33310
+ addonId: null,
33311
+ access: "create"
33312
+ },
33176
33313
  "recording.startStorageMigrationMove": {
33177
33314
  capName: "recording",
33178
33315
  capScope: "system",
@@ -33617,12 +33754,36 @@ Object.freeze({
33617
33754
  addonId: null,
33618
33755
  access: "create"
33619
33756
  },
33757
+ "storageMigration.cleanupCancel": {
33758
+ capName: "storage-migration",
33759
+ capScope: "system",
33760
+ addonId: null,
33761
+ access: "create"
33762
+ },
33763
+ "storageMigration.cleanupStart": {
33764
+ capName: "storage-migration",
33765
+ capScope: "system",
33766
+ addonId: null,
33767
+ access: "create"
33768
+ },
33769
+ "storageMigration.cleanupStatus": {
33770
+ capName: "storage-migration",
33771
+ capScope: "system",
33772
+ addonId: null,
33773
+ access: "view"
33774
+ },
33620
33775
  "storageMigration.drain": {
33621
33776
  capName: "storage-migration",
33622
33777
  capScope: "system",
33623
33778
  addonId: null,
33624
33779
  access: "create"
33625
33780
  },
33781
+ "storageMigration.history": {
33782
+ capName: "storage-migration",
33783
+ capScope: "system",
33784
+ addonId: null,
33785
+ access: "view"
33786
+ },
33626
33787
  "storageMigration.movers": {
33627
33788
  capName: "storage-migration",
33628
33789
  capScope: "system",
@@ -35619,11 +35780,6 @@ Object.freeze({
35619
35780
  form: "single",
35620
35781
  optional: true
35621
35782
  }],
35622
- "pipelineAnalytics.getGroup": [{
35623
- name: "deviceId",
35624
- form: "single",
35625
- optional: false
35626
- }],
35627
35783
  "pipelineAnalytics.getKeyEvents": [{
35628
35784
  name: "deviceId",
35629
35785
  form: "single",
@@ -35689,11 +35845,6 @@ Object.freeze({
35689
35845
  form: "single",
35690
35846
  optional: false
35691
35847
  }],
35692
- "pipelineAnalytics.listGroups": [{
35693
- name: "deviceIds",
35694
- form: "array",
35695
- optional: false
35696
- }],
35697
35848
  "pipelineAnalytics.listOpsLog": [{
35698
35849
  name: "deviceId",
35699
35850
  form: "single",
@@ -35739,6 +35890,11 @@ Object.freeze({
35739
35890
  form: "single",
35740
35891
  optional: true
35741
35892
  }],
35893
+ "pipelineAnalytics.reclaimDebugMedia": [{
35894
+ name: "deviceIds",
35895
+ form: "array",
35896
+ optional: true
35897
+ }],
35742
35898
  "pipelineAnalytics.reconcileFromDisk": [{
35743
35899
  name: "deviceId",
35744
35900
  form: "single",
@@ -36104,6 +36260,11 @@ Object.freeze({
36104
36260
  form: "single",
36105
36261
  optional: false
36106
36262
  }],
36263
+ "recording.setDevicePlacement": [{
36264
+ name: "deviceId",
36265
+ form: "single",
36266
+ optional: false
36267
+ }],
36107
36268
  "recording.startStorageMigrationMove": [{
36108
36269
  name: "deviceId",
36109
36270
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-decoder-ffmpeg",
3
- "version": "1.2.49",
3
+ "version": "1.2.50",
4
4
  "description": "Standalone ffmpeg-subprocess decoder fallback addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",