@camstack/addon-terminal 0.1.54 → 0.1.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/addon.js +234 -73
- package/dist/addon.mjs +234 -73
- package/package.json +1 -1
package/dist/addon.js
CHANGED
|
@@ -8195,6 +8195,13 @@ var MediaRelocateModeSchema = _enum([
|
|
|
8195
8195
|
]);
|
|
8196
8196
|
var RelocateMediaInputSchema = object({
|
|
8197
8197
|
toLocationId: string(),
|
|
8198
|
+
/**
|
|
8199
|
+
* Restrict the pass to rows currently on this location. Omitted / `'*'` =
|
|
8200
|
+
* every row that is not already on `toLocationId` (the historical
|
|
8201
|
+
* behaviour). A named source is what a from→to migration needs: without it
|
|
8202
|
+
* "move events off disk 2" also emptied disk 1.
|
|
8203
|
+
*/
|
|
8204
|
+
fromLocationId: string().optional(),
|
|
8198
8205
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8199
8206
|
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8200
8207
|
mode: MediaRelocateModeSchema.optional()
|
|
@@ -8262,6 +8269,19 @@ var StorageMigrationDestinationsSchema = object({
|
|
|
8262
8269
|
galleryMedia: string().min(1).optional()
|
|
8263
8270
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8264
8271
|
/**
|
|
8272
|
+
* Optional named source per class. Omitted = the class's current default
|
|
8273
|
+
* (the historical behaviour). A named source that is NOT the default is a
|
|
8274
|
+
* drain of that disk: bytes move, the default stays, and the source is
|
|
8275
|
+
* disabled when the move finishes.
|
|
8276
|
+
*/
|
|
8277
|
+
var StorageMigrationSourcesSchema = object({
|
|
8278
|
+
recordings: string().min(1).optional(),
|
|
8279
|
+
recordingsLow: string().min(1).optional(),
|
|
8280
|
+
eventMedia: string().min(1).optional(),
|
|
8281
|
+
backups: string().min(1).optional(),
|
|
8282
|
+
galleryMedia: string().min(1).optional()
|
|
8283
|
+
}).optional();
|
|
8284
|
+
/**
|
|
8265
8285
|
* How a migration sequences the cutover against the byte move.
|
|
8266
8286
|
*
|
|
8267
8287
|
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
@@ -8283,6 +8303,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
|
8283
8303
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8284
8304
|
var StorageMigrationInputSchema = object({
|
|
8285
8305
|
destinations: StorageMigrationDestinationsSchema,
|
|
8306
|
+
/** Omitted = each class's current default. */
|
|
8307
|
+
sources: StorageMigrationSourcesSchema,
|
|
8286
8308
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8287
8309
|
/** Omitted = `blocking`, which stays the default. */
|
|
8288
8310
|
mode: StorageMigrationModeSchema.optional()
|
|
@@ -8362,6 +8384,13 @@ var StorageMigrationMoveSchema = object({
|
|
|
8362
8384
|
storageClass: StorageMigrationClassSchema,
|
|
8363
8385
|
fromLocationId: string(),
|
|
8364
8386
|
toLocationId: string(),
|
|
8387
|
+
/**
|
|
8388
|
+
* True when `from` was NOT the class default at plan time. The move still
|
|
8389
|
+
* copies bytes, but the default is left alone and the source is disabled
|
|
8390
|
+
* once the copy verifies. Absent on jobs planned before this field existed
|
|
8391
|
+
* — those jobs always repointed, which is `false`.
|
|
8392
|
+
*/
|
|
8393
|
+
freezeSource: boolean().optional(),
|
|
8365
8394
|
moverJobId: string().nullable(),
|
|
8366
8395
|
state: RelocateJobStateSchema.nullable(),
|
|
8367
8396
|
error: string().nullable(),
|
|
@@ -8375,6 +8404,7 @@ var StorageMigrationJobSchema = object({
|
|
|
8375
8404
|
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8376
8405
|
mode: StorageMigrationModeSchema,
|
|
8377
8406
|
destinations: StorageMigrationDestinationsSchema,
|
|
8407
|
+
sources: StorageMigrationSourcesSchema,
|
|
8378
8408
|
throttleMbps: number(),
|
|
8379
8409
|
moves: array(StorageMigrationMoveSchema),
|
|
8380
8410
|
pauseLeaseId: string().nullable(),
|
|
@@ -8400,6 +8430,7 @@ var StorageMigrationFindingSchema = object({
|
|
|
8400
8430
|
});
|
|
8401
8431
|
var StorageMigrationPlanSchema = object({
|
|
8402
8432
|
destinations: StorageMigrationDestinationsSchema,
|
|
8433
|
+
sources: StorageMigrationSourcesSchema,
|
|
8403
8434
|
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8404
8435
|
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8405
8436
|
* it. */
|
|
@@ -8407,7 +8438,8 @@ var StorageMigrationPlanSchema = object({
|
|
|
8407
8438
|
moves: array(object({
|
|
8408
8439
|
storageClass: StorageMigrationClassSchema,
|
|
8409
8440
|
fromLocationId: string(),
|
|
8410
|
-
toLocationId: string()
|
|
8441
|
+
toLocationId: string(),
|
|
8442
|
+
freezeSource: boolean().optional()
|
|
8411
8443
|
})),
|
|
8412
8444
|
findings: array(StorageMigrationFindingSchema)
|
|
8413
8445
|
});
|
|
@@ -8585,10 +8617,51 @@ var LedgerWalkReportSchema = object({
|
|
|
8585
8617
|
var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
|
|
8586
8618
|
var RelocatableMediaCountInputSchema = object({
|
|
8587
8619
|
toLocationId: string().min(1),
|
|
8620
|
+
/** Restrict the count to one source; omitted / `'*'` = every non-target row. */
|
|
8621
|
+
fromLocationId: string().optional(),
|
|
8588
8622
|
/** Omitted = `move`. */
|
|
8589
8623
|
mode: MediaRelocateModeSchema.optional()
|
|
8590
8624
|
});
|
|
8591
8625
|
/**
|
|
8626
|
+
* Operator cleanup of leftover analytics rows, optional debug media, and
|
|
8627
|
+
* ghost ledger entries on frozen footage locations.
|
|
8628
|
+
*
|
|
8629
|
+
* A pass is tens of minutes on a standing backlog. The hub method RETURNS
|
|
8630
|
+
* `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
|
|
8631
|
+
* is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
|
|
8632
|
+
* with no operator-visible status.
|
|
8633
|
+
*/
|
|
8634
|
+
var StorageCleanupPhaseSchema = _enum([
|
|
8635
|
+
"orphans",
|
|
8636
|
+
"debug-media",
|
|
8637
|
+
"ghost-ledger",
|
|
8638
|
+
"done",
|
|
8639
|
+
"failed",
|
|
8640
|
+
"cancelled"
|
|
8641
|
+
]);
|
|
8642
|
+
var StorageCleanupInputSchema = object({
|
|
8643
|
+
/** Also walk motion stills / track filmstrips. Off by default. */
|
|
8644
|
+
includeDebugMedia: boolean().optional() });
|
|
8645
|
+
var StorageCleanupJobSchema = object({
|
|
8646
|
+
jobId: string(),
|
|
8647
|
+
phase: StorageCleanupPhaseSchema,
|
|
8648
|
+
includeDebugMedia: boolean(),
|
|
8649
|
+
orphansReclaimed: number().int().nonnegative(),
|
|
8650
|
+
orphanBytesReclaimed: number().int().nonnegative(),
|
|
8651
|
+
debugMediaReclaimed: number().int().nonnegative(),
|
|
8652
|
+
debugMediaBytesReclaimed: number().int().nonnegative(),
|
|
8653
|
+
ghostsForgotten: number().int().nonnegative(),
|
|
8654
|
+
ghostBytesForgotten: number().int().nonnegative(),
|
|
8655
|
+
/** Short operator-facing line: current collection, pass, or location. */
|
|
8656
|
+
detail: string().nullable(),
|
|
8657
|
+
cancelRequested: boolean(),
|
|
8658
|
+
startedAt: number(),
|
|
8659
|
+
updatedAt: number(),
|
|
8660
|
+
finishedAt: number().nullable(),
|
|
8661
|
+
error: string().nullable()
|
|
8662
|
+
});
|
|
8663
|
+
var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
|
|
8664
|
+
/**
|
|
8592
8665
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
8593
8666
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
8594
8667
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -8616,11 +8689,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
|
|
|
8616
8689
|
* The default location for a type uses `id === <type>:default` by
|
|
8617
8690
|
* convention (the bare type ref like `'backups'` resolves to it).
|
|
8618
8691
|
*
|
|
8619
|
-
* `isSystem
|
|
8620
|
-
*
|
|
8621
|
-
*
|
|
8622
|
-
*
|
|
8623
|
-
* deleting it is rejected at the cap level.
|
|
8692
|
+
* `isSystem` is a legacy persisted flag. Seed still creates the initial
|
|
8693
|
+
* `<type>:default` locations; the flag is no longer a lock, a badge, or a
|
|
8694
|
+
* prune selector. New writes leave it false. Deletion is gated on uniqueness
|
|
8695
|
+
* / last-enabled, not on this bit.
|
|
8624
8696
|
*/
|
|
8625
8697
|
var StorageLocationSchema = object({
|
|
8626
8698
|
id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
|
|
@@ -13091,6 +13163,12 @@ method(object({
|
|
|
13091
13163
|
}), _void(), {
|
|
13092
13164
|
kind: "mutation",
|
|
13093
13165
|
auth: "admin"
|
|
13166
|
+
}), method(object({
|
|
13167
|
+
from: string(),
|
|
13168
|
+
to: string()
|
|
13169
|
+
}), object({ moved: number() }), {
|
|
13170
|
+
kind: "mutation",
|
|
13171
|
+
auth: "admin"
|
|
13094
13172
|
}), method(object({
|
|
13095
13173
|
deviceId: number(),
|
|
13096
13174
|
disabled: boolean()
|
|
@@ -19099,46 +19177,6 @@ var RecentTracksPageSchema = object({
|
|
|
19099
19177
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19100
19178
|
nextCursor: string().nullable()
|
|
19101
19179
|
});
|
|
19102
|
-
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
19103
|
-
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
19104
|
-
var AnalyticsGroupRecordSchema = object({
|
|
19105
|
-
id: string(),
|
|
19106
|
-
deviceId: number().int(),
|
|
19107
|
-
openedAt: number().int(),
|
|
19108
|
-
closedAt: number().int(),
|
|
19109
|
-
timestamp: number().int(),
|
|
19110
|
-
memberCount: number().int(),
|
|
19111
|
-
memberTrackIds: array(string()).readonly(),
|
|
19112
|
-
className: string(),
|
|
19113
|
-
classes: array(string()).readonly(),
|
|
19114
|
-
/** Relative event-media path, or null when the group has no picture yet. */
|
|
19115
|
-
mediaUrl: string().nullable(),
|
|
19116
|
-
singleton: boolean()
|
|
19117
|
-
});
|
|
19118
|
-
var AnalyticsGroupMemberSchema = object({
|
|
19119
|
-
trackId: string(),
|
|
19120
|
-
deviceId: number().int(),
|
|
19121
|
-
className: string(),
|
|
19122
|
-
firstSeen: number().int(),
|
|
19123
|
-
lastSeen: number().int(),
|
|
19124
|
-
mediaUrl: string().nullable()
|
|
19125
|
-
});
|
|
19126
|
-
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
19127
|
-
var ListGroupsQueryInput = object({
|
|
19128
|
-
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
19129
|
-
deviceIds: array(number()),
|
|
19130
|
-
/** Window lower bound on `closedAt` (inclusive). */
|
|
19131
|
-
since: number().optional(),
|
|
19132
|
-
/** Window upper bound on `openedAt` (inclusive). */
|
|
19133
|
-
until: number().optional(),
|
|
19134
|
-
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
19135
|
-
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
19136
|
-
cursor: string().optional()
|
|
19137
|
-
});
|
|
19138
|
-
var ListGroupsPageSchema = object({
|
|
19139
|
-
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
19140
|
-
nextCursor: string().nullable()
|
|
19141
|
-
});
|
|
19142
19180
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19143
19181
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19144
19182
|
var KeyEventQueryInput = object({
|
|
@@ -19242,9 +19280,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19242
19280
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19243
19281
|
plates: number().int(),
|
|
19244
19282
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
19245
|
-
embeddings: number().int()
|
|
19246
|
-
/** Group membership + group rows removed with their last member (best-effort). */
|
|
19247
|
-
groups: number().int()
|
|
19283
|
+
embeddings: number().int()
|
|
19248
19284
|
});
|
|
19249
19285
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19250
19286
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19414,6 +19450,47 @@ var RebuildStatusSchema = object({
|
|
|
19414
19450
|
/** Present when the pass ended by throwing. */
|
|
19415
19451
|
error: string().nullable()
|
|
19416
19452
|
});
|
|
19453
|
+
/**
|
|
19454
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19455
|
+
*
|
|
19456
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19457
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19458
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19459
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19460
|
+
*/
|
|
19461
|
+
var MediaReclaimStartResultSchema = object({
|
|
19462
|
+
started: boolean(),
|
|
19463
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19464
|
+
alreadyRunning: boolean()
|
|
19465
|
+
});
|
|
19466
|
+
var MediaReclaimInputSchema = object({
|
|
19467
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19468
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19469
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19470
|
+
restart: boolean().optional(),
|
|
19471
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19472
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19473
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19474
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19475
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19476
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19477
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19478
|
+
});
|
|
19479
|
+
var MediaReclaimStatusSchema = object({
|
|
19480
|
+
running: boolean(),
|
|
19481
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19482
|
+
totalExamined: number(),
|
|
19483
|
+
totalEligible: number(),
|
|
19484
|
+
totalReclaimed: number(),
|
|
19485
|
+
totalBytesReclaimed: number(),
|
|
19486
|
+
totalRefused: number(),
|
|
19487
|
+
/** Device+scope windows finished in this pass. */
|
|
19488
|
+
devicesDone: number(),
|
|
19489
|
+
complete: boolean().nullable(),
|
|
19490
|
+
startedAtMs: number().nullable(),
|
|
19491
|
+
finishedAtMs: number().nullable(),
|
|
19492
|
+
error: string().nullable()
|
|
19493
|
+
});
|
|
19417
19494
|
var ReplayFrameInputSchema = object({
|
|
19418
19495
|
timestamp: number(),
|
|
19419
19496
|
frame: PipelineRunResultBridge
|
|
@@ -19452,10 +19529,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19452
19529
|
* stationary registry). Default false: the timeline lists passages,
|
|
19453
19530
|
* not parking records (operator decision, 2026-08-15). */
|
|
19454
19531
|
includeStationary: boolean().optional()
|
|
19455
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
19456
|
-
deviceId: number(),
|
|
19457
|
-
groupId: string().min(1)
|
|
19458
|
-
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
19532
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19459
19533
|
kind: "mutation",
|
|
19460
19534
|
auth: "admin"
|
|
19461
19535
|
}), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({ deviceId: number() }), array(EventKindDescriptorSchema).readonly()), method(object({ deviceIds: array(number()).min(1).max(200) }), array(EventKindsForDeviceSchema).readonly()), method(object({
|
|
@@ -19555,6 +19629,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19555
19629
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19556
19630
|
kind: "query",
|
|
19557
19631
|
auth: "admin"
|
|
19632
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19633
|
+
kind: "mutation",
|
|
19634
|
+
auth: "admin"
|
|
19635
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19636
|
+
kind: "query",
|
|
19637
|
+
auth: "admin"
|
|
19558
19638
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19559
19639
|
kind: "query",
|
|
19560
19640
|
auth: "admin"
|
|
@@ -21629,7 +21709,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21629
21709
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21630
21710
|
kind: "mutation",
|
|
21631
21711
|
auth: "admin"
|
|
21632
|
-
})
|
|
21712
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21713
|
+
kind: "mutation",
|
|
21714
|
+
auth: "admin"
|
|
21715
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21716
|
+
kind: "mutation",
|
|
21717
|
+
auth: "admin"
|
|
21718
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21633
21719
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21634
21720
|
providerId: string().min(1),
|
|
21635
21721
|
displayName: string().min(1),
|
|
@@ -28766,6 +28852,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
28766
28852
|
minMoveGb: number().min(0).optional()
|
|
28767
28853
|
});
|
|
28768
28854
|
/**
|
|
28855
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
28856
|
+
*
|
|
28857
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
28858
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
28859
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
28860
|
+
*/
|
|
28861
|
+
var RecordingDevicePlacementSchema = object({
|
|
28862
|
+
deviceId: number().int(),
|
|
28863
|
+
profile: string(),
|
|
28864
|
+
locationId: string()
|
|
28865
|
+
});
|
|
28866
|
+
var RecordingDevicePinSchema = object({
|
|
28867
|
+
deviceId: number().int(),
|
|
28868
|
+
/** Recordings-class location this camera is pinned to. */
|
|
28869
|
+
locationId: string()
|
|
28870
|
+
});
|
|
28871
|
+
var RecordingPlacementViewSchema = object({
|
|
28872
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
28873
|
+
pins: array(RecordingDevicePinSchema),
|
|
28874
|
+
defaultLocations: record(string(), string())
|
|
28875
|
+
});
|
|
28876
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
28877
|
+
deviceId: number().int(),
|
|
28878
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
28879
|
+
locationId: string().nullable()
|
|
28880
|
+
});
|
|
28881
|
+
/**
|
|
28769
28882
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
28770
28883
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
28771
28884
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -28991,6 +29104,12 @@ method(object({
|
|
|
28991
29104
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
28992
29105
|
kind: "mutation",
|
|
28993
29106
|
auth: "admin"
|
|
29107
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
29108
|
+
kind: "query",
|
|
29109
|
+
auth: "admin"
|
|
29110
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
29111
|
+
kind: "mutation",
|
|
29112
|
+
auth: "admin"
|
|
28994
29113
|
});
|
|
28995
29114
|
/**
|
|
28996
29115
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -34058,6 +34177,12 @@ Object.freeze({
|
|
|
34058
34177
|
addonId: null,
|
|
34059
34178
|
access: "delete"
|
|
34060
34179
|
},
|
|
34180
|
+
"deviceManager.renameLocation": {
|
|
34181
|
+
capName: "device-manager",
|
|
34182
|
+
capScope: "system",
|
|
34183
|
+
addonId: null,
|
|
34184
|
+
access: "create"
|
|
34185
|
+
},
|
|
34061
34186
|
"deviceManager.runDeviceAction": {
|
|
34062
34187
|
capName: "device-manager",
|
|
34063
34188
|
capScope: "system",
|
|
@@ -35750,19 +35875,19 @@ Object.freeze({
|
|
|
35750
35875
|
addonId: null,
|
|
35751
35876
|
access: "view"
|
|
35752
35877
|
},
|
|
35753
|
-
"pipelineAnalytics.
|
|
35878
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
35754
35879
|
capName: "pipeline-analytics",
|
|
35755
35880
|
capScope: "device",
|
|
35756
35881
|
addonId: null,
|
|
35757
35882
|
access: "view"
|
|
35758
35883
|
},
|
|
35759
|
-
"pipelineAnalytics.
|
|
35884
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
35760
35885
|
capName: "pipeline-analytics",
|
|
35761
35886
|
capScope: "device",
|
|
35762
35887
|
addonId: null,
|
|
35763
35888
|
access: "view"
|
|
35764
35889
|
},
|
|
35765
|
-
"pipelineAnalytics.
|
|
35890
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
35766
35891
|
capName: "pipeline-analytics",
|
|
35767
35892
|
capScope: "device",
|
|
35768
35893
|
addonId: null,
|
|
@@ -35852,12 +35977,6 @@ Object.freeze({
|
|
|
35852
35977
|
addonId: null,
|
|
35853
35978
|
access: "view"
|
|
35854
35979
|
},
|
|
35855
|
-
"pipelineAnalytics.listGroups": {
|
|
35856
|
-
capName: "pipeline-analytics",
|
|
35857
|
-
capScope: "device",
|
|
35858
|
-
addonId: null,
|
|
35859
|
-
access: "view"
|
|
35860
|
-
},
|
|
35861
35980
|
"pipelineAnalytics.listOpsLog": {
|
|
35862
35981
|
capName: "pipeline-analytics",
|
|
35863
35982
|
capScope: "device",
|
|
@@ -35942,6 +36061,12 @@ Object.freeze({
|
|
|
35942
36061
|
addonId: null,
|
|
35943
36062
|
access: "create"
|
|
35944
36063
|
},
|
|
36064
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
36065
|
+
capName: "pipeline-analytics",
|
|
36066
|
+
capScope: "device",
|
|
36067
|
+
addonId: null,
|
|
36068
|
+
access: "create"
|
|
36069
|
+
},
|
|
35945
36070
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
35946
36071
|
capName: "pipeline-analytics",
|
|
35947
36072
|
capScope: "device",
|
|
@@ -36866,6 +36991,12 @@ Object.freeze({
|
|
|
36866
36991
|
addonId: null,
|
|
36867
36992
|
access: "view"
|
|
36868
36993
|
},
|
|
36994
|
+
"recording.getPlacement": {
|
|
36995
|
+
capName: "recording",
|
|
36996
|
+
capScope: "system",
|
|
36997
|
+
addonId: null,
|
|
36998
|
+
access: "view"
|
|
36999
|
+
},
|
|
36869
37000
|
"recording.getPlaybackManifest": {
|
|
36870
37001
|
capName: "recording",
|
|
36871
37002
|
capScope: "system",
|
|
@@ -36992,6 +37123,12 @@ Object.freeze({
|
|
|
36992
37123
|
addonId: null,
|
|
36993
37124
|
access: "create"
|
|
36994
37125
|
},
|
|
37126
|
+
"recording.setDevicePlacement": {
|
|
37127
|
+
capName: "recording",
|
|
37128
|
+
capScope: "system",
|
|
37129
|
+
addonId: null,
|
|
37130
|
+
access: "create"
|
|
37131
|
+
},
|
|
36995
37132
|
"recording.startStorageMigrationMove": {
|
|
36996
37133
|
capName: "recording",
|
|
36997
37134
|
capScope: "system",
|
|
@@ -37436,12 +37573,36 @@ Object.freeze({
|
|
|
37436
37573
|
addonId: null,
|
|
37437
37574
|
access: "create"
|
|
37438
37575
|
},
|
|
37576
|
+
"storageMigration.cleanupCancel": {
|
|
37577
|
+
capName: "storage-migration",
|
|
37578
|
+
capScope: "system",
|
|
37579
|
+
addonId: null,
|
|
37580
|
+
access: "create"
|
|
37581
|
+
},
|
|
37582
|
+
"storageMigration.cleanupStart": {
|
|
37583
|
+
capName: "storage-migration",
|
|
37584
|
+
capScope: "system",
|
|
37585
|
+
addonId: null,
|
|
37586
|
+
access: "create"
|
|
37587
|
+
},
|
|
37588
|
+
"storageMigration.cleanupStatus": {
|
|
37589
|
+
capName: "storage-migration",
|
|
37590
|
+
capScope: "system",
|
|
37591
|
+
addonId: null,
|
|
37592
|
+
access: "view"
|
|
37593
|
+
},
|
|
37439
37594
|
"storageMigration.drain": {
|
|
37440
37595
|
capName: "storage-migration",
|
|
37441
37596
|
capScope: "system",
|
|
37442
37597
|
addonId: null,
|
|
37443
37598
|
access: "create"
|
|
37444
37599
|
},
|
|
37600
|
+
"storageMigration.history": {
|
|
37601
|
+
capName: "storage-migration",
|
|
37602
|
+
capScope: "system",
|
|
37603
|
+
addonId: null,
|
|
37604
|
+
access: "view"
|
|
37605
|
+
},
|
|
37445
37606
|
"storageMigration.movers": {
|
|
37446
37607
|
capName: "storage-migration",
|
|
37447
37608
|
capScope: "system",
|
|
@@ -39438,11 +39599,6 @@ Object.freeze({
|
|
|
39438
39599
|
form: "single",
|
|
39439
39600
|
optional: true
|
|
39440
39601
|
}],
|
|
39441
|
-
"pipelineAnalytics.getGroup": [{
|
|
39442
|
-
name: "deviceId",
|
|
39443
|
-
form: "single",
|
|
39444
|
-
optional: false
|
|
39445
|
-
}],
|
|
39446
39602
|
"pipelineAnalytics.getKeyEvents": [{
|
|
39447
39603
|
name: "deviceId",
|
|
39448
39604
|
form: "single",
|
|
@@ -39508,11 +39664,6 @@ Object.freeze({
|
|
|
39508
39664
|
form: "single",
|
|
39509
39665
|
optional: false
|
|
39510
39666
|
}],
|
|
39511
|
-
"pipelineAnalytics.listGroups": [{
|
|
39512
|
-
name: "deviceIds",
|
|
39513
|
-
form: "array",
|
|
39514
|
-
optional: false
|
|
39515
|
-
}],
|
|
39516
39667
|
"pipelineAnalytics.listOpsLog": [{
|
|
39517
39668
|
name: "deviceId",
|
|
39518
39669
|
form: "single",
|
|
@@ -39558,6 +39709,11 @@ Object.freeze({
|
|
|
39558
39709
|
form: "single",
|
|
39559
39710
|
optional: true
|
|
39560
39711
|
}],
|
|
39712
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
39713
|
+
name: "deviceIds",
|
|
39714
|
+
form: "array",
|
|
39715
|
+
optional: true
|
|
39716
|
+
}],
|
|
39561
39717
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
39562
39718
|
name: "deviceId",
|
|
39563
39719
|
form: "single",
|
|
@@ -39923,6 +40079,11 @@ Object.freeze({
|
|
|
39923
40079
|
form: "single",
|
|
39924
40080
|
optional: false
|
|
39925
40081
|
}],
|
|
40082
|
+
"recording.setDevicePlacement": [{
|
|
40083
|
+
name: "deviceId",
|
|
40084
|
+
form: "single",
|
|
40085
|
+
optional: false
|
|
40086
|
+
}],
|
|
39926
40087
|
"recording.startStorageMigrationMove": [{
|
|
39927
40088
|
name: "deviceId",
|
|
39928
40089
|
form: "single",
|
package/dist/addon.mjs
CHANGED
|
@@ -8172,6 +8172,13 @@ var MediaRelocateModeSchema = _enum([
|
|
|
8172
8172
|
]);
|
|
8173
8173
|
var RelocateMediaInputSchema = object({
|
|
8174
8174
|
toLocationId: string(),
|
|
8175
|
+
/**
|
|
8176
|
+
* Restrict the pass to rows currently on this location. Omitted / `'*'` =
|
|
8177
|
+
* every row that is not already on `toLocationId` (the historical
|
|
8178
|
+
* behaviour). A named source is what a from→to migration needs: without it
|
|
8179
|
+
* "move events off disk 2" also emptied disk 1.
|
|
8180
|
+
*/
|
|
8181
|
+
fromLocationId: string().optional(),
|
|
8175
8182
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8176
8183
|
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8177
8184
|
mode: MediaRelocateModeSchema.optional()
|
|
@@ -8239,6 +8246,19 @@ var StorageMigrationDestinationsSchema = object({
|
|
|
8239
8246
|
galleryMedia: string().min(1).optional()
|
|
8240
8247
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8241
8248
|
/**
|
|
8249
|
+
* Optional named source per class. Omitted = the class's current default
|
|
8250
|
+
* (the historical behaviour). A named source that is NOT the default is a
|
|
8251
|
+
* drain of that disk: bytes move, the default stays, and the source is
|
|
8252
|
+
* disabled when the move finishes.
|
|
8253
|
+
*/
|
|
8254
|
+
var StorageMigrationSourcesSchema = object({
|
|
8255
|
+
recordings: string().min(1).optional(),
|
|
8256
|
+
recordingsLow: string().min(1).optional(),
|
|
8257
|
+
eventMedia: string().min(1).optional(),
|
|
8258
|
+
backups: string().min(1).optional(),
|
|
8259
|
+
galleryMedia: string().min(1).optional()
|
|
8260
|
+
}).optional();
|
|
8261
|
+
/**
|
|
8242
8262
|
* How a migration sequences the cutover against the byte move.
|
|
8243
8263
|
*
|
|
8244
8264
|
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
@@ -8260,6 +8280,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
|
8260
8280
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8261
8281
|
var StorageMigrationInputSchema = object({
|
|
8262
8282
|
destinations: StorageMigrationDestinationsSchema,
|
|
8283
|
+
/** Omitted = each class's current default. */
|
|
8284
|
+
sources: StorageMigrationSourcesSchema,
|
|
8263
8285
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8264
8286
|
/** Omitted = `blocking`, which stays the default. */
|
|
8265
8287
|
mode: StorageMigrationModeSchema.optional()
|
|
@@ -8339,6 +8361,13 @@ var StorageMigrationMoveSchema = object({
|
|
|
8339
8361
|
storageClass: StorageMigrationClassSchema,
|
|
8340
8362
|
fromLocationId: string(),
|
|
8341
8363
|
toLocationId: string(),
|
|
8364
|
+
/**
|
|
8365
|
+
* True when `from` was NOT the class default at plan time. The move still
|
|
8366
|
+
* copies bytes, but the default is left alone and the source is disabled
|
|
8367
|
+
* once the copy verifies. Absent on jobs planned before this field existed
|
|
8368
|
+
* — those jobs always repointed, which is `false`.
|
|
8369
|
+
*/
|
|
8370
|
+
freezeSource: boolean().optional(),
|
|
8342
8371
|
moverJobId: string().nullable(),
|
|
8343
8372
|
state: RelocateJobStateSchema.nullable(),
|
|
8344
8373
|
error: string().nullable(),
|
|
@@ -8352,6 +8381,7 @@ var StorageMigrationJobSchema = object({
|
|
|
8352
8381
|
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8353
8382
|
mode: StorageMigrationModeSchema,
|
|
8354
8383
|
destinations: StorageMigrationDestinationsSchema,
|
|
8384
|
+
sources: StorageMigrationSourcesSchema,
|
|
8355
8385
|
throttleMbps: number(),
|
|
8356
8386
|
moves: array(StorageMigrationMoveSchema),
|
|
8357
8387
|
pauseLeaseId: string().nullable(),
|
|
@@ -8377,6 +8407,7 @@ var StorageMigrationFindingSchema = object({
|
|
|
8377
8407
|
});
|
|
8378
8408
|
var StorageMigrationPlanSchema = object({
|
|
8379
8409
|
destinations: StorageMigrationDestinationsSchema,
|
|
8410
|
+
sources: StorageMigrationSourcesSchema,
|
|
8380
8411
|
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8381
8412
|
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8382
8413
|
* it. */
|
|
@@ -8384,7 +8415,8 @@ var StorageMigrationPlanSchema = object({
|
|
|
8384
8415
|
moves: array(object({
|
|
8385
8416
|
storageClass: StorageMigrationClassSchema,
|
|
8386
8417
|
fromLocationId: string(),
|
|
8387
|
-
toLocationId: string()
|
|
8418
|
+
toLocationId: string(),
|
|
8419
|
+
freezeSource: boolean().optional()
|
|
8388
8420
|
})),
|
|
8389
8421
|
findings: array(StorageMigrationFindingSchema)
|
|
8390
8422
|
});
|
|
@@ -8562,10 +8594,51 @@ var LedgerWalkReportSchema = object({
|
|
|
8562
8594
|
var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
|
|
8563
8595
|
var RelocatableMediaCountInputSchema = object({
|
|
8564
8596
|
toLocationId: string().min(1),
|
|
8597
|
+
/** Restrict the count to one source; omitted / `'*'` = every non-target row. */
|
|
8598
|
+
fromLocationId: string().optional(),
|
|
8565
8599
|
/** Omitted = `move`. */
|
|
8566
8600
|
mode: MediaRelocateModeSchema.optional()
|
|
8567
8601
|
});
|
|
8568
8602
|
/**
|
|
8603
|
+
* Operator cleanup of leftover analytics rows, optional debug media, and
|
|
8604
|
+
* ghost ledger entries on frozen footage locations.
|
|
8605
|
+
*
|
|
8606
|
+
* A pass is tens of minutes on a standing backlog. The hub method RETURNS
|
|
8607
|
+
* `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
|
|
8608
|
+
* is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
|
|
8609
|
+
* with no operator-visible status.
|
|
8610
|
+
*/
|
|
8611
|
+
var StorageCleanupPhaseSchema = _enum([
|
|
8612
|
+
"orphans",
|
|
8613
|
+
"debug-media",
|
|
8614
|
+
"ghost-ledger",
|
|
8615
|
+
"done",
|
|
8616
|
+
"failed",
|
|
8617
|
+
"cancelled"
|
|
8618
|
+
]);
|
|
8619
|
+
var StorageCleanupInputSchema = object({
|
|
8620
|
+
/** Also walk motion stills / track filmstrips. Off by default. */
|
|
8621
|
+
includeDebugMedia: boolean().optional() });
|
|
8622
|
+
var StorageCleanupJobSchema = object({
|
|
8623
|
+
jobId: string(),
|
|
8624
|
+
phase: StorageCleanupPhaseSchema,
|
|
8625
|
+
includeDebugMedia: boolean(),
|
|
8626
|
+
orphansReclaimed: number().int().nonnegative(),
|
|
8627
|
+
orphanBytesReclaimed: number().int().nonnegative(),
|
|
8628
|
+
debugMediaReclaimed: number().int().nonnegative(),
|
|
8629
|
+
debugMediaBytesReclaimed: number().int().nonnegative(),
|
|
8630
|
+
ghostsForgotten: number().int().nonnegative(),
|
|
8631
|
+
ghostBytesForgotten: number().int().nonnegative(),
|
|
8632
|
+
/** Short operator-facing line: current collection, pass, or location. */
|
|
8633
|
+
detail: string().nullable(),
|
|
8634
|
+
cancelRequested: boolean(),
|
|
8635
|
+
startedAt: number(),
|
|
8636
|
+
updatedAt: number(),
|
|
8637
|
+
finishedAt: number().nullable(),
|
|
8638
|
+
error: string().nullable()
|
|
8639
|
+
});
|
|
8640
|
+
var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
|
|
8641
|
+
/**
|
|
8569
8642
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
8570
8643
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
8571
8644
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -8593,11 +8666,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
|
|
|
8593
8666
|
* The default location for a type uses `id === <type>:default` by
|
|
8594
8667
|
* convention (the bare type ref like `'backups'` resolves to it).
|
|
8595
8668
|
*
|
|
8596
|
-
* `isSystem
|
|
8597
|
-
*
|
|
8598
|
-
*
|
|
8599
|
-
*
|
|
8600
|
-
* deleting it is rejected at the cap level.
|
|
8669
|
+
* `isSystem` is a legacy persisted flag. Seed still creates the initial
|
|
8670
|
+
* `<type>:default` locations; the flag is no longer a lock, a badge, or a
|
|
8671
|
+
* prune selector. New writes leave it false. Deletion is gated on uniqueness
|
|
8672
|
+
* / last-enabled, not on this bit.
|
|
8601
8673
|
*/
|
|
8602
8674
|
var StorageLocationSchema = object({
|
|
8603
8675
|
id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
|
|
@@ -13068,6 +13140,12 @@ method(object({
|
|
|
13068
13140
|
}), _void(), {
|
|
13069
13141
|
kind: "mutation",
|
|
13070
13142
|
auth: "admin"
|
|
13143
|
+
}), method(object({
|
|
13144
|
+
from: string(),
|
|
13145
|
+
to: string()
|
|
13146
|
+
}), object({ moved: number() }), {
|
|
13147
|
+
kind: "mutation",
|
|
13148
|
+
auth: "admin"
|
|
13071
13149
|
}), method(object({
|
|
13072
13150
|
deviceId: number(),
|
|
13073
13151
|
disabled: boolean()
|
|
@@ -19076,46 +19154,6 @@ var RecentTracksPageSchema = object({
|
|
|
19076
19154
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19077
19155
|
nextCursor: string().nullable()
|
|
19078
19156
|
});
|
|
19079
|
-
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
19080
|
-
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
19081
|
-
var AnalyticsGroupRecordSchema = object({
|
|
19082
|
-
id: string(),
|
|
19083
|
-
deviceId: number().int(),
|
|
19084
|
-
openedAt: number().int(),
|
|
19085
|
-
closedAt: number().int(),
|
|
19086
|
-
timestamp: number().int(),
|
|
19087
|
-
memberCount: number().int(),
|
|
19088
|
-
memberTrackIds: array(string()).readonly(),
|
|
19089
|
-
className: string(),
|
|
19090
|
-
classes: array(string()).readonly(),
|
|
19091
|
-
/** Relative event-media path, or null when the group has no picture yet. */
|
|
19092
|
-
mediaUrl: string().nullable(),
|
|
19093
|
-
singleton: boolean()
|
|
19094
|
-
});
|
|
19095
|
-
var AnalyticsGroupMemberSchema = object({
|
|
19096
|
-
trackId: string(),
|
|
19097
|
-
deviceId: number().int(),
|
|
19098
|
-
className: string(),
|
|
19099
|
-
firstSeen: number().int(),
|
|
19100
|
-
lastSeen: number().int(),
|
|
19101
|
-
mediaUrl: string().nullable()
|
|
19102
|
-
});
|
|
19103
|
-
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
19104
|
-
var ListGroupsQueryInput = object({
|
|
19105
|
-
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
19106
|
-
deviceIds: array(number()),
|
|
19107
|
-
/** Window lower bound on `closedAt` (inclusive). */
|
|
19108
|
-
since: number().optional(),
|
|
19109
|
-
/** Window upper bound on `openedAt` (inclusive). */
|
|
19110
|
-
until: number().optional(),
|
|
19111
|
-
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
19112
|
-
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
19113
|
-
cursor: string().optional()
|
|
19114
|
-
});
|
|
19115
|
-
var ListGroupsPageSchema = object({
|
|
19116
|
-
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
19117
|
-
nextCursor: string().nullable()
|
|
19118
|
-
});
|
|
19119
19157
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19120
19158
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19121
19159
|
var KeyEventQueryInput = object({
|
|
@@ -19219,9 +19257,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19219
19257
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19220
19258
|
plates: number().int(),
|
|
19221
19259
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
19222
|
-
embeddings: number().int()
|
|
19223
|
-
/** Group membership + group rows removed with their last member (best-effort). */
|
|
19224
|
-
groups: number().int()
|
|
19260
|
+
embeddings: number().int()
|
|
19225
19261
|
});
|
|
19226
19262
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19227
19263
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19391,6 +19427,47 @@ var RebuildStatusSchema = object({
|
|
|
19391
19427
|
/** Present when the pass ended by throwing. */
|
|
19392
19428
|
error: string().nullable()
|
|
19393
19429
|
});
|
|
19430
|
+
/**
|
|
19431
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19432
|
+
*
|
|
19433
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19434
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19435
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19436
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19437
|
+
*/
|
|
19438
|
+
var MediaReclaimStartResultSchema = object({
|
|
19439
|
+
started: boolean(),
|
|
19440
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19441
|
+
alreadyRunning: boolean()
|
|
19442
|
+
});
|
|
19443
|
+
var MediaReclaimInputSchema = object({
|
|
19444
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19445
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19446
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19447
|
+
restart: boolean().optional(),
|
|
19448
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19449
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19450
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19451
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19452
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19453
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19454
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19455
|
+
});
|
|
19456
|
+
var MediaReclaimStatusSchema = object({
|
|
19457
|
+
running: boolean(),
|
|
19458
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19459
|
+
totalExamined: number(),
|
|
19460
|
+
totalEligible: number(),
|
|
19461
|
+
totalReclaimed: number(),
|
|
19462
|
+
totalBytesReclaimed: number(),
|
|
19463
|
+
totalRefused: number(),
|
|
19464
|
+
/** Device+scope windows finished in this pass. */
|
|
19465
|
+
devicesDone: number(),
|
|
19466
|
+
complete: boolean().nullable(),
|
|
19467
|
+
startedAtMs: number().nullable(),
|
|
19468
|
+
finishedAtMs: number().nullable(),
|
|
19469
|
+
error: string().nullable()
|
|
19470
|
+
});
|
|
19394
19471
|
var ReplayFrameInputSchema = object({
|
|
19395
19472
|
timestamp: number(),
|
|
19396
19473
|
frame: PipelineRunResultBridge
|
|
@@ -19429,10 +19506,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19429
19506
|
* stationary registry). Default false: the timeline lists passages,
|
|
19430
19507
|
* not parking records (operator decision, 2026-08-15). */
|
|
19431
19508
|
includeStationary: boolean().optional()
|
|
19432
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
19433
|
-
deviceId: number(),
|
|
19434
|
-
groupId: string().min(1)
|
|
19435
|
-
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
19509
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19436
19510
|
kind: "mutation",
|
|
19437
19511
|
auth: "admin"
|
|
19438
19512
|
}), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({ deviceId: number() }), array(EventKindDescriptorSchema).readonly()), method(object({ deviceIds: array(number()).min(1).max(200) }), array(EventKindsForDeviceSchema).readonly()), method(object({
|
|
@@ -19532,6 +19606,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19532
19606
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19533
19607
|
kind: "query",
|
|
19534
19608
|
auth: "admin"
|
|
19609
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19610
|
+
kind: "mutation",
|
|
19611
|
+
auth: "admin"
|
|
19612
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19613
|
+
kind: "query",
|
|
19614
|
+
auth: "admin"
|
|
19535
19615
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19536
19616
|
kind: "query",
|
|
19537
19617
|
auth: "admin"
|
|
@@ -21606,7 +21686,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21606
21686
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21607
21687
|
kind: "mutation",
|
|
21608
21688
|
auth: "admin"
|
|
21609
|
-
})
|
|
21689
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21690
|
+
kind: "mutation",
|
|
21691
|
+
auth: "admin"
|
|
21692
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21693
|
+
kind: "mutation",
|
|
21694
|
+
auth: "admin"
|
|
21695
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21610
21696
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21611
21697
|
providerId: string().min(1),
|
|
21612
21698
|
displayName: string().min(1),
|
|
@@ -28743,6 +28829,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
28743
28829
|
minMoveGb: number().min(0).optional()
|
|
28744
28830
|
});
|
|
28745
28831
|
/**
|
|
28832
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
28833
|
+
*
|
|
28834
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
28835
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
28836
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
28837
|
+
*/
|
|
28838
|
+
var RecordingDevicePlacementSchema = object({
|
|
28839
|
+
deviceId: number().int(),
|
|
28840
|
+
profile: string(),
|
|
28841
|
+
locationId: string()
|
|
28842
|
+
});
|
|
28843
|
+
var RecordingDevicePinSchema = object({
|
|
28844
|
+
deviceId: number().int(),
|
|
28845
|
+
/** Recordings-class location this camera is pinned to. */
|
|
28846
|
+
locationId: string()
|
|
28847
|
+
});
|
|
28848
|
+
var RecordingPlacementViewSchema = object({
|
|
28849
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
28850
|
+
pins: array(RecordingDevicePinSchema),
|
|
28851
|
+
defaultLocations: record(string(), string())
|
|
28852
|
+
});
|
|
28853
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
28854
|
+
deviceId: number().int(),
|
|
28855
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
28856
|
+
locationId: string().nullable()
|
|
28857
|
+
});
|
|
28858
|
+
/**
|
|
28746
28859
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
28747
28860
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
28748
28861
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -28968,6 +29081,12 @@ method(object({
|
|
|
28968
29081
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
28969
29082
|
kind: "mutation",
|
|
28970
29083
|
auth: "admin"
|
|
29084
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
29085
|
+
kind: "query",
|
|
29086
|
+
auth: "admin"
|
|
29087
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
29088
|
+
kind: "mutation",
|
|
29089
|
+
auth: "admin"
|
|
28971
29090
|
});
|
|
28972
29091
|
/**
|
|
28973
29092
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -34035,6 +34154,12 @@ Object.freeze({
|
|
|
34035
34154
|
addonId: null,
|
|
34036
34155
|
access: "delete"
|
|
34037
34156
|
},
|
|
34157
|
+
"deviceManager.renameLocation": {
|
|
34158
|
+
capName: "device-manager",
|
|
34159
|
+
capScope: "system",
|
|
34160
|
+
addonId: null,
|
|
34161
|
+
access: "create"
|
|
34162
|
+
},
|
|
34038
34163
|
"deviceManager.runDeviceAction": {
|
|
34039
34164
|
capName: "device-manager",
|
|
34040
34165
|
capScope: "system",
|
|
@@ -35727,19 +35852,19 @@ Object.freeze({
|
|
|
35727
35852
|
addonId: null,
|
|
35728
35853
|
access: "view"
|
|
35729
35854
|
},
|
|
35730
|
-
"pipelineAnalytics.
|
|
35855
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
35731
35856
|
capName: "pipeline-analytics",
|
|
35732
35857
|
capScope: "device",
|
|
35733
35858
|
addonId: null,
|
|
35734
35859
|
access: "view"
|
|
35735
35860
|
},
|
|
35736
|
-
"pipelineAnalytics.
|
|
35861
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
35737
35862
|
capName: "pipeline-analytics",
|
|
35738
35863
|
capScope: "device",
|
|
35739
35864
|
addonId: null,
|
|
35740
35865
|
access: "view"
|
|
35741
35866
|
},
|
|
35742
|
-
"pipelineAnalytics.
|
|
35867
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
35743
35868
|
capName: "pipeline-analytics",
|
|
35744
35869
|
capScope: "device",
|
|
35745
35870
|
addonId: null,
|
|
@@ -35829,12 +35954,6 @@ Object.freeze({
|
|
|
35829
35954
|
addonId: null,
|
|
35830
35955
|
access: "view"
|
|
35831
35956
|
},
|
|
35832
|
-
"pipelineAnalytics.listGroups": {
|
|
35833
|
-
capName: "pipeline-analytics",
|
|
35834
|
-
capScope: "device",
|
|
35835
|
-
addonId: null,
|
|
35836
|
-
access: "view"
|
|
35837
|
-
},
|
|
35838
35957
|
"pipelineAnalytics.listOpsLog": {
|
|
35839
35958
|
capName: "pipeline-analytics",
|
|
35840
35959
|
capScope: "device",
|
|
@@ -35919,6 +36038,12 @@ Object.freeze({
|
|
|
35919
36038
|
addonId: null,
|
|
35920
36039
|
access: "create"
|
|
35921
36040
|
},
|
|
36041
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
36042
|
+
capName: "pipeline-analytics",
|
|
36043
|
+
capScope: "device",
|
|
36044
|
+
addonId: null,
|
|
36045
|
+
access: "create"
|
|
36046
|
+
},
|
|
35922
36047
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
35923
36048
|
capName: "pipeline-analytics",
|
|
35924
36049
|
capScope: "device",
|
|
@@ -36843,6 +36968,12 @@ Object.freeze({
|
|
|
36843
36968
|
addonId: null,
|
|
36844
36969
|
access: "view"
|
|
36845
36970
|
},
|
|
36971
|
+
"recording.getPlacement": {
|
|
36972
|
+
capName: "recording",
|
|
36973
|
+
capScope: "system",
|
|
36974
|
+
addonId: null,
|
|
36975
|
+
access: "view"
|
|
36976
|
+
},
|
|
36846
36977
|
"recording.getPlaybackManifest": {
|
|
36847
36978
|
capName: "recording",
|
|
36848
36979
|
capScope: "system",
|
|
@@ -36969,6 +37100,12 @@ Object.freeze({
|
|
|
36969
37100
|
addonId: null,
|
|
36970
37101
|
access: "create"
|
|
36971
37102
|
},
|
|
37103
|
+
"recording.setDevicePlacement": {
|
|
37104
|
+
capName: "recording",
|
|
37105
|
+
capScope: "system",
|
|
37106
|
+
addonId: null,
|
|
37107
|
+
access: "create"
|
|
37108
|
+
},
|
|
36972
37109
|
"recording.startStorageMigrationMove": {
|
|
36973
37110
|
capName: "recording",
|
|
36974
37111
|
capScope: "system",
|
|
@@ -37413,12 +37550,36 @@ Object.freeze({
|
|
|
37413
37550
|
addonId: null,
|
|
37414
37551
|
access: "create"
|
|
37415
37552
|
},
|
|
37553
|
+
"storageMigration.cleanupCancel": {
|
|
37554
|
+
capName: "storage-migration",
|
|
37555
|
+
capScope: "system",
|
|
37556
|
+
addonId: null,
|
|
37557
|
+
access: "create"
|
|
37558
|
+
},
|
|
37559
|
+
"storageMigration.cleanupStart": {
|
|
37560
|
+
capName: "storage-migration",
|
|
37561
|
+
capScope: "system",
|
|
37562
|
+
addonId: null,
|
|
37563
|
+
access: "create"
|
|
37564
|
+
},
|
|
37565
|
+
"storageMigration.cleanupStatus": {
|
|
37566
|
+
capName: "storage-migration",
|
|
37567
|
+
capScope: "system",
|
|
37568
|
+
addonId: null,
|
|
37569
|
+
access: "view"
|
|
37570
|
+
},
|
|
37416
37571
|
"storageMigration.drain": {
|
|
37417
37572
|
capName: "storage-migration",
|
|
37418
37573
|
capScope: "system",
|
|
37419
37574
|
addonId: null,
|
|
37420
37575
|
access: "create"
|
|
37421
37576
|
},
|
|
37577
|
+
"storageMigration.history": {
|
|
37578
|
+
capName: "storage-migration",
|
|
37579
|
+
capScope: "system",
|
|
37580
|
+
addonId: null,
|
|
37581
|
+
access: "view"
|
|
37582
|
+
},
|
|
37422
37583
|
"storageMigration.movers": {
|
|
37423
37584
|
capName: "storage-migration",
|
|
37424
37585
|
capScope: "system",
|
|
@@ -39415,11 +39576,6 @@ Object.freeze({
|
|
|
39415
39576
|
form: "single",
|
|
39416
39577
|
optional: true
|
|
39417
39578
|
}],
|
|
39418
|
-
"pipelineAnalytics.getGroup": [{
|
|
39419
|
-
name: "deviceId",
|
|
39420
|
-
form: "single",
|
|
39421
|
-
optional: false
|
|
39422
|
-
}],
|
|
39423
39579
|
"pipelineAnalytics.getKeyEvents": [{
|
|
39424
39580
|
name: "deviceId",
|
|
39425
39581
|
form: "single",
|
|
@@ -39485,11 +39641,6 @@ Object.freeze({
|
|
|
39485
39641
|
form: "single",
|
|
39486
39642
|
optional: false
|
|
39487
39643
|
}],
|
|
39488
|
-
"pipelineAnalytics.listGroups": [{
|
|
39489
|
-
name: "deviceIds",
|
|
39490
|
-
form: "array",
|
|
39491
|
-
optional: false
|
|
39492
|
-
}],
|
|
39493
39644
|
"pipelineAnalytics.listOpsLog": [{
|
|
39494
39645
|
name: "deviceId",
|
|
39495
39646
|
form: "single",
|
|
@@ -39535,6 +39686,11 @@ Object.freeze({
|
|
|
39535
39686
|
form: "single",
|
|
39536
39687
|
optional: true
|
|
39537
39688
|
}],
|
|
39689
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
39690
|
+
name: "deviceIds",
|
|
39691
|
+
form: "array",
|
|
39692
|
+
optional: true
|
|
39693
|
+
}],
|
|
39538
39694
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
39539
39695
|
name: "deviceId",
|
|
39540
39696
|
form: "single",
|
|
@@ -39900,6 +40056,11 @@ Object.freeze({
|
|
|
39900
40056
|
form: "single",
|
|
39901
40057
|
optional: false
|
|
39902
40058
|
}],
|
|
40059
|
+
"recording.setDevicePlacement": [{
|
|
40060
|
+
name: "deviceId",
|
|
40061
|
+
form: "single",
|
|
40062
|
+
optional: false
|
|
40063
|
+
}],
|
|
39903
40064
|
"recording.startStorageMigrationMove": [{
|
|
39904
40065
|
name: "deviceId",
|
|
39905
40066
|
form: "single",
|