@camstack/addon-terminal 0.1.54 → 0.1.55

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
@@ -8195,6 +8195,13 @@ var MediaRelocateModeSchema = _enum([
8195
8195
  ]);
8196
8196
  var RelocateMediaInputSchema = object({
8197
8197
  toLocationId: string(),
8198
+ /**
8199
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8200
+ * every row that is not already on `toLocationId` (the historical
8201
+ * behaviour). A named source is what a from→to migration needs: without it
8202
+ * "move events off disk 2" also emptied disk 1.
8203
+ */
8204
+ fromLocationId: string().optional(),
8198
8205
  throttleMbps: number().min(1).max(1e3).optional(),
8199
8206
  /** Omitted = `move`, the pre-existing behaviour. */
8200
8207
  mode: MediaRelocateModeSchema.optional()
@@ -8262,6 +8269,19 @@ var StorageMigrationDestinationsSchema = object({
8262
8269
  galleryMedia: string().min(1).optional()
8263
8270
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8264
8271
  /**
8272
+ * Optional named source per class. Omitted = the class's current default
8273
+ * (the historical behaviour). A named source that is NOT the default is a
8274
+ * drain of that disk: bytes move, the default stays, and the source is
8275
+ * disabled when the move finishes.
8276
+ */
8277
+ var StorageMigrationSourcesSchema = object({
8278
+ recordings: string().min(1).optional(),
8279
+ recordingsLow: string().min(1).optional(),
8280
+ eventMedia: string().min(1).optional(),
8281
+ backups: string().min(1).optional(),
8282
+ galleryMedia: string().min(1).optional()
8283
+ }).optional();
8284
+ /**
8265
8285
  * How a migration sequences the cutover against the byte move.
8266
8286
  *
8267
8287
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8283,6 +8303,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8283
8303
  /** Shared input for planning and starting an orchestrated storage migration. */
8284
8304
  var StorageMigrationInputSchema = object({
8285
8305
  destinations: StorageMigrationDestinationsSchema,
8306
+ /** Omitted = each class's current default. */
8307
+ sources: StorageMigrationSourcesSchema,
8286
8308
  throttleMbps: number().min(1).max(1e3).optional(),
8287
8309
  /** Omitted = `blocking`, which stays the default. */
8288
8310
  mode: StorageMigrationModeSchema.optional()
@@ -8362,6 +8384,13 @@ var StorageMigrationMoveSchema = object({
8362
8384
  storageClass: StorageMigrationClassSchema,
8363
8385
  fromLocationId: string(),
8364
8386
  toLocationId: string(),
8387
+ /**
8388
+ * True when `from` was NOT the class default at plan time. The move still
8389
+ * copies bytes, but the default is left alone and the source is disabled
8390
+ * once the copy verifies. Absent on jobs planned before this field existed
8391
+ * — those jobs always repointed, which is `false`.
8392
+ */
8393
+ freezeSource: boolean().optional(),
8365
8394
  moverJobId: string().nullable(),
8366
8395
  state: RelocateJobStateSchema.nullable(),
8367
8396
  error: string().nullable(),
@@ -8375,6 +8404,7 @@ var StorageMigrationJobSchema = object({
8375
8404
  * can tell a seconds-long cutover from a thirty-hour one. */
8376
8405
  mode: StorageMigrationModeSchema,
8377
8406
  destinations: StorageMigrationDestinationsSchema,
8407
+ sources: StorageMigrationSourcesSchema,
8378
8408
  throttleMbps: number(),
8379
8409
  moves: array(StorageMigrationMoveSchema),
8380
8410
  pauseLeaseId: string().nullable(),
@@ -8400,6 +8430,7 @@ var StorageMigrationFindingSchema = object({
8400
8430
  });
8401
8431
  var StorageMigrationPlanSchema = object({
8402
8432
  destinations: StorageMigrationDestinationsSchema,
8433
+ sources: StorageMigrationSourcesSchema,
8403
8434
  /** The mode this plan was built for. A plan is only valid for its mode: the
8404
8435
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8405
8436
  * it. */
@@ -8407,7 +8438,8 @@ var StorageMigrationPlanSchema = object({
8407
8438
  moves: array(object({
8408
8439
  storageClass: StorageMigrationClassSchema,
8409
8440
  fromLocationId: string(),
8410
- toLocationId: string()
8441
+ toLocationId: string(),
8442
+ freezeSource: boolean().optional()
8411
8443
  })),
8412
8444
  findings: array(StorageMigrationFindingSchema)
8413
8445
  });
@@ -8585,10 +8617,51 @@ var LedgerWalkReportSchema = object({
8585
8617
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8586
8618
  var RelocatableMediaCountInputSchema = object({
8587
8619
  toLocationId: string().min(1),
8620
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8621
+ fromLocationId: string().optional(),
8588
8622
  /** Omitted = `move`. */
8589
8623
  mode: MediaRelocateModeSchema.optional()
8590
8624
  });
8591
8625
  /**
8626
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8627
+ * ghost ledger entries on frozen footage locations.
8628
+ *
8629
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8630
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8631
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8632
+ * with no operator-visible status.
8633
+ */
8634
+ var StorageCleanupPhaseSchema = _enum([
8635
+ "orphans",
8636
+ "debug-media",
8637
+ "ghost-ledger",
8638
+ "done",
8639
+ "failed",
8640
+ "cancelled"
8641
+ ]);
8642
+ var StorageCleanupInputSchema = object({
8643
+ /** Also walk motion stills / track filmstrips. Off by default. */
8644
+ includeDebugMedia: boolean().optional() });
8645
+ var StorageCleanupJobSchema = object({
8646
+ jobId: string(),
8647
+ phase: StorageCleanupPhaseSchema,
8648
+ includeDebugMedia: boolean(),
8649
+ orphansReclaimed: number().int().nonnegative(),
8650
+ orphanBytesReclaimed: number().int().nonnegative(),
8651
+ debugMediaReclaimed: number().int().nonnegative(),
8652
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8653
+ ghostsForgotten: number().int().nonnegative(),
8654
+ ghostBytesForgotten: number().int().nonnegative(),
8655
+ /** Short operator-facing line: current collection, pass, or location. */
8656
+ detail: string().nullable(),
8657
+ cancelRequested: boolean(),
8658
+ startedAt: number(),
8659
+ updatedAt: number(),
8660
+ finishedAt: number().nullable(),
8661
+ error: string().nullable()
8662
+ });
8663
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8664
+ /**
8592
8665
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8593
8666
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8594
8667
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8616,11 +8689,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8616
8689
  * The default location for a type uses `id === <type>:default` by
8617
8690
  * convention (the bare type ref like `'backups'` resolves to it).
8618
8691
  *
8619
- * `isSystem: true` marks a location as orchestrator-seeded and
8620
- * undeletable. The bootstrap-installed defaults (one per type) carry
8621
- * this flag; operator-added locations don't. Editing the config of
8622
- * a system location is allowed (path migration, provider swap) but
8623
- * deleting it is rejected at the cap level.
8692
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8693
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8694
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8695
+ * / last-enabled, not on this bit.
8624
8696
  */
8625
8697
  var StorageLocationSchema = object({
8626
8698
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -13091,6 +13163,12 @@ method(object({
13091
13163
  }), _void(), {
13092
13164
  kind: "mutation",
13093
13165
  auth: "admin"
13166
+ }), method(object({
13167
+ from: string(),
13168
+ to: string()
13169
+ }), object({ moved: number() }), {
13170
+ kind: "mutation",
13171
+ auth: "admin"
13094
13172
  }), method(object({
13095
13173
  deviceId: number(),
13096
13174
  disabled: boolean()
@@ -19099,46 +19177,6 @@ var RecentTracksPageSchema = object({
19099
19177
  /** Cursor for the next page, or null when this page is the last. */
19100
19178
  nextCursor: string().nullable()
19101
19179
  });
19102
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
19103
- var LIST_GROUPS_MAX_LIMIT = 100;
19104
- var AnalyticsGroupRecordSchema = object({
19105
- id: string(),
19106
- deviceId: number().int(),
19107
- openedAt: number().int(),
19108
- closedAt: number().int(),
19109
- timestamp: number().int(),
19110
- memberCount: number().int(),
19111
- memberTrackIds: array(string()).readonly(),
19112
- className: string(),
19113
- classes: array(string()).readonly(),
19114
- /** Relative event-media path, or null when the group has no picture yet. */
19115
- mediaUrl: string().nullable(),
19116
- singleton: boolean()
19117
- });
19118
- var AnalyticsGroupMemberSchema = object({
19119
- trackId: string(),
19120
- deviceId: number().int(),
19121
- className: string(),
19122
- firstSeen: number().int(),
19123
- lastSeen: number().int(),
19124
- mediaUrl: string().nullable()
19125
- });
19126
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
19127
- var ListGroupsQueryInput = object({
19128
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
19129
- deviceIds: array(number()),
19130
- /** Window lower bound on `closedAt` (inclusive). */
19131
- since: number().optional(),
19132
- /** Window upper bound on `openedAt` (inclusive). */
19133
- until: number().optional(),
19134
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
19135
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
19136
- cursor: string().optional()
19137
- });
19138
- var ListGroupsPageSchema = object({
19139
- groups: array(AnalyticsGroupRecordSchema).readonly(),
19140
- nextCursor: string().nullable()
19141
- });
19142
19180
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19143
19181
  var KEY_EVENTS_MAX_LIMIT = 200;
19144
19182
  var KeyEventQueryInput = object({
@@ -19242,9 +19280,7 @@ var TrackCascadeCountsSchema = object({
19242
19280
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19243
19281
  plates: number().int(),
19244
19282
  /** Per-track CLIP search vectors removed (best-effort). */
19245
- embeddings: number().int(),
19246
- /** Group membership + group rows removed with their last member (best-effort). */
19247
- groups: number().int()
19283
+ embeddings: number().int()
19248
19284
  });
19249
19285
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19250
19286
  var DiskReconcileCountsSchema = object({
@@ -19414,6 +19450,47 @@ var RebuildStatusSchema = object({
19414
19450
  /** Present when the pass ended by throwing. */
19415
19451
  error: string().nullable()
19416
19452
  });
19453
+ /**
19454
+ * Acknowledgement that a debug-media reclaim STARTED.
19455
+ *
19456
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19457
+ * it runs detached and this returns immediately. Awaiting it is how the
19458
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19459
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19460
+ */
19461
+ var MediaReclaimStartResultSchema = object({
19462
+ started: boolean(),
19463
+ /** True when a pass was already running; the new request is ignored. */
19464
+ alreadyRunning: boolean()
19465
+ });
19466
+ var MediaReclaimInputSchema = object({
19467
+ mode: _enum(["report", "reclaim"]).default("report"),
19468
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19469
+ deviceIds: array(number().int()).min(1).optional(),
19470
+ restart: boolean().optional(),
19471
+ pageSize: number().int().min(50).max(5e3).optional(),
19472
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19473
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19474
+ maxBytesPerRun: number().int().min(1).optional(),
19475
+ budgetMinutes: number().int().min(1).max(720).optional(),
19476
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19477
+ graceMinutes: number().int().min(1).max(10080).optional()
19478
+ });
19479
+ var MediaReclaimStatusSchema = object({
19480
+ running: boolean(),
19481
+ mode: _enum(["report", "reclaim"]).nullable(),
19482
+ totalExamined: number(),
19483
+ totalEligible: number(),
19484
+ totalReclaimed: number(),
19485
+ totalBytesReclaimed: number(),
19486
+ totalRefused: number(),
19487
+ /** Device+scope windows finished in this pass. */
19488
+ devicesDone: number(),
19489
+ complete: boolean().nullable(),
19490
+ startedAtMs: number().nullable(),
19491
+ finishedAtMs: number().nullable(),
19492
+ error: string().nullable()
19493
+ });
19417
19494
  var ReplayFrameInputSchema = object({
19418
19495
  timestamp: number(),
19419
19496
  frame: PipelineRunResultBridge
@@ -19452,10 +19529,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19452
19529
  * stationary registry). Default false: the timeline lists passages,
19453
19530
  * not parking records (operator decision, 2026-08-15). */
19454
19531
  includeStationary: boolean().optional()
19455
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19456
- deviceId: number(),
19457
- groupId: string().min(1)
19458
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19532
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19459
19533
  kind: "mutation",
19460
19534
  auth: "admin"
19461
19535
  }), 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({
@@ -19555,6 +19629,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19555
19629
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19556
19630
  kind: "query",
19557
19631
  auth: "admin"
19632
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19633
+ kind: "mutation",
19634
+ auth: "admin"
19635
+ }), method(object({}), MediaReclaimStatusSchema, {
19636
+ kind: "query",
19637
+ auth: "admin"
19558
19638
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19559
19639
  kind: "query",
19560
19640
  auth: "admin"
@@ -21629,7 +21709,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21629
21709
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21630
21710
  kind: "mutation",
21631
21711
  auth: "admin"
21632
- });
21712
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21713
+ kind: "mutation",
21714
+ auth: "admin"
21715
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21716
+ kind: "mutation",
21717
+ auth: "admin"
21718
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21633
21719
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21634
21720
  providerId: string().min(1),
21635
21721
  displayName: string().min(1),
@@ -28766,6 +28852,33 @@ var RecordingRebalanceInputSchema = object({
28766
28852
  minMoveGb: number().min(0).optional()
28767
28853
  });
28768
28854
  /**
28855
+ * Operator-facing placement of one camera onto a recordings location.
28856
+ *
28857
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
28858
+ * Auto (the planner may move this camera). `locationId` is where high/mid
28859
+ * currently write — the plan, which may disagree with the pin when Auto.
28860
+ */
28861
+ var RecordingDevicePlacementSchema = object({
28862
+ deviceId: number().int(),
28863
+ profile: string(),
28864
+ locationId: string()
28865
+ });
28866
+ var RecordingDevicePinSchema = object({
28867
+ deviceId: number().int(),
28868
+ /** Recordings-class location this camera is pinned to. */
28869
+ locationId: string()
28870
+ });
28871
+ var RecordingPlacementViewSchema = object({
28872
+ assignments: array(RecordingDevicePlacementSchema),
28873
+ pins: array(RecordingDevicePinSchema),
28874
+ defaultLocations: record(string(), string())
28875
+ });
28876
+ var RecordingSetDevicePlacementInputSchema = object({
28877
+ deviceId: number().int(),
28878
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
28879
+ locationId: string().nullable()
28880
+ });
28881
+ /**
28769
28882
  * Result of locating footage at a wall-clock instant for one device/profile.
28770
28883
  * `segment` carries the covering segment's window; `gap` reports the forward
28771
28884
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -28991,6 +29104,12 @@ method(object({
28991
29104
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
28992
29105
  kind: "mutation",
28993
29106
  auth: "admin"
29107
+ }), method(object({}), RecordingPlacementViewSchema, {
29108
+ kind: "query",
29109
+ auth: "admin"
29110
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29111
+ kind: "mutation",
29112
+ auth: "admin"
28994
29113
  });
28995
29114
  /**
28996
29115
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -34058,6 +34177,12 @@ Object.freeze({
34058
34177
  addonId: null,
34059
34178
  access: "delete"
34060
34179
  },
34180
+ "deviceManager.renameLocation": {
34181
+ capName: "device-manager",
34182
+ capScope: "system",
34183
+ addonId: null,
34184
+ access: "create"
34185
+ },
34061
34186
  "deviceManager.runDeviceAction": {
34062
34187
  capName: "device-manager",
34063
34188
  capScope: "system",
@@ -35750,19 +35875,19 @@ Object.freeze({
35750
35875
  addonId: null,
35751
35876
  access: "view"
35752
35877
  },
35753
- "pipelineAnalytics.getGroup": {
35878
+ "pipelineAnalytics.getKeyEvents": {
35754
35879
  capName: "pipeline-analytics",
35755
35880
  capScope: "device",
35756
35881
  addonId: null,
35757
35882
  access: "view"
35758
35883
  },
35759
- "pipelineAnalytics.getKeyEvents": {
35884
+ "pipelineAnalytics.getKeyEventsBatch": {
35760
35885
  capName: "pipeline-analytics",
35761
35886
  capScope: "device",
35762
35887
  addonId: null,
35763
35888
  access: "view"
35764
35889
  },
35765
- "pipelineAnalytics.getKeyEventsBatch": {
35890
+ "pipelineAnalytics.getMediaReclaimStatus": {
35766
35891
  capName: "pipeline-analytics",
35767
35892
  capScope: "device",
35768
35893
  addonId: null,
@@ -35852,12 +35977,6 @@ Object.freeze({
35852
35977
  addonId: null,
35853
35978
  access: "view"
35854
35979
  },
35855
- "pipelineAnalytics.listGroups": {
35856
- capName: "pipeline-analytics",
35857
- capScope: "device",
35858
- addonId: null,
35859
- access: "view"
35860
- },
35861
35980
  "pipelineAnalytics.listOpsLog": {
35862
35981
  capName: "pipeline-analytics",
35863
35982
  capScope: "device",
@@ -35942,6 +36061,12 @@ Object.freeze({
35942
36061
  addonId: null,
35943
36062
  access: "create"
35944
36063
  },
36064
+ "pipelineAnalytics.reclaimDebugMedia": {
36065
+ capName: "pipeline-analytics",
36066
+ capScope: "device",
36067
+ addonId: null,
36068
+ access: "create"
36069
+ },
35945
36070
  "pipelineAnalytics.reconcileFromDisk": {
35946
36071
  capName: "pipeline-analytics",
35947
36072
  capScope: "device",
@@ -36866,6 +36991,12 @@ Object.freeze({
36866
36991
  addonId: null,
36867
36992
  access: "view"
36868
36993
  },
36994
+ "recording.getPlacement": {
36995
+ capName: "recording",
36996
+ capScope: "system",
36997
+ addonId: null,
36998
+ access: "view"
36999
+ },
36869
37000
  "recording.getPlaybackManifest": {
36870
37001
  capName: "recording",
36871
37002
  capScope: "system",
@@ -36992,6 +37123,12 @@ Object.freeze({
36992
37123
  addonId: null,
36993
37124
  access: "create"
36994
37125
  },
37126
+ "recording.setDevicePlacement": {
37127
+ capName: "recording",
37128
+ capScope: "system",
37129
+ addonId: null,
37130
+ access: "create"
37131
+ },
36995
37132
  "recording.startStorageMigrationMove": {
36996
37133
  capName: "recording",
36997
37134
  capScope: "system",
@@ -37436,12 +37573,36 @@ Object.freeze({
37436
37573
  addonId: null,
37437
37574
  access: "create"
37438
37575
  },
37576
+ "storageMigration.cleanupCancel": {
37577
+ capName: "storage-migration",
37578
+ capScope: "system",
37579
+ addonId: null,
37580
+ access: "create"
37581
+ },
37582
+ "storageMigration.cleanupStart": {
37583
+ capName: "storage-migration",
37584
+ capScope: "system",
37585
+ addonId: null,
37586
+ access: "create"
37587
+ },
37588
+ "storageMigration.cleanupStatus": {
37589
+ capName: "storage-migration",
37590
+ capScope: "system",
37591
+ addonId: null,
37592
+ access: "view"
37593
+ },
37439
37594
  "storageMigration.drain": {
37440
37595
  capName: "storage-migration",
37441
37596
  capScope: "system",
37442
37597
  addonId: null,
37443
37598
  access: "create"
37444
37599
  },
37600
+ "storageMigration.history": {
37601
+ capName: "storage-migration",
37602
+ capScope: "system",
37603
+ addonId: null,
37604
+ access: "view"
37605
+ },
37445
37606
  "storageMigration.movers": {
37446
37607
  capName: "storage-migration",
37447
37608
  capScope: "system",
@@ -39438,11 +39599,6 @@ Object.freeze({
39438
39599
  form: "single",
39439
39600
  optional: true
39440
39601
  }],
39441
- "pipelineAnalytics.getGroup": [{
39442
- name: "deviceId",
39443
- form: "single",
39444
- optional: false
39445
- }],
39446
39602
  "pipelineAnalytics.getKeyEvents": [{
39447
39603
  name: "deviceId",
39448
39604
  form: "single",
@@ -39508,11 +39664,6 @@ Object.freeze({
39508
39664
  form: "single",
39509
39665
  optional: false
39510
39666
  }],
39511
- "pipelineAnalytics.listGroups": [{
39512
- name: "deviceIds",
39513
- form: "array",
39514
- optional: false
39515
- }],
39516
39667
  "pipelineAnalytics.listOpsLog": [{
39517
39668
  name: "deviceId",
39518
39669
  form: "single",
@@ -39558,6 +39709,11 @@ Object.freeze({
39558
39709
  form: "single",
39559
39710
  optional: true
39560
39711
  }],
39712
+ "pipelineAnalytics.reclaimDebugMedia": [{
39713
+ name: "deviceIds",
39714
+ form: "array",
39715
+ optional: true
39716
+ }],
39561
39717
  "pipelineAnalytics.reconcileFromDisk": [{
39562
39718
  name: "deviceId",
39563
39719
  form: "single",
@@ -39923,6 +40079,11 @@ Object.freeze({
39923
40079
  form: "single",
39924
40080
  optional: false
39925
40081
  }],
40082
+ "recording.setDevicePlacement": [{
40083
+ name: "deviceId",
40084
+ form: "single",
40085
+ optional: false
40086
+ }],
39926
40087
  "recording.startStorageMigrationMove": [{
39927
40088
  name: "deviceId",
39928
40089
  form: "single",
package/dist/addon.mjs CHANGED
@@ -8172,6 +8172,13 @@ var MediaRelocateModeSchema = _enum([
8172
8172
  ]);
8173
8173
  var RelocateMediaInputSchema = object({
8174
8174
  toLocationId: string(),
8175
+ /**
8176
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8177
+ * every row that is not already on `toLocationId` (the historical
8178
+ * behaviour). A named source is what a from→to migration needs: without it
8179
+ * "move events off disk 2" also emptied disk 1.
8180
+ */
8181
+ fromLocationId: string().optional(),
8175
8182
  throttleMbps: number().min(1).max(1e3).optional(),
8176
8183
  /** Omitted = `move`, the pre-existing behaviour. */
8177
8184
  mode: MediaRelocateModeSchema.optional()
@@ -8239,6 +8246,19 @@ var StorageMigrationDestinationsSchema = object({
8239
8246
  galleryMedia: string().min(1).optional()
8240
8247
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8241
8248
  /**
8249
+ * Optional named source per class. Omitted = the class's current default
8250
+ * (the historical behaviour). A named source that is NOT the default is a
8251
+ * drain of that disk: bytes move, the default stays, and the source is
8252
+ * disabled when the move finishes.
8253
+ */
8254
+ var StorageMigrationSourcesSchema = object({
8255
+ recordings: string().min(1).optional(),
8256
+ recordingsLow: string().min(1).optional(),
8257
+ eventMedia: string().min(1).optional(),
8258
+ backups: string().min(1).optional(),
8259
+ galleryMedia: string().min(1).optional()
8260
+ }).optional();
8261
+ /**
8242
8262
  * How a migration sequences the cutover against the byte move.
8243
8263
  *
8244
8264
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8260,6 +8280,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8260
8280
  /** Shared input for planning and starting an orchestrated storage migration. */
8261
8281
  var StorageMigrationInputSchema = object({
8262
8282
  destinations: StorageMigrationDestinationsSchema,
8283
+ /** Omitted = each class's current default. */
8284
+ sources: StorageMigrationSourcesSchema,
8263
8285
  throttleMbps: number().min(1).max(1e3).optional(),
8264
8286
  /** Omitted = `blocking`, which stays the default. */
8265
8287
  mode: StorageMigrationModeSchema.optional()
@@ -8339,6 +8361,13 @@ var StorageMigrationMoveSchema = object({
8339
8361
  storageClass: StorageMigrationClassSchema,
8340
8362
  fromLocationId: string(),
8341
8363
  toLocationId: string(),
8364
+ /**
8365
+ * True when `from` was NOT the class default at plan time. The move still
8366
+ * copies bytes, but the default is left alone and the source is disabled
8367
+ * once the copy verifies. Absent on jobs planned before this field existed
8368
+ * — those jobs always repointed, which is `false`.
8369
+ */
8370
+ freezeSource: boolean().optional(),
8342
8371
  moverJobId: string().nullable(),
8343
8372
  state: RelocateJobStateSchema.nullable(),
8344
8373
  error: string().nullable(),
@@ -8352,6 +8381,7 @@ var StorageMigrationJobSchema = object({
8352
8381
  * can tell a seconds-long cutover from a thirty-hour one. */
8353
8382
  mode: StorageMigrationModeSchema,
8354
8383
  destinations: StorageMigrationDestinationsSchema,
8384
+ sources: StorageMigrationSourcesSchema,
8355
8385
  throttleMbps: number(),
8356
8386
  moves: array(StorageMigrationMoveSchema),
8357
8387
  pauseLeaseId: string().nullable(),
@@ -8377,6 +8407,7 @@ var StorageMigrationFindingSchema = object({
8377
8407
  });
8378
8408
  var StorageMigrationPlanSchema = object({
8379
8409
  destinations: StorageMigrationDestinationsSchema,
8410
+ sources: StorageMigrationSourcesSchema,
8380
8411
  /** The mode this plan was built for. A plan is only valid for its mode: the
8381
8412
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8382
8413
  * it. */
@@ -8384,7 +8415,8 @@ var StorageMigrationPlanSchema = object({
8384
8415
  moves: array(object({
8385
8416
  storageClass: StorageMigrationClassSchema,
8386
8417
  fromLocationId: string(),
8387
- toLocationId: string()
8418
+ toLocationId: string(),
8419
+ freezeSource: boolean().optional()
8388
8420
  })),
8389
8421
  findings: array(StorageMigrationFindingSchema)
8390
8422
  });
@@ -8562,10 +8594,51 @@ var LedgerWalkReportSchema = object({
8562
8594
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8563
8595
  var RelocatableMediaCountInputSchema = object({
8564
8596
  toLocationId: string().min(1),
8597
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8598
+ fromLocationId: string().optional(),
8565
8599
  /** Omitted = `move`. */
8566
8600
  mode: MediaRelocateModeSchema.optional()
8567
8601
  });
8568
8602
  /**
8603
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8604
+ * ghost ledger entries on frozen footage locations.
8605
+ *
8606
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8607
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8608
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8609
+ * with no operator-visible status.
8610
+ */
8611
+ var StorageCleanupPhaseSchema = _enum([
8612
+ "orphans",
8613
+ "debug-media",
8614
+ "ghost-ledger",
8615
+ "done",
8616
+ "failed",
8617
+ "cancelled"
8618
+ ]);
8619
+ var StorageCleanupInputSchema = object({
8620
+ /** Also walk motion stills / track filmstrips. Off by default. */
8621
+ includeDebugMedia: boolean().optional() });
8622
+ var StorageCleanupJobSchema = object({
8623
+ jobId: string(),
8624
+ phase: StorageCleanupPhaseSchema,
8625
+ includeDebugMedia: boolean(),
8626
+ orphansReclaimed: number().int().nonnegative(),
8627
+ orphanBytesReclaimed: number().int().nonnegative(),
8628
+ debugMediaReclaimed: number().int().nonnegative(),
8629
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8630
+ ghostsForgotten: number().int().nonnegative(),
8631
+ ghostBytesForgotten: number().int().nonnegative(),
8632
+ /** Short operator-facing line: current collection, pass, or location. */
8633
+ detail: string().nullable(),
8634
+ cancelRequested: boolean(),
8635
+ startedAt: number(),
8636
+ updatedAt: number(),
8637
+ finishedAt: number().nullable(),
8638
+ error: string().nullable()
8639
+ });
8640
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8641
+ /**
8569
8642
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8570
8643
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8571
8644
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8593,11 +8666,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8593
8666
  * The default location for a type uses `id === <type>:default` by
8594
8667
  * convention (the bare type ref like `'backups'` resolves to it).
8595
8668
  *
8596
- * `isSystem: true` marks a location as orchestrator-seeded and
8597
- * undeletable. The bootstrap-installed defaults (one per type) carry
8598
- * this flag; operator-added locations don't. Editing the config of
8599
- * a system location is allowed (path migration, provider swap) but
8600
- * deleting it is rejected at the cap level.
8669
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8670
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8671
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8672
+ * / last-enabled, not on this bit.
8601
8673
  */
8602
8674
  var StorageLocationSchema = object({
8603
8675
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -13068,6 +13140,12 @@ method(object({
13068
13140
  }), _void(), {
13069
13141
  kind: "mutation",
13070
13142
  auth: "admin"
13143
+ }), method(object({
13144
+ from: string(),
13145
+ to: string()
13146
+ }), object({ moved: number() }), {
13147
+ kind: "mutation",
13148
+ auth: "admin"
13071
13149
  }), method(object({
13072
13150
  deviceId: number(),
13073
13151
  disabled: boolean()
@@ -19076,46 +19154,6 @@ var RecentTracksPageSchema = object({
19076
19154
  /** Cursor for the next page, or null when this page is the last. */
19077
19155
  nextCursor: string().nullable()
19078
19156
  });
19079
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
19080
- var LIST_GROUPS_MAX_LIMIT = 100;
19081
- var AnalyticsGroupRecordSchema = object({
19082
- id: string(),
19083
- deviceId: number().int(),
19084
- openedAt: number().int(),
19085
- closedAt: number().int(),
19086
- timestamp: number().int(),
19087
- memberCount: number().int(),
19088
- memberTrackIds: array(string()).readonly(),
19089
- className: string(),
19090
- classes: array(string()).readonly(),
19091
- /** Relative event-media path, or null when the group has no picture yet. */
19092
- mediaUrl: string().nullable(),
19093
- singleton: boolean()
19094
- });
19095
- var AnalyticsGroupMemberSchema = object({
19096
- trackId: string(),
19097
- deviceId: number().int(),
19098
- className: string(),
19099
- firstSeen: number().int(),
19100
- lastSeen: number().int(),
19101
- mediaUrl: string().nullable()
19102
- });
19103
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
19104
- var ListGroupsQueryInput = object({
19105
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
19106
- deviceIds: array(number()),
19107
- /** Window lower bound on `closedAt` (inclusive). */
19108
- since: number().optional(),
19109
- /** Window upper bound on `openedAt` (inclusive). */
19110
- until: number().optional(),
19111
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
19112
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
19113
- cursor: string().optional()
19114
- });
19115
- var ListGroupsPageSchema = object({
19116
- groups: array(AnalyticsGroupRecordSchema).readonly(),
19117
- nextCursor: string().nullable()
19118
- });
19119
19157
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19120
19158
  var KEY_EVENTS_MAX_LIMIT = 200;
19121
19159
  var KeyEventQueryInput = object({
@@ -19219,9 +19257,7 @@ var TrackCascadeCountsSchema = object({
19219
19257
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19220
19258
  plates: number().int(),
19221
19259
  /** Per-track CLIP search vectors removed (best-effort). */
19222
- embeddings: number().int(),
19223
- /** Group membership + group rows removed with their last member (best-effort). */
19224
- groups: number().int()
19260
+ embeddings: number().int()
19225
19261
  });
19226
19262
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19227
19263
  var DiskReconcileCountsSchema = object({
@@ -19391,6 +19427,47 @@ var RebuildStatusSchema = object({
19391
19427
  /** Present when the pass ended by throwing. */
19392
19428
  error: string().nullable()
19393
19429
  });
19430
+ /**
19431
+ * Acknowledgement that a debug-media reclaim STARTED.
19432
+ *
19433
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19434
+ * it runs detached and this returns immediately. Awaiting it is how the
19435
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19436
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19437
+ */
19438
+ var MediaReclaimStartResultSchema = object({
19439
+ started: boolean(),
19440
+ /** True when a pass was already running; the new request is ignored. */
19441
+ alreadyRunning: boolean()
19442
+ });
19443
+ var MediaReclaimInputSchema = object({
19444
+ mode: _enum(["report", "reclaim"]).default("report"),
19445
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19446
+ deviceIds: array(number().int()).min(1).optional(),
19447
+ restart: boolean().optional(),
19448
+ pageSize: number().int().min(50).max(5e3).optional(),
19449
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19450
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19451
+ maxBytesPerRun: number().int().min(1).optional(),
19452
+ budgetMinutes: number().int().min(1).max(720).optional(),
19453
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19454
+ graceMinutes: number().int().min(1).max(10080).optional()
19455
+ });
19456
+ var MediaReclaimStatusSchema = object({
19457
+ running: boolean(),
19458
+ mode: _enum(["report", "reclaim"]).nullable(),
19459
+ totalExamined: number(),
19460
+ totalEligible: number(),
19461
+ totalReclaimed: number(),
19462
+ totalBytesReclaimed: number(),
19463
+ totalRefused: number(),
19464
+ /** Device+scope windows finished in this pass. */
19465
+ devicesDone: number(),
19466
+ complete: boolean().nullable(),
19467
+ startedAtMs: number().nullable(),
19468
+ finishedAtMs: number().nullable(),
19469
+ error: string().nullable()
19470
+ });
19394
19471
  var ReplayFrameInputSchema = object({
19395
19472
  timestamp: number(),
19396
19473
  frame: PipelineRunResultBridge
@@ -19429,10 +19506,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19429
19506
  * stationary registry). Default false: the timeline lists passages,
19430
19507
  * not parking records (operator decision, 2026-08-15). */
19431
19508
  includeStationary: boolean().optional()
19432
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19433
- deviceId: number(),
19434
- groupId: string().min(1)
19435
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19509
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19436
19510
  kind: "mutation",
19437
19511
  auth: "admin"
19438
19512
  }), 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({
@@ -19532,6 +19606,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19532
19606
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19533
19607
  kind: "query",
19534
19608
  auth: "admin"
19609
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19610
+ kind: "mutation",
19611
+ auth: "admin"
19612
+ }), method(object({}), MediaReclaimStatusSchema, {
19613
+ kind: "query",
19614
+ auth: "admin"
19535
19615
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19536
19616
  kind: "query",
19537
19617
  auth: "admin"
@@ -21606,7 +21686,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21606
21686
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21607
21687
  kind: "mutation",
21608
21688
  auth: "admin"
21609
- });
21689
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21690
+ kind: "mutation",
21691
+ auth: "admin"
21692
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21693
+ kind: "mutation",
21694
+ auth: "admin"
21695
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21610
21696
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21611
21697
  providerId: string().min(1),
21612
21698
  displayName: string().min(1),
@@ -28743,6 +28829,33 @@ var RecordingRebalanceInputSchema = object({
28743
28829
  minMoveGb: number().min(0).optional()
28744
28830
  });
28745
28831
  /**
28832
+ * Operator-facing placement of one camera onto a recordings location.
28833
+ *
28834
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
28835
+ * Auto (the planner may move this camera). `locationId` is where high/mid
28836
+ * currently write — the plan, which may disagree with the pin when Auto.
28837
+ */
28838
+ var RecordingDevicePlacementSchema = object({
28839
+ deviceId: number().int(),
28840
+ profile: string(),
28841
+ locationId: string()
28842
+ });
28843
+ var RecordingDevicePinSchema = object({
28844
+ deviceId: number().int(),
28845
+ /** Recordings-class location this camera is pinned to. */
28846
+ locationId: string()
28847
+ });
28848
+ var RecordingPlacementViewSchema = object({
28849
+ assignments: array(RecordingDevicePlacementSchema),
28850
+ pins: array(RecordingDevicePinSchema),
28851
+ defaultLocations: record(string(), string())
28852
+ });
28853
+ var RecordingSetDevicePlacementInputSchema = object({
28854
+ deviceId: number().int(),
28855
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
28856
+ locationId: string().nullable()
28857
+ });
28858
+ /**
28746
28859
  * Result of locating footage at a wall-clock instant for one device/profile.
28747
28860
  * `segment` carries the covering segment's window; `gap` reports the forward
28748
28861
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -28968,6 +29081,12 @@ method(object({
28968
29081
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
28969
29082
  kind: "mutation",
28970
29083
  auth: "admin"
29084
+ }), method(object({}), RecordingPlacementViewSchema, {
29085
+ kind: "query",
29086
+ auth: "admin"
29087
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29088
+ kind: "mutation",
29089
+ auth: "admin"
28971
29090
  });
28972
29091
  /**
28973
29092
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -34035,6 +34154,12 @@ Object.freeze({
34035
34154
  addonId: null,
34036
34155
  access: "delete"
34037
34156
  },
34157
+ "deviceManager.renameLocation": {
34158
+ capName: "device-manager",
34159
+ capScope: "system",
34160
+ addonId: null,
34161
+ access: "create"
34162
+ },
34038
34163
  "deviceManager.runDeviceAction": {
34039
34164
  capName: "device-manager",
34040
34165
  capScope: "system",
@@ -35727,19 +35852,19 @@ Object.freeze({
35727
35852
  addonId: null,
35728
35853
  access: "view"
35729
35854
  },
35730
- "pipelineAnalytics.getGroup": {
35855
+ "pipelineAnalytics.getKeyEvents": {
35731
35856
  capName: "pipeline-analytics",
35732
35857
  capScope: "device",
35733
35858
  addonId: null,
35734
35859
  access: "view"
35735
35860
  },
35736
- "pipelineAnalytics.getKeyEvents": {
35861
+ "pipelineAnalytics.getKeyEventsBatch": {
35737
35862
  capName: "pipeline-analytics",
35738
35863
  capScope: "device",
35739
35864
  addonId: null,
35740
35865
  access: "view"
35741
35866
  },
35742
- "pipelineAnalytics.getKeyEventsBatch": {
35867
+ "pipelineAnalytics.getMediaReclaimStatus": {
35743
35868
  capName: "pipeline-analytics",
35744
35869
  capScope: "device",
35745
35870
  addonId: null,
@@ -35829,12 +35954,6 @@ Object.freeze({
35829
35954
  addonId: null,
35830
35955
  access: "view"
35831
35956
  },
35832
- "pipelineAnalytics.listGroups": {
35833
- capName: "pipeline-analytics",
35834
- capScope: "device",
35835
- addonId: null,
35836
- access: "view"
35837
- },
35838
35957
  "pipelineAnalytics.listOpsLog": {
35839
35958
  capName: "pipeline-analytics",
35840
35959
  capScope: "device",
@@ -35919,6 +36038,12 @@ Object.freeze({
35919
36038
  addonId: null,
35920
36039
  access: "create"
35921
36040
  },
36041
+ "pipelineAnalytics.reclaimDebugMedia": {
36042
+ capName: "pipeline-analytics",
36043
+ capScope: "device",
36044
+ addonId: null,
36045
+ access: "create"
36046
+ },
35922
36047
  "pipelineAnalytics.reconcileFromDisk": {
35923
36048
  capName: "pipeline-analytics",
35924
36049
  capScope: "device",
@@ -36843,6 +36968,12 @@ Object.freeze({
36843
36968
  addonId: null,
36844
36969
  access: "view"
36845
36970
  },
36971
+ "recording.getPlacement": {
36972
+ capName: "recording",
36973
+ capScope: "system",
36974
+ addonId: null,
36975
+ access: "view"
36976
+ },
36846
36977
  "recording.getPlaybackManifest": {
36847
36978
  capName: "recording",
36848
36979
  capScope: "system",
@@ -36969,6 +37100,12 @@ Object.freeze({
36969
37100
  addonId: null,
36970
37101
  access: "create"
36971
37102
  },
37103
+ "recording.setDevicePlacement": {
37104
+ capName: "recording",
37105
+ capScope: "system",
37106
+ addonId: null,
37107
+ access: "create"
37108
+ },
36972
37109
  "recording.startStorageMigrationMove": {
36973
37110
  capName: "recording",
36974
37111
  capScope: "system",
@@ -37413,12 +37550,36 @@ Object.freeze({
37413
37550
  addonId: null,
37414
37551
  access: "create"
37415
37552
  },
37553
+ "storageMigration.cleanupCancel": {
37554
+ capName: "storage-migration",
37555
+ capScope: "system",
37556
+ addonId: null,
37557
+ access: "create"
37558
+ },
37559
+ "storageMigration.cleanupStart": {
37560
+ capName: "storage-migration",
37561
+ capScope: "system",
37562
+ addonId: null,
37563
+ access: "create"
37564
+ },
37565
+ "storageMigration.cleanupStatus": {
37566
+ capName: "storage-migration",
37567
+ capScope: "system",
37568
+ addonId: null,
37569
+ access: "view"
37570
+ },
37416
37571
  "storageMigration.drain": {
37417
37572
  capName: "storage-migration",
37418
37573
  capScope: "system",
37419
37574
  addonId: null,
37420
37575
  access: "create"
37421
37576
  },
37577
+ "storageMigration.history": {
37578
+ capName: "storage-migration",
37579
+ capScope: "system",
37580
+ addonId: null,
37581
+ access: "view"
37582
+ },
37422
37583
  "storageMigration.movers": {
37423
37584
  capName: "storage-migration",
37424
37585
  capScope: "system",
@@ -39415,11 +39576,6 @@ Object.freeze({
39415
39576
  form: "single",
39416
39577
  optional: true
39417
39578
  }],
39418
- "pipelineAnalytics.getGroup": [{
39419
- name: "deviceId",
39420
- form: "single",
39421
- optional: false
39422
- }],
39423
39579
  "pipelineAnalytics.getKeyEvents": [{
39424
39580
  name: "deviceId",
39425
39581
  form: "single",
@@ -39485,11 +39641,6 @@ Object.freeze({
39485
39641
  form: "single",
39486
39642
  optional: false
39487
39643
  }],
39488
- "pipelineAnalytics.listGroups": [{
39489
- name: "deviceIds",
39490
- form: "array",
39491
- optional: false
39492
- }],
39493
39644
  "pipelineAnalytics.listOpsLog": [{
39494
39645
  name: "deviceId",
39495
39646
  form: "single",
@@ -39535,6 +39686,11 @@ Object.freeze({
39535
39686
  form: "single",
39536
39687
  optional: true
39537
39688
  }],
39689
+ "pipelineAnalytics.reclaimDebugMedia": [{
39690
+ name: "deviceIds",
39691
+ form: "array",
39692
+ optional: true
39693
+ }],
39538
39694
  "pipelineAnalytics.reconcileFromDisk": [{
39539
39695
  name: "deviceId",
39540
39696
  form: "single",
@@ -39900,6 +40056,11 @@ Object.freeze({
39900
40056
  form: "single",
39901
40057
  optional: false
39902
40058
  }],
40059
+ "recording.setDevicePlacement": [{
40060
+ name: "deviceId",
40061
+ form: "single",
40062
+ optional: false
40063
+ }],
39903
40064
  "recording.startStorageMigrationMove": [{
39904
40065
  name: "deviceId",
39905
40066
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-terminal",
3
- "version": "0.1.54",
3
+ "version": "0.1.55",
4
4
  "description": "Interactive terminal sessions (pty + xterm) as a CamStack addon",
5
5
  "keywords": [
6
6
  "camstack",