@camstack/addon-provider-gree 0.2.48 → 0.2.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/addon.js +236 -73
  2. package/dist/addon.mjs +236 -73
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -8099,6 +8099,13 @@ var MediaRelocateModeSchema = _enum([
8099
8099
  ]);
8100
8100
  var RelocateMediaInputSchema = object({
8101
8101
  toLocationId: string(),
8102
+ /**
8103
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8104
+ * every row that is not already on `toLocationId` (the historical
8105
+ * behaviour). A named source is what a from→to migration needs: without it
8106
+ * "move events off disk 2" also emptied disk 1.
8107
+ */
8108
+ fromLocationId: string().optional(),
8102
8109
  throttleMbps: number().min(1).max(1e3).optional(),
8103
8110
  /** Omitted = `move`, the pre-existing behaviour. */
8104
8111
  mode: MediaRelocateModeSchema.optional()
@@ -8166,6 +8173,19 @@ var StorageMigrationDestinationsSchema = object({
8166
8173
  galleryMedia: string().min(1).optional()
8167
8174
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8168
8175
  /**
8176
+ * Optional named source per class. Omitted = the class's current default
8177
+ * (the historical behaviour). A named source that is NOT the default is a
8178
+ * drain of that disk: bytes move, the default stays, and the source is
8179
+ * disabled when the move finishes.
8180
+ */
8181
+ var StorageMigrationSourcesSchema = object({
8182
+ recordings: string().min(1).optional(),
8183
+ recordingsLow: string().min(1).optional(),
8184
+ eventMedia: string().min(1).optional(),
8185
+ backups: string().min(1).optional(),
8186
+ galleryMedia: string().min(1).optional()
8187
+ }).optional();
8188
+ /**
8169
8189
  * How a migration sequences the cutover against the byte move.
8170
8190
  *
8171
8191
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8187,6 +8207,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8187
8207
  /** Shared input for planning and starting an orchestrated storage migration. */
8188
8208
  var StorageMigrationInputSchema = object({
8189
8209
  destinations: StorageMigrationDestinationsSchema,
8210
+ /** Omitted = each class's current default. */
8211
+ sources: StorageMigrationSourcesSchema,
8190
8212
  throttleMbps: number().min(1).max(1e3).optional(),
8191
8213
  /** Omitted = `blocking`, which stays the default. */
8192
8214
  mode: StorageMigrationModeSchema.optional()
@@ -8266,6 +8288,13 @@ var StorageMigrationMoveSchema = object({
8266
8288
  storageClass: StorageMigrationClassSchema,
8267
8289
  fromLocationId: string(),
8268
8290
  toLocationId: string(),
8291
+ /**
8292
+ * True when `from` was NOT the class default at plan time. The move still
8293
+ * copies bytes, but the default is left alone and the source is disabled
8294
+ * once the copy verifies. Absent on jobs planned before this field existed
8295
+ * — those jobs always repointed, which is `false`.
8296
+ */
8297
+ freezeSource: boolean().optional(),
8269
8298
  moverJobId: string().nullable(),
8270
8299
  state: RelocateJobStateSchema.nullable(),
8271
8300
  error: string().nullable(),
@@ -8279,6 +8308,7 @@ var StorageMigrationJobSchema = object({
8279
8308
  * can tell a seconds-long cutover from a thirty-hour one. */
8280
8309
  mode: StorageMigrationModeSchema,
8281
8310
  destinations: StorageMigrationDestinationsSchema,
8311
+ sources: StorageMigrationSourcesSchema,
8282
8312
  throttleMbps: number(),
8283
8313
  moves: array(StorageMigrationMoveSchema),
8284
8314
  pauseLeaseId: string().nullable(),
@@ -8304,6 +8334,7 @@ var StorageMigrationFindingSchema = object({
8304
8334
  });
8305
8335
  var StorageMigrationPlanSchema = object({
8306
8336
  destinations: StorageMigrationDestinationsSchema,
8337
+ sources: StorageMigrationSourcesSchema,
8307
8338
  /** The mode this plan was built for. A plan is only valid for its mode: the
8308
8339
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8309
8340
  * it. */
@@ -8311,7 +8342,8 @@ var StorageMigrationPlanSchema = object({
8311
8342
  moves: array(object({
8312
8343
  storageClass: StorageMigrationClassSchema,
8313
8344
  fromLocationId: string(),
8314
- toLocationId: string()
8345
+ toLocationId: string(),
8346
+ freezeSource: boolean().optional()
8315
8347
  })),
8316
8348
  findings: array(StorageMigrationFindingSchema)
8317
8349
  });
@@ -8489,10 +8521,51 @@ var LedgerWalkReportSchema = object({
8489
8521
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8490
8522
  var RelocatableMediaCountInputSchema = object({
8491
8523
  toLocationId: string().min(1),
8524
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8525
+ fromLocationId: string().optional(),
8492
8526
  /** Omitted = `move`. */
8493
8527
  mode: MediaRelocateModeSchema.optional()
8494
8528
  });
8495
8529
  /**
8530
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8531
+ * ghost ledger entries on frozen footage locations.
8532
+ *
8533
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8534
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8535
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8536
+ * with no operator-visible status.
8537
+ */
8538
+ var StorageCleanupPhaseSchema = _enum([
8539
+ "orphans",
8540
+ "debug-media",
8541
+ "ghost-ledger",
8542
+ "done",
8543
+ "failed",
8544
+ "cancelled"
8545
+ ]);
8546
+ var StorageCleanupInputSchema = object({
8547
+ /** Also walk motion stills / track filmstrips. Off by default. */
8548
+ includeDebugMedia: boolean().optional() });
8549
+ var StorageCleanupJobSchema = object({
8550
+ jobId: string(),
8551
+ phase: StorageCleanupPhaseSchema,
8552
+ includeDebugMedia: boolean(),
8553
+ orphansReclaimed: number().int().nonnegative(),
8554
+ orphanBytesReclaimed: number().int().nonnegative(),
8555
+ debugMediaReclaimed: number().int().nonnegative(),
8556
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8557
+ ghostsForgotten: number().int().nonnegative(),
8558
+ ghostBytesForgotten: number().int().nonnegative(),
8559
+ /** Short operator-facing line: current collection, pass, or location. */
8560
+ detail: string().nullable(),
8561
+ cancelRequested: boolean(),
8562
+ startedAt: number(),
8563
+ updatedAt: number(),
8564
+ finishedAt: number().nullable(),
8565
+ error: string().nullable()
8566
+ });
8567
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8568
+ /**
8496
8569
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8497
8570
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8498
8571
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8520,11 +8593,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8520
8593
  * The default location for a type uses `id === <type>:default` by
8521
8594
  * convention (the bare type ref like `'backups'` resolves to it).
8522
8595
  *
8523
- * `isSystem: true` marks a location as orchestrator-seeded and
8524
- * undeletable. The bootstrap-installed defaults (one per type) carry
8525
- * this flag; operator-added locations don't. Editing the config of
8526
- * a system location is allowed (path migration, provider swap) but
8527
- * deleting it is rejected at the cap level.
8596
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8597
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8598
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8599
+ * / last-enabled, not on this bit.
8528
8600
  */
8529
8601
  var StorageLocationSchema = object({
8530
8602
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -13050,6 +13122,12 @@ method(object({
13050
13122
  }), _void(), {
13051
13123
  kind: "mutation",
13052
13124
  auth: "admin"
13125
+ }), method(object({
13126
+ from: string(),
13127
+ to: string()
13128
+ }), object({ moved: number() }), {
13129
+ kind: "mutation",
13130
+ auth: "admin"
13053
13131
  }), method(object({
13054
13132
  deviceId: number(),
13055
13133
  disabled: boolean()
@@ -15800,6 +15878,8 @@ var NcSystemEventKindSchema = _enum([
15800
15878
  "device-offline",
15801
15879
  "device-disabled",
15802
15880
  "device-enabled",
15881
+ "device-battery-low",
15882
+ "device-battery-normal",
15803
15883
  "stream-online",
15804
15884
  "stream-offline",
15805
15885
  "node-online",
@@ -19058,46 +19138,6 @@ var RecentTracksPageSchema = object({
19058
19138
  /** Cursor for the next page, or null when this page is the last. */
19059
19139
  nextCursor: string().nullable()
19060
19140
  });
19061
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
19062
- var LIST_GROUPS_MAX_LIMIT = 100;
19063
- var AnalyticsGroupRecordSchema = object({
19064
- id: string(),
19065
- deviceId: number().int(),
19066
- openedAt: number().int(),
19067
- closedAt: number().int(),
19068
- timestamp: number().int(),
19069
- memberCount: number().int(),
19070
- memberTrackIds: array(string()).readonly(),
19071
- className: string(),
19072
- classes: array(string()).readonly(),
19073
- /** Relative event-media path, or null when the group has no picture yet. */
19074
- mediaUrl: string().nullable(),
19075
- singleton: boolean()
19076
- });
19077
- var AnalyticsGroupMemberSchema = object({
19078
- trackId: string(),
19079
- deviceId: number().int(),
19080
- className: string(),
19081
- firstSeen: number().int(),
19082
- lastSeen: number().int(),
19083
- mediaUrl: string().nullable()
19084
- });
19085
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
19086
- var ListGroupsQueryInput = object({
19087
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
19088
- deviceIds: array(number()),
19089
- /** Window lower bound on `closedAt` (inclusive). */
19090
- since: number().optional(),
19091
- /** Window upper bound on `openedAt` (inclusive). */
19092
- until: number().optional(),
19093
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
19094
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
19095
- cursor: string().optional()
19096
- });
19097
- var ListGroupsPageSchema = object({
19098
- groups: array(AnalyticsGroupRecordSchema).readonly(),
19099
- nextCursor: string().nullable()
19100
- });
19101
19141
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19102
19142
  var KEY_EVENTS_MAX_LIMIT = 200;
19103
19143
  var KeyEventQueryInput = object({
@@ -19201,9 +19241,7 @@ var TrackCascadeCountsSchema = object({
19201
19241
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19202
19242
  plates: number().int(),
19203
19243
  /** Per-track CLIP search vectors removed (best-effort). */
19204
- embeddings: number().int(),
19205
- /** Group membership + group rows removed with their last member (best-effort). */
19206
- groups: number().int()
19244
+ embeddings: number().int()
19207
19245
  });
19208
19246
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19209
19247
  var DiskReconcileCountsSchema = object({
@@ -19373,6 +19411,47 @@ var RebuildStatusSchema = object({
19373
19411
  /** Present when the pass ended by throwing. */
19374
19412
  error: string().nullable()
19375
19413
  });
19414
+ /**
19415
+ * Acknowledgement that a debug-media reclaim STARTED.
19416
+ *
19417
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19418
+ * it runs detached and this returns immediately. Awaiting it is how the
19419
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19420
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19421
+ */
19422
+ var MediaReclaimStartResultSchema = object({
19423
+ started: boolean(),
19424
+ /** True when a pass was already running; the new request is ignored. */
19425
+ alreadyRunning: boolean()
19426
+ });
19427
+ var MediaReclaimInputSchema = object({
19428
+ mode: _enum(["report", "reclaim"]).default("report"),
19429
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19430
+ deviceIds: array(number().int()).min(1).optional(),
19431
+ restart: boolean().optional(),
19432
+ pageSize: number().int().min(50).max(5e3).optional(),
19433
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19434
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19435
+ maxBytesPerRun: number().int().min(1).optional(),
19436
+ budgetMinutes: number().int().min(1).max(720).optional(),
19437
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19438
+ graceMinutes: number().int().min(1).max(10080).optional()
19439
+ });
19440
+ var MediaReclaimStatusSchema = object({
19441
+ running: boolean(),
19442
+ mode: _enum(["report", "reclaim"]).nullable(),
19443
+ totalExamined: number(),
19444
+ totalEligible: number(),
19445
+ totalReclaimed: number(),
19446
+ totalBytesReclaimed: number(),
19447
+ totalRefused: number(),
19448
+ /** Device+scope windows finished in this pass. */
19449
+ devicesDone: number(),
19450
+ complete: boolean().nullable(),
19451
+ startedAtMs: number().nullable(),
19452
+ finishedAtMs: number().nullable(),
19453
+ error: string().nullable()
19454
+ });
19376
19455
  var ReplayFrameInputSchema = object({
19377
19456
  timestamp: number(),
19378
19457
  frame: PipelineRunResultBridge
@@ -19411,10 +19490,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19411
19490
  * stationary registry). Default false: the timeline lists passages,
19412
19491
  * not parking records (operator decision, 2026-08-15). */
19413
19492
  includeStationary: boolean().optional()
19414
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19415
- deviceId: number(),
19416
- groupId: string().min(1)
19417
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19493
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19418
19494
  kind: "mutation",
19419
19495
  auth: "admin"
19420
19496
  }), 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({
@@ -19514,6 +19590,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19514
19590
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19515
19591
  kind: "query",
19516
19592
  auth: "admin"
19593
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19594
+ kind: "mutation",
19595
+ auth: "admin"
19596
+ }), method(object({}), MediaReclaimStatusSchema, {
19597
+ kind: "query",
19598
+ auth: "admin"
19517
19599
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19518
19600
  kind: "query",
19519
19601
  auth: "admin"
@@ -21484,7 +21566,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21484
21566
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21485
21567
  kind: "mutation",
21486
21568
  auth: "admin"
21487
- });
21569
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21570
+ kind: "mutation",
21571
+ auth: "admin"
21572
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21573
+ kind: "mutation",
21574
+ auth: "admin"
21575
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21488
21576
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21489
21577
  providerId: string().min(1),
21490
21578
  displayName: string().min(1),
@@ -28577,6 +28665,33 @@ var RecordingRebalanceInputSchema = object({
28577
28665
  minMoveGb: number().min(0).optional()
28578
28666
  });
28579
28667
  /**
28668
+ * Operator-facing placement of one camera onto a recordings location.
28669
+ *
28670
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
28671
+ * Auto (the planner may move this camera). `locationId` is where high/mid
28672
+ * currently write — the plan, which may disagree with the pin when Auto.
28673
+ */
28674
+ var RecordingDevicePlacementSchema = object({
28675
+ deviceId: number().int(),
28676
+ profile: string(),
28677
+ locationId: string()
28678
+ });
28679
+ var RecordingDevicePinSchema = object({
28680
+ deviceId: number().int(),
28681
+ /** Recordings-class location this camera is pinned to. */
28682
+ locationId: string()
28683
+ });
28684
+ var RecordingPlacementViewSchema = object({
28685
+ assignments: array(RecordingDevicePlacementSchema),
28686
+ pins: array(RecordingDevicePinSchema),
28687
+ defaultLocations: record(string(), string())
28688
+ });
28689
+ var RecordingSetDevicePlacementInputSchema = object({
28690
+ deviceId: number().int(),
28691
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
28692
+ locationId: string().nullable()
28693
+ });
28694
+ /**
28580
28695
  * Result of locating footage at a wall-clock instant for one device/profile.
28581
28696
  * `segment` carries the covering segment's window; `gap` reports the forward
28582
28697
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -28802,6 +28917,12 @@ method(object({
28802
28917
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
28803
28918
  kind: "mutation",
28804
28919
  auth: "admin"
28920
+ }), method(object({}), RecordingPlacementViewSchema, {
28921
+ kind: "query",
28922
+ auth: "admin"
28923
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
28924
+ kind: "mutation",
28925
+ auth: "admin"
28805
28926
  });
28806
28927
  /**
28807
28928
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -33871,6 +33992,12 @@ Object.freeze({
33871
33992
  addonId: null,
33872
33993
  access: "delete"
33873
33994
  },
33995
+ "deviceManager.renameLocation": {
33996
+ capName: "device-manager",
33997
+ capScope: "system",
33998
+ addonId: null,
33999
+ access: "create"
34000
+ },
33874
34001
  "deviceManager.runDeviceAction": {
33875
34002
  capName: "device-manager",
33876
34003
  capScope: "system",
@@ -35563,19 +35690,19 @@ Object.freeze({
35563
35690
  addonId: null,
35564
35691
  access: "view"
35565
35692
  },
35566
- "pipelineAnalytics.getGroup": {
35693
+ "pipelineAnalytics.getKeyEvents": {
35567
35694
  capName: "pipeline-analytics",
35568
35695
  capScope: "device",
35569
35696
  addonId: null,
35570
35697
  access: "view"
35571
35698
  },
35572
- "pipelineAnalytics.getKeyEvents": {
35699
+ "pipelineAnalytics.getKeyEventsBatch": {
35573
35700
  capName: "pipeline-analytics",
35574
35701
  capScope: "device",
35575
35702
  addonId: null,
35576
35703
  access: "view"
35577
35704
  },
35578
- "pipelineAnalytics.getKeyEventsBatch": {
35705
+ "pipelineAnalytics.getMediaReclaimStatus": {
35579
35706
  capName: "pipeline-analytics",
35580
35707
  capScope: "device",
35581
35708
  addonId: null,
@@ -35665,12 +35792,6 @@ Object.freeze({
35665
35792
  addonId: null,
35666
35793
  access: "view"
35667
35794
  },
35668
- "pipelineAnalytics.listGroups": {
35669
- capName: "pipeline-analytics",
35670
- capScope: "device",
35671
- addonId: null,
35672
- access: "view"
35673
- },
35674
35795
  "pipelineAnalytics.listOpsLog": {
35675
35796
  capName: "pipeline-analytics",
35676
35797
  capScope: "device",
@@ -35755,6 +35876,12 @@ Object.freeze({
35755
35876
  addonId: null,
35756
35877
  access: "create"
35757
35878
  },
35879
+ "pipelineAnalytics.reclaimDebugMedia": {
35880
+ capName: "pipeline-analytics",
35881
+ capScope: "device",
35882
+ addonId: null,
35883
+ access: "create"
35884
+ },
35758
35885
  "pipelineAnalytics.reconcileFromDisk": {
35759
35886
  capName: "pipeline-analytics",
35760
35887
  capScope: "device",
@@ -36679,6 +36806,12 @@ Object.freeze({
36679
36806
  addonId: null,
36680
36807
  access: "view"
36681
36808
  },
36809
+ "recording.getPlacement": {
36810
+ capName: "recording",
36811
+ capScope: "system",
36812
+ addonId: null,
36813
+ access: "view"
36814
+ },
36682
36815
  "recording.getPlaybackManifest": {
36683
36816
  capName: "recording",
36684
36817
  capScope: "system",
@@ -36805,6 +36938,12 @@ Object.freeze({
36805
36938
  addonId: null,
36806
36939
  access: "create"
36807
36940
  },
36941
+ "recording.setDevicePlacement": {
36942
+ capName: "recording",
36943
+ capScope: "system",
36944
+ addonId: null,
36945
+ access: "create"
36946
+ },
36808
36947
  "recording.startStorageMigrationMove": {
36809
36948
  capName: "recording",
36810
36949
  capScope: "system",
@@ -37249,12 +37388,36 @@ Object.freeze({
37249
37388
  addonId: null,
37250
37389
  access: "create"
37251
37390
  },
37391
+ "storageMigration.cleanupCancel": {
37392
+ capName: "storage-migration",
37393
+ capScope: "system",
37394
+ addonId: null,
37395
+ access: "create"
37396
+ },
37397
+ "storageMigration.cleanupStart": {
37398
+ capName: "storage-migration",
37399
+ capScope: "system",
37400
+ addonId: null,
37401
+ access: "create"
37402
+ },
37403
+ "storageMigration.cleanupStatus": {
37404
+ capName: "storage-migration",
37405
+ capScope: "system",
37406
+ addonId: null,
37407
+ access: "view"
37408
+ },
37252
37409
  "storageMigration.drain": {
37253
37410
  capName: "storage-migration",
37254
37411
  capScope: "system",
37255
37412
  addonId: null,
37256
37413
  access: "create"
37257
37414
  },
37415
+ "storageMigration.history": {
37416
+ capName: "storage-migration",
37417
+ capScope: "system",
37418
+ addonId: null,
37419
+ access: "view"
37420
+ },
37258
37421
  "storageMigration.movers": {
37259
37422
  capName: "storage-migration",
37260
37423
  capScope: "system",
@@ -39251,11 +39414,6 @@ Object.freeze({
39251
39414
  form: "single",
39252
39415
  optional: true
39253
39416
  }],
39254
- "pipelineAnalytics.getGroup": [{
39255
- name: "deviceId",
39256
- form: "single",
39257
- optional: false
39258
- }],
39259
39417
  "pipelineAnalytics.getKeyEvents": [{
39260
39418
  name: "deviceId",
39261
39419
  form: "single",
@@ -39321,11 +39479,6 @@ Object.freeze({
39321
39479
  form: "single",
39322
39480
  optional: false
39323
39481
  }],
39324
- "pipelineAnalytics.listGroups": [{
39325
- name: "deviceIds",
39326
- form: "array",
39327
- optional: false
39328
- }],
39329
39482
  "pipelineAnalytics.listOpsLog": [{
39330
39483
  name: "deviceId",
39331
39484
  form: "single",
@@ -39371,6 +39524,11 @@ Object.freeze({
39371
39524
  form: "single",
39372
39525
  optional: true
39373
39526
  }],
39527
+ "pipelineAnalytics.reclaimDebugMedia": [{
39528
+ name: "deviceIds",
39529
+ form: "array",
39530
+ optional: true
39531
+ }],
39374
39532
  "pipelineAnalytics.reconcileFromDisk": [{
39375
39533
  name: "deviceId",
39376
39534
  form: "single",
@@ -39736,6 +39894,11 @@ Object.freeze({
39736
39894
  form: "single",
39737
39895
  optional: false
39738
39896
  }],
39897
+ "recording.setDevicePlacement": [{
39898
+ name: "deviceId",
39899
+ form: "single",
39900
+ optional: false
39901
+ }],
39739
39902
  "recording.startStorageMigrationMove": [{
39740
39903
  name: "deviceId",
39741
39904
  form: "single",
package/dist/addon.mjs CHANGED
@@ -8098,6 +8098,13 @@ var MediaRelocateModeSchema = _enum([
8098
8098
  ]);
8099
8099
  var RelocateMediaInputSchema = object({
8100
8100
  toLocationId: string(),
8101
+ /**
8102
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8103
+ * every row that is not already on `toLocationId` (the historical
8104
+ * behaviour). A named source is what a from→to migration needs: without it
8105
+ * "move events off disk 2" also emptied disk 1.
8106
+ */
8107
+ fromLocationId: string().optional(),
8101
8108
  throttleMbps: number().min(1).max(1e3).optional(),
8102
8109
  /** Omitted = `move`, the pre-existing behaviour. */
8103
8110
  mode: MediaRelocateModeSchema.optional()
@@ -8165,6 +8172,19 @@ var StorageMigrationDestinationsSchema = object({
8165
8172
  galleryMedia: string().min(1).optional()
8166
8173
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8167
8174
  /**
8175
+ * Optional named source per class. Omitted = the class's current default
8176
+ * (the historical behaviour). A named source that is NOT the default is a
8177
+ * drain of that disk: bytes move, the default stays, and the source is
8178
+ * disabled when the move finishes.
8179
+ */
8180
+ var StorageMigrationSourcesSchema = object({
8181
+ recordings: string().min(1).optional(),
8182
+ recordingsLow: string().min(1).optional(),
8183
+ eventMedia: string().min(1).optional(),
8184
+ backups: string().min(1).optional(),
8185
+ galleryMedia: string().min(1).optional()
8186
+ }).optional();
8187
+ /**
8168
8188
  * How a migration sequences the cutover against the byte move.
8169
8189
  *
8170
8190
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8186,6 +8206,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8186
8206
  /** Shared input for planning and starting an orchestrated storage migration. */
8187
8207
  var StorageMigrationInputSchema = object({
8188
8208
  destinations: StorageMigrationDestinationsSchema,
8209
+ /** Omitted = each class's current default. */
8210
+ sources: StorageMigrationSourcesSchema,
8189
8211
  throttleMbps: number().min(1).max(1e3).optional(),
8190
8212
  /** Omitted = `blocking`, which stays the default. */
8191
8213
  mode: StorageMigrationModeSchema.optional()
@@ -8265,6 +8287,13 @@ var StorageMigrationMoveSchema = object({
8265
8287
  storageClass: StorageMigrationClassSchema,
8266
8288
  fromLocationId: string(),
8267
8289
  toLocationId: string(),
8290
+ /**
8291
+ * True when `from` was NOT the class default at plan time. The move still
8292
+ * copies bytes, but the default is left alone and the source is disabled
8293
+ * once the copy verifies. Absent on jobs planned before this field existed
8294
+ * — those jobs always repointed, which is `false`.
8295
+ */
8296
+ freezeSource: boolean().optional(),
8268
8297
  moverJobId: string().nullable(),
8269
8298
  state: RelocateJobStateSchema.nullable(),
8270
8299
  error: string().nullable(),
@@ -8278,6 +8307,7 @@ var StorageMigrationJobSchema = object({
8278
8307
  * can tell a seconds-long cutover from a thirty-hour one. */
8279
8308
  mode: StorageMigrationModeSchema,
8280
8309
  destinations: StorageMigrationDestinationsSchema,
8310
+ sources: StorageMigrationSourcesSchema,
8281
8311
  throttleMbps: number(),
8282
8312
  moves: array(StorageMigrationMoveSchema),
8283
8313
  pauseLeaseId: string().nullable(),
@@ -8303,6 +8333,7 @@ var StorageMigrationFindingSchema = object({
8303
8333
  });
8304
8334
  var StorageMigrationPlanSchema = object({
8305
8335
  destinations: StorageMigrationDestinationsSchema,
8336
+ sources: StorageMigrationSourcesSchema,
8306
8337
  /** The mode this plan was built for. A plan is only valid for its mode: the
8307
8338
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8308
8339
  * it. */
@@ -8310,7 +8341,8 @@ var StorageMigrationPlanSchema = object({
8310
8341
  moves: array(object({
8311
8342
  storageClass: StorageMigrationClassSchema,
8312
8343
  fromLocationId: string(),
8313
- toLocationId: string()
8344
+ toLocationId: string(),
8345
+ freezeSource: boolean().optional()
8314
8346
  })),
8315
8347
  findings: array(StorageMigrationFindingSchema)
8316
8348
  });
@@ -8488,10 +8520,51 @@ var LedgerWalkReportSchema = object({
8488
8520
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8489
8521
  var RelocatableMediaCountInputSchema = object({
8490
8522
  toLocationId: string().min(1),
8523
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8524
+ fromLocationId: string().optional(),
8491
8525
  /** Omitted = `move`. */
8492
8526
  mode: MediaRelocateModeSchema.optional()
8493
8527
  });
8494
8528
  /**
8529
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8530
+ * ghost ledger entries on frozen footage locations.
8531
+ *
8532
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8533
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8534
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8535
+ * with no operator-visible status.
8536
+ */
8537
+ var StorageCleanupPhaseSchema = _enum([
8538
+ "orphans",
8539
+ "debug-media",
8540
+ "ghost-ledger",
8541
+ "done",
8542
+ "failed",
8543
+ "cancelled"
8544
+ ]);
8545
+ var StorageCleanupInputSchema = object({
8546
+ /** Also walk motion stills / track filmstrips. Off by default. */
8547
+ includeDebugMedia: boolean().optional() });
8548
+ var StorageCleanupJobSchema = object({
8549
+ jobId: string(),
8550
+ phase: StorageCleanupPhaseSchema,
8551
+ includeDebugMedia: boolean(),
8552
+ orphansReclaimed: number().int().nonnegative(),
8553
+ orphanBytesReclaimed: number().int().nonnegative(),
8554
+ debugMediaReclaimed: number().int().nonnegative(),
8555
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8556
+ ghostsForgotten: number().int().nonnegative(),
8557
+ ghostBytesForgotten: number().int().nonnegative(),
8558
+ /** Short operator-facing line: current collection, pass, or location. */
8559
+ detail: string().nullable(),
8560
+ cancelRequested: boolean(),
8561
+ startedAt: number(),
8562
+ updatedAt: number(),
8563
+ finishedAt: number().nullable(),
8564
+ error: string().nullable()
8565
+ });
8566
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8567
+ /**
8495
8568
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8496
8569
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8497
8570
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8519,11 +8592,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8519
8592
  * The default location for a type uses `id === <type>:default` by
8520
8593
  * convention (the bare type ref like `'backups'` resolves to it).
8521
8594
  *
8522
- * `isSystem: true` marks a location as orchestrator-seeded and
8523
- * undeletable. The bootstrap-installed defaults (one per type) carry
8524
- * this flag; operator-added locations don't. Editing the config of
8525
- * a system location is allowed (path migration, provider swap) but
8526
- * deleting it is rejected at the cap level.
8595
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8596
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8597
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8598
+ * / last-enabled, not on this bit.
8527
8599
  */
8528
8600
  var StorageLocationSchema = object({
8529
8601
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -13049,6 +13121,12 @@ method(object({
13049
13121
  }), _void(), {
13050
13122
  kind: "mutation",
13051
13123
  auth: "admin"
13124
+ }), method(object({
13125
+ from: string(),
13126
+ to: string()
13127
+ }), object({ moved: number() }), {
13128
+ kind: "mutation",
13129
+ auth: "admin"
13052
13130
  }), method(object({
13053
13131
  deviceId: number(),
13054
13132
  disabled: boolean()
@@ -15799,6 +15877,8 @@ var NcSystemEventKindSchema = _enum([
15799
15877
  "device-offline",
15800
15878
  "device-disabled",
15801
15879
  "device-enabled",
15880
+ "device-battery-low",
15881
+ "device-battery-normal",
15802
15882
  "stream-online",
15803
15883
  "stream-offline",
15804
15884
  "node-online",
@@ -19057,46 +19137,6 @@ var RecentTracksPageSchema = object({
19057
19137
  /** Cursor for the next page, or null when this page is the last. */
19058
19138
  nextCursor: string().nullable()
19059
19139
  });
19060
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
19061
- var LIST_GROUPS_MAX_LIMIT = 100;
19062
- var AnalyticsGroupRecordSchema = object({
19063
- id: string(),
19064
- deviceId: number().int(),
19065
- openedAt: number().int(),
19066
- closedAt: number().int(),
19067
- timestamp: number().int(),
19068
- memberCount: number().int(),
19069
- memberTrackIds: array(string()).readonly(),
19070
- className: string(),
19071
- classes: array(string()).readonly(),
19072
- /** Relative event-media path, or null when the group has no picture yet. */
19073
- mediaUrl: string().nullable(),
19074
- singleton: boolean()
19075
- });
19076
- var AnalyticsGroupMemberSchema = object({
19077
- trackId: string(),
19078
- deviceId: number().int(),
19079
- className: string(),
19080
- firstSeen: number().int(),
19081
- lastSeen: number().int(),
19082
- mediaUrl: string().nullable()
19083
- });
19084
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
19085
- var ListGroupsQueryInput = object({
19086
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
19087
- deviceIds: array(number()),
19088
- /** Window lower bound on `closedAt` (inclusive). */
19089
- since: number().optional(),
19090
- /** Window upper bound on `openedAt` (inclusive). */
19091
- until: number().optional(),
19092
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
19093
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
19094
- cursor: string().optional()
19095
- });
19096
- var ListGroupsPageSchema = object({
19097
- groups: array(AnalyticsGroupRecordSchema).readonly(),
19098
- nextCursor: string().nullable()
19099
- });
19100
19140
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19101
19141
  var KEY_EVENTS_MAX_LIMIT = 200;
19102
19142
  var KeyEventQueryInput = object({
@@ -19200,9 +19240,7 @@ var TrackCascadeCountsSchema = object({
19200
19240
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19201
19241
  plates: number().int(),
19202
19242
  /** Per-track CLIP search vectors removed (best-effort). */
19203
- embeddings: number().int(),
19204
- /** Group membership + group rows removed with their last member (best-effort). */
19205
- groups: number().int()
19243
+ embeddings: number().int()
19206
19244
  });
19207
19245
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19208
19246
  var DiskReconcileCountsSchema = object({
@@ -19372,6 +19410,47 @@ var RebuildStatusSchema = object({
19372
19410
  /** Present when the pass ended by throwing. */
19373
19411
  error: string().nullable()
19374
19412
  });
19413
+ /**
19414
+ * Acknowledgement that a debug-media reclaim STARTED.
19415
+ *
19416
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19417
+ * it runs detached and this returns immediately. Awaiting it is how the
19418
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19419
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19420
+ */
19421
+ var MediaReclaimStartResultSchema = object({
19422
+ started: boolean(),
19423
+ /** True when a pass was already running; the new request is ignored. */
19424
+ alreadyRunning: boolean()
19425
+ });
19426
+ var MediaReclaimInputSchema = object({
19427
+ mode: _enum(["report", "reclaim"]).default("report"),
19428
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19429
+ deviceIds: array(number().int()).min(1).optional(),
19430
+ restart: boolean().optional(),
19431
+ pageSize: number().int().min(50).max(5e3).optional(),
19432
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19433
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19434
+ maxBytesPerRun: number().int().min(1).optional(),
19435
+ budgetMinutes: number().int().min(1).max(720).optional(),
19436
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19437
+ graceMinutes: number().int().min(1).max(10080).optional()
19438
+ });
19439
+ var MediaReclaimStatusSchema = object({
19440
+ running: boolean(),
19441
+ mode: _enum(["report", "reclaim"]).nullable(),
19442
+ totalExamined: number(),
19443
+ totalEligible: number(),
19444
+ totalReclaimed: number(),
19445
+ totalBytesReclaimed: number(),
19446
+ totalRefused: number(),
19447
+ /** Device+scope windows finished in this pass. */
19448
+ devicesDone: number(),
19449
+ complete: boolean().nullable(),
19450
+ startedAtMs: number().nullable(),
19451
+ finishedAtMs: number().nullable(),
19452
+ error: string().nullable()
19453
+ });
19375
19454
  var ReplayFrameInputSchema = object({
19376
19455
  timestamp: number(),
19377
19456
  frame: PipelineRunResultBridge
@@ -19410,10 +19489,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19410
19489
  * stationary registry). Default false: the timeline lists passages,
19411
19490
  * not parking records (operator decision, 2026-08-15). */
19412
19491
  includeStationary: boolean().optional()
19413
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19414
- deviceId: number(),
19415
- groupId: string().min(1)
19416
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19492
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19417
19493
  kind: "mutation",
19418
19494
  auth: "admin"
19419
19495
  }), 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({
@@ -19513,6 +19589,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19513
19589
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19514
19590
  kind: "query",
19515
19591
  auth: "admin"
19592
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19593
+ kind: "mutation",
19594
+ auth: "admin"
19595
+ }), method(object({}), MediaReclaimStatusSchema, {
19596
+ kind: "query",
19597
+ auth: "admin"
19516
19598
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19517
19599
  kind: "query",
19518
19600
  auth: "admin"
@@ -21483,7 +21565,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21483
21565
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21484
21566
  kind: "mutation",
21485
21567
  auth: "admin"
21486
- });
21568
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21569
+ kind: "mutation",
21570
+ auth: "admin"
21571
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21572
+ kind: "mutation",
21573
+ auth: "admin"
21574
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21487
21575
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21488
21576
  providerId: string().min(1),
21489
21577
  displayName: string().min(1),
@@ -28576,6 +28664,33 @@ var RecordingRebalanceInputSchema = object({
28576
28664
  minMoveGb: number().min(0).optional()
28577
28665
  });
28578
28666
  /**
28667
+ * Operator-facing placement of one camera onto a recordings location.
28668
+ *
28669
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
28670
+ * Auto (the planner may move this camera). `locationId` is where high/mid
28671
+ * currently write — the plan, which may disagree with the pin when Auto.
28672
+ */
28673
+ var RecordingDevicePlacementSchema = object({
28674
+ deviceId: number().int(),
28675
+ profile: string(),
28676
+ locationId: string()
28677
+ });
28678
+ var RecordingDevicePinSchema = object({
28679
+ deviceId: number().int(),
28680
+ /** Recordings-class location this camera is pinned to. */
28681
+ locationId: string()
28682
+ });
28683
+ var RecordingPlacementViewSchema = object({
28684
+ assignments: array(RecordingDevicePlacementSchema),
28685
+ pins: array(RecordingDevicePinSchema),
28686
+ defaultLocations: record(string(), string())
28687
+ });
28688
+ var RecordingSetDevicePlacementInputSchema = object({
28689
+ deviceId: number().int(),
28690
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
28691
+ locationId: string().nullable()
28692
+ });
28693
+ /**
28579
28694
  * Result of locating footage at a wall-clock instant for one device/profile.
28580
28695
  * `segment` carries the covering segment's window; `gap` reports the forward
28581
28696
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -28801,6 +28916,12 @@ method(object({
28801
28916
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
28802
28917
  kind: "mutation",
28803
28918
  auth: "admin"
28919
+ }), method(object({}), RecordingPlacementViewSchema, {
28920
+ kind: "query",
28921
+ auth: "admin"
28922
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
28923
+ kind: "mutation",
28924
+ auth: "admin"
28804
28925
  });
28805
28926
  /**
28806
28927
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -33870,6 +33991,12 @@ Object.freeze({
33870
33991
  addonId: null,
33871
33992
  access: "delete"
33872
33993
  },
33994
+ "deviceManager.renameLocation": {
33995
+ capName: "device-manager",
33996
+ capScope: "system",
33997
+ addonId: null,
33998
+ access: "create"
33999
+ },
33873
34000
  "deviceManager.runDeviceAction": {
33874
34001
  capName: "device-manager",
33875
34002
  capScope: "system",
@@ -35562,19 +35689,19 @@ Object.freeze({
35562
35689
  addonId: null,
35563
35690
  access: "view"
35564
35691
  },
35565
- "pipelineAnalytics.getGroup": {
35692
+ "pipelineAnalytics.getKeyEvents": {
35566
35693
  capName: "pipeline-analytics",
35567
35694
  capScope: "device",
35568
35695
  addonId: null,
35569
35696
  access: "view"
35570
35697
  },
35571
- "pipelineAnalytics.getKeyEvents": {
35698
+ "pipelineAnalytics.getKeyEventsBatch": {
35572
35699
  capName: "pipeline-analytics",
35573
35700
  capScope: "device",
35574
35701
  addonId: null,
35575
35702
  access: "view"
35576
35703
  },
35577
- "pipelineAnalytics.getKeyEventsBatch": {
35704
+ "pipelineAnalytics.getMediaReclaimStatus": {
35578
35705
  capName: "pipeline-analytics",
35579
35706
  capScope: "device",
35580
35707
  addonId: null,
@@ -35664,12 +35791,6 @@ Object.freeze({
35664
35791
  addonId: null,
35665
35792
  access: "view"
35666
35793
  },
35667
- "pipelineAnalytics.listGroups": {
35668
- capName: "pipeline-analytics",
35669
- capScope: "device",
35670
- addonId: null,
35671
- access: "view"
35672
- },
35673
35794
  "pipelineAnalytics.listOpsLog": {
35674
35795
  capName: "pipeline-analytics",
35675
35796
  capScope: "device",
@@ -35754,6 +35875,12 @@ Object.freeze({
35754
35875
  addonId: null,
35755
35876
  access: "create"
35756
35877
  },
35878
+ "pipelineAnalytics.reclaimDebugMedia": {
35879
+ capName: "pipeline-analytics",
35880
+ capScope: "device",
35881
+ addonId: null,
35882
+ access: "create"
35883
+ },
35757
35884
  "pipelineAnalytics.reconcileFromDisk": {
35758
35885
  capName: "pipeline-analytics",
35759
35886
  capScope: "device",
@@ -36678,6 +36805,12 @@ Object.freeze({
36678
36805
  addonId: null,
36679
36806
  access: "view"
36680
36807
  },
36808
+ "recording.getPlacement": {
36809
+ capName: "recording",
36810
+ capScope: "system",
36811
+ addonId: null,
36812
+ access: "view"
36813
+ },
36681
36814
  "recording.getPlaybackManifest": {
36682
36815
  capName: "recording",
36683
36816
  capScope: "system",
@@ -36804,6 +36937,12 @@ Object.freeze({
36804
36937
  addonId: null,
36805
36938
  access: "create"
36806
36939
  },
36940
+ "recording.setDevicePlacement": {
36941
+ capName: "recording",
36942
+ capScope: "system",
36943
+ addonId: null,
36944
+ access: "create"
36945
+ },
36807
36946
  "recording.startStorageMigrationMove": {
36808
36947
  capName: "recording",
36809
36948
  capScope: "system",
@@ -37248,12 +37387,36 @@ Object.freeze({
37248
37387
  addonId: null,
37249
37388
  access: "create"
37250
37389
  },
37390
+ "storageMigration.cleanupCancel": {
37391
+ capName: "storage-migration",
37392
+ capScope: "system",
37393
+ addonId: null,
37394
+ access: "create"
37395
+ },
37396
+ "storageMigration.cleanupStart": {
37397
+ capName: "storage-migration",
37398
+ capScope: "system",
37399
+ addonId: null,
37400
+ access: "create"
37401
+ },
37402
+ "storageMigration.cleanupStatus": {
37403
+ capName: "storage-migration",
37404
+ capScope: "system",
37405
+ addonId: null,
37406
+ access: "view"
37407
+ },
37251
37408
  "storageMigration.drain": {
37252
37409
  capName: "storage-migration",
37253
37410
  capScope: "system",
37254
37411
  addonId: null,
37255
37412
  access: "create"
37256
37413
  },
37414
+ "storageMigration.history": {
37415
+ capName: "storage-migration",
37416
+ capScope: "system",
37417
+ addonId: null,
37418
+ access: "view"
37419
+ },
37257
37420
  "storageMigration.movers": {
37258
37421
  capName: "storage-migration",
37259
37422
  capScope: "system",
@@ -39250,11 +39413,6 @@ Object.freeze({
39250
39413
  form: "single",
39251
39414
  optional: true
39252
39415
  }],
39253
- "pipelineAnalytics.getGroup": [{
39254
- name: "deviceId",
39255
- form: "single",
39256
- optional: false
39257
- }],
39258
39416
  "pipelineAnalytics.getKeyEvents": [{
39259
39417
  name: "deviceId",
39260
39418
  form: "single",
@@ -39320,11 +39478,6 @@ Object.freeze({
39320
39478
  form: "single",
39321
39479
  optional: false
39322
39480
  }],
39323
- "pipelineAnalytics.listGroups": [{
39324
- name: "deviceIds",
39325
- form: "array",
39326
- optional: false
39327
- }],
39328
39481
  "pipelineAnalytics.listOpsLog": [{
39329
39482
  name: "deviceId",
39330
39483
  form: "single",
@@ -39370,6 +39523,11 @@ Object.freeze({
39370
39523
  form: "single",
39371
39524
  optional: true
39372
39525
  }],
39526
+ "pipelineAnalytics.reclaimDebugMedia": [{
39527
+ name: "deviceIds",
39528
+ form: "array",
39529
+ optional: true
39530
+ }],
39373
39531
  "pipelineAnalytics.reconcileFromDisk": [{
39374
39532
  name: "deviceId",
39375
39533
  form: "single",
@@ -39735,6 +39893,11 @@ Object.freeze({
39735
39893
  form: "single",
39736
39894
  optional: false
39737
39895
  }],
39896
+ "recording.setDevicePlacement": [{
39897
+ name: "deviceId",
39898
+ form: "single",
39899
+ optional: false
39900
+ }],
39738
39901
  "recording.startStorageMigrationMove": [{
39739
39902
  name: "deviceId",
39740
39903
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-gree",
3
- "version": "0.2.48",
3
+ "version": "0.2.50",
4
4
  "description": "Gree air-conditioner device-provider addon for CamStack — wraps the @apocaliss92/nodegree local-UDP client (LAN discovery + AES control), exposing climate-control and fan-control",
5
5
  "keywords": [
6
6
  "camstack",