@camstack/addon-provider-gree 0.2.48 → 0.2.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/addon.js +234 -73
  2. package/dist/addon.mjs +234 -73
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -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()
@@ -19058,46 +19136,6 @@ var RecentTracksPageSchema = object({
19058
19136
  /** Cursor for the next page, or null when this page is the last. */
19059
19137
  nextCursor: string().nullable()
19060
19138
  });
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
19139
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19102
19140
  var KEY_EVENTS_MAX_LIMIT = 200;
19103
19141
  var KeyEventQueryInput = object({
@@ -19201,9 +19239,7 @@ var TrackCascadeCountsSchema = object({
19201
19239
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19202
19240
  plates: number().int(),
19203
19241
  /** 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()
19242
+ embeddings: number().int()
19207
19243
  });
19208
19244
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19209
19245
  var DiskReconcileCountsSchema = object({
@@ -19373,6 +19409,47 @@ var RebuildStatusSchema = object({
19373
19409
  /** Present when the pass ended by throwing. */
19374
19410
  error: string().nullable()
19375
19411
  });
19412
+ /**
19413
+ * Acknowledgement that a debug-media reclaim STARTED.
19414
+ *
19415
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19416
+ * it runs detached and this returns immediately. Awaiting it is how the
19417
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19418
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19419
+ */
19420
+ var MediaReclaimStartResultSchema = object({
19421
+ started: boolean(),
19422
+ /** True when a pass was already running; the new request is ignored. */
19423
+ alreadyRunning: boolean()
19424
+ });
19425
+ var MediaReclaimInputSchema = object({
19426
+ mode: _enum(["report", "reclaim"]).default("report"),
19427
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19428
+ deviceIds: array(number().int()).min(1).optional(),
19429
+ restart: boolean().optional(),
19430
+ pageSize: number().int().min(50).max(5e3).optional(),
19431
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19432
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19433
+ maxBytesPerRun: number().int().min(1).optional(),
19434
+ budgetMinutes: number().int().min(1).max(720).optional(),
19435
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19436
+ graceMinutes: number().int().min(1).max(10080).optional()
19437
+ });
19438
+ var MediaReclaimStatusSchema = object({
19439
+ running: boolean(),
19440
+ mode: _enum(["report", "reclaim"]).nullable(),
19441
+ totalExamined: number(),
19442
+ totalEligible: number(),
19443
+ totalReclaimed: number(),
19444
+ totalBytesReclaimed: number(),
19445
+ totalRefused: number(),
19446
+ /** Device+scope windows finished in this pass. */
19447
+ devicesDone: number(),
19448
+ complete: boolean().nullable(),
19449
+ startedAtMs: number().nullable(),
19450
+ finishedAtMs: number().nullable(),
19451
+ error: string().nullable()
19452
+ });
19376
19453
  var ReplayFrameInputSchema = object({
19377
19454
  timestamp: number(),
19378
19455
  frame: PipelineRunResultBridge
@@ -19411,10 +19488,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19411
19488
  * stationary registry). Default false: the timeline lists passages,
19412
19489
  * not parking records (operator decision, 2026-08-15). */
19413
19490
  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(), {
19491
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19418
19492
  kind: "mutation",
19419
19493
  auth: "admin"
19420
19494
  }), 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 +19588,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19514
19588
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19515
19589
  kind: "query",
19516
19590
  auth: "admin"
19591
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19592
+ kind: "mutation",
19593
+ auth: "admin"
19594
+ }), method(object({}), MediaReclaimStatusSchema, {
19595
+ kind: "query",
19596
+ auth: "admin"
19517
19597
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19518
19598
  kind: "query",
19519
19599
  auth: "admin"
@@ -21484,7 +21564,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21484
21564
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21485
21565
  kind: "mutation",
21486
21566
  auth: "admin"
21487
- });
21567
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21568
+ kind: "mutation",
21569
+ auth: "admin"
21570
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21571
+ kind: "mutation",
21572
+ auth: "admin"
21573
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21488
21574
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21489
21575
  providerId: string().min(1),
21490
21576
  displayName: string().min(1),
@@ -28577,6 +28663,33 @@ var RecordingRebalanceInputSchema = object({
28577
28663
  minMoveGb: number().min(0).optional()
28578
28664
  });
