@camstack/addon-provider-amcrest 0.2.50 → 0.2.52

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 +236 -73
  2. package/dist/addon.mjs +236 -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()
@@ -15790,6 +15868,8 @@ var NcSystemEventKindSchema = _enum([
15790
15868
  "device-offline",
15791
15869
  "device-disabled",
15792
15870
  "device-enabled",
15871
+ "device-battery-low",
15872
+ "device-battery-normal",
15793
15873
  "stream-online",
15794
15874
  "stream-offline",
15795
15875
  "node-online",
@@ -19048,46 +19128,6 @@ var RecentTracksPageSchema = object({
19048
19128
  /** Cursor for the next page, or null when this page is the last. */
19049
19129
  nextCursor: string().nullable()
19050
19130
  });
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
19131
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19092
19132
  var KEY_EVENTS_MAX_LIMIT = 200;
19093
19133
  var KeyEventQueryInput = object({
@@ -19191,9 +19231,7 @@ var TrackCascadeCountsSchema = object({
19191
19231
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19192
19232
  plates: number().int(),
19193
19233
  /** 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()
19234
+ embeddings: number().int()
19197
19235
  });
19198
19236
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19199
19237
  var DiskReconcileCountsSchema = object({
@@ -19363,6 +19401,47 @@ var RebuildStatusSchema = object({
19363
19401
  /** Present when the pass ended by throwing. */
19364
19402
  error: string().nullable()
19365
19403
  });
19404
+ /**
19405
+ * Acknowledgement that a debug-media reclaim STARTED.
19406
+ *
19407
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19408
+ * it runs detached and this returns immediately. Awaiting it is how the
19409
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19410
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19411
+ */
19412
+ var MediaReclaimStartResultSchema = object({
19413
+ started: boolean(),
19414
+ /** True when a pass was already running; the new request is ignored. */
19415
+ alreadyRunning: boolean()
19416
+ });
19417
+ var MediaReclaimInputSchema = object({
19418
+ mode: _enum(["report", "reclaim"]).default("report"),
19419
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19420
+ deviceIds: array(number().int()).min(1).optional(),
19421
+ restart: boolean().optional(),
19422
+ pageSize: number().int().min(50).max(5e3).optional(),
19423
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19424
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19425
+ maxBytesPerRun: number().int().min(1).optional(),
19426
+ budgetMinutes: number().int().min(1).max(720).optional(),
19427
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19428
+ graceMinutes: number().int().min(1).max(10080).optional()
19429
+ });
19430
+ var MediaReclaimStatusSchema = object({
19431
+ running: boolean(),
19432
+ mode: _enum(["report", "reclaim"]).nullable(),
19433
+ totalExamined: number(),
19434
+ totalEligible: number(),
19435
+ totalReclaimed: number(),
19436
+ totalBytesReclaimed: number(),
19437
+ totalRefused: number(),
19438
+ /** Device+scope windows finished in this pass. */
19439
+ devicesDone: number(),
19440
+ complete: boolean().nullable(),
19441
+ startedAtMs: number().nullable(),
19442
+ finishedAtMs: number().nullable(),
19443
+ error: string().nullable()
19444
+ });
19366
19445
  var ReplayFrameInputSchema = object({
19367
19446
  timestamp: number(),
19368
19447
  frame: PipelineRunResultBridge
@@ -19401,10 +19480,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19401
19480
  * stationary registry). Default false: the timeline lists passages,
19402
19481
  * not parking records (operator decision, 2026-08-15). */
19403
19482
  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(), {
19483
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19408
19484
  kind: "mutation",
19409
19485
  auth: "admin"
19410
19486
  }), 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 +19580,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19504
19580
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19505
19581
  kind: "query",
19506
19582
  auth: "admin"
19583
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19584
+ kind: "mutation",
19585
+ auth: "admin"
19586
+ }), method(object({}), MediaReclaimStatusSchema, {
19587
+ kind: "query",
19588
+ auth: "admin"
19507
19589
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19508
19590
  kind: "query",
19509
19591
  auth: "admin"
@@ -21578,7 +21660,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21578
21660
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21579
21661
  kind: "mutation",
21580
21662
  auth: "admin"
21581
- });
21663
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21664
+ kind: "mutation",
21665
+ auth: "admin"
21666
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21667
+ kind: "mutation",
21668
+ auth: "admin"
21669
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21582
21670
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21583
21671
  providerId: string().min(1),
21584
21672
  displayName: string().min(1),
@@ -28759,6 +28847,33 @@ var RecordingRebalanceInputSchema = object({
28759
28847
  minMoveGb: number().min(0).optional()
28760
28848
  });
28761
28849
  /**
28850
+ * Operator-facing placement of one camera onto a recordings location.
28851
+ *
28852
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
28853
+ * Auto (the planner may move this camera). `locationId` is where high/mid
28854
+ * currently write — the plan, which may disagree with the pin when Auto.
28855
+ */
28856
+ var RecordingDevicePlacementSchema = object({
28857
+ deviceId: number().int(),
28858
+ profile: string(),
28859
+ locationId: string()
28860
+ });
28861
+ var RecordingDevicePinSchema = object({
28862
+ deviceId: number().int(),
28863
+ /** Recordings-class location this camera is pinned to. */
28864
+ locationId: string()
28865
+ });
28866
+ var RecordingPlacementViewSchema = object({
28867
+ assignments: array(RecordingDevicePlacementSchema),
28868
+ pins: array(RecordingDevicePinSchema),
28869
+ defaultLocations: record(string(), string())
28870
+ });
28871
+ var RecordingSetDevicePlacementInputSchema = object({
28872
+ deviceId: number().int(),
28873
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
28874
+ locationId: string().nullable()
28875
+ });
28876
+ /**
28762
28877
  * Result of locating footage at a wall-clock instant for one device/profile.
28763
28878
  * `segment` carries the covering segment's window; `gap` reports the forward
28764
28879
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -28984,6 +29099,12 @@ method(object({
28984
29099
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
28985
29100
  kind: "mutation",
28986
29101
  auth: "admin"
29102
+ }), method(object({}), RecordingPlacementViewSchema, {
29103
+ kind: "query",
29104
+ auth: "admin"
29105
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29106
+ kind: "mutation",
29107
+ auth: "admin"
28987
29108
  });
28988
29109
  /**
28989
29110
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -34457,6 +34578,12 @@ Object.freeze({
34457
34578
  addonId: null,
34458
34579
  access: "delete"
34459
34580
  },
34581
+ "deviceManager.renameLocation": {
34582
+ capName: "device-manager",
34583
+ capScope: "system",
34584
+ addonId: null,
34585
+ access: "create"
34586
+ },
34460
34587
  "deviceManager.runDeviceAction": {
34461
34588
  capName: "device-manager",
34462
34589
  capScope: "system",
@@ -36149,19 +36276,19 @@ Object.freeze({
36149
36276
  addonId: null,
36150
36277
  access: "view"
36151
36278
  },
36152
- "pipelineAnalytics.getGroup": {
36279
+ "pipelineAnalytics.getKeyEvents": {
36153
36280
  capName: "pipeline-analytics",
36154
36281
  capScope: "device",
36155
36282
  addonId: null,
36156
36283
  access: "view"
36157
36284
  },
36158
- "pipelineAnalytics.getKeyEvents": {
36285
+ "pipelineAnalytics.getKeyEventsBatch": {
36159
36286
  capName: "pipeline-analytics",
36160
36287
  capScope: "device",
36161
36288
  addonId: null,
36162
36289
  access: "view"
36163
36290
  },
36164
- "pipelineAnalytics.getKeyEventsBatch": {
36291
+ "pipelineAnalytics.getMediaReclaimStatus": {
36165
36292
  capName: "pipeline-analytics",
36166
36293
  capScope: "device",
36167
36294
  addonId: null,
@@ -36251,12 +36378,6 @@ Object.freeze({
36251
36378
  addonId: null,
36252
36379
  access: "view"
36253
36380
  },
36254
- "pipelineAnalytics.listGroups": {
36255
- capName: "pipeline-analytics",
36256
- capScope: "device",
36257
- addonId: null,
36258
- access: "view"
36259
- },
36260
36381
  "pipelineAnalytics.listOpsLog": {
36261
36382
  capName: "pipeline-analytics",
36262
36383
  capScope: "device",
@@ -36341,6 +36462,12 @@ Object.freeze({
36341
36462
  addonId: null,
36342
36463
  access: "create"
36343
36464
  },
36465
+ "pipelineAnalytics.reclaimDebugMedia": {
36466
+ capName: "pipeline-analytics",
36467
+ capScope: "device",
36468
+ addonId: null,
36469
+ access: "create"
36470
+ },
36344
36471
  "pipelineAnalytics.reconcileFromDisk": {
36345
36472
  capName: "pipeline-analytics",
36346
36473
  capScope: "device",
@@ -37265,6 +37392,12 @@ Object.freeze({
37265
37392
  addonId: null,
37266
37393
  access: "view"
37267
37394
  },
37395
+ "recording.getPlacement": {
37396
+ capName: "recording",
37397
+ capScope: "system",
37398
+ addonId: null,
37399
+ access: "view"
37400
+ },
37268
37401
  "recording.getPlaybackManifest": {
37269
37402
  capName: "recording",
37270
37403
  capScope: "system",
@@ -37391,6 +37524,12 @@ Object.freeze({
37391
37524
  addonId: null,
37392
37525
  access: "create"
37393
37526
  },
37527
+ "recording.setDevicePlacement": {
37528
+ capName: "recording",
37529
+ capScope: "system",
37530
+ addonId: null,
37531
+ access: "create"
37532
+ },
37394
37533
  "recording.startStorageMigrationMove": {
37395
37534
  capName: "recording",
37396
37535
  capScope: "system",
@@ -37835,12 +37974,36 @@ Object.freeze({
37835
37974
  addonId: null,
37836
37975
  access: "create"
37837
37976
  },
37977
+ "storageMigration.cleanupCancel": {
37978
+ capName: "storage-migration",
37979
+ capScope: "system",
37980
+ addonId: null,
37981
+ access: "create"
37982
+ },
37983
+ "storageMigration.cleanupStart": {
37984
+ capName: "storage-migration",
37985
+ capScope: "system",
37986
+ addonId: null,
37987
+ access: "create"
37988
+ },
37989
+ "storageMigration.cleanupStatus": {
37990
+ capName: "storage-migration",
37991
+ capScope: "system",
37992
+ addonId: null,
37993
+ access: "view"
37994
+ },
37838
37995
  "storageMigration.drain": {
37839
37996
  capName: "storage-migration",
37840
37997
  capScope: "system",
37841
37998
  addonId: null,
37842
37999
  access: "create"
37843
38000
  },
38001
+ "storageMigration.history": {
38002
+ capName: "storage-migration",
38003
+ capScope: "system",
38004
+ addonId: null,
38005
+ access: "view"
38006
+ },
37844
38007
  "storageMigration.movers": {
37845
38008
  capName: "storage-migration",
37846
38009
  capScope: "system",
@@ -39837,11 +40000,6 @@ Object.freeze({
39837
40000
  form: "single",
39838
40001
  optional: true
39839
40002
  }],
39840
- "pipelineAnalytics.getGroup": [{
39841
- name: "deviceId",
39842
- form: "single",
39843
- optional: false
39844
- }],
39845
40003
  "pipelineAnalytics.getKeyEvents": [{
39846
40004
  name: "deviceId",
39847
40005
  form: "single",
@@ -39907,11 +40065,6 @@ Object.freeze({
39907
40065
  form: "single",
39908
40066
  optional: false
39909
40067
  }],
39910
- "pipelineAnalytics.listGroups": [{
39911
- name: "deviceIds",
39912
- form: "array",
39913
- optional: false
39914
- }],
39915
40068
  "pipelineAnalytics.listOpsLog": [{
39916
40069
  name: "deviceId",
39917
40070
  form: "single",
@@ -39957,6 +40110,11 @@ Object.freeze({
39957
40110
  form: "single",
39958
40111
  optional: true
39959
40112
  }],
40113
+ "pipelineAnalytics.reclaimDebugMedia": [{
40114
+ name: "deviceIds",
40115
+ form: "array",
40116
+ optional: true
40117
+ }],
39960
40118
  "pipelineAnalytics.reconcileFromDisk": [{
39961
40119
  name: "deviceId",
39962
40120
  form: "single",
@@ -40322,6 +40480,11 @@ Object.freeze({
40322
40480
  form: "single",
40323
40481
  optional: false
40324
40482
  }],
40483
+ "recording.setDevicePlacement": [{
40484
+ name: "deviceId",
40485
+ form: "single",
40486
+ optional: false
40487
+ }],
40325
40488
  "recording.startStorageMigrationMove": [{
40326
40489
  name: "deviceId",
40327
40490
  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()
@@ -15791,6 +15869,8 @@ var NcSystemEventKindSchema = _enum([
15791
15869
  "device-offline",
15792
15870
  "device-disabled",
15793
15871
  "device-enabled",
15872
+ "device-battery-low",
15873
+ "device-battery-normal",
15794
15874
  "stream-online",
15795
15875
  "stream-offline",
15796
15876
  "node-online",
@@ -19049,46 +19129,6 @@ var RecentTracksPageSchema = object({
19049
19129
  /** Cursor for the next page, or null when this page is the last. */
19050
19130
  nextCursor: string().nullable()
19051
19131
  });
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
19132
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19093
19133
  var KEY_EVENTS_MAX_LIMIT = 200;
