@camstack/addon-provider-rtsp 1.2.49 → 1.2.51
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
|
@@ -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()
|
|
@@ -15853,6 +15931,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
15853
15931
|
"device-offline",
|
|
15854
15932
|
"device-disabled",
|
|
15855
15933
|
"device-enabled",
|
|
15934
|
+
"device-battery-low",
|
|
15935
|
+
"device-battery-normal",
|
|
15856
15936
|
"stream-online",
|
|
15857
15937
|
"stream-offline",
|
|
15858
15938
|
"node-online",
|
|
@@ -19111,46 +19191,6 @@ var RecentTracksPageSchema = object({
|
|
|
19111
19191
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19112
19192
|
nextCursor: string().nullable()
|
|
19113
19193
|
});
|
|
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
19194
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19155
19195
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19156
19196
|
var KeyEventQueryInput = object({
|
|
@@ -19254,9 +19294,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19254
19294
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19255
19295
|
plates: number().int(),
|
|
19256
19296
|
/** 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()
|
|
19297
|
+
embeddings: number().int()
|
|
19260
19298
|
});
|
|
19261
19299
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19262
19300
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19426,6 +19464,47 @@ var RebuildStatusSchema = object({
|
|
|
19426
19464
|
/** Present when the pass ended by throwing. */
|
|
19427
19465
|
error: string().nullable()
|
|
19428
19466
|
});
|
|
19467
|
+
/**
|
|
19468
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19469
|
+
*
|
|
19470
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19471
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19472
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19473
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19474
|
+
*/
|
|
19475
|
+
var MediaReclaimStartResultSchema = object({
|
|
19476
|
+
started: boolean(),
|
|
19477
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19478
|
+
alreadyRunning: boolean()
|
|
19479
|
+
});
|
|
19480
|
+
var MediaReclaimInputSchema = object({
|
|
19481
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19482
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19483
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19484
|
+
restart: boolean().optional(),
|
|
19485
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19486
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19487
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19488
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19489
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19490
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19491
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19492
|
+
});
|
|
19493
|
+
var MediaReclaimStatusSchema = object({
|
|
19494
|
+
running: boolean(),
|
|
19495
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19496
|
+
totalExamined: number(),
|
|
19497
|
+
totalEligible: number(),
|
|
19498
|
+
totalReclaimed: number(),
|
|
19499
|
+
totalBytesReclaimed: number(),
|
|
19500
|
+
totalRefused: number(),
|
|
19501
|
+
/** Device+scope windows finished in this pass. */
|
|
19502
|
+
devicesDone: number(),
|
|
19503
|
+
complete: boolean().nullable(),
|
|
19504
|
+
startedAtMs: number().nullable(),
|
|
19505
|
+
finishedAtMs: number().nullable(),
|
|
19506
|
+
error: string().nullable()
|
|
19507
|
+
});
|
|
19429
19508
|
var ReplayFrameInputSchema = object({
|
|
19430
19509
|
timestamp: number(),
|
|
19431
19510
|
frame: PipelineRunResultBridge
|
|
@@ -19464,10 +19543,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19464
19543
|
* stationary registry). Default false: the timeline lists passages,
|
|
19465
19544
|
* not parking records (operator decision, 2026-08-15). */
|
|
19466
19545
|
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(), {
|
|
19546
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19471
19547
|
kind: "mutation",
|
|
19472
19548
|
auth: "admin"
|
|
19473
19549
|
}), 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 +19643,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19567
19643
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19568
19644
|
kind: "query",
|
|
19569
19645
|
auth: "admin"
|
|
19646
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19647
|
+
kind: "mutation",
|
|
19648
|
+
auth: "admin"
|
|
19649
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19650
|
+
kind: "query",
|
|
19651
|
+
auth: "admin"
|
|
19570
19652
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19571
19653
|
kind: "query",
|
|
19572
19654
|
auth: "admin"
|
|
@@ -21641,7 +21723,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21641
21723
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21642
21724
|
kind: "mutation",
|
|
21643
21725
|
auth: "admin"
|
|
21644
|
-
})
|
|
21726
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21727
|
+
kind: "mutation",
|
|
21728
|
+
auth: "admin"
|
|
21729
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21730
|
+
kind: "mutation",
|
|
21731
|
+
auth: "admin"
|
|
21732
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21645
21733
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21646
21734
|
providerId: string().min(1),
|
|
21647
21735
|
displayName: string().min(1),
|
|
@@ -28742,6 +28830,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
28742
28830
|
minMoveGb: number().min(0).optional()
|
|
28743
28831
|
});
|
|
28744
28832
|
/**
|
|
28833
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
28834
|
+
*
|
|
28835
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
28836
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
28837
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
28838
|
+
*/
|
|
28839
|
+
var RecordingDevicePlacementSchema = object({
|
|
28840
|
+
deviceId: number().int(),
|
|
28841
|
+
profile: string(),
|
|
28842
|
+
locationId: string()
|
|
28843
|
+
});
|
|
28844
|
+
var RecordingDevicePinSchema = object({
|
|
28845
|
+
deviceId: number().int(),
|
|
28846
|
+
/** Recordings-class location this camera is pinned to. */
|
|
28847
|
+
locationId: string()
|
|
28848
|
+
});
|
|
28849
|
+
var RecordingPlacementViewSchema = object({
|
|
28850
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
28851
|
+
pins: array(RecordingDevicePinSchema),
|
|
28852
|
+
defaultLocations: record(string(), string())
|
|
28853
|
+
});
|
|
28854
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
28855
|
+
deviceId: number().int(),
|
|
28856
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
28857
|
+
locationId: string().nullable()
|
|
28858
|
+
});
|
|
28859
|
+
/**
|
|
28745
28860
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
28746
28861
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
28747
28862
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -28967,6 +29082,12 @@ method(object({
|
|
|
28967
29082
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
28968
29083
|
kind: "mutation",
|
|
28969
29084
|
auth: "admin"
|
|
29085
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
29086
|
+
kind: "query",
|
|
29087
|
+
auth: "admin"
|
|
29088
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
29089
|
+
kind: "mutation",
|
|
29090
|
+
auth: "admin"
|
|
28970
29091
|
});
|
|
28971
29092
|
/**
|
|
28972
29093
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -34102,6 +34223,12 @@ Object.freeze({
|
|
|
34102
34223
|
addonId: null,
|
|
34103
34224
|
access: "delete"
|
|
34104
34225
|
},
|
|
34226
|
+
"deviceManager.renameLocation": {
|
|
34227
|
+
capName: "device-manager",
|
|
34228
|
+
capScope: "system",
|
|
34229
|
+
addonId: null,
|
|
34230
|
+
access: "create"
|
|
34231
|
+
},
|
|
34105
34232
|
"deviceManager.runDeviceAction": {
|
|
34106
34233
|
capName: "device-manager",
|
|
34107
34234
|
capScope: "system",
|
|
@@ -35794,19 +35921,19 @@ Object.freeze({
|
|
|
35794
35921
|
addonId: null,
|
|
35795
35922
|
access: "view"
|
|
35796
35923
|
},
|
|
35797
|
-
"pipelineAnalytics.
|
|
35924
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
35798
35925
|
capName: "pipeline-analytics",
|
|
35799
35926
|
capScope: "device",
|
|
35800
35927
|
addonId: null,
|
|
35801
35928
|
access: "view"
|
|
35802
35929
|
},
|
|
35803
|
-
"pipelineAnalytics.
|
|
35930
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
35804
35931
|
capName: "pipeline-analytics",
|
|
35805
35932
|
capScope: "device",
|
|
35806
35933
|
addonId: null,
|
|
35807
35934
|
access: "view"
|
|
35808
35935
|
},
|
|
35809
|
-
"pipelineAnalytics.
|
|
35936
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
35810
35937
|
capName: "pipeline-analytics",
|
|
35811
35938
|
capScope: "device",
|
|
35812
35939
|
addonId: null,
|
|
@@ -35896,12 +36023,6 @@ Object.freeze({
|
|
|
35896
36023
|
addonId: null,
|
|
35897
36024
|
access: "view"
|
|
35898
36025
|
},
|
|
35899
|
-
"pipelineAnalytics.listGroups": {
|
|
35900
|
-
capName: "pipeline-analytics",
|
|
35901
|
-
capScope: "device",
|
|
35902
|
-
addonId: null,
|
|
35903
|
-
access: "view"
|
|
35904
|
-
},
|
|
35905
36026
|
"pipelineAnalytics.listOpsLog": {
|
|
35906
36027
|
capName: "pipeline-analytics",
|
|
35907
36028
|
capScope: "device",
|
|
@@ -35986,6 +36107,12 @@ Object.freeze({
|
|
|
35986
36107
|
addonId: null,
|
|
35987
36108
|
access: "create"
|
|
35988
36109
|
},
|
|
36110
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
36111
|
+
capName: "pipeline-analytics",
|
|
36112
|
+
capScope: "device",
|
|
36113
|
+
addonId: null,
|
|
36114
|
+
access: "create"
|
|
36115
|
+
},
|
|
35989
36116
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
35990
36117
|
capName: "pipeline-analytics",
|
|
35991
36118
|
capScope: "device",
|
|
@@ -36910,6 +37037,12 @@ Object.freeze({
|
|
|
36910
37037
|
addonId: null,
|
|
36911
37038
|
access: "view"
|
|
36912
37039
|
},
|
|
37040
|
+
"recording.getPlacement": {
|
|
37041
|
+
capName: "recording",
|
|
37042
|
+
capScope: "system",
|
|
37043
|
+
addonId: null,
|
|
37044
|
+
access: "view"
|
|
37045
|
+
},
|
|
36913
37046
|
"recording.getPlaybackManifest": {
|
|
36914
37047
|
capName: "recording",
|
|
36915
37048
|
capScope: "system",
|
|
@@ -37036,6 +37169,12 @@ Object.freeze({
|
|
|
37036
37169
|
addonId: null,
|
|
37037
37170
|
access: "create"
|
|
37038
37171
|
},
|
|
37172
|
+
"recording.setDevicePlacement": {
|
|
37173
|
+
capName: "recording",
|
|
37174
|
+
capScope: "system",
|
|
37175
|
+
addonId: null,
|
|
37176
|
+
access: "create"
|
|
37177
|
+
},
|
|
37039
37178
|
"recording.startStorageMigrationMove": {
|
|
37040
37179
|
capName: "recording",
|
|
37041
37180
|
capScope: "system",
|
|
@@ -37480,12 +37619,36 @@ Object.freeze({
|
|
|
37480
37619
|
addonId: null,
|
|
37481
37620
|
access: "create"
|
|
37482
37621
|
},
|
|
37622
|
+
"storageMigration.cleanupCancel": {
|
|
37623
|
+
capName: "storage-migration",
|
|
37624
|
+
capScope: "system",
|
|
37625
|
+
addonId: null,
|
|
37626
|
+
access: "create"
|
|
37627
|
+
},
|
|
37628
|
+
"storageMigration.cleanupStart": {
|
|
37629
|
+
capName: "storage-migration",
|
|
37630
|
+
capScope: "system",
|
|
37631
|
+
addonId: null,
|
|
37632
|
+
access: "create"
|
|
37633
|
+
},
|
|
37634
|
+
"storageMigration.cleanupStatus": {
|
|
37635
|
+
capName: "storage-migration",
|
|
37636
|
+
capScope: "system",
|
|
37637
|
+
addonId: null,
|
|
37638
|
+
access: "view"
|
|
37639
|
+
},
|
|
37483
37640
|
"storageMigration.drain": {
|
|
37484
37641
|
capName: "storage-migration",
|
|
37485
37642
|
capScope: "system",
|
|
37486
37643
|
addonId: null,
|
|
37487
37644
|
access: "create"
|
|
37488
37645
|
},
|
|
37646
|
+
"storageMigration.history": {
|
|
37647
|
+
capName: "storage-migration",
|
|
37648
|
+
capScope: "system",
|
|
37649
|
+
addonId: null,
|
|
37650
|
+
access: "view"
|
|
37651
|
+
},
|
|
37489
37652
|
"storageMigration.movers": {
|
|
37490
37653
|
capName: "storage-migration",
|
|
37491
37654
|
capScope: "system",
|
|
@@ -39482,11 +39645,6 @@ Object.freeze({
|
|
|
39482
39645
|
form: "single",
|
|
39483
39646
|
optional: true
|
|
39484
39647
|
}],
|
|
39485
|
-
"pipelineAnalytics.getGroup": [{
|
|
39486
|
-
name: "deviceId",
|
|
39487
|
-
form: "single",
|
|
39488
|
-
optional: false
|
|
39489
|
-
}],
|
|
39490
39648
|
"pipelineAnalytics.getKeyEvents": [{
|
|
39491
39649
|
name: "deviceId",
|
|
39492
39650
|
form: "single",
|
|
@@ -39552,11 +39710,6 @@ Object.freeze({
|
|
|
39552
39710
|
form: "single",
|
|
39553
39711
|
optional: false
|
|
39554
39712
|
}],
|
|
39555
|
-
"pipelineAnalytics.listGroups": [{
|
|
39556
|
-
name: "deviceIds",
|
|
39557
|
-
form: "array",
|
|
39558
|
-
optional: false
|
|
39559
|
-
}],
|
|
39560
39713
|
"pipelineAnalytics.listOpsLog": [{
|
|
39561
39714
|
name: "deviceId",
|
|
39562
39715
|
form: "single",
|
|
@@ -39602,6 +39755,11 @@ Object.freeze({
|
|
|
39602
39755
|
form: "single",
|
|
39603
39756
|
optional: true
|
|
39604
39757
|
}],
|
|
39758
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
39759
|
+
name: "deviceIds",
|
|
39760
|
+
form: "array",
|
|
39761
|
+
optional: true
|
|
39762
|
+
}],
|
|
39605
39763
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
39606
39764
|
name: "deviceId",
|
|
39607
39765
|
form: "single",
|
|
@@ -39967,6 +40125,11 @@ Object.freeze({
|
|
|
39967
40125
|
form: "single",
|
|
39968
40126
|
optional: false
|
|
39969
40127
|
}],
|
|
40128
|
+
"recording.setDevicePlacement": [{
|
|
40129
|
+
name: "deviceId",
|
|
40130
|
+
form: "single",
|
|
40131
|
+
optional: false
|
|
40132
|
+
}],
|
|
39970
40133
|
"recording.startStorageMigrationMove": [{
|
|
39971
40134
|
name: "deviceId",
|
|
39972
40135
|
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()
|
|
@@ -15829,6 +15907,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
15829
15907
|
"device-offline",
|
|
15830
15908
|
"device-disabled",
|
|
15831
15909
|
"device-enabled",
|
|
15910
|
+
"device-battery-low",
|
|
15911
|
+
"device-battery-normal",
|
|
15832
15912
|
"stream-online",
|
|
15833
15913
|
"stream-offline",
|
|
15834
15914
|
"node-online",
|
|
@@ -19087,46 +19167,6 @@ var RecentTracksPageSchema = object({
|
|
|
19087
19167
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19088
19168
|
nextCursor: string().nullable()
|
|
19089
19169
|
});
|
|
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
19170
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19131
19171
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19132
19172
|
var KeyEventQueryInput = object({
|
|
@@ -19230,9 +19270,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19230
19270
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19231
19271
|
plates: number().int(),
|
|
19232
19272
|
/** 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()
|
|
19273
|
+
embeddings: number().int()
|
|
19236
19274
|
});
|
|
19237
19275
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19238
19276
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19402,6 +19440,47 @@ var RebuildStatusSchema = object({
|
|
|
19402
19440
|
/** Present when the pass ended by throwing. */
|
|
19403
19441
|
error: string().nullable()
|
|
19404
19442
|
});
|
|
19443
|
+
/**
|
|
19444
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19445
|
+
*
|
|
19446
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19447
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19448
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19449
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19450
|
+
*/
|
|
19451
|
+
var MediaReclaimStartResultSchema = object({
|
|
19452
|
+
started: boolean(),
|
|
19453
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19454
|
+
alreadyRunning: boolean()
|
|
19455
|
+
});
|
|
19456
|
+
var MediaReclaimInputSchema = object({
|
|
19457
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19458
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19459
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19460
|
+
restart: boolean().optional(),
|
|
19461
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19462
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19463
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19464
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19465
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19466
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19467
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19468
|
+
});
|
|
19469
|
+
var MediaReclaimStatusSchema = object({
|
|
19470
|
+
running: boolean(),
|
|
19471
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19472
|
+
totalExamined: number(),
|
|
19473
|
+
totalEligible: number(),
|
|
19474
|
+
totalReclaimed: number(),
|
|
19475
|
+
totalBytesReclaimed: number(),
|
|
19476
|
+
totalRefused: number(),
|
|
19477
|
+
/** Device+scope windows finished in this pass. */
|
|
19478
|
+
devicesDone: number(),
|
|
19479
|
+
complete: boolean().nullable(),
|
|
19480
|
+
startedAtMs: number().nullable(),
|
|
19481
|
+
finishedAtMs: number().nullable(),
|
|
19482
|
+
error: string().nullable()
|
|
19483
|
+
});
|
|
19405
19484
|
var ReplayFrameInputSchema = object({
|
|
19406
19485
|
timestamp: number(),
|
|
19407
19486
|
frame: PipelineRunResultBridge
|
|
@@ -19440,10 +19519,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19440
19519
|
* stationary registry). Default false: the timeline lists passages,
|
|
19441
19520
|
* not parking records (operator decision, 2026-08-15). */
|
|
19442
19521
|
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(), {
|
|
19522
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19447
19523
|
kind: "mutation",
|
|
19448
19524
|
auth: "admin"
|
|
19449
19525
|
}), 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 +19619,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19543
19619
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19544
19620
|
kind: "query",
|
|
19545
19621
|
auth: "admin"
|
|
19622
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19623
|
+
kind: "mutation",
|
|
19624
|
+
auth: "admin"
|
|
19625
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19626
|
+
kind: "query",
|
|
19627
|
+
auth: "admin"
|
|
19546
19628
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19547
19629
|
kind: "query",
|
|
19548
19630
|
auth: "admin"
|
|
@@ -21617,7 +21699,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21617
21699
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21618
21700
|
kind: "mutation",
|
|
21619
21701
|
auth: "admin"
|
|
21620
|
-
})
|
|
21702
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21703
|
+
kind: "mutation",
|
|
21704
|
+
auth: "admin"
|
|
21705
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21706
|
+
kind: "mutation",
|
|
21707
|
+
auth: "admin"
|
|
21708
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21621
21709
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21622
21710
|
providerId: string().min(1),
|
|
21623
21711
|
displayName: string().min(1),
|
|
@@ -28718,6 +28806,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
28718
28806
|
minMoveGb: number().min(0).optional()
|
|
28719
28807
|
});
|
|
28720
28808
|
/**
|
|
28809
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
28810
|
+
*
|
|
28811
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
28812
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
28813
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
28814
|
+
*/
|
|
28815
|
+
var RecordingDevicePlacementSchema = object({
|
|
28816
|
+
deviceId: number().int(),
|
|
28817
|
+
profile: string(),
|
|
28818
|
+
locationId: string()
|
|
28819
|
+
});
|
|
28820
|
+
var RecordingDevicePinSchema = object({
|
|
28821
|
+
deviceId: number().int(),
|
|
28822
|
+
/** Recordings-class location this camera is pinned to. */
|
|
28823
|
+
locationId: string()
|
|
28824
|
+
});
|
|
28825
|
+
var RecordingPlacementViewSchema = object({
|
|
28826
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
28827
|
+
pins: array(RecordingDevicePinSchema),
|
|
28828
|
+
defaultLocations: record(string(), string())
|
|
28829
|
+
});
|
|
28830
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
28831
|
+
deviceId: number().int(),
|
|
28832
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
28833
|
+
locationId: string().nullable()
|
|
28834
|
+
});
|
|
28835
|
+
/**
|
|
28721
28836
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
28722
28837
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
28723
28838
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -28943,6 +29058,12 @@ method(object({
|
|
|
28943
29058
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
28944
29059
|
kind: "mutation",
|
|
28945
29060
|
auth: "admin"
|
|
29061
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
29062
|
+
kind: "query",
|
|
29063
|
+
auth: "admin"
|
|
29064
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
29065
|
+
kind: "mutation",
|
|
29066
|
+
auth: "admin"
|
|
28946
29067
|
});
|
|
28947
29068
|
/**
|
|
28948
29069
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -34078,6 +34199,12 @@ Object.freeze({
|
|
|
34078
34199
|
addonId: null,
|
|
34079
34200
|
access: "delete"
|
|
34080
34201
|
},
|
|
34202
|
+
"deviceManager.renameLocation": {
|
|
34203
|
+
capName: "device-manager",
|
|
34204
|
+
capScope: "system",
|
|
34205
|
+
addonId: null,
|
|
34206
|
+
access: "create"
|
|
34207
|
+
},
|
|
34081
34208
|
"deviceManager.runDeviceAction": {
|
|
34082
34209
|
capName: "device-manager",
|
|
34083
34210
|
capScope: "system",
|
|
@@ -35770,19 +35897,19 @@ Object.freeze({
|
|
|
35770
35897
|
addonId: null,
|
|
35771
35898
|
access: "view"
|
|
35772
35899
|
},
|
|
35773
|
-
"pipelineAnalytics.
|
|
35900
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
35774
35901
|
capName: "pipeline-analytics",
|
|
35775
35902
|
capScope: "device",
|
|
35776
35903
|
addonId: null,
|
|
35777
35904
|
access: "view"
|
|
35778
35905
|
},
|
|
35779
|
-
"pipelineAnalytics.
|
|
35906
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
35780
35907
|
capName: "pipeline-analytics",
|
|
35781
35908
|
capScope: "device",
|
|
35782
35909
|
addonId: null,
|
|
35783
35910
|
access: "view"
|
|
35784
35911
|
},
|
|
35785
|
-
"pipelineAnalytics.
|
|
35912
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
35786
35913
|
capName: "pipeline-analytics",
|
|
35787
35914
|
capScope: "device",
|
|
35788
35915
|
addonId: null,
|
|
@@ -35872,12 +35999,6 @@ Object.freeze({
|
|
|
35872
35999
|
addonId: null,
|
|
35873
36000
|
access: "view"
|
|
35874
36001
|
},
|
|
35875
|
-
"pipelineAnalytics.listGroups": {
|
|
35876
|
-
capName: "pipeline-analytics",
|
|
35877
|
-
capScope: "device",
|
|
35878
|
-
addonId: null,
|
|
35879
|
-
access: "view"
|
|
35880
|
-
},
|
|
35881
36002
|
"pipelineAnalytics.listOpsLog": {
|
|
35882
36003
|
capName: "pipeline-analytics",
|
|
35883
36004
|
capScope: "device",
|
|
@@ -35962,6 +36083,12 @@ Object.freeze({
|
|
|
35962
36083
|
addonId: null,
|
|
35963
36084
|
access: "create"
|
|
35964
36085
|
},
|
|
36086
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
36087
|
+
capName: "pipeline-analytics",
|
|
36088
|
+
capScope: "device",
|
|
36089
|
+
addonId: null,
|
|
36090
|
+
access: "create"
|
|
36091
|
+
},
|
|
35965
36092
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
35966
36093
|
capName: "pipeline-analytics",
|
|
35967
36094
|
capScope: "device",
|
|
@@ -36886,6 +37013,12 @@ Object.freeze({
|
|
|
36886
37013
|
addonId: null,
|
|
36887
37014
|
access: "view"
|
|
36888
37015
|
},
|
|
37016
|
+
"recording.getPlacement": {
|
|
37017
|
+
capName: "recording",
|
|
37018
|
+
capScope: "system",
|
|
37019
|
+
addonId: null,
|
|
37020
|
+
access: "view"
|
|
37021
|
+
},
|
|
36889
37022
|
"recording.getPlaybackManifest": {
|
|
36890
37023
|
capName: "recording",
|
|
36891
37024
|
capScope: "system",
|
|
@@ -37012,6 +37145,12 @@ Object.freeze({
|
|
|
37012
37145
|
addonId: null,
|
|
37013
37146
|
access: "create"
|
|
37014
37147
|
},
|
|
37148
|
+
"recording.setDevicePlacement": {
|
|
37149
|
+
capName: "recording",
|
|
37150
|
+
capScope: "system",
|
|
37151
|
+
addonId: null,
|
|
37152
|
+
access: "create"
|
|
37153
|
+
},
|
|
37015
37154
|
"recording.startStorageMigrationMove": {
|
|
37016
37155
|
capName: "recording",
|
|
37017
37156
|
capScope: "system",
|
|
@@ -37456,12 +37595,36 @@ Object.freeze({
|
|
|
37456
37595
|
addonId: null,
|
|
37457
37596
|
access: "create"
|
|
37458
37597
|
},
|
|
37598
|
+
"storageMigration.cleanupCancel": {
|
|
37599
|
+
capName: "storage-migration",
|
|
37600
|
+
capScope: "system",
|
|
37601
|
+
addonId: null,
|
|
37602
|
+
access: "create"
|
|
37603
|
+
},
|
|
37604
|
+
"storageMigration.cleanupStart": {
|
|
37605
|
+
capName: "storage-migration",
|
|
37606
|
+
capScope: "system",
|
|
37607
|
+
addonId: null,
|
|
37608
|
+
access: "create"
|
|
37609
|
+
},
|
|
37610
|
+
"storageMigration.cleanupStatus": {
|
|
37611
|
+
capName: "storage-migration",
|
|
37612
|
+
capScope: "system",
|
|
37613
|
+
addonId: null,
|
|
37614
|
+
access: "view"
|
|
37615
|
+
},
|
|
37459
37616
|
"storageMigration.drain": {
|
|
37460
37617
|
capName: "storage-migration",
|
|
37461
37618
|
capScope: "system",
|
|
37462
37619
|
addonId: null,
|
|
37463
37620
|
access: "create"
|
|
37464
37621
|
},
|
|
37622
|
+
"storageMigration.history": {
|
|
37623
|
+
capName: "storage-migration",
|
|
37624
|
+
capScope: "system",
|
|
37625
|
+
addonId: null,
|
|
37626
|
+
access: "view"
|
|
37627
|
+
},
|
|
37465
37628
|
"storageMigration.movers": {
|
|
37466
37629
|
capName: "storage-migration",
|
|
37467
37630
|
capScope: "system",
|
|
@@ -39458,11 +39621,6 @@ Object.freeze({
|
|
|
39458
39621
|
form: "single",
|
|
39459
39622
|
optional: true
|
|
39460
39623
|
}],
|
|
39461
|
-
"pipelineAnalytics.getGroup": [{
|
|
39462
|
-
name: "deviceId",
|
|
39463
|
-
form: "single",
|
|
39464
|
-
optional: false
|
|
39465
|
-
}],
|
|
39466
39624
|
"pipelineAnalytics.getKeyEvents": [{
|
|
39467
39625
|
name: "deviceId",
|
|
39468
39626
|
form: "single",
|
|
@@ -39528,11 +39686,6 @@ Object.freeze({
|
|
|
39528
39686
|
form: "single",
|
|
39529
39687
|
optional: false
|
|
39530
39688
|
}],
|
|
39531
|
-
"pipelineAnalytics.listGroups": [{
|
|
39532
|
-
name: "deviceIds",
|
|
39533
|
-
form: "array",
|
|
39534
|
-
optional: false
|
|
39535
|
-
}],
|
|
39536
39689
|
"pipelineAnalytics.listOpsLog": [{
|
|
39537
39690
|
name: "deviceId",
|
|
39538
39691
|
form: "single",
|
|
@@ -39578,6 +39731,11 @@ Object.freeze({
|
|
|
39578
39731
|
form: "single",
|
|
39579
39732
|
optional: true
|
|
39580
39733
|
}],
|
|
39734
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
39735
|
+
name: "deviceIds",
|
|
39736
|
+
form: "array",
|
|
39737
|
+
optional: true
|
|
39738
|
+
}],
|
|
39581
39739
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
39582
39740
|
name: "deviceId",
|
|
39583
39741
|
form: "single",
|
|
@@ -39943,6 +40101,11 @@ Object.freeze({
|
|
|
39943
40101
|
form: "single",
|
|
39944
40102
|
optional: false
|
|
39945
40103
|
}],
|
|
40104
|
+
"recording.setDevicePlacement": [{
|
|
40105
|
+
name: "deviceId",
|
|
40106
|
+
form: "single",
|
|
40107
|
+
optional: false
|
|
40108
|
+
}],
|
|
39946
40109
|
"recording.startStorageMigrationMove": [{
|
|
39947
40110
|
name: "deviceId",
|
|
39948
40111
|
form: "single",
|