@camstack/addon-provider-reolink 1.2.72 → 1.2.74
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
|
@@ -8386,6 +8386,13 @@ var MediaRelocateModeSchema = _enum([
|
|
|
8386
8386
|
]);
|
|
8387
8387
|
var RelocateMediaInputSchema = object({
|
|
8388
8388
|
toLocationId: string(),
|
|
8389
|
+
/**
|
|
8390
|
+
* Restrict the pass to rows currently on this location. Omitted / `'*'` =
|
|
8391
|
+
* every row that is not already on `toLocationId` (the historical
|
|
8392
|
+
* behaviour). A named source is what a from→to migration needs: without it
|
|
8393
|
+
* "move events off disk 2" also emptied disk 1.
|
|
8394
|
+
*/
|
|
8395
|
+
fromLocationId: string().optional(),
|
|
8389
8396
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8390
8397
|
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8391
8398
|
mode: MediaRelocateModeSchema.optional()
|
|
@@ -8453,6 +8460,19 @@ var StorageMigrationDestinationsSchema = object({
|
|
|
8453
8460
|
galleryMedia: string().min(1).optional()
|
|
8454
8461
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8455
8462
|
/**
|
|
8463
|
+
* Optional named source per class. Omitted = the class's current default
|
|
8464
|
+
* (the historical behaviour). A named source that is NOT the default is a
|
|
8465
|
+
* drain of that disk: bytes move, the default stays, and the source is
|
|
8466
|
+
* disabled when the move finishes.
|
|
8467
|
+
*/
|
|
8468
|
+
var StorageMigrationSourcesSchema = object({
|
|
8469
|
+
recordings: string().min(1).optional(),
|
|
8470
|
+
recordingsLow: string().min(1).optional(),
|
|
8471
|
+
eventMedia: string().min(1).optional(),
|
|
8472
|
+
backups: string().min(1).optional(),
|
|
8473
|
+
galleryMedia: string().min(1).optional()
|
|
8474
|
+
}).optional();
|
|
8475
|
+
/**
|
|
8456
8476
|
* How a migration sequences the cutover against the byte move.
|
|
8457
8477
|
*
|
|
8458
8478
|
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
@@ -8474,6 +8494,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
|
8474
8494
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8475
8495
|
var StorageMigrationInputSchema = object({
|
|
8476
8496
|
destinations: StorageMigrationDestinationsSchema,
|
|
8497
|
+
/** Omitted = each class's current default. */
|
|
8498
|
+
sources: StorageMigrationSourcesSchema,
|
|
8477
8499
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8478
8500
|
/** Omitted = `blocking`, which stays the default. */
|
|
8479
8501
|
mode: StorageMigrationModeSchema.optional()
|
|
@@ -8553,6 +8575,13 @@ var StorageMigrationMoveSchema = object({
|
|
|
8553
8575
|
storageClass: StorageMigrationClassSchema,
|
|
8554
8576
|
fromLocationId: string(),
|
|
8555
8577
|
toLocationId: string(),
|
|
8578
|
+
/**
|
|
8579
|
+
* True when `from` was NOT the class default at plan time. The move still
|
|
8580
|
+
* copies bytes, but the default is left alone and the source is disabled
|
|
8581
|
+
* once the copy verifies. Absent on jobs planned before this field existed
|
|
8582
|
+
* — those jobs always repointed, which is `false`.
|
|
8583
|
+
*/
|
|
8584
|
+
freezeSource: boolean().optional(),
|
|
8556
8585
|
moverJobId: string().nullable(),
|
|
8557
8586
|
state: RelocateJobStateSchema.nullable(),
|
|
8558
8587
|
error: string().nullable(),
|
|
@@ -8566,6 +8595,7 @@ var StorageMigrationJobSchema = object({
|
|
|
8566
8595
|
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8567
8596
|
mode: StorageMigrationModeSchema,
|
|
8568
8597
|
destinations: StorageMigrationDestinationsSchema,
|
|
8598
|
+
sources: StorageMigrationSourcesSchema,
|
|
8569
8599
|
throttleMbps: number(),
|
|
8570
8600
|
moves: array(StorageMigrationMoveSchema),
|
|
8571
8601
|
pauseLeaseId: string().nullable(),
|
|
@@ -8591,6 +8621,7 @@ var StorageMigrationFindingSchema = object({
|
|
|
8591
8621
|
});
|
|
8592
8622
|
var StorageMigrationPlanSchema = object({
|
|
8593
8623
|
destinations: StorageMigrationDestinationsSchema,
|
|
8624
|
+
sources: StorageMigrationSourcesSchema,
|
|
8594
8625
|
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8595
8626
|
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8596
8627
|
* it. */
|
|
@@ -8598,7 +8629,8 @@ var StorageMigrationPlanSchema = object({
|
|
|
8598
8629
|
moves: array(object({
|
|
8599
8630
|
storageClass: StorageMigrationClassSchema,
|
|
8600
8631
|
fromLocationId: string(),
|
|
8601
|
-
toLocationId: string()
|
|
8632
|
+
toLocationId: string(),
|
|
8633
|
+
freezeSource: boolean().optional()
|
|
8602
8634
|
})),
|
|
8603
8635
|
findings: array(StorageMigrationFindingSchema)
|
|
8604
8636
|
});
|
|
@@ -8776,10 +8808,51 @@ var LedgerWalkReportSchema = object({
|
|
|
8776
8808
|
var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
|
|
8777
8809
|
var RelocatableMediaCountInputSchema = object({
|
|
8778
8810
|
toLocationId: string().min(1),
|
|
8811
|
+
/** Restrict the count to one source; omitted / `'*'` = every non-target row. */
|
|
8812
|
+
fromLocationId: string().optional(),
|
|
8779
8813
|
/** Omitted = `move`. */
|
|
8780
8814
|
mode: MediaRelocateModeSchema.optional()
|
|
8781
8815
|
});
|
|
8782
8816
|
/**
|
|
8817
|
+
* Operator cleanup of leftover analytics rows, optional debug media, and
|
|
8818
|
+
* ghost ledger entries on frozen footage locations.
|
|
8819
|
+
*
|
|
8820
|
+
* A pass is tens of minutes on a standing backlog. The hub method RETURNS
|
|
8821
|
+
* `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
|
|
8822
|
+
* is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
|
|
8823
|
+
* with no operator-visible status.
|
|
8824
|
+
*/
|
|
8825
|
+
var StorageCleanupPhaseSchema = _enum([
|
|
8826
|
+
"orphans",
|
|
8827
|
+
"debug-media",
|
|
8828
|
+
"ghost-ledger",
|
|
8829
|
+
"done",
|
|
8830
|
+
"failed",
|
|
8831
|
+
"cancelled"
|
|
8832
|
+
]);
|
|
8833
|
+
var StorageCleanupInputSchema = object({
|
|
8834
|
+
/** Also walk motion stills / track filmstrips. Off by default. */
|
|
8835
|
+
includeDebugMedia: boolean().optional() });
|
|
8836
|
+
var StorageCleanupJobSchema = object({
|
|
8837
|
+
jobId: string(),
|
|
8838
|
+
phase: StorageCleanupPhaseSchema,
|
|
8839
|
+
includeDebugMedia: boolean(),
|
|
8840
|
+
orphansReclaimed: number().int().nonnegative(),
|
|
8841
|
+
orphanBytesReclaimed: number().int().nonnegative(),
|
|
8842
|
+
debugMediaReclaimed: number().int().nonnegative(),
|
|
8843
|
+
debugMediaBytesReclaimed: number().int().nonnegative(),
|
|
8844
|
+
ghostsForgotten: number().int().nonnegative(),
|
|
8845
|
+
ghostBytesForgotten: number().int().nonnegative(),
|
|
8846
|
+
/** Short operator-facing line: current collection, pass, or location. */
|
|
8847
|
+
detail: string().nullable(),
|
|
8848
|
+
cancelRequested: boolean(),
|
|
8849
|
+
startedAt: number(),
|
|
8850
|
+
updatedAt: number(),
|
|
8851
|
+
finishedAt: number().nullable(),
|
|
8852
|
+
error: string().nullable()
|
|
8853
|
+
});
|
|
8854
|
+
var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
|
|
8855
|
+
/**
|
|
8783
8856
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
8784
8857
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
8785
8858
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -8807,11 +8880,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
|
|
|
8807
8880
|
* The default location for a type uses `id === <type>:default` by
|
|
8808
8881
|
* convention (the bare type ref like `'backups'` resolves to it).
|
|
8809
8882
|
*
|
|
8810
|
-
* `isSystem
|
|
8811
|
-
*
|
|
8812
|
-
*
|
|
8813
|
-
*
|
|
8814
|
-
* deleting it is rejected at the cap level.
|
|
8883
|
+
* `isSystem` is a legacy persisted flag. Seed still creates the initial
|
|
8884
|
+
* `<type>:default` locations; the flag is no longer a lock, a badge, or a
|
|
8885
|
+
* prune selector. New writes leave it false. Deletion is gated on uniqueness
|
|
8886
|
+
* / last-enabled, not on this bit.
|
|
8815
8887
|
*/
|
|
8816
8888
|
var StorageLocationSchema = object({
|
|
8817
8889
|
id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
|
|
@@ -13630,6 +13702,12 @@ method(object({
|
|
|
13630
13702
|
}), _void(), {
|
|
13631
13703
|
kind: "mutation",
|
|
13632
13704
|
auth: "admin"
|
|
13705
|
+
}), method(object({
|
|
13706
|
+
from: string(),
|
|
13707
|
+
to: string()
|
|
13708
|
+
}), object({ moved: number() }), {
|
|
13709
|
+
kind: "mutation",
|
|
13710
|
+
auth: "admin"
|
|
13633
13711
|
}), method(object({
|
|
13634
13712
|
deviceId: number(),
|
|
13635
13713
|
disabled: boolean()
|
|
@@ -16420,6 +16498,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
16420
16498
|
"device-offline",
|
|
16421
16499
|
"device-disabled",
|
|
16422
16500
|
"device-enabled",
|
|
16501
|
+
"device-battery-low",
|
|
16502
|
+
"device-battery-normal",
|
|
16423
16503
|
"stream-online",
|
|
16424
16504
|
"stream-offline",
|
|
16425
16505
|
"node-online",
|
|
@@ -19678,46 +19758,6 @@ var RecentTracksPageSchema = object({
|
|
|
19678
19758
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19679
19759
|
nextCursor: string().nullable()
|
|
19680
19760
|
});
|
|
19681
|
-
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
19682
|
-
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
19683
|
-
var AnalyticsGroupRecordSchema = object({
|
|
19684
|
-
id: string(),
|
|
19685
|
-
deviceId: number().int(),
|
|
19686
|
-
openedAt: number().int(),
|
|
19687
|
-
closedAt: number().int(),
|
|
19688
|
-
timestamp: number().int(),
|
|
19689
|
-
memberCount: number().int(),
|
|
19690
|
-
memberTrackIds: array(string()).readonly(),
|
|
19691
|
-
className: string(),
|
|
19692
|
-
classes: array(string()).readonly(),
|
|
19693
|
-
/** Relative event-media path, or null when the group has no picture yet. */
|
|
19694
|
-
mediaUrl: string().nullable(),
|
|
19695
|
-
singleton: boolean()
|
|
19696
|
-
});
|
|
19697
|
-
var AnalyticsGroupMemberSchema = object({
|
|
19698
|
-
trackId: string(),
|
|
19699
|
-
deviceId: number().int(),
|
|
19700
|
-
className: string(),
|
|
19701
|
-
firstSeen: number().int(),
|
|
19702
|
-
lastSeen: number().int(),
|
|
19703
|
-
mediaUrl: string().nullable()
|
|
19704
|
-
});
|
|
19705
|
-
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
19706
|
-
var ListGroupsQueryInput = object({
|
|
19707
|
-
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
19708
|
-
deviceIds: array(number()),
|
|
19709
|
-
/** Window lower bound on `closedAt` (inclusive). */
|
|
19710
|
-
since: number().optional(),
|
|
19711
|
-
/** Window upper bound on `openedAt` (inclusive). */
|
|
19712
|
-
until: number().optional(),
|
|
19713
|
-
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
19714
|
-
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
19715
|
-
cursor: string().optional()
|
|
19716
|
-
});
|
|
19717
|
-
var ListGroupsPageSchema = object({
|
|
19718
|
-
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
19719
|
-
nextCursor: string().nullable()
|
|
19720
|
-
});
|
|
19721
19761
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19722
19762
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19723
19763
|
var KeyEventQueryInput = object({
|
|
@@ -19821,9 +19861,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19821
19861
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19822
19862
|
plates: number().int(),
|
|
19823
19863
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
19824
|
-
embeddings: number().int()
|
|
19825
|
-
/** Group membership + group rows removed with their last member (best-effort). */
|
|
19826
|
-
groups: number().int()
|
|
19864
|
+
embeddings: number().int()
|
|
19827
19865
|
});
|
|
19828
19866
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19829
19867
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19993,6 +20031,47 @@ var RebuildStatusSchema = object({
|
|
|
19993
20031
|
/** Present when the pass ended by throwing. */
|
|
19994
20032
|
error: string().nullable()
|
|
19995
20033
|
});
|
|
20034
|
+
/**
|
|
20035
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
20036
|
+
*
|
|
20037
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
20038
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
20039
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
20040
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
20041
|
+
*/
|
|
20042
|
+
var MediaReclaimStartResultSchema = object({
|
|
20043
|
+
started: boolean(),
|
|
20044
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
20045
|
+
alreadyRunning: boolean()
|
|
20046
|
+
});
|
|
20047
|
+
var MediaReclaimInputSchema = object({
|
|
20048
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
20049
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
20050
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
20051
|
+
restart: boolean().optional(),
|
|
20052
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
20053
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
20054
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
20055
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
20056
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
20057
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
20058
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
20059
|
+
});
|
|
20060
|
+
var MediaReclaimStatusSchema = object({
|
|
20061
|
+
running: boolean(),
|
|
20062
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
20063
|
+
totalExamined: number(),
|
|
20064
|
+
totalEligible: number(),
|
|
20065
|
+
totalReclaimed: number(),
|
|
20066
|
+
totalBytesReclaimed: number(),
|
|
20067
|
+
totalRefused: number(),
|
|
20068
|
+
/** Device+scope windows finished in this pass. */
|
|
20069
|
+
devicesDone: number(),
|
|
20070
|
+
complete: boolean().nullable(),
|
|
20071
|
+
startedAtMs: number().nullable(),
|
|
20072
|
+
finishedAtMs: number().nullable(),
|
|
20073
|
+
error: string().nullable()
|
|
20074
|
+
});
|
|
19996
20075
|
var ReplayFrameInputSchema = object({
|
|
19997
20076
|
timestamp: number(),
|
|
19998
20077
|
frame: PipelineRunResultBridge
|
|
@@ -20031,10 +20110,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
20031
20110
|
* stationary registry). Default false: the timeline lists passages,
|
|
20032
20111
|
* not parking records (operator decision, 2026-08-15). */
|
|
20033
20112
|
includeStationary: boolean().optional()
|
|
20034
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
20035
|
-
deviceId: number(),
|
|
20036
|
-
groupId: string().min(1)
|
|
20037
|
-
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
20113
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
20038
20114
|
kind: "mutation",
|
|
20039
20115
|
auth: "admin"
|
|
20040
20116
|
}), 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({
|
|
@@ -20134,6 +20210,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
20134
20210
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
20135
20211
|
kind: "query",
|
|
20136
20212
|
auth: "admin"
|
|
20213
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
20214
|
+
kind: "mutation",
|
|
20215
|
+
auth: "admin"
|
|
20216
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
20217
|
+
kind: "query",
|
|
20218
|
+
auth: "admin"
|
|
20137
20219
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
20138
20220
|
kind: "query",
|
|
20139
20221
|
auth: "admin"
|
|
@@ -22208,7 +22290,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
22208
22290
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
22209
22291
|
kind: "mutation",
|
|
22210
22292
|
auth: "admin"
|
|
22211
|
-
})
|
|
22293
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
22294
|
+
kind: "mutation",
|
|
22295
|
+
auth: "admin"
|
|
22296
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
22297
|
+
kind: "mutation",
|
|
22298
|
+
auth: "admin"
|
|
22299
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
22212
22300
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
22213
22301
|
providerId: string().min(1),
|
|
22214
22302
|
displayName: string().min(1),
|
|
@@ -29388,6 +29476,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
29388
29476
|
minMoveGb: number().min(0).optional()
|
|
29389
29477
|
});
|
|
29390
29478
|
/**
|
|
29479
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
29480
|
+
*
|
|
29481
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
29482
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
29483
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
29484
|
+
*/
|
|
29485
|
+
var RecordingDevicePlacementSchema = object({
|
|
29486
|
+
deviceId: number().int(),
|
|
29487
|
+
profile: string(),
|
|
29488
|
+
locationId: string()
|
|
29489
|
+
});
|
|
29490
|
+
var RecordingDevicePinSchema = object({
|
|
29491
|
+
deviceId: number().int(),
|
|
29492
|
+
/** Recordings-class location this camera is pinned to. */
|
|
29493
|
+
locationId: string()
|
|
29494
|
+
});
|
|
29495
|
+
var RecordingPlacementViewSchema = object({
|
|
29496
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
29497
|
+
pins: array(RecordingDevicePinSchema),
|
|
29498
|
+
defaultLocations: record(string(), string())
|
|
29499
|
+
});
|
|
29500
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
29501
|
+
deviceId: number().int(),
|
|
29502
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
29503
|
+
locationId: string().nullable()
|
|
29504
|
+
});
|
|
29505
|
+
/**
|
|
29391
29506
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
29392
29507
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
29393
29508
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -29613,6 +29728,12 @@ method(object({
|
|
|
29613
29728
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
29614
29729
|
kind: "mutation",
|
|
29615
29730
|
auth: "admin"
|
|
29731
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
29732
|
+
kind: "query",
|
|
29733
|
+
auth: "admin"
|
|
29734
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
29735
|
+
kind: "mutation",
|
|
29736
|
+
auth: "admin"
|
|
29616
29737
|
});
|
|
29617
29738
|
/**
|
|
29618
29739
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -35047,6 +35168,12 @@ Object.freeze({
|
|
|
35047
35168
|
addonId: null,
|
|
35048
35169
|
access: "delete"
|
|
35049
35170
|
},
|
|
35171
|
+
"deviceManager.renameLocation": {
|
|
35172
|
+
capName: "device-manager",
|
|
35173
|
+
capScope: "system",
|
|
35174
|
+
addonId: null,
|
|
35175
|
+
access: "create"
|
|
35176
|
+
},
|
|
35050
35177
|
"deviceManager.runDeviceAction": {
|
|
35051
35178
|
capName: "device-manager",
|
|
35052
35179
|
capScope: "system",
|
|
@@ -36739,19 +36866,19 @@ Object.freeze({
|
|
|
36739
36866
|
addonId: null,
|
|
36740
36867
|
access: "view"
|
|
36741
36868
|
},
|
|
36742
|
-
"pipelineAnalytics.
|
|
36869
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
36743
36870
|
capName: "pipeline-analytics",
|
|
36744
36871
|
capScope: "device",
|
|
36745
36872
|
addonId: null,
|
|
36746
36873
|
access: "view"
|
|
36747
36874
|
},
|
|
36748
|
-
"pipelineAnalytics.
|
|
36875
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
36749
36876
|
capName: "pipeline-analytics",
|
|
36750
36877
|
capScope: "device",
|
|
36751
36878
|
addonId: null,
|
|
36752
36879
|
access: "view"
|
|
36753
36880
|
},
|
|
36754
|
-
"pipelineAnalytics.
|
|
36881
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
36755
36882
|
capName: "pipeline-analytics",
|
|
36756
36883
|
capScope: "device",
|
|
36757
36884
|
addonId: null,
|
|
@@ -36841,12 +36968,6 @@ Object.freeze({
|
|
|
36841
36968
|
addonId: null,
|
|
36842
36969
|
access: "view"
|
|
36843
36970
|
},
|
|
36844
|
-
"pipelineAnalytics.listGroups": {
|
|
36845
|
-
capName: "pipeline-analytics",
|
|
36846
|
-
capScope: "device",
|
|
36847
|
-
addonId: null,
|
|
36848
|
-
access: "view"
|
|
36849
|
-
},
|
|
36850
36971
|
"pipelineAnalytics.listOpsLog": {
|
|
36851
36972
|
capName: "pipeline-analytics",
|
|
36852
36973
|
capScope: "device",
|
|
@@ -36931,6 +37052,12 @@ Object.freeze({
|
|
|
36931
37052
|
addonId: null,
|
|
36932
37053
|
access: "create"
|
|
36933
37054
|
},
|
|
37055
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
37056
|
+
capName: "pipeline-analytics",
|
|
37057
|
+
capScope: "device",
|
|
37058
|
+
addonId: null,
|
|
37059
|
+
access: "create"
|
|
37060
|
+
},
|
|
36934
37061
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
36935
37062
|
capName: "pipeline-analytics",
|
|
36936
37063
|
capScope: "device",
|
|
@@ -37855,6 +37982,12 @@ Object.freeze({
|
|
|
37855
37982
|
addonId: null,
|
|
37856
37983
|
access: "view"
|
|
37857
37984
|
},
|
|
37985
|
+
"recording.getPlacement": {
|
|
37986
|
+
capName: "recording",
|
|
37987
|
+
capScope: "system",
|
|
37988
|
+
addonId: null,
|
|
37989
|
+
access: "view"
|
|
37990
|
+
},
|
|
37858
37991
|
"recording.getPlaybackManifest": {
|
|
37859
37992
|
capName: "recording",
|
|
37860
37993
|
capScope: "system",
|
|
@@ -37981,6 +38114,12 @@ Object.freeze({
|
|
|
37981
38114
|
addonId: null,
|
|
37982
38115
|
access: "create"
|
|
37983
38116
|
},
|
|
38117
|
+
"recording.setDevicePlacement": {
|
|
38118
|
+
capName: "recording",
|
|
38119
|
+
capScope: "system",
|
|
38120
|
+
addonId: null,
|
|
38121
|
+
access: "create"
|
|
38122
|
+
},
|
|
37984
38123
|
"recording.startStorageMigrationMove": {
|
|
37985
38124
|
capName: "recording",
|
|
37986
38125
|
capScope: "system",
|
|
@@ -38425,12 +38564,36 @@ Object.freeze({
|
|
|
38425
38564
|
addonId: null,
|
|
38426
38565
|
access: "create"
|
|
38427
38566
|
},
|
|
38567
|
+
"storageMigration.cleanupCancel": {
|
|
38568
|
+
capName: "storage-migration",
|
|
38569
|
+
capScope: "system",
|
|
38570
|
+
addonId: null,
|
|
38571
|
+
access: "create"
|
|
38572
|
+
},
|
|
38573
|
+
"storageMigration.cleanupStart": {
|
|
38574
|
+
capName: "storage-migration",
|
|
38575
|
+
capScope: "system",
|
|
38576
|
+
addonId: null,
|
|
38577
|
+
access: "create"
|
|
38578
|
+
},
|
|
38579
|
+
"storageMigration.cleanupStatus": {
|
|
38580
|
+
capName: "storage-migration",
|
|
38581
|
+
capScope: "system",
|
|
38582
|
+
addonId: null,
|
|
38583
|
+
access: "view"
|
|
38584
|
+
},
|
|
38428
38585
|
"storageMigration.drain": {
|
|
38429
38586
|
capName: "storage-migration",
|
|
38430
38587
|
capScope: "system",
|
|
38431
38588
|
addonId: null,
|
|
38432
38589
|
access: "create"
|
|
38433
38590
|
},
|
|
38591
|
+
"storageMigration.history": {
|
|
38592
|
+
capName: "storage-migration",
|
|
38593
|
+
capScope: "system",
|
|
38594
|
+
addonId: null,
|
|
38595
|
+
access: "view"
|
|
38596
|
+
},
|
|
38434
38597
|
"storageMigration.movers": {
|
|
38435
38598
|
capName: "storage-migration",
|
|
38436
38599
|
capScope: "system",
|
|
@@ -40427,11 +40590,6 @@ Object.freeze({
|
|
|
40427
40590
|
form: "single",
|
|
40428
40591
|
optional: true
|
|
40429
40592
|
}],
|
|
40430
|
-
"pipelineAnalytics.getGroup": [{
|
|
40431
|
-
name: "deviceId",
|
|
40432
|
-
form: "single",
|
|
40433
|
-
optional: false
|
|
40434
|
-
}],
|
|
40435
40593
|
"pipelineAnalytics.getKeyEvents": [{
|
|
40436
40594
|
name: "deviceId",
|
|
40437
40595
|
form: "single",
|
|
@@ -40497,11 +40655,6 @@ Object.freeze({
|
|
|
40497
40655
|
form: "single",
|
|
40498
40656
|
optional: false
|
|
40499
40657
|
}],
|
|
40500
|
-
"pipelineAnalytics.listGroups": [{
|
|
40501
|
-
name: "deviceIds",
|
|
40502
|
-
form: "array",
|
|
40503
|
-
optional: false
|
|
40504
|
-
}],
|
|
40505
40658
|
"pipelineAnalytics.listOpsLog": [{
|
|
40506
40659
|
name: "deviceId",
|
|
40507
40660
|
form: "single",
|
|
@@ -40547,6 +40700,11 @@ Object.freeze({
|
|
|
40547
40700
|
form: "single",
|
|
40548
40701
|
optional: true
|
|
40549
40702
|
}],
|
|
40703
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
40704
|
+
name: "deviceIds",
|
|
40705
|
+
form: "array",
|
|
40706
|
+
optional: true
|
|
40707
|
+
}],
|
|
40550
40708
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
40551
40709
|
name: "deviceId",
|
|
40552
40710
|
form: "single",
|
|
@@ -40912,6 +41070,11 @@ Object.freeze({
|
|
|
40912
41070
|
form: "single",
|
|
40913
41071
|
optional: false
|
|
40914
41072
|
}],
|
|
41073
|
+
"recording.setDevicePlacement": [{
|
|
41074
|
+
name: "deviceId",
|
|
41075
|
+
form: "single",
|
|
41076
|
+
optional: false
|
|
41077
|
+
}],
|
|
40915
41078
|
"recording.startStorageMigrationMove": [{
|
|
40916
41079
|
name: "deviceId",
|
|
40917
41080
|
form: "single",
|
package/dist/addon.mjs
CHANGED
|
@@ -8381,6 +8381,13 @@ var MediaRelocateModeSchema = _enum([
|
|
|
8381
8381
|
]);
|
|
8382
8382
|
var RelocateMediaInputSchema = object({
|
|
8383
8383
|
toLocationId: string(),
|
|
8384
|
+
/**
|
|
8385
|
+
* Restrict the pass to rows currently on this location. Omitted / `'*'` =
|
|
8386
|
+
* every row that is not already on `toLocationId` (the historical
|
|
8387
|
+
* behaviour). A named source is what a from→to migration needs: without it
|
|
8388
|
+
* "move events off disk 2" also emptied disk 1.
|
|
8389
|
+
*/
|
|
8390
|
+
fromLocationId: string().optional(),
|
|
8384
8391
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8385
8392
|
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8386
8393
|
mode: MediaRelocateModeSchema.optional()
|
|
@@ -8448,6 +8455,19 @@ var StorageMigrationDestinationsSchema = object({
|
|
|
8448
8455
|
galleryMedia: string().min(1).optional()
|
|
8449
8456
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8450
8457
|
/**
|
|
8458
|
+
* Optional named source per class. Omitted = the class's current default
|
|
8459
|
+
* (the historical behaviour). A named source that is NOT the default is a
|
|
8460
|
+
* drain of that disk: bytes move, the default stays, and the source is
|
|
8461
|
+
* disabled when the move finishes.
|
|
8462
|
+
*/
|
|
8463
|
+
var StorageMigrationSourcesSchema = object({
|
|
8464
|
+
recordings: string().min(1).optional(),
|
|
8465
|
+
recordingsLow: string().min(1).optional(),
|
|
8466
|
+
eventMedia: string().min(1).optional(),
|
|
8467
|
+
backups: string().min(1).optional(),
|
|
8468
|
+
galleryMedia: string().min(1).optional()
|
|
8469
|
+
}).optional();
|
|
8470
|
+
/**
|
|
8451
8471
|
* How a migration sequences the cutover against the byte move.
|
|
8452
8472
|
*
|
|
8453
8473
|
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
@@ -8469,6 +8489,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
|
8469
8489
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8470
8490
|
var StorageMigrationInputSchema = object({
|
|
8471
8491
|
destinations: StorageMigrationDestinationsSchema,
|
|
8492
|
+
/** Omitted = each class's current default. */
|
|
8493
|
+
sources: StorageMigrationSourcesSchema,
|
|
8472
8494
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8473
8495
|
/** Omitted = `blocking`, which stays the default. */
|
|
8474
8496
|
mode: StorageMigrationModeSchema.optional()
|
|
@@ -8548,6 +8570,13 @@ var StorageMigrationMoveSchema = object({
|
|
|
8548
8570
|
storageClass: StorageMigrationClassSchema,
|
|
8549
8571
|
fromLocationId: string(),
|
|
8550
8572
|
toLocationId: string(),
|
|
8573
|
+
/**
|
|
8574
|
+
* True when `from` was NOT the class default at plan time. The move still
|
|
8575
|
+
* copies bytes, but the default is left alone and the source is disabled
|
|
8576
|
+
* once the copy verifies. Absent on jobs planned before this field existed
|
|
8577
|
+
* — those jobs always repointed, which is `false`.
|
|
8578
|
+
*/
|
|
8579
|
+
freezeSource: boolean().optional(),
|
|
8551
8580
|
moverJobId: string().nullable(),
|
|
8552
8581
|
state: RelocateJobStateSchema.nullable(),
|
|
8553
8582
|
error: string().nullable(),
|
|
@@ -8561,6 +8590,7 @@ var StorageMigrationJobSchema = object({
|
|
|
8561
8590
|
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8562
8591
|
mode: StorageMigrationModeSchema,
|
|
8563
8592
|
destinations: StorageMigrationDestinationsSchema,
|
|
8593
|
+
sources: StorageMigrationSourcesSchema,
|
|
8564
8594
|
throttleMbps: number(),
|
|
8565
8595
|
moves: array(StorageMigrationMoveSchema),
|
|
8566
8596
|
pauseLeaseId: string().nullable(),
|
|
@@ -8586,6 +8616,7 @@ var StorageMigrationFindingSchema = object({
|
|
|
8586
8616
|
});
|
|
8587
8617
|
var StorageMigrationPlanSchema = object({
|
|
8588
8618
|
destinations: StorageMigrationDestinationsSchema,
|
|
8619
|
+
sources: StorageMigrationSourcesSchema,
|
|
8589
8620
|
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8590
8621
|
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8591
8622
|
* it. */
|
|
@@ -8593,7 +8624,8 @@ var StorageMigrationPlanSchema = object({
|
|
|
8593
8624
|
moves: array(object({
|
|
8594
8625
|
storageClass: StorageMigrationClassSchema,
|
|
8595
8626
|
fromLocationId: string(),
|
|
8596
|
-
toLocationId: string()
|
|
8627
|
+
toLocationId: string(),
|
|
8628
|
+
freezeSource: boolean().optional()
|
|
8597
8629
|
})),
|
|
8598
8630
|
findings: array(StorageMigrationFindingSchema)
|
|
8599
8631
|
});
|
|
@@ -8771,10 +8803,51 @@ var LedgerWalkReportSchema = object({
|
|
|
8771
8803
|
var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
|
|
8772
8804
|
var RelocatableMediaCountInputSchema = object({
|
|
8773
8805
|
toLocationId: string().min(1),
|
|
8806
|
+
/** Restrict the count to one source; omitted / `'*'` = every non-target row. */
|
|
8807
|
+
fromLocationId: string().optional(),
|
|
8774
8808
|
/** Omitted = `move`. */
|
|
8775
8809
|
mode: MediaRelocateModeSchema.optional()
|
|
8776
8810
|
});
|
|
8777
8811
|
/**
|
|
8812
|
+
* Operator cleanup of leftover analytics rows, optional debug media, and
|
|
8813
|
+
* ghost ledger entries on frozen footage locations.
|
|
8814
|
+
*
|
|
8815
|
+
* A pass is tens of minutes on a standing backlog. The hub method RETURNS
|
|
8816
|
+
* `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
|
|
8817
|
+
* is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
|
|
8818
|
+
* with no operator-visible status.
|
|
8819
|
+
*/
|
|
8820
|
+
var StorageCleanupPhaseSchema = _enum([
|
|
8821
|
+
"orphans",
|
|
8822
|
+
"debug-media",
|
|
8823
|
+
"ghost-ledger",
|
|
8824
|
+
"done",
|
|
8825
|
+
"failed",
|
|
8826
|
+
"cancelled"
|
|
8827
|
+
]);
|
|
8828
|
+
var StorageCleanupInputSchema = object({
|
|
8829
|
+
/** Also walk motion stills / track filmstrips. Off by default. */
|
|
8830
|
+
includeDebugMedia: boolean().optional() });
|
|
8831
|
+
var StorageCleanupJobSchema = object({
|
|
8832
|
+
jobId: string(),
|
|
8833
|
+
phase: StorageCleanupPhaseSchema,
|
|
8834
|
+
includeDebugMedia: boolean(),
|
|
8835
|
+
orphansReclaimed: number().int().nonnegative(),
|
|
8836
|
+
orphanBytesReclaimed: number().int().nonnegative(),
|
|
8837
|
+
debugMediaReclaimed: number().int().nonnegative(),
|
|
8838
|
+
debugMediaBytesReclaimed: number().int().nonnegative(),
|
|
8839
|
+
ghostsForgotten: number().int().nonnegative(),
|
|
8840
|
+
ghostBytesForgotten: number().int().nonnegative(),
|
|
8841
|
+
/** Short operator-facing line: current collection, pass, or location. */
|
|
8842
|
+
detail: string().nullable(),
|
|
8843
|
+
cancelRequested: boolean(),
|
|
8844
|
+
startedAt: number(),
|
|
8845
|
+
updatedAt: number(),
|
|
8846
|
+
finishedAt: number().nullable(),
|
|
8847
|
+
error: string().nullable()
|
|
8848
|
+
});
|
|
8849
|
+
var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
|
|
8850
|
+
/**
|
|
8778
8851
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
8779
8852
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
8780
8853
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -8802,11 +8875,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
|
|
|
8802
8875
|
* The default location for a type uses `id === <type>:default` by
|
|
8803
8876
|
* convention (the bare type ref like `'backups'` resolves to it).
|
|
8804
8877
|
*
|
|
8805
|
-
* `isSystem
|
|
8806
|
-
*
|
|
8807
|
-
*
|
|
8808
|
-
*
|
|
8809
|
-
* deleting it is rejected at the cap level.
|
|
8878
|
+
* `isSystem` is a legacy persisted flag. Seed still creates the initial
|
|
8879
|
+
* `<type>:default` locations; the flag is no longer a lock, a badge, or a
|
|
8880
|
+
* prune selector. New writes leave it false. Deletion is gated on uniqueness
|
|
8881
|
+
* / last-enabled, not on this bit.
|
|
8810
8882
|
*/
|
|
8811
8883
|
var StorageLocationSchema = object({
|
|
8812
8884
|
id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
|
|
@@ -13625,6 +13697,12 @@ method(object({
|
|
|
13625
13697
|
}), _void(), {
|
|
13626
13698
|
kind: "mutation",
|
|
13627
13699
|
auth: "admin"
|
|
13700
|
+
}), method(object({
|
|
13701
|
+
from: string(),
|
|
13702
|
+
to: string()
|
|
13703
|
+
}), object({ moved: number() }), {
|
|
13704
|
+
kind: "mutation",
|
|
13705
|
+
auth: "admin"
|
|
13628
13706
|
}), method(object({
|
|
13629
13707
|
deviceId: number(),
|
|
13630
13708
|
disabled: boolean()
|
|
@@ -16415,6 +16493,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
16415
16493
|
"device-offline",
|
|
16416
16494
|
"device-disabled",
|
|
16417
16495
|
"device-enabled",
|
|
16496
|
+
"device-battery-low",
|
|
16497
|
+
"device-battery-normal",
|
|
16418
16498
|
"stream-online",
|
|
16419
16499
|
"stream-offline",
|
|
16420
16500
|
"node-online",
|
|
@@ -19673,46 +19753,6 @@ var RecentTracksPageSchema = object({
|
|
|
19673
19753
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19674
19754
|
nextCursor: string().nullable()
|
|
19675
19755
|
});
|
|
19676
|
-
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
19677
|
-
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
19678
|
-
var AnalyticsGroupRecordSchema = object({
|
|
19679
|
-
id: string(),
|
|
19680
|
-
deviceId: number().int(),
|
|
19681
|
-
openedAt: number().int(),
|
|
19682
|
-
closedAt: number().int(),
|
|
19683
|
-
timestamp: number().int(),
|
|
19684
|
-
memberCount: number().int(),
|
|
19685
|
-
memberTrackIds: array(string()).readonly(),
|
|
19686
|
-
className: string(),
|
|
19687
|
-
classes: array(string()).readonly(),
|
|
19688
|
-
/** Relative event-media path, or null when the group has no picture yet. */
|
|
19689
|
-
mediaUrl: string().nullable(),
|
|
19690
|
-
singleton: boolean()
|
|
19691
|
-
});
|
|
19692
|
-
var AnalyticsGroupMemberSchema = object({
|
|
19693
|
-
trackId: string(),
|
|
19694
|
-
deviceId: number().int(),
|
|
19695
|
-
className: string(),
|
|
19696
|
-
firstSeen: number().int(),
|
|
19697
|
-
lastSeen: number().int(),
|
|
19698
|
-
mediaUrl: string().nullable()
|
|
19699
|
-
});
|
|
19700
|
-
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
19701
|
-
var ListGroupsQueryInput = object({
|
|
19702
|
-
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
19703
|
-
deviceIds: array(number()),
|
|
19704
|
-
/** Window lower bound on `closedAt` (inclusive). */
|
|
19705
|
-
since: number().optional(),
|
|
19706
|
-
/** Window upper bound on `openedAt` (inclusive). */
|
|
19707
|
-
until: number().optional(),
|
|
19708
|
-
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
19709
|
-
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
19710
|
-
cursor: string().optional()
|
|
19711
|
-
});
|
|
19712
|
-
var ListGroupsPageSchema = object({
|
|
19713
|
-
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
19714
|
-
nextCursor: string().nullable()
|
|
19715
|
-
});
|
|
19716
19756
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19717
19757
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19718
19758
|
var KeyEventQueryInput = object({
|
|
@@ -19816,9 +19856,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19816
19856
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19817
19857
|
plates: number().int(),
|
|
19818
19858
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
19819
|
-
embeddings: number().int()
|
|
19820
|
-
/** Group membership + group rows removed with their last member (best-effort). */
|
|
19821
|
-
groups: number().int()
|
|
19859
|
+
embeddings: number().int()
|
|
19822
19860
|
});
|
|
19823
19861
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19824
19862
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19988,6 +20026,47 @@ var RebuildStatusSchema = object({
|
|
|
19988
20026
|
/** Present when the pass ended by throwing. */
|
|
19989
20027
|
error: string().nullable()
|
|
19990
20028
|
});
|
|
20029
|
+
/**
|
|
20030
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
20031
|
+
*
|
|
20032
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
20033
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
20034
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
20035
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
20036
|
+
*/
|
|
20037
|
+
var MediaReclaimStartResultSchema = object({
|
|
20038
|
+
started: boolean(),
|
|
20039
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
20040
|
+
alreadyRunning: boolean()
|
|
20041
|
+
});
|
|
20042
|
+
var MediaReclaimInputSchema = object({
|
|
20043
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
20044
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
20045
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
20046
|
+
restart: boolean().optional(),
|
|
20047
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
20048
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
20049
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
20050
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
20051
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
20052
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
20053
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
20054
|
+
});
|
|
20055
|
+
var MediaReclaimStatusSchema = object({
|
|
20056
|
+
running: boolean(),
|
|
20057
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
20058
|
+
totalExamined: number(),
|
|
20059
|
+
totalEligible: number(),
|
|
20060
|
+
totalReclaimed: number(),
|
|
20061
|
+
totalBytesReclaimed: number(),
|
|
20062
|
+
totalRefused: number(),
|
|
20063
|
+
/** Device+scope windows finished in this pass. */
|
|
20064
|
+
devicesDone: number(),
|
|
20065
|
+
complete: boolean().nullable(),
|
|
20066
|
+
startedAtMs: number().nullable(),
|
|
20067
|
+
finishedAtMs: number().nullable(),
|
|
20068
|
+
error: string().nullable()
|
|
20069
|
+
});
|
|
19991
20070
|
var ReplayFrameInputSchema = object({
|
|
19992
20071
|
timestamp: number(),
|
|
19993
20072
|
frame: PipelineRunResultBridge
|
|
@@ -20026,10 +20105,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
20026
20105
|
* stationary registry). Default false: the timeline lists passages,
|
|
20027
20106
|
* not parking records (operator decision, 2026-08-15). */
|
|
20028
20107
|
includeStationary: boolean().optional()
|
|
20029
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
20030
|
-
deviceId: number(),
|
|
20031
|
-
groupId: string().min(1)
|
|
20032
|
-
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
20108
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
20033
20109
|
kind: "mutation",
|
|
20034
20110
|
auth: "admin"
|
|
20035
20111
|
}), 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({
|
|
@@ -20129,6 +20205,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
20129
20205
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
20130
20206
|
kind: "query",
|
|
20131
20207
|
auth: "admin"
|
|
20208
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
20209
|
+
kind: "mutation",
|
|
20210
|
+
auth: "admin"
|
|
20211
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
20212
|
+
kind: "query",
|
|
20213
|
+
auth: "admin"
|
|
20132
20214
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
20133
20215
|
kind: "query",
|
|
20134
20216
|
auth: "admin"
|
|
@@ -22203,7 +22285,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
22203
22285
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
22204
22286
|
kind: "mutation",
|
|
22205
22287
|
auth: "admin"
|
|
22206
|
-
})
|
|
22288
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
22289
|
+
kind: "mutation",
|
|
22290
|
+
auth: "admin"
|
|
22291
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
22292
|
+
kind: "mutation",
|
|
22293
|
+
auth: "admin"
|
|
22294
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
22207
22295
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
22208
22296
|
providerId: string().min(1),
|
|
22209
22297
|
displayName: string().min(1),
|
|
@@ -29383,6 +29471,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
29383
29471
|
minMoveGb: number().min(0).optional()
|
|
29384
29472
|
});
|
|
29385
29473
|
/**
|
|
29474
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
29475
|
+
*
|
|
29476
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
29477
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
29478
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
29479
|
+
*/
|
|
29480
|
+
var RecordingDevicePlacementSchema = object({
|
|
29481
|
+
deviceId: number().int(),
|
|
29482
|
+
profile: string(),
|
|
29483
|
+
locationId: string()
|
|
29484
|
+
});
|
|
29485
|
+
var RecordingDevicePinSchema = object({
|
|
29486
|
+
deviceId: number().int(),
|
|
29487
|
+
/** Recordings-class location this camera is pinned to. */
|
|
29488
|
+
locationId: string()
|
|
29489
|
+
});
|
|
29490
|
+
var RecordingPlacementViewSchema = object({
|
|
29491
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
29492
|
+
pins: array(RecordingDevicePinSchema),
|
|
29493
|
+
defaultLocations: record(string(), string())
|
|
29494
|
+
});
|
|
29495
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
29496
|
+
deviceId: number().int(),
|
|
29497
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
29498
|
+
locationId: string().nullable()
|
|
29499
|
+
});
|
|
29500
|
+
/**
|
|
29386
29501
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
29387
29502
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
29388
29503
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -29608,6 +29723,12 @@ method(object({
|
|
|
29608
29723
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
29609
29724
|
kind: "mutation",
|
|
29610
29725
|
auth: "admin"
|
|
29726
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
29727
|
+
kind: "query",
|
|
29728
|
+
auth: "admin"
|
|
29729
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
29730
|
+
kind: "mutation",
|
|
29731
|
+
auth: "admin"
|
|
29611
29732
|
});
|
|
29612
29733
|
/**
|
|
29613
29734
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -35042,6 +35163,12 @@ Object.freeze({
|
|
|
35042
35163
|
addonId: null,
|
|
35043
35164
|
access: "delete"
|
|
35044
35165
|
},
|
|
35166
|
+
"deviceManager.renameLocation": {
|
|
35167
|
+
capName: "device-manager",
|
|
35168
|
+
capScope: "system",
|
|
35169
|
+
addonId: null,
|
|
35170
|
+
access: "create"
|
|
35171
|
+
},
|
|
35045
35172
|
"deviceManager.runDeviceAction": {
|
|
35046
35173
|
capName: "device-manager",
|
|
35047
35174
|
capScope: "system",
|
|
@@ -36734,19 +36861,19 @@ Object.freeze({
|
|
|
36734
36861
|
addonId: null,
|
|
36735
36862
|
access: "view"
|
|
36736
36863
|
},
|
|
36737
|
-
"pipelineAnalytics.
|
|
36864
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
36738
36865
|
capName: "pipeline-analytics",
|
|
36739
36866
|
capScope: "device",
|
|
36740
36867
|
addonId: null,
|
|
36741
36868
|
access: "view"
|
|
36742
36869
|
},
|
|
36743
|
-
"pipelineAnalytics.
|
|
36870
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
36744
36871
|
capName: "pipeline-analytics",
|
|
36745
36872
|
capScope: "device",
|
|
36746
36873
|
addonId: null,
|
|
36747
36874
|
access: "view"
|
|
36748
36875
|
},
|
|
36749
|
-
"pipelineAnalytics.
|
|
36876
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
36750
36877
|
capName: "pipeline-analytics",
|
|
36751
36878
|
capScope: "device",
|
|
36752
36879
|
addonId: null,
|
|
@@ -36836,12 +36963,6 @@ Object.freeze({
|
|
|
36836
36963
|
addonId: null,
|
|
36837
36964
|
access: "view"
|
|
36838
36965
|
},
|
|
36839
|
-
"pipelineAnalytics.listGroups": {
|
|
36840
|
-
capName: "pipeline-analytics",
|
|
36841
|
-
capScope: "device",
|
|
36842
|
-
addonId: null,
|
|
36843
|
-
access: "view"
|
|
36844
|
-
},
|
|
36845
36966
|
"pipelineAnalytics.listOpsLog": {
|
|
36846
36967
|
capName: "pipeline-analytics",
|
|
36847
36968
|
capScope: "device",
|
|
@@ -36926,6 +37047,12 @@ Object.freeze({
|
|
|
36926
37047
|
addonId: null,
|
|
36927
37048
|
access: "create"
|
|
36928
37049
|
},
|
|
37050
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
37051
|
+
capName: "pipeline-analytics",
|
|
37052
|
+
capScope: "device",
|
|
37053
|
+
addonId: null,
|
|
37054
|
+
access: "create"
|
|
37055
|
+
},
|
|
36929
37056
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
36930
37057
|
capName: "pipeline-analytics",
|
|
36931
37058
|
capScope: "device",
|
|
@@ -37850,6 +37977,12 @@ Object.freeze({
|
|
|
37850
37977
|
addonId: null,
|
|
37851
37978
|
access: "view"
|
|
37852
37979
|
},
|
|
37980
|
+
"recording.getPlacement": {
|
|
37981
|
+
capName: "recording",
|
|
37982
|
+
capScope: "system",
|
|
37983
|
+
addonId: null,
|
|
37984
|
+
access: "view"
|
|
37985
|
+
},
|
|
37853
37986
|
"recording.getPlaybackManifest": {
|
|
37854
37987
|
capName: "recording",
|
|
37855
37988
|
capScope: "system",
|
|
@@ -37976,6 +38109,12 @@ Object.freeze({
|
|
|
37976
38109
|
addonId: null,
|
|
37977
38110
|
access: "create"
|
|
37978
38111
|
},
|
|
38112
|
+
"recording.setDevicePlacement": {
|
|
38113
|
+
capName: "recording",
|
|
38114
|
+
capScope: "system",
|
|
38115
|
+
addonId: null,
|
|
38116
|
+
access: "create"
|
|
38117
|
+
},
|
|
37979
38118
|
"recording.startStorageMigrationMove": {
|
|
37980
38119
|
capName: "recording",
|
|
37981
38120
|
capScope: "system",
|
|
@@ -38420,12 +38559,36 @@ Object.freeze({
|
|
|
38420
38559
|
addonId: null,
|
|
38421
38560
|
access: "create"
|
|
38422
38561
|
},
|
|
38562
|
+
"storageMigration.cleanupCancel": {
|
|
38563
|
+
capName: "storage-migration",
|
|
38564
|
+
capScope: "system",
|
|
38565
|
+
addonId: null,
|
|
38566
|
+
access: "create"
|
|
38567
|
+
},
|
|
38568
|
+
"storageMigration.cleanupStart": {
|
|
38569
|
+
capName: "storage-migration",
|
|
38570
|
+
capScope: "system",
|
|
38571
|
+
addonId: null,
|
|
38572
|
+
access: "create"
|
|
38573
|
+
},
|
|
38574
|
+
"storageMigration.cleanupStatus": {
|
|
38575
|
+
capName: "storage-migration",
|
|
38576
|
+
capScope: "system",
|
|
38577
|
+
addonId: null,
|
|
38578
|
+
access: "view"
|
|
38579
|
+
},
|
|
38423
38580
|
"storageMigration.drain": {
|
|
38424
38581
|
capName: "storage-migration",
|
|
38425
38582
|
capScope: "system",
|
|
38426
38583
|
addonId: null,
|
|
38427
38584
|
access: "create"
|
|
38428
38585
|
},
|
|
38586
|
+
"storageMigration.history": {
|
|
38587
|
+
capName: "storage-migration",
|
|
38588
|
+
capScope: "system",
|
|
38589
|
+
addonId: null,
|
|
38590
|
+
access: "view"
|
|
38591
|
+
},
|
|
38429
38592
|
"storageMigration.movers": {
|
|
38430
38593
|
capName: "storage-migration",
|
|
38431
38594
|
capScope: "system",
|
|
@@ -40422,11 +40585,6 @@ Object.freeze({
|
|
|
40422
40585
|
form: "single",
|
|
40423
40586
|
optional: true
|
|
40424
40587
|
}],
|
|
40425
|
-
"pipelineAnalytics.getGroup": [{
|
|
40426
|
-
name: "deviceId",
|
|
40427
|
-
form: "single",
|
|
40428
|
-
optional: false
|
|
40429
|
-
}],
|
|
40430
40588
|
"pipelineAnalytics.getKeyEvents": [{
|
|
40431
40589
|
name: "deviceId",
|
|
40432
40590
|
form: "single",
|
|
@@ -40492,11 +40650,6 @@ Object.freeze({
|
|
|
40492
40650
|
form: "single",
|
|
40493
40651
|
optional: false
|
|
40494
40652
|
}],
|
|
40495
|
-
"pipelineAnalytics.listGroups": [{
|
|
40496
|
-
name: "deviceIds",
|
|
40497
|
-
form: "array",
|
|
40498
|
-
optional: false
|
|
40499
|
-
}],
|
|
40500
40653
|
"pipelineAnalytics.listOpsLog": [{
|
|
40501
40654
|
name: "deviceId",
|
|
40502
40655
|
form: "single",
|
|
@@ -40542,6 +40695,11 @@ Object.freeze({
|
|
|
40542
40695
|
form: "single",
|
|
40543
40696
|
optional: true
|
|
40544
40697
|
}],
|
|
40698
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
40699
|
+
name: "deviceIds",
|
|
40700
|
+
form: "array",
|
|
40701
|
+
optional: true
|
|
40702
|
+
}],
|
|
40545
40703
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
40546
40704
|
name: "deviceId",
|
|
40547
40705
|
form: "single",
|
|
@@ -40907,6 +41065,11 @@ Object.freeze({
|
|
|
40907
41065
|
form: "single",
|
|
40908
41066
|
optional: false
|
|
40909
41067
|
}],
|
|
41068
|
+
"recording.setDevicePlacement": [{
|
|
41069
|
+
name: "deviceId",
|
|
41070
|
+
form: "single",
|
|
41071
|
+
optional: false
|
|
41072
|
+
}],
|
|
40910
41073
|
"recording.startStorageMigrationMove": [{
|
|
40911
41074
|
name: "deviceId",
|
|
40912
41075
|
form: "single",
|