@camstack/addon-notifiers 1.2.53 → 1.2.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 +236 -73
  2. package/dist/addon.mjs +236 -73
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -8229,6 +8229,13 @@ var MediaRelocateModeSchema = _enum([
8229
8229
  ]);
8230
8230
  var RelocateMediaInputSchema = object({
8231
8231
  toLocationId: string(),
8232
+ /**
8233
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8234
+ * every row that is not already on `toLocationId` (the historical
8235
+ * behaviour). A named source is what a from→to migration needs: without it
8236
+ * "move events off disk 2" also emptied disk 1.
8237
+ */
8238
+ fromLocationId: string().optional(),
8232
8239
  throttleMbps: number().min(1).max(1e3).optional(),
8233
8240
  /** Omitted = `move`, the pre-existing behaviour. */
8234
8241
  mode: MediaRelocateModeSchema.optional()
@@ -8296,6 +8303,19 @@ var StorageMigrationDestinationsSchema = object({
8296
8303
  galleryMedia: string().min(1).optional()
8297
8304
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8298
8305
  /**
8306
+ * Optional named source per class. Omitted = the class's current default
8307
+ * (the historical behaviour). A named source that is NOT the default is a
8308
+ * drain of that disk: bytes move, the default stays, and the source is
8309
+ * disabled when the move finishes.
8310
+ */
8311
+ var StorageMigrationSourcesSchema = object({
8312
+ recordings: string().min(1).optional(),
8313
+ recordingsLow: string().min(1).optional(),
8314
+ eventMedia: string().min(1).optional(),
8315
+ backups: string().min(1).optional(),
8316
+ galleryMedia: string().min(1).optional()
8317
+ }).optional();
8318
+ /**
8299
8319
  * How a migration sequences the cutover against the byte move.
8300
8320
  *
8301
8321
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8317,6 +8337,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8317
8337
  /** Shared input for planning and starting an orchestrated storage migration. */
8318
8338
  var StorageMigrationInputSchema = object({
8319
8339
  destinations: StorageMigrationDestinationsSchema,
8340
+ /** Omitted = each class's current default. */
8341
+ sources: StorageMigrationSourcesSchema,
8320
8342
  throttleMbps: number().min(1).max(1e3).optional(),
8321
8343
  /** Omitted = `blocking`, which stays the default. */
8322
8344
  mode: StorageMigrationModeSchema.optional()
@@ -8396,6 +8418,13 @@ var StorageMigrationMoveSchema = object({
8396
8418
  storageClass: StorageMigrationClassSchema,
8397
8419
  fromLocationId: string(),
8398
8420
  toLocationId: string(),
8421
+ /**
8422
+ * True when `from` was NOT the class default at plan time. The move still
8423
+ * copies bytes, but the default is left alone and the source is disabled
8424
+ * once the copy verifies. Absent on jobs planned before this field existed
8425
+ * — those jobs always repointed, which is `false`.
8426
+ */
8427
+ freezeSource: boolean().optional(),
8399
8428
  moverJobId: string().nullable(),
8400
8429
  state: RelocateJobStateSchema.nullable(),
8401
8430
  error: string().nullable(),
@@ -8409,6 +8438,7 @@ var StorageMigrationJobSchema = object({
8409
8438
  * can tell a seconds-long cutover from a thirty-hour one. */
8410
8439
  mode: StorageMigrationModeSchema,
8411
8440
  destinations: StorageMigrationDestinationsSchema,
8441
+ sources: StorageMigrationSourcesSchema,
8412
8442
  throttleMbps: number(),
8413
8443
  moves: array(StorageMigrationMoveSchema),
8414
8444
  pauseLeaseId: string().nullable(),
@@ -8434,6 +8464,7 @@ var StorageMigrationFindingSchema = object({
8434
8464
  });
8435
8465
  var StorageMigrationPlanSchema = object({
8436
8466
  destinations: StorageMigrationDestinationsSchema,
8467
+ sources: StorageMigrationSourcesSchema,
8437
8468
  /** The mode this plan was built for. A plan is only valid for its mode: the
8438
8469
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8439
8470
  * it. */
@@ -8441,7 +8472,8 @@ var StorageMigrationPlanSchema = object({
8441
8472
  moves: array(object({
8442
8473
  storageClass: StorageMigrationClassSchema,
8443
8474
  fromLocationId: string(),
8444
- toLocationId: string()
8475
+ toLocationId: string(),
8476
+ freezeSource: boolean().optional()
8445
8477
  })),
8446
8478
  findings: array(StorageMigrationFindingSchema)
8447
8479
  });
@@ -8619,10 +8651,51 @@ var LedgerWalkReportSchema = object({
8619
8651
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8620
8652
  var RelocatableMediaCountInputSchema = object({
8621
8653
  toLocationId: string().min(1),
8654
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8655
+ fromLocationId: string().optional(),
8622
8656
  /** Omitted = `move`. */
8623
8657
  mode: MediaRelocateModeSchema.optional()
8624
8658
  });
8625
8659
  /**
8660
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8661
+ * ghost ledger entries on frozen footage locations.
8662
+ *
8663
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8664
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8665
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8666
+ * with no operator-visible status.
8667
+ */
8668
+ var StorageCleanupPhaseSchema = _enum([
8669
+ "orphans",
8670
+ "debug-media",
8671
+ "ghost-ledger",
8672
+ "done",
8673
+ "failed",
8674
+ "cancelled"
8675
+ ]);
8676
+ var StorageCleanupInputSchema = object({
8677
+ /** Also walk motion stills / track filmstrips. Off by default. */
8678
+ includeDebugMedia: boolean().optional() });
8679
+ var StorageCleanupJobSchema = object({
8680
+ jobId: string(),
8681
+ phase: StorageCleanupPhaseSchema,
8682
+ includeDebugMedia: boolean(),
8683
+ orphansReclaimed: number().int().nonnegative(),
8684
+ orphanBytesReclaimed: number().int().nonnegative(),
8685
+ debugMediaReclaimed: number().int().nonnegative(),
8686
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8687
+ ghostsForgotten: number().int().nonnegative(),
8688
+ ghostBytesForgotten: number().int().nonnegative(),
8689
+ /** Short operator-facing line: current collection, pass, or location. */
8690
+ detail: string().nullable(),
8691
+ cancelRequested: boolean(),
8692
+ startedAt: number(),
8693
+ updatedAt: number(),
8694
+ finishedAt: number().nullable(),
8695
+ error: string().nullable()
8696
+ });
8697
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8698
+ /**
8626
8699
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8627
8700
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8628
8701
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8650,11 +8723,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8650
8723
  * The default location for a type uses `id === <type>:default` by
8651
8724
  * convention (the bare type ref like `'backups'` resolves to it).
8652
8725
  *
8653
- * `isSystem: true` marks a location as orchestrator-seeded and
8654
- * undeletable. The bootstrap-installed defaults (one per type) carry
8655
- * this flag; operator-added locations don't. Editing the config of
8656
- * a system location is allowed (path migration, provider swap) but
8657
- * deleting it is rejected at the cap level.
8726
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8727
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8728
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8729
+ * / last-enabled, not on this bit.
8658
8730
  */
8659
8731
  var StorageLocationSchema = object({
8660
8732
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -12957,6 +13029,12 @@ method(object({
12957
13029
  }), _void(), {
12958
13030
  kind: "mutation",
12959
13031
  auth: "admin"
13032
+ }), method(object({
13033
+ from: string(),
13034
+ to: string()
13035
+ }), object({ moved: number() }), {
13036
+ kind: "mutation",
13037
+ auth: "admin"
12960
13038
  }), method(object({
12961
13039
  deviceId: number(),
12962
13040
  disabled: boolean()
@@ -15683,6 +15761,8 @@ var NcSystemEventKindSchema = _enum([
15683
15761
  "device-offline",
15684
15762
  "device-disabled",
15685
15763
  "device-enabled",
15764
+ "device-battery-low",
15765
+ "device-battery-normal",
15686
15766
  "stream-online",
15687
15767
  "stream-offline",
15688
15768
  "node-online",
@@ -18901,46 +18981,6 @@ var RecentTracksPageSchema = object({
18901
18981
  /** Cursor for the next page, or null when this page is the last. */
18902
18982
  nextCursor: string().nullable()
18903
18983
  });
18904
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
18905
- var LIST_GROUPS_MAX_LIMIT = 100;
18906
- var AnalyticsGroupRecordSchema = object({
18907
- id: string(),
18908
- deviceId: number().int(),
18909
- openedAt: number().int(),
18910
- closedAt: number().int(),
18911
- timestamp: number().int(),
18912
- memberCount: number().int(),
18913
- memberTrackIds: array(string()).readonly(),
18914
- className: string(),
18915
- classes: array(string()).readonly(),
18916
- /** Relative event-media path, or null when the group has no picture yet. */
18917
- mediaUrl: string().nullable(),
18918
- singleton: boolean()
18919
- });
18920
- var AnalyticsGroupMemberSchema = object({
18921
- trackId: string(),
18922
- deviceId: number().int(),
18923
- className: string(),
18924
- firstSeen: number().int(),
18925
- lastSeen: number().int(),
18926
- mediaUrl: string().nullable()
18927
- });
18928
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
18929
- var ListGroupsQueryInput = object({
18930
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
18931
- deviceIds: array(number()),
18932
- /** Window lower bound on `closedAt` (inclusive). */
18933
- since: number().optional(),
18934
- /** Window upper bound on `openedAt` (inclusive). */
18935
- until: number().optional(),
18936
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
18937
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
18938
- cursor: string().optional()
18939
- });
18940
- var ListGroupsPageSchema = object({
18941
- groups: array(AnalyticsGroupRecordSchema).readonly(),
18942
- nextCursor: string().nullable()
18943
- });
18944
18984
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
18945
18985
  var KEY_EVENTS_MAX_LIMIT = 200;
18946
18986
  var KeyEventQueryInput = object({
@@ -19044,9 +19084,7 @@ var TrackCascadeCountsSchema = object({
19044
19084
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19045
19085
  plates: number().int(),
19046
19086
  /** Per-track CLIP search vectors removed (best-effort). */
19047
- embeddings: number().int(),
19048
- /** Group membership + group rows removed with their last member (best-effort). */
19049
- groups: number().int()
19087
+ embeddings: number().int()
19050
19088
  });
19051
19089
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19052
19090
  var DiskReconcileCountsSchema = object({
@@ -19216,6 +19254,47 @@ var RebuildStatusSchema = object({
19216
19254
  /** Present when the pass ended by throwing. */
19217
19255
  error: string().nullable()
19218
19256
  });
19257
+ /**
19258
+ * Acknowledgement that a debug-media reclaim STARTED.
19259
+ *
19260
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19261
+ * it runs detached and this returns immediately. Awaiting it is how the
19262
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19263
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19264
+ */
19265
+ var MediaReclaimStartResultSchema = object({
19266
+ started: boolean(),
19267
+ /** True when a pass was already running; the new request is ignored. */
19268
+ alreadyRunning: boolean()
19269
+ });
19270
+ var MediaReclaimInputSchema = object({
19271
+ mode: _enum(["report", "reclaim"]).default("report"),
19272
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19273
+ deviceIds: array(number().int()).min(1).optional(),
19274
+ restart: boolean().optional(),
19275
+ pageSize: number().int().min(50).max(5e3).optional(),
19276
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19277
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19278
+ maxBytesPerRun: number().int().min(1).optional(),
19279
+ budgetMinutes: number().int().min(1).max(720).optional(),
19280
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19281
+ graceMinutes: number().int().min(1).max(10080).optional()
19282
+ });
19283
+ var MediaReclaimStatusSchema = object({
19284
+ running: boolean(),
19285
+ mode: _enum(["report", "reclaim"]).nullable(),
19286
+ totalExamined: number(),
19287
+ totalEligible: number(),
19288
+ totalReclaimed: number(),
19289
+ totalBytesReclaimed: number(),
19290
+ totalRefused: number(),
19291
+ /** Device+scope windows finished in this pass. */
19292
+ devicesDone: number(),
19293
+ complete: boolean().nullable(),
19294
+ startedAtMs: number().nullable(),
19295
+ finishedAtMs: number().nullable(),
19296
+ error: string().nullable()
19297
+ });
19219
19298
  var ReplayFrameInputSchema = object({
19220
19299
  timestamp: number(),
19221
19300
  frame: PipelineRunResultBridge
@@ -19254,10 +19333,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19254
19333
  * stationary registry). Default false: the timeline lists passages,
19255
19334
  * not parking records (operator decision, 2026-08-15). */
19256
19335
  includeStationary: boolean().optional()
19257
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19258
- deviceId: number(),
19259
- groupId: string().min(1)
19260
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19336
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19261
19337
  kind: "mutation",
19262
19338
  auth: "admin"
19263
19339
  }), 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({
@@ -19357,6 +19433,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19357
19433
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19358
19434
  kind: "query",
19359
19435
  auth: "admin"
19436
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19437
+ kind: "mutation",
19438
+ auth: "admin"
19439
+ }), method(object({}), MediaReclaimStatusSchema, {
19440
+ kind: "query",
19441
+ auth: "admin"
19360
19442
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19361
19443
  kind: "query",
19362
19444
  auth: "admin"
@@ -21327,7 +21409,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21327
21409
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21328
21410
  kind: "mutation",
21329
21411
  auth: "admin"
21330
- });
21412
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21413
+ kind: "mutation",
21414
+ auth: "admin"
21415
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21416
+ kind: "mutation",
21417
+ auth: "admin"
21418
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21331
21419
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21332
21420
  providerId: string().min(1),
21333
21421
  displayName: string().min(1),
@@ -26705,6 +26793,33 @@ var RecordingRebalanceInputSchema = object({
26705
26793
  minMoveGb: number().min(0).optional()
26706
26794
  });
26707
26795
  /**
26796
+ * Operator-facing placement of one camera onto a recordings location.
26797
+ *
26798
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
26799
+ * Auto (the planner may move this camera). `locationId` is where high/mid
26800
+ * currently write — the plan, which may disagree with the pin when Auto.
26801
+ */
26802
+ var RecordingDevicePlacementSchema = object({
26803
+ deviceId: number().int(),
26804
+ profile: string(),
26805
+ locationId: string()
26806
+ });
26807
+ var RecordingDevicePinSchema = object({
26808
+ deviceId: number().int(),
26809
+ /** Recordings-class location this camera is pinned to. */
26810
+ locationId: string()
26811
+ });
26812
+ var RecordingPlacementViewSchema = object({
26813
+ assignments: array(RecordingDevicePlacementSchema),
26814
+ pins: array(RecordingDevicePinSchema),
26815
+ defaultLocations: record(string(), string())
26816
+ });
26817
+ var RecordingSetDevicePlacementInputSchema = object({
26818
+ deviceId: number().int(),
26819
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
26820
+ locationId: string().nullable()
26821
+ });
26822
+ /**
26708
26823
  * Result of locating footage at a wall-clock instant for one device/profile.
26709
26824
  * `segment` carries the covering segment's window; `gap` reports the forward
26710
26825
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -26930,6 +27045,12 @@ method(object({
26930
27045
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
26931
27046
  kind: "mutation",
26932
27047
  auth: "admin"
27048
+ }), method(object({}), RecordingPlacementViewSchema, {
27049
+ kind: "query",
27050
+ auth: "admin"
27051
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
27052
+ kind: "mutation",
27053
+ auth: "admin"
26933
27054
  });
26934
27055
  /**
26935
27056
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -30300,6 +30421,12 @@ Object.freeze({
30300
30421
  addonId: null,
30301
30422
  access: "delete"
30302
30423
  },
30424
+ "deviceManager.renameLocation": {
30425
+ capName: "device-manager",
30426
+ capScope: "system",
30427
+ addonId: null,
30428
+ access: "create"
30429
+ },
30303
30430
  "deviceManager.runDeviceAction": {
30304
30431
  capName: "device-manager",
30305
30432
  capScope: "system",
@@ -31992,19 +32119,19 @@ Object.freeze({
31992
32119
  addonId: null,
31993
32120
  access: "view"
31994
32121
  },
31995
- "pipelineAnalytics.getGroup": {
32122
+ "pipelineAnalytics.getKeyEvents": {
31996
32123
  capName: "pipeline-analytics",
31997
32124
  capScope: "device",
31998
32125
  addonId: null,
31999
32126
  access: "view"
32000
32127
  },
32001
- "pipelineAnalytics.getKeyEvents": {
32128
+ "pipelineAnalytics.getKeyEventsBatch": {
32002
32129
  capName: "pipeline-analytics",
32003
32130
  capScope: "device",
32004
32131
  addonId: null,
32005
32132
  access: "view"
32006
32133
  },
32007
- "pipelineAnalytics.getKeyEventsBatch": {
32134
+ "pipelineAnalytics.getMediaReclaimStatus": {
32008
32135
  capName: "pipeline-analytics",
32009
32136
  capScope: "device",
32010
32137
  addonId: null,
@@ -32094,12 +32221,6 @@ Object.freeze({
32094
32221
  addonId: null,
32095
32222
  access: "view"
32096
32223
  },
32097
- "pipelineAnalytics.listGroups": {
32098
- capName: "pipeline-analytics",
32099
- capScope: "device",
32100
- addonId: null,
32101
- access: "view"
32102
- },
32103
32224
  "pipelineAnalytics.listOpsLog": {
32104
32225
  capName: "pipeline-analytics",
32105
32226
  capScope: "device",
@@ -32184,6 +32305,12 @@ Object.freeze({
32184
32305
  addonId: null,
32185
32306
  access: "create"
32186
32307
  },
32308
+ "pipelineAnalytics.reclaimDebugMedia": {
32309
+ capName: "pipeline-analytics",
32310
+ capScope: "device",
32311
+ addonId: null,
32312
+ access: "create"
32313
+ },
32187
32314
  "pipelineAnalytics.reconcileFromDisk": {
32188
32315
  capName: "pipeline-analytics",
32189
32316
  capScope: "device",
@@ -33108,6 +33235,12 @@ Object.freeze({
33108
33235
  addonId: null,
33109
33236
  access: "view"
33110
33237
  },
33238
+ "recording.getPlacement": {
33239
+ capName: "recording",
33240
+ capScope: "system",
33241
+ addonId: null,
33242
+ access: "view"
33243
+ },
33111
33244
  "recording.getPlaybackManifest": {
33112
33245
  capName: "recording",
33113
33246
  capScope: "system",
@@ -33234,6 +33367,12 @@ Object.freeze({
33234
33367
  addonId: null,
33235
33368
  access: "create"
33236
33369
  },
33370
+ "recording.setDevicePlacement": {
33371
+ capName: "recording",
33372
+ capScope: "system",
33373
+ addonId: null,
33374
+ access: "create"
33375
+ },
33237
33376
  "recording.startStorageMigrationMove": {
33238
33377
  capName: "recording",
33239
33378
  capScope: "system",
@@ -33678,12 +33817,36 @@ Object.freeze({
33678
33817
  addonId: null,
33679
33818
  access: "create"
33680
33819
  },
33820
+ "storageMigration.cleanupCancel": {
33821
+ capName: "storage-migration",
33822
+ capScope: "system",
33823
+ addonId: null,
33824
+ access: "create"
33825
+ },
33826
+ "storageMigration.cleanupStart": {
33827
+ capName: "storage-migration",
33828
+ capScope: "system",
33829
+ addonId: null,
33830
+ access: "create"
33831
+ },
33832
+ "storageMigration.cleanupStatus": {
33833
+ capName: "storage-migration",
33834
+ capScope: "system",
33835
+ addonId: null,
33836
+ access: "view"
33837
+ },
33681
33838
  "storageMigration.drain": {
33682
33839
  capName: "storage-migration",
33683
33840
  capScope: "system",
33684
33841
  addonId: null,
33685
33842
  access: "create"
33686
33843
  },
33844
+ "storageMigration.history": {
33845
+ capName: "storage-migration",
33846
+ capScope: "system",
33847
+ addonId: null,
33848
+ access: "view"
33849
+ },
33687
33850
  "storageMigration.movers": {
33688
33851
  capName: "storage-migration",
33689
33852
  capScope: "system",
@@ -35680,11 +35843,6 @@ Object.freeze({
35680
35843
  form: "single",
35681
35844
  optional: true
35682
35845
  }],
35683
- "pipelineAnalytics.getGroup": [{
35684
- name: "deviceId",
35685
- form: "single",
35686
- optional: false
35687
- }],
35688
35846
  "pipelineAnalytics.getKeyEvents": [{
35689
35847
  name: "deviceId",
35690
35848
  form: "single",
@@ -35750,11 +35908,6 @@ Object.freeze({
35750
35908
  form: "single",
35751
35909
  optional: false
35752
35910
  }],
35753
- "pipelineAnalytics.listGroups": [{
35754
- name: "deviceIds",
35755
- form: "array",
35756
- optional: false
35757
- }],
35758
35911
  "pipelineAnalytics.listOpsLog": [{
35759
35912
  name: "deviceId",
35760
35913
  form: "single",
@@ -35800,6 +35953,11 @@ Object.freeze({
35800
35953
  form: "single",
35801
35954
  optional: true
35802
35955
  }],
35956
+ "pipelineAnalytics.reclaimDebugMedia": [{
35957
+ name: "deviceIds",
35958
+ form: "array",
35959
+ optional: true
35960
+ }],
35803
35961
  "pipelineAnalytics.reconcileFromDisk": [{
35804
35962
  name: "deviceId",
35805
35963
  form: "single",
@@ -36165,6 +36323,11 @@ Object.freeze({
36165
36323
  form: "single",
36166
36324
  optional: false
36167
36325
  }],
36326
+ "recording.setDevicePlacement": [{
36327
+ name: "deviceId",
36328
+ form: "single",
36329
+ optional: false
36330
+ }],
36168
36331
  "recording.startStorageMigrationMove": [{
36169
36332
  name: "deviceId",
36170
36333
  form: "single",
package/dist/addon.mjs CHANGED
@@ -8202,6 +8202,13 @@ var MediaRelocateModeSchema = _enum([
8202
8202
  ]);
8203
8203
  var RelocateMediaInputSchema = object({
8204
8204
  toLocationId: string(),
8205
+ /**
8206
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8207
+ * every row that is not already on `toLocationId` (the historical
8208
+ * behaviour). A named source is what a from→to migration needs: without it
8209
+ * "move events off disk 2" also emptied disk 1.
8210
+ */
8211
+ fromLocationId: string().optional(),
8205
8212
  throttleMbps: number().min(1).max(1e3).optional(),
8206
8213
  /** Omitted = `move`, the pre-existing behaviour. */
8207
8214
  mode: MediaRelocateModeSchema.optional()
@@ -8269,6 +8276,19 @@ var StorageMigrationDestinationsSchema = object({
8269
8276
  galleryMedia: string().min(1).optional()
8270
8277
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8271
8278
  /**
8279
+ * Optional named source per class. Omitted = the class's current default
8280
+ * (the historical behaviour). A named source that is NOT the default is a
8281
+ * drain of that disk: bytes move, the default stays, and the source is
8282
+ * disabled when the move finishes.
8283
+ */
8284
+ var StorageMigrationSourcesSchema = object({
8285
+ recordings: string().min(1).optional(),
8286
+ recordingsLow: string().min(1).optional(),
8287
+ eventMedia: string().min(1).optional(),
8288
+ backups: string().min(1).optional(),
8289
+ galleryMedia: string().min(1).optional()
8290
+ }).optional();
8291
+ /**
8272
8292
  * How a migration sequences the cutover against the byte move.
8273
8293
  *
8274
8294
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8290,6 +8310,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8290
8310
  /** Shared input for planning and starting an orchestrated storage migration. */
8291
8311
  var StorageMigrationInputSchema = object({
8292
8312
  destinations: StorageMigrationDestinationsSchema,
8313
+ /** Omitted = each class's current default. */
8314
+ sources: StorageMigrationSourcesSchema,
8293
8315
  throttleMbps: number().min(1).max(1e3).optional(),
8294
8316
  /** Omitted = `blocking`, which stays the default. */
8295
8317
  mode: StorageMigrationModeSchema.optional()
@@ -8369,6 +8391,13 @@ var StorageMigrationMoveSchema = object({
8369
8391
  storageClass: StorageMigrationClassSchema,
8370
8392
  fromLocationId: string(),
8371
8393
  toLocationId: string(),
8394
+ /**
8395
+ * True when `from` was NOT the class default at plan time. The move still
8396
+ * copies bytes, but the default is left alone and the source is disabled
8397
+ * once the copy verifies. Absent on jobs planned before this field existed
8398
+ * — those jobs always repointed, which is `false`.
8399
+ */
8400
+ freezeSource: boolean().optional(),
8372
8401
  moverJobId: string().nullable(),
8373
8402
  state: RelocateJobStateSchema.nullable(),
8374
8403
  error: string().nullable(),
@@ -8382,6 +8411,7 @@ var StorageMigrationJobSchema = object({
8382
8411
  * can tell a seconds-long cutover from a thirty-hour one. */
8383
8412
  mode: StorageMigrationModeSchema,
8384
8413
  destinations: StorageMigrationDestinationsSchema,
8414
+ sources: StorageMigrationSourcesSchema,
8385
8415
  throttleMbps: number(),
8386
8416
  moves: array(StorageMigrationMoveSchema),
8387
8417
  pauseLeaseId: string().nullable(),
@@ -8407,6 +8437,7 @@ var StorageMigrationFindingSchema = object({
8407
8437
  });
8408
8438
  var StorageMigrationPlanSchema = object({
8409
8439
  destinations: StorageMigrationDestinationsSchema,
8440
+ sources: StorageMigrationSourcesSchema,
8410
8441
  /** The mode this plan was built for. A plan is only valid for its mode: the
8411
8442
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8412
8443
  * it. */
@@ -8414,7 +8445,8 @@ var StorageMigrationPlanSchema = object({
8414
8445
  moves: array(object({
8415
8446
  storageClass: StorageMigrationClassSchema,
8416
8447
  fromLocationId: string(),
8417
- toLocationId: string()
8448
+ toLocationId: string(),
8449
+ freezeSource: boolean().optional()
8418
8450
  })),
8419
8451
  findings: array(StorageMigrationFindingSchema)
8420
8452
  });
@@ -8592,10 +8624,51 @@ var LedgerWalkReportSchema = object({
8592
8624
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
8593
8625
  var RelocatableMediaCountInputSchema = object({
8594
8626
  toLocationId: string().min(1),
8627
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
8628
+ fromLocationId: string().optional(),
8595
8629
  /** Omitted = `move`. */
8596
8630
  mode: MediaRelocateModeSchema.optional()
8597
8631
  });
8598
8632
  /**
8633
+ * Operator cleanup of leftover analytics rows, optional debug media, and
8634
+ * ghost ledger entries on frozen footage locations.
8635
+ *
8636
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
8637
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
8638
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
8639
+ * with no operator-visible status.
8640
+ */
8641
+ var StorageCleanupPhaseSchema = _enum([
8642
+ "orphans",
8643
+ "debug-media",
8644
+ "ghost-ledger",
8645
+ "done",
8646
+ "failed",
8647
+ "cancelled"
8648
+ ]);
8649
+ var StorageCleanupInputSchema = object({
8650
+ /** Also walk motion stills / track filmstrips. Off by default. */
8651
+ includeDebugMedia: boolean().optional() });
8652
+ var StorageCleanupJobSchema = object({
8653
+ jobId: string(),
8654
+ phase: StorageCleanupPhaseSchema,
8655
+ includeDebugMedia: boolean(),
8656
+ orphansReclaimed: number().int().nonnegative(),
8657
+ orphanBytesReclaimed: number().int().nonnegative(),
8658
+ debugMediaReclaimed: number().int().nonnegative(),
8659
+ debugMediaBytesReclaimed: number().int().nonnegative(),
8660
+ ghostsForgotten: number().int().nonnegative(),
8661
+ ghostBytesForgotten: number().int().nonnegative(),
8662
+ /** Short operator-facing line: current collection, pass, or location. */
8663
+ detail: string().nullable(),
8664
+ cancelRequested: boolean(),
8665
+ startedAt: number(),
8666
+ updatedAt: number(),
8667
+ finishedAt: number().nullable(),
8668
+ error: string().nullable()
8669
+ });
8670
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
8671
+ /**
8599
8672
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
8600
8673
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
8601
8674
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -8623,11 +8696,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
8623
8696
  * The default location for a type uses `id === <type>:default` by
8624
8697
  * convention (the bare type ref like `'backups'` resolves to it).
8625
8698
  *
8626
- * `isSystem: true` marks a location as orchestrator-seeded and
8627
- * undeletable. The bootstrap-installed defaults (one per type) carry
8628
- * this flag; operator-added locations don't. Editing the config of
8629
- * a system location is allowed (path migration, provider swap) but
8630
- * deleting it is rejected at the cap level.
8699
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
8700
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
8701
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
8702
+ * / last-enabled, not on this bit.
8631
8703
  */
8632
8704
  var StorageLocationSchema = object({
8633
8705
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -12930,6 +13002,12 @@ method(object({
12930
13002
  }), _void(), {
12931
13003
  kind: "mutation",
12932
13004
  auth: "admin"
13005
+ }), method(object({
13006
+ from: string(),
13007
+ to: string()
13008
+ }), object({ moved: number() }), {
13009
+ kind: "mutation",
13010
+ auth: "admin"
12933
13011
  }), method(object({
12934
13012
  deviceId: number(),
12935
13013
  disabled: boolean()
@@ -15656,6 +15734,8 @@ var NcSystemEventKindSchema = _enum([
15656
15734
  "device-offline",
15657
15735
  "device-disabled",
15658
15736
  "device-enabled",
15737
+ "device-battery-low",
15738
+ "device-battery-normal",
15659
15739
  "stream-online",
15660
15740
  "stream-offline",
15661
15741
  "node-online",
@@ -18874,46 +18954,6 @@ var RecentTracksPageSchema = object({
18874
18954
  /** Cursor for the next page, or null when this page is the last. */
18875
18955
  nextCursor: string().nullable()
18876
18956
  });
18877
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
18878
- var LIST_GROUPS_MAX_LIMIT = 100;
18879
- var AnalyticsGroupRecordSchema = object({
18880
- id: string(),
18881
- deviceId: number().int(),
18882
- openedAt: number().int(),
18883
- closedAt: number().int(),
18884
- timestamp: number().int(),
18885
- memberCount: number().int(),
18886
- memberTrackIds: array(string()).readonly(),
18887
- className: string(),
18888
- classes: array(string()).readonly(),
18889
- /** Relative event-media path, or null when the group has no picture yet. */
18890
- mediaUrl: string().nullable(),
18891
- singleton: boolean()
18892
- });
18893
- var AnalyticsGroupMemberSchema = object({
18894
- trackId: string(),
18895
- deviceId: number().int(),
18896
- className: string(),
18897
- firstSeen: number().int(),
18898
- lastSeen: number().int(),
18899
- mediaUrl: string().nullable()
18900
- });
18901
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
18902
- var ListGroupsQueryInput = object({
18903
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
18904
- deviceIds: array(number()),
18905
- /** Window lower bound on `closedAt` (inclusive). */
18906
- since: number().optional(),
18907
- /** Window upper bound on `openedAt` (inclusive). */
18908
- until: number().optional(),
18909
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
18910
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
18911
- cursor: string().optional()
18912
- });
18913
- var ListGroupsPageSchema = object({
18914
- groups: array(AnalyticsGroupRecordSchema).readonly(),
18915
- nextCursor: string().nullable()
18916
- });
18917
18957
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
18918
18958
  var KEY_EVENTS_MAX_LIMIT = 200;
18919
18959
  var KeyEventQueryInput = object({
@@ -19017,9 +19057,7 @@ var TrackCascadeCountsSchema = object({
19017
19057
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19018
19058
  plates: number().int(),
19019
19059
  /** Per-track CLIP search vectors removed (best-effort). */
19020
- embeddings: number().int(),
19021
- /** Group membership + group rows removed with their last member (best-effort). */
19022
- groups: number().int()
19060
+ embeddings: number().int()
19023
19061
  });
19024
19062
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19025
19063
  var DiskReconcileCountsSchema = object({
@@ -19189,6 +19227,47 @@ var RebuildStatusSchema = object({
19189
19227
  /** Present when the pass ended by throwing. */
19190
19228
  error: string().nullable()
19191
19229
  });
19230
+ /**
19231
+ * Acknowledgement that a debug-media reclaim STARTED.
19232
+ *
19233
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
19234
+ * it runs detached and this returns immediately. Awaiting it is how the
19235
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
19236
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
19237
+ */
19238
+ var MediaReclaimStartResultSchema = object({
19239
+ started: boolean(),
19240
+ /** True when a pass was already running; the new request is ignored. */
19241
+ alreadyRunning: boolean()
19242
+ });
19243
+ var MediaReclaimInputSchema = object({
19244
+ mode: _enum(["report", "reclaim"]).default("report"),
19245
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
19246
+ deviceIds: array(number().int()).min(1).optional(),
19247
+ restart: boolean().optional(),
19248
+ pageSize: number().int().min(50).max(5e3).optional(),
19249
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
19250
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
19251
+ maxBytesPerRun: number().int().min(1).optional(),
19252
+ budgetMinutes: number().int().min(1).max(720).optional(),
19253
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
19254
+ graceMinutes: number().int().min(1).max(10080).optional()
19255
+ });
19256
+ var MediaReclaimStatusSchema = object({
19257
+ running: boolean(),
19258
+ mode: _enum(["report", "reclaim"]).nullable(),
19259
+ totalExamined: number(),
19260
+ totalEligible: number(),
19261
+ totalReclaimed: number(),
19262
+ totalBytesReclaimed: number(),
19263
+ totalRefused: number(),
19264
+ /** Device+scope windows finished in this pass. */
19265
+ devicesDone: number(),
19266
+ complete: boolean().nullable(),
19267
+ startedAtMs: number().nullable(),
19268
+ finishedAtMs: number().nullable(),
19269
+ error: string().nullable()
19270
+ });
19192
19271
  var ReplayFrameInputSchema = object({
19193
19272
  timestamp: number(),
19194
19273
  frame: PipelineRunResultBridge
@@ -19227,10 +19306,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19227
19306
  * stationary registry). Default false: the timeline lists passages,
19228
19307
  * not parking records (operator decision, 2026-08-15). */
19229
19308
  includeStationary: boolean().optional()
19230
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19231
- deviceId: number(),
19232
- groupId: string().min(1)
19233
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19309
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19234
19310
  kind: "mutation",
19235
19311
  auth: "admin"
19236
19312
  }), 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({
@@ -19330,6 +19406,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19330
19406
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
19331
19407
  kind: "query",
19332
19408
  auth: "admin"
19409
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
19410
+ kind: "mutation",
19411
+ auth: "admin"
19412
+ }), method(object({}), MediaReclaimStatusSchema, {
19413
+ kind: "query",
19414
+ auth: "admin"
19333
19415
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
19334
19416
  kind: "query",
19335
19417
  auth: "admin"
@@ -21300,7 +21382,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21300
21382
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21301
21383
  kind: "mutation",
21302
21384
  auth: "admin"
21303
- });
21385
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21386
+ kind: "mutation",
21387
+ auth: "admin"
21388
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21389
+ kind: "mutation",
21390
+ auth: "admin"
21391
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21304
21392
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21305
21393
  providerId: string().min(1),
21306
21394
  displayName: string().min(1),
@@ -26678,6 +26766,33 @@ var RecordingRebalanceInputSchema = object({
26678
26766
  minMoveGb: number().min(0).optional()
26679
26767
  });
26680
26768
  /**
26769
+ * Operator-facing placement of one camera onto a recordings location.
26770
+ *
26771
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
26772
+ * Auto (the planner may move this camera). `locationId` is where high/mid
26773
+ * currently write — the plan, which may disagree with the pin when Auto.
26774
+ */
26775
+ var RecordingDevicePlacementSchema = object({
26776
+ deviceId: number().int(),
26777
+ profile: string(),
26778
+ locationId: string()
26779
+ });
26780
+ var RecordingDevicePinSchema = object({
26781
+ deviceId: number().int(),
26782
+ /** Recordings-class location this camera is pinned to. */
26783
+ locationId: string()
26784
+ });
26785
+ var RecordingPlacementViewSchema = object({
26786
+ assignments: array(RecordingDevicePlacementSchema),
26787
+ pins: array(RecordingDevicePinSchema),
26788
+ defaultLocations: record(string(), string())
26789
+ });
26790
+ var RecordingSetDevicePlacementInputSchema = object({
26791
+ deviceId: number().int(),
26792
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
26793
+ locationId: string().nullable()
26794
+ });
26795
+ /**
26681
26796
  * Result of locating footage at a wall-clock instant for one device/profile.
26682
26797
  * `segment` carries the covering segment's window; `gap` reports the forward
26683
26798
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -26903,6 +27018,12 @@ method(object({
26903
27018
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
26904
27019
  kind: "mutation",
26905
27020
  auth: "admin"
27021
+ }), method(object({}), RecordingPlacementViewSchema, {
27022
+ kind: "query",
27023
+ auth: "admin"
27024
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
27025
+ kind: "mutation",
27026
+ auth: "admin"
26906
27027
  });
26907
27028
  /**
26908
27029
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -30273,6 +30394,12 @@ Object.freeze({
30273
30394
  addonId: null,
30274
30395
  access: "delete"
30275
30396
  },
30397
+ "deviceManager.renameLocation": {
30398
+ capName: "device-manager",
30399
+ capScope: "system",
30400
+ addonId: null,
30401
+ access: "create"
30402
+ },
30276
30403
  "deviceManager.runDeviceAction": {
30277
30404
  capName: "device-manager",
30278
30405
  capScope: "system",
@@ -31965,19 +32092,19 @@ Object.freeze({
31965
32092
  addonId: null,
31966
32093
  access: "view"
31967
32094
  },
31968
- "pipelineAnalytics.getGroup": {
32095
+ "pipelineAnalytics.getKeyEvents": {
31969
32096
  capName: "pipeline-analytics",
31970
32097
  capScope: "device",
31971
32098
  addonId: null,
31972
32099
  access: "view"
31973
32100
  },
31974
- "pipelineAnalytics.getKeyEvents": {
32101
+ "pipelineAnalytics.getKeyEventsBatch": {
31975
32102
  capName: "pipeline-analytics",
31976
32103
  capScope: "device",
31977
32104
  addonId: null,
31978
32105
  access: "view"
31979
32106
  },
31980
- "pipelineAnalytics.getKeyEventsBatch": {
32107
+ "pipelineAnalytics.getMediaReclaimStatus": {
31981
32108
  capName: "pipeline-analytics",
31982
32109
  capScope: "device",
31983
32110
  addonId: null,
@@ -32067,12 +32194,6 @@ Object.freeze({
32067
32194
  addonId: null,
32068
32195
  access: "view"
32069
32196
  },
32070
- "pipelineAnalytics.listGroups": {
32071
- capName: "pipeline-analytics",
32072
- capScope: "device",
32073
- addonId: null,
32074
- access: "view"
32075
- },
32076
32197
  "pipelineAnalytics.listOpsLog": {
32077
32198
  capName: "pipeline-analytics",
32078
32199
  capScope: "device",
@@ -32157,6 +32278,12 @@ Object.freeze({
32157
32278
  addonId: null,
32158
32279
  access: "create"
32159
32280
  },
32281
+ "pipelineAnalytics.reclaimDebugMedia": {
32282
+ capName: "pipeline-analytics",
32283
+ capScope: "device",
32284
+ addonId: null,
32285
+ access: "create"
32286
+ },
32160
32287
  "pipelineAnalytics.reconcileFromDisk": {
32161
32288
  capName: "pipeline-analytics",
32162
32289
  capScope: "device",
@@ -33081,6 +33208,12 @@ Object.freeze({
33081
33208
  addonId: null,
33082
33209
  access: "view"
33083
33210
  },
33211
+ "recording.getPlacement": {
33212
+ capName: "recording",
33213
+ capScope: "system",
33214
+ addonId: null,
33215
+ access: "view"
33216
+ },
33084
33217
  "recording.getPlaybackManifest": {
33085
33218
  capName: "recording",
33086
33219
  capScope: "system",
@@ -33207,6 +33340,12 @@ Object.freeze({
33207
33340
  addonId: null,
33208
33341
  access: "create"
33209
33342
  },
33343
+ "recording.setDevicePlacement": {
33344
+ capName: "recording",
33345
+ capScope: "system",
33346
+ addonId: null,
33347
+ access: "create"
33348
+ },
33210
33349
  "recording.startStorageMigrationMove": {
33211
33350
  capName: "recording",
33212
33351
  capScope: "system",
@@ -33651,12 +33790,36 @@ Object.freeze({
33651
33790
  addonId: null,
33652
33791
  access: "create"
33653
33792
  },
33793
+ "storageMigration.cleanupCancel": {
33794
+ capName: "storage-migration",
33795
+ capScope: "system",
33796
+ addonId: null,
33797
+ access: "create"
33798
+ },
33799
+ "storageMigration.cleanupStart": {
33800
+ capName: "storage-migration",
33801
+ capScope: "system",
33802
+ addonId: null,
33803
+ access: "create"
33804
+ },
33805
+ "storageMigration.cleanupStatus": {
33806
+ capName: "storage-migration",
33807
+ capScope: "system",
33808
+ addonId: null,
33809
+ access: "view"
33810
+ },
33654
33811
  "storageMigration.drain": {
33655
33812
  capName: "storage-migration",
33656
33813
  capScope: "system",
33657
33814
  addonId: null,
33658
33815
  access: "create"
33659
33816
  },
33817
+ "storageMigration.history": {
33818
+ capName: "storage-migration",
33819
+ capScope: "system",
33820
+ addonId: null,
33821
+ access: "view"
33822
+ },
33660
33823
  "storageMigration.movers": {
33661
33824
  capName: "storage-migration",
33662
33825
  capScope: "system",
@@ -35653,11 +35816,6 @@ Object.freeze({
35653
35816
  form: "single",
35654
35817
  optional: true
35655
35818
  }],
35656
- "pipelineAnalytics.getGroup": [{
35657
- name: "deviceId",
35658
- form: "single",
35659
- optional: false
35660
- }],
35661
35819
  "pipelineAnalytics.getKeyEvents": [{
35662
35820
  name: "deviceId",
35663
35821
  form: "single",
@@ -35723,11 +35881,6 @@ Object.freeze({
35723
35881
  form: "single",
35724
35882
  optional: false
35725
35883
  }],
35726
- "pipelineAnalytics.listGroups": [{
35727
- name: "deviceIds",
35728
- form: "array",
35729
- optional: false
35730
- }],
35731
35884
  "pipelineAnalytics.listOpsLog": [{
35732
35885
  name: "deviceId",
35733
35886
  form: "single",
@@ -35773,6 +35926,11 @@ Object.freeze({
35773
35926
  form: "single",
35774
35927
  optional: true
35775
35928
  }],
35929
+ "pipelineAnalytics.reclaimDebugMedia": [{
35930
+ name: "deviceIds",
35931
+ form: "array",
35932
+ optional: true
35933
+ }],
35776
35934
  "pipelineAnalytics.reconcileFromDisk": [{
35777
35935
  name: "deviceId",
35778
35936
  form: "single",
@@ -36138,6 +36296,11 @@ Object.freeze({
36138
36296
  form: "single",
36139
36297
  optional: false
36140
36298
  }],
36299
+ "recording.setDevicePlacement": [{
36300
+ name: "deviceId",
36301
+ form: "single",
36302
+ optional: false
36303
+ }],
36141
36304
  "recording.startStorageMigrationMove": [{
36142
36305
  name: "deviceId",
36143
36306
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-notifiers",
3
- "version": "1.2.53",
3
+ "version": "1.2.55",
4
4
  "description": "System notifiers addon for CamStack — a `notification-output` collection provider hosting per-kind notifier adapters (ntfy, pushover, gotify, telegram, discord, webhook, zentik).",
5
5
  "keywords": [
6
6
  "camstack",