19094
19134
  var KeyEventQueryInput = object({
@@ -19192,9 +19232,7 @@ var TrackCascadeCountsSchema = object({
19192
19232
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19193
19233
  plates: number().int(),
19194
19234
  /** 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()
19235
+ embeddings: number().int()
19198
19236
  });
19199
19237
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19200
19238
  var DiskReconcileCountsSchema = object({
@@ -19364,6 +19402,47 @@ var RebuildStatusSchema = object({
19364
19402
  /** Present when the pass ended by throwing. */
19365
19403
  error: string().nullable()
19366
19404
  });
19405
+ /**
19406
+ * Acknowledgement that a debug-media reclaim STARTED.
19407
+ *
19408
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19409
+ * it runs detached and this returns immediately. Awaiting it is how the
19410
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19411
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19412
+ */
19413
+ var MediaReclaimStartResultSchema = object({
19414
+ started: boolean(),
19415
+ /** True when a pass was already running; the new request is ignored. */
19416
+ alreadyRunning: boolean()
19417
+ });
19418
+ var MediaReclaimInputSchema = object({
19419
+ mode: _enum(["report", "reclaim"]).default("report"),
19420
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19421
+ deviceIds: array(number().int()).min(1).optional(),
19422
+ restart: boolean().optional(),
19423
+ pageSize: number().int().min(50).max(5e3).optional(),
19424
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19425
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19426
+ maxBytesPerRun: number().int().min(1).optional(),
19427
+ budgetMinutes: number().int().min(1).max(720).optional(),
19428
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19429
+ graceMinutes: number().int().min(1).max(10080).optional()
19430
+ });
19431
+ var MediaReclaimStatusSchema = object({
19432
+ running: boolean(),
19433
+ mode: _enum(["report", "reclaim"]).nullable(),
19434
+ totalExamined: number(),
19435
+ totalEligible: number(),
19436
+ totalReclaimed: number(),
19437
+ totalBytesReclaimed: number(),
19438
+ totalRefused: number(),
19439
+ /** Device+scope windows finished in this pass. */
19440
+ devicesDone: number(),
19441
+ complete: boolean().nullable(),
19442
+ startedAtMs: number().nullable(),
19443
+ finishedAtMs: number().nullable(),
19444
+ error: string().nullable()
19445
+ });
19367
19446
  var ReplayFrameInputSchema = object({
19368
19447
  timestamp: number(),
19369
19448
  frame: PipelineRunResultBridge
@@ -19402,10 +19481,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19402
19481
  * stationary registry). Default false: the timeline lists passages,
19403
19482
  * not parking records (operator decision, 2026-08-15). */
19404
19483
  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(), {
19484
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19409
19485
  kind: "mutation",
19410
19486
  auth: "admin"
19411
19487
  }), 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 +19581,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19505
19581
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19506
19582
  kind: "query",
19507
19583
  auth: "admin"
19584
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19585
+ kind: "mutation",
19586
+ auth: "admin"
19587
+ }), method(object({}), MediaReclaimStatusSchema, {
19588
+ kind: "query",
19589
+ auth: "admin"
19508
19590
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19509
19591
  kind: "query",
19510
19592
  auth: "admin"
@@ -21579,7 +21661,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21579
21661
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21580
21662
  kind: "mutation",
21581
21663
  auth: "admin"
21582
- });
21664
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21665
+ kind: "mutation",
21666
+ auth: "admin"
21667
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21668
+ kind: "mutation",
21669
+ auth: "admin"
21670
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21583
21671
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21584
21672
  providerId: string().min(1),
