@camstack/addon-decoder-ffmpeg 1.2.49 → 1.2.51

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 +236 -73
  2. package/dist/index.mjs +236 -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()
@@ -15626,6 +15704,8 @@ var NcSystemEventKindSchema = _enum([
15626
15704
  "device-offline",
15627
15705
  "device-disabled",
15628
15706
  "device-enabled",
15707
+ "device-battery-low",
15708
+ "device-battery-normal",
15629
15709
  "stream-online",
15630
15710
  "stream-offline",
15631
15711
  "node-online",
@@ -18844,46 +18924,6 @@ var RecentTracksPageSchema = object({
18844
18924
  /** Cursor for the next page, or null when this page is the last. */
18845
18925
  nextCursor: string().nullable()
18846
18926
  });
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
18927
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
18888
18928
  var KEY_EVENTS_MAX_LIMIT = 200;
18889
18929
  var KeyEventQueryInput = object({
@@ -18987,9 +19027,7 @@ var TrackCascadeCountsSchema = object({
18987
19027
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
18988
19028
  plates: number().int(),
18989
19029
  /** 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()
19030
+ embeddings: number().int()
18993
19031
  });
18994
19032
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
18995
19033
  var DiskReconcileCountsSchema = object({
@@ -19159,6 +19197,47 @@ var RebuildStatusSchema = object({
19159
19197
  /** Present when the pass ended by throwing. */
19160
19198
  error: string().nullable()
19161
19199
  });
19200
+ /**
19201
+ * Acknowledgement that a debug-media reclaim STARTED.
19202
+ *
19203
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19204
+ * it runs detached and this returns immediately. Awaiting it is how the
19205
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19206
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19207
+ */
19208
+ var MediaReclaimStartResultSchema = object({
19209
+ started: boolean(),
19210
+ /** True when a pass was already running; the new request is ignored. */
19211
+ alreadyRunning: boolean()
19212
+ });
19213
+ var MediaReclaimInputSchema = object({
19214
+ mode: _enum(["report", "reclaim"]).default("report"),
19215
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19216
+ deviceIds: array(number().int()).min(1).optional(),
19217
+ restart: boolean().optional(),
19218
+ pageSize: number().int().min(50).max(5e3).optional(),
19219
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19220
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19221
+ maxBytesPerRun: number().int().min(1).optional(),
19222
+ budgetMinutes: number().int().min(1).max(720).optional(),
19223
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19224
+ graceMinutes: number().int().min(1).max(10080).optional()
19225
+ });
19226
+ var MediaReclaimStatusSchema = object({
19227
+ running: boolean(),
19228
+ mode: _enum(["report", "reclaim"]).nullable(),
19229
+ totalExamined: number(),
19230
+ totalEligible: number(),
19231
+ totalReclaimed: number(),
19232
+ totalBytesReclaimed: number(),
19233
+ totalRefused: number(),
19234
+ /** Device+scope windows finished in this pass. */
19235
+ devicesDone: number(),
19236
+ complete: boolean().nullable(),
19237
+ startedAtMs: number().nullable(),
19238
+ finishedAtMs: number().nullable(),
19239
+ error: string().nullable()
19240
+ });
19162
19241
  var ReplayFrameInputSchema = object({
19163
19242
  timestamp: number(),
19164
19243
  frame: PipelineRunResultBridge
@@ -19197,10 +19276,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19197
19276
  * stationary registry). Default false: the timeline lists passages,
19198
19277
  * not parking records (operator decision, 2026-08-15). */
19199
19278
  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(), {
19279
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19204
19280
  kind: "mutation",
19205
19281
  auth: "admin"
19206
19282
  }), 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 +19376,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19300
19376
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19301
19377
  kind: "query",
19302
19378
  auth: "admin"
19379
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19380
+ kind: "mutation",
19381
+ auth: "admin"
19382
+ }), method(object({}), MediaReclaimStatusSchema, {
19383
+ kind: "query",
19384
+ auth: "admin"
19303
19385
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19304
19386
  kind: "query",
19305
19387
  auth: "admin"
@@ -21270,7 +21352,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21270
21352
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21271
21353
  kind: "mutation",
21272
21354
  auth: "admin"
21273
- });
21355
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21356
+ kind: "mutation",
21357
+ auth: "admin"
21358
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21359
+ kind: "mutation",
21360
+ auth: "admin"
21361
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21274
21362
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21275
21363
  providerId: string().min(1),
21276
21364
  displayName: string().min(1),
@@ -26648,6 +26736,33 @@ var RecordingRebalanceInputSchema = object({
26648
26736
  minMoveGb: number().min(0).optional()
26649
26737
  });
26650
26738
  /**
26739
+ * Operator-facing placement of one camera onto a recordings location.
26740
+ *
26741
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
26742
+ * Auto (the planner may move this camera). `locationId` is where high/mid
26743
+ * currently write — the plan, which may disagree with the pin when Auto.
26744
+ */
26745
+ var RecordingDevicePlacementSchema = object({
26746
+ deviceId: number().int(),
26747
+ profile: string(),
26748
+ locationId: string()
26749
+ });
26750
+ var RecordingDevicePinSchema = object({
26751
+ deviceId: number().int(),
26752
+ /** Recordings-class location this camera is pinned to. */
26753
+ locationId: string()
26754
+ });
26755
+ var RecordingPlacementViewSchema = object({
26756
+ assignments: array(RecordingDevicePlacementSchema),
26757
+ pins: array(RecordingDevicePinSchema),
26758
+ defaultLocations: record(string(), string())
26759
+ });
26760
+ var RecordingSetDevicePlacementInputSchema = object({
26761
+ deviceId: number().int(),
26762
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
26763
+ locationId: string().nullable()
26764
+ });
26765
+ /**
26651
26766
  * Result of locating footage at a wall-clock instant for one device/profile.
26652
26767
  * `segment` carries the covering segment's window; `gap` reports the forward
26653
26768
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -26873,6 +26988,12 @@ method(object({
26873
26988
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
26874
26989
  kind: "mutation",
26875
26990
  auth: "admin"
26991
+ }), method(object({}), RecordingPlacementViewSchema, {
26992
+ kind: "query",
26993
+ auth: "admin"
26994
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
26995
+ kind: "mutation",
26996
+ auth: "admin"
26876
26997
  });
26877
26998
  /**
26878
26999
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -30243,6 +30364,12 @@ Object.freeze({
30243
30364
  addonId: null,
30244
30365
  access: "delete"
30245
30366
  },
30367
+ "deviceManager.renameLocation": {
30368
+ capName: "device-manager",
30369
+ capScope: "system",
30370
+ addonId: null,
30371
+ access: "create"
30372
+ },
30246
30373
  "deviceManager.runDeviceAction": {
30247
30374
  capName: "device-manager",
30248
30375
  capScope: "system",
@@ -31935,19 +32062,19 @@ Object.freeze({
31935
32062
  addonId: null,
31936
32063
  access: "view"
31937
32064
  },
31938
- "pipelineAnalytics.getGroup": {
32065
+ "pipelineAnalytics.getKeyEvents": {
31939
32066
  capName: "pipeline-analytics",
31940
32067
  capScope: "device",
31941
32068
  addonId: null,
31942
32069
  access: "view"
31943
32070
  },
31944
- "pipelineAnalytics.getKeyEvents": {
32071
+ "pipelineAnalytics.getKeyEventsBatch": {
31945
32072
  capName: "pipeline-analytics",
31946
32073
  capScope: "device",
31947
32074
  addonId: null,
31948
32075
  access: "view"
31949
32076
  },
31950
- "pipelineAnalytics.getKeyEventsBatch": {
32077
+ "pipelineAnalytics.getMediaReclaimStatus": {
31951
32078
  capName: "pipeline-analytics",
31952
32079
  capScope: "device",
31953
32080
  addonId: null,
@@ -32037,12 +32164,6 @@ Object.freeze({
32037
32164
  addonId: null,
32038
32165
  access: "view"
32039
32166
  },
32040
- "pipelineAnalytics.listGroups": {
32041
- capName: "pipeline-analytics",
32042
- capScope: "device",
32043
- addonId: null,
32044
- access: "view"
32045
- },
32046
32167
  "pipelineAnalytics.listOpsLog": {
32047
32168
  capName: "pipeline-analytics",
32048
32169
  capScope: "device",
@@ -32127,6 +32248,12 @@ Object.freeze({
32127
32248
  addonId: null,
32128
32249
  access: "create"
32129
32250
  },
32251
+ "pipelineAnalytics.reclaimDebugMedia": {
32252
+ capName: "pipeline-analytics",
32253
+ capScope: "device",
32254
+ addonId: null,
32255
+ access: "create"
32256
+ },
32130
32257
  "pipelineAnalytics.reconcileFromDisk": {
32131
32258
  capName: "pipeline-analytics",
32132
32259
  capScope: "device",
@@ -33051,6 +33178,12 @@ Object.freeze({
33051
33178
  addonId: null,
33052
33179
  access: "view"
33053
33180
  },
33181
+ "recording.getPlacement": {
33182
+ capName: "recording",
33183
+ capScope: "system",
33184
+ addonId: null,
33185
+ access: "view"
33186
+ },
33054
33187
  "recording.getPlaybackManifest": {
33055
33188
  capName: "recording",
33056
33189
  capScope: "system",
@@ -33177,6 +33310,12 @@ Object.freeze({
33177
33310
  addonId: null,
33178
33311
  access: "create"
33179
33312
  },
33313
+ "recording.setDevicePlacement": {
33314
+ capName: "recording",
33315
+ capScope: "system",
33316
+ addonId: null,
33317
+ access: "create"
33318
+ },
33180
33319
  "recording.startStorageMigrationMove": {
33181
33320
  capName: "recording",
33182
33321
  capScope: "system",
@@ -33621,12 +33760,36 @@ Object.freeze({
33621
33760
  addonId: null,
33622
33761
  access: "create"
33623
33762
  },
33763
+ "storageMigration.cleanupCancel": {
33764
+ capName: "storage-migration",
33765
+ capScope: "system",
33766
+ addonId: null,
33767
+ access: "create"
33768
+ },
33769
+ "storageMigration.cleanupStart": {
33770
+ capName: "storage-migration",
33771
+ capScope: "system",
33772
+ addonId: null,
33773
+ access: "create"
33774
+ },
33775
+ "storageMigration.cleanupStatus": {
33776
+ capName: "storage-migration",
33777
+ capScope: "system",
33778
+ addonId: null,
33779
+ access: "view"
33780
+ },
33624
33781
  "storageMigration.drain": {
33625
33782
  capName: "storage-migration",
33626
33783
  capScope: "system",
33627
33784
  addonId: null,
33628
33785
  access: "create"
33629
33786
  },
33787
+ "storageMigration.history": {
33788
+ capName: "storage-migration",
33789
+ capScope: "system",
33790
+ addonId: null,
33791
+ access: "view"
33792
+ },
33630
33793
  "storageMigration.movers": {
33631
33794
  capName: "storage-migration",
33632
33795
  capScope: "system",
@@ -35623,11 +35786,6 @@ Object.freeze({
35623
35786
  form: "single",
35624
35787
  optional: true
35625
35788
  }],
35626
- "pipelineAnalytics.getGroup": [{
35627
- name: "deviceId",
35628
- form: "single",
35629
- optional: false
35630
- }],
35631
35789
  "pipelineAnalytics.getKeyEvents": [{
35632
35790
  name: "deviceId",
35633
35791
  form: "single",
@@ -35693,11 +35851,6 @@ Object.freeze({
35693
35851
  form: "single",
35694
35852
  optional: false
35695
35853
  }],
35696
- "pipelineAnalytics.listGroups": [{
35697
- name: "deviceIds",
35698
- form: "array",
35699
- optional: false
35700
- }],
35701
35854
  "pipelineAnalytics.listOpsLog": [{
35702
35855
  name: "deviceId",
35703
35856
  form: "single",
@@ -35743,6 +35896,11 @@ Object.freeze({
35743
35896
  form: "single",
35744
35897
  optional: true
35745
35898
  }],
35899
+ "pipelineAnalytics.reclaimDebugMedia": [{
35900
+ name: "deviceIds",
35901
+ form: "array",
35902
+ optional: true
35903
+ }],
35746
35904
  "pipelineAnalytics.reconcileFromDisk": [{
35747
35905
  name: "deviceId",
35748
35906
  form: "single",
@@ -36108,6 +36266,11 @@ Object.freeze({
36108
36266
  form: "single",
36109
36267
  optional: false
36110
36268
  }],
36269
+ "recording.setDevicePlacement": [{
36270
+ name: "deviceId",
36271
+ form: "single",
36272
+ optional: false
36273
+ }],
36111
36274
  "recording.startStorageMigrationMove": [{
36112
36275
  name: "deviceId",
36113
36276
  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()
@@ -15622,6 +15700,8 @@ var NcSystemEventKindSchema = _enum([
15622
15700
  "device-offline",
15623
15701
  "device-disabled",
15624
15702
  "device-enabled",
15703
+ "device-battery-low",
15704
+ "device-battery-normal",
15625
15705
  "stream-online",
15626
15706
  "stream-offline",
15627
15707
  "node-online",
@@ -18840,46 +18920,6 @@ var RecentTracksPageSchema = object({
18840
18920
  /** Cursor for the next page, or null when this page is the last. */
18841
18921
  nextCursor: string().nullable()
18842
18922
  });
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
18923
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
18884
18924
  var KEY_EVENTS_MAX_LIMIT = 200;