28579
28665
  /**
28666
+ * Operator-facing placement of one camera onto a recordings location.
28667
+ *
28668
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
28669
+ * Auto (the planner may move this camera). `locationId` is where high/mid
28670
+ * currently write — the plan, which may disagree with the pin when Auto.
28671
+ */
28672
+ var RecordingDevicePlacementSchema = object({
28673
+ deviceId: number().int(),
28674
+ profile: string(),
28675
+ locationId: string()
28676
+ });
28677
+ var RecordingDevicePinSchema = object({
28678
+ deviceId: number().int(),
28679
+ /** Recordings-class location this camera is pinned to. */
28680
+ locationId: string()
28681
+ });
28682
+ var RecordingPlacementViewSchema = object({
28683
+ assignments: array(RecordingDevicePlacementSchema),
28684
+ pins: array(RecordingDevicePinSchema),
28685
+ defaultLocations: record(string(), string())
28686
+ });
28687
+ var RecordingSetDevicePlacementInputSchema = object({
28688
+ deviceId: number().int(),
28689
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
28690
+ locationId: string().nullable()
28691
+ });
28692
+ /**
28580
28693
  * Result of locating footage at a wall-clock instant for one device/profile.
28581
28694
  * `segment` carries the covering segment's window; `gap` reports the forward
28582
28695
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -28802,6 +28915,12 @@ method(object({
28802
28915
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
28803
28916
  kind: "mutation",
28804
28917
  auth: "admin"
28918
+ }), method(object({}), RecordingPlacementViewSchema, {
28919
+ kind: "query",
28920
+ auth: "admin"
28921
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
28922
+ kind: "mutation",
28923
+ auth: "admin"
28805
28924
  });
28806
28925
  /**
28807
28926
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -33871,6 +33990,12 @@ Object.freeze({
33871
33990
  addonId: null,
33872
33991
  access: "delete"
33873
33992
  },
33993
+ "deviceManager.renameLocation": {
33994
+ capName: "device-manager",
33995
+ capScope: "system",
33996
+ addonId: null,
33997
+ access: "create"
33998
+ },
33874
33999
  "deviceManager.runDeviceAction": {
33875
34000
  capName: "device-manager",
33876
34001
  capScope: "system",
@@ -35563,19 +35688,19 @@ Object.freeze({
35563
35688
  addonId: null,
35564
35689
  access: "view"
35565
35690
  },
35566
- "pipelineAnalytics.getGroup": {
35691
+ "pipelineAnalytics.getKeyEvents": {
35567
35692
  capName: "pipeline-analytics",
35568
35693
  capScope: "device",
35569
35694
  addonId: null,
35570
35695
  access: "view"
35571
35696
  },
35572
- "pipelineAnalytics.getKeyEvents": {
35697
+ "pipelineAnalytics.getKeyEventsBatch": {
35573
35698
  capName: "pipeline-analytics",
35574
35699
  capScope: "device",
35575
35700
  addonId: null,
35576
35701
  access: "view"
35577
35702
  },
35578
- "pipelineAnalytics.getKeyEventsBatch": {
35703
+ "pipelineAnalytics.getMediaReclaimStatus": {
35579
35704
  capName: "pipeline-analytics",
35580
35705
  capScope: "device",
35581
35706
  addonId: null,
@@ -35665,12 +35790,6 @@ Object.freeze({
35665
35790
  addonId: null,
35666
35791
  access: "view"
35667
35792
  },
35668
- "pipelineAnalytics.listGroups": {
35669
- capName: "pipeline-analytics",
35670
- capScope: "device",
35671
- addonId: null,
35672
- access: "view"
35673
- },
35674
35793
  "pipelineAnalytics.listOpsLog": {
35675
35794
  capName: "pipeline-analytics",
35676
35795
  capScope: "device",
@@ -35755,6 +35874,12 @@ Object.freeze({
35755
35874
  addonId: null,
35756
35875
  access: "create"
35757
35876
  },
35877
+ "pipelineAnalytics.reclaimDebugMedia": {
35878
+ capName: "pipeline-analytics",
35879
+ capScope: "device",
35880
+ addonId: null,
35881
+ access: "create"
35882
+ },
35758
35883
  "pipelineAnalytics.reconcileFromDisk": {
35759
35884
  capName: "pipeline-analytics",
35760
35885
  capScope: "device",
@@ -36679,6 +36804,12 @@ Object.freeze({
36679
36804
  addonId: null,
36680
36805
  access: "view"
36681
36806
  },
36807
+ "recording.getPlacement": {
36808
+ capName: "recording",
36809
+ capScope: "system",
36810
+ addonId: null,
36811
+ access: "view"
36812
+ },
36682
36813
  "recording.getPlaybackManifest": {
36683
36814
  capName: "recording",
36684
36815
  capScope: "system",
@@ -36805,6 +36936,12 @@ Object.freeze({
36805
36936
  addonId: null,
36806
36937
  access: "create"
36807
36938
  },
36939
+ "recording.setDevicePlacement": {
36940
+ capName: "recording",
36941
+ capScope: "system",
36942
+ addonId: null,
36943
+ access: "create"
36944
+ },
36808
36945
  "recording.startStorageMigrationMove": {
36809
36946
  capName: "recording",
36810
36947
  capScope: "system",
@@ -37249,12 +37386,36 @@ Object.freeze({
37249
37386
  addonId: null,
37250
37387
  access: "create"
37251
37388
  },
37389
+ "storageMigration.cleanupCancel": {
37390
+ capName: "storage-migration",
37391
+ capScope: "system",
37392
+ addonId: null,
37393
+ access: "create"
37394
+ },
37395
+ "storageMigration.cleanupStart": {
37396
+ capName: "storage-migration",
37397
+ capScope: "system",
37398
+ addonId: null,
37399
+ access: "create"
37400
+ },
37401
+ "storageMigration.cleanupStatus": {
37402
+ capName: "storage-migration",
37403
+ capScope: "system",
37404
+ addonId: null,
37405
+ access: "view"
37406
+ },
37252
37407
  "storageMigration.drain": {
37253
37408
  capName: "storage-migration",
37254
37409
  capScope: "system",
37255
37410
  addonId: null,
37256
37411
  access: "create"
37257
37412
  },
37413
+ "storageMigration.history": {
37414
+ capName: "storage-migration",
37415
+ capScope: "system",
37416
+ addonId: null,
37417
+ access: "view"
37418
+ },
37258
37419
  "storageMigration.movers": {
37259
37420
  capName: "storage-migration",
37260
37421
  capScope: "system",
@@ -39251,11 +39412,6 @@ Object.freeze({
39251
39412
  form: "single",
39252
39413
  optional: true
39253
39414
  }],
39254
- "pipelineAnalytics.getGroup": [{
39255
- name: "deviceId",
39256
- form: "single",
39257
- optional: false
39258
- }],
39259
39415
  "pipelineAnalytics.getKeyEvents": [{
39260
39416
  name: "deviceId",
39261
39417
  form: "single",
@@ -39321,11 +39477,6 @@ Object.freeze({
39321
39477
  form: "single",
39322
39478
  optional: false
39323
39479
  }],
39324
- "pipelineAnalytics.listGroups": [{
39325
- name: "deviceIds",
39326
- form: "array",
39327
- optional: false
39328
- }],
39329
39480
  "pipelineAnalytics.listOpsLog": [{
39330
39481
  name: "deviceId",
39331
39482
  form: "single",
@@ -39371,6 +39522,11 @@ Object.freeze({
39371
39522
  form: "single",
39372
39523
  optional: true
39373
39524
  }],
39525
+ "pipelineAnalytics.reclaimDebugMedia": [{
39526
+ name: "deviceIds",
39527
+ form: "array",
39528
+ optional: true
39529
+ }],
39374
39530
  "pipelineAnalytics.reconcileFromDisk": [{
39375
39531
  name: "deviceId",
39376
39532
  form: "single",
@@ -39736,6 +39892,11 @@ Object.freeze({
39736
39892
  form: "single",
39737
39893
  optional: false
39738
39894
  }],
39895
+ "recording.setDevicePlacement": [{
39896
+ name: "deviceId",
39897
+ form: "single",
39898
+ optional: false
39899
+ }],
39739
39900
  "recording.startStorageMigrationMove": [{
39740
39901
  name: "deviceId",
39741
39902
  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()
@@ -19057,46 +19135,6 @@ var RecentTracksPageSchema = object({
19057
19135
  /** Cursor for the next page, or null when this page is the last. */
