@camstack/addon-provider-amcrest 0.2.50 → 0.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/addon.js +234 -73
  2. package/dist/addon.mjs +234 -73
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -8089,6 +8089,13 @@ var MediaRelocateModeSchema = _enum([
8089
8089
  ]);
8090
8090
  var RelocateMediaInputSchema = object({
8091
8091
  toLocationId: string(),
8092
+ /**
8093
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8094
+ * every row that is not already on `toLocationId` (the historical
8095
+ * behaviour). A named source is what a from→to migration needs: without it
8096
+ * "move events off disk 2" also emptied disk 1.
8097
+ */
8098
+ fromLocationId: string().optional(),
8092
8099
  throttleMbps: number().min(1).max(1e3).optional(),
8093
8100
  /** Omitted = `move`, the pre-existing behaviour. */
8094
8101
  mode: MediaRelocateModeSchema.optional()
@@ -8156,6 +8163,19 @@ var StorageMigrationDestinationsSchema = object({
8156
8163
  galleryMedia: string().min(1).optional()
8157
8164
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8158
8165
  /**
8166
+ * Optional named source per class. Omitted = the class's current default
8167
+ * (the historical behaviour). A named source that is NOT the default is a
8168
+ * drain of that disk: bytes move, the default stays, and the source is
8169
+ * disabled when the move finishes.
8170
+ */
8171
+ var StorageMigrationSourcesSchema = object({
8172
+ recordings: string().min(1).optional(),
8173
+ recordingsLow: string().min(1).optional(),
8174
+ eventMedia: string().min(1).optional(),
8175
+ backups: string().min(1).optional(),
8176
+ galleryMedia: string().min(1).optional()
8177
+ }).optional();
8178
+ /**
8159
8179
  * How a migration sequences the cutover against the byte move.
8160
8180
  *
8161
8181
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8177,6 +8197,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8177
8197
  /** Shared input for planning and starting an orchestrated storage migration. */
8178
8198
  var StorageMigrationInputSchema = object({
8179
8199
  destinations: StorageMigrationDestinationsSchema,
8200
+ /** Omitted = each class's current default. */
8201
+ sources: StorageMigrationSourcesSchema,
8180
8202
  throttleMbps: number().min(1).max(1e3).optional(),
8181
8203
  /** Omitted = `blocking`, which stays the default. */
8182
8204
  mode: StorageMigrationModeSchema.optional()
@@ -8256,6 +8278,13 @@ var StorageMigrationMoveSchema = object({
8256
8278
  storageClass: StorageMigrationClassSchema,
8257
8279
  fromLocationId: string(),
8258
8280
  toLocationId: string(),
8281
+ /**
8282
+ * True when `from` was NOT the class default at plan time. The move still
8283
+ * copies bytes, but the default is left alone and the source is disabled
8284
+ * once the copy verifies. Absent on jobs planned before this field existed
8285
+ * — those jobs always repointed, which is `false`.
8286
+ */
8287
+ freezeSource: boolean().optional(),
8259
8288
  moverJobId: string().nullable(),
8260
8289
  state: RelocateJobStateSchema.nullable(),
8261
8290
  error: string().nullable(),
@@ -8269,6 +8298,7 @@ var StorageMigrationJobSchema = object({
8269
8298
  * can tell a seconds-long cutover from a thirty-hour one. */
8270
8299
  mode: StorageMigrationModeSchema,
8271
8300
  destinations: StorageMigrationDestinationsSchema,
8301
+ sources: StorageMigrationSourcesSchema,
8272
8302
  throttleMbps: number(),
8273
8303
  moves: array(StorageMigrationMoveSchema),
8274
8304
  pauseLeaseId: string().nullable(),
@@ -8294,6 +8324,7 @@ var StorageMigrationFindingSchema = object({
8294
8324
  });
8295
8325
  var StorageMigrationPlanSchema = object({
8296
8326
  destinations: StorageMigrationDestinationsSchema,
8327
+ sources: StorageMigrationSourcesSchema,
8297
8328
  /** The mode this plan was built for. A plan is only valid for its mode: the
8298
8329
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8299
8330
  * it. */
@@ -8301,7 +8332,8 @@ var StorageMigrationPlanSchema = object({
8301
8332
  moves: array(object({
8302
8333
  storageClass: StorageMigrationClassSchema,
8303
8334
  fromLocationId: string(),
8304
- toLocationId: string()
8335
+ toLocationId: string(),
8336
+ freezeSource: boolean().optional()
8305
8337
  })),
8306
8338
  findings: array(StorageMigrationFindingSchema)
8307
8339
  });
@@ -8479,10 +8511,51 @@ var LedgerWalkReportSchema = object({
8479
8511
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8480
8512
  var RelocatableMediaCountInputSchema = object({
8481
8513
  toLocationId: string().min(1),
8514
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8515
+ fromLocationId: string().optional(),
8482
8516
  /** Omitted = `move`. */
8483
8517
  mode: MediaRelocateModeSchema.optional()
8484
8518
  });
8485
8519
  /**
8520
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8521
+ * ghost ledger entries on frozen footage locations.
8522
+ *
8523
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8524
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8525
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8526
+ * with no operator-visible status.
8527
+ */
8528
+ var StorageCleanupPhaseSchema = _enum([
8529
+ "orphans",
8530
+ "debug-media",
8531
+ "ghost-ledger",
8532
+ "done",
8533
+ "failed",
8534
+ "cancelled"
8535
+ ]);
8536
+ var StorageCleanupInputSchema = object({
8537
+ /** Also walk motion stills / track filmstrips. Off by default. */
8538
+ includeDebugMedia: boolean().optional() });
8539
+ var StorageCleanupJobSchema = object({
8540
+ jobId: string(),
8541
+ phase: StorageCleanupPhaseSchema,
8542
+ includeDebugMedia: boolean(),
8543
+ orphansReclaimed: number().int().nonnegative(),
8544
+ orphanBytesReclaimed: number().int().nonnegative(),
8545
+ debugMediaReclaimed: number().int().nonnegative(),
8546
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8547
+ ghostsForgotten: number().int().nonnegative(),
8548
+ ghostBytesForgotten: number().int().nonnegative(),
8549
+ /** Short operator-facing line: current collection, pass, or location. */
8550
+ detail: string().nullable(),
8551
+ cancelRequested: boolean(),
8552
+ startedAt: number(),
8553
+ updatedAt: number(),
8554
+ finishedAt: number().nullable(),
8555
+ error: string().nullable()
8556
+ });
8557
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8558
+ /**
8486
8559
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8487
8560
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8488
8561
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8510,11 +8583,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8510
8583
  * The default location for a type uses `id === <type>:default` by
8511
8584
  * convention (the bare type ref like `'backups'` resolves to it).
8512
8585
  *
8513
- * `isSystem: true` marks a location as orchestrator-seeded and
8514
- * undeletable. The bootstrap-installed defaults (one per type) carry
8515
- * this flag; operator-added locations don't. Editing the config of
8516
- * a system location is allowed (path migration, provider swap) but
8517
- * deleting it is rejected at the cap level.
8586
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8587
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8588
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8589
+ * / last-enabled, not on this bit.
8518
8590
  */
8519
8591
  var StorageLocationSchema = object({
8520
8592
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -13040,6 +13112,12 @@ method(object({
13040
13112
  }), _void(), {
13041
13113
  kind: "mutation",
13042
13114
  auth: "admin"
13115
+ }), method(object({
13116
+ from: string(),
13117
+ to: string()
13118
+ }), object({ moved: number() }), {
13119
+ kind: "mutation",
13120
+ auth: "admin"
13043
13121
  }), method(object({
13044
13122
  deviceId: number(),
13045
13123
  disabled: boolean()
@@ -19048,46 +19126,6 @@ var RecentTracksPageSchema = object({
19048
19126
  /** Cursor for the next page, or null when this page is the last. */
19049
19127
  nextCursor: string().nullable()
19050
19128
  });
19051
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
19052
- var LIST_GROUPS_MAX_LIMIT = 100;
19053
- var AnalyticsGroupRecordSchema = object({
19054
- id: string(),
19055
- deviceId: number().int(),
19056
- openedAt: number().int(),
19057
- closedAt: number().int(),
19058
- timestamp: number().int(),
19059
- memberCount: number().int(),
19060
- memberTrackIds: array(string()).readonly(),
19061
- className: string(),
19062
- classes: array(string()).readonly(),
19063
- /** Relative event-media path, or null when the group has no picture yet. */
19064
- mediaUrl: string().nullable(),
19065
- singleton: boolean()
19066
- });
19067
- var AnalyticsGroupMemberSchema = object({
19068
- trackId: string(),
19069
- deviceId: number().int(),
19070
- className: string(),
19071
- firstSeen: number().int(),
19072
- lastSeen: number().int(),
19073
- mediaUrl: string().nullable()
19074
- });
19075
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
19076
- var ListGroupsQueryInput = object({
19077
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
19078
- deviceIds: array(number()),
19079
- /** Window lower bound on `closedAt` (inclusive). */
19080
- since: number().optional(),
19081
- /** Window upper bound on `openedAt` (inclusive). */
19082
- until: number().optional(),
19083
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
19084
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
19085
- cursor: string().optional()
19086
- });
19087
- var ListGroupsPageSchema = object({
19088
- groups: array(AnalyticsGroupRecordSchema).readonly(),
19089
- nextCursor: string().nullable()
19090
- });
19091
19129
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19092
19130
  var KEY_EVENTS_MAX_LIMIT = 200;
19093
19131
  var KeyEventQueryInput = object({
@@ -19191,9 +19229,7 @@ var TrackCascadeCountsSchema = object({
19191
19229
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19192
19230
  plates: number().int(),
19193
19231
  /** Per-track CLIP search vectors removed (best-effort). */
19194
- embeddings: number().int(),
19195
- /** Group membership + group rows removed with their last member (best-effort). */
19196
- groups: number().int()
19232
+ embeddings: number().int()
19197
19233
  });
19198
19234
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19199
19235
  var DiskReconcileCountsSchema = object({
@@ -19363,6 +19399,47 @@ var RebuildStatusSchema = object({
19363
19399
  /** Present when the pass ended by throwing. */
19364
19400
  error: string().nullable()
19365
19401
  });
19402
+ /**
19403
+ * Acknowledgement that a debug-media reclaim STARTED.
19404
+ *
19405
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19406
+ * it runs detached and this returns immediately. Awaiting it is how the
19407
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19408
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19409
+ */
19410
+ var MediaReclaimStartResultSchema = object({
19411
+ started: boolean(),
19412
+ /** True when a pass was already running; the new request is ignored. */
19413
+ alreadyRunning: boolean()
19414
+ });
19415
+ var MediaReclaimInputSchema = object({
19416
+ mode: _enum(["report", "reclaim"]).default("report"),
19417
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19418
+ deviceIds: array(number().int()).min(1).optional(),
19419
+ restart: boolean().optional(),
19420
+ pageSize: number().int().min(50).max(5e3).optional(),
19421
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19422
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19423
+ maxBytesPerRun: number().int().min(1).optional(),
19424
+ budgetMinutes: number().int().min(1).max(720).optional(),
19425
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19426
+ graceMinutes: number().int().min(1).max(10080).optional()
19427
+ });
19428
+ var MediaReclaimStatusSchema = object({
19429
+ running: boolean(),
19430
+ mode: _enum(["report", "reclaim"]).nullable(),
19431
+ totalExamined: number(),
19432
+ totalEligible: number(),
19433
+ totalReclaimed: number(),
19434
+ totalBytesReclaimed: number(),
19435
+ totalRefused: number(),
19436
+ /** Device+scope windows finished in this pass. */
19437
+ devicesDone: number(),
19438
+ complete: boolean().nullable(),
19439
+ startedAtMs: number().nullable(),
19440
+ finishedAtMs: number().nullable(),
19441
+ error: string().nullable()
19442
+ });
19366
19443
  var ReplayFrameInputSchema = object({
19367
19444
  timestamp: number(),
19368
19445
  frame: PipelineRunResultBridge
@@ -19401,10 +19478,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19401
19478
  * stationary registry). Default false: the timeline lists passages,
19402
19479
  * not parking records (operator decision, 2026-08-15). */
19403
19480
  includeStationary: boolean().optional()
19404
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19405
- deviceId: number(),
19406
- groupId: string().min(1)
19407
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19481
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19408
19482
  kind: "mutation",
19409
19483
  auth: "admin"
19410
19484
  }), 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({
@@ -19504,6 +19578,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19504
19578
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19505
19579
  kind: "query",
19506
19580
  auth: "admin"
19581
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19582
+ kind: "mutation",
19583
+ auth: "admin"
19584
+ }), method(object({}), MediaReclaimStatusSchema, {
19585
+ kind: "query",
19586
+ auth: "admin"
19507
19587
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19508
19588
  kind: "query",
19509
19589
  auth: "admin"
@@ -21578,7 +21658,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21578
21658
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21579
21659
  kind: "mutation",
21580
21660
  auth: "admin"
21581
- });
21661
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21662
+ kind: "mutation",
21663
+ auth: "admin"
21664
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21665
+ kind: "mutation",
21666
+ auth: "admin"
21667
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21582
21668
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21583
21669
  providerId: string().min(1),
21584
21670
  displayName: string().min(1),
@@ -28759,6 +28845,33 @@ var RecordingRebalanceInputSchema = object({
28759
28845
  minMoveGb: number().min(0).optional()
28760
28846
  });
28761
28847
  /**
28848
+ * Operator-facing placement of one camera onto a recordings location.
28849
+ *
28850
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
28851
+ * Auto (the planner may move this camera). `locationId` is where high/mid
28852
+ * currently write — the plan, which may disagree with the pin when Auto.
28853
+ */
28854
+ var RecordingDevicePlacementSchema = object({
28855
+ deviceId: number().int(),
28856
+ profile: string(),
28857
+ locationId: string()
28858
+ });
28859
+ var RecordingDevicePinSchema = object({
28860
+ deviceId: number().int(),
28861
+ /** Recordings-class location this camera is pinned to. */
28862
+ locationId: string()
28863
+ });
28864
+ var RecordingPlacementViewSchema = object({
28865
+ assignments: array(RecordingDevicePlacementSchema),
28866
+ pins: array(RecordingDevicePinSchema),
28867
+ defaultLocations: record(string(), string())
28868
+ });
28869
+ var RecordingSetDevicePlacementInputSchema = object({
28870
+ deviceId: number().int(),
28871
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
28872
+ locationId: string().nullable()
28873
+ });
28874
+ /**
28762
28875
  * Result of locating footage at a wall-clock instant for one device/profile.
28763
28876
  * `segment` carries the covering segment's window; `gap` reports the forward
28764
28877
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -28984,6 +29097,12 @@ method(object({
28984
29097
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
28985
29098
  kind: "mutation",
28986
29099
  auth: "admin"
29100
+ }), method(object({}), RecordingPlacementViewSchema, {
29101
+ kind: "query",
29102
+ auth: "admin"
29103
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29104
+ kind: "mutation",
29105
+ auth: "admin"
28987
29106
  });
28988
29107
  /**
28989
29108
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -34457,6 +34576,12 @@ Object.freeze({
34457
34576
  addonId: null,
34458
34577
  access: "delete"
34459
34578
  },
34579
+ "deviceManager.renameLocation": {
34580
+ capName: "device-manager",
34581
+ capScope: "system",
34582
+ addonId: null,
34583
+ access: "create"
34584
+ },
34460
34585
  "deviceManager.runDeviceAction": {
34461
34586
  capName: "device-manager",
34462
34587
  capScope: "system",
@@ -36149,19 +36274,19 @@ Object.freeze({
36149
36274
  addonId: null,
36150
36275
  access: "view"
36151
36276
  },
36152
- "pipelineAnalytics.getGroup": {
36277
+ "pipelineAnalytics.getKeyEvents": {
36153
36278
  capName: "pipeline-analytics",
36154
36279
  capScope: "device",
36155
36280
  addonId: null,
36156
36281
  access: "view"
36157
36282
  },
36158
- "pipelineAnalytics.getKeyEvents": {
36283
+ "pipelineAnalytics.getKeyEventsBatch": {
36159
36284
  capName: "pipeline-analytics",
36160
36285
  capScope: "device",
36161
36286
  addonId: null,
36162
36287
  access: "view"
36163
36288
  },
36164
- "pipelineAnalytics.getKeyEventsBatch": {
36289
+ "pipelineAnalytics.getMediaReclaimStatus": {
36165
36290
  capName: "pipeline-analytics",
36166
36291
  capScope: "device",
36167
36292
  addonId: null,
@@ -36251,12 +36376,6 @@ Object.freeze({
36251
36376
  addonId: null,
36252
36377
  access: "view"
36253
36378
  },
36254
- "pipelineAnalytics.listGroups": {
36255
- capName: "pipeline-analytics",
36256
- capScope: "device",
36257
- addonId: null,
36258
- access: "view"
36259
- },
36260
36379
  "pipelineAnalytics.listOpsLog": {
36261
36380
  capName: "pipeline-analytics",
36262
36381
  capScope: "device",
@@ -36341,6 +36460,12 @@ Object.freeze({
36341
36460
  addonId: null,
36342
36461
  access: "create"
36343
36462
  },
36463
+ "pipelineAnalytics.reclaimDebugMedia": {
36464
+ capName: "pipeline-analytics",
36465
+ capScope: "device",
36466
+ addonId: null,
36467
+ access: "create"
36468
+ },
36344
36469
  "pipelineAnalytics.reconcileFromDisk": {
36345
36470
  capName: "pipeline-analytics",
36346
36471
  capScope: "device",
@@ -37265,6 +37390,12 @@ Object.freeze({
37265
37390
  addonId: null,
37266
37391
  access: "view"
37267
37392
  },
37393
+ "recording.getPlacement": {
37394
+ capName: "recording",
37395
+ capScope: "system",
37396
+ addonId: null,
37397
+ access: "view"
37398
+ },
37268
37399
  "recording.getPlaybackManifest": {
37269
37400
  capName: "recording",
37270
37401
  capScope: "system",
@@ -37391,6 +37522,12 @@ Object.freeze({
37391
37522
  addonId: null,
37392
37523
  access: "create"
37393
37524
  },
37525
+ "recording.setDevicePlacement": {
37526
+ capName: "recording",
37527
+ capScope: "system",
37528
+ addonId: null,
37529
+ access: "create"
37530
+ },
37394
37531
  "recording.startStorageMigrationMove": {
37395
37532
  capName: "recording",
37396
37533
  capScope: "system",
@@ -37835,12 +37972,36 @@ Object.freeze({
37835
37972
  addonId: null,
37836
37973
  access: "create"
37837
37974
  },
37975
+ "storageMigration.cleanupCancel": {
37976
+ capName: "storage-migration",
37977
+ capScope: "system",
37978
+ addonId: null,
37979
+ access: "create"
37980
+ },
37981
+ "storageMigration.cleanupStart": {
37982
+ capName: "storage-migration",
37983
+ capScope: "system",
37984
+ addonId: null,
37985
+ access: "create"
37986
+ },
37987
+ "storageMigration.cleanupStatus": {
37988
+ capName: "storage-migration",
37989
+ capScope: "system",
37990
+ addonId: null,
37991
+ access: "view"
37992
+ },
37838
37993
  "storageMigration.drain": {
37839
37994
  capName: "storage-migration",
37840
37995
  capScope: "system",
37841
37996
  addonId: null,
37842
37997
  access: "create"
37843
37998
  },
37999
+ "storageMigration.history": {
38000
+ capName: "storage-migration",
38001
+ capScope: "system",
38002
+ addonId: null,
38003
+ access: "view"
38004
+ },
37844
38005
  "storageMigration.movers": {
37845
38006
  capName: "storage-migration",
37846
38007
  capScope: "system",
@@ -39837,11 +39998,6 @@ Object.freeze({
39837
39998
  form: "single",
39838
39999
  optional: true
39839
40000
  }],
39840
- "pipelineAnalytics.getGroup": [{
39841
- name: "deviceId",
39842
- form: "single",
39843
- optional: false
39844
- }],
39845
40001
  "pipelineAnalytics.getKeyEvents": [{
39846
40002
  name: "deviceId",
39847
40003
  form: "single",
@@ -39907,11 +40063,6 @@ Object.freeze({
39907
40063
  form: "single",
39908
40064
  optional: false
39909
40065
  }],
39910
- "pipelineAnalytics.listGroups": [{
39911
- name: "deviceIds",
39912
- form: "array",
39913
- optional: false
39914
- }],
39915
40066
  "pipelineAnalytics.listOpsLog": [{
39916
40067
  name: "deviceId",
39917
40068
  form: "single",
@@ -39957,6 +40108,11 @@ Object.freeze({
39957
40108
  form: "single",
39958
40109
  optional: true
39959
40110
  }],
40111
+ "pipelineAnalytics.reclaimDebugMedia": [{
40112
+ name: "deviceIds",
40113
+ form: "array",
40114
+ optional: true
40115
+ }],
39960
40116
  "pipelineAnalytics.reconcileFromDisk": [{
39961
40117
  name: "deviceId",
39962
40118
  form: "single",
@@ -40322,6 +40478,11 @@ Object.freeze({
40322
40478
  form: "single",
40323
40479
  optional: false
40324
40480
  }],
40481
+ "recording.setDevicePlacement": [{
40482
+ name: "deviceId",
40483
+ form: "single",
40484
+ optional: false
40485
+ }],
40325
40486
  "recording.startStorageMigrationMove": [{
40326
40487
  name: "deviceId",
40327
40488
  form: "single",
package/dist/addon.mjs CHANGED
@@ -8090,6 +8090,13 @@ var MediaRelocateModeSchema = _enum([
8090
8090
  ]);
8091
8091
  var RelocateMediaInputSchema = object({
8092
8092
  toLocationId: string(),
8093
+ /**
8094
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8095
+ * every row that is not already on `toLocationId` (the historical
8096
+ * behaviour). A named source is what a from→to migration needs: without it
8097
+ * "move events off disk 2" also emptied disk 1.
8098
+ */
8099
+ fromLocationId: string().optional(),
8093
8100
  throttleMbps: number().min(1).max(1e3).optional(),
8094
8101
  /** Omitted = `move`, the pre-existing behaviour. */
8095
8102
  mode: MediaRelocateModeSchema.optional()
@@ -8157,6 +8164,19 @@ var StorageMigrationDestinationsSchema = object({
8157
8164
  galleryMedia: string().min(1).optional()
8158
8165
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8159
8166
  /**
8167
+ * Optional named source per class. Omitted = the class's current default
8168
+ * (the historical behaviour). A named source that is NOT the default is a
8169
+ * drain of that disk: bytes move, the default stays, and the source is
8170
+ * disabled when the move finishes.
8171
+ */
8172
+ var StorageMigrationSourcesSchema = object({
8173
+ recordings: string().min(1).optional(),
8174
+ recordingsLow: string().min(1).optional(),
8175
+ eventMedia: string().min(1).optional(),
8176
+ backups: string().min(1).optional(),
8177
+ galleryMedia: string().min(1).optional()
8178
+ }).optional();
8179
+ /**
8160
8180
  * How a migration sequences the cutover against the byte move.
8161
8181
  *
8162
8182
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8178,6 +8198,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8178
8198
  /** Shared input for planning and starting an orchestrated storage migration. */
8179
8199
  var StorageMigrationInputSchema = object({
8180
8200
  destinations: StorageMigrationDestinationsSchema,
8201
+ /** Omitted = each class's current default. */
8202
+ sources: StorageMigrationSourcesSchema,
8181
8203
  throttleMbps: number().min(1).max(1e3).optional(),
8182
8204
  /** Omitted = `blocking`, which stays the default. */
8183
8205
  mode: StorageMigrationModeSchema.optional()
@@ -8257,6 +8279,13 @@ var StorageMigrationMoveSchema = object({
8257
8279
  storageClass: StorageMigrationClassSchema,
8258
8280
  fromLocationId: string(),
8259
8281
  toLocationId: string(),
8282
+ /**
8283
+ * True when `from` was NOT the class default at plan time. The move still
8284
+ * copies bytes, but the default is left alone and the source is disabled
8285
+ * once the copy verifies. Absent on jobs planned before this field existed
8286
+ * — those jobs always repointed, which is `false`.
8287
+ */
8288
+ freezeSource: boolean().optional(),
8260
8289
  moverJobId: string().nullable(),
8261
8290
  state: RelocateJobStateSchema.nullable(),
8262
8291
  error: string().nullable(),
@@ -8270,6 +8299,7 @@ var StorageMigrationJobSchema = object({
8270
8299
  * can tell a seconds-long cutover from a thirty-hour one. */
8271
8300
  mode: StorageMigrationModeSchema,
8272
8301
  destinations: StorageMigrationDestinationsSchema,
8302
+ sources: StorageMigrationSourcesSchema,
8273
8303
  throttleMbps: number(),
8274
8304
  moves: array(StorageMigrationMoveSchema),
8275
8305
  pauseLeaseId: string().nullable(),
@@ -8295,6 +8325,7 @@ var StorageMigrationFindingSchema = object({
8295
8325
  });
8296
8326
  var StorageMigrationPlanSchema = object({
8297
8327
  destinations: StorageMigrationDestinationsSchema,
8328
+ sources: StorageMigrationSourcesSchema,
8298
8329
  /** The mode this plan was built for. A plan is only valid for its mode: the
8299
8330
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8300
8331
  * it. */
@@ -8302,7 +8333,8 @@ var StorageMigrationPlanSchema = object({
8302
8333
  moves: array(object({
8303
8334
  storageClass: StorageMigrationClassSchema,
8304
8335
  fromLocationId: string(),
8305
- toLocationId: string()
8336
+ toLocationId: string(),
8337
+ freezeSource: boolean().optional()
8306
8338
  })),
8307
8339
  findings: array(StorageMigrationFindingSchema)
8308
8340
  });
@@ -8480,10 +8512,51 @@ var LedgerWalkReportSchema = object({
8480
8512
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8481
8513
  var RelocatableMediaCountInputSchema = object({
8482
8514
  toLocationId: string().min(1),
8515
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8516
+ fromLocationId: string().optional(),
8483
8517
  /** Omitted = `move`. */
8484
8518
  mode: MediaRelocateModeSchema.optional()
8485
8519
  });
8486
8520
  /**
8521
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8522
+ * ghost ledger entries on frozen footage locations.
8523
+ *
8524
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8525
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8526
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8527
+ * with no operator-visible status.
8528
+ */
8529
+ var StorageCleanupPhaseSchema = _enum([
8530
+ "orphans",
8531
+ "debug-media",
8532
+ "ghost-ledger",
8533
+ "done",
8534
+ "failed",
8535
+ "cancelled"
8536
+ ]);
8537
+ var StorageCleanupInputSchema = object({
8538
+ /** Also walk motion stills / track filmstrips. Off by default. */
8539
+ includeDebugMedia: boolean().optional() });
8540
+ var StorageCleanupJobSchema = object({
8541
+ jobId: string(),
8542
+ phase: StorageCleanupPhaseSchema,
8543
+ includeDebugMedia: boolean(),
8544
+ orphansReclaimed: number().int().nonnegative(),
8545
+ orphanBytesReclaimed: number().int().nonnegative(),
8546
+ debugMediaReclaimed: number().int().nonnegative(),
8547
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8548
+ ghostsForgotten: number().int().nonnegative(),
8549
+ ghostBytesForgotten: number().int().nonnegative(),
8550
+ /** Short operator-facing line: current collection, pass, or location. */
8551
+ detail: string().nullable(),
8552
+ cancelRequested: boolean(),
8553
+ startedAt: number(),
8554
+ updatedAt: number(),
8555
+ finishedAt: number().nullable(),
8556
+ error: string().nullable()
8557
+ });
8558
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8559
+ /**
8487
8560
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8488
8561
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8489
8562
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8511,11 +8584,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8511
8584
  * The default location for a type uses `id === <type>:default` by
8512
8585
  * convention (the bare type ref like `'backups'` resolves to it).
8513
8586
  *
8514
- * `isSystem: true` marks a location as orchestrator-seeded and
8515
- * undeletable. The bootstrap-installed defaults (one per type) carry
8516
- * this flag; operator-added locations don't. Editing the config of
8517
- * a system location is allowed (path migration, provider swap) but
8518
- * deleting it is rejected at the cap level.
8587
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8588
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8589
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8590
+ * / last-enabled, not on this bit.
8519
8591
  */
8520
8592
  var StorageLocationSchema = object({
8521
8593
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -13041,6 +13113,12 @@ method(object({
13041
13113
  }), _void(), {
13042
13114
  kind: "mutation",
13043
13115
  auth: "admin"
13116
+ }), method(object({
13117
+ from: string(),
13118
+ to: string()
13119
+ }), object({ moved: number() }), {
13120
+ kind: "mutation",
13121
+ auth: "admin"
13044
13122
  }), method(object({
13045
13123
  deviceId: number(),
13046
13124
  disabled: boolean()
@@ -19049,46 +19127,6 @@ var RecentTracksPageSchema = object({
19049
19127
  /** Cursor for the next page, or null when this page is the last. */
19050
19128
  nextCursor: string().nullable()
19051
19129
  });
19052
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
19053
- var LIST_GROUPS_MAX_LIMIT = 100;
19054
- var AnalyticsGroupRecordSchema = object({
19055
- id: string(),
19056
- deviceId: number().int(),
19057
- openedAt: number().int(),
19058
- closedAt: number().int(),
19059
- timestamp: number().int(),
19060
- memberCount: number().int(),
19061
- memberTrackIds: array(string()).readonly(),
19062
- className: string(),
19063
- classes: array(string()).readonly(),
19064
- /** Relative event-media path, or null when the group has no picture yet. */
19065
- mediaUrl: string().nullable(),
19066
- singleton: boolean()
19067
- });
19068
- var AnalyticsGroupMemberSchema = object({
19069
- trackId: string(),
19070
- deviceId: number().int(),
19071
- className: string(),
19072
- firstSeen: number().int(),
19073
- lastSeen: number().int(),
19074
- mediaUrl: string().nullable()
19075
- });
19076
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
19077
- var ListGroupsQueryInput = object({
19078
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
19079
- deviceIds: array(number()),
19080
- /** Window lower bound on `closedAt` (inclusive). */
19081
- since: number().optional(),
19082
- /** Window upper bound on `openedAt` (inclusive). */
19083
- until: number().optional(),
19084
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
19085
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
19086
- cursor: string().optional()
19087
- });
19088
- var ListGroupsPageSchema = object({
19089
- groups: array(AnalyticsGroupRecordSchema).readonly(),
19090
- nextCursor: string().nullable()
19091
- });
19092
19130
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19093
19131
  var KEY_EVENTS_MAX_LIMIT = 200;
19094
19132
  var KeyEventQueryInput = object({
@@ -19192,9 +19230,7 @@ var TrackCascadeCountsSchema = object({
19192
19230
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19193
19231
  plates: number().int(),
19194
19232
  /** Per-track CLIP search vectors removed (best-effort). */
19195
- embeddings: number().int(),
19196
- /** Group membership + group rows removed with their last member (best-effort). */
19197
- groups: number().int()
19233
+ embeddings: number().int()
19198
19234
  });
19199
19235
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19200
19236
  var DiskReconcileCountsSchema = object({
@@ -19364,6 +19400,47 @@ var RebuildStatusSchema = object({
19364
19400
  /** Present when the pass ended by throwing. */
19365
19401
  error: string().nullable()
19366
19402
  });
19403
+ /**
19404
+ * Acknowledgement that a debug-media reclaim STARTED.
19405
+ *
19406
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19407
+ * it runs detached and this returns immediately. Awaiting it is how the
19408
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19409
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19410
+ */
19411
+ var MediaReclaimStartResultSchema = object({
19412
+ started: boolean(),
19413
+ /** True when a pass was already running; the new request is ignored. */
19414
+ alreadyRunning: boolean()
19415
+ });
19416
+ var MediaReclaimInputSchema = object({
19417
+ mode: _enum(["report", "reclaim"]).default("report"),
19418
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19419
+ deviceIds: array(number().int()).min(1).optional(),
19420
+ restart: boolean().optional(),
19421
+ pageSize: number().int().min(50).max(5e3).optional(),
19422
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19423
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19424
+ maxBytesPerRun: number().int().min(1).optional(),
19425
+ budgetMinutes: number().int().min(1).max(720).optional(),
19426
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19427
+ graceMinutes: number().int().min(1).max(10080).optional()
19428
+ });
19429
+ var MediaReclaimStatusSchema = object({
19430
+ running: boolean(),
19431
+ mode: _enum(["report", "reclaim"]).nullable(),
19432
+ totalExamined: number(),
19433
+ totalEligible: number(),
19434
+ totalReclaimed: number(),
19435
+ totalBytesReclaimed: number(),
19436
+ totalRefused: number(),
19437
+ /** Device+scope windows finished in this pass. */
19438
+ devicesDone: number(),
19439
+ complete: boolean().nullable(),
19440
+ startedAtMs: number().nullable(),
19441
+ finishedAtMs: number().nullable(),
19442
+ error: string().nullable()
19443
+ });
19367
19444
  var ReplayFrameInputSchema = object({
19368
19445
  timestamp: number(),
19369
19446
  frame: PipelineRunResultBridge
@@ -19402,10 +19479,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19402
19479
  * stationary registry). Default false: the timeline lists passages,
19403
19480
  * not parking records (operator decision, 2026-08-15). */
19404
19481
  includeStationary: boolean().optional()
19405
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19406
- deviceId: number(),
19407
- groupId: string().min(1)
19408
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19482
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19409
19483
  kind: "mutation",
19410
19484
  auth: "admin"
19411
19485
  }), 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({
@@ -19505,6 +19579,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19505
19579
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19506
19580
  kind: "query",
19507
19581
  auth: "admin"
19582
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19583
+ kind: "mutation",
19584
+ auth: "admin"
19585
+ }), method(object({}), MediaReclaimStatusSchema, {
19586
+ kind: "query",
19587
+ auth: "admin"
19508
19588
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19509
19589
  kind: "query",
19510
19590
  auth: "admin"
@@ -21579,7 +21659,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21579
21659
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21580
21660
  kind: "mutation",
21581
21661
  auth: "admin"
21582
- });
21662
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21663
+ kind: "mutation",
21664
+ auth: "admin"
21665
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21666
+ kind: "mutation",
21667
+ auth: "admin"
21668
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21583
21669
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21584
21670
  providerId: string().min(1),
21585
21671
  displayName: string().min(1),
@@ -28760,6 +28846,33 @@ var RecordingRebalanceInputSchema = object({
28760
28846
  minMoveGb: number().min(0).optional()
28761
28847
  });
28762
28848
  /**
28849
+ * Operator-facing placement of one camera onto a recordings location.
28850
+ *
28851
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
28852
+ * Auto (the planner may move this camera). `locationId` is where high/mid
28853
+ * currently write — the plan, which may disagree with the pin when Auto.
28854
+ */
28855
+ var RecordingDevicePlacementSchema = object({
28856
+ deviceId: number().int(),
28857
+ profile: string(),
28858
+ locationId: string()
28859
+ });
28860
+ var RecordingDevicePinSchema = object({
28861
+ deviceId: number().int(),
28862
+ /** Recordings-class location this camera is pinned to. */
28863
+ locationId: string()
28864
+ });
28865
+ var RecordingPlacementViewSchema = object({
28866
+ assignments: array(RecordingDevicePlacementSchema),
28867
+ pins: array(RecordingDevicePinSchema),
28868
+ defaultLocations: record(string(), string())
28869
+ });
28870
+ var RecordingSetDevicePlacementInputSchema = object({
28871
+ deviceId: number().int(),
28872
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
28873
+ locationId: string().nullable()
28874
+ });
28875
+ /**
28763
28876
  * Result of locating footage at a wall-clock instant for one device/profile.
28764
28877
  * `segment` carries the covering segment's window; `gap` reports the forward
28765
28878
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -28985,6 +29098,12 @@ method(object({
28985
29098
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
28986
29099
  kind: "mutation",
28987
29100
  auth: "admin"
29101
+ }), method(object({}), RecordingPlacementViewSchema, {
29102
+ kind: "query",
29103
+ auth: "admin"
29104
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29105
+ kind: "mutation",
29106
+ auth: "admin"
28988
29107
  });
28989
29108
  /**
28990
29109
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -34458,6 +34577,12 @@ Object.freeze({
34458
34577
  addonId: null,
34459
34578
  access: "delete"
34460
34579
  },
34580
+ "deviceManager.renameLocation": {
34581
+ capName: "device-manager",
34582
+ capScope: "system",
34583
+ addonId: null,
34584
+ access: "create"
34585
+ },
34461
34586
  "deviceManager.runDeviceAction": {
34462
34587
  capName: "device-manager",
34463
34588
  capScope: "system",
@@ -36150,19 +36275,19 @@ Object.freeze({
36150
36275
  addonId: null,
36151
36276
  access: "view"
36152
36277
  },
36153
- "pipelineAnalytics.getGroup": {
36278
+ "pipelineAnalytics.getKeyEvents": {
36154
36279
  capName: "pipeline-analytics",
36155
36280
  capScope: "device",
36156
36281
  addonId: null,
36157
36282
  access: "view"
36158
36283
  },
36159
- "pipelineAnalytics.getKeyEvents": {
36284
+ "pipelineAnalytics.getKeyEventsBatch": {
36160
36285
  capName: "pipeline-analytics",
36161
36286
  capScope: "device",
36162
36287
  addonId: null,
36163
36288
  access: "view"
36164
36289
  },
36165
- "pipelineAnalytics.getKeyEventsBatch": {
36290
+ "pipelineAnalytics.getMediaReclaimStatus": {
36166
36291
  capName: "pipeline-analytics",
36167
36292
  capScope: "device",
36168
36293
  addonId: null,
@@ -36252,12 +36377,6 @@ Object.freeze({
36252
36377
  addonId: null,
36253
36378
  access: "view"
36254
36379
  },
36255
- "pipelineAnalytics.listGroups": {
36256
- capName: "pipeline-analytics",
36257
- capScope: "device",
36258
- addonId: null,
36259
- access: "view"
36260
- },
36261
36380
  "pipelineAnalytics.listOpsLog": {
36262
36381
  capName: "pipeline-analytics",
36263
36382
  capScope: "device",
@@ -36342,6 +36461,12 @@ Object.freeze({
36342
36461
  addonId: null,
36343
36462
  access: "create"
36344
36463
  },
36464
+ "pipelineAnalytics.reclaimDebugMedia": {
36465
+ capName: "pipeline-analytics",
36466
+ capScope: "device",
36467
+ addonId: null,
36468
+ access: "create"
36469
+ },
36345
36470
  "pipelineAnalytics.reconcileFromDisk": {
36346
36471
  capName: "pipeline-analytics",
36347
36472
  capScope: "device",
@@ -37266,6 +37391,12 @@ Object.freeze({
37266
37391
  addonId: null,
37267
37392
  access: "view"
37268
37393
  },
37394
+ "recording.getPlacement": {
37395
+ capName: "recording",
37396
+ capScope: "system",
37397
+ addonId: null,
37398
+ access: "view"
37399
+ },
37269
37400
  "recording.getPlaybackManifest": {
37270
37401
  capName: "recording",
37271
37402
  capScope: "system",
@@ -37392,6 +37523,12 @@ Object.freeze({
37392
37523
  addonId: null,
37393
37524
  access: "create"
37394
37525
  },
37526
+ "recording.setDevicePlacement": {
37527
+ capName: "recording",
37528
+ capScope: "system",
37529
+ addonId: null,
37530
+ access: "create"
37531
+ },
37395
37532
  "recording.startStorageMigrationMove": {
37396
37533
  capName: "recording",
37397
37534
  capScope: "system",
@@ -37836,12 +37973,36 @@ Object.freeze({
37836
37973
  addonId: null,
37837
37974
  access: "create"
37838
37975
  },
37976
+ "storageMigration.cleanupCancel": {
37977
+ capName: "storage-migration",
37978
+ capScope: "system",
37979
+ addonId: null,
37980
+ access: "create"
37981
+ },
37982
+ "storageMigration.cleanupStart": {
37983
+ capName: "storage-migration",
37984
+ capScope: "system",
37985
+ addonId: null,
37986
+ access: "create"
37987
+ },
37988
+ "storageMigration.cleanupStatus": {
37989
+ capName: "storage-migration",
37990
+ capScope: "system",
37991
+ addonId: null,
37992
+ access: "view"
37993
+ },
37839
37994
  "storageMigration.drain": {
37840
37995
  capName: "storage-migration",
37841
37996
  capScope: "system",
37842
37997
  addonId: null,
37843
37998
  access: "create"
37844
37999
  },
38000
+ "storageMigration.history": {
38001
+ capName: "storage-migration",
38002
+ capScope: "system",
38003
+ addonId: null,
38004
+ access: "view"
38005
+ },
37845
38006
  "storageMigration.movers": {
37846
38007
  capName: "storage-migration",
37847
38008
  capScope: "system",
@@ -39838,11 +39999,6 @@ Object.freeze({
39838
39999
  form: "single",
39839
40000
  optional: true
39840
40001
  }],
39841
- "pipelineAnalytics.getGroup": [{
39842
- name: "deviceId",
39843
- form: "single",
39844
- optional: false
39845
- }],
39846
40002
  "pipelineAnalytics.getKeyEvents": [{
39847
40003
  name: "deviceId",
39848
40004
  form: "single",
@@ -39908,11 +40064,6 @@ Object.freeze({
39908
40064
  form: "single",
39909
40065
  optional: false
39910
40066
  }],
39911
- "pipelineAnalytics.listGroups": [{
39912
- name: "deviceIds",
39913
- form: "array",
39914
- optional: false
39915
- }],
39916
40067
  "pipelineAnalytics.listOpsLog": [{
39917
40068
  name: "deviceId",
39918
40069
  form: "single",
@@ -39958,6 +40109,11 @@ Object.freeze({
39958
40109
  form: "single",
39959
40110
  optional: true
39960
40111
  }],
40112
+ "pipelineAnalytics.reclaimDebugMedia": [{
40113
+ name: "deviceIds",
40114
+ form: "array",
40115
+ optional: true
40116
+ }],
39961
40117
  "pipelineAnalytics.reconcileFromDisk": [{
39962
40118
  name: "deviceId",
39963
40119
  form: "single",
@@ -40323,6 +40479,11 @@ Object.freeze({
40323
40479
  form: "single",
40324
40480
  optional: false
40325
40481
  }],
40482
+ "recording.setDevicePlacement": [{
40483
+ name: "deviceId",
40484
+ form: "single",
40485
+ optional: false
40486
+ }],
40326
40487
  "recording.startStorageMigrationMove": [{
40327
40488
  name: "deviceId",
40328
40489
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-amcrest",
3
- "version": "0.2.50",
3
+ "version": "0.2.51",
4
4
  "description": "Amcrest/Dahua camera device provider addon for CamStack — Dahua CGI over HTTP(S) with digest auth (snapshot, RTSP catalog, PTZ, image/day-night config)",
5
5
  "keywords": [
6
6
  "camstack",