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