@camstack/addon-provider-rademacher 0.2.48 → 0.2.49
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
|
@@ -9081,6 +9081,13 @@ var MediaRelocateModeSchema = _enum([
|
|
|
9081
9081
|
]);
|
|
9082
9082
|
var RelocateMediaInputSchema = object({
|
|
9083
9083
|
toLocationId: string(),
|
|
9084
|
+
/**
|
|
9085
|
+
* Restrict the pass to rows currently on this location. Omitted / `'*'` =
|
|
9086
|
+
* every row that is not already on `toLocationId` (the historical
|
|
9087
|
+
* behaviour). A named source is what a from→to migration needs: without it
|
|
9088
|
+
* "move events off disk 2" also emptied disk 1.
|
|
9089
|
+
*/
|
|
9090
|
+
fromLocationId: string().optional(),
|
|
9084
9091
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
9085
9092
|
/** Omitted = `move`, the pre-existing behaviour. */
|
|
9086
9093
|
mode: MediaRelocateModeSchema.optional()
|
|
@@ -9148,6 +9155,19 @@ var StorageMigrationDestinationsSchema = object({
|
|
|
9148
9155
|
galleryMedia: string().min(1).optional()
|
|
9149
9156
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
9150
9157
|
/**
|
|
9158
|
+
* Optional named source per class. Omitted = the class's current default
|
|
9159
|
+
* (the historical behaviour). A named source that is NOT the default is a
|
|
9160
|
+
* drain of that disk: bytes move, the default stays, and the source is
|
|
9161
|
+
* disabled when the move finishes.
|
|
9162
|
+
*/
|
|
9163
|
+
var StorageMigrationSourcesSchema = object({
|
|
9164
|
+
recordings: string().min(1).optional(),
|
|
9165
|
+
recordingsLow: string().min(1).optional(),
|
|
9166
|
+
eventMedia: string().min(1).optional(),
|
|
9167
|
+
backups: string().min(1).optional(),
|
|
9168
|
+
galleryMedia: string().min(1).optional()
|
|
9169
|
+
}).optional();
|
|
9170
|
+
/**
|
|
9151
9171
|
* How a migration sequences the cutover against the byte move.
|
|
9152
9172
|
*
|
|
9153
9173
|
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
@@ -9169,6 +9189,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
|
9169
9189
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
9170
9190
|
var StorageMigrationInputSchema = object({
|
|
9171
9191
|
destinations: StorageMigrationDestinationsSchema,
|
|
9192
|
+
/** Omitted = each class's current default. */
|
|
9193
|
+
sources: StorageMigrationSourcesSchema,
|
|
9172
9194
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
9173
9195
|
/** Omitted = `blocking`, which stays the default. */
|
|
9174
9196
|
mode: StorageMigrationModeSchema.optional()
|
|
@@ -9248,6 +9270,13 @@ var StorageMigrationMoveSchema = object({
|
|
|
9248
9270
|
storageClass: StorageMigrationClassSchema,
|
|
9249
9271
|
fromLocationId: string(),
|
|
9250
9272
|
toLocationId: string(),
|
|
9273
|
+
/**
|
|
9274
|
+
* True when `from` was NOT the class default at plan time. The move still
|
|
9275
|
+
* copies bytes, but the default is left alone and the source is disabled
|
|
9276
|
+
* once the copy verifies. Absent on jobs planned before this field existed
|
|
9277
|
+
* — those jobs always repointed, which is `false`.
|
|
9278
|
+
*/
|
|
9279
|
+
freezeSource: boolean().optional(),
|
|
9251
9280
|
moverJobId: string().nullable(),
|
|
9252
9281
|
state: RelocateJobStateSchema.nullable(),
|
|
9253
9282
|
error: string().nullable(),
|
|
@@ -9261,6 +9290,7 @@ var StorageMigrationJobSchema = object({
|
|
|
9261
9290
|
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
9262
9291
|
mode: StorageMigrationModeSchema,
|
|
9263
9292
|
destinations: StorageMigrationDestinationsSchema,
|
|
9293
|
+
sources: StorageMigrationSourcesSchema,
|
|
9264
9294
|
throttleMbps: number(),
|
|
9265
9295
|
moves: array(StorageMigrationMoveSchema),
|
|
9266
9296
|
pauseLeaseId: string().nullable(),
|
|
@@ -9286,6 +9316,7 @@ var StorageMigrationFindingSchema = object({
|
|
|
9286
9316
|
});
|
|
9287
9317
|
var StorageMigrationPlanSchema = object({
|
|
9288
9318
|
destinations: StorageMigrationDestinationsSchema,
|
|
9319
|
+
sources: StorageMigrationSourcesSchema,
|
|
9289
9320
|
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
9290
9321
|
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
9291
9322
|
* it. */
|
|
@@ -9293,7 +9324,8 @@ var StorageMigrationPlanSchema = object({
|
|
|
9293
9324
|
moves: array(object({
|
|
9294
9325
|
storageClass: StorageMigrationClassSchema,
|
|
9295
9326
|
fromLocationId: string(),
|
|
9296
|
-
toLocationId: string()
|
|
9327
|
+
toLocationId: string(),
|
|
9328
|
+
freezeSource: boolean().optional()
|
|
9297
9329
|
})),
|
|
9298
9330
|
findings: array(StorageMigrationFindingSchema)
|
|
9299
9331
|
});
|
|
@@ -9471,10 +9503,51 @@ var LedgerWalkReportSchema = object({
|
|
|
9471
9503
|
var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
|
|
9472
9504
|
var RelocatableMediaCountInputSchema = object({
|
|
9473
9505
|
toLocationId: string().min(1),
|
|
9506
|
+
/** Restrict the count to one source; omitted / `'*'` = every non-target row. */
|
|
9507
|
+
fromLocationId: string().optional(),
|
|
9474
9508
|
/** Omitted = `move`. */
|
|
9475
9509
|
mode: MediaRelocateModeSchema.optional()
|
|
9476
9510
|
});
|
|
9477
9511
|
/**
|
|
9512
|
+
* Operator cleanup of leftover analytics rows, optional debug media, and
|
|
9513
|
+
* ghost ledger entries on frozen footage locations.
|
|
9514
|
+
*
|
|
9515
|
+
* A pass is tens of minutes on a standing backlog. The hub method RETURNS
|
|
9516
|
+
* `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
|
|
9517
|
+
* is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
|
|
9518
|
+
* with no operator-visible status.
|
|
9519
|
+
*/
|
|
9520
|
+
var StorageCleanupPhaseSchema = _enum([
|
|
9521
|
+
"orphans",
|
|
9522
|
+
"debug-media",
|
|
9523
|
+
"ghost-ledger",
|
|
9524
|
+
"done",
|
|
9525
|
+
"failed",
|
|
9526
|
+
"cancelled"
|
|
9527
|
+
]);
|
|
9528
|
+
var StorageCleanupInputSchema = object({
|
|
9529
|
+
/** Also walk motion stills / track filmstrips. Off by default. */
|
|
9530
|
+
includeDebugMedia: boolean().optional() });
|
|
9531
|
+
var StorageCleanupJobSchema = object({
|
|
9532
|
+
jobId: string(),
|
|
9533
|
+
phase: StorageCleanupPhaseSchema,
|
|
9534
|
+
includeDebugMedia: boolean(),
|
|
9535
|
+
orphansReclaimed: number().int().nonnegative(),
|
|
9536
|
+
orphanBytesReclaimed: number().int().nonnegative(),
|
|
9537
|
+
debugMediaReclaimed: number().int().nonnegative(),
|
|
9538
|
+
debugMediaBytesReclaimed: number().int().nonnegative(),
|
|
9539
|
+
ghostsForgotten: number().int().nonnegative(),
|
|
9540
|
+
ghostBytesForgotten: number().int().nonnegative(),
|
|
9541
|
+
/** Short operator-facing line: current collection, pass, or location. */
|
|
9542
|
+
detail: string().nullable(),
|
|
9543
|
+
cancelRequested: boolean(),
|
|
9544
|
+
startedAt: number(),
|
|
9545
|
+
updatedAt: number(),
|
|
9546
|
+
finishedAt: number().nullable(),
|
|
9547
|
+
error: string().nullable()
|
|
9548
|
+
});
|
|
9549
|
+
var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
|
|
9550
|
+
/**
|
|
9478
9551
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
9479
9552
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
9480
9553
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -9502,11 +9575,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
|
|
|
9502
9575
|
* The default location for a type uses `id === <type>:default` by
|
|
9503
9576
|
* convention (the bare type ref like `'backups'` resolves to it).
|
|
9504
9577
|
*
|
|
9505
|
-
* `isSystem
|
|
9506
|
-
*
|
|
9507
|
-
*
|
|
9508
|
-
*
|
|
9509
|
-
* deleting it is rejected at the cap level.
|
|
9578
|
+
* `isSystem` is a legacy persisted flag. Seed still creates the initial
|
|
9579
|
+
* `<type>:default` locations; the flag is no longer a lock, a badge, or a
|
|
9580
|
+
* prune selector. New writes leave it false. Deletion is gated on uniqueness
|
|
9581
|
+
* / last-enabled, not on this bit.
|
|
9510
9582
|
*/
|
|
9511
9583
|
var StorageLocationSchema = object({
|
|
9512
9584
|
id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
|
|
@@ -14032,6 +14104,12 @@ method(object({
|
|
|
14032
14104
|
}), _void(), {
|
|
14033
14105
|
kind: "mutation",
|
|
14034
14106
|
auth: "admin"
|
|
14107
|
+
}), method(object({
|
|
14108
|
+
from: string(),
|
|
14109
|
+
to: string()
|
|
14110
|
+
}), object({ moved: number() }), {
|
|
14111
|
+
kind: "mutation",
|
|
14112
|
+
auth: "admin"
|
|
14035
14113
|
}), method(object({
|
|
14036
14114
|
deviceId: number(),
|
|
14037
14115
|
disabled: boolean()
|
|
@@ -20040,46 +20118,6 @@ var RecentTracksPageSchema = object({
|
|
|
20040
20118
|
/** Cursor for the next page, or null when this page is the last. */
|
|
20041
20119
|
nextCursor: string().nullable()
|
|
20042
20120
|
});
|
|
20043
|
-
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
20044
|
-
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
20045
|
-
var AnalyticsGroupRecordSchema = object({
|
|
20046
|
-
id: string(),
|
|
20047
|
-
deviceId: number().int(),
|
|
20048
|
-
openedAt: number().int(),
|
|
20049
|
-
closedAt: number().int(),
|
|
20050
|
-
timestamp: number().int(),
|
|
20051
|
-
memberCount: number().int(),
|
|
20052
|
-
memberTrackIds: array(string()).readonly(),
|
|
20053
|
-
className: string(),
|
|
20054
|
-
classes: array(string()).readonly(),
|
|
20055
|
-
/** Relative event-media path, or null when the group has no picture yet. */
|
|
20056
|
-
mediaUrl: string().nullable(),
|
|
20057
|
-
singleton: boolean()
|
|
20058
|
-
});
|
|
20059
|
-
var AnalyticsGroupMemberSchema = object({
|
|
20060
|
-
trackId: string(),
|
|
20061
|
-
deviceId: number().int(),
|
|
20062
|
-
className: string(),
|
|
20063
|
-
firstSeen: number().int(),
|
|
20064
|
-
lastSeen: number().int(),
|
|
20065
|
-
mediaUrl: string().nullable()
|
|
20066
|
-
});
|
|
20067
|
-
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
20068
|
-
var ListGroupsQueryInput = object({
|
|
20069
|
-
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
20070
|
-
deviceIds: array(number()),
|
|
20071
|
-
/** Window lower bound on `closedAt` (inclusive). */
|
|
20072
|
-
since: number().optional(),
|
|
20073
|
-
/** Window upper bound on `openedAt` (inclusive). */
|
|
20074
|
-
until: number().optional(),
|
|
20075
|
-
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
20076
|
-
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
20077
|
-
cursor: string().optional()
|
|
20078
|
-
});
|
|
20079
|
-
var ListGroupsPageSchema = object({
|
|
20080
|
-
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
20081
|
-
nextCursor: string().nullable()
|
|
20082
|
-
});
|
|
20083
20121
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
20084
20122
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
20085
20123
|
var KeyEventQueryInput = object({
|
|
@@ -20183,9 +20221,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
20183
20221
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
20184
20222
|
plates: number().int(),
|
|
20185
20223
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
20186
|
-
embeddings: number().int()
|
|
20187
|
-
/** Group membership + group rows removed with their last member (best-effort). */
|
|
20188
|
-
groups: number().int()
|
|
20224
|
+
embeddings: number().int()
|
|
20189
20225
|
});
|
|
20190
20226
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
20191
20227
|
var DiskReconcileCountsSchema = object({
|
|
@@ -20355,6 +20391,47 @@ var RebuildStatusSchema = object({
|
|
|
20355
20391
|
/** Present when the pass ended by throwing. */
|
|
20356
20392
|
error: string().nullable()
|
|
20357
20393
|
});
|
|
20394
|
+
/**
|
|
20395
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
20396
|
+
*
|
|
20397
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
20398
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
20399
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
20400
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
20401
|
+
*/
|
|
20402
|
+
var MediaReclaimStartResultSchema = object({
|
|
20403
|
+
started: boolean(),
|
|
20404
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
20405
|
+
alreadyRunning: boolean()
|
|
20406
|
+
});
|
|
20407
|
+
var MediaReclaimInputSchema = object({
|
|
20408
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
20409
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
20410
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
20411
|
+
restart: boolean().optional(),
|
|
20412
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
20413
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
20414
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
20415
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
20416
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
20417
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
20418
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
20419
|
+
});
|
|
20420
|
+
var MediaReclaimStatusSchema = object({
|
|
20421
|
+
running: boolean(),
|
|
20422
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
20423
|
+
totalExamined: number(),
|
|
20424
|
+
totalEligible: number(),
|
|
20425
|
+
totalReclaimed: number(),
|
|
20426
|
+
totalBytesReclaimed: number(),
|
|
20427
|
+
totalRefused: number(),
|
|
20428
|
+
/** Device+scope windows finished in this pass. */
|
|
20429
|
+
devicesDone: number(),
|
|
20430
|
+
complete: boolean().nullable(),
|
|
20431
|
+
startedAtMs: number().nullable(),
|
|
20432
|
+
finishedAtMs: number().nullable(),
|
|
20433
|
+
error: string().nullable()
|
|
20434
|
+
});
|
|
20358
20435
|
var ReplayFrameInputSchema = object({
|
|
20359
20436
|
timestamp: number(),
|
|
20360
20437
|
frame: PipelineRunResultBridge
|
|
@@ -20393,10 +20470,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
20393
20470
|
* stationary registry). Default false: the timeline lists passages,
|
|
20394
20471
|
* not parking records (operator decision, 2026-08-15). */
|
|
20395
20472
|
includeStationary: boolean().optional()
|
|
20396
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
20397
|
-
deviceId: number(),
|
|
20398
|
-
groupId: string().min(1)
|
|
20399
|
-
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
20473
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
20400
20474
|
kind: "mutation",
|
|
20401
20475
|
auth: "admin"
|
|
20402
20476
|
}), 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({
|
|
@@ -20496,6 +20570,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
20496
20570
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
20497
20571
|
kind: "query",
|
|
20498
20572
|
auth: "admin"
|
|
20573
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
20574
|
+
kind: "mutation",
|
|
20575
|
+
auth: "admin"
|
|
20576
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
20577
|
+
kind: "query",
|
|
20578
|
+
auth: "admin"
|
|
20499
20579
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
20500
20580
|
kind: "query",
|
|
20501
20581
|
auth: "admin"
|
|
@@ -22466,7 +22546,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
22466
22546
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
22467
22547
|
kind: "mutation",
|
|
22468
22548
|
auth: "admin"
|
|
22469
|
-
})
|
|
22549
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
22550
|
+
kind: "mutation",
|
|
22551
|
+
auth: "admin"
|
|
22552
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
22553
|
+
kind: "mutation",
|
|
22554
|
+
auth: "admin"
|
|
22555
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
22470
22556
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
22471
22557
|
providerId: string().min(1),
|
|
22472
22558
|
displayName: string().min(1),
|
|
@@ -29559,6 +29645,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
29559
29645
|
minMoveGb: number().min(0).optional()
|
|
29560
29646
|
});
|
|
29561
29647
|
/**
|
|
29648
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
29649
|
+
*
|
|
29650
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
29651
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
29652
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
29653
|
+
*/
|
|
29654
|
+
var RecordingDevicePlacementSchema = object({
|
|
29655
|
+
deviceId: number().int(),
|
|
29656
|
+
profile: string(),
|
|
29657
|
+
locationId: string()
|
|
29658
|
+
});
|
|
29659
|
+
var RecordingDevicePinSchema = object({
|
|
29660
|
+
deviceId: number().int(),
|
|
29661
|
+
/** Recordings-class location this camera is pinned to. */
|
|
29662
|
+
locationId: string()
|
|
29663
|
+
});
|
|
29664
|
+
var RecordingPlacementViewSchema = object({
|
|
29665
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
29666
|
+
pins: array(RecordingDevicePinSchema),
|
|
29667
|
+
defaultLocations: record(string(), string())
|
|
29668
|
+
});
|
|
29669
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
29670
|
+
deviceId: number().int(),
|
|
29671
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
29672
|
+
locationId: string().nullable()
|
|
29673
|
+
});
|
|
29674
|
+
/**
|
|
29562
29675
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
29563
29676
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
29564
29677
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -29784,6 +29897,12 @@ method(object({
|
|
|
29784
29897
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
29785
29898
|
kind: "mutation",
|
|
29786
29899
|
auth: "admin"
|
|
29900
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
29901
|
+
kind: "query",
|
|
29902
|
+
auth: "admin"
|
|
29903
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
29904
|
+
kind: "mutation",
|
|
29905
|
+
auth: "admin"
|
|
29787
29906
|
});
|
|
29788
29907
|
/**
|
|
29789
29908
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -34853,6 +34972,12 @@ Object.freeze({
|
|
|
34853
34972
|
addonId: null,
|
|
34854
34973
|
access: "delete"
|
|
34855
34974
|
},
|
|
34975
|
+
"deviceManager.renameLocation": {
|
|
34976
|
+
capName: "device-manager",
|
|
34977
|
+
capScope: "system",
|
|
34978
|
+
addonId: null,
|
|
34979
|
+
access: "create"
|
|
34980
|
+
},
|
|
34856
34981
|
"deviceManager.runDeviceAction": {
|
|
34857
34982
|
capName: "device-manager",
|
|
34858
34983
|
capScope: "system",
|
|
@@ -36545,19 +36670,19 @@ Object.freeze({
|
|
|
36545
36670
|
addonId: null,
|
|
36546
36671
|
access: "view"
|
|
36547
36672
|
},
|
|
36548
|
-
"pipelineAnalytics.
|
|
36673
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
36549
36674
|
capName: "pipeline-analytics",
|
|
36550
36675
|
capScope: "device",
|
|
36551
36676
|
addonId: null,
|
|
36552
36677
|
access: "view"
|
|
36553
36678
|
},
|
|
36554
|
-
"pipelineAnalytics.
|
|
36679
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
36555
36680
|
capName: "pipeline-analytics",
|
|
36556
36681
|
capScope: "device",
|
|
36557
36682
|
addonId: null,
|
|
36558
36683
|
access: "view"
|
|
36559
36684
|
},
|
|
36560
|
-
"pipelineAnalytics.
|
|
36685
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
36561
36686
|
capName: "pipeline-analytics",
|
|
36562
36687
|
capScope: "device",
|
|
36563
36688
|
addonId: null,
|
|
@@ -36647,12 +36772,6 @@ Object.freeze({
|
|
|
36647
36772
|
addonId: null,
|
|
36648
36773
|
access: "view"
|
|
36649
36774
|
},
|
|
36650
|
-
"pipelineAnalytics.listGroups": {
|
|
36651
|
-
capName: "pipeline-analytics",
|
|
36652
|
-
capScope: "device",
|
|
36653
|
-
addonId: null,
|
|
36654
|
-
access: "view"
|
|
36655
|
-
},
|
|
36656
36775
|
"pipelineAnalytics.listOpsLog": {
|
|
36657
36776
|
capName: "pipeline-analytics",
|
|
36658
36777
|
capScope: "device",
|
|
@@ -36737,6 +36856,12 @@ Object.freeze({
|
|
|
36737
36856
|
addonId: null,
|
|
36738
36857
|
access: "create"
|
|
36739
36858
|
},
|
|
36859
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
36860
|
+
capName: "pipeline-analytics",
|
|
36861
|
+
capScope: "device",
|
|
36862
|
+
addonId: null,
|
|
36863
|
+
access: "create"
|
|
36864
|
+
},
|
|
36740
36865
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
36741
36866
|
capName: "pipeline-analytics",
|
|
36742
36867
|
capScope: "device",
|
|
@@ -37661,6 +37786,12 @@ Object.freeze({
|
|
|
37661
37786
|
addonId: null,
|
|
37662
37787
|
access: "view"
|
|
37663
37788
|
},
|
|
37789
|
+
"recording.getPlacement": {
|
|
37790
|
+
capName: "recording",
|
|
37791
|
+
capScope: "system",
|
|
37792
|
+
addonId: null,
|
|
37793
|
+
access: "view"
|
|
37794
|
+
},
|
|
37664
37795
|
"recording.getPlaybackManifest": {
|
|
37665
37796
|
capName: "recording",
|
|
37666
37797
|
capScope: "system",
|
|
@@ -37787,6 +37918,12 @@ Object.freeze({
|
|
|
37787
37918
|
addonId: null,
|
|
37788
37919
|
access: "create"
|
|
37789
37920
|
},
|
|
37921
|
+
"recording.setDevicePlacement": {
|
|
37922
|
+
capName: "recording",
|
|
37923
|
+
capScope: "system",
|
|
37924
|
+
addonId: null,
|
|
37925
|
+
access: "create"
|
|
37926
|
+
},
|
|
37790
37927
|
"recording.startStorageMigrationMove": {
|
|
37791
37928
|
capName: "recording",
|
|
37792
37929
|
capScope: "system",
|
|
@@ -38231,12 +38368,36 @@ Object.freeze({
|
|
|
38231
38368
|
addonId: null,
|
|
38232
38369
|
access: "create"
|
|
38233
38370
|
},
|
|
38371
|
+
"storageMigration.cleanupCancel": {
|
|
38372
|
+
capName: "storage-migration",
|
|
38373
|
+
capScope: "system",
|
|
38374
|
+
addonId: null,
|
|
38375
|
+
access: "create"
|
|
38376
|
+
},
|
|
38377
|
+
"storageMigration.cleanupStart": {
|
|
38378
|
+
capName: "storage-migration",
|
|
38379
|
+
capScope: "system",
|
|
38380
|
+
addonId: null,
|
|
38381
|
+
access: "create"
|
|
38382
|
+
},
|
|
38383
|
+
"storageMigration.cleanupStatus": {
|
|
38384
|
+
capName: "storage-migration",
|
|
38385
|
+
capScope: "system",
|
|
38386
|
+
addonId: null,
|
|
38387
|
+
access: "view"
|
|
38388
|
+
},
|
|
38234
38389
|
"storageMigration.drain": {
|
|
38235
38390
|
capName: "storage-migration",
|
|
38236
38391
|
capScope: "system",
|
|
38237
38392
|
addonId: null,
|
|
38238
38393
|
access: "create"
|
|
38239
38394
|
},
|
|
38395
|
+
"storageMigration.history": {
|
|
38396
|
+
capName: "storage-migration",
|
|
38397
|
+
capScope: "system",
|
|
38398
|
+
addonId: null,
|
|
38399
|
+
access: "view"
|
|
38400
|
+
},
|
|
38240
38401
|
"storageMigration.movers": {
|
|
38241
38402
|
capName: "storage-migration",
|
|
38242
38403
|
capScope: "system",
|
|
@@ -40233,11 +40394,6 @@ Object.freeze({
|
|
|
40233
40394
|
form: "single",
|
|
40234
40395
|
optional: true
|
|
40235
40396
|
}],
|
|
40236
|
-
"pipelineAnalytics.getGroup": [{
|
|
40237
|
-
name: "deviceId",
|
|
40238
|
-
form: "single",
|
|
40239
|
-
optional: false
|
|
40240
|
-
}],
|
|
40241
40397
|
"pipelineAnalytics.getKeyEvents": [{
|
|
40242
40398
|
name: "deviceId",
|
|
40243
40399
|
form: "single",
|
|
@@ -40303,11 +40459,6 @@ Object.freeze({
|
|
|
40303
40459
|
form: "single",
|
|
40304
40460
|
optional: false
|
|
40305
40461
|
}],
|
|
40306
|
-
"pipelineAnalytics.listGroups": [{
|
|
40307
|
-
name: "deviceIds",
|
|
40308
|
-
form: "array",
|
|
40309
|
-
optional: false
|
|
40310
|
-
}],
|
|
40311
40462
|
"pipelineAnalytics.listOpsLog": [{
|
|
40312
40463
|
name: "deviceId",
|
|
40313
40464
|
form: "single",
|
|
@@ -40353,6 +40504,11 @@ Object.freeze({
|
|
|
40353
40504
|
form: "single",
|
|
40354
40505
|
optional: true
|
|
40355
40506
|
}],
|
|
40507
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
40508
|
+
name: "deviceIds",
|
|
40509
|
+
form: "array",
|
|
40510
|
+
optional: true
|
|
40511
|
+
}],
|
|
40356
40512
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
40357
40513
|
name: "deviceId",
|
|
40358
40514
|
form: "single",
|
|
@@ -40718,6 +40874,11 @@ Object.freeze({
|
|
|
40718
40874
|
form: "single",
|
|
40719
40875
|
optional: false
|
|
40720
40876
|
}],
|
|
40877
|
+
"recording.setDevicePlacement": [{
|
|
40878
|
+
name: "deviceId",
|
|
40879
|
+
form: "single",
|
|
40880
|
+
optional: false
|
|
40881
|
+
}],
|
|
40721
40882
|
"recording.startStorageMigrationMove": [{
|
|
40722
40883
|
name: "deviceId",
|
|
40723
40884
|
form: "single",
|
package/dist/addon.mjs
CHANGED
|
@@ -9080,6 +9080,13 @@ var MediaRelocateModeSchema = _enum([
|
|
|
9080
9080
|
]);
|
|
9081
9081
|
var RelocateMediaInputSchema = object({
|
|
9082
9082
|
toLocationId: string(),
|
|
9083
|
+
/**
|
|
9084
|
+
* Restrict the pass to rows currently on this location. Omitted / `'*'` =
|
|
9085
|
+
* every row that is not already on `toLocationId` (the historical
|
|
9086
|
+
* behaviour). A named source is what a from→to migration needs: without it
|
|
9087
|
+
* "move events off disk 2" also emptied disk 1.
|
|
9088
|
+
*/
|
|
9089
|
+
fromLocationId: string().optional(),
|
|
9083
9090
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
9084
9091
|
/** Omitted = `move`, the pre-existing behaviour. */
|
|
9085
9092
|
mode: MediaRelocateModeSchema.optional()
|
|
@@ -9147,6 +9154,19 @@ var StorageMigrationDestinationsSchema = object({
|
|
|
9147
9154
|
galleryMedia: string().min(1).optional()
|
|
9148
9155
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
9149
9156
|
/**
|
|
9157
|
+
* Optional named source per class. Omitted = the class's current default
|
|
9158
|
+
* (the historical behaviour). A named source that is NOT the default is a
|
|
9159
|
+
* drain of that disk: bytes move, the default stays, and the source is
|
|
9160
|
+
* disabled when the move finishes.
|
|
9161
|
+
*/
|
|
9162
|
+
var StorageMigrationSourcesSchema = object({
|
|
9163
|
+
recordings: string().min(1).optional(),
|
|
9164
|
+
recordingsLow: string().min(1).optional(),
|
|
9165
|
+
eventMedia: string().min(1).optional(),
|
|
9166
|
+
backups: string().min(1).optional(),
|
|
9167
|
+
galleryMedia: string().min(1).optional()
|
|
9168
|
+
}).optional();
|
|
9169
|
+
/**
|
|
9150
9170
|
* How a migration sequences the cutover against the byte move.
|
|
9151
9171
|
*
|
|
9152
9172
|
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
@@ -9168,6 +9188,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
|
9168
9188
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
9169
9189
|
var StorageMigrationInputSchema = object({
|
|
9170
9190
|
destinations: StorageMigrationDestinationsSchema,
|
|
9191
|
+
/** Omitted = each class's current default. */
|
|
9192
|
+
sources: StorageMigrationSourcesSchema,
|
|
9171
9193
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
9172
9194
|
/** Omitted = `blocking`, which stays the default. */
|
|
9173
9195
|
mode: StorageMigrationModeSchema.optional()
|
|
@@ -9247,6 +9269,13 @@ var StorageMigrationMoveSchema = object({
|
|
|
9247
9269
|
storageClass: StorageMigrationClassSchema,
|
|
9248
9270
|
fromLocationId: string(),
|
|
9249
9271
|
toLocationId: string(),
|
|
9272
|
+
/**
|
|
9273
|
+
* True when `from` was NOT the class default at plan time. The move still
|
|
9274
|
+
* copies bytes, but the default is left alone and the source is disabled
|
|
9275
|
+
* once the copy verifies. Absent on jobs planned before this field existed
|
|
9276
|
+
* — those jobs always repointed, which is `false`.
|
|
9277
|
+
*/
|
|
9278
|
+
freezeSource: boolean().optional(),
|
|
9250
9279
|
moverJobId: string().nullable(),
|
|
9251
9280
|
state: RelocateJobStateSchema.nullable(),
|
|
9252
9281
|
error: string().nullable(),
|
|
@@ -9260,6 +9289,7 @@ var StorageMigrationJobSchema = object({
|
|
|
9260
9289
|
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
9261
9290
|
mode: StorageMigrationModeSchema,
|
|
9262
9291
|
destinations: StorageMigrationDestinationsSchema,
|
|
9292
|
+
sources: StorageMigrationSourcesSchema,
|
|
9263
9293
|
throttleMbps: number(),
|
|
9264
9294
|
moves: array(StorageMigrationMoveSchema),
|
|
9265
9295
|
pauseLeaseId: string().nullable(),
|
|
@@ -9285,6 +9315,7 @@ var StorageMigrationFindingSchema = object({
|
|
|
9285
9315
|
});
|
|
9286
9316
|
var StorageMigrationPlanSchema = object({
|
|
9287
9317
|
destinations: StorageMigrationDestinationsSchema,
|
|
9318
|
+
sources: StorageMigrationSourcesSchema,
|
|
9288
9319
|
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
9289
9320
|
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
9290
9321
|
* it. */
|
|
@@ -9292,7 +9323,8 @@ var StorageMigrationPlanSchema = object({
|
|
|
9292
9323
|
moves: array(object({
|
|
9293
9324
|
storageClass: StorageMigrationClassSchema,
|
|
9294
9325
|
fromLocationId: string(),
|
|
9295
|
-
toLocationId: string()
|
|
9326
|
+
toLocationId: string(),
|
|
9327
|
+
freezeSource: boolean().optional()
|
|
9296
9328
|
})),
|
|
9297
9329
|
findings: array(StorageMigrationFindingSchema)
|
|
9298
9330
|
});
|
|
@@ -9470,10 +9502,51 @@ var LedgerWalkReportSchema = object({
|
|
|
9470
9502
|
var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
|
|
9471
9503
|
var RelocatableMediaCountInputSchema = object({
|
|
9472
9504
|
toLocationId: string().min(1),
|
|
9505
|
+
/** Restrict the count to one source; omitted / `'*'` = every non-target row. */
|
|
9506
|
+
fromLocationId: string().optional(),
|
|
9473
9507
|
/** Omitted = `move`. */
|
|
9474
9508
|
mode: MediaRelocateModeSchema.optional()
|
|
9475
9509
|
});
|
|
9476
9510
|
/**
|
|
9511
|
+
* Operator cleanup of leftover analytics rows, optional debug media, and
|
|
9512
|
+
* ghost ledger entries on frozen footage locations.
|
|
9513
|
+
*
|
|
9514
|
+
* A pass is tens of minutes on a standing backlog. The hub method RETURNS
|
|
9515
|
+
* `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
|
|
9516
|
+
* is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
|
|
9517
|
+
* with no operator-visible status.
|
|
9518
|
+
*/
|
|
9519
|
+
var StorageCleanupPhaseSchema = _enum([
|
|
9520
|
+
"orphans",
|
|
9521
|
+
"debug-media",
|
|
9522
|
+
"ghost-ledger",
|
|
9523
|
+
"done",
|
|
9524
|
+
"failed",
|
|
9525
|
+
"cancelled"
|
|
9526
|
+
]);
|
|
9527
|
+
var StorageCleanupInputSchema = object({
|
|
9528
|
+
/** Also walk motion stills / track filmstrips. Off by default. */
|
|
9529
|
+
includeDebugMedia: boolean().optional() });
|
|
9530
|
+
var StorageCleanupJobSchema = object({
|
|
9531
|
+
jobId: string(),
|
|
9532
|
+
phase: StorageCleanupPhaseSchema,
|
|
9533
|
+
includeDebugMedia: boolean(),
|
|
9534
|
+
orphansReclaimed: number().int().nonnegative(),
|
|
9535
|
+
orphanBytesReclaimed: number().int().nonnegative(),
|
|
9536
|
+
debugMediaReclaimed: number().int().nonnegative(),
|
|
9537
|
+
debugMediaBytesReclaimed: number().int().nonnegative(),
|
|
9538
|
+
ghostsForgotten: number().int().nonnegative(),
|
|
9539
|
+
ghostBytesForgotten: number().int().nonnegative(),
|
|
9540
|
+
/** Short operator-facing line: current collection, pass, or location. */
|
|
9541
|
+
detail: string().nullable(),
|
|
9542
|
+
cancelRequested: boolean(),
|
|
9543
|
+
startedAt: number(),
|
|
9544
|
+
updatedAt: number(),
|
|
9545
|
+
finishedAt: number().nullable(),
|
|
9546
|
+
error: string().nullable()
|
|
9547
|
+
});
|
|
9548
|
+
var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
|
|
9549
|
+
/**
|
|
9477
9550
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
9478
9551
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
9479
9552
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -9501,11 +9574,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
|
|
|
9501
9574
|
* The default location for a type uses `id === <type>:default` by
|
|
9502
9575
|
* convention (the bare type ref like `'backups'` resolves to it).
|
|
9503
9576
|
*
|
|
9504
|
-
* `isSystem
|
|
9505
|
-
*
|
|
9506
|
-
*
|
|
9507
|
-
*
|
|
9508
|
-
* deleting it is rejected at the cap level.
|
|
9577
|
+
* `isSystem` is a legacy persisted flag. Seed still creates the initial
|
|
9578
|
+
* `<type>:default` locations; the flag is no longer a lock, a badge, or a
|
|
9579
|
+
* prune selector. New writes leave it false. Deletion is gated on uniqueness
|
|
9580
|
+
* / last-enabled, not on this bit.
|
|
9509
9581
|
*/
|
|
9510
9582
|
var StorageLocationSchema = object({
|
|
9511
9583
|
id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
|
|
@@ -14031,6 +14103,12 @@ method(object({
|
|
|
14031
14103
|
}), _void(), {
|
|
14032
14104
|
kind: "mutation",
|
|
14033
14105
|
auth: "admin"
|
|
14106
|
+
}), method(object({
|
|
14107
|
+
from: string(),
|
|
14108
|
+
to: string()
|
|
14109
|
+
}), object({ moved: number() }), {
|
|
14110
|
+
kind: "mutation",
|
|
14111
|
+
auth: "admin"
|
|
14034
14112
|
}), method(object({
|
|
14035
14113
|
deviceId: number(),
|
|
14036
14114
|
disabled: boolean()
|
|
@@ -20039,46 +20117,6 @@ var RecentTracksPageSchema = object({
|
|
|
20039
20117
|
/** Cursor for the next page, or null when this page is the last. */
|
|
20040
20118
|
nextCursor: string().nullable()
|
|
20041
20119
|
});
|
|
20042
|
-
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
20043
|
-
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
20044
|
-
var AnalyticsGroupRecordSchema = object({
|
|
20045
|
-
id: string(),
|
|
20046
|
-
deviceId: number().int(),
|
|
20047
|
-
openedAt: number().int(),
|
|
20048
|
-
closedAt: number().int(),
|
|
20049
|
-
timestamp: number().int(),
|
|
20050
|
-
memberCount: number().int(),
|
|
20051
|
-
memberTrackIds: array(string()).readonly(),
|
|
20052
|
-
className: string(),
|
|
20053
|
-
classes: array(string()).readonly(),
|
|
20054
|
-
/** Relative event-media path, or null when the group has no picture yet. */
|
|
20055
|
-
mediaUrl: string().nullable(),
|
|
20056
|
-
singleton: boolean()
|
|
20057
|
-
});
|
|
20058
|
-
var AnalyticsGroupMemberSchema = object({
|
|
20059
|
-
trackId: string(),
|
|
20060
|
-
deviceId: number().int(),
|
|
20061
|
-
className: string(),
|
|
20062
|
-
firstSeen: number().int(),
|
|
20063
|
-
lastSeen: number().int(),
|
|
20064
|
-
mediaUrl: string().nullable()
|
|
20065
|
-
});
|
|
20066
|
-
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
20067
|
-
var ListGroupsQueryInput = object({
|
|
20068
|
-
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
20069
|
-
deviceIds: array(number()),
|
|
20070
|
-
/** Window lower bound on `closedAt` (inclusive). */
|
|
20071
|
-
since: number().optional(),
|
|
20072
|
-
/** Window upper bound on `openedAt` (inclusive). */
|
|
20073
|
-
until: number().optional(),
|
|
20074
|
-
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
20075
|
-
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
20076
|
-
cursor: string().optional()
|
|
20077
|
-
});
|
|
20078
|
-
var ListGroupsPageSchema = object({
|
|
20079
|
-
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
20080
|
-
nextCursor: string().nullable()
|
|
20081
|
-
});
|
|
20082
20120
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
20083
20121
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
20084
20122
|
var KeyEventQueryInput = object({
|
|
@@ -20182,9 +20220,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
20182
20220
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
20183
20221
|
plates: number().int(),
|
|
20184
20222
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
20185
|
-
embeddings: number().int()
|
|
20186
|
-
/** Group membership + group rows removed with their last member (best-effort). */
|
|
20187
|
-
groups: number().int()
|
|
20223
|
+
embeddings: number().int()
|
|
20188
20224
|
});
|
|
20189
20225
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
20190
20226
|
var DiskReconcileCountsSchema = object({
|
|
@@ -20354,6 +20390,47 @@ var RebuildStatusSchema = object({
|
|
|
20354
20390
|
/** Present when the pass ended by throwing. */
|
|
20355
20391
|
error: string().nullable()
|
|
20356
20392
|
});
|
|
20393
|
+
/**
|
|
20394
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
20395
|
+
*
|
|
20396
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
20397
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
20398
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
20399
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
20400
|
+
*/
|
|
20401
|
+
var MediaReclaimStartResultSchema = object({
|
|
20402
|
+
started: boolean(),
|
|
20403
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
20404
|
+
alreadyRunning: boolean()
|
|
20405
|
+
});
|
|
20406
|
+
var MediaReclaimInputSchema = object({
|
|
20407
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
20408
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
20409
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
20410
|
+
restart: boolean().optional(),
|
|
20411
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
20412
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
20413
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
20414
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
20415
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
20416
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
20417
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
20418
|
+
});
|
|
20419
|
+
var MediaReclaimStatusSchema = object({
|
|
20420
|
+
running: boolean(),
|
|
20421
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
20422
|
+
totalExamined: number(),
|
|
20423
|
+
totalEligible: number(),
|
|
20424
|
+
totalReclaimed: number(),
|
|
20425
|
+
totalBytesReclaimed: number(),
|
|
20426
|
+
totalRefused: number(),
|
|
20427
|
+
/** Device+scope windows finished in this pass. */
|
|
20428
|
+
devicesDone: number(),
|
|
20429
|
+
complete: boolean().nullable(),
|
|
20430
|
+
startedAtMs: number().nullable(),
|
|
20431
|
+
finishedAtMs: number().nullable(),
|
|
20432
|
+
error: string().nullable()
|
|
20433
|
+
});
|
|
20357
20434
|
var ReplayFrameInputSchema = object({
|
|
20358
20435
|
timestamp: number(),
|
|
20359
20436
|
frame: PipelineRunResultBridge
|
|
@@ -20392,10 +20469,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
20392
20469
|
* stationary registry). Default false: the timeline lists passages,
|
|
20393
20470
|
* not parking records (operator decision, 2026-08-15). */
|
|
20394
20471
|
includeStationary: boolean().optional()
|
|
20395
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
20396
|
-
deviceId: number(),
|
|
20397
|
-
groupId: string().min(1)
|
|
20398
|
-
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
20472
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
20399
20473
|
kind: "mutation",
|
|
20400
20474
|
auth: "admin"
|
|
20401
20475
|
}), 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({
|
|
@@ -20495,6 +20569,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
20495
20569
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
20496
20570
|
kind: "query",
|
|
20497
20571
|
auth: "admin"
|
|
20572
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
20573
|
+
kind: "mutation",
|
|
20574
|
+
auth: "admin"
|
|
20575
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
20576
|
+
kind: "query",
|
|
20577
|
+
auth: "admin"
|
|
20498
20578
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
20499
20579
|
kind: "query",
|
|
20500
20580
|
auth: "admin"
|
|
@@ -22465,7 +22545,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
22465
22545
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
22466
22546
|
kind: "mutation",
|
|
22467
22547
|
auth: "admin"
|
|
22468
|
-
})
|
|
22548
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
22549
|
+
kind: "mutation",
|
|
22550
|
+
auth: "admin"
|
|
22551
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
22552
|
+
kind: "mutation",
|
|
22553
|
+
auth: "admin"
|
|
22554
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
22469
22555
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
22470
22556
|
providerId: string().min(1),
|
|
22471
22557
|
displayName: string().min(1),
|
|
@@ -29558,6 +29644,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
29558
29644
|
minMoveGb: number().min(0).optional()
|
|
29559
29645
|
});
|
|
29560
29646
|
/**
|
|
29647
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
29648
|
+
*
|
|
29649
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
29650
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
29651
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
29652
|
+
*/
|
|
29653
|
+
var RecordingDevicePlacementSchema = object({
|
|
29654
|
+
deviceId: number().int(),
|
|
29655
|
+
profile: string(),
|
|
29656
|
+
locationId: string()
|
|
29657
|
+
});
|
|
29658
|
+
var RecordingDevicePinSchema = object({
|
|
29659
|
+
deviceId: number().int(),
|
|
29660
|
+
/** Recordings-class location this camera is pinned to. */
|
|
29661
|
+
locationId: string()
|
|
29662
|
+
});
|
|
29663
|
+
var RecordingPlacementViewSchema = object({
|
|
29664
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
29665
|
+
pins: array(RecordingDevicePinSchema),
|
|
29666
|
+
defaultLocations: record(string(), string())
|
|
29667
|
+
});
|
|
29668
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
29669
|
+
deviceId: number().int(),
|
|
29670
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
29671
|
+
locationId: string().nullable()
|
|
29672
|
+
});
|
|
29673
|
+
/**
|
|
29561
29674
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
29562
29675
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
29563
29676
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -29783,6 +29896,12 @@ method(object({
|
|
|
29783
29896
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
29784
29897
|
kind: "mutation",
|
|
29785
29898
|
auth: "admin"
|
|
29899
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
29900
|
+
kind: "query",
|
|
29901
|
+
auth: "admin"
|
|
29902
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
29903
|
+
kind: "mutation",
|
|
29904
|
+
auth: "admin"
|
|
29786
29905
|
});
|
|
29787
29906
|
/**
|
|
29788
29907
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -34852,6 +34971,12 @@ Object.freeze({
|
|
|
34852
34971
|
addonId: null,
|
|
34853
34972
|
access: "delete"
|
|
34854
34973
|
},
|
|
34974
|
+
"deviceManager.renameLocation": {
|
|
34975
|
+
capName: "device-manager",
|
|
34976
|
+
capScope: "system",
|
|
34977
|
+
addonId: null,
|
|
34978
|
+
access: "create"
|
|
34979
|
+
},
|
|
34855
34980
|
"deviceManager.runDeviceAction": {
|
|
34856
34981
|
capName: "device-manager",
|
|
34857
34982
|
capScope: "system",
|
|
@@ -36544,19 +36669,19 @@ Object.freeze({
|
|
|
36544
36669
|
addonId: null,
|
|
36545
36670
|
access: "view"
|
|
36546
36671
|
},
|
|
36547
|
-
"pipelineAnalytics.
|
|
36672
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
36548
36673
|
capName: "pipeline-analytics",
|
|
36549
36674
|
capScope: "device",
|
|
36550
36675
|
addonId: null,
|
|
36551
36676
|
access: "view"
|
|
36552
36677
|
},
|
|
36553
|
-
"pipelineAnalytics.
|
|
36678
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
36554
36679
|
capName: "pipeline-analytics",
|
|
36555
36680
|
capScope: "device",
|
|
36556
36681
|
addonId: null,
|
|
36557
36682
|
access: "view"
|
|
36558
36683
|
},
|
|
36559
|
-
"pipelineAnalytics.
|
|
36684
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
36560
36685
|
capName: "pipeline-analytics",
|
|
36561
36686
|
capScope: "device",
|
|
36562
36687
|
addonId: null,
|
|
@@ -36646,12 +36771,6 @@ Object.freeze({
|
|
|
36646
36771
|
addonId: null,
|
|
36647
36772
|
access: "view"
|
|
36648
36773
|
},
|
|
36649
|
-
"pipelineAnalytics.listGroups": {
|
|
36650
|
-
capName: "pipeline-analytics",
|
|
36651
|
-
capScope: "device",
|
|
36652
|
-
addonId: null,
|
|
36653
|
-
access: "view"
|
|
36654
|
-
},
|
|
36655
36774
|
"pipelineAnalytics.listOpsLog": {
|
|
36656
36775
|
capName: "pipeline-analytics",
|
|
36657
36776
|
capScope: "device",
|
|
@@ -36736,6 +36855,12 @@ Object.freeze({
|
|
|
36736
36855
|
addonId: null,
|
|
36737
36856
|
access: "create"
|
|
36738
36857
|
},
|
|
36858
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
36859
|
+
capName: "pipeline-analytics",
|
|
36860
|
+
capScope: "device",
|
|
36861
|
+
addonId: null,
|
|
36862
|
+
access: "create"
|
|
36863
|
+
},
|
|
36739
36864
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
36740
36865
|
capName: "pipeline-analytics",
|
|
36741
36866
|
capScope: "device",
|
|
@@ -37660,6 +37785,12 @@ Object.freeze({
|
|
|
37660
37785
|
addonId: null,
|
|
37661
37786
|
access: "view"
|
|
37662
37787
|
},
|
|
37788
|
+
"recording.getPlacement": {
|
|
37789
|
+
capName: "recording",
|
|
37790
|
+
capScope: "system",
|
|
37791
|
+
addonId: null,
|
|
37792
|
+
access: "view"
|
|
37793
|
+
},
|
|
37663
37794
|
"recording.getPlaybackManifest": {
|
|
37664
37795
|
capName: "recording",
|
|
37665
37796
|
capScope: "system",
|
|
@@ -37786,6 +37917,12 @@ Object.freeze({
|
|
|
37786
37917
|
addonId: null,
|
|
37787
37918
|
access: "create"
|
|
37788
37919
|
},
|
|
37920
|
+
"recording.setDevicePlacement": {
|
|
37921
|
+
capName: "recording",
|
|
37922
|
+
capScope: "system",
|
|
37923
|
+
addonId: null,
|
|
37924
|
+
access: "create"
|
|
37925
|
+
},
|
|
37789
37926
|
"recording.startStorageMigrationMove": {
|
|
37790
37927
|
capName: "recording",
|
|
37791
37928
|
capScope: "system",
|
|
@@ -38230,12 +38367,36 @@ Object.freeze({
|
|
|
38230
38367
|
addonId: null,
|
|
38231
38368
|
access: "create"
|
|
38232
38369
|
},
|
|
38370
|
+
"storageMigration.cleanupCancel": {
|
|
38371
|
+
capName: "storage-migration",
|
|
38372
|
+
capScope: "system",
|
|
38373
|
+
addonId: null,
|
|
38374
|
+
access: "create"
|
|
38375
|
+
},
|
|
38376
|
+
"storageMigration.cleanupStart": {
|
|
38377
|
+
capName: "storage-migration",
|
|
38378
|
+
capScope: "system",
|
|
38379
|
+
addonId: null,
|
|
38380
|
+
access: "create"
|
|
38381
|
+
},
|
|
38382
|
+
"storageMigration.cleanupStatus": {
|
|
38383
|
+
capName: "storage-migration",
|
|
38384
|
+
capScope: "system",
|
|
38385
|
+
addonId: null,
|
|
38386
|
+
access: "view"
|
|
38387
|
+
},
|
|
38233
38388
|
"storageMigration.drain": {
|
|
38234
38389
|
capName: "storage-migration",
|
|
38235
38390
|
capScope: "system",
|
|
38236
38391
|
addonId: null,
|
|
38237
38392
|
access: "create"
|
|
38238
38393
|
},
|
|
38394
|
+
"storageMigration.history": {
|
|
38395
|
+
capName: "storage-migration",
|
|
38396
|
+
capScope: "system",
|
|
38397
|
+
addonId: null,
|
|
38398
|
+
access: "view"
|
|
38399
|
+
},
|
|
38239
38400
|
"storageMigration.movers": {
|
|
38240
38401
|
capName: "storage-migration",
|
|
38241
38402
|
capScope: "system",
|
|
@@ -40232,11 +40393,6 @@ Object.freeze({
|
|
|
40232
40393
|
form: "single",
|
|
40233
40394
|
optional: true
|
|
40234
40395
|
}],
|
|
40235
|
-
"pipelineAnalytics.getGroup": [{
|
|
40236
|
-
name: "deviceId",
|
|
40237
|
-
form: "single",
|
|
40238
|
-
optional: false
|
|
40239
|
-
}],
|
|
40240
40396
|
"pipelineAnalytics.getKeyEvents": [{
|
|
40241
40397
|
name: "deviceId",
|
|
40242
40398
|
form: "single",
|
|
@@ -40302,11 +40458,6 @@ Object.freeze({
|
|
|
40302
40458
|
form: "single",
|
|
40303
40459
|
optional: false
|
|
40304
40460
|
}],
|
|
40305
|
-
"pipelineAnalytics.listGroups": [{
|
|
40306
|
-
name: "deviceIds",
|
|
40307
|
-
form: "array",
|
|
40308
|
-
optional: false
|
|
40309
|
-
}],
|
|
40310
40461
|
"pipelineAnalytics.listOpsLog": [{
|
|
40311
40462
|
name: "deviceId",
|
|
40312
40463
|
form: "single",
|
|
@@ -40352,6 +40503,11 @@ Object.freeze({
|
|
|
40352
40503
|
form: "single",
|
|
40353
40504
|
optional: true
|
|
40354
40505
|
}],
|
|
40506
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
40507
|
+
name: "deviceIds",
|
|
40508
|
+
form: "array",
|
|
40509
|
+
optional: true
|
|
40510
|
+
}],
|
|
40355
40511
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
40356
40512
|
name: "deviceId",
|
|
40357
40513
|
form: "single",
|
|
@@ -40717,6 +40873,11 @@ Object.freeze({
|
|
|
40717
40873
|
form: "single",
|
|
40718
40874
|
optional: false
|
|
40719
40875
|
}],
|
|
40876
|
+
"recording.setDevicePlacement": [{
|
|
40877
|
+
name: "deviceId",
|
|
40878
|
+
form: "single",
|
|
40879
|
+
optional: false
|
|
40880
|
+
}],
|
|
40720
40881
|
"recording.startStorageMigrationMove": [{
|
|
40721
40882
|
name: "deviceId",
|
|
40722
40883
|
form: "single",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-provider-rademacher",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.49",
|
|
4
4
|
"description": "Rademacher HomePilot device-provider addon for CamStack — wraps the @apocaliss92/noderademacher local-hub client (roller shutters over the cover cap)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|