19058
19136
  nextCursor: string().nullable()
19059
19137
  });
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
19138
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19101
19139
  var KEY_EVENTS_MAX_LIMIT = 200;
19102
19140
  var KeyEventQueryInput = object({
@@ -19200,9 +19238,7 @@ var TrackCascadeCountsSchema = object({
19200
19238
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19201
19239
  plates: number().int(),
19202
19240
  /** 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()
19241
+ embeddings: number().int()
19206
19242
  });
19207
19243
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19208
19244
  var DiskReconcileCountsSchema = object({
@@ -19372,6 +19408,47 @@ var RebuildStatusSchema = object({
19372
19408
  /** Present when the pass ended by throwing. */
19373
19409
  error: string().nullable()
19374
19410
  });
19411
+ /**
19412
+ * Acknowledgement that a debug-media reclaim STARTED.
19413
+ *
19414
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19415
+ * it runs detached and this returns immediately. Awaiting it is how the
19416
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19417
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19418
+ */
19419
+ var MediaReclaimStartResultSchema = object({
19420
+ started: boolean(),
19421
+ /** True when a pass was already running; the new request is ignored. */
19422
+ alreadyRunning: boolean()
19423
+ });
19424
+ var MediaReclaimInputSchema = object({
19425
+ mode: _enum(["report", "reclaim"]).default("report"),
19426
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19427
+ deviceIds: array(number().int()).min(1).optional(),
19428
+ restart: boolean().optional(),
19429
+ pageSize: number().int().min(50).max(5e3).optional(),
19430
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19431
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19432
+ maxBytesPerRun: number().int().min(1).optional(),
19433
+ budgetMinutes: number().int().min(1).max(720).optional(),
19434
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19435
+ graceMinutes: number().int().min(1).max(10080).optional()
19436
+ });
19437
+ var MediaReclaimStatusSchema = object({
19438
+ running: boolean(),
19439
+ mode: _enum(["report", "reclaim"]).nullable(),
19440
+ totalExamined: number(),
19441
+ totalEligible: number(),
19442
+ totalReclaimed: number(),
19443
+ totalBytesReclaimed: number(),
19444
+ totalRefused: number(),
19445
+ /** Device+scope windows finished in this pass. */
19446
+ devicesDone: number(),
19447
+ complete: boolean().nullable(),
19448
+ startedAtMs: number().nullable(),
19449
+ finishedAtMs: number().nullable(),
19450
+ error: string().nullable()
19451
+ });
19375
19452
  var ReplayFrameInputSchema = object({
19376
19453
  timestamp: number(),
19377
19454
  frame: PipelineRunResultBridge
@@ -19410,10 +19487,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19410
19487
  * stationary registry). Default false: the timeline lists passages,
19411
19488
  * not parking records (operator decision, 2026-08-15). */
19412
19489
  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(), {
19490
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19417
19491
  kind: "mutation",
19418
19492
  auth: "admin"
19419
19493
  }), 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 +19587,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19513
19587
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19514
19588
  kind: "query",
19515
19589
  auth: "admin"
19590
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19591
+ kind: "mutation",
19592
+ auth: "admin"
19593
+ }), method(object({}), MediaReclaimStatusSchema, {
19594
+ kind: "query",
19595
+ auth: "admin"
19516
19596
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19517
19597
  kind: "query",
19518
19598
  auth: "admin"
@@ -21483,7 +21563,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21483
21563
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21484
21564
  kind: "mutation",
21485
21565
  auth: "admin"
21486
- });
21566
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21567
+ kind: "mutation",
21568
+ auth: "admin"
21569
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21570
+ kind: "mutation",
21571
+ auth: "admin"
21572
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21487
21573
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21488
21574
  providerId: string().min(1),