21585
21673
  displayName: string().min(1),
@@ -28760,6 +28848,33 @@ var RecordingRebalanceInputSchema = object({
28760
28848
  minMoveGb: number().min(0).optional()
28761
28849
  });
28762
28850
  /**
28851
+ * Operator-facing placement of one camera onto a recordings location.
28852
+ *
28853
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
28854
+ * Auto (the planner may move this camera). `locationId` is where high/mid
28855
+ * currently write — the plan, which may disagree with the pin when Auto.
28856
+ */
28857
+ var RecordingDevicePlacementSchema = object({
28858
+ deviceId: number().int(),
28859
+ profile: string(),
28860
+ locationId: string()
28861
+ });
28862
+ var RecordingDevicePinSchema = object({
28863
+ deviceId: number().int(),
28864
+ /** Recordings-class location this camera is pinned to. */
28865
+ locationId: string()
28866
+ });
28867
+ var RecordingPlacementViewSchema = object({
28868
+ assignments: array(RecordingDevicePlacementSchema),
28869
+ pins: array(RecordingDevicePinSchema),
28870
+ defaultLocations: record(string(), string())
28871
+ });
28872
+ var RecordingSetDevicePlacementInputSchema = object({
28873
+ deviceId: number().int(),
28874
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
28875
+ locationId: string().nullable()
28876
+ });
28877
+ /**
28763
28878
  * Result of locating footage at a wall-clock instant for one device/profile.
28764
28879
  * `segment` carries the covering segment's window; `gap` reports the forward
28765
28880
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -28985,6 +29100,12 @@ method(object({
28985
29100
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
28986
29101
  kind: "mutation",
28987
29102
  auth: "admin"
29103
+ }), method(object({}), RecordingPlacementViewSchema, {
29104
+ kind: "query",
29105
+ auth: "admin"
29106
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29107
+ kind: "mutation",
29108
+ auth: "admin"
28988
29109
  });
28989
29110
  /**
28990
29111
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -34458,6 +34579,12 @@ Object.freeze({
34458
34579
  addonId: null,
34459
34580
  access: "delete"
34460
34581
  },
34582
+ "deviceManager.renameLocation": {
34583
+ capName: "device-manager",
34584
+ capScope: "system",
34585
+ addonId: null,
34586
+ access: "create"
34587
+ },
34461
34588
  "deviceManager.runDeviceAction": {
34462
34589
  capName: "device-manager",
34463
34590
  capScope: "system",
@@ -36150,19 +36277,19 @@ Object.freeze({
36150
36277
  addonId: null,
36151
36278
  access: "view"
36152
36279
  },
36153
- "pipelineAnalytics.getGroup": {
36280
+ "pipelineAnalytics.getKeyEvents": {
36154
36281
  capName: "pipeline-analytics",
36155
36282
  capScope: "device",
36156
36283
  addonId: null,
36157
36284
  access: "view"
36158
36285
  },
36159
- "pipelineAnalytics.getKeyEvents": {
36286
+ "pipelineAnalytics.getKeyEventsBatch": {
36160
36287
  capName: "pipeline-analytics",
36161
36288
  capScope: "device",
36162
36289
  addonId: null,
36163
36290
  access: "view"
36164
36291
  },
36165
- "pipelineAnalytics.getKeyEventsBatch": {
36292
+ "pipelineAnalytics.getMediaReclaimStatus": {
36166
36293
  capName: "pipeline-analytics",
36167
36294
  capScope: "device",
36168
36295
  addonId: null,
@@ -36252,12 +36379,6 @@ Object.freeze({
36252
36379
  addonId: null,
36253
36380
  access: "view"
36254
36381
  },
36255
- "pipelineAnalytics.listGroups": {
36256
- capName: "pipeline-analytics",
36257
- capScope: "device",
36258
- addonId: null,
36259
- access: "view"
36260
- },
36261
36382
  "pipelineAnalytics.listOpsLog": {
36262
36383
  capName: "pipeline-analytics",
36263
36384
  capScope: "device",
@@ -36342,6 +36463,12 @@ Object.freeze({
36342
36463
  addonId: null,
36343
36464
  access: "create"
36344
36465
  },
36466
+ "pipelineAnalytics.reclaimDebugMedia": {
36467
+ capName: "pipeline-analytics",
36468
+ capScope: "device",
36469
+ addonId: null,
36470
+ access: "create"
36471
+ },
36345
36472
  "pipelineAnalytics.reconcileFromDisk": {
36346
36473
  capName: "pipeline-analytics",
36347
36474
  capScope: "device",
@@ -37266,6 +37393,12 @@ Object.freeze({
37266
37393
  addonId: null,
37267
37394
  access: "view"
37268
37395
  },
37396
+ "recording.getPlacement": {
37397
+ capName: "recording",
37398
+ capScope: "system",
37399
+ addonId: null,
37400
+ access: "view"
37401
+ },
37269
37402
  "recording.getPlaybackManifest": {
37270
37403
  capName: "recording",
37271
37404
  capScope: "system",
@@ -37392,6 +37525,12 @@ Object.freeze({
37392
37525
  addonId: null,
37393
37526
  access: "create"
37394
37527
  },
37528
+ "recording.setDevicePlacement": {
37529
+ capName: "recording",
37530
+ capScope: "system",
37531
+ addonId: null,
37532
+ access: "create"
37533
+ },
37395
37534
  "recording.startStorageMigrationMove": {
37396
37535
  capName: "recording",
37397
37536
  capScope: "system",
@@ -37836,12 +37975,36 @@ Object.freeze({
37836
37975
  addonId: null,
37837
37976
  access: "create"
37838
37977
  },
37978
+ "storageMigration.cleanupCancel": {
37979
+ capName: "storage-migration",
37980
+ capScope: "system",
37981
+ addonId: null,
37982
+ access: "create"
37983
+ },
37984
+ "storageMigration.cleanupStart": {
37985
+ capName: "storage-migration",
37986
+ capScope: "system",
37987
+ addonId: null,
37988
+ access: "create"
37989
+ },
37990
+ "storageMigration.cleanupStatus": {
37991
+ capName: "storage-migration",
37992
+ capScope: "system",
37993
+ addonId: null,
37994
+ access: "view"
37995
+ },
37839
37996
  "storageMigration.drain": {
37840
37997
  capName: "storage-migration",
37841
37998
  capScope: "system",
37842
37999
  addonId: null,
37843
38000
  access: "create"
37844
38001
  },
38002
+ "storageMigration.history": {
38003
+ capName: "storage-migration",
38004
+ capScope: "system",
38005
+ addonId: null,
38006
+ access: "view"
38007
+ },
37845
38008
  "storageMigration.movers": {
37846
38009
  capName: "storage-migration",
37847
38010
  capScope: "system",
@@ -39838,11 +40001,6 @@ Object.freeze({
39838
40001
  form: "single",
39839
40002
  optional: true
39840
40003
  }],
39841
- "pipelineAnalytics.getGroup": [{
39842
- name: "deviceId",
39843
- form: "single",
39844
- optional: false
39845
- }],
39846
40004
  "pipelineAnalytics.getKeyEvents": [{
39847
40005
  name: "deviceId",
39848
40006
  form: "single",
@@ -39908,11 +40066,6 @@ Object.freeze({
39908
40066
  form: "single",
39909
40067
  optional: false
39910
40068
  }],
39911
- "pipelineAnalytics.listGroups": [{
39912
- name: "deviceIds",
39913
- form: "array",
39914
- optional: false
39915
- }],
39916
40069
  "pipelineAnalytics.listOpsLog": [{
39917
40070
  name: "deviceId",
39918
40071
  form: "single",
@@ -39958,6 +40111,11 @@ Object.freeze({
39958
40111
  form: "single",
39959
40112
  optional: true
39960
40113
  }],
40114
+ "pipelineAnalytics.reclaimDebugMedia": [{
40115
+ name: "deviceIds",
40116
+ form: "array",
40117
+ optional: true
40118
+ }],
39961
40119
  "pipelineAnalytics.reconcileFromDisk": [{
39962
40120
  name: "deviceId",
39963
40121
  form: "single",
@@ -40323,6 +40481,11 @@ Object.freeze({
40323
40481
  form: "single",
40324
40482
  optional: false
40325
40483
  }],
40484
+ "recording.setDevicePlacement": [{
40485
+ name: "deviceId",
40486
+ form: "single",
40487
+ optional: false
40488
+ }],
40326
40489
  "recording.startStorageMigrationMove": [{
40327
40490
  name: "deviceId",
40328
40491
  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.52",
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",