@camstack/addon-provider-reolink 1.2.72 → 1.2.73
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 +234 -73
- package/dist/addon.mjs +234 -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()
|
|
@@ -19678,46 +19756,6 @@ var RecentTracksPageSchema = object({
|
|
|
19678
19756
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19679
19757
|
nextCursor: string().nullable()
|
|
19680
19758
|
});
|
|
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
19759
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19722
19760
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19723
19761
|
var KeyEventQueryInput = object({
|
|
@@ -19821,9 +19859,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19821
19859
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19822
19860
|
plates: number().int(),
|
|
19823
19861
|
/** 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()
|
|
19862
|
+
embeddings: number().int()
|
|
19827
19863
|
});
|
|
19828
19864
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19829
19865
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19993,6 +20029,47 @@ var RebuildStatusSchema = object({
|
|
|
19993
20029
|
/** Present when the pass ended by throwing. */
|
|
19994
20030
|
error: string().nullable()
|
|
19995
20031
|
});
|
|
20032
|
+
/**
|
|
20033
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
20034
|
+
*
|
|
20035
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
20036
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
20037
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
20038
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
20039
|
+
*/
|
|
20040
|
+
var MediaReclaimStartResultSchema = object({
|
|
20041
|
+
started: boolean(),
|
|
20042
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
20043
|
+
alreadyRunning: boolean()
|
|
20044
|
+
});
|
|
20045
|
+
var MediaReclaimInputSchema = object({
|
|
20046
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
20047
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
20048
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
20049
|
+
restart: boolean().optional(),
|
|
20050
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
20051
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
20052
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
20053
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
20054
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
20055
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
20056
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
20057
|
+
});
|
|
20058
|
+
var MediaReclaimStatusSchema = object({
|
|
20059
|
+
running: boolean(),
|
|
20060
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
20061
|
+
totalExamined: number(),
|
|
20062
|
+
totalEligible: number(),
|
|
20063
|
+
totalReclaimed: number(),
|
|
20064
|
+
totalBytesReclaimed: number(),
|
|
20065
|
+
totalRefused: number(),
|
|
20066
|
+
/** Device+scope windows finished in this pass. */
|
|
20067
|
+
devicesDone: number(),
|
|
20068
|
+
complete: boolean().nullable(),
|
|
20069
|
+
startedAtMs: number().nullable(),
|
|
20070
|
+
finishedAtMs: number().nullable(),
|
|
20071
|
+
error: string().nullable()
|
|
20072
|
+
});
|
|
19996
20073
|
var ReplayFrameInputSchema = object({
|
|
19997
20074
|
timestamp: number(),
|
|
19998
20075
|
frame: PipelineRunResultBridge
|
|
@@ -20031,10 +20108,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
20031
20108
|
* stationary registry). Default false: the timeline lists passages,
|
|
20032
20109
|
* not parking records (operator decision, 2026-08-15). */
|
|
20033
20110
|
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(), {
|
|
20111
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
20038
20112
|
kind: "mutation",
|
|
20039
20113
|
auth: "admin"
|
|
20040
20114
|
}), 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 +20208,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
20134
20208
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
20135
20209
|
kind: "query",
|
|
20136
20210
|
auth: "admin"
|
|
20211
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
20212
|
+
kind: "mutation",
|
|
20213
|
+
auth: "admin"
|
|
20214
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
20215
|
+
kind: "query",
|
|
20216
|
+
auth: "admin"
|
|
20137
20217
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
20138
20218
|
kind: "query",
|
|
20139
20219
|
auth: "admin"
|
|
@@ -22208,7 +22288,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
22208
22288
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
22209
22289
|
kind: "mutation",
|
|
22210
22290
|
auth: "admin"
|
|
22211
|
-
})
|
|
22291
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
22292
|
+
kind: "mutation",
|
|
22293
|
+
auth: "admin"
|
|
22294
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
22295
|
+
kind: "mutation",
|
|
22296
|
+
auth: "admin"
|
|
22297
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
22212
22298
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
22213
22299
|
providerId: string().min(1),
|
|
22214
22300
|
displayName: string().min(1),
|
|
@@ -29388,6 +29474,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
29388
29474
|
minMoveGb: number().min(0).optional()
|
|
29389
29475
|
});
|
|
29390
29476
|
/**
|
|
29477
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
29478
|
+
*
|
|
29479
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
29480
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
29481
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
29482
|
+
*/
|
|
29483
|
+
var RecordingDevicePlacementSchema = object({
|
|
29484
|
+
deviceId: number().int(),
|
|
29485
|
+
profile: string(),
|
|
29486
|
+
locationId: string()
|
|
29487
|
+
});
|
|
29488
|
+
var RecordingDevicePinSchema = object({
|
|
29489
|
+
deviceId: number().int(),
|
|
29490
|
+
/** Recordings-class location this camera is pinned to. */
|
|
29491
|
+
locationId: string()
|
|
29492
|
+
});
|
|
29493
|
+
var RecordingPlacementViewSchema = object({
|
|
29494
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
29495
|
+
pins: array(RecordingDevicePinSchema),
|
|
29496
|
+
defaultLocations: record(string(), string())
|
|
29497
|
+
});
|
|
29498
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
29499
|
+
deviceId: number().int(),
|
|
29500
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
29501
|
+
locationId: string().nullable()
|
|
29502
|
+
});
|
|
29503
|
+
/**
|
|
29391
29504
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
29392
29505
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
29393
29506
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -29613,6 +29726,12 @@ method(object({
|
|
|
29613
29726
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
29614
29727
|
kind: "mutation",
|
|
29615
29728
|
auth: "admin"
|
|
29729
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
29730
|
+
kind: "query",
|
|
29731
|
+
auth: "admin"
|
|
29732
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
29733
|
+
kind: "mutation",
|
|
29734
|
+
auth: "admin"
|
|
29616
29735
|
});
|
|
29617
29736
|
/**
|
|
29618
29737
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -35047,6 +35166,12 @@ Object.freeze({
|
|
|
35047
35166
|
addonId: null,
|
|
35048
35167
|
access: "delete"
|
|
35049
35168
|
},
|
|
35169
|
+
"deviceManager.renameLocation": {
|
|
35170
|
+
capName: "device-manager",
|
|
35171
|
+
capScope: "system",
|
|
35172
|
+
addonId: null,
|
|
35173
|
+
access: "create"
|
|
35174
|
+
},
|
|
35050
35175
|
"deviceManager.runDeviceAction": {
|
|
35051
35176
|
capName: "device-manager",
|
|
35052
35177
|
capScope: "system",
|
|
@@ -36739,19 +36864,19 @@ Object.freeze({
|
|
|
36739
36864
|
addonId: null,
|
|
36740
36865
|
access: "view"
|
|
36741
36866
|
},
|
|
36742
|
-
"pipelineAnalytics.
|
|
36867
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
36743
36868
|
capName: "pipeline-analytics",
|
|
36744
36869
|
capScope: "device",
|
|
36745
36870
|
addonId: null,
|
|
36746
36871
|
access: "view"
|
|
36747
36872
|
},
|
|
36748
|
-
"pipelineAnalytics.
|
|
36873
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
36749
36874
|
capName: "pipeline-analytics",
|
|
36750
36875
|
capScope: "device",
|
|
36751
36876
|
addonId: null,
|
|
36752
36877
|
access: "view"
|
|
36753
36878
|
},
|
|
36754
|
-
"pipelineAnalytics.
|
|
36879
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
36755
36880
|
capName: "pipeline-analytics",
|
|
36756
36881
|
capScope: "device",
|
|
36757
36882
|
addonId: null,
|
|
@@ -36841,12 +36966,6 @@ Object.freeze({
|
|
|
36841
36966
|
addonId: null,
|
|
36842
36967
|
access: "view"
|
|
36843
36968
|
},
|
|
36844
|
-
"pipelineAnalytics.listGroups": {
|
|
36845
|
-
capName: "pipeline-analytics",
|
|
36846
|
-
capScope: "device",
|
|
36847
|
-
addonId: null,
|
|
36848
|
-
access: "view"
|
|
36849
|
-
},
|
|
36850
36969
|
"pipelineAnalytics.listOpsLog": {
|
|
36851
36970
|
capName: "pipeline-analytics",
|
|
36852
36971
|
capScope: "device",
|
|
@@ -36931,6 +37050,12 @@ Object.freeze({
|
|
|
36931
37050
|
addonId: null,
|
|
36932
37051
|
access: "create"
|
|
36933
37052
|
},
|
|
37053
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
37054
|
+
capName: "pipeline-analytics",
|
|
37055
|
+
capScope: "device",
|
|
37056
|
+
addonId: null,
|
|
37057
|
+
access: "create"
|
|
37058
|
+
},
|
|
36934
37059
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
36935
37060
|
capName: "pipeline-analytics",
|
|
36936
37061
|
capScope: "device",
|
|
@@ -37855,6 +37980,12 @@ Object.freeze({
|
|
|
37855
37980
|
addonId: null,
|
|
37856
37981
|
access: "view"
|
|
37857
37982
|
},
|
|
37983
|
+
"recording.getPlacement": {
|
|
37984
|
+
capName: "recording",
|
|
37985
|
+
capScope: "system",
|
|
37986
|
+
addonId: null,
|
|
37987
|
+
access: "view"
|
|
37988
|
+
},
|
|
37858
37989
|
"recording.getPlaybackManifest": {
|
|
37859
37990
|
capName: "recording",
|
|
37860
37991
|
capScope: "system",
|
|
@@ -37981,6 +38112,12 @@ Object.freeze({
|
|
|
37981
38112
|
addonId: null,
|
|
37982
38113
|
access: "create"
|
|
37983
38114
|
},
|
|
38115
|
+
"recording.setDevicePlacement": {
|
|
38116
|
+
capName: "recording",
|
|
38117
|
+
capScope: "system",
|
|
38118
|
+
addonId: null,
|
|
38119
|
+
access: "create"
|
|
38120
|
+
},
|
|
37984
38121
|
"recording.startStorageMigrationMove": {
|
|
37985
38122
|
capName: "recording",
|
|
37986
38123
|
capScope: "system",
|
|
@@ -38425,12 +38562,36 @@ Object.freeze({
|
|
|
38425
38562
|
addonId: null,
|
|
38426
38563
|
access: "create"
|
|
38427
38564
|
},
|
|
38565
|
+
"storageMigration.cleanupCancel": {
|
|
38566
|
+
capName: "storage-migration",
|
|
38567
|
+
capScope: "system",
|
|
38568
|
+
addonId: null,
|
|
38569
|
+
access: "create"
|
|
38570
|
+
},
|
|
38571
|
+
"storageMigration.cleanupStart": {
|
|
38572
|
+
capName: "storage-migration",
|
|
38573
|
+
capScope: "system",
|
|
38574
|
+
addonId: null,
|
|
38575
|
+
access: "create"
|
|
38576
|
+
},
|
|
38577
|
+
"storageMigration.cleanupStatus": {
|
|
38578
|
+
capName: "storage-migration",
|
|
38579
|
+
capScope: "system",
|
|
38580
|
+
addonId: null,
|
|
38581
|
+
access: "view"
|
|
38582
|
+
},
|
|
38428
38583
|
"storageMigration.drain": {
|
|
38429
38584
|
capName: "storage-migration",
|
|
38430
38585
|
capScope: "system",
|
|
38431
38586
|
addonId: null,
|
|
38432
38587
|
access: "create"
|
|
38433
38588
|
},
|
|
38589
|
+
"storageMigration.history": {
|
|
38590
|
+
capName: "storage-migration",
|
|
38591
|
+
capScope: "system",
|
|
38592
|
+
addonId: null,
|
|
38593
|
+
access: "view"
|
|
38594
|
+
},
|
|
38434
38595
|
"storageMigration.movers": {
|
|
38435
38596
|
capName: "storage-migration",
|
|
38436
38597
|
capScope: "system",
|
|
@@ -40427,11 +40588,6 @@ Object.freeze({
|
|
|
40427
40588
|
form: "single",
|
|
40428
40589
|
optional: true
|
|
40429
40590
|
}],
|
|
40430
|
-
"pipelineAnalytics.getGroup": [{
|
|
40431
|
-
name: "deviceId",
|
|
40432
|
-
form: "single",
|
|
40433
|
-
optional: false
|
|
40434
|
-
}],
|
|
40435
40591
|
"pipelineAnalytics.getKeyEvents": [{
|
|
40436
40592
|
name: "deviceId",
|
|
40437
40593
|
form: "single",
|
|
@@ -40497,11 +40653,6 @@ Object.freeze({
|
|
|
40497
40653
|
form: "single",
|
|
40498
40654
|
optional: false
|
|
40499
40655
|
}],
|
|
40500
|
-
"pipelineAnalytics.listGroups": [{
|
|
40501
|
-
name: "deviceIds",
|
|
40502
|
-
form: "array",
|
|
40503
|
-
optional: false
|
|
40504
|
-
}],
|
|
40505
40656
|
"pipelineAnalytics.listOpsLog": [{
|
|
40506
40657
|
name: "deviceId",
|
|
40507
40658
|
form: "single",
|
|
@@ -40547,6 +40698,11 @@ Object.freeze({
|
|
|
40547
40698
|
form: "single",
|
|
40548
40699
|
optional: true
|
|
40549
40700
|
}],
|
|
40701
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
40702
|
+
name: "deviceIds",
|
|
40703
|
+
form: "array",
|
|
40704
|
+
optional: true
|
|
40705
|
+
}],
|
|
40550
40706
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
40551
40707
|
name: "deviceId",
|
|
40552
40708
|
form: "single",
|
|
@@ -40912,6 +41068,11 @@ Object.freeze({
|
|
|
40912
41068
|
form: "single",
|
|
40913
41069
|
optional: false
|
|
40914
41070
|
}],
|
|
41071
|
+
"recording.setDevicePlacement": [{
|
|
41072
|
+
name: "deviceId",
|
|
41073
|
+
form: "single",
|
|
41074
|
+
optional: false
|
|
41075
|
+
}],
|
|
40915
41076
|
"recording.startStorageMigrationMove": [{
|
|
40916
41077
|
name: "deviceId",
|
|
40917
41078
|
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()
|
|
@@ -19673,46 +19751,6 @@ var RecentTracksPageSchema = object({
|
|
|
19673
19751
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19674
19752
|
nextCursor: string().nullable()
|
|
19675
19753
|
});
|
|
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
19754
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19717
19755
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19718
19756
|
var KeyEventQueryInput = object({
|
|
@@ -19816,9 +19854,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19816
19854
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19817
19855
|
plates: number().int(),
|
|
19818
19856
|
/** 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()
|
|
19857
|
+
embeddings: number().int()
|
|
19822
19858
|
});
|
|
19823
19859
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19824
19860
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19988,6 +20024,47 @@ var RebuildStatusSchema = object({
|
|
|
19988
20024
|
/** Present when the pass ended by throwing. */
|
|
19989
20025
|
error: string().nullable()
|
|
19990
20026
|
});
|
|
20027
|
+
/**
|
|
20028
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
20029
|
+
*
|
|
20030
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
20031
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
20032
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
20033
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
20034
|
+
*/
|
|
20035
|
+
var MediaReclaimStartResultSchema = object({
|
|
20036
|
+
started: boolean(),
|
|
20037
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
20038
|
+
alreadyRunning: boolean()
|
|
20039
|
+
});
|
|
20040
|
+
var MediaReclaimInputSchema = object({
|
|
20041
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
20042
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
20043
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
20044
|
+
restart: boolean().optional(),
|
|
20045
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
20046
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
20047
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
20048
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
20049
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
20050
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
20051
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
20052
|
+
});
|
|
20053
|
+
var MediaReclaimStatusSchema = object({
|
|
20054
|
+
running: boolean(),
|
|
20055
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
20056
|
+
totalExamined: number(),
|
|
20057
|
+
totalEligible: number(),
|
|
20058
|
+
totalReclaimed: number(),
|
|
20059
|
+
totalBytesReclaimed: number(),
|
|
20060
|
+
totalRefused: number(),
|
|
20061
|
+
/** Device+scope windows finished in this pass. */
|
|
20062
|
+
devicesDone: number(),
|
|
20063
|
+
complete: boolean().nullable(),
|
|
20064
|
+
startedAtMs: number().nullable(),
|
|
20065
|
+
finishedAtMs: number().nullable(),
|
|
20066
|
+
error: string().nullable()
|
|
20067
|
+
});
|
|
19991
20068
|
var ReplayFrameInputSchema = object({
|
|
19992
20069
|
timestamp: number(),
|
|
19993
20070
|
frame: PipelineRunResultBridge
|
|
@@ -20026,10 +20103,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
20026
20103
|
* stationary registry). Default false: the timeline lists passages,
|
|
20027
20104
|
* not parking records (operator decision, 2026-08-15). */
|
|
20028
20105
|
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(), {
|
|
20106
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
20033
20107
|
kind: "mutation",
|
|
20034
20108
|
auth: "admin"
|
|
20035
20109
|
}), 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 +20203,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
20129
20203
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
20130
20204
|
kind: "query",
|
|
20131
20205
|
auth: "admin"
|
|
20206
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
20207
|
+
kind: "mutation",
|
|
20208
|
+
auth: "admin"
|
|
20209
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
20210
|
+
kind: "query",
|
|
20211
|
+
auth: "admin"
|
|
20132
20212
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
20133
20213
|
kind: "query",
|
|
20134
20214
|
auth: "admin"
|
|
@@ -22203,7 +22283,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
22203
22283
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
22204
22284
|
kind: "mutation",
|
|
22205
22285
|
auth: "admin"
|
|
22206
|
-
})
|
|
22286
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
22287
|
+
kind: "mutation",
|
|
22288
|
+
auth: "admin"
|
|
22289
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
22290
|
+
kind: "mutation",
|
|
22291
|
+
auth: "admin"
|
|
22292
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
22207
22293
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
22208
22294
|
providerId: string().min(1),
|
|
22209
22295
|
displayName: string().min(1),
|
|
@@ -29383,6 +29469,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
29383
29469
|
minMoveGb: number().min(0).optional()
|
|
29384
29470
|
});
|
|
29385
29471
|
/**
|
|
29472
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
29473
|
+
*
|
|
29474
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
29475
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
29476
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
29477
|
+
*/
|
|
29478
|
+
var RecordingDevicePlacementSchema = object({
|
|
29479
|
+
deviceId: number().int(),
|
|
29480
|
+
profile: string(),
|
|
29481
|
+
locationId: string()
|
|
29482
|
+
});
|
|
29483
|
+
var RecordingDevicePinSchema = object({
|
|
29484
|
+
deviceId: number().int(),
|
|
29485
|
+
/** Recordings-class location this camera is pinned to. */
|
|
29486
|
+
locationId: string()
|
|
29487
|
+
});
|
|
29488
|
+
var RecordingPlacementViewSchema = object({
|
|
29489
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
29490
|
+
pins: array(RecordingDevicePinSchema),
|
|
29491
|
+
defaultLocations: record(string(), string())
|
|
29492
|
+
});
|
|
29493
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
29494
|
+
deviceId: number().int(),
|
|
29495
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
29496
|
+
locationId: string().nullable()
|
|
29497
|
+
});
|
|
29498
|
+
/**
|
|
29386
29499
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
29387
29500
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
29388
29501
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -29608,6 +29721,12 @@ method(object({
|
|
|
29608
29721
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
29609
29722
|
kind: "mutation",
|
|
29610
29723
|
auth: "admin"
|
|
29724
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
29725
|
+
kind: "query",
|
|
29726
|
+
auth: "admin"
|
|
29727
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
29728
|
+
kind: "mutation",
|
|
29729
|
+
auth: "admin"
|
|
29611
29730
|
});
|
|
29612
29731
|
/**
|
|
29613
29732
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -35042,6 +35161,12 @@ Object.freeze({
|
|
|
35042
35161
|
addonId: null,
|
|
35043
35162
|
access: "delete"
|
|
35044
35163
|
},
|
|
35164
|
+
"deviceManager.renameLocation": {
|
|
35165
|
+
capName: "device-manager",
|
|
35166
|
+
capScope: "system",
|
|
35167
|
+
addonId: null,
|
|
35168
|
+
access: "create"
|
|
35169
|
+
},
|
|
35045
35170
|
"deviceManager.runDeviceAction": {
|
|
35046
35171
|
capName: "device-manager",
|
|
35047
35172
|
capScope: "system",
|
|
@@ -36734,19 +36859,19 @@ Object.freeze({
|
|
|
36734
36859
|
addonId: null,
|
|
36735
36860
|
access: "view"
|
|
36736
36861
|
},
|
|
36737
|
-
"pipelineAnalytics.
|
|
36862
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
36738
36863
|
capName: "pipeline-analytics",
|
|
36739
36864
|
capScope: "device",
|
|
36740
36865
|
addonId: null,
|
|
36741
36866
|
access: "view"
|
|
36742
36867
|
},
|
|
36743
|
-
"pipelineAnalytics.
|
|
36868
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
36744
36869
|
capName: "pipeline-analytics",
|
|
36745
36870
|
capScope: "device",
|
|
36746
36871
|
addonId: null,
|
|
36747
36872
|
access: "view"
|
|
36748
36873
|
},
|
|
36749
|
-
"pipelineAnalytics.
|
|
36874
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
36750
36875
|
capName: "pipeline-analytics",
|
|
36751
36876
|
capScope: "device",
|
|
36752
36877
|
addonId: null,
|
|
@@ -36836,12 +36961,6 @@ Object.freeze({
|
|
|
36836
36961
|
addonId: null,
|
|
36837
36962
|
access: "view"
|
|
36838
36963
|
},
|
|
36839
|
-
"pipelineAnalytics.listGroups": {
|
|
36840
|
-
capName: "pipeline-analytics",
|
|
36841
|
-
capScope: "device",
|
|
36842
|
-
addonId: null,
|
|
36843
|
-
access: "view"
|
|
36844
|
-
},
|
|
36845
36964
|
"pipelineAnalytics.listOpsLog": {
|
|
36846
36965
|
capName: "pipeline-analytics",
|
|
36847
36966
|
capScope: "device",
|
|
@@ -36926,6 +37045,12 @@ Object.freeze({
|
|
|
36926
37045
|
addonId: null,
|
|
36927
37046
|
access: "create"
|
|
36928
37047
|
},
|
|
37048
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
37049
|
+
capName: "pipeline-analytics",
|
|
37050
|
+
capScope: "device",
|
|
37051
|
+
addonId: null,
|
|
37052
|
+
access: "create"
|
|
37053
|
+
},
|
|
36929
37054
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
36930
37055
|
capName: "pipeline-analytics",
|
|
36931
37056
|
capScope: "device",
|
|
@@ -37850,6 +37975,12 @@ Object.freeze({
|
|
|
37850
37975
|
addonId: null,
|
|
37851
37976
|
access: "view"
|
|
37852
37977
|
},
|
|
37978
|
+
"recording.getPlacement": {
|
|
37979
|
+
capName: "recording",
|
|
37980
|
+
capScope: "system",
|
|
37981
|
+
addonId: null,
|
|
37982
|
+
access: "view"
|
|
37983
|
+
},
|
|
37853
37984
|
"recording.getPlaybackManifest": {
|
|
37854
37985
|
capName: "recording",
|
|
37855
37986
|
capScope: "system",
|
|
@@ -37976,6 +38107,12 @@ Object.freeze({
|
|
|
37976
38107
|
addonId: null,
|
|
37977
38108
|
access: "create"
|
|
37978
38109
|
},
|
|
38110
|
+
"recording.setDevicePlacement": {
|
|
38111
|
+
capName: "recording",
|
|
38112
|
+
capScope: "system",
|
|
38113
|
+
addonId: null,
|
|
38114
|
+
access: "create"
|
|
38115
|
+
},
|
|
37979
38116
|
"recording.startStorageMigrationMove": {
|
|
37980
38117
|
capName: "recording",
|
|
37981
38118
|
capScope: "system",
|
|
@@ -38420,12 +38557,36 @@ Object.freeze({
|
|
|
38420
38557
|
addonId: null,
|
|
38421
38558
|
access: "create"
|
|
38422
38559
|
},
|
|
38560
|
+
"storageMigration.cleanupCancel": {
|
|
38561
|
+
capName: "storage-migration",
|
|
38562
|
+
capScope: "system",
|
|
38563
|
+
addonId: null,
|
|
38564
|
+
access: "create"
|
|
38565
|
+
},
|
|
38566
|
+
"storageMigration.cleanupStart": {
|
|
38567
|
+
capName: "storage-migration",
|
|
38568
|
+
capScope: "system",
|
|
38569
|
+
addonId: null,
|
|
38570
|
+
access: "create"
|
|
38571
|
+
},
|
|
38572
|
+
"storageMigration.cleanupStatus": {
|
|
38573
|
+
capName: "storage-migration",
|
|
38574
|
+
capScope: "system",
|
|
38575
|
+
addonId: null,
|
|
38576
|
+
access: "view"
|
|
38577
|
+
},
|
|
38423
38578
|
"storageMigration.drain": {
|
|
38424
38579
|
capName: "storage-migration",
|
|
38425
38580
|
capScope: "system",
|
|
38426
38581
|
addonId: null,
|
|
38427
38582
|
access: "create"
|
|
38428
38583
|
},
|
|
38584
|
+
"storageMigration.history": {
|
|
38585
|
+
capName: "storage-migration",
|
|
38586
|
+
capScope: "system",
|
|
38587
|
+
addonId: null,
|
|
38588
|
+
access: "view"
|
|
38589
|
+
},
|
|
38429
38590
|
"storageMigration.movers": {
|
|
38430
38591
|
capName: "storage-migration",
|
|
38431
38592
|
capScope: "system",
|
|
@@ -40422,11 +40583,6 @@ Object.freeze({
|
|
|
40422
40583
|
form: "single",
|
|
40423
40584
|
optional: true
|
|
40424
40585
|
}],
|
|
40425
|
-
"pipelineAnalytics.getGroup": [{
|
|
40426
|
-
name: "deviceId",
|
|
40427
|
-
form: "single",
|
|
40428
|
-
optional: false
|
|
40429
|
-
}],
|
|
40430
40586
|
"pipelineAnalytics.getKeyEvents": [{
|
|
40431
40587
|
name: "deviceId",
|
|
40432
40588
|
form: "single",
|
|
@@ -40492,11 +40648,6 @@ Object.freeze({
|
|
|
40492
40648
|
form: "single",
|
|
40493
40649
|
optional: false
|
|
40494
40650
|
}],
|
|
40495
|
-
"pipelineAnalytics.listGroups": [{
|
|
40496
|
-
name: "deviceIds",
|
|
40497
|
-
form: "array",
|
|
40498
|
-
optional: false
|
|
40499
|
-
}],
|
|
40500
40651
|
"pipelineAnalytics.listOpsLog": [{
|
|
40501
40652
|
name: "deviceId",
|
|
40502
40653
|
form: "single",
|
|
@@ -40542,6 +40693,11 @@ Object.freeze({
|
|
|
40542
40693
|
form: "single",
|
|
40543
40694
|
optional: true
|
|
40544
40695
|
}],
|
|
40696
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
40697
|
+
name: "deviceIds",
|
|
40698
|
+
form: "array",
|
|
40699
|
+
optional: true
|
|
40700
|
+
}],
|
|
40545
40701
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
40546
40702
|
name: "deviceId",
|
|
40547
40703
|
form: "single",
|
|
@@ -40907,6 +41063,11 @@ Object.freeze({
|
|
|
40907
41063
|
form: "single",
|
|
40908
41064
|
optional: false
|
|
40909
41065
|
}],
|
|
41066
|
+
"recording.setDevicePlacement": [{
|
|
41067
|
+
name: "deviceId",
|
|
41068
|
+
form: "single",
|
|
41069
|
+
optional: false
|
|
41070
|
+
}],
|
|
40910
41071
|
"recording.startStorageMigrationMove": [{
|
|
40911
41072
|
name: "deviceId",
|
|
40912
41073
|
form: "single",
|