@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.
- package/dist/addon.js +236 -73
- package/dist/addon.mjs +236 -73
- 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
|
|
8654
|
-
*
|
|
8655
|
-
*
|
|
8656
|
-
*
|
|
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(
|
|
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.
|
|
32122
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
31996
32123
|
capName: "pipeline-analytics",
|
|
31997
32124
|
capScope: "device",
|
|
31998
32125
|
addonId: null,
|
|
31999
32126
|
access: "view"
|
|
32000
32127
|
},
|
|
32001
|
-
"pipelineAnalytics.
|
|
32128
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
32002
32129
|
capName: "pipeline-analytics",
|
|
32003
32130
|
capScope: "device",
|
|
32004
32131
|
addonId: null,
|
|
32005
32132
|
access: "view"
|
|
32006
32133
|
},
|
|
32007
|
-
"pipelineAnalytics.
|
|
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
|
|
8627
|
-
*
|
|
8628
|
-
*
|
|
8629
|
-
*
|
|
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(
|
|
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.
|
|
32095
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
31969
32096
|
capName: "pipeline-analytics",
|
|
31970
32097
|
capScope: "device",
|
|
31971
32098
|
addonId: null,
|
|
31972
32099
|
access: "view"
|
|
31973
32100
|
},
|
|
31974
|
-
"pipelineAnalytics.
|
|
32101
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
31975
32102
|
capName: "pipeline-analytics",
|
|
31976
32103
|
capScope: "device",
|
|
31977
32104
|
addonId: null,
|
|
31978
32105
|
access: "view"
|
|
31979
32106
|
},
|
|
31980
|
-
"pipelineAnalytics.
|
|
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.
|
|
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",
|