@camstack/addon-terminal 0.1.54 → 0.1.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/addon.js +236 -73
  2. package/dist/addon.mjs +236 -73
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -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()
@@ -15841,6 +15919,8 @@ var NcSystemEventKindSchema = _enum([
15841
15919
  "device-offline",
15842
15920
  "device-disabled",
15843
15921
  "device-enabled",
15922
+ "device-battery-low",
15923
+ "device-battery-normal",
15844
15924
  "stream-online",
15845
15925
  "stream-offline",
15846
15926
  "node-online",
@@ -19099,46 +19179,6 @@ var RecentTracksPageSchema = object({
19099
19179
  /** Cursor for the next page, or null when this page is the last. */
19100
19180
  nextCursor: string().nullable()
19101
19181
  });
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
19182
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19143
19183
  var KEY_EVENTS_MAX_LIMIT = 200;
19144
19184
  var KeyEventQueryInput = object({
@@ -19242,9 +19282,7 @@ var TrackCascadeCountsSchema = object({
19242
19282
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19243
19283
  plates: number().int(),
19244
19284
  /** 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()
19285
+ embeddings: number().int()
19248
19286
  });
19249
19287
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19250
19288
  var DiskReconcileCountsSchema = object({
@@ -19414,6 +19452,47 @@ var RebuildStatusSchema = object({
19414
19452
  /** Present when the pass ended by throwing. */
19415
19453
  error: string().nullable()
19416
19454
  });
19455
+ /**
19456
+ * Acknowledgement that a debug-media reclaim STARTED.
19457
+ *
19458
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19459
+ * it runs detached and this returns immediately. Awaiting it is how the
19460
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19461
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19462
+ */
19463
+ var MediaReclaimStartResultSchema = object({
19464
+ started: boolean(),
19465
+ /** True when a pass was already running; the new request is ignored. */
19466
+ alreadyRunning: boolean()
19467
+ });
19468
+ var MediaReclaimInputSchema = object({
19469
+ mode: _enum(["report", "reclaim"]).default("report"),
19470
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19471
+ deviceIds: array(number().int()).min(1).optional(),
19472
+ restart: boolean().optional(),
19473
+ pageSize: number().int().min(50).max(5e3).optional(),
19474
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19475
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19476
+ maxBytesPerRun: number().int().min(1).optional(),
19477
+ budgetMinutes: number().int().min(1).max(720).optional(),
19478
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19479
+ graceMinutes: number().int().min(1).max(10080).optional()
19480
+ });
19481
+ var MediaReclaimStatusSchema = object({
19482
+ running: boolean(),
19483
+ mode: _enum(["report", "reclaim"]).nullable(),
19484
+ totalExamined: number(),
19485
+ totalEligible: number(),
19486
+ totalReclaimed: number(),
19487
+ totalBytesReclaimed: number(),
19488
+ totalRefused: number(),
19489
+ /** Device+scope windows finished in this pass. */
19490
+ devicesDone: number(),
19491
+ complete: boolean().nullable(),
19492
+ startedAtMs: number().nullable(),
19493
+ finishedAtMs: number().nullable(),
19494
+ error: string().nullable()
19495
+ });
19417
19496
  var ReplayFrameInputSchema = object({
19418
19497
  timestamp: number(),
19419
19498
  frame: PipelineRunResultBridge
@@ -19452,10 +19531,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19452
19531
  * stationary registry). Default false: the timeline lists passages,
19453
19532
  * not parking records (operator decision, 2026-08-15). */
19454
19533
  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(), {
19534
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19459
19535
  kind: "mutation",
19460
19536
  auth: "admin"
19461
19537
  }), 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 +19631,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19555
19631
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19556
19632
  kind: "query",
19557
19633
  auth: "admin"
19634
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19635
+ kind: "mutation",
19636
+ auth: "admin"
19637
+ }), method(object({}), MediaReclaimStatusSchema, {
19638
+ kind: "query",
19639
+ auth: "admin"
19558
19640
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19559
19641
  kind: "query",
19560
19642
  auth: "admin"
@@ -21629,7 +21711,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21629
21711
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21630
21712
  kind: "mutation",
21631
21713
  auth: "admin"
21632
- });
21714
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21715
+ kind: "mutation",
21716
+ auth: "admin"
21717
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21718
+ kind: "mutation",
21719
+ auth: "admin"
21720
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21633
21721
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21634
21722
  providerId: string().min(1),
21635
21723
  displayName: string().min(1),
@@ -28766,6 +28854,33 @@ var RecordingRebalanceInputSchema = object({
28766
28854
  minMoveGb: number().min(0).optional()
28767
28855
  });
28768
28856
  /**
28857
+ * Operator-facing placement of one camera onto a recordings location.
28858
+ *
28859
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
28860
+ * Auto (the planner may move this camera). `locationId` is where high/mid
28861
+ * currently write — the plan, which may disagree with the pin when Auto.
28862
+ */
28863
+ var RecordingDevicePlacementSchema = object({
28864
+ deviceId: number().int(),
28865
+ profile: string(),
28866
+ locationId: string()
28867
+ });
28868
+ var RecordingDevicePinSchema = object({
28869
+ deviceId: number().int(),
28870
+ /** Recordings-class location this camera is pinned to. */
28871
+ locationId: string()
28872
+ });
28873
+ var RecordingPlacementViewSchema = object({
28874
+ assignments: array(RecordingDevicePlacementSchema),
28875
+ pins: array(RecordingDevicePinSchema),
28876
+ defaultLocations: record(string(), string())
28877
+ });
28878
+ var RecordingSetDevicePlacementInputSchema = object({
28879
+ deviceId: number().int(),
28880
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
28881
+ locationId: string().nullable()
28882
+ });
28883
+ /**
28769
28884
  * Result of locating footage at a wall-clock instant for one device/profile.
28770
28885
  * `segment` carries the covering segment's window; `gap` reports the forward
28771
28886
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -28991,6 +29106,12 @@ method(object({
28991
29106
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
28992
29107
  kind: "mutation",
28993
29108
  auth: "admin"
29109
+ }), method(object({}), RecordingPlacementViewSchema, {
29110
+ kind: "query",
29111
+ auth: "admin"
29112
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29113
+ kind: "mutation",
29114
+ auth: "admin"
28994
29115
  });
28995
29116
  /**
28996
29117
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -34058,6 +34179,12 @@ Object.freeze({
34058
34179
  addonId: null,
34059
34180
  access: "delete"
34060
34181
  },
34182
+ "deviceManager.renameLocation": {
34183
+ capName: "device-manager",
34184
+ capScope: "system",
34185
+ addonId: null,
34186
+ access: "create"
34187
+ },
34061
34188
  "deviceManager.runDeviceAction": {
34062
34189
  capName: "device-manager",
34063
34190
  capScope: "system",
@@ -35750,19 +35877,19 @@ Object.freeze({
35750
35877
  addonId: null,
35751
35878
  access: "view"
35752
35879
  },
35753
- "pipelineAnalytics.getGroup": {
35880
+ "pipelineAnalytics.getKeyEvents": {
35754
35881
  capName: "pipeline-analytics",
35755
35882
  capScope: "device",
35756
35883
  addonId: null,
35757
35884
  access: "view"
35758
35885
  },
35759
- "pipelineAnalytics.getKeyEvents": {
35886
+ "pipelineAnalytics.getKeyEventsBatch": {
35760
35887
  capName: "pipeline-analytics",
35761
35888
  capScope: "device",
35762
35889
  addonId: null,
35763
35890
  access: "view"
35764
35891
  },
35765
- "pipelineAnalytics.getKeyEventsBatch": {
35892
+ "pipelineAnalytics.getMediaReclaimStatus": {
35766
35893
  capName: "pipeline-analytics",
35767
35894
  capScope: "device",
35768
35895
  addonId: null,
@@ -35852,12 +35979,6 @@ Object.freeze({
35852
35979
  addonId: null,
35853
35980
  access: "view"
35854
35981
  },
35855
- "pipelineAnalytics.listGroups": {
35856
- capName: "pipeline-analytics",
35857
- capScope: "device",
35858
- addonId: null,
35859
- access: "view"
35860
- },
35861
35982
  "pipelineAnalytics.listOpsLog": {
35862
35983
  capName: "pipeline-analytics",
35863
35984
  capScope: "device",
@@ -35942,6 +36063,12 @@ Object.freeze({
35942
36063
  addonId: null,
35943
36064
  access: "create"
35944
36065
  },
36066
+ "pipelineAnalytics.reclaimDebugMedia": {
36067
+ capName: "pipeline-analytics",
36068
+ capScope: "device",
36069
+ addonId: null,
36070
+ access: "create"
36071
+ },
35945
36072
  "pipelineAnalytics.reconcileFromDisk": {
35946
36073
  capName: "pipeline-analytics",
35947
36074
  capScope: "device",
@@ -36866,6 +36993,12 @@ Object.freeze({
36866
36993
  addonId: null,
36867
36994
  access: "view"
36868
36995
  },
36996
+ "recording.getPlacement": {
36997
+ capName: "recording",
36998
+ capScope: "system",
36999
+ addonId: null,
37000
+ access: "view"
37001
+ },
36869
37002
  "recording.getPlaybackManifest": {
36870
37003
  capName: "recording",
36871
37004
  capScope: "system",
@@ -36992,6 +37125,12 @@ Object.freeze({
36992
37125
  addonId: null,
36993
37126
  access: "create"
36994
37127
  },
37128
+ "recording.setDevicePlacement": {
37129
+ capName: "recording",
37130
+ capScope: "system",
37131
+ addonId: null,
37132
+ access: "create"
37133
+ },
36995
37134
  "recording.startStorageMigrationMove": {
36996
37135
  capName: "recording",
36997
37136
  capScope: "system",
@@ -37436,12 +37575,36 @@ Object.freeze({
37436
37575
  addonId: null,
37437
37576
  access: "create"
37438
37577
  },
37578
+ "storageMigration.cleanupCancel": {
37579
+ capName: "storage-migration",
37580
+ capScope: "system",
37581
+ addonId: null,
37582
+ access: "create"
37583
+ },
37584
+ "storageMigration.cleanupStart": {
37585
+ capName: "storage-migration",
37586
+ capScope: "system",
37587
+ addonId: null,
37588
+ access: "create"
37589
+ },
37590
+ "storageMigration.cleanupStatus": {
37591
+ capName: "storage-migration",
37592
+ capScope: "system",
37593
+ addonId: null,
37594
+ access: "view"
37595
+ },
37439
37596
  "storageMigration.drain": {
37440
37597
  capName: "storage-migration",
37441
37598
  capScope: "system",
37442
37599
  addonId: null,
37443
37600
  access: "create"
37444
37601
  },
37602
+ "storageMigration.history": {
37603
+ capName: "storage-migration",
37604
+ capScope: "system",
37605
+ addonId: null,
37606
+ access: "view"
37607
+ },
37445
37608
  "storageMigration.movers": {
37446
37609
  capName: "storage-migration",
37447
37610
  capScope: "system",
@@ -39438,11 +39601,6 @@ Object.freeze({
39438
39601
  form: "single",
39439
39602
  optional: true
39440
39603
  }],
39441
- "pipelineAnalytics.getGroup": [{
39442
- name: "deviceId",
39443
- form: "single",
39444
- optional: false
39445
- }],
39446
39604
  "pipelineAnalytics.getKeyEvents": [{
39447
39605
  name: "deviceId",
39448
39606
  form: "single",
@@ -39508,11 +39666,6 @@ Object.freeze({
39508
39666
  form: "single",
39509
39667
  optional: false
39510
39668
  }],
39511
- "pipelineAnalytics.listGroups": [{
39512
- name: "deviceIds",
39513
- form: "array",
39514
- optional: false
39515
- }],
39516
39669
  "pipelineAnalytics.listOpsLog": [{
39517
39670
  name: "deviceId",
39518
39671
  form: "single",
@@ -39558,6 +39711,11 @@ Object.freeze({
39558
39711
  form: "single",
39559
39712
  optional: true
39560
39713
  }],
39714
+ "pipelineAnalytics.reclaimDebugMedia": [{
39715
+ name: "deviceIds",
39716
+ form: "array",
39717
+ optional: true
39718
+ }],
39561
39719
  "pipelineAnalytics.reconcileFromDisk": [{
39562
39720
  name: "deviceId",
39563
39721
  form: "single",
@@ -39923,6 +40081,11 @@ Object.freeze({
39923
40081
  form: "single",
39924
40082
  optional: false
39925
40083
  }],
40084
+ "recording.setDevicePlacement": [{
40085
+ name: "deviceId",
40086
+ form: "single",
40087
+ optional: false
40088
+ }],
39926
40089
  "recording.startStorageMigrationMove": [{
39927
40090
  name: "deviceId",
39928
40091
  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()
@@ -15818,6 +15896,8 @@ var NcSystemEventKindSchema = _enum([
15818
15896
  "device-offline",
15819
15897
  "device-disabled",
15820
15898
  "device-enabled",
15899
+ "device-battery-low",
15900
+ "device-battery-normal",
15821
15901
  "stream-online",
15822
15902
  "stream-offline",
15823
15903
  "node-online",
@@ -19076,46 +19156,6 @@ var RecentTracksPageSchema = object({
19076
19156
  /** Cursor for the next page, or null when this page is the last. */
19077
19157
  nextCursor: string().nullable()
19078
19158
  });
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
19159
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19120
19160
  var KEY_EVENTS_MAX_LIMIT = 200;
