@camstack/addon-terminal 0.1.54 → 0.1.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/addon.js +236 -73
- package/dist/addon.mjs +236 -73
- package/package.json +1 -1
package/dist/addon.js
CHANGED
|
@@ -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()
|
|
@@ -15841,6 +15919,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
15841
15919
|
"device-offline",
|
|
15842
15920
|
"device-disabled",
|
|
15843
15921
|
"device-enabled",
|
|
15922
|
+
"device-battery-low",
|
|
15923
|
+
"device-battery-normal",
|
|
15844
15924
|
"stream-online",
|
|
15845
15925
|
"stream-offline",
|
|
15846
15926
|
"node-online",
|
|
@@ -19099,46 +19179,6 @@ var RecentTracksPageSchema = object({
|
|
|
19099
19179
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19100
19180
|
nextCursor: string().nullable()
|
|
19101
19181
|
});
|
|
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
19182
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19143
19183
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19144
19184
|
var KeyEventQueryInput = object({
|
|
@@ -19242,9 +19282,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19242
19282
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19243
19283
|
plates: number().int(),
|
|
19244
19284
|
/** 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()
|
|
19285
|
+
embeddings: number().int()
|
|
19248
19286
|
});
|
|
19249
19287
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19250
19288
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19414,6 +19452,47 @@ var RebuildStatusSchema = object({
|
|
|
19414
19452
|
/** Present when the pass ended by throwing. */
|
|
19415
19453
|
error: string().nullable()
|
|
19416
19454
|
});
|
|
19455
|
+
/**
|
|
19456
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19457
|
+
*
|
|
19458
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19459
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19460
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19461
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19462
|
+
*/
|
|
19463
|
+
var MediaReclaimStartResultSchema = object({
|
|
19464
|
+
started: boolean(),
|
|
19465
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19466
|
+
alreadyRunning: boolean()
|
|
19467
|
+
});
|
|
19468
|
+
var MediaReclaimInputSchema = object({
|
|
19469
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19470
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19471
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19472
|
+
restart: boolean().optional(),
|
|
19473
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19474
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19475
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19476
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19477
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19478
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19479
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19480
|
+
});
|
|
19481
|
+
var MediaReclaimStatusSchema = object({
|
|
19482
|
+
running: boolean(),
|
|
19483
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19484
|
+
totalExamined: number(),
|
|
19485
|
+
totalEligible: number(),
|
|
19486
|
+
totalReclaimed: number(),
|
|
19487
|
+
totalBytesReclaimed: number(),
|
|
19488
|
+
totalRefused: number(),
|
|
19489
|
+
/** Device+scope windows finished in this pass. */
|
|
19490
|
+
devicesDone: number(),
|
|
19491
|
+
complete: boolean().nullable(),
|
|
19492
|
+
startedAtMs: number().nullable(),
|
|
19493
|
+
finishedAtMs: number().nullable(),
|
|
19494
|
+
error: string().nullable()
|
|
19495
|
+
});
|
|
19417
19496
|
var ReplayFrameInputSchema = object({
|
|
19418
19497
|
timestamp: number(),
|
|
19419
19498
|
frame: PipelineRunResultBridge
|
|
@@ -19452,10 +19531,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19452
19531
|
* stationary registry). Default false: the timeline lists passages,
|
|
19453
19532
|
* not parking records (operator decision, 2026-08-15). */
|
|
19454
19533
|
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(), {
|
|
19534
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19459
19535
|
kind: "mutation",
|
|
19460
19536
|
auth: "admin"
|
|
19461
19537
|
}), 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 +19631,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19555
19631
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19556
19632
|
kind: "query",
|
|
19557
19633
|
auth: "admin"
|
|
19634
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19635
|
+
kind: "mutation",
|
|
19636
|
+
auth: "admin"
|
|
19637
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19638
|
+
kind: "query",
|
|
19639
|
+
auth: "admin"
|
|
19558
19640
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19559
19641
|
kind: "query",
|
|
19560
19642
|
auth: "admin"
|
|
@@ -21629,7 +21711,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21629
21711
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21630
21712
|
kind: "mutation",
|
|
21631
21713
|
auth: "admin"
|
|
21632
|
-
})
|
|
21714
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21715
|
+
kind: "mutation",
|
|
21716
|
+
auth: "admin"
|
|
21717
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21718
|
+
kind: "mutation",
|
|
21719
|
+
auth: "admin"
|
|
21720
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21633
21721
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21634
21722
|
providerId: string().min(1),
|
|
21635
21723
|
displayName: string().min(1),
|
|
@@ -28766,6 +28854,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
28766
28854
|
minMoveGb: number().min(0).optional()
|
|
28767
28855
|
});
|
|
28768
28856
|
/**
|
|
28857
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
28858
|
+
*
|
|
28859
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
28860
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
28861
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
28862
|
+
*/
|
|
28863
|
+
var RecordingDevicePlacementSchema = object({
|
|
28864
|
+
deviceId: number().int(),
|
|
28865
|
+
profile: string(),
|
|
28866
|
+
locationId: string()
|
|
28867
|
+
});
|
|
28868
|
+
var RecordingDevicePinSchema = object({
|
|
28869
|
+
deviceId: number().int(),
|
|
28870
|
+
/** Recordings-class location this camera is pinned to. */
|
|
28871
|
+
locationId: string()
|
|
28872
|
+
});
|
|
28873
|
+
var RecordingPlacementViewSchema = object({
|
|
28874
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
28875
|
+
pins: array(RecordingDevicePinSchema),
|
|
28876
|
+
defaultLocations: record(string(), string())
|
|
28877
|
+
});
|
|
28878
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
28879
|
+
deviceId: number().int(),
|
|
28880
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
28881
|
+
locationId: string().nullable()
|
|
28882
|
+
});
|
|
28883
|
+
/**
|
|
28769
28884
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
28770
28885
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
28771
28886
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -28991,6 +29106,12 @@ method(object({
|
|
|
28991
29106
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
28992
29107
|
kind: "mutation",
|
|
28993
29108
|
auth: "admin"
|
|
29109
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
29110
|
+
kind: "query",
|
|
29111
|
+
auth: "admin"
|
|
29112
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
29113
|
+
kind: "mutation",
|
|
29114
|
+
auth: "admin"
|
|
28994
29115
|
});
|
|
28995
29116
|
/**
|
|
28996
29117
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -34058,6 +34179,12 @@ Object.freeze({
|
|
|
34058
34179
|
addonId: null,
|
|
34059
34180
|
access: "delete"
|
|
34060
34181
|
},
|
|
34182
|
+
"deviceManager.renameLocation": {
|
|
34183
|
+
capName: "device-manager",
|
|
34184
|
+
capScope: "system",
|
|
34185
|
+
addonId: null,
|
|
34186
|
+
access: "create"
|
|
34187
|
+
},
|
|
34061
34188
|
"deviceManager.runDeviceAction": {
|
|
34062
34189
|
capName: "device-manager",
|
|
34063
34190
|
capScope: "system",
|
|
@@ -35750,19 +35877,19 @@ Object.freeze({
|
|
|
35750
35877
|
addonId: null,
|
|
35751
35878
|
access: "view"
|
|
35752
35879
|
},
|
|
35753
|
-
"pipelineAnalytics.
|
|
35880
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
35754
35881
|
capName: "pipeline-analytics",
|
|
35755
35882
|
capScope: "device",
|
|
35756
35883
|
addonId: null,
|
|
35757
35884
|
access: "view"
|
|
35758
35885
|
},
|
|
35759
|
-
"pipelineAnalytics.
|
|
35886
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
35760
35887
|
capName: "pipeline-analytics",
|
|
35761
35888
|
capScope: "device",
|
|
35762
35889
|
addonId: null,
|
|
35763
35890
|
access: "view"
|
|
35764
35891
|
},
|
|
35765
|
-
"pipelineAnalytics.
|
|
35892
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
35766
35893
|
capName: "pipeline-analytics",
|
|
35767
35894
|
capScope: "device",
|
|
35768
35895
|
addonId: null,
|
|
@@ -35852,12 +35979,6 @@ Object.freeze({
|
|
|
35852
35979
|
addonId: null,
|
|
35853
35980
|
access: "view"
|
|
35854
35981
|
},
|
|
35855
|
-
"pipelineAnalytics.listGroups": {
|
|
35856
|
-
capName: "pipeline-analytics",
|
|
35857
|
-
capScope: "device",
|
|
35858
|
-
addonId: null,
|
|
35859
|
-
access: "view"
|
|
35860
|
-
},
|
|
35861
35982
|
"pipelineAnalytics.listOpsLog": {
|
|
35862
35983
|
capName: "pipeline-analytics",
|
|
35863
35984
|
capScope: "device",
|
|
@@ -35942,6 +36063,12 @@ Object.freeze({
|
|
|
35942
36063
|
addonId: null,
|
|
35943
36064
|
access: "create"
|
|
35944
36065
|
},
|
|
36066
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
36067
|
+
capName: "pipeline-analytics",
|
|
36068
|
+
capScope: "device",
|
|
36069
|
+
addonId: null,
|
|
36070
|
+
access: "create"
|
|
36071
|
+
},
|
|
35945
36072
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
35946
36073
|
capName: "pipeline-analytics",
|
|
35947
36074
|
capScope: "device",
|
|
@@ -36866,6 +36993,12 @@ Object.freeze({
|
|
|
36866
36993
|
addonId: null,
|
|
36867
36994
|
access: "view"
|
|
36868
36995
|
},
|
|
36996
|
+
"recording.getPlacement": {
|
|
36997
|
+
capName: "recording",
|
|
36998
|
+
capScope: "system",
|
|
36999
|
+
addonId: null,
|
|
37000
|
+
access: "view"
|
|
37001
|
+
},
|
|
36869
37002
|
"recording.getPlaybackManifest": {
|
|
36870
37003
|
capName: "recording",
|
|
36871
37004
|
capScope: "system",
|
|
@@ -36992,6 +37125,12 @@ Object.freeze({
|
|
|
36992
37125
|
addonId: null,
|
|
36993
37126
|
access: "create"
|
|
36994
37127
|
},
|
|
37128
|
+
"recording.setDevicePlacement": {
|
|
37129
|
+
capName: "recording",
|
|
37130
|
+
capScope: "system",
|
|
37131
|
+
addonId: null,
|
|
37132
|
+
access: "create"
|
|
37133
|
+
},
|
|
36995
37134
|
"recording.startStorageMigrationMove": {
|
|
36996
37135
|
capName: "recording",
|
|
36997
37136
|
capScope: "system",
|
|
@@ -37436,12 +37575,36 @@ Object.freeze({
|
|
|
37436
37575
|
addonId: null,
|
|
37437
37576
|
access: "create"
|
|
37438
37577
|
},
|
|
37578
|
+
"storageMigration.cleanupCancel": {
|
|
37579
|
+
capName: "storage-migration",
|
|
37580
|
+
capScope: "system",
|
|
37581
|
+
addonId: null,
|
|
37582
|
+
access: "create"
|
|
37583
|
+
},
|
|
37584
|
+
"storageMigration.cleanupStart": {
|
|
37585
|
+
capName: "storage-migration",
|
|
37586
|
+
capScope: "system",
|
|
37587
|
+
addonId: null,
|
|
37588
|
+
access: "create"
|
|
37589
|
+
},
|
|
37590
|
+
"storageMigration.cleanupStatus": {
|
|
37591
|
+
capName: "storage-migration",
|
|
37592
|
+
capScope: "system",
|
|
37593
|
+
addonId: null,
|
|
37594
|
+
access: "view"
|
|
37595
|
+
},
|
|
37439
37596
|
"storageMigration.drain": {
|
|
37440
37597
|
capName: "storage-migration",
|
|
37441
37598
|
capScope: "system",
|
|
37442
37599
|
addonId: null,
|
|
37443
37600
|
access: "create"
|
|
37444
37601
|
},
|
|
37602
|
+
"storageMigration.history": {
|
|
37603
|
+
capName: "storage-migration",
|
|
37604
|
+
capScope: "system",
|
|
37605
|
+
addonId: null,
|
|
37606
|
+
access: "view"
|
|
37607
|
+
},
|
|
37445
37608
|
"storageMigration.movers": {
|
|
37446
37609
|
capName: "storage-migration",
|
|
37447
37610
|
capScope: "system",
|
|
@@ -39438,11 +39601,6 @@ Object.freeze({
|
|
|
39438
39601
|
form: "single",
|
|
39439
39602
|
optional: true
|
|
39440
39603
|
}],
|
|
39441
|
-
"pipelineAnalytics.getGroup": [{
|
|
39442
|
-
name: "deviceId",
|
|
39443
|
-
form: "single",
|
|
39444
|
-
optional: false
|
|
39445
|
-
}],
|
|
39446
39604
|
"pipelineAnalytics.getKeyEvents": [{
|
|
39447
39605
|
name: "deviceId",
|
|
39448
39606
|
form: "single",
|
|
@@ -39508,11 +39666,6 @@ Object.freeze({
|
|
|
39508
39666
|
form: "single",
|
|
39509
39667
|
optional: false
|
|
39510
39668
|
}],
|
|
39511
|
-
"pipelineAnalytics.listGroups": [{
|
|
39512
|
-
name: "deviceIds",
|
|
39513
|
-
form: "array",
|
|
39514
|
-
optional: false
|
|
39515
|
-
}],
|
|
39516
39669
|
"pipelineAnalytics.listOpsLog": [{
|
|
39517
39670
|
name: "deviceId",
|
|
39518
39671
|
form: "single",
|
|
@@ -39558,6 +39711,11 @@ Object.freeze({
|
|
|
39558
39711
|
form: "single",
|
|
39559
39712
|
optional: true
|
|
39560
39713
|
}],
|
|
39714
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
39715
|
+
name: "deviceIds",
|
|
39716
|
+
form: "array",
|
|
39717
|
+
optional: true
|
|
39718
|
+
}],
|
|
39561
39719
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
39562
39720
|
name: "deviceId",
|
|
39563
39721
|
form: "single",
|
|
@@ -39923,6 +40081,11 @@ Object.freeze({
|
|
|
39923
40081
|
form: "single",
|
|
39924
40082
|
optional: false
|
|
39925
40083
|
}],
|
|
40084
|
+
"recording.setDevicePlacement": [{
|
|
40085
|
+
name: "deviceId",
|
|
40086
|
+
form: "single",
|
|
40087
|
+
optional: false
|
|
40088
|
+
}],
|
|
39926
40089
|
"recording.startStorageMigrationMove": [{
|
|
39927
40090
|
name: "deviceId",
|
|
39928
40091
|
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()
|
|
@@ -15818,6 +15896,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
15818
15896
|
"device-offline",
|
|
15819
15897
|
"device-disabled",
|
|
15820
15898
|
"device-enabled",
|
|
15899
|
+
"device-battery-low",
|
|
15900
|
+
"device-battery-normal",
|
|
15821
15901
|
"stream-online",
|
|
15822
15902
|
"stream-offline",
|
|
15823
15903
|
"node-online",
|
|
@@ -19076,46 +19156,6 @@ var RecentTracksPageSchema = object({
|
|
|
19076
19156
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19077
19157
|
nextCursor: string().nullable()
|
|
19078
19158
|
});
|
|
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
19159
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19120
19160
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19121
19161
|
var KeyEventQueryInput = object({
|
|
@@ -19219,9 +19259,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19219
19259
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19220
19260
|
plates: number().int(),
|
|
19221
19261
|
/** 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()
|
|
19262
|
+
embeddings: number().int()
|
|
19225
19263
|
});
|
|
19226
19264
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19227
19265
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19391,6 +19429,47 @@ var RebuildStatusSchema = object({
|
|
|
19391
19429
|
/** Present when the pass ended by throwing. */
|
|
19392
19430
|
error: string().nullable()
|
|
19393
19431
|
});
|
|
19432
|
+
/**
|
|
19433
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19434
|
+
*
|
|
19435
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19436
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19437
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19438
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19439
|
+
*/
|
|
19440
|
+
var MediaReclaimStartResultSchema = object({
|
|
19441
|
+
started: boolean(),
|
|
19442
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19443
|
+
alreadyRunning: boolean()
|
|
19444
|
+
});
|
|
19445
|
+
var MediaReclaimInputSchema = object({
|
|
19446
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19447
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19448
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19449
|
+
restart: boolean().optional(),
|
|
19450
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19451
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19452
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19453
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19454
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19455
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19456
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19457
|
+
});
|
|
19458
|
+
var MediaReclaimStatusSchema = object({
|
|
19459
|
+
running: boolean(),
|
|
19460
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19461
|
+
totalExamined: number(),
|
|
19462
|
+
totalEligible: number(),
|
|
19463
|
+
totalReclaimed: number(),
|
|
19464
|
+
totalBytesReclaimed: number(),
|
|
19465
|
+
totalRefused: number(),
|
|
19466
|
+
/** Device+scope windows finished in this pass. */
|
|
19467
|
+
devicesDone: number(),
|
|
19468
|
+
complete: boolean().nullable(),
|
|
19469
|
+
startedAtMs: number().nullable(),
|
|
19470
|
+
finishedAtMs: number().nullable(),
|
|
19471
|
+
error: string().nullable()
|
|
19472
|
+
});
|
|
19394
19473
|
var ReplayFrameInputSchema = object({
|
|
19395
19474
|
timestamp: number(),
|
|
19396
19475
|
frame: PipelineRunResultBridge
|
|
@@ -19429,10 +19508,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19429
19508
|
* stationary registry). Default false: the timeline lists passages,
|
|
19430
19509
|
* not parking records (operator decision, 2026-08-15). */
|
|
19431
19510
|
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(), {
|
|
19511
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19436
19512
|
kind: "mutation",
|
|
19437
19513
|
auth: "admin"
|
|
19438
19514
|
}), 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 +19608,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19532
19608
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19533
19609
|
kind: "query",
|
|
19534
19610
|
auth: "admin"
|
|
19611
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19612
|
+
kind: "mutation",
|
|
19613
|
+
auth: "admin"
|
|
19614
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19615
|
+
kind: "query",
|
|
19616
|
+
auth: "admin"
|
|
19535
19617
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19536
19618
|
kind: "query",
|
|
19537
19619
|
auth: "admin"
|
|
@@ -21606,7 +21688,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21606
21688
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21607
21689
|
kind: "mutation",
|
|
21608
21690
|
auth: "admin"
|
|
21609
|
-
})
|
|
21691
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21692
|
+
kind: "mutation",
|
|
21693
|
+
auth: "admin"
|
|
21694
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21695
|
+
kind: "mutation",
|
|
21696
|
+
auth: "admin"
|
|
21697
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21610
21698
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21611
21699
|
providerId: string().min(1),
|
|
21612
21700
|
displayName: string().min(1),
|
|
@@ -28743,6 +28831,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
28743
28831
|
minMoveGb: number().min(0).optional()
|
|
28744
28832
|
});
|
|
28745
28833
|
/**
|
|
28834
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
28835
|
+
*
|
|
28836
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
28837
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
28838
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
28839
|
+
*/
|
|
28840
|
+
var RecordingDevicePlacementSchema = object({
|
|
28841
|
+
deviceId: number().int(),
|
|
28842
|
+
profile: string(),
|
|
28843
|
+
locationId: string()
|
|
28844
|
+
});
|
|
28845
|
+
var RecordingDevicePinSchema = object({
|
|
28846
|
+
deviceId: number().int(),
|
|
28847
|
+
/** Recordings-class location this camera is pinned to. */
|
|
28848
|
+
locationId: string()
|
|
28849
|
+
});
|
|
28850
|
+
var RecordingPlacementViewSchema = object({
|
|
28851
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
28852
|
+
pins: array(RecordingDevicePinSchema),
|
|
28853
|
+
defaultLocations: record(string(), string())
|
|
28854
|
+
});
|
|
28855
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
28856
|
+
deviceId: number().int(),
|
|
28857
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
28858
|
+
locationId: string().nullable()
|
|
28859
|
+
});
|
|
28860
|
+
/**
|
|
28746
28861
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
28747
28862
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
28748
28863
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -28968,6 +29083,12 @@ method(object({
|
|
|
28968
29083
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
28969
29084
|
kind: "mutation",
|
|
28970
29085
|
auth: "admin"
|
|
29086
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
29087
|
+
kind: "query",
|
|
29088
|
+
auth: "admin"
|
|
29089
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
29090
|
+
kind: "mutation",
|
|
29091
|
+
auth: "admin"
|
|
28971
29092
|
});
|
|
28972
29093
|
/**
|
|
28973
29094
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -34035,6 +34156,12 @@ Object.freeze({
|
|
|
34035
34156
|
addonId: null,
|
|
34036
34157
|
access: "delete"
|
|
34037
34158
|
},
|
|
34159
|
+
"deviceManager.renameLocation": {
|
|
34160
|
+
capName: "device-manager",
|
|
34161
|
+
capScope: "system",
|
|
34162
|
+
addonId: null,
|
|
34163
|
+
access: "create"
|
|
34164
|
+
},
|
|
34038
34165
|
"deviceManager.runDeviceAction": {
|
|
34039
34166
|
capName: "device-manager",
|
|
34040
34167
|
capScope: "system",
|
|
@@ -35727,19 +35854,19 @@ Object.freeze({
|
|
|
35727
35854
|
addonId: null,
|
|
35728
35855
|
access: "view"
|
|
35729
35856
|
},
|
|
35730
|
-
"pipelineAnalytics.
|
|
35857
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
35731
35858
|
capName: "pipeline-analytics",
|
|
35732
35859
|
capScope: "device",
|
|
35733
35860
|
addonId: null,
|
|
35734
35861
|
access: "view"
|
|
35735
35862
|
},
|
|
35736
|
-
"pipelineAnalytics.
|
|
35863
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
35737
35864
|
capName: "pipeline-analytics",
|
|
35738
35865
|
capScope: "device",
|
|
35739
35866
|
addonId: null,
|
|
35740
35867
|
access: "view"
|
|
35741
35868
|
},
|
|
35742
|
-
"pipelineAnalytics.
|
|
35869
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
35743
35870
|
capName: "pipeline-analytics",
|
|
35744
35871
|
capScope: "device",
|
|
35745
35872
|
addonId: null,
|
|
@@ -35829,12 +35956,6 @@ Object.freeze({
|
|
|
35829
35956
|
addonId: null,
|
|
35830
35957
|
access: "view"
|
|
35831
35958
|
},
|
|
35832
|
-
"pipelineAnalytics.listGroups": {
|
|
35833
|
-
capName: "pipeline-analytics",
|
|
35834
|
-
capScope: "device",
|
|
35835
|
-
addonId: null,
|
|
35836
|
-
access: "view"
|
|
35837
|
-
},
|
|
35838
35959
|
"pipelineAnalytics.listOpsLog": {
|
|
35839
35960
|
capName: "pipeline-analytics",
|
|
35840
35961
|
capScope: "device",
|
|
@@ -35919,6 +36040,12 @@ Object.freeze({
|
|
|
35919
36040
|
addonId: null,
|
|
35920
36041
|
access: "create"
|
|
35921
36042
|
},
|
|
36043
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
36044
|
+
capName: "pipeline-analytics",
|
|
36045
|
+
capScope: "device",
|
|
36046
|
+
addonId: null,
|
|
36047
|
+
access: "create"
|
|
36048
|
+
},
|
|
35922
36049
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
35923
36050
|
capName: "pipeline-analytics",
|
|
35924
36051
|
capScope: "device",
|
|
@@ -36843,6 +36970,12 @@ Object.freeze({
|
|
|
36843
36970
|
addonId: null,
|
|
36844
36971
|
access: "view"
|
|
36845
36972
|
},
|
|
36973
|
+
"recording.getPlacement": {
|
|
36974
|
+
capName: "recording",
|
|
36975
|
+
capScope: "system",
|
|
36976
|
+
addonId: null,
|
|
36977
|
+
access: "view"
|
|
36978
|
+
},
|
|
36846
36979
|
"recording.getPlaybackManifest": {
|
|
36847
36980
|
capName: "recording",
|
|
36848
36981
|
capScope: "system",
|
|
@@ -36969,6 +37102,12 @@ Object.freeze({
|
|
|
36969
37102
|
addonId: null,
|
|
36970
37103
|
access: "create"
|
|
36971
37104
|
},
|
|
37105
|
+
"recording.setDevicePlacement": {
|
|
37106
|
+
capName: "recording",
|
|
37107
|
+
capScope: "system",
|
|
37108
|
+
addonId: null,
|
|
37109
|
+
access: "create"
|
|
37110
|
+
},
|
|
36972
37111
|
"recording.startStorageMigrationMove": {
|
|
36973
37112
|
capName: "recording",
|
|
36974
37113
|
capScope: "system",
|
|
@@ -37413,12 +37552,36 @@ Object.freeze({
|
|
|
37413
37552
|
addonId: null,
|
|
37414
37553
|
access: "create"
|
|
37415
37554
|
},
|
|
37555
|
+
"storageMigration.cleanupCancel": {
|
|
37556
|
+
capName: "storage-migration",
|
|
37557
|
+
capScope: "system",
|
|
37558
|
+
addonId: null,
|
|
37559
|
+
access: "create"
|
|
37560
|
+
},
|
|
37561
|
+
"storageMigration.cleanupStart": {
|
|
37562
|
+
capName: "storage-migration",
|
|
37563
|
+
capScope: "system",
|
|
37564
|
+
addonId: null,
|
|
37565
|
+
access: "create"
|
|
37566
|
+
},
|
|
37567
|
+
"storageMigration.cleanupStatus": {
|
|
37568
|
+
capName: "storage-migration",
|
|
37569
|
+
capScope: "system",
|
|
37570
|
+
addonId: null,
|
|
37571
|
+
access: "view"
|
|
37572
|
+
},
|
|
37416
37573
|
"storageMigration.drain": {
|
|
37417
37574
|
capName: "storage-migration",
|
|
37418
37575
|
capScope: "system",
|
|
37419
37576
|
addonId: null,
|
|
37420
37577
|
access: "create"
|
|
37421
37578
|
},
|
|
37579
|
+
"storageMigration.history": {
|
|
37580
|
+
capName: "storage-migration",
|
|
37581
|
+
capScope: "system",
|
|
37582
|
+
addonId: null,
|
|
37583
|
+
access: "view"
|
|
37584
|
+
},
|
|
37422
37585
|
"storageMigration.movers": {
|
|
37423
37586
|
capName: "storage-migration",
|
|
37424
37587
|
capScope: "system",
|
|
@@ -39415,11 +39578,6 @@ Object.freeze({
|
|
|
39415
39578
|
form: "single",
|
|
39416
39579
|
optional: true
|
|
39417
39580
|
}],
|
|
39418
|
-
"pipelineAnalytics.getGroup": [{
|
|
39419
|
-
name: "deviceId",
|
|
39420
|
-
form: "single",
|
|
39421
|
-
optional: false
|
|
39422
|
-
}],
|
|
39423
39581
|
"pipelineAnalytics.getKeyEvents": [{
|
|
39424
39582
|
name: "deviceId",
|
|
39425
39583
|
form: "single",
|
|
@@ -39485,11 +39643,6 @@ Object.freeze({
|
|
|
39485
39643
|
form: "single",
|
|
39486
39644
|
optional: false
|
|
39487
39645
|
}],
|
|
39488
|
-
"pipelineAnalytics.listGroups": [{
|
|
39489
|
-
name: "deviceIds",
|
|
39490
|
-
form: "array",
|
|
39491
|
-
optional: false
|
|
39492
|
-
}],
|
|
39493
39646
|
"pipelineAnalytics.listOpsLog": [{
|
|
39494
39647
|
name: "deviceId",
|
|
39495
39648
|
form: "single",
|
|
@@ -39535,6 +39688,11 @@ Object.freeze({
|
|
|
39535
39688
|
form: "single",
|
|
39536
39689
|
optional: true
|
|
39537
39690
|
}],
|
|
39691
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
39692
|
+
name: "deviceIds",
|
|
39693
|
+
form: "array",
|
|
39694
|
+
optional: true
|
|
39695
|
+
}],
|
|
39538
39696
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
39539
39697
|
name: "deviceId",
|
|
39540
39698
|
form: "single",
|
|
@@ -39900,6 +40058,11 @@ Object.freeze({
|
|
|
39900
40058
|
form: "single",
|
|
39901
40059
|
optional: false
|
|
39902
40060
|
}],
|
|
40061
|
+
"recording.setDevicePlacement": [{
|
|
40062
|
+
name: "deviceId",
|
|
40063
|
+
form: "single",
|
|
40064
|
+
optional: false
|
|
40065
|
+
}],
|
|
39903
40066
|
"recording.startStorageMigrationMove": [{
|
|
39904
40067
|
name: "deviceId",
|
|
39905
40068
|
form: "single",
|