@camstack/addon-provider-rtsp 1.2.49 → 1.2.50
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
|
@@ -8152,6 +8152,13 @@ var MediaRelocateModeSchema = _enum([
|
|
|
8152
8152
|
]);
|
|
8153
8153
|
var RelocateMediaInputSchema = object({
|
|
8154
8154
|
toLocationId: string(),
|
|
8155
|
+
/**
|
|
8156
|
+
* Restrict the pass to rows currently on this location. Omitted / `'*'` =
|
|
8157
|
+
* every row that is not already on `toLocationId` (the historical
|
|
8158
|
+
* behaviour). A named source is what a from→to migration needs: without it
|
|
8159
|
+
* "move events off disk 2" also emptied disk 1.
|
|
8160
|
+
*/
|
|
8161
|
+
fromLocationId: string().optional(),
|
|
8155
8162
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8156
8163
|
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8157
8164
|
mode: MediaRelocateModeSchema.optional()
|
|
@@ -8219,6 +8226,19 @@ var StorageMigrationDestinationsSchema = object({
|
|
|
8219
8226
|
galleryMedia: string().min(1).optional()
|
|
8220
8227
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8221
8228
|
/**
|
|
8229
|
+
* Optional named source per class. Omitted = the class's current default
|
|
8230
|
+
* (the historical behaviour). A named source that is NOT the default is a
|
|
8231
|
+
* drain of that disk: bytes move, the default stays, and the source is
|
|
8232
|
+
* disabled when the move finishes.
|
|
8233
|
+
*/
|
|
8234
|
+
var StorageMigrationSourcesSchema = object({
|
|
8235
|
+
recordings: string().min(1).optional(),
|
|
8236
|
+
recordingsLow: string().min(1).optional(),
|
|
8237
|
+
eventMedia: string().min(1).optional(),
|
|
8238
|
+
backups: string().min(1).optional(),
|
|
8239
|
+
galleryMedia: string().min(1).optional()
|
|
8240
|
+
}).optional();
|
|
8241
|
+
/**
|
|
8222
8242
|
* How a migration sequences the cutover against the byte move.
|
|
8223
8243
|
*
|
|
8224
8244
|
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
@@ -8240,6 +8260,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
|
8240
8260
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8241
8261
|
var StorageMigrationInputSchema = object({
|
|
8242
8262
|
destinations: StorageMigrationDestinationsSchema,
|
|
8263
|
+
/** Omitted = each class's current default. */
|
|
8264
|
+
sources: StorageMigrationSourcesSchema,
|
|
8243
8265
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8244
8266
|
/** Omitted = `blocking`, which stays the default. */
|
|
8245
8267
|
mode: StorageMigrationModeSchema.optional()
|
|
@@ -8319,6 +8341,13 @@ var StorageMigrationMoveSchema = object({
|
|
|
8319
8341
|
storageClass: StorageMigrationClassSchema,
|
|
8320
8342
|
fromLocationId: string(),
|
|
8321
8343
|
toLocationId: string(),
|
|
8344
|
+
/**
|
|
8345
|
+
* True when `from` was NOT the class default at plan time. The move still
|
|
8346
|
+
* copies bytes, but the default is left alone and the source is disabled
|
|
8347
|
+
* once the copy verifies. Absent on jobs planned before this field existed
|
|
8348
|
+
* — those jobs always repointed, which is `false`.
|
|
8349
|
+
*/
|
|
8350
|
+
freezeSource: boolean().optional(),
|
|
8322
8351
|
moverJobId: string().nullable(),
|
|
8323
8352
|
state: RelocateJobStateSchema.nullable(),
|
|
8324
8353
|
error: string().nullable(),
|
|
@@ -8332,6 +8361,7 @@ var StorageMigrationJobSchema = object({
|
|
|
8332
8361
|
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8333
8362
|
mode: StorageMigrationModeSchema,
|
|
8334
8363
|
destinations: StorageMigrationDestinationsSchema,
|
|
8364
|
+
sources: StorageMigrationSourcesSchema,
|
|
8335
8365
|
throttleMbps: number(),
|
|
8336
8366
|
moves: array(StorageMigrationMoveSchema),
|
|
8337
8367
|
pauseLeaseId: string().nullable(),
|
|
@@ -8357,6 +8387,7 @@ var StorageMigrationFindingSchema = object({
|
|
|
8357
8387
|
});
|
|
8358
8388
|
var StorageMigrationPlanSchema = object({
|
|
8359
8389
|
destinations: StorageMigrationDestinationsSchema,
|
|
8390
|
+
sources: StorageMigrationSourcesSchema,
|
|
8360
8391
|
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8361
8392
|
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8362
8393
|
* it. */
|
|
@@ -8364,7 +8395,8 @@ var StorageMigrationPlanSchema = object({
|
|
|
8364
8395
|
moves: array(object({
|
|
8365
8396
|
storageClass: StorageMigrationClassSchema,
|
|
8366
8397
|
fromLocationId: string(),
|
|
8367
|
-
toLocationId: string()
|
|
8398
|
+
toLocationId: string(),
|
|
8399
|
+
freezeSource: boolean().optional()
|
|
8368
8400
|
})),
|
|
8369
8401
|
findings: array(StorageMigrationFindingSchema)
|
|
8370
8402
|
});
|
|
@@ -8542,10 +8574,51 @@ var LedgerWalkReportSchema = object({
|
|
|
8542
8574
|
var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
|
|
8543
8575
|
var RelocatableMediaCountInputSchema = object({
|
|
8544
8576
|
toLocationId: string().min(1),
|
|
8577
|
+
/** Restrict the count to one source; omitted / `'*'` = every non-target row. */
|
|
8578
|
+
fromLocationId: string().optional(),
|
|
8545
8579
|
/** Omitted = `move`. */
|
|
8546
8580
|
mode: MediaRelocateModeSchema.optional()
|
|
8547
8581
|
});
|
|
8548
8582
|
/**
|
|
8583
|
+
* Operator cleanup of leftover analytics rows, optional debug media, and
|
|
8584
|
+
* ghost ledger entries on frozen footage locations.
|
|
8585
|
+
*
|
|
8586
|
+
* A pass is tens of minutes on a standing backlog. The hub method RETURNS
|
|
8587
|
+
* `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
|
|
8588
|
+
* is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
|
|
8589
|
+
* with no operator-visible status.
|
|
8590
|
+
*/
|
|
8591
|
+
var StorageCleanupPhaseSchema = _enum([
|
|
8592
|
+
"orphans",
|
|
8593
|
+
"debug-media",
|
|
8594
|
+
"ghost-ledger",
|
|
8595
|
+
"done",
|
|
8596
|
+
"failed",
|
|
8597
|
+
"cancelled"
|
|
8598
|
+
]);
|
|
8599
|
+
var StorageCleanupInputSchema = object({
|
|
8600
|
+
/** Also walk motion stills / track filmstrips. Off by default. */
|
|
8601
|
+
includeDebugMedia: boolean().optional() });
|
|
8602
|
+
var StorageCleanupJobSchema = object({
|
|
8603
|
+
jobId: string(),
|
|
8604
|
+
phase: StorageCleanupPhaseSchema,
|
|
8605
|
+
includeDebugMedia: boolean(),
|
|
8606
|
+
orphansReclaimed: number().int().nonnegative(),
|
|
8607
|
+
orphanBytesReclaimed: number().int().nonnegative(),
|
|
8608
|
+
debugMediaReclaimed: number().int().nonnegative(),
|
|
8609
|
+
debugMediaBytesReclaimed: number().int().nonnegative(),
|
|
8610
|
+
ghostsForgotten: number().int().nonnegative(),
|
|
8611
|
+
ghostBytesForgotten: number().int().nonnegative(),
|
|
8612
|
+
/** Short operator-facing line: current collection, pass, or location. */
|
|
8613
|
+
detail: string().nullable(),
|
|
8614
|
+
cancelRequested: boolean(),
|
|
8615
|
+
startedAt: number(),
|
|
8616
|
+
updatedAt: number(),
|
|
8617
|
+
finishedAt: number().nullable(),
|
|
8618
|
+
error: string().nullable()
|
|
8619
|
+
});
|
|
8620
|
+
var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
|
|
8621
|
+
/**
|
|
8549
8622
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
8550
8623
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
8551
8624
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -8573,11 +8646,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
|
|
|
8573
8646
|
* The default location for a type uses `id === <type>:default` by
|
|
8574
8647
|
* convention (the bare type ref like `'backups'` resolves to it).
|
|
8575
8648
|
*
|
|
8576
|
-
* `isSystem
|
|
8577
|
-
*
|
|
8578
|
-
*
|
|
8579
|
-
*
|
|
8580
|
-
* deleting it is rejected at the cap level.
|
|
8649
|
+
* `isSystem` is a legacy persisted flag. Seed still creates the initial
|
|
8650
|
+
* `<type>:default` locations; the flag is no longer a lock, a badge, or a
|
|
8651
|
+
* prune selector. New writes leave it false. Deletion is gated on uniqueness
|
|
8652
|
+
* / last-enabled, not on this bit.
|
|
8581
8653
|
*/
|
|
8582
8654
|
var StorageLocationSchema = object({
|
|
8583
8655
|
id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
|
|
@@ -13103,6 +13175,12 @@ method(object({
|
|
|
13103
13175
|
}), _void(), {
|
|
13104
13176
|
kind: "mutation",
|
|
13105
13177
|
auth: "admin"
|
|
13178
|
+
}), method(object({
|
|
13179
|
+
from: string(),
|
|
13180
|
+
to: string()
|
|
13181
|
+
}), object({ moved: number() }), {
|
|
13182
|
+
kind: "mutation",
|
|
13183
|
+
auth: "admin"
|
|
13106
13184
|
}), method(object({
|
|
13107
13185
|
deviceId: number(),
|
|
13108
13186
|
disabled: boolean()
|
|
@@ -19111,46 +19189,6 @@ var RecentTracksPageSchema = object({
|
|
|
19111
19189
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19112
19190
|
nextCursor: string().nullable()
|
|
19113
19191
|
});
|
|
19114
|
-
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
19115
|
-
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
19116
|
-
var AnalyticsGroupRecordSchema = object({
|
|
19117
|
-
id: string(),
|
|
19118
|
-
deviceId: number().int(),
|
|
19119
|
-
openedAt: number().int(),
|
|
19120
|
-
closedAt: number().int(),
|
|
19121
|
-
timestamp: number().int(),
|
|
19122
|
-
memberCount: number().int(),
|
|
19123
|
-
memberTrackIds: array(string()).readonly(),
|
|
19124
|
-
className: string(),
|
|
19125
|
-
classes: array(string()).readonly(),
|
|
19126
|
-
/** Relative event-media path, or null when the group has no picture yet. */
|
|
19127
|
-
mediaUrl: string().nullable(),
|
|
19128
|
-
singleton: boolean()
|
|
19129
|
-
});
|
|
19130
|
-
var AnalyticsGroupMemberSchema = object({
|
|
19131
|
-
trackId: string(),
|
|
19132
|
-
deviceId: number().int(),
|
|
19133
|
-
className: string(),
|
|
19134
|
-
firstSeen: number().int(),
|
|
19135
|
-
lastSeen: number().int(),
|
|
19136
|
-
mediaUrl: string().nullable()
|
|
19137
|
-
});
|
|
19138
|
-
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
19139
|
-
var ListGroupsQueryInput = object({
|
|
19140
|
-
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
19141
|
-
deviceIds: array(number()),
|
|
19142
|
-
/** Window lower bound on `closedAt` (inclusive). */
|
|
19143
|
-
since: number().optional(),
|
|
19144
|
-
/** Window upper bound on `openedAt` (inclusive). */
|
|
19145
|
-
until: number().optional(),
|
|
19146
|
-
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
19147
|
-
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
19148
|
-
cursor: string().optional()
|
|
19149
|
-
});
|
|
19150
|
-
var ListGroupsPageSchema = object({
|
|
19151
|
-
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
19152
|
-
nextCursor: string().nullable()
|
|
19153
|
-
});
|
|
19154
19192
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19155
19193
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19156
19194
|
var KeyEventQueryInput = object({
|
|
@@ -19254,9 +19292,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19254
19292
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19255
19293
|
plates: number().int(),
|
|
19256
19294
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
19257
|
-
embeddings: number().int()
|
|
19258
|
-
/** Group membership + group rows removed with their last member (best-effort). */
|
|
19259
|
-
groups: number().int()
|
|
19295
|
+
embeddings: number().int()
|
|
19260
19296
|
});
|
|
19261
19297
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19262
19298
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19426,6 +19462,47 @@ var RebuildStatusSchema = object({
|
|
|
19426
19462
|
/** Present when the pass ended by throwing. */
|
|
19427
19463
|
error: string().nullable()
|
|
19428
19464
|
});
|
|
19465
|
+
/**
|
|
19466
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19467
|
+
*
|
|
19468
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19469
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19470
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19471
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19472
|
+
*/
|
|
19473
|
+
var MediaReclaimStartResultSchema = object({
|
|
19474
|
+
started: boolean(),
|
|
19475
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19476
|
+
alreadyRunning: boolean()
|
|
19477
|
+
});
|
|
19478
|
+
var MediaReclaimInputSchema = object({
|
|
19479
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19480
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19481
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19482
|
+
restart: boolean().optional(),
|
|
19483
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19484
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19485
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19486
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19487
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19488
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19489
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19490
|
+
});
|
|
19491
|
+
var MediaReclaimStatusSchema = object({
|
|
19492
|
+
running: boolean(),
|
|
19493
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19494
|
+
totalExamined: number(),
|
|
19495
|
+
totalEligible: number(),
|
|
19496
|
+
totalReclaimed: number(),
|
|
19497
|
+
totalBytesReclaimed: number(),
|
|
19498
|
+
totalRefused: number(),
|
|
19499
|
+
/** Device+scope windows finished in this pass. */
|
|
19500
|
+
devicesDone: number(),
|
|
19501
|
+
complete: boolean().nullable(),
|
|
19502
|
+
startedAtMs: number().nullable(),
|
|
19503
|
+
finishedAtMs: number().nullable(),
|
|
19504
|
+
error: string().nullable()
|
|
19505
|
+
});
|
|
19429
19506
|
var ReplayFrameInputSchema = object({
|
|
19430
19507
|
timestamp: number(),
|
|
19431
19508
|
frame: PipelineRunResultBridge
|
|
@@ -19464,10 +19541,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19464
19541
|
* stationary registry). Default false: the timeline lists passages,
|
|
19465
19542
|
* not parking records (operator decision, 2026-08-15). */
|
|
19466
19543
|
includeStationary: boolean().optional()
|
|
19467
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
19468
|
-
deviceId: number(),
|
|
19469
|
-
groupId: string().min(1)
|
|
19470
|
-
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
19544
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19471
19545
|
kind: "mutation",
|
|
19472
19546
|
auth: "admin"
|
|
19473
19547
|
}), 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({
|
|
@@ -19567,6 +19641,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19567
19641
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19568
19642
|
kind: "query",
|
|
19569
19643
|
auth: "admin"
|
|
19644
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19645
|
+
kind: "mutation",
|
|
19646
|
+
auth: "admin"
|
|
19647
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19648
|
+
kind: "query",
|
|
19649
|
+
auth: "admin"
|
|
19570
19650
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19571
19651
|
kind: "query",
|
|
19572
19652
|
auth: "admin"
|
|
@@ -21641,7 +21721,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21641
21721
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21642
21722
|
kind: "mutation",
|
|
21643
21723
|
auth: "admin"
|
|
21644
|
-
})
|
|
21724
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21725
|
+
kind: "mutation",
|
|
21726
|
+
auth: "admin"
|
|
21727
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21728
|
+
kind: "mutation",
|
|
21729
|
+
auth: "admin"
|
|
21730
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21645
21731
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21646
21732
|
providerId: string().min(1),
|
|
21647
21733
|
displayName: string().min(1),
|
|
@@ -28742,6 +28828,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
28742
28828
|
minMoveGb: number().min(0).optional()
|
|
28743
28829
|
});
|
|
28744
28830
|
/**
|
|
28831
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
28832
|
+
*
|
|
28833
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
28834
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
28835
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
28836
|
+
*/
|
|
28837
|
+
var RecordingDevicePlacementSchema = object({
|
|
28838
|
+
deviceId: number().int(),
|
|
28839
|
+
profile: string(),
|
|
28840
|
+
locationId: string()
|
|
28841
|
+
});
|
|
28842
|
+
var RecordingDevicePinSchema = object({
|
|
28843
|
+
deviceId: number().int(),
|
|
28844
|
+
/** Recordings-class location this camera is pinned to. */
|
|
28845
|
+
locationId: string()
|
|
28846
|
+
});
|
|
28847
|
+
var RecordingPlacementViewSchema = object({
|
|
28848
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
28849
|
+
pins: array(RecordingDevicePinSchema),
|
|
28850
|
+
defaultLocations: record(string(), string())
|
|
28851
|
+
});
|
|
28852
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
28853
|
+
deviceId: number().int(),
|
|
28854
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
28855
|
+
locationId: string().nullable()
|
|
28856
|
+
});
|
|
28857
|
+
/**
|
|
28745
28858
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
28746
28859
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
28747
28860
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -28967,6 +29080,12 @@ method(object({
|
|
|
28967
29080
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
28968
29081
|
kind: "mutation",
|
|
28969
29082
|
auth: "admin"
|
|
29083
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
29084
|
+
kind: "query",
|
|
29085
|
+
auth: "admin"
|
|
29086
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
29087
|
+
kind: "mutation",
|
|
29088
|
+
auth: "admin"
|
|
28970
29089
|
});
|
|
28971
29090
|
/**
|
|
28972
29091
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -34102,6 +34221,12 @@ Object.freeze({
|
|
|
34102
34221
|
addonId: null,
|
|
34103
34222
|
access: "delete"
|
|
34104
34223
|
},
|
|
34224
|
+
"deviceManager.renameLocation": {
|
|
34225
|
+
capName: "device-manager",
|
|
34226
|
+
capScope: "system",
|
|
34227
|
+
addonId: null,
|
|
34228
|
+
access: "create"
|
|
34229
|
+
},
|
|
34105
34230
|
"deviceManager.runDeviceAction": {
|
|
34106
34231
|
capName: "device-manager",
|
|
34107
34232
|
capScope: "system",
|
|
@@ -35794,19 +35919,19 @@ Object.freeze({
|
|
|
35794
35919
|
addonId: null,
|
|
35795
35920
|
access: "view"
|
|
35796
35921
|
},
|
|
35797
|
-
"pipelineAnalytics.
|
|
35922
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
35798
35923
|
capName: "pipeline-analytics",
|
|
35799
35924
|
capScope: "device",
|
|
35800
35925
|
addonId: null,
|
|
35801
35926
|
access: "view"
|
|
35802
35927
|
},
|
|
35803
|
-
"pipelineAnalytics.
|
|
35928
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
35804
35929
|
capName: "pipeline-analytics",
|
|
35805
35930
|
capScope: "device",
|
|
35806
35931
|
addonId: null,
|
|
35807
35932
|
access: "view"
|
|
35808
35933
|
},
|
|
35809
|
-
"pipelineAnalytics.
|
|
35934
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
35810
35935
|
capName: "pipeline-analytics",
|
|
35811
35936
|
capScope: "device",
|
|
35812
35937
|
addonId: null,
|
|
@@ -35896,12 +36021,6 @@ Object.freeze({
|
|
|
35896
36021
|
addonId: null,
|
|
35897
36022
|
access: "view"
|
|
35898
36023
|
},
|
|
35899
|
-
"pipelineAnalytics.listGroups": {
|
|
35900
|
-
capName: "pipeline-analytics",
|
|
35901
|
-
capScope: "device",
|
|
35902
|
-
addonId: null,
|
|
35903
|
-
access: "view"
|
|
35904
|
-
},
|
|
35905
36024
|
"pipelineAnalytics.listOpsLog": {
|
|
35906
36025
|
capName: "pipeline-analytics",
|
|
35907
36026
|
capScope: "device",
|
|
@@ -35986,6 +36105,12 @@ Object.freeze({
|
|
|
35986
36105
|
addonId: null,
|
|
35987
36106
|
access: "create"
|
|
35988
36107
|
},
|
|
36108
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
36109
|
+
capName: "pipeline-analytics",
|
|
36110
|
+
capScope: "device",
|
|
36111
|
+
addonId: null,
|
|
36112
|
+
access: "create"
|
|
36113
|
+
},
|
|
35989
36114
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
35990
36115
|
capName: "pipeline-analytics",
|
|
35991
36116
|
capScope: "device",
|
|
@@ -36910,6 +37035,12 @@ Object.freeze({
|
|
|
36910
37035
|
addonId: null,
|
|
36911
37036
|
access: "view"
|
|
36912
37037
|
},
|
|
37038
|
+
"recording.getPlacement": {
|
|
37039
|
+
capName: "recording",
|
|
37040
|
+
capScope: "system",
|
|
37041
|
+
addonId: null,
|
|
37042
|
+
access: "view"
|
|
37043
|
+
},
|
|
36913
37044
|
"recording.getPlaybackManifest": {
|
|
36914
37045
|
capName: "recording",
|
|
36915
37046
|
capScope: "system",
|
|
@@ -37036,6 +37167,12 @@ Object.freeze({
|
|
|
37036
37167
|
addonId: null,
|
|
37037
37168
|
access: "create"
|
|
37038
37169
|
},
|
|
37170
|
+
"recording.setDevicePlacement": {
|
|
37171
|
+
capName: "recording",
|
|
37172
|
+
capScope: "system",
|
|
37173
|
+
addonId: null,
|
|
37174
|
+
access: "create"
|
|
37175
|
+
},
|
|
37039
37176
|
"recording.startStorageMigrationMove": {
|
|
37040
37177
|
capName: "recording",
|
|
37041
37178
|
capScope: "system",
|
|
@@ -37480,12 +37617,36 @@ Object.freeze({
|
|
|
37480
37617
|
addonId: null,
|
|
37481
37618
|
access: "create"
|
|
37482
37619
|
},
|
|
37620
|
+
"storageMigration.cleanupCancel": {
|
|
37621
|
+
capName: "storage-migration",
|
|
37622
|
+
capScope: "system",
|
|
37623
|
+
addonId: null,
|
|
37624
|
+
access: "create"
|
|
37625
|
+
},
|
|
37626
|
+
"storageMigration.cleanupStart": {
|
|
37627
|
+
capName: "storage-migration",
|
|
37628
|
+
capScope: "system",
|
|
37629
|
+
addonId: null,
|
|
37630
|
+
access: "create"
|
|
37631
|
+
},
|
|
37632
|
+
"storageMigration.cleanupStatus": {
|
|
37633
|
+
capName: "storage-migration",
|
|
37634
|
+
capScope: "system",
|
|
37635
|
+
addonId: null,
|
|
37636
|
+
access: "view"
|
|
37637
|
+
},
|
|
37483
37638
|
"storageMigration.drain": {
|
|
37484
37639
|
capName: "storage-migration",
|
|
37485
37640
|
capScope: "system",
|
|
37486
37641
|
addonId: null,
|
|
37487
37642
|
access: "create"
|
|
37488
37643
|
},
|
|
37644
|
+
"storageMigration.history": {
|
|
37645
|
+
capName: "storage-migration",
|
|
37646
|
+
capScope: "system",
|
|
37647
|
+
addonId: null,
|
|
37648
|
+
access: "view"
|
|
37649
|
+
},
|
|
37489
37650
|
"storageMigration.movers": {
|
|
37490
37651
|
capName: "storage-migration",
|
|
37491
37652
|
capScope: "system",
|
|
@@ -39482,11 +39643,6 @@ Object.freeze({
|
|
|
39482
39643
|
form: "single",
|
|
39483
39644
|
optional: true
|
|
39484
39645
|
}],
|
|
39485
|
-
"pipelineAnalytics.getGroup": [{
|
|
39486
|
-
name: "deviceId",
|
|
39487
|
-
form: "single",
|
|
39488
|
-
optional: false
|
|
39489
|
-
}],
|
|
39490
39646
|
"pipelineAnalytics.getKeyEvents": [{
|
|
39491
39647
|
name: "deviceId",
|
|
39492
39648
|
form: "single",
|
|
@@ -39552,11 +39708,6 @@ Object.freeze({
|
|
|
39552
39708
|
form: "single",
|
|
39553
39709
|
optional: false
|
|
39554
39710
|
}],
|
|
39555
|
-
"pipelineAnalytics.listGroups": [{
|
|
39556
|
-
name: "deviceIds",
|
|
39557
|
-
form: "array",
|
|
39558
|
-
optional: false
|
|
39559
|
-
}],
|
|
39560
39711
|
"pipelineAnalytics.listOpsLog": [{
|
|
39561
39712
|
name: "deviceId",
|
|
39562
39713
|
form: "single",
|
|
@@ -39602,6 +39753,11 @@ Object.freeze({
|
|
|
39602
39753
|
form: "single",
|
|
39603
39754
|
optional: true
|
|
39604
39755
|
}],
|
|
39756
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
39757
|
+
name: "deviceIds",
|
|
39758
|
+
form: "array",
|
|
39759
|
+
optional: true
|
|
39760
|
+
}],
|
|
39605
39761
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
39606
39762
|
name: "deviceId",
|
|
39607
39763
|
form: "single",
|
|
@@ -39967,6 +40123,11 @@ Object.freeze({
|
|
|
39967
40123
|
form: "single",
|
|
39968
40124
|
optional: false
|
|
39969
40125
|
}],
|
|
40126
|
+
"recording.setDevicePlacement": [{
|
|
40127
|
+
name: "deviceId",
|
|
40128
|
+
form: "single",
|
|
40129
|
+
optional: false
|
|
40130
|
+
}],
|
|
39970
40131
|
"recording.startStorageMigrationMove": [{
|
|
39971
40132
|
name: "deviceId",
|
|
39972
40133
|
form: "single",
|
package/dist/addon.mjs
CHANGED
|
@@ -8128,6 +8128,13 @@ var MediaRelocateModeSchema = _enum([
|
|
|
8128
8128
|
]);
|
|
8129
8129
|
var RelocateMediaInputSchema = object({
|
|
8130
8130
|
toLocationId: string(),
|
|
8131
|
+
/**
|
|
8132
|
+
* Restrict the pass to rows currently on this location. Omitted / `'*'` =
|
|
8133
|
+
* every row that is not already on `toLocationId` (the historical
|
|
8134
|
+
* behaviour). A named source is what a from→to migration needs: without it
|
|
8135
|
+
* "move events off disk 2" also emptied disk 1.
|
|
8136
|
+
*/
|
|
8137
|
+
fromLocationId: string().optional(),
|
|
8131
8138
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8132
8139
|
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8133
8140
|
mode: MediaRelocateModeSchema.optional()
|
|
@@ -8195,6 +8202,19 @@ var StorageMigrationDestinationsSchema = object({
|
|
|
8195
8202
|
galleryMedia: string().min(1).optional()
|
|
8196
8203
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8197
8204
|
/**
|
|
8205
|
+
* Optional named source per class. Omitted = the class's current default
|
|
8206
|
+
* (the historical behaviour). A named source that is NOT the default is a
|
|
8207
|
+
* drain of that disk: bytes move, the default stays, and the source is
|
|
8208
|
+
* disabled when the move finishes.
|
|
8209
|
+
*/
|
|
8210
|
+
var StorageMigrationSourcesSchema = object({
|
|
8211
|
+
recordings: string().min(1).optional(),
|
|
8212
|
+
recordingsLow: string().min(1).optional(),
|
|
8213
|
+
eventMedia: string().min(1).optional(),
|
|
8214
|
+
backups: string().min(1).optional(),
|
|
8215
|
+
galleryMedia: string().min(1).optional()
|
|
8216
|
+
}).optional();
|
|
8217
|
+
/**
|
|
8198
8218
|
* How a migration sequences the cutover against the byte move.
|
|
8199
8219
|
*
|
|
8200
8220
|
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
@@ -8216,6 +8236,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
|
8216
8236
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8217
8237
|
var StorageMigrationInputSchema = object({
|
|
8218
8238
|
destinations: StorageMigrationDestinationsSchema,
|
|
8239
|
+
/** Omitted = each class's current default. */
|
|
8240
|
+
sources: StorageMigrationSourcesSchema,
|
|
8219
8241
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8220
8242
|
/** Omitted = `blocking`, which stays the default. */
|
|
8221
8243
|
mode: StorageMigrationModeSchema.optional()
|
|
@@ -8295,6 +8317,13 @@ var StorageMigrationMoveSchema = object({
|
|
|
8295
8317
|
storageClass: StorageMigrationClassSchema,
|
|
8296
8318
|
fromLocationId: string(),
|
|
8297
8319
|
toLocationId: string(),
|
|
8320
|
+
/**
|
|
8321
|
+
* True when `from` was NOT the class default at plan time. The move still
|
|
8322
|
+
* copies bytes, but the default is left alone and the source is disabled
|
|
8323
|
+
* once the copy verifies. Absent on jobs planned before this field existed
|
|
8324
|
+
* — those jobs always repointed, which is `false`.
|
|
8325
|
+
*/
|
|
8326
|
+
freezeSource: boolean().optional(),
|
|
8298
8327
|
moverJobId: string().nullable(),
|
|
8299
8328
|
state: RelocateJobStateSchema.nullable(),
|
|
8300
8329
|
error: string().nullable(),
|
|
@@ -8308,6 +8337,7 @@ var StorageMigrationJobSchema = object({
|
|
|
8308
8337
|
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8309
8338
|
mode: StorageMigrationModeSchema,
|
|
8310
8339
|
destinations: StorageMigrationDestinationsSchema,
|
|
8340
|
+
sources: StorageMigrationSourcesSchema,
|
|
8311
8341
|
throttleMbps: number(),
|
|
8312
8342
|
moves: array(StorageMigrationMoveSchema),
|
|
8313
8343
|
pauseLeaseId: string().nullable(),
|
|
@@ -8333,6 +8363,7 @@ var StorageMigrationFindingSchema = object({
|
|
|
8333
8363
|
});
|
|
8334
8364
|
var StorageMigrationPlanSchema = object({
|
|
8335
8365
|
destinations: StorageMigrationDestinationsSchema,
|
|
8366
|
+
sources: StorageMigrationSourcesSchema,
|
|
8336
8367
|
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8337
8368
|
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8338
8369
|
* it. */
|
|
@@ -8340,7 +8371,8 @@ var StorageMigrationPlanSchema = object({
|
|
|
8340
8371
|
moves: array(object({
|
|
8341
8372
|
storageClass: StorageMigrationClassSchema,
|
|
8342
8373
|
fromLocationId: string(),
|
|
8343
|
-
toLocationId: string()
|
|
8374
|
+
toLocationId: string(),
|
|
8375
|
+
freezeSource: boolean().optional()
|
|
8344
8376
|
})),
|
|
8345
8377
|
findings: array(StorageMigrationFindingSchema)
|
|
8346
8378
|
});
|
|
@@ -8518,10 +8550,51 @@ var LedgerWalkReportSchema = object({
|
|
|
8518
8550
|
var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
|
|
8519
8551
|
var RelocatableMediaCountInputSchema = object({
|
|
8520
8552
|
toLocationId: string().min(1),
|
|
8553
|
+
/** Restrict the count to one source; omitted / `'*'` = every non-target row. */
|
|
8554
|
+
fromLocationId: string().optional(),
|
|
8521
8555
|
/** Omitted = `move`. */
|
|
8522
8556
|
mode: MediaRelocateModeSchema.optional()
|
|
8523
8557
|
});
|
|
8524
8558
|
/**
|
|
8559
|
+
* Operator cleanup of leftover analytics rows, optional debug media, and
|
|
8560
|
+
* ghost ledger entries on frozen footage locations.
|
|
8561
|
+
*
|
|
8562
|
+
* A pass is tens of minutes on a standing backlog. The hub method RETURNS
|
|
8563
|
+
* `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
|
|
8564
|
+
* is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
|
|
8565
|
+
* with no operator-visible status.
|
|
8566
|
+
*/
|
|
8567
|
+
var StorageCleanupPhaseSchema = _enum([
|
|
8568
|
+
"orphans",
|
|
8569
|
+
"debug-media",
|
|
8570
|
+
"ghost-ledger",
|
|
8571
|
+
"done",
|
|
8572
|
+
"failed",
|
|
8573
|
+
"cancelled"
|
|
8574
|
+
]);
|
|
8575
|
+
var StorageCleanupInputSchema = object({
|
|
8576
|
+
/** Also walk motion stills / track filmstrips. Off by default. */
|
|
8577
|
+
includeDebugMedia: boolean().optional() });
|
|
8578
|
+
var StorageCleanupJobSchema = object({
|
|
8579
|
+
jobId: string(),
|
|
8580
|
+
phase: StorageCleanupPhaseSchema,
|
|
8581
|
+
includeDebugMedia: boolean(),
|
|
8582
|
+
orphansReclaimed: number().int().nonnegative(),
|
|
8583
|
+
orphanBytesReclaimed: number().int().nonnegative(),
|
|
8584
|
+
debugMediaReclaimed: number().int().nonnegative(),
|
|
8585
|
+
debugMediaBytesReclaimed: number().int().nonnegative(),
|
|
8586
|
+
ghostsForgotten: number().int().nonnegative(),
|
|
8587
|
+
ghostBytesForgotten: number().int().nonnegative(),
|
|
8588
|
+
/** Short operator-facing line: current collection, pass, or location. */
|
|
8589
|
+
detail: string().nullable(),
|
|
8590
|
+
cancelRequested: boolean(),
|
|
8591
|
+
startedAt: number(),
|
|
8592
|
+
updatedAt: number(),
|
|
8593
|
+
finishedAt: number().nullable(),
|
|
8594
|
+
error: string().nullable()
|
|
8595
|
+
});
|
|
8596
|
+
var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
|
|
8597
|
+
/**
|
|
8525
8598
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
8526
8599
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
8527
8600
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -8549,11 +8622,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
|
|
|
8549
8622
|
* The default location for a type uses `id === <type>:default` by
|
|
8550
8623
|
* convention (the bare type ref like `'backups'` resolves to it).
|
|
8551
8624
|
*
|
|
8552
|
-
* `isSystem
|
|
8553
|
-
*
|
|
8554
|
-
*
|
|
8555
|
-
*
|
|
8556
|
-
* deleting it is rejected at the cap level.
|
|
8625
|
+
* `isSystem` is a legacy persisted flag. Seed still creates the initial
|
|
8626
|
+
* `<type>:default` locations; the flag is no longer a lock, a badge, or a
|
|
8627
|
+
* prune selector. New writes leave it false. Deletion is gated on uniqueness
|
|
8628
|
+
* / last-enabled, not on this bit.
|
|
8557
8629
|
*/
|
|
8558
8630
|
var StorageLocationSchema = object({
|
|
8559
8631
|
id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
|
|
@@ -13079,6 +13151,12 @@ method(object({
|
|
|
13079
13151
|
}), _void(), {
|
|
13080
13152
|
kind: "mutation",
|
|
13081
13153
|
auth: "admin"
|
|
13154
|
+
}), method(object({
|
|
13155
|
+
from: string(),
|
|
13156
|
+
to: string()
|
|
13157
|
+
}), object({ moved: number() }), {
|
|
13158
|
+
kind: "mutation",
|
|
13159
|
+
auth: "admin"
|
|
13082
13160
|
}), method(object({
|
|
13083
13161
|
deviceId: number(),
|
|
13084
13162
|
disabled: boolean()
|
|
@@ -19087,46 +19165,6 @@ var RecentTracksPageSchema = object({
|
|
|
19087
19165
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19088
19166
|
nextCursor: string().nullable()
|
|
19089
19167
|
});
|
|
19090
|
-
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
19091
|
-
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
19092
|
-
var AnalyticsGroupRecordSchema = object({
|
|
19093
|
-
id: string(),
|
|
19094
|
-
deviceId: number().int(),
|
|
19095
|
-
openedAt: number().int(),
|
|
19096
|
-
closedAt: number().int(),
|
|
19097
|
-
timestamp: number().int(),
|
|
19098
|
-
memberCount: number().int(),
|
|
19099
|
-
memberTrackIds: array(string()).readonly(),
|
|
19100
|
-
className: string(),
|
|
19101
|
-
classes: array(string()).readonly(),
|
|
19102
|
-
/** Relative event-media path, or null when the group has no picture yet. */
|
|
19103
|
-
mediaUrl: string().nullable(),
|
|
19104
|
-
singleton: boolean()
|
|
19105
|
-
});
|
|
19106
|
-
var AnalyticsGroupMemberSchema = object({
|
|
19107
|
-
trackId: string(),
|
|
19108
|
-
deviceId: number().int(),
|
|
19109
|
-
className: string(),
|
|
19110
|
-
firstSeen: number().int(),
|
|
19111
|
-
lastSeen: number().int(),
|
|
19112
|
-
mediaUrl: string().nullable()
|
|
19113
|
-
});
|
|
19114
|
-
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
19115
|
-
var ListGroupsQueryInput = object({
|
|
19116
|
-
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
19117
|
-
deviceIds: array(number()),
|
|
19118
|
-
/** Window lower bound on `closedAt` (inclusive). */
|
|
19119
|
-
since: number().optional(),
|
|
19120
|
-
/** Window upper bound on `openedAt` (inclusive). */
|
|
19121
|
-
until: number().optional(),
|
|
19122
|
-
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
19123
|
-
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
19124
|
-
cursor: string().optional()
|
|
19125
|
-
});
|
|
19126
|
-
var ListGroupsPageSchema = object({
|
|
19127
|
-
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
19128
|
-
nextCursor: string().nullable()
|
|
19129
|
-
});
|
|
19130
19168
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19131
19169
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19132
19170
|
var KeyEventQueryInput = object({
|
|
@@ -19230,9 +19268,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19230
19268
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19231
19269
|
plates: number().int(),
|
|
19232
19270
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
19233
|
-
embeddings: number().int()
|
|
19234
|
-
/** Group membership + group rows removed with their last member (best-effort). */
|
|
19235
|
-
groups: number().int()
|
|
19271
|
+
embeddings: number().int()
|
|
19236
19272
|
});
|
|
19237
19273
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19238
19274
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19402,6 +19438,47 @@ var RebuildStatusSchema = object({
|
|
|
19402
19438
|
/** Present when the pass ended by throwing. */
|
|
19403
19439
|
error: string().nullable()
|
|
19404
19440
|
});
|
|
19441
|
+
/**
|
|
19442
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19443
|
+
*
|
|
19444
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19445
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19446
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19447
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19448
|
+
*/
|
|
19449
|
+
var MediaReclaimStartResultSchema = object({
|
|
19450
|
+
started: boolean(),
|
|
19451
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19452
|
+
alreadyRunning: boolean()
|
|
19453
|
+
});
|
|
19454
|
+
var MediaReclaimInputSchema = object({
|
|
19455
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19456
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19457
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19458
|
+
restart: boolean().optional(),
|
|
19459
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19460
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19461
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19462
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19463
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19464
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19465
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19466
|
+
});
|
|
19467
|
+
var MediaReclaimStatusSchema = object({
|
|
19468
|
+
running: boolean(),
|
|
19469
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19470
|
+
totalExamined: number(),
|
|
19471
|
+
totalEligible: number(),
|
|
19472
|
+
totalReclaimed: number(),
|
|
19473
|
+
totalBytesReclaimed: number(),
|
|
19474
|
+
totalRefused: number(),
|
|
19475
|
+
/** Device+scope windows finished in this pass. */
|
|
19476
|
+
devicesDone: number(),
|
|
19477
|
+
complete: boolean().nullable(),
|
|
19478
|
+
startedAtMs: number().nullable(),
|
|
19479
|
+
finishedAtMs: number().nullable(),
|
|
19480
|
+
error: string().nullable()
|
|
19481
|
+
});
|
|
19405
19482
|
var ReplayFrameInputSchema = object({
|
|
19406
19483
|
timestamp: number(),
|
|
19407
19484
|
frame: PipelineRunResultBridge
|
|
@@ -19440,10 +19517,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19440
19517
|
* stationary registry). Default false: the timeline lists passages,
|
|
19441
19518
|
* not parking records (operator decision, 2026-08-15). */
|
|
19442
19519
|
includeStationary: boolean().optional()
|
|
19443
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
19444
|
-
deviceId: number(),
|
|
19445
|
-
groupId: string().min(1)
|
|
19446
|
-
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
19520
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19447
19521
|
kind: "mutation",
|
|
19448
19522
|
auth: "admin"
|
|
19449
19523
|
}), 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({
|
|
@@ -19543,6 +19617,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19543
19617
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19544
19618
|
kind: "query",
|
|
19545
19619
|
auth: "admin"
|
|
19620
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19621
|
+
kind: "mutation",
|
|
19622
|
+
auth: "admin"
|
|
19623
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19624
|
+
kind: "query",
|
|
19625
|
+
auth: "admin"
|
|
19546
19626
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19547
19627
|
kind: "query",
|
|
19548
19628
|
auth: "admin"
|
|
@@ -21617,7 +21697,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21617
21697
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21618
21698
|
kind: "mutation",
|
|
21619
21699
|
auth: "admin"
|
|
21620
|
-
})
|
|
21700
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21701
|
+
kind: "mutation",
|
|
21702
|
+
auth: "admin"
|
|
21703
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21704
|
+
kind: "mutation",
|
|
21705
|
+
auth: "admin"
|
|
21706
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21621
21707
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21622
21708
|
providerId: string().min(1),
|
|
21623
21709
|
displayName: string().min(1),
|
|
@@ -28718,6 +28804,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
28718
28804
|
minMoveGb: number().min(0).optional()
|
|
28719
28805
|
});
|
|
28720
28806
|
/**
|
|
28807
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
28808
|
+
*
|
|
28809
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
28810
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
28811
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
28812
|
+
*/
|
|
28813
|
+
var RecordingDevicePlacementSchema = object({
|
|
28814
|
+
deviceId: number().int(),
|
|
28815
|
+
profile: string(),
|
|
28816
|
+
locationId: string()
|
|
28817
|
+
});
|
|
28818
|
+
var RecordingDevicePinSchema = object({
|
|
28819
|
+
deviceId: number().int(),
|
|
28820
|
+
/** Recordings-class location this camera is pinned to. */
|
|
28821
|
+
locationId: string()
|
|
28822
|
+
});
|
|
28823
|
+
var RecordingPlacementViewSchema = object({
|
|
28824
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
28825
|
+
pins: array(RecordingDevicePinSchema),
|
|
28826
|
+
defaultLocations: record(string(), string())
|
|
28827
|
+
});
|
|
28828
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
28829
|
+
deviceId: number().int(),
|
|
28830
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
28831
|
+
locationId: string().nullable()
|
|
28832
|
+
});
|
|
28833
|
+
/**
|
|
28721
28834
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
28722
28835
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
28723
28836
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -28943,6 +29056,12 @@ method(object({
|
|
|
28943
29056
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
28944
29057
|
kind: "mutation",
|
|
28945
29058
|
auth: "admin"
|
|
29059
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
29060
|
+
kind: "query",
|
|
29061
|
+
auth: "admin"
|
|
29062
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
29063
|
+
kind: "mutation",
|
|
29064
|
+
auth: "admin"
|
|
28946
29065
|
});
|
|
28947
29066
|
/**
|
|
28948
29067
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -34078,6 +34197,12 @@ Object.freeze({
|
|
|
34078
34197
|
addonId: null,
|
|
34079
34198
|
access: "delete"
|
|
34080
34199
|
},
|
|
34200
|
+
"deviceManager.renameLocation": {
|
|
34201
|
+
capName: "device-manager",
|
|
34202
|
+
capScope: "system",
|
|
34203
|
+
addonId: null,
|
|
34204
|
+
access: "create"
|
|
34205
|
+
},
|
|
34081
34206
|
"deviceManager.runDeviceAction": {
|
|
34082
34207
|
capName: "device-manager",
|
|
34083
34208
|
capScope: "system",
|
|
@@ -35770,19 +35895,19 @@ Object.freeze({
|
|
|
35770
35895
|
addonId: null,
|
|
35771
35896
|
access: "view"
|
|
35772
35897
|
},
|
|
35773
|
-
"pipelineAnalytics.
|
|
35898
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
35774
35899
|
capName: "pipeline-analytics",
|
|
35775
35900
|
capScope: "device",
|
|
35776
35901
|
addonId: null,
|
|
35777
35902
|
access: "view"
|
|
35778
35903
|
},
|
|
35779
|
-
"pipelineAnalytics.
|
|
35904
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
35780
35905
|
capName: "pipeline-analytics",
|
|
35781
35906
|
capScope: "device",
|
|
35782
35907
|
addonId: null,
|
|
35783
35908
|
access: "view"
|
|
35784
35909
|
},
|
|
35785
|
-
"pipelineAnalytics.
|
|
35910
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
35786
35911
|
capName: "pipeline-analytics",
|
|
35787
35912
|
capScope: "device",
|
|
35788
35913
|
addonId: null,
|
|
@@ -35872,12 +35997,6 @@ Object.freeze({
|
|
|
35872
35997
|
addonId: null,
|
|
35873
35998
|
access: "view"
|
|
35874
35999
|
},
|
|
35875
|
-
"pipelineAnalytics.listGroups": {
|
|
35876
|
-
capName: "pipeline-analytics",
|
|
35877
|
-
capScope: "device",
|
|
35878
|
-
addonId: null,
|
|
35879
|
-
access: "view"
|
|
35880
|
-
},
|
|
35881
36000
|
"pipelineAnalytics.listOpsLog": {
|
|
35882
36001
|
capName: "pipeline-analytics",
|
|
35883
36002
|
capScope: "device",
|
|
@@ -35962,6 +36081,12 @@ Object.freeze({
|
|
|
35962
36081
|
addonId: null,
|
|
35963
36082
|
access: "create"
|
|
35964
36083
|
},
|
|
36084
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
36085
|
+
capName: "pipeline-analytics",
|
|
36086
|
+
capScope: "device",
|
|
36087
|
+
addonId: null,
|
|
36088
|
+
access: "create"
|
|
36089
|
+
},
|
|
35965
36090
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
35966
36091
|
capName: "pipeline-analytics",
|
|
35967
36092
|
capScope: "device",
|
|
@@ -36886,6 +37011,12 @@ Object.freeze({
|
|
|
36886
37011
|
addonId: null,
|
|
36887
37012
|
access: "view"
|
|
36888
37013
|
},
|
|
37014
|
+
"recording.getPlacement": {
|
|
37015
|
+
capName: "recording",
|
|
37016
|
+
capScope: "system",
|
|
37017
|
+
addonId: null,
|
|
37018
|
+
access: "view"
|
|
37019
|
+
},
|
|
36889
37020
|
"recording.getPlaybackManifest": {
|
|
36890
37021
|
capName: "recording",
|
|
36891
37022
|
capScope: "system",
|
|
@@ -37012,6 +37143,12 @@ Object.freeze({
|
|
|
37012
37143
|
addonId: null,
|
|
37013
37144
|
access: "create"
|
|
37014
37145
|
},
|
|
37146
|
+
"recording.setDevicePlacement": {
|
|
37147
|
+
capName: "recording",
|
|
37148
|
+
capScope: "system",
|
|
37149
|
+
addonId: null,
|
|
37150
|
+
access: "create"
|
|
37151
|
+
},
|
|
37015
37152
|
"recording.startStorageMigrationMove": {
|
|
37016
37153
|
capName: "recording",
|
|
37017
37154
|
capScope: "system",
|
|
@@ -37456,12 +37593,36 @@ Object.freeze({
|
|
|
37456
37593
|
addonId: null,
|
|
37457
37594
|
access: "create"
|
|
37458
37595
|
},
|
|
37596
|
+
"storageMigration.cleanupCancel": {
|
|
37597
|
+
capName: "storage-migration",
|
|
37598
|
+
capScope: "system",
|
|
37599
|
+
addonId: null,
|
|
37600
|
+
access: "create"
|
|
37601
|
+
},
|
|
37602
|
+
"storageMigration.cleanupStart": {
|
|
37603
|
+
capName: "storage-migration",
|
|
37604
|
+
capScope: "system",
|
|
37605
|
+
addonId: null,
|
|
37606
|
+
access: "create"
|
|
37607
|
+
},
|
|
37608
|
+
"storageMigration.cleanupStatus": {
|
|
37609
|
+
capName: "storage-migration",
|
|
37610
|
+
capScope: "system",
|
|
37611
|
+
addonId: null,
|
|
37612
|
+
access: "view"
|
|
37613
|
+
},
|
|
37459
37614
|
"storageMigration.drain": {
|
|
37460
37615
|
capName: "storage-migration",
|
|
37461
37616
|
capScope: "system",
|
|
37462
37617
|
addonId: null,
|
|
37463
37618
|
access: "create"
|
|
37464
37619
|
},
|
|
37620
|
+
"storageMigration.history": {
|
|
37621
|
+
capName: "storage-migration",
|
|
37622
|
+
capScope: "system",
|
|
37623
|
+
addonId: null,
|
|
37624
|
+
access: "view"
|
|
37625
|
+
},
|
|
37465
37626
|
"storageMigration.movers": {
|
|
37466
37627
|
capName: "storage-migration",
|
|
37467
37628
|
capScope: "system",
|
|
@@ -39458,11 +39619,6 @@ Object.freeze({
|
|
|
39458
39619
|
form: "single",
|
|
39459
39620
|
optional: true
|
|
39460
39621
|
}],
|
|
39461
|
-
"pipelineAnalytics.getGroup": [{
|
|
39462
|
-
name: "deviceId",
|
|
39463
|
-
form: "single",
|
|
39464
|
-
optional: false
|
|
39465
|
-
}],
|
|
39466
39622
|
"pipelineAnalytics.getKeyEvents": [{
|
|
39467
39623
|
name: "deviceId",
|
|
39468
39624
|
form: "single",
|
|
@@ -39528,11 +39684,6 @@ Object.freeze({
|
|
|
39528
39684
|
form: "single",
|
|
39529
39685
|
optional: false
|
|
39530
39686
|
}],
|
|
39531
|
-
"pipelineAnalytics.listGroups": [{
|
|
39532
|
-
name: "deviceIds",
|
|
39533
|
-
form: "array",
|
|
39534
|
-
optional: false
|
|
39535
|
-
}],
|
|
39536
39687
|
"pipelineAnalytics.listOpsLog": [{
|
|
39537
39688
|
name: "deviceId",
|
|
39538
39689
|
form: "single",
|
|
@@ -39578,6 +39729,11 @@ Object.freeze({
|
|
|
39578
39729
|
form: "single",
|
|
39579
39730
|
optional: true
|
|
39580
39731
|
}],
|
|
39732
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
39733
|
+
name: "deviceIds",
|
|
39734
|
+
form: "array",
|
|
39735
|
+
optional: true
|
|
39736
|
+
}],
|
|
39581
39737
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
39582
39738
|
name: "deviceId",
|
|
39583
39739
|
form: "single",
|
|
@@ -39943,6 +40099,11 @@ Object.freeze({
|
|
|
39943
40099
|
form: "single",
|
|
39944
40100
|
optional: false
|
|
39945
40101
|
}],
|
|
40102
|
+
"recording.setDevicePlacement": [{
|
|
40103
|
+
name: "deviceId",
|
|
40104
|
+
form: "single",
|
|
40105
|
+
optional: false
|
|
40106
|
+
}],
|
|
39946
40107
|
"recording.startStorageMigrationMove": [{
|
|
39947
40108
|
name: "deviceId",
|
|
39948
40109
|
form: "single",
|