19121
19161
  var KeyEventQueryInput = object({
@@ -19219,9 +19259,7 @@ var TrackCascadeCountsSchema = object({
19219
19259
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19220
19260
  plates: number().int(),
19221
19261
  /** 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()
19262
+ embeddings: number().int()
19225
19263
  });
19226
19264
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19227
19265
  var DiskReconcileCountsSchema = object({
@@ -19391,6 +19429,47 @@ var RebuildStatusSchema = object({
19391
19429
  /** Present when the pass ended by throwing. */
19392
19430
  error: string().nullable()
19393
19431
  });
19432
+ /**
19433
+ * Acknowledgement that a debug-media reclaim STARTED.
19434
+ *
19435
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19436
+ * it runs detached and this returns immediately. Awaiting it is how the
19437
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19438
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19439
+ */
19440
+ var MediaReclaimStartResultSchema = object({
19441
+ started: boolean(),
19442
+ /** True when a pass was already running; the new request is ignored. */
19443
+ alreadyRunning: boolean()
19444
+ });
19445
+ var MediaReclaimInputSchema = object({
19446
+ mode: _enum(["report", "reclaim"]).default("report"),
19447
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19448
+ deviceIds: array(number().int()).min(1).optional(),
19449
+ restart: boolean().optional(),
19450
+ pageSize: number().int().min(50).max(5e3).optional(),
19451
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19452
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19453
+ maxBytesPerRun: number().int().min(1).optional(),
19454
+ budgetMinutes: number().int().min(1).max(720).optional(),
19455
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19456
+ graceMinutes: number().int().min(1).max(10080).optional()
19457
+ });
19458
+ var MediaReclaimStatusSchema = object({
19459
+ running: boolean(),
19460
+ mode: _enum(["report", "reclaim"]).nullable(),
19461
+ totalExamined: number(),
19462
+ totalEligible: number(),
19463
+ totalReclaimed: number(),
19464
+ totalBytesReclaimed: number(),
19465
+ totalRefused: number(),
19466
+ /** Device+scope windows finished in this pass. */
19467
+ devicesDone: number(),
19468
+ complete: boolean().nullable(),
19469
+ startedAtMs: number().nullable(),
19470
+ finishedAtMs: number().nullable(),
19471
+ error: string().nullable()
19472
+ });
19394
19473
  var ReplayFrameInputSchema = object({
19395
19474
  timestamp: number(),
19396
19475
  frame: PipelineRunResultBridge
@@ -19429,10 +19508,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19429
19508
  * stationary registry). Default false: the timeline lists passages,
19430
19509
  * not parking records (operator decision, 2026-08-15). */
19431
19510
  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(), {
19511
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19436
19512
  kind: "mutation",
19437
19513
  auth: "admin"
19438
19514
  }), 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 +19608,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19532
19608
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19533
19609
  kind: "query",
19534
19610
  auth: "admin"
19611
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19612
+ kind: "mutation",
19613
+ auth: "admin"
19614
+ }), method(object({}), MediaReclaimStatusSchema, {
19615
+ kind: "query",
19616
+ auth: "admin"
19535
19617
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19536
19618
  kind: "query",
19537
19619
  auth: "admin"
@@ -21606,7 +21688,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21606
21688
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21607
21689
  kind: "mutation",
21608
21690
  auth: "admin"
21609
- });
21691
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21692
+ kind: "mutation",
21693
+ auth: "admin"
21694
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21695
+ kind: "mutation",
21696
+ auth: "admin"
21697
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21610
21698
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21611
21699
  providerId: string().min(1),
