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