18885
18925
  var KeyEventQueryInput = object({
@@ -18983,9 +19023,7 @@ var TrackCascadeCountsSchema = object({
18983
19023
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
18984
19024
  plates: number().int(),
18985
19025
  /** 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()
19026
+ embeddings: number().int()
18989
19027
  });
18990
19028
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
18991
19029
  var DiskReconcileCountsSchema = object({
@@ -19155,6 +19193,47 @@ var RebuildStatusSchema = object({
19155
19193
  /** Present when the pass ended by throwing. */
19156
19194
  error: string().nullable()
19157
19195
  });
19196
+ /**
19197
+ * Acknowledgement that a debug-media reclaim STARTED.
19198
+ *
19199
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19200
+ * it runs detached and this returns immediately. Awaiting it is how the
19201
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19202
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19203
+ */
19204
+ var MediaReclaimStartResultSchema = object({
19205
+ started: boolean(),
19206
+ /** True when a pass was already running; the new request is ignored. */
19207
+ alreadyRunning: boolean()
19208
+ });
19209
+ var MediaReclaimInputSchema = object({
19210
+ mode: _enum(["report", "reclaim"]).default("report"),
19211
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19212
+ deviceIds: array(number().int()).min(1).optional(),
19213
+ restart: boolean().optional(),
19214
+ pageSize: number().int().min(50).max(5e3).optional(),
19215
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19216
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19217
+ maxBytesPerRun: number().int().min(1).optional(),
19218
+ budgetMinutes: number().int().min(1).max(720).optional(),
19219
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19220
+ graceMinutes: number().int().min(1).max(10080).optional()
19221
+ });
19222
+ var MediaReclaimStatusSchema = object({
19223
+ running: boolean(),
19224
+ mode: _enum(["report", "reclaim"]).nullable(),
19225
+ totalExamined: number(),
19226
+ totalEligible: number(),
19227
+ totalReclaimed: number(),
19228
+ totalBytesReclaimed: number(),
19229
+ totalRefused: number(),
19230
+ /** Device+scope windows finished in this pass. */
19231
+ devicesDone: number(),
19232
+ complete: boolean().nullable(),
19233
+ startedAtMs: number().nullable(),
19234
+ finishedAtMs: number().nullable(),
19235
+ error: string().nullable()
19236
+ });
19158
19237
  var ReplayFrameInputSchema = object({
19159
19238
  timestamp: number(),
19160
19239
  frame: PipelineRunResultBridge
@@ -19193,10 +19272,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19193
19272
  * stationary registry). Default false: the timeline lists passages,
19194
19273
  * not parking records (operator decision, 2026-08-15). */
19195
19274
  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(), {
19275
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19200
19276
  kind: "mutation",
19201
19277
  auth: "admin"
19202
19278
  }), 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 +19372,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19296
19372
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19297
19373
  kind: "query",
19298
19374
  auth: "admin"
19375
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19376
+ kind: "mutation",
19377
+ auth: "admin"
19378
+ }), method(object({}), MediaReclaimStatusSchema, {
19379
+ kind: "query",
19380
+ auth: "admin"
19299
19381
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19300
19382
  kind: "query",
19301
19383
  auth: "admin"
@@ -21266,7 +21348,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21266
21348
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21267
21349
  kind: "mutation",
21268
21350
  auth: "admin"
21269
- });
21351
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21352
+ kind: "mutation",
21353
+ auth: "admin"
21354
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21355
+ kind: "mutation",
21356
+ auth: "admin"
21357
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21270
21358
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21271
21359
  providerId: string().min(1),