21612
21700
  displayName: string().min(1),
@@ -28743,6 +28831,33 @@ var RecordingRebalanceInputSchema = object({
28743
28831
  minMoveGb: number().min(0).optional()
28744
28832
  });
28745
28833
  /**
28834
+ * Operator-facing placement of one camera onto a recordings location.
28835
+ *
28836
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
28837
+ * Auto (the planner may move this camera). `locationId` is where high/mid
28838
+ * currently write — the plan, which may disagree with the pin when Auto.
28839
+ */
28840
+ var RecordingDevicePlacementSchema = object({
28841
+ deviceId: number().int(),
28842
+ profile: string(),
28843
+ locationId: string()
28844
+ });
28845
+ var RecordingDevicePinSchema = object({
28846
+ deviceId: number().int(),
28847
+ /** Recordings-class location this camera is pinned to. */
28848
+ locationId: string()
28849
+ });
28850
+ var RecordingPlacementViewSchema = object({
28851
+ assignments: array(RecordingDevicePlacementSchema),
28852
+ pins: array(RecordingDevicePinSchema),
28853
+ defaultLocations: record(string(), string())
28854
+ });
28855
+ var RecordingSetDevicePlacementInputSchema = object({
28856
+ deviceId: number().int(),
28857
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
28858
+ locationId: string().nullable()
28859
+ });
28860
+ /**
28746
28861
  * Result of locating footage at a wall-clock instant for one device/profile.
28747
28862
  * `segment` carries the covering segment's window; `gap` reports the forward
28748
28863
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -28968,6 +29083,12 @@ method(object({
28968
29083
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
28969
29084
  kind: "mutation",
28970
29085
  auth: "admin"
29086
+ }), method(object({}), RecordingPlacementViewSchema, {
29087
+ kind: "query",
29088
+ auth: "admin"
29089
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
29090
+ kind: "mutation",
29091
+ auth: "admin"
28971
29092
  });
28972
29093
  /**
28973
29094
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -34035,6 +34156,12 @@ Object.freeze({
34035
34156
  addonId: null,
34036
34157
  access: "delete"
34037
34158
  },
34159
+ "deviceManager.renameLocation": {
34160
+ capName: "device-manager",
34161
+ capScope: "system",
34162
+ addonId: null,
34163
+ access: "create"
34164
+ },
34038
34165
  "deviceManager.runDeviceAction": {
34039
34166
  capName: "device-manager",
34040
34167
  capScope: "system",
@@ -35727,19 +35854,19 @@ Object.freeze({
35727
35854
  addonId: null,
35728
35855
  access: "view"
35729
35856
  },
35730
- "pipelineAnalytics.getGroup": {
35857
+ "pipelineAnalytics.getKeyEvents": {
35731
35858
  capName: "pipeline-analytics",
35732
35859
  capScope: "device",
35733
35860
  addonId: null,
35734
35861
  access: "view"
35735
35862
  },
35736
- "pipelineAnalytics.getKeyEvents": {
35863
+ "pipelineAnalytics.getKeyEventsBatch": {
35737
35864
  capName: "pipeline-analytics",
35738
35865
  capScope: "device",
35739
35866
  addonId: null,
35740
35867
  access: "view"
35741
35868
  },
35742
- "pipelineAnalytics.getKeyEventsBatch": {
35869
+ "pipelineAnalytics.getMediaReclaimStatus": {
35743
35870
  capName: "pipeline-analytics",
35744
35871
  capScope: "device",
35745
35872
  addonId: null,
@@ -35829,12 +35956,6 @@ Object.freeze({
35829
35956
  addonId: null,
35830
35957
  access: "view"
35831
35958
  },
35832
- "pipelineAnalytics.listGroups": {
35833
- capName: "pipeline-analytics",
35834
- capScope: "device",
35835
- addonId: null,
35836
- access: "view"
35837
- },
35838
35959
  "pipelineAnalytics.listOpsLog": {
35839
35960
  capName: "pipeline-analytics",
35840
35961
  capScope: "device",
@@ -35919,6 +36040,12 @@ Object.freeze({
35919
36040
  addonId: null,
35920
36041
  access: "create"
35921
36042
  },
36043
+ "pipelineAnalytics.reclaimDebugMedia": {
36044
+ capName: "pipeline-analytics",
36045
+ capScope: "device",
36046
+ addonId: null,
36047
+ access: "create"
36048
+ },
35922
36049
  "pipelineAnalytics.reconcileFromDisk": {
35923
36050
  capName: "pipeline-analytics",
35924
36051
  capScope: "device",
@@ -36843,6 +36970,12 @@ Object.freeze({
36843
36970
  addonId: null,
36844
36971
  access: "view"
36845
36972
  },
36973
+ "recording.getPlacement": {
36974
+ capName: "recording",
36975
+ capScope: "system",
36976
+ addonId: null,
36977
+ access: "view"
36978
+ },
36846
36979
  "recording.getPlaybackManifest": {
36847
36980
  capName: "recording",
36848
36981
  capScope: "system",
@@ -36969,6 +37102,12 @@ Object.freeze({
36969
37102
  addonId: null,
36970
37103
  access: "create"
36971
37104
  },
37105
+ "recording.setDevicePlacement": {
37106
+ capName: "recording",
37107
+ capScope: "system",
37108
+ addonId: null,
37109
+ access: "create"
37110
+ },
36972
37111
  "recording.startStorageMigrationMove": {
36973
37112
  capName: "recording",
36974
37113
  capScope: "system",
@@ -37413,12 +37552,36 @@ Object.freeze({
37413
37552
  addonId: null,
37414
37553
  access: "create"
37415
37554
  },
37555
+ "storageMigration.cleanupCancel": {
37556
+ capName: "storage-migration",
37557
+ capScope: "system",
37558
+ addonId: null,
37559
+ access: "create"
37560
+ },
37561
+ "storageMigration.cleanupStart": {
37562
+ capName: "storage-migration",
37563
+ capScope: "system",
37564
+ addonId: null,
37565
+ access: "create"
37566
+ },
37567
+ "storageMigration.cleanupStatus": {
37568
+ capName: "storage-migration",
37569
+ capScope: "system",
37570
+ addonId: null,
37571
+ access: "view"
37572
+ },
37416
37573
  "storageMigration.drain": {
37417
37574
  capName: "storage-migration",
37418
37575
  capScope: "system",
37419
37576
  addonId: null,
37420
37577
  access: "create"
37421
37578
  },
37579
+ "storageMigration.history": {
37580
+ capName: "storage-migration",
37581
+ capScope: "system",
37582
+ addonId: null,
37583
+ access: "view"
37584
+ },
37422
37585
  "storageMigration.movers": {
37423
37586
  capName: "storage-migration",
37424
37587
  capScope: "system",
@@ -39415,11 +39578,6 @@ Object.freeze({
39415
39578
  form: "single",
39416
39579
  optional: true
39417
39580
  }],
39418
- "pipelineAnalytics.getGroup": [{
39419
- name: "deviceId",
39420
- form: "single",
39421
- optional: false
39422
- }],
39423
39581
  "pipelineAnalytics.getKeyEvents": [{
39424
39582
  name: "deviceId",
39425
39583
  form: "single",
@@ -39485,11 +39643,6 @@ Object.freeze({
39485
39643
  form: "single",
39486
39644
  optional: false
39487
39645
  }],
39488
- "pipelineAnalytics.listGroups": [{
39489
- name: "deviceIds",
39490
- form: "array",
39491
- optional: false
39492
- }],
39493
39646
  "pipelineAnalytics.listOpsLog": [{
39494
39647
  name: "deviceId",
39495
39648
  form: "single",
@@ -39535,6 +39688,11 @@ Object.freeze({
39535
39688
  form: "single",
39536
39689
  optional: true
39537
39690
  }],
39691
+ "pipelineAnalytics.reclaimDebugMedia": [{
39692
+ name: "deviceIds",
39693
+ form: "array",
39694
+ optional: true
39695
+ }],
39538
39696
  "pipelineAnalytics.reconcileFromDisk": [{
39539
39697
  name: "deviceId",
39540
39698
  form: "single",
@@ -39900,6 +40058,11 @@ Object.freeze({
39900
40058
  form: "single",
39901
40059
  optional: false
39902
40060
  }],
40061
+ "recording.setDevicePlacement": [{
40062
+ name: "deviceId",
40063
+ form: "single",
40064
+ optional: false
40065
+ }],
39903
40066
  "recording.startStorageMigrationMove": [{
39904
40067
  name: "deviceId",
39905
40068
  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.56",
4
4
  "description": "Interactive terminal sessions (pty + xterm) as a CamStack addon",
5
5
  "keywords": [
6
6
  "camstack",