@camstack/addon-provider-rademacher 0.2.48 → 0.2.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/addon.js +236 -73
- package/dist/addon.mjs +236 -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()
|
|
@@ -16782,6 +16860,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
16782
16860
|
"device-offline",
|
|
16783
16861
|
"device-disabled",
|
|
16784
16862
|
"device-enabled",
|
|
16863
|
+
"device-battery-low",
|
|
16864
|
+
"device-battery-normal",
|
|
16785
16865
|
"stream-online",
|
|
16786
16866
|
"stream-offline",
|
|
16787
16867
|
"node-online",
|
|
@@ -20040,46 +20120,6 @@ var RecentTracksPageSchema = object({
|
|
|
20040
20120
|
/** Cursor for the next page, or null when this page is the last. */
|
|
20041
20121
|
nextCursor: string().nullable()
|
|
20042
20122
|
});
|
|
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
20123
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
20084
20124
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
20085
20125
|
var KeyEventQueryInput = object({
|
|
@@ -20183,9 +20223,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
20183
20223
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
20184
20224
|
plates: number().int(),
|
|
20185
20225
|
/** 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()
|
|
20226
|
+
embeddings: number().int()
|
|
20189
20227
|
});
|
|
20190
20228
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
20191
20229
|
var DiskReconcileCountsSchema = object({
|
|
@@ -20355,6 +20393,47 @@ var RebuildStatusSchema = object({
|
|
|
20355
20393
|
/** Present when the pass ended by throwing. */
|
|
20356
20394
|
error: string().nullable()
|
|
20357
20395
|
});
|
|
20396
|
+
/**
|
|
20397
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
20398
|
+
*
|
|
20399
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
20400
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
20401
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
20402
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
20403
|
+
*/
|
|
20404
|
+
var MediaReclaimStartResultSchema = object({
|
|
20405
|
+
started: boolean(),
|
|
20406
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
20407
|
+
alreadyRunning: boolean()
|
|
20408
|
+
});
|
|
20409
|
+
var MediaReclaimInputSchema = object({
|
|
20410
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
20411
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
20412
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
20413
|
+
restart: boolean().optional(),
|
|
20414
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
20415
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
20416
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
20417
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
20418
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
20419
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
20420
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
20421
|
+
});
|
|
20422
|
+
var MediaReclaimStatusSchema = object({
|
|
20423
|
+
running: boolean(),
|
|
20424
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
20425
|
+
totalExamined: number(),
|
|
20426
|
+
totalEligible: number(),
|
|
20427
|
+
totalReclaimed: number(),
|
|
20428
|
+
totalBytesReclaimed: number(),
|
|
20429
|
+
totalRefused: number(),
|
|
20430
|
+
/** Device+scope windows finished in this pass. */
|
|
20431
|
+
devicesDone: number(),
|
|
20432
|
+
complete: boolean().nullable(),
|
|
20433
|
+
startedAtMs: number().nullable(),
|
|
20434
|
+
finishedAtMs: number().nullable(),
|
|
20435
|
+
error: string().nullable()
|
|
20436
|
+
});
|
|
20358
20437
|
var ReplayFrameInputSchema = object({
|
|
20359
20438
|
timestamp: number(),
|
|
20360
20439
|
frame: PipelineRunResultBridge
|
|
@@ -20393,10 +20472,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
20393
20472
|
* stationary registry). Default false: the timeline lists passages,
|
|
20394
20473
|
* not parking records (operator decision, 2026-08-15). */
|
|
20395
20474
|
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(), {
|
|
20475
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
20400
20476
|
kind: "mutation",
|
|
20401
20477
|
auth: "admin"
|
|
20402
20478
|
}), 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 +20572,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
20496
20572
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
20497
20573
|
kind: "query",
|
|
20498
20574
|
auth: "admin"
|
|
20575
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
20576
|
+
kind: "mutation",
|
|
20577
|
+
auth: "admin"
|
|
20578
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
20579
|
+
kind: "query",
|
|
20580
|
+
auth: "admin"
|
|
20499
20581
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
20500
20582
|
kind: "query",
|
|
20501
20583
|
auth: "admin"
|
|
@@ -22466,7 +22548,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
22466
22548
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
22467
22549
|
kind: "mutation",
|
|
22468
22550
|
auth: "admin"
|
|
22469
|
-
})
|
|
22551
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
22552
|
+
kind: "mutation",
|
|
22553
|
+
auth: "admin"
|
|
22554
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
22555
|
+
kind: "mutation",
|
|
22556
|
+
auth: "admin"
|
|
22557
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
22470
22558
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
22471
22559
|
providerId: string().min(1),
|
|
22472
22560
|
displayName: string().min(1),
|
|
@@ -29559,6 +29647,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
29559
29647
|
minMoveGb: number().min(0).optional()
|
|
29560
29648
|
});
|
|
29561
29649
|
/**
|
|
29650
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
29651
|
+
*
|
|
29652
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
29653
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
29654
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
29655
|
+
*/
|
|
29656
|
+
var RecordingDevicePlacementSchema = object({
|
|
29657
|
+
deviceId: number().int(),
|
|
29658
|
+
profile: string(),
|
|
29659
|
+
locationId: string()
|
|
29660
|
+
});
|
|
29661
|
+
var RecordingDevicePinSchema = object({
|
|
29662
|
+
deviceId: number().int(),
|
|
29663
|
+
/** Recordings-class location this camera is pinned to. */
|
|
29664
|
+
locationId: string()
|
|
29665
|
+
});
|
|
29666
|
+
var RecordingPlacementViewSchema = object({
|
|
29667
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
29668
|
+
pins: array(RecordingDevicePinSchema),
|
|
29669
|
+
defaultLocations: record(string(), string())
|
|
29670
|
+
});
|
|
29671
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
29672
|
+
deviceId: number().int(),
|
|
29673
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
29674
|
+
locationId: string().nullable()
|
|
29675
|
+
});
|
|
29676
|
+
/**
|
|
29562
29677
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
29563
29678
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
29564
29679
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -29784,6 +29899,12 @@ method(object({
|
|
|
29784
29899
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
29785
29900
|
kind: "mutation",
|
|
29786
29901
|
auth: "admin"
|
|
29902
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
29903
|
+
kind: "query",
|
|
29904
|
+
auth: "admin"
|
|
29905
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
29906
|
+
kind: "mutation",
|
|
29907
|
+
auth: "admin"
|
|
29787
29908
|
});
|
|
29788
29909
|
/**
|
|
29789
29910
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -34853,6 +34974,12 @@ Object.freeze({
|
|
|
34853
34974
|
addonId: null,
|
|
34854
34975
|
access: "delete"
|
|
34855
34976
|
},
|
|
34977
|
+
"deviceManager.renameLocation": {
|
|
34978
|
+
capName: "device-manager",
|
|
34979
|
+
capScope: "system",
|
|
34980
|
+
addonId: null,
|
|
34981
|
+
access: "create"
|
|
34982
|
+
},
|
|
34856
34983
|
"deviceManager.runDeviceAction": {
|
|
34857
34984
|
capName: "device-manager",
|
|
34858
34985
|
capScope: "system",
|
|
@@ -36545,19 +36672,19 @@ Object.freeze({
|
|
|
36545
36672
|
addonId: null,
|
|
36546
36673
|
access: "view"
|
|
36547
36674
|
},
|
|
36548
|
-
"pipelineAnalytics.
|
|
36675
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
36549
36676
|
capName: "pipeline-analytics",
|
|
36550
36677
|
capScope: "device",
|
|
36551
36678
|
addonId: null,
|
|
36552
36679
|
access: "view"
|
|
36553
36680
|
},
|
|
36554
|
-
"pipelineAnalytics.
|
|
36681
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
36555
36682
|
capName: "pipeline-analytics",
|
|
36556
36683
|
capScope: "device",
|
|
36557
36684
|
addonId: null,
|
|
36558
36685
|
access: "view"
|
|
36559
36686
|
},
|
|
36560
|
-
"pipelineAnalytics.
|
|
36687
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
36561
36688
|
capName: "pipeline-analytics",
|
|
36562
36689
|
capScope: "device",
|
|
36563
36690
|
addonId: null,
|
|
@@ -36647,12 +36774,6 @@ Object.freeze({
|
|
|
36647
36774
|
addonId: null,
|
|
36648
36775
|
access: "view"
|
|
36649
36776
|
},
|
|
36650
|
-
"pipelineAnalytics.listGroups": {
|
|
36651
|
-
capName: "pipeline-analytics",
|
|
36652
|
-
capScope: "device",
|
|
36653
|
-
addonId: null,
|
|
36654
|
-
access: "view"
|
|
36655
|
-
},
|
|
36656
36777
|
"pipelineAnalytics.listOpsLog": {
|
|
36657
36778
|
capName: "pipeline-analytics",
|
|
36658
36779
|
capScope: "device",
|
|
@@ -36737,6 +36858,12 @@ Object.freeze({
|
|
|
36737
36858
|
addonId: null,
|
|
36738
36859
|
access: "create"
|
|
36739
36860
|
},
|
|
36861
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
36862
|
+
capName: "pipeline-analytics",
|
|
36863
|
+
capScope: "device",
|
|
36864
|
+
addonId: null,
|
|
36865
|
+
access: "create"
|
|
36866
|
+
},
|
|
36740
36867
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
36741
36868
|
capName: "pipeline-analytics",
|
|
36742
36869
|
capScope: "device",
|
|
@@ -37661,6 +37788,12 @@ Object.freeze({
|
|
|
37661
37788
|
addonId: null,
|
|
37662
37789
|
access: "view"
|
|
37663
37790
|
},
|
|
37791
|
+
"recording.getPlacement": {
|
|
37792
|
+
capName: "recording",
|
|
37793
|
+
capScope: "system",
|
|
37794
|
+
addonId: null,
|
|
37795
|
+
access: "view"
|
|
37796
|
+
},
|
|
37664
37797
|
"recording.getPlaybackManifest": {
|
|
37665
37798
|
capName: "recording",
|
|
37666
37799
|
capScope: "system",
|
|
@@ -37787,6 +37920,12 @@ Object.freeze({
|
|
|
37787
37920
|
addonId: null,
|
|
37788
37921
|
access: "create"
|
|
37789
37922
|
},
|
|
37923
|
+
"recording.setDevicePlacement": {
|
|
37924
|
+
capName: "recording",
|
|
37925
|
+
capScope: "system",
|
|
37926
|
+
addonId: null,
|
|
37927
|
+
access: "create"
|
|
37928
|
+
},
|
|
37790
37929
|
"recording.startStorageMigrationMove": {
|
|
37791
37930
|
capName: "recording",
|
|
37792
37931
|
capScope: "system",
|
|
@@ -38231,12 +38370,36 @@ Object.freeze({
|
|
|
38231
38370
|
addonId: null,
|
|
38232
38371
|
access: "create"
|
|
38233
38372
|
},
|
|
38373
|
+
"storageMigration.cleanupCancel": {
|
|
38374
|
+
capName: "storage-migration",
|
|
38375
|
+
capScope: "system",
|
|
38376
|
+
addonId: null,
|
|
38377
|
+
access: "create"
|
|
38378
|
+
},
|
|
38379
|
+
"storageMigration.cleanupStart": {
|
|
38380
|
+
capName: "storage-migration",
|
|
38381
|
+
capScope: "system",
|
|
38382
|
+
addonId: null,
|
|
38383
|
+
access: "create"
|
|
38384
|
+
},
|
|
38385
|
+
"storageMigration.cleanupStatus": {
|
|
38386
|
+
capName: "storage-migration",
|
|
38387
|
+
capScope: "system",
|
|
38388
|
+
addonId: null,
|
|
38389
|
+
access: "view"
|
|
38390
|
+
},
|
|
38234
38391
|
"storageMigration.drain": {
|
|
38235
38392
|
capName: "storage-migration",
|
|
38236
38393
|
capScope: "system",
|
|
38237
38394
|
addonId: null,
|
|
38238
38395
|
access: "create"
|
|
38239
38396
|
},
|
|
38397
|
+
"storageMigration.history": {
|
|
38398
|
+
capName: "storage-migration",
|
|
38399
|
+
capScope: "system",
|
|
38400
|
+
addonId: null,
|
|
38401
|
+
access: "view"
|
|
38402
|
+
},
|
|
38240
38403
|
"storageMigration.movers": {
|
|
38241
38404
|
capName: "storage-migration",
|
|
38242
38405
|
capScope: "system",
|
|
@@ -40233,11 +40396,6 @@ Object.freeze({
|
|
|
40233
40396
|
form: "single",
|
|
40234
40397
|
optional: true
|
|
40235
40398
|
}],
|
|
40236
|
-
"pipelineAnalytics.getGroup": [{
|
|
40237
|
-
name: "deviceId",
|
|
40238
|
-
form: "single",
|
|
40239
|
-
optional: false
|
|
40240
|
-
}],
|
|
40241
40399
|
"pipelineAnalytics.getKeyEvents": [{
|
|
40242
40400
|
name: "deviceId",
|
|
40243
40401
|
form: "single",
|
|
@@ -40303,11 +40461,6 @@ Object.freeze({
|
|
|
40303
40461
|
form: "single",
|
|
40304
40462
|
optional: false
|
|
40305
40463
|
}],
|
|
40306
|
-
"pipelineAnalytics.listGroups": [{
|
|
40307
|
-
name: "deviceIds",
|
|
40308
|
-
form: "array",
|
|
40309
|
-
optional: false
|
|
40310
|
-
}],
|
|
40311
40464
|
"pipelineAnalytics.listOpsLog": [{
|
|
40312
40465
|
name: "deviceId",
|
|
40313
40466
|
form: "single",
|
|
@@ -40353,6 +40506,11 @@ Object.freeze({
|
|
|
40353
40506
|
form: "single",
|
|
40354
40507
|
optional: true
|
|
40355
40508
|
}],
|
|
40509
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
40510
|
+
name: "deviceIds",
|
|
40511
|
+
form: "array",
|
|
40512
|
+
optional: true
|
|
40513
|
+
}],
|
|
40356
40514
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
40357
40515
|
name: "deviceId",
|
|
40358
40516
|
form: "single",
|
|
@@ -40718,6 +40876,11 @@ Object.freeze({
|
|
|
40718
40876
|
form: "single",
|
|
40719
40877
|
optional: false
|
|
40720
40878
|
}],
|
|
40879
|
+
"recording.setDevicePlacement": [{
|
|
40880
|
+
name: "deviceId",
|
|
40881
|
+
form: "single",
|
|
40882
|
+
optional: false
|
|
40883
|
+
}],
|
|
40721
40884
|
"recording.startStorageMigrationMove": [{
|
|
40722
40885
|
name: "deviceId",
|
|
40723
40886
|
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()
|
|
@@ -16781,6 +16859,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
16781
16859
|
"device-offline",
|
|
16782
16860
|
"device-disabled",
|
|
16783
16861
|
"device-enabled",
|
|
16862
|
+
"device-battery-low",
|
|
16863
|
+
"device-battery-normal",
|
|
16784
16864
|
"stream-online",
|
|
16785
16865
|
"stream-offline",
|
|
16786
16866
|
"node-online",
|
|
@@ -20039,46 +20119,6 @@ var RecentTracksPageSchema = object({
|
|
|
20039
20119
|
/** Cursor for the next page, or null when this page is the last. */
|
|
20040
20120
|
nextCursor: string().nullable()
|
|
20041
20121
|
});
|
|
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
20122
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
20083
20123
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
20084
20124
|
var KeyEventQueryInput = object({
|
|
@@ -20182,9 +20222,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
20182
20222
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
20183
20223
|
plates: number().int(),
|
|
20184
20224
|
/** 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()
|
|
20225
|
+
embeddings: number().int()
|
|
20188
20226
|
});
|
|
20189
20227
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
20190
20228
|
var DiskReconcileCountsSchema = object({
|
|
@@ -20354,6 +20392,47 @@ var RebuildStatusSchema = object({
|
|
|
20354
20392
|
/** Present when the pass ended by throwing. */
|
|
20355
20393
|
error: string().nullable()
|
|
20356
20394
|
});
|
|
20395
|
+
/**
|
|
20396
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
20397
|
+
*
|
|
20398
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
20399
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
20400
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
20401
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
20402
|
+
*/
|
|
20403
|
+
var MediaReclaimStartResultSchema = object({
|
|
20404
|
+
started: boolean(),
|
|
20405
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
20406
|
+
alreadyRunning: boolean()
|
|
20407
|
+
});
|
|
20408
|
+
var MediaReclaimInputSchema = object({
|
|
20409
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
20410
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
20411
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
20412
|
+
restart: boolean().optional(),
|
|
20413
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
20414
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
20415
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
20416
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
20417
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
20418
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
20419
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
20420
|
+
});
|
|
20421
|
+
var MediaReclaimStatusSchema = object({
|
|
20422
|
+
running: boolean(),
|
|
20423
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
20424
|
+
totalExamined: number(),
|
|
20425
|
+
totalEligible: number(),
|
|
20426
|
+
totalReclaimed: number(),
|
|
20427
|
+
totalBytesReclaimed: number(),
|
|
20428
|
+
totalRefused: number(),
|
|
20429
|
+
/** Device+scope windows finished in this pass. */
|
|
20430
|
+
devicesDone: number(),
|
|
20431
|
+
complete: boolean().nullable(),
|
|
20432
|
+
startedAtMs: number().nullable(),
|
|
20433
|
+
finishedAtMs: number().nullable(),
|
|
20434
|
+
error: string().nullable()
|
|
20435
|
+
});
|
|
20357
20436
|
var ReplayFrameInputSchema = object({
|
|
20358
20437
|
timestamp: number(),
|
|
20359
20438
|
frame: PipelineRunResultBridge
|
|
@@ -20392,10 +20471,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
20392
20471
|
* stationary registry). Default false: the timeline lists passages,
|
|
20393
20472
|
* not parking records (operator decision, 2026-08-15). */
|
|
20394
20473
|
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(), {
|
|
20474
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
20399
20475
|
kind: "mutation",
|
|
20400
20476
|
auth: "admin"
|
|
20401
20477
|
}), 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 +20571,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
20495
20571
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
20496
20572
|
kind: "query",
|
|
20497
20573
|
auth: "admin"
|
|
20574
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
20575
|
+
kind: "mutation",
|
|
20576
|
+
auth: "admin"
|
|
20577
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
20578
|
+
kind: "query",
|
|
20579
|
+
auth: "admin"
|
|
20498
20580
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
20499
20581
|
kind: "query",
|
|
20500
20582
|
auth: "admin"
|
|
@@ -22465,7 +22547,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
22465
22547
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
22466
22548
|
kind: "mutation",
|
|
22467
22549
|
auth: "admin"
|
|
22468
|
-
})
|
|
22550
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
22551
|
+
kind: "mutation",
|
|
22552
|
+
auth: "admin"
|
|
22553
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
22554
|
+
kind: "mutation",
|
|
22555
|
+
auth: "admin"
|
|
22556
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
22469
22557
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
22470
22558
|
providerId: string().min(1),
|
|
22471
22559
|
displayName: string().min(1),
|
|
@@ -29558,6 +29646,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
29558
29646
|
minMoveGb: number().min(0).optional()
|
|
29559
29647
|
});
|
|
29560
29648
|
/**
|
|
29649
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
29650
|
+
*
|
|
29651
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
29652
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
29653
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
29654
|
+
*/
|
|
29655
|
+
var RecordingDevicePlacementSchema = object({
|
|
29656
|
+
deviceId: number().int(),
|
|
29657
|
+
profile: string(),
|
|
29658
|
+
locationId: string()
|
|
29659
|
+
});
|
|
29660
|
+
var RecordingDevicePinSchema = object({
|
|
29661
|
+
deviceId: number().int(),
|
|
29662
|
+
/** Recordings-class location this camera is pinned to. */
|
|
29663
|
+
locationId: string()
|
|
29664
|
+
});
|
|
29665
|
+
var RecordingPlacementViewSchema = object({
|
|
29666
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
29667
|
+
pins: array(RecordingDevicePinSchema),
|
|
29668
|
+
defaultLocations: record(string(), string())
|
|
29669
|
+
});
|
|
29670
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
29671
|
+
deviceId: number().int(),
|
|
29672
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
29673
|
+
locationId: string().nullable()
|
|
29674
|
+
});
|
|
29675
|
+
/**
|
|
29561
29676
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
29562
29677
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
29563
29678
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -29783,6 +29898,12 @@ method(object({
|
|
|
29783
29898
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
29784
29899
|
kind: "mutation",
|
|
29785
29900
|
auth: "admin"
|
|
29901
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
29902
|
+
kind: "query",
|
|
29903
|
+
auth: "admin"
|
|
29904
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
29905
|
+
kind: "mutation",
|
|
29906
|
+
auth: "admin"
|
|
29786
29907
|
});
|
|
29787
29908
|
/**
|
|
29788
29909
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -34852,6 +34973,12 @@ Object.freeze({
|
|
|
34852
34973
|
addonId: null,
|
|
34853
34974
|
access: "delete"
|
|
34854
34975
|
},
|
|
34976
|
+
"deviceManager.renameLocation": {
|
|
34977
|
+
capName: "device-manager",
|
|
34978
|
+
capScope: "system",
|
|
34979
|
+
addonId: null,
|
|
34980
|
+
access: "create"
|
|
34981
|
+
},
|
|
34855
34982
|
"deviceManager.runDeviceAction": {
|
|
34856
34983
|
capName: "device-manager",
|
|
34857
34984
|
capScope: "system",
|
|
@@ -36544,19 +36671,19 @@ Object.freeze({
|
|
|
36544
36671
|
addonId: null,
|
|
36545
36672
|
access: "view"
|
|
36546
36673
|
},
|
|
36547
|
-
"pipelineAnalytics.
|
|
36674
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
36548
36675
|
capName: "pipeline-analytics",
|
|
36549
36676
|
capScope: "device",
|
|
36550
36677
|
addonId: null,
|
|
36551
36678
|
access: "view"
|
|
36552
36679
|
},
|
|
36553
|
-
"pipelineAnalytics.
|
|
36680
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
36554
36681
|
capName: "pipeline-analytics",
|
|
36555
36682
|
capScope: "device",
|
|
36556
36683
|
addonId: null,
|
|
36557
36684
|
access: "view"
|
|
36558
36685
|
},
|
|
36559
|
-
"pipelineAnalytics.
|
|
36686
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
36560
36687
|
capName: "pipeline-analytics",
|
|
36561
36688
|
capScope: "device",
|
|
36562
36689
|
addonId: null,
|
|
@@ -36646,12 +36773,6 @@ Object.freeze({
|
|
|
36646
36773
|
addonId: null,
|
|
36647
36774
|
access: "view"
|
|
36648
36775
|
},
|
|
36649
|
-
"pipelineAnalytics.listGroups": {
|
|
36650
|
-
capName: "pipeline-analytics",
|
|
36651
|
-
capScope: "device",
|
|
36652
|
-
addonId: null,
|
|
36653
|
-
access: "view"
|
|
36654
|
-
},
|
|
36655
36776
|
"pipelineAnalytics.listOpsLog": {
|
|
36656
36777
|
capName: "pipeline-analytics",
|
|
36657
36778
|
capScope: "device",
|
|
@@ -36736,6 +36857,12 @@ Object.freeze({
|
|
|
36736
36857
|
addonId: null,
|
|
36737
36858
|
access: "create"
|
|
36738
36859
|
},
|
|
36860
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
36861
|
+
capName: "pipeline-analytics",
|
|
36862
|
+
capScope: "device",
|
|
36863
|
+
addonId: null,
|
|
36864
|
+
access: "create"
|
|
36865
|
+
},
|
|
36739
36866
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
36740
36867
|
capName: "pipeline-analytics",
|
|
36741
36868
|
capScope: "device",
|
|
@@ -37660,6 +37787,12 @@ Object.freeze({
|
|
|
37660
37787
|
addonId: null,
|
|
37661
37788
|
access: "view"
|
|
37662
37789
|
},
|
|
37790
|
+
"recording.getPlacement": {
|
|
37791
|
+
capName: "recording",
|
|
37792
|
+
capScope: "system",
|
|
37793
|
+
addonId: null,
|
|
37794
|
+
access: "view"
|
|
37795
|
+
},
|
|
37663
37796
|
"recording.getPlaybackManifest": {
|
|
37664
37797
|
capName: "recording",
|
|
37665
37798
|
capScope: "system",
|
|
@@ -37786,6 +37919,12 @@ Object.freeze({
|
|
|
37786
37919
|
addonId: null,
|
|
37787
37920
|
access: "create"
|
|
37788
37921
|
},
|
|
37922
|
+
"recording.setDevicePlacement": {
|
|
37923
|
+
capName: "recording",
|
|
37924
|
+
capScope: "system",
|
|
37925
|
+
addonId: null,
|
|
37926
|
+
access: "create"
|
|
37927
|
+
},
|
|
37789
37928
|
"recording.startStorageMigrationMove": {
|
|
37790
37929
|
capName: "recording",
|
|
37791
37930
|
capScope: "system",
|
|
@@ -38230,12 +38369,36 @@ Object.freeze({
|
|
|
38230
38369
|
addonId: null,
|
|
38231
38370
|
access: "create"
|
|
38232
38371
|
},
|
|
38372
|
+
"storageMigration.cleanupCancel": {
|
|
38373
|
+
capName: "storage-migration",
|
|
38374
|
+
capScope: "system",
|
|
38375
|
+
addonId: null,
|
|
38376
|
+
access: "create"
|
|
38377
|
+
},
|
|
38378
|
+
"storageMigration.cleanupStart": {
|
|
38379
|
+
capName: "storage-migration",
|
|
38380
|
+
capScope: "system",
|
|
38381
|
+
addonId: null,
|
|
38382
|
+
access: "create"
|
|
38383
|
+
},
|
|
38384
|
+
"storageMigration.cleanupStatus": {
|
|
38385
|
+
capName: "storage-migration",
|
|
38386
|
+
capScope: "system",
|
|
38387
|
+
addonId: null,
|
|
38388
|
+
access: "view"
|
|
38389
|
+
},
|
|
38233
38390
|
"storageMigration.drain": {
|
|
38234
38391
|
capName: "storage-migration",
|
|
38235
38392
|
capScope: "system",
|
|
38236
38393
|
addonId: null,
|
|
38237
38394
|
access: "create"
|
|
38238
38395
|
},
|
|
38396
|
+
"storageMigration.history": {
|
|
38397
|
+
capName: "storage-migration",
|
|
38398
|
+
capScope: "system",
|
|
38399
|
+
addonId: null,
|
|
38400
|
+
access: "view"
|
|
38401
|
+
},
|
|
38239
38402
|
"storageMigration.movers": {
|
|
38240
38403
|
capName: "storage-migration",
|
|
38241
38404
|
capScope: "system",
|
|
@@ -40232,11 +40395,6 @@ Object.freeze({
|
|
|
40232
40395
|
form: "single",
|
|
40233
40396
|
optional: true
|
|
40234
40397
|
}],
|
|
40235
|
-
"pipelineAnalytics.getGroup": [{
|
|
40236
|
-
name: "deviceId",
|
|
40237
|
-
form: "single",
|
|
40238
|
-
optional: false
|
|
40239
|
-
}],
|
|
40240
40398
|
"pipelineAnalytics.getKeyEvents": [{
|
|
40241
40399
|
name: "deviceId",
|
|
40242
40400
|
form: "single",
|
|
@@ -40302,11 +40460,6 @@ Object.freeze({
|
|
|
40302
40460
|
form: "single",
|
|
40303
40461
|
optional: false
|
|
40304
40462
|
}],
|
|
40305
|
-
"pipelineAnalytics.listGroups": [{
|
|
40306
|
-
name: "deviceIds",
|
|
40307
|
-
form: "array",
|
|
40308
|
-
optional: false
|
|
40309
|
-
}],
|
|
40310
40463
|
"pipelineAnalytics.listOpsLog": [{
|
|
40311
40464
|
name: "deviceId",
|
|
40312
40465
|
form: "single",
|
|
@@ -40352,6 +40505,11 @@ Object.freeze({
|
|
|
40352
40505
|
form: "single",
|
|
40353
40506
|
optional: true
|
|
40354
40507
|
}],
|
|
40508
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
40509
|
+
name: "deviceIds",
|
|
40510
|
+
form: "array",
|
|
40511
|
+
optional: true
|
|
40512
|
+
}],
|
|
40355
40513
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
40356
40514
|
name: "deviceId",
|
|
40357
40515
|
form: "single",
|
|
@@ -40717,6 +40875,11 @@ Object.freeze({
|
|
|
40717
40875
|
form: "single",
|
|
40718
40876
|
optional: false
|
|
40719
40877
|
}],
|
|
40878
|
+
"recording.setDevicePlacement": [{
|
|
40879
|
+
name: "deviceId",
|
|
40880
|
+
form: "single",
|
|
40881
|
+
optional: false
|
|
40882
|
+
}],
|
|
40720
40883
|
"recording.startStorageMigrationMove": [{
|
|
40721
40884
|
name: "deviceId",
|
|
40722
40885
|
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.50",
|
|
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",
|