21272
21360
  displayName: string().min(1),
@@ -26644,6 +26732,33 @@ var RecordingRebalanceInputSchema = object({
26644
26732
  minMoveGb: number().min(0).optional()
26645
26733
  });
26646
26734
  /**
26735
+ * Operator-facing placement of one camera onto a recordings location.
26736
+ *
26737
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
26738
+ * Auto (the planner may move this camera). `locationId` is where high/mid
26739
+ * currently write — the plan, which may disagree with the pin when Auto.
26740
+ */
26741
+ var RecordingDevicePlacementSchema = object({
26742
+ deviceId: number().int(),
26743
+ profile: string(),
26744
+ locationId: string()
26745
+ });
26746
+ var RecordingDevicePinSchema = object({
26747
+ deviceId: number().int(),
26748
+ /** Recordings-class location this camera is pinned to. */
26749
+ locationId: string()
26750
+ });
26751
+ var RecordingPlacementViewSchema = object({
26752
+ assignments: array(RecordingDevicePlacementSchema),
26753
+ pins: array(RecordingDevicePinSchema),
26754
+ defaultLocations: record(string(), string())
26755
+ });
26756
+ var RecordingSetDevicePlacementInputSchema = object({
26757
+ deviceId: number().int(),
26758
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
26759
+ locationId: string().nullable()
26760
+ });
26761
+ /**
26647
26762
  * Result of locating footage at a wall-clock instant for one device/profile.
26648
26763
  * `segment` carries the covering segment's window; `gap` reports the forward
26649
26764
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -26869,6 +26984,12 @@ method(object({
26869
26984
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
26870
26985
  kind: "mutation",
26871
26986
  auth: "admin"
26987
+ }), method(object({}), RecordingPlacementViewSchema, {
26988
+ kind: "query",
26989
+ auth: "admin"
26990
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
26991
+ kind: "mutation",
26992
+ auth: "admin"
26872
26993
  });
26873
26994
  /**
26874
26995
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -30239,6 +30360,12 @@ Object.freeze({
30239
30360
  addonId: null,
30240
30361
  access: "delete"
30241
30362
  },
30363
+ "deviceManager.renameLocation": {
30364
+ capName: "device-manager",
30365
+ capScope: "system",
30366
+ addonId: null,
30367
+ access: "create"
30368
+ },
30242
30369
  "deviceManager.runDeviceAction": {
30243
30370
  capName: "device-manager",
30244
30371
  capScope: "system",
@@ -31931,19 +32058,19 @@ Object.freeze({
31931
32058
  addonId: null,
31932
32059
  access: "view"
31933
32060
  },
31934
- "pipelineAnalytics.getGroup": {
32061
+ "pipelineAnalytics.getKeyEvents": {
31935
32062
  capName: "pipeline-analytics",
31936
32063
  capScope: "device",
31937
32064
  addonId: null,
31938
32065
  access: "view"
31939
32066
  },
31940
- "pipelineAnalytics.getKeyEvents": {
32067
+ "pipelineAnalytics.getKeyEventsBatch": {
31941
32068
  capName: "pipeline-analytics",
31942
32069
  capScope: "device",
31943
32070
  addonId: null,
31944
32071
  access: "view"
31945
32072
  },
31946
- "pipelineAnalytics.getKeyEventsBatch": {
32073
+ "pipelineAnalytics.getMediaReclaimStatus": {
31947
32074
  capName: "pipeline-analytics",
31948
32075
  capScope: "device",
31949
32076
  addonId: null,
@@ -32033,12 +32160,6 @@ Object.freeze({
32033
32160
  addonId: null,
32034
32161
  access: "view"
32035
32162
  },
32036
- "pipelineAnalytics.listGroups": {
32037
- capName: "pipeline-analytics",
32038
- capScope: "device",
32039
- addonId: null,
32040
- access: "view"
32041
- },
32042
32163
  "pipelineAnalytics.listOpsLog": {
32043
32164
  capName: "pipeline-analytics",
32044
32165
  capScope: "device",
@@ -32123,6 +32244,12 @@ Object.freeze({
32123
32244
  addonId: null,
32124
32245
  access: "create"
32125
32246
  },
32247
+ "pipelineAnalytics.reclaimDebugMedia": {
32248
+ capName: "pipeline-analytics",
32249
+ capScope: "device",
32250
+ addonId: null,
32251
+ access: "create"
32252
+ },
32126
32253
  "pipelineAnalytics.reconcileFromDisk": {
32127
32254
  capName: "pipeline-analytics",
32128
32255
  capScope: "device",
@@ -33047,6 +33174,12 @@ Object.freeze({
33047
33174
  addonId: null,
33048
33175
  access: "view"
33049
33176
  },
33177
+ "recording.getPlacement": {
33178
+ capName: "recording",
33179
+ capScope: "system",
33180
+ addonId: null,
33181
+ access: "view"
33182
+ },
33050
33183
  "recording.getPlaybackManifest": {
33051
33184
  capName: "recording",
33052
33185
  capScope: "system",
@@ -33173,6 +33306,12 @@ Object.freeze({
33173
33306
  addonId: null,
33174
33307
  access: "create"
33175
33308
  },
33309
+ "recording.setDevicePlacement": {
33310
+ capName: "recording",
33311
+ capScope: "system",
33312
+ addonId: null,
33313
+ access: "create"
33314
+ },
33176
33315
  "recording.startStorageMigrationMove": {
33177
33316
  capName: "recording",
33178
33317
  capScope: "system",
@@ -33617,12 +33756,36 @@ Object.freeze({
33617
33756
  addonId: null,
33618
33757
  access: "create"
33619
33758
  },
33759
+ "storageMigration.cleanupCancel": {
33760
+ capName: "storage-migration",
33761
+ capScope: "system",
33762
+ addonId: null,
33763
+ access: "create"
33764
+ },
33765
+ "storageMigration.cleanupStart": {
33766
+ capName: "storage-migration",
33767
+ capScope: "system",
33768
+ addonId: null,
33769
+ access: "create"
33770
+ },
33771
+ "storageMigration.cleanupStatus": {
33772
+ capName: "storage-migration",
33773
+ capScope: "system",
33774
+ addonId: null,
33775
+ access: "view"
33776
+ },
33620
33777
  "storageMigration.drain": {
33621
33778
  capName: "storage-migration",
33622
33779
  capScope: "system",
33623
33780
  addonId: null,
33624
33781
  access: "create"
33625
33782
  },
33783
+ "storageMigration.history": {
33784
+ capName: "storage-migration",
33785
+ capScope: "system",
33786
+ addonId: null,
33787
+ access: "view"
33788
+ },
33626
33789
  "storageMigration.movers": {
33627
33790
  capName: "storage-migration",
33628
33791
  capScope: "system",
@@ -35619,11 +35782,6 @@ Object.freeze({
35619
35782
  form: "single",
35620
35783
  optional: true
35621
35784
  }],
35622
- "pipelineAnalytics.getGroup": [{
35623
- name: "deviceId",
35624
- form: "single",
35625
- optional: false
35626
- }],
35627
35785
  "pipelineAnalytics.getKeyEvents": [{
35628
35786
  name: "deviceId",
35629
35787
  form: "single",
@@ -35689,11 +35847,6 @@ Object.freeze({
35689
35847
  form: "single",
35690
35848
  optional: false
35691
35849
  }],
35692
- "pipelineAnalytics.listGroups": [{
35693
- name: "deviceIds",
35694
- form: "array",
35695
- optional: false
35696
- }],
35697
35850
  "pipelineAnalytics.listOpsLog": [{
35698
35851
  name: "deviceId",
35699
35852
  form: "single",
@@ -35739,6 +35892,11 @@ Object.freeze({
35739
35892
  form: "single",
35740
35893
  optional: true
35741
35894
  }],
35895
+ "pipelineAnalytics.reclaimDebugMedia": [{
35896
+ name: "deviceIds",
35897
+ form: "array",
35898
+ optional: true
35899
+ }],
35742
35900
  "pipelineAnalytics.reconcileFromDisk": [{
35743
35901
  name: "deviceId",
35744
35902
  form: "single",
@@ -36104,6 +36262,11 @@ Object.freeze({
36104
36262
  form: "single",
36105
36263
  optional: false
36106
36264
  }],
36265
+ "recording.setDevicePlacement": [{
36266
+ name: "deviceId",
36267
+ form: "single",
36268
+ optional: false
36269
+ }],
36107
36270
  "recording.startStorageMigrationMove": [{
36108
36271
  name: "deviceId",
36109
36272
  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.51",
4
4
  "description": "Standalone ffmpeg-subprocess decoder fallback addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",