21489
21575
  displayName: string().min(1),
@@ -28576,6 +28662,33 @@ var RecordingRebalanceInputSchema = object({
28576
28662
  minMoveGb: number().min(0).optional()
28577
28663
  });
28578
28664
  /**
28665
+ * Operator-facing placement of one camera onto a recordings location.
28666
+ *
28667
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
28668
+ * Auto (the planner may move this camera). `locationId` is where high/mid
28669
+ * currently write — the plan, which may disagree with the pin when Auto.
28670
+ */
28671
+ var RecordingDevicePlacementSchema = object({
28672
+ deviceId: number().int(),
28673
+ profile: string(),
28674
+ locationId: string()
28675
+ });
28676
+ var RecordingDevicePinSchema = object({
28677
+ deviceId: number().int(),
28678
+ /** Recordings-class location this camera is pinned to. */
28679
+ locationId: string()
28680
+ });
28681
+ var RecordingPlacementViewSchema = object({
28682
+ assignments: array(RecordingDevicePlacementSchema),
28683
+ pins: array(RecordingDevicePinSchema),
28684
+ defaultLocations: record(string(), string())
28685
+ });
28686
+ var RecordingSetDevicePlacementInputSchema = object({
28687
+ deviceId: number().int(),
28688
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
28689
+ locationId: string().nullable()
28690
+ });
28691
+ /**
28579
28692
  * Result of locating footage at a wall-clock instant for one device/profile.
28580
28693
  * `segment` carries the covering segment's window; `gap` reports the forward
28581
28694
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -28801,6 +28914,12 @@ method(object({
28801
28914
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
28802
28915
  kind: "mutation",
28803
28916
  auth: "admin"
28917
+ }), method(object({}), RecordingPlacementViewSchema, {
28918
+ kind: "query",
28919
+ auth: "admin"
28920
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
28921
+ kind: "mutation",
28922
+ auth: "admin"
28804
28923
  });
28805
28924
  /**
28806
28925
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -33870,6 +33989,12 @@ Object.freeze({
33870
33989
  addonId: null,
33871
33990
  access: "delete"
33872
33991
  },
33992
+ "deviceManager.renameLocation": {
33993
+ capName: "device-manager",
33994
+ capScope: "system",
33995
+ addonId: null,
33996
+ access: "create"
33997
+ },
33873
33998
  "deviceManager.runDeviceAction": {
33874
33999
  capName: "device-manager",
33875
34000
  capScope: "system",
@@ -35562,19 +35687,19 @@ Object.freeze({
35562
35687
  addonId: null,
35563
35688
  access: "view"
35564
35689
  },
35565
- "pipelineAnalytics.getGroup": {
35690
+ "pipelineAnalytics.getKeyEvents": {
35566
35691
  capName: "pipeline-analytics",
35567
35692
  capScope: "device",
35568
35693
  addonId: null,
35569
35694
  access: "view"
35570
35695
  },
35571
- "pipelineAnalytics.getKeyEvents": {
35696
+ "pipelineAnalytics.getKeyEventsBatch": {
35572
35697
  capName: "pipeline-analytics",
35573
35698
  capScope: "device",
35574
35699
  addonId: null,
35575
35700
  access: "view"
35576
35701
  },
35577
- "pipelineAnalytics.getKeyEventsBatch": {
35702
+ "pipelineAnalytics.getMediaReclaimStatus": {
35578
35703
  capName: "pipeline-analytics",
35579
35704
  capScope: "device",
35580
35705
  addonId: null,
@@ -35664,12 +35789,6 @@ Object.freeze({
35664
35789
  addonId: null,
35665
35790
  access: "view"
35666
35791
  },
35667
- "pipelineAnalytics.listGroups": {
35668
- capName: "pipeline-analytics",
35669
- capScope: "device",
35670
- addonId: null,
35671
- access: "view"
35672
- },
35673
35792
  "pipelineAnalytics.listOpsLog": {
35674
35793
  capName: "pipeline-analytics",
35675
35794
  capScope: "device",
@@ -35754,6 +35873,12 @@ Object.freeze({
35754
35873
  addonId: null,
35755
35874
  access: "create"
35756
35875
  },
35876
+ "pipelineAnalytics.reclaimDebugMedia": {
35877
+ capName: "pipeline-analytics",
35878
+ capScope: "device",
35879
+ addonId: null,
35880
+ access: "create"
35881
+ },
35757
35882
  "pipelineAnalytics.reconcileFromDisk": {
35758
35883
  capName: "pipeline-analytics",
35759
35884
  capScope: "device",
@@ -36678,6 +36803,12 @@ Object.freeze({
36678
36803
  addonId: null,
36679
36804
  access: "view"
36680
36805
  },
36806
+ "recording.getPlacement": {
36807
+ capName: "recording",
36808
+ capScope: "system",
36809
+ addonId: null,
36810
+ access: "view"
36811
+ },
36681
36812
  "recording.getPlaybackManifest": {
36682
36813
  capName: "recording",
36683
36814
  capScope: "system",
@@ -36804,6 +36935,12 @@ Object.freeze({
36804
36935
  addonId: null,
36805
36936
  access: "create"
36806
36937
  },
36938
+ "recording.setDevicePlacement": {
36939
+ capName: "recording",
36940
+ capScope: "system",
36941
+ addonId: null,
36942
+ access: "create"
36943
+ },
36807
36944
  "recording.startStorageMigrationMove": {
36808
36945
  capName: "recording",
36809
36946
  capScope: "system",
@@ -37248,12 +37385,36 @@ Object.freeze({
37248
37385
  addonId: null,
37249
37386
  access: "create"
37250
37387
  },
37388
+ "storageMigration.cleanupCancel": {
37389
+ capName: "storage-migration",
37390
+ capScope: "system",
37391
+ addonId: null,
37392
+ access: "create"
37393
+ },
37394
+ "storageMigration.cleanupStart": {
37395
+ capName: "storage-migration",
37396
+ capScope: "system",
37397
+ addonId: null,
37398
+ access: "create"
37399
+ },
37400
+ "storageMigration.cleanupStatus": {
37401
+ capName: "storage-migration",
37402
+ capScope: "system",
37403
+ addonId: null,
37404
+ access: "view"
37405
+ },
37251
37406
  "storageMigration.drain": {
37252
37407
  capName: "storage-migration",
37253
37408
  capScope: "system",
37254
37409
  addonId: null,
37255
37410
  access: "create"
37256
37411
  },
37412
+ "storageMigration.history": {
37413
+ capName: "storage-migration",
37414
+ capScope: "system",
37415
+ addonId: null,
37416
+ access: "view"
37417
+ },
37257
37418
  "storageMigration.movers": {
37258
37419
  capName: "storage-migration",
37259
37420
  capScope: "system",
@@ -39250,11 +39411,6 @@ Object.freeze({
39250
39411
  form: "single",
39251
39412
  optional: true
39252
39413
  }],
39253
- "pipelineAnalytics.getGroup": [{
39254
- name: "deviceId",
39255
- form: "single",
39256
- optional: false
39257
- }],
39258
39414
  "pipelineAnalytics.getKeyEvents": [{
39259
39415
  name: "deviceId",
39260
39416
  form: "single",
@@ -39320,11 +39476,6 @@ Object.freeze({
39320
39476
  form: "single",
39321
39477
  optional: false
39322
39478
  }],
39323
- "pipelineAnalytics.listGroups": [{
39324
- name: "deviceIds",
39325
- form: "array",
39326
- optional: false
39327
- }],
39328
39479
  "pipelineAnalytics.listOpsLog": [{
39329
39480
  name: "deviceId",
39330
39481
  form: "single",
@@ -39370,6 +39521,11 @@ Object.freeze({
39370
39521
  form: "single",
39371
39522
  optional: true
39372
39523
  }],
39524
+ "pipelineAnalytics.reclaimDebugMedia": [{
39525
+ name: "deviceIds",
39526
+ form: "array",
39527
+ optional: true
39528
+ }],
39373
39529
  "pipelineAnalytics.reconcileFromDisk": [{
39374
39530
  name: "deviceId",
39375
39531
  form: "single",
@@ -39735,6 +39891,11 @@ Object.freeze({
39735
39891
  form: "single",
39736
39892
  optional: false
39737
39893
  }],
39894
+ "recording.setDevicePlacement": [{
39895
+ name: "deviceId",
39896
+ form: "single",
39897
+ optional: false
39898
+ }],
39738
39899
  "recording.startStorageMigrationMove": [{
39739
39900
  name: "deviceId",
39740
39901
  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.49",
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",