@camstack/addon-mqtt-broker 1.2.49 → 1.2.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/mqtt-broker.addon.js +234 -73
- package/dist/mqtt-broker.addon.mjs +234 -73
- package/package.json +1 -1
|
@@ -8125,6 +8125,13 @@ var MediaRelocateModeSchema = _enum([
|
|
|
8125
8125
|
]);
|
|
8126
8126
|
var RelocateMediaInputSchema = object({
|
|
8127
8127
|
toLocationId: string(),
|
|
8128
|
+
/**
|
|
8129
|
+
* Restrict the pass to rows currently on this location. Omitted / `'*'` =
|
|
8130
|
+
* every row that is not already on `toLocationId` (the historical
|
|
8131
|
+
* behaviour). A named source is what a from→to migration needs: without it
|
|
8132
|
+
* "move events off disk 2" also emptied disk 1.
|
|
8133
|
+
*/
|
|
8134
|
+
fromLocationId: string().optional(),
|
|
8128
8135
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8129
8136
|
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8130
8137
|
mode: MediaRelocateModeSchema.optional()
|
|
@@ -8192,6 +8199,19 @@ var StorageMigrationDestinationsSchema = object({
|
|
|
8192
8199
|
galleryMedia: string().min(1).optional()
|
|
8193
8200
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8194
8201
|
/**
|
|
8202
|
+
* Optional named source per class. Omitted = the class's current default
|
|
8203
|
+
* (the historical behaviour). A named source that is NOT the default is a
|
|
8204
|
+
* drain of that disk: bytes move, the default stays, and the source is
|
|
8205
|
+
* disabled when the move finishes.
|
|
8206
|
+
*/
|
|
8207
|
+
var StorageMigrationSourcesSchema = object({
|
|
8208
|
+
recordings: string().min(1).optional(),
|
|
8209
|
+
recordingsLow: string().min(1).optional(),
|
|
8210
|
+
eventMedia: string().min(1).optional(),
|
|
8211
|
+
backups: string().min(1).optional(),
|
|
8212
|
+
galleryMedia: string().min(1).optional()
|
|
8213
|
+
}).optional();
|
|
8214
|
+
/**
|
|
8195
8215
|
* How a migration sequences the cutover against the byte move.
|
|
8196
8216
|
*
|
|
8197
8217
|
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
@@ -8213,6 +8233,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
|
8213
8233
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8214
8234
|
var StorageMigrationInputSchema = object({
|
|
8215
8235
|
destinations: StorageMigrationDestinationsSchema,
|
|
8236
|
+
/** Omitted = each class's current default. */
|
|
8237
|
+
sources: StorageMigrationSourcesSchema,
|
|
8216
8238
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8217
8239
|
/** Omitted = `blocking`, which stays the default. */
|
|
8218
8240
|
mode: StorageMigrationModeSchema.optional()
|
|
@@ -8292,6 +8314,13 @@ var StorageMigrationMoveSchema = object({
|
|
|
8292
8314
|
storageClass: StorageMigrationClassSchema,
|
|
8293
8315
|
fromLocationId: string(),
|
|
8294
8316
|
toLocationId: string(),
|
|
8317
|
+
/**
|
|
8318
|
+
* True when `from` was NOT the class default at plan time. The move still
|
|
8319
|
+
* copies bytes, but the default is left alone and the source is disabled
|
|
8320
|
+
* once the copy verifies. Absent on jobs planned before this field existed
|
|
8321
|
+
* — those jobs always repointed, which is `false`.
|
|
8322
|
+
*/
|
|
8323
|
+
freezeSource: boolean().optional(),
|
|
8295
8324
|
moverJobId: string().nullable(),
|
|
8296
8325
|
state: RelocateJobStateSchema.nullable(),
|
|
8297
8326
|
error: string().nullable(),
|
|
@@ -8305,6 +8334,7 @@ var StorageMigrationJobSchema = object({
|
|
|
8305
8334
|
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8306
8335
|
mode: StorageMigrationModeSchema,
|
|
8307
8336
|
destinations: StorageMigrationDestinationsSchema,
|
|
8337
|
+
sources: StorageMigrationSourcesSchema,
|
|
8308
8338
|
throttleMbps: number(),
|
|
8309
8339
|
moves: array(StorageMigrationMoveSchema),
|
|
8310
8340
|
pauseLeaseId: string().nullable(),
|
|
@@ -8330,6 +8360,7 @@ var StorageMigrationFindingSchema = object({
|
|
|
8330
8360
|
});
|
|
8331
8361
|
var StorageMigrationPlanSchema = object({
|
|
8332
8362
|
destinations: StorageMigrationDestinationsSchema,
|
|
8363
|
+
sources: StorageMigrationSourcesSchema,
|
|
8333
8364
|
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8334
8365
|
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8335
8366
|
* it. */
|
|
@@ -8337,7 +8368,8 @@ var StorageMigrationPlanSchema = object({
|
|
|
8337
8368
|
moves: array(object({
|
|
8338
8369
|
storageClass: StorageMigrationClassSchema,
|
|
8339
8370
|
fromLocationId: string(),
|
|
8340
|
-
toLocationId: string()
|
|
8371
|
+
toLocationId: string(),
|
|
8372
|
+
freezeSource: boolean().optional()
|
|
8341
8373
|
})),
|
|
8342
8374
|
findings: array(StorageMigrationFindingSchema)
|
|
8343
8375
|
});
|
|
@@ -8515,10 +8547,51 @@ var LedgerWalkReportSchema = object({
|
|
|
8515
8547
|
var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
|
|
8516
8548
|
var RelocatableMediaCountInputSchema = object({
|
|
8517
8549
|
toLocationId: string().min(1),
|
|
8550
|
+
/** Restrict the count to one source; omitted / `'*'` = every non-target row. */
|
|
8551
|
+
fromLocationId: string().optional(),
|
|
8518
8552
|
/** Omitted = `move`. */
|
|
8519
8553
|
mode: MediaRelocateModeSchema.optional()
|
|
8520
8554
|
});
|
|
8521
8555
|
/**
|
|
8556
|
+
* Operator cleanup of leftover analytics rows, optional debug media, and
|
|
8557
|
+
* ghost ledger entries on frozen footage locations.
|
|
8558
|
+
*
|
|
8559
|
+
* A pass is tens of minutes on a standing backlog. The hub method RETURNS
|
|
8560
|
+
* `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
|
|
8561
|
+
* is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
|
|
8562
|
+
* with no operator-visible status.
|
|
8563
|
+
*/
|
|
8564
|
+
var StorageCleanupPhaseSchema = _enum([
|
|
8565
|
+
"orphans",
|
|
8566
|
+
"debug-media",
|
|
8567
|
+
"ghost-ledger",
|
|
8568
|
+
"done",
|
|
8569
|
+
"failed",
|
|
8570
|
+
"cancelled"
|
|
8571
|
+
]);
|
|
8572
|
+
var StorageCleanupInputSchema = object({
|
|
8573
|
+
/** Also walk motion stills / track filmstrips. Off by default. */
|
|
8574
|
+
includeDebugMedia: boolean().optional() });
|
|
8575
|
+
var StorageCleanupJobSchema = object({
|
|
8576
|
+
jobId: string(),
|
|
8577
|
+
phase: StorageCleanupPhaseSchema,
|
|
8578
|
+
includeDebugMedia: boolean(),
|
|
8579
|
+
orphansReclaimed: number().int().nonnegative(),
|
|
8580
|
+
orphanBytesReclaimed: number().int().nonnegative(),
|
|
8581
|
+
debugMediaReclaimed: number().int().nonnegative(),
|
|
8582
|
+
debugMediaBytesReclaimed: number().int().nonnegative(),
|
|
8583
|
+
ghostsForgotten: number().int().nonnegative(),
|
|
8584
|
+
ghostBytesForgotten: number().int().nonnegative(),
|
|
8585
|
+
/** Short operator-facing line: current collection, pass, or location. */
|
|
8586
|
+
detail: string().nullable(),
|
|
8587
|
+
cancelRequested: boolean(),
|
|
8588
|
+
startedAt: number(),
|
|
8589
|
+
updatedAt: number(),
|
|
8590
|
+
finishedAt: number().nullable(),
|
|
8591
|
+
error: string().nullable()
|
|
8592
|
+
});
|
|
8593
|
+
var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
|
|
8594
|
+
/**
|
|
8522
8595
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
8523
8596
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
8524
8597
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -8546,11 +8619,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
|
|
|
8546
8619
|
* The default location for a type uses `id === <type>:default` by
|
|
8547
8620
|
* convention (the bare type ref like `'backups'` resolves to it).
|
|
8548
8621
|
*
|
|
8549
|
-
* `isSystem
|
|
8550
|
-
*
|
|
8551
|
-
*
|
|
8552
|
-
*
|
|
8553
|
-
* deleting it is rejected at the cap level.
|
|
8622
|
+
* `isSystem` is a legacy persisted flag. Seed still creates the initial
|
|
8623
|
+
* `<type>:default` locations; the flag is no longer a lock, a badge, or a
|
|
8624
|
+
* prune selector. New writes leave it false. Deletion is gated on uniqueness
|
|
8625
|
+
* / last-enabled, not on this bit.
|
|
8554
8626
|
*/
|
|
8555
8627
|
var StorageLocationSchema = object({
|
|
8556
8628
|
id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
|
|
@@ -12861,6 +12933,12 @@ method(object({
|
|
|
12861
12933
|
}), _void(), {
|
|
12862
12934
|
kind: "mutation",
|
|
12863
12935
|
auth: "admin"
|
|
12936
|
+
}), method(object({
|
|
12937
|
+
from: string(),
|
|
12938
|
+
to: string()
|
|
12939
|
+
}), object({ moved: number() }), {
|
|
12940
|
+
kind: "mutation",
|
|
12941
|
+
auth: "admin"
|
|
12864
12942
|
}), method(object({
|
|
12865
12943
|
deviceId: number(),
|
|
12866
12944
|
disabled: boolean()
|
|
@@ -18810,46 +18888,6 @@ var RecentTracksPageSchema = object({
|
|
|
18810
18888
|
/** Cursor for the next page, or null when this page is the last. */
|
|
18811
18889
|
nextCursor: string().nullable()
|
|
18812
18890
|
});
|
|
18813
|
-
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
18814
|
-
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
18815
|
-
var AnalyticsGroupRecordSchema = object({
|
|
18816
|
-
id: string(),
|
|
18817
|
-
deviceId: number().int(),
|
|
18818
|
-
openedAt: number().int(),
|
|
18819
|
-
closedAt: number().int(),
|
|
18820
|
-
timestamp: number().int(),
|
|
18821
|
-
memberCount: number().int(),
|
|
18822
|
-
memberTrackIds: array(string()).readonly(),
|
|
18823
|
-
className: string(),
|
|
18824
|
-
classes: array(string()).readonly(),
|
|
18825
|
-
/** Relative event-media path, or null when the group has no picture yet. */
|
|
18826
|
-
mediaUrl: string().nullable(),
|
|
18827
|
-
singleton: boolean()
|
|
18828
|
-
});
|
|
18829
|
-
var AnalyticsGroupMemberSchema = object({
|
|
18830
|
-
trackId: string(),
|
|
18831
|
-
deviceId: number().int(),
|
|
18832
|
-
className: string(),
|
|
18833
|
-
firstSeen: number().int(),
|
|
18834
|
-
lastSeen: number().int(),
|
|
18835
|
-
mediaUrl: string().nullable()
|
|
18836
|
-
});
|
|
18837
|
-
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
18838
|
-
var ListGroupsQueryInput = object({
|
|
18839
|
-
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
18840
|
-
deviceIds: array(number()),
|
|
18841
|
-
/** Window lower bound on `closedAt` (inclusive). */
|
|
18842
|
-
since: number().optional(),
|
|
18843
|
-
/** Window upper bound on `openedAt` (inclusive). */
|
|
18844
|
-
until: number().optional(),
|
|
18845
|
-
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
18846
|
-
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
18847
|
-
cursor: string().optional()
|
|
18848
|
-
});
|
|
18849
|
-
var ListGroupsPageSchema = object({
|
|
18850
|
-
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
18851
|
-
nextCursor: string().nullable()
|
|
18852
|
-
});
|
|
18853
18891
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
18854
18892
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
18855
18893
|
var KeyEventQueryInput = object({
|
|
@@ -18953,9 +18991,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
18953
18991
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
18954
18992
|
plates: number().int(),
|
|
18955
18993
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
18956
|
-
embeddings: number().int()
|
|
18957
|
-
/** Group membership + group rows removed with their last member (best-effort). */
|
|
18958
|
-
groups: number().int()
|
|
18994
|
+
embeddings: number().int()
|
|
18959
18995
|
});
|
|
18960
18996
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
18961
18997
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19125,6 +19161,47 @@ var RebuildStatusSchema = object({
|
|
|
19125
19161
|
/** Present when the pass ended by throwing. */
|
|
19126
19162
|
error: string().nullable()
|
|
19127
19163
|
});
|
|
19164
|
+
/**
|
|
19165
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19166
|
+
*
|
|
19167
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19168
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19169
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19170
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19171
|
+
*/
|
|
19172
|
+
var MediaReclaimStartResultSchema = object({
|
|
19173
|
+
started: boolean(),
|
|
19174
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19175
|
+
alreadyRunning: boolean()
|
|
19176
|
+
});
|
|
19177
|
+
var MediaReclaimInputSchema = object({
|
|
19178
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19179
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19180
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19181
|
+
restart: boolean().optional(),
|
|
19182
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19183
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19184
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19185
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19186
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19187
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19188
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19189
|
+
});
|
|
19190
|
+
var MediaReclaimStatusSchema = object({
|
|
19191
|
+
running: boolean(),
|
|
19192
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19193
|
+
totalExamined: number(),
|
|
19194
|
+
totalEligible: number(),
|
|
19195
|
+
totalReclaimed: number(),
|
|
19196
|
+
totalBytesReclaimed: number(),
|
|
19197
|
+
totalRefused: number(),
|
|
19198
|
+
/** Device+scope windows finished in this pass. */
|
|
19199
|
+
devicesDone: number(),
|
|
19200
|
+
complete: boolean().nullable(),
|
|
19201
|
+
startedAtMs: number().nullable(),
|
|
19202
|
+
finishedAtMs: number().nullable(),
|
|
19203
|
+
error: string().nullable()
|
|
19204
|
+
});
|
|
19128
19205
|
var ReplayFrameInputSchema = object({
|
|
19129
19206
|
timestamp: number(),
|
|
19130
19207
|
frame: PipelineRunResultBridge
|
|
@@ -19163,10 +19240,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19163
19240
|
* stationary registry). Default false: the timeline lists passages,
|
|
19164
19241
|
* not parking records (operator decision, 2026-08-15). */
|
|
19165
19242
|
includeStationary: boolean().optional()
|
|
19166
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
19167
|
-
deviceId: number(),
|
|
19168
|
-
groupId: string().min(1)
|
|
19169
|
-
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
19243
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19170
19244
|
kind: "mutation",
|
|
19171
19245
|
auth: "admin"
|
|
19172
19246
|
}), 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({
|
|
@@ -19266,6 +19340,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19266
19340
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19267
19341
|
kind: "query",
|
|
19268
19342
|
auth: "admin"
|
|
19343
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19344
|
+
kind: "mutation",
|
|
19345
|
+
auth: "admin"
|
|
19346
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19347
|
+
kind: "query",
|
|
19348
|
+
auth: "admin"
|
|
19269
19349
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19270
19350
|
kind: "query",
|
|
19271
19351
|
auth: "admin"
|
|
@@ -21236,7 +21316,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21236
21316
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21237
21317
|
kind: "mutation",
|
|
21238
21318
|
auth: "admin"
|
|
21239
|
-
})
|
|
21319
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21320
|
+
kind: "mutation",
|
|
21321
|
+
auth: "admin"
|
|
21322
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21323
|
+
kind: "mutation",
|
|
21324
|
+
auth: "admin"
|
|
21325
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21240
21326
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21241
21327
|
providerId: string().min(1),
|
|
21242
21328
|
displayName: string().min(1),
|
|
@@ -26614,6 +26700,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
26614
26700
|
minMoveGb: number().min(0).optional()
|
|
26615
26701
|
});
|
|
26616
26702
|
/**
|
|
26703
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
26704
|
+
*
|
|
26705
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
26706
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
26707
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
26708
|
+
*/
|
|
26709
|
+
var RecordingDevicePlacementSchema = object({
|
|
26710
|
+
deviceId: number().int(),
|
|
26711
|
+
profile: string(),
|
|
26712
|
+
locationId: string()
|
|
26713
|
+
});
|
|
26714
|
+
var RecordingDevicePinSchema = object({
|
|
26715
|
+
deviceId: number().int(),
|
|
26716
|
+
/** Recordings-class location this camera is pinned to. */
|
|
26717
|
+
locationId: string()
|
|
26718
|
+
});
|
|
26719
|
+
var RecordingPlacementViewSchema = object({
|
|
26720
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
26721
|
+
pins: array(RecordingDevicePinSchema),
|
|
26722
|
+
defaultLocations: record(string(), string())
|
|
26723
|
+
});
|
|
26724
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
26725
|
+
deviceId: number().int(),
|
|
26726
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
26727
|
+
locationId: string().nullable()
|
|
26728
|
+
});
|
|
26729
|
+
/**
|
|
26617
26730
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
26618
26731
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
26619
26732
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -26839,6 +26952,12 @@ method(object({
|
|
|
26839
26952
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
26840
26953
|
kind: "mutation",
|
|
26841
26954
|
auth: "admin"
|
|
26955
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
26956
|
+
kind: "query",
|
|
26957
|
+
auth: "admin"
|
|
26958
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
26959
|
+
kind: "mutation",
|
|
26960
|
+
auth: "admin"
|
|
26842
26961
|
});
|
|
26843
26962
|
/**
|
|
26844
26963
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -30209,6 +30328,12 @@ Object.freeze({
|
|
|
30209
30328
|
addonId: null,
|
|
30210
30329
|
access: "delete"
|
|
30211
30330
|
},
|
|
30331
|
+
"deviceManager.renameLocation": {
|
|
30332
|
+
capName: "device-manager",
|
|
30333
|
+
capScope: "system",
|
|
30334
|
+
addonId: null,
|
|
30335
|
+
access: "create"
|
|
30336
|
+
},
|
|
30212
30337
|
"deviceManager.runDeviceAction": {
|
|
30213
30338
|
capName: "device-manager",
|
|
30214
30339
|
capScope: "system",
|
|
@@ -31901,19 +32026,19 @@ Object.freeze({
|
|
|
31901
32026
|
addonId: null,
|
|
31902
32027
|
access: "view"
|
|
31903
32028
|
},
|
|
31904
|
-
"pipelineAnalytics.
|
|
32029
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
31905
32030
|
capName: "pipeline-analytics",
|
|
31906
32031
|
capScope: "device",
|
|
31907
32032
|
addonId: null,
|
|
31908
32033
|
access: "view"
|
|
31909
32034
|
},
|
|
31910
|
-
"pipelineAnalytics.
|
|
32035
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
31911
32036
|
capName: "pipeline-analytics",
|
|
31912
32037
|
capScope: "device",
|
|
31913
32038
|
addonId: null,
|
|
31914
32039
|
access: "view"
|
|
31915
32040
|
},
|
|
31916
|
-
"pipelineAnalytics.
|
|
32041
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
31917
32042
|
capName: "pipeline-analytics",
|
|
31918
32043
|
capScope: "device",
|
|
31919
32044
|
addonId: null,
|
|
@@ -32003,12 +32128,6 @@ Object.freeze({
|
|
|
32003
32128
|
addonId: null,
|
|
32004
32129
|
access: "view"
|
|
32005
32130
|
},
|
|
32006
|
-
"pipelineAnalytics.listGroups": {
|
|
32007
|
-
capName: "pipeline-analytics",
|
|
32008
|
-
capScope: "device",
|
|
32009
|
-
addonId: null,
|
|
32010
|
-
access: "view"
|
|
32011
|
-
},
|
|
32012
32131
|
"pipelineAnalytics.listOpsLog": {
|
|
32013
32132
|
capName: "pipeline-analytics",
|
|
32014
32133
|
capScope: "device",
|
|
@@ -32093,6 +32212,12 @@ Object.freeze({
|
|
|
32093
32212
|
addonId: null,
|
|
32094
32213
|
access: "create"
|
|
32095
32214
|
},
|
|
32215
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
32216
|
+
capName: "pipeline-analytics",
|
|
32217
|
+
capScope: "device",
|
|
32218
|
+
addonId: null,
|
|
32219
|
+
access: "create"
|
|
32220
|
+
},
|
|
32096
32221
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
32097
32222
|
capName: "pipeline-analytics",
|
|
32098
32223
|
capScope: "device",
|
|
@@ -33017,6 +33142,12 @@ Object.freeze({
|
|
|
33017
33142
|
addonId: null,
|
|
33018
33143
|
access: "view"
|
|
33019
33144
|
},
|
|
33145
|
+
"recording.getPlacement": {
|
|
33146
|
+
capName: "recording",
|
|
33147
|
+
capScope: "system",
|
|
33148
|
+
addonId: null,
|
|
33149
|
+
access: "view"
|
|
33150
|
+
},
|
|
33020
33151
|
"recording.getPlaybackManifest": {
|
|
33021
33152
|
capName: "recording",
|
|
33022
33153
|
capScope: "system",
|
|
@@ -33143,6 +33274,12 @@ Object.freeze({
|
|
|
33143
33274
|
addonId: null,
|
|
33144
33275
|
access: "create"
|
|
33145
33276
|
},
|
|
33277
|
+
"recording.setDevicePlacement": {
|
|
33278
|
+
capName: "recording",
|
|
33279
|
+
capScope: "system",
|
|
33280
|
+
addonId: null,
|
|
33281
|
+
access: "create"
|
|
33282
|
+
},
|
|
33146
33283
|
"recording.startStorageMigrationMove": {
|
|
33147
33284
|
capName: "recording",
|
|
33148
33285
|
capScope: "system",
|
|
@@ -33587,12 +33724,36 @@ Object.freeze({
|
|
|
33587
33724
|
addonId: null,
|
|
33588
33725
|
access: "create"
|
|
33589
33726
|
},
|
|
33727
|
+
"storageMigration.cleanupCancel": {
|
|
33728
|
+
capName: "storage-migration",
|
|
33729
|
+
capScope: "system",
|
|
33730
|
+
addonId: null,
|
|
33731
|
+
access: "create"
|
|
33732
|
+
},
|
|
33733
|
+
"storageMigration.cleanupStart": {
|
|
33734
|
+
capName: "storage-migration",
|
|
33735
|
+
capScope: "system",
|
|
33736
|
+
addonId: null,
|
|
33737
|
+
access: "create"
|
|
33738
|
+
},
|
|
33739
|
+
"storageMigration.cleanupStatus": {
|
|
33740
|
+
capName: "storage-migration",
|
|
33741
|
+
capScope: "system",
|
|
33742
|
+
addonId: null,
|
|
33743
|
+
access: "view"
|
|
33744
|
+
},
|
|
33590
33745
|
"storageMigration.drain": {
|
|
33591
33746
|
capName: "storage-migration",
|
|
33592
33747
|
capScope: "system",
|
|
33593
33748
|
addonId: null,
|
|
33594
33749
|
access: "create"
|
|
33595
33750
|
},
|
|
33751
|
+
"storageMigration.history": {
|
|
33752
|
+
capName: "storage-migration",
|
|
33753
|
+
capScope: "system",
|
|
33754
|
+
addonId: null,
|
|
33755
|
+
access: "view"
|
|
33756
|
+
},
|
|
33596
33757
|
"storageMigration.movers": {
|
|
33597
33758
|
capName: "storage-migration",
|
|
33598
33759
|
capScope: "system",
|
|
@@ -35589,11 +35750,6 @@ Object.freeze({
|
|
|
35589
35750
|
form: "single",
|
|
35590
35751
|
optional: true
|
|
35591
35752
|
}],
|
|
35592
|
-
"pipelineAnalytics.getGroup": [{
|
|
35593
|
-
name: "deviceId",
|
|
35594
|
-
form: "single",
|
|
35595
|
-
optional: false
|
|
35596
|
-
}],
|
|
35597
35753
|
"pipelineAnalytics.getKeyEvents": [{
|
|
35598
35754
|
name: "deviceId",
|
|
35599
35755
|
form: "single",
|
|
@@ -35659,11 +35815,6 @@ Object.freeze({
|
|
|
35659
35815
|
form: "single",
|
|
35660
35816
|
optional: false
|
|
35661
35817
|
}],
|
|
35662
|
-
"pipelineAnalytics.listGroups": [{
|
|
35663
|
-
name: "deviceIds",
|
|
35664
|
-
form: "array",
|
|
35665
|
-
optional: false
|
|
35666
|
-
}],
|
|
35667
35818
|
"pipelineAnalytics.listOpsLog": [{
|
|
35668
35819
|
name: "deviceId",
|
|
35669
35820
|
form: "single",
|
|
@@ -35709,6 +35860,11 @@ Object.freeze({
|
|
|
35709
35860
|
form: "single",
|
|
35710
35861
|
optional: true
|
|
35711
35862
|
}],
|
|
35863
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
35864
|
+
name: "deviceIds",
|
|
35865
|
+
form: "array",
|
|
35866
|
+
optional: true
|
|
35867
|
+
}],
|
|
35712
35868
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
35713
35869
|
name: "deviceId",
|
|
35714
35870
|
form: "single",
|
|
@@ -36074,6 +36230,11 @@ Object.freeze({
|
|
|
36074
36230
|
form: "single",
|
|
36075
36231
|
optional: false
|
|
36076
36232
|
}],
|
|
36233
|
+
"recording.setDevicePlacement": [{
|
|
36234
|
+
name: "deviceId",
|
|
36235
|
+
form: "single",
|
|
36236
|
+
optional: false
|
|
36237
|
+
}],
|
|
36077
36238
|
"recording.startStorageMigrationMove": [{
|
|
36078
36239
|
name: "deviceId",
|
|
36079
36240
|
form: "single",
|
|
@@ -8120,6 +8120,13 @@ var MediaRelocateModeSchema = _enum([
|
|
|
8120
8120
|
]);
|
|
8121
8121
|
var RelocateMediaInputSchema = object({
|
|
8122
8122
|
toLocationId: string(),
|
|
8123
|
+
/**
|
|
8124
|
+
* Restrict the pass to rows currently on this location. Omitted / `'*'` =
|
|
8125
|
+
* every row that is not already on `toLocationId` (the historical
|
|
8126
|
+
* behaviour). A named source is what a from→to migration needs: without it
|
|
8127
|
+
* "move events off disk 2" also emptied disk 1.
|
|
8128
|
+
*/
|
|
8129
|
+
fromLocationId: string().optional(),
|
|
8123
8130
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8124
8131
|
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8125
8132
|
mode: MediaRelocateModeSchema.optional()
|
|
@@ -8187,6 +8194,19 @@ var StorageMigrationDestinationsSchema = object({
|
|
|
8187
8194
|
galleryMedia: string().min(1).optional()
|
|
8188
8195
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8189
8196
|
/**
|
|
8197
|
+
* Optional named source per class. Omitted = the class's current default
|
|
8198
|
+
* (the historical behaviour). A named source that is NOT the default is a
|
|
8199
|
+
* drain of that disk: bytes move, the default stays, and the source is
|
|
8200
|
+
* disabled when the move finishes.
|
|
8201
|
+
*/
|
|
8202
|
+
var StorageMigrationSourcesSchema = object({
|
|
8203
|
+
recordings: string().min(1).optional(),
|
|
8204
|
+
recordingsLow: string().min(1).optional(),
|
|
8205
|
+
eventMedia: string().min(1).optional(),
|
|
8206
|
+
backups: string().min(1).optional(),
|
|
8207
|
+
galleryMedia: string().min(1).optional()
|
|
8208
|
+
}).optional();
|
|
8209
|
+
/**
|
|
8190
8210
|
* How a migration sequences the cutover against the byte move.
|
|
8191
8211
|
*
|
|
8192
8212
|
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
@@ -8208,6 +8228,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
|
8208
8228
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8209
8229
|
var StorageMigrationInputSchema = object({
|
|
8210
8230
|
destinations: StorageMigrationDestinationsSchema,
|
|
8231
|
+
/** Omitted = each class's current default. */
|
|
8232
|
+
sources: StorageMigrationSourcesSchema,
|
|
8211
8233
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8212
8234
|
/** Omitted = `blocking`, which stays the default. */
|
|
8213
8235
|
mode: StorageMigrationModeSchema.optional()
|
|
@@ -8287,6 +8309,13 @@ var StorageMigrationMoveSchema = object({
|
|
|
8287
8309
|
storageClass: StorageMigrationClassSchema,
|
|
8288
8310
|
fromLocationId: string(),
|
|
8289
8311
|
toLocationId: string(),
|
|
8312
|
+
/**
|
|
8313
|
+
* True when `from` was NOT the class default at plan time. The move still
|
|
8314
|
+
* copies bytes, but the default is left alone and the source is disabled
|
|
8315
|
+
* once the copy verifies. Absent on jobs planned before this field existed
|
|
8316
|
+
* — those jobs always repointed, which is `false`.
|
|
8317
|
+
*/
|
|
8318
|
+
freezeSource: boolean().optional(),
|
|
8290
8319
|
moverJobId: string().nullable(),
|
|
8291
8320
|
state: RelocateJobStateSchema.nullable(),
|
|
8292
8321
|
error: string().nullable(),
|
|
@@ -8300,6 +8329,7 @@ var StorageMigrationJobSchema = object({
|
|
|
8300
8329
|
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8301
8330
|
mode: StorageMigrationModeSchema,
|
|
8302
8331
|
destinations: StorageMigrationDestinationsSchema,
|
|
8332
|
+
sources: StorageMigrationSourcesSchema,
|
|
8303
8333
|
throttleMbps: number(),
|
|
8304
8334
|
moves: array(StorageMigrationMoveSchema),
|
|
8305
8335
|
pauseLeaseId: string().nullable(),
|
|
@@ -8325,6 +8355,7 @@ var StorageMigrationFindingSchema = object({
|
|
|
8325
8355
|
});
|
|
8326
8356
|
var StorageMigrationPlanSchema = object({
|
|
8327
8357
|
destinations: StorageMigrationDestinationsSchema,
|
|
8358
|
+
sources: StorageMigrationSourcesSchema,
|
|
8328
8359
|
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8329
8360
|
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8330
8361
|
* it. */
|
|
@@ -8332,7 +8363,8 @@ var StorageMigrationPlanSchema = object({
|
|
|
8332
8363
|
moves: array(object({
|
|
8333
8364
|
storageClass: StorageMigrationClassSchema,
|
|
8334
8365
|
fromLocationId: string(),
|
|
8335
|
-
toLocationId: string()
|
|
8366
|
+
toLocationId: string(),
|
|
8367
|
+
freezeSource: boolean().optional()
|
|
8336
8368
|
})),
|
|
8337
8369
|
findings: array(StorageMigrationFindingSchema)
|
|
8338
8370
|
});
|
|
@@ -8510,10 +8542,51 @@ var LedgerWalkReportSchema = object({
|
|
|
8510
8542
|
var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
|
|
8511
8543
|
var RelocatableMediaCountInputSchema = object({
|
|
8512
8544
|
toLocationId: string().min(1),
|
|
8545
|
+
/** Restrict the count to one source; omitted / `'*'` = every non-target row. */
|
|
8546
|
+
fromLocationId: string().optional(),
|
|
8513
8547
|
/** Omitted = `move`. */
|
|
8514
8548
|
mode: MediaRelocateModeSchema.optional()
|
|
8515
8549
|
});
|
|
8516
8550
|
/**
|
|
8551
|
+
* Operator cleanup of leftover analytics rows, optional debug media, and
|
|
8552
|
+
* ghost ledger entries on frozen footage locations.
|
|
8553
|
+
*
|
|
8554
|
+
* A pass is tens of minutes on a standing backlog. The hub method RETURNS
|
|
8555
|
+
* `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
|
|
8556
|
+
* is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
|
|
8557
|
+
* with no operator-visible status.
|
|
8558
|
+
*/
|
|
8559
|
+
var StorageCleanupPhaseSchema = _enum([
|
|
8560
|
+
"orphans",
|
|
8561
|
+
"debug-media",
|
|
8562
|
+
"ghost-ledger",
|
|
8563
|
+
"done",
|
|
8564
|
+
"failed",
|
|
8565
|
+
"cancelled"
|
|
8566
|
+
]);
|
|
8567
|
+
var StorageCleanupInputSchema = object({
|
|
8568
|
+
/** Also walk motion stills / track filmstrips. Off by default. */
|
|
8569
|
+
includeDebugMedia: boolean().optional() });
|
|
8570
|
+
var StorageCleanupJobSchema = object({
|
|
8571
|
+
jobId: string(),
|
|
8572
|
+
phase: StorageCleanupPhaseSchema,
|
|
8573
|
+
includeDebugMedia: boolean(),
|
|
8574
|
+
orphansReclaimed: number().int().nonnegative(),
|
|
8575
|
+
orphanBytesReclaimed: number().int().nonnegative(),
|
|
8576
|
+
debugMediaReclaimed: number().int().nonnegative(),
|
|
8577
|
+
debugMediaBytesReclaimed: number().int().nonnegative(),
|
|
8578
|
+
ghostsForgotten: number().int().nonnegative(),
|
|
8579
|
+
ghostBytesForgotten: number().int().nonnegative(),
|
|
8580
|
+
/** Short operator-facing line: current collection, pass, or location. */
|
|
8581
|
+
detail: string().nullable(),
|
|
8582
|
+
cancelRequested: boolean(),
|
|
8583
|
+
startedAt: number(),
|
|
8584
|
+
updatedAt: number(),
|
|
8585
|
+
finishedAt: number().nullable(),
|
|
8586
|
+
error: string().nullable()
|
|
8587
|
+
});
|
|
8588
|
+
var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
|
|
8589
|
+
/**
|
|
8517
8590
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
8518
8591
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
8519
8592
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -8541,11 +8614,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
|
|
|
8541
8614
|
* The default location for a type uses `id === <type>:default` by
|
|
8542
8615
|
* convention (the bare type ref like `'backups'` resolves to it).
|
|
8543
8616
|
*
|
|
8544
|
-
* `isSystem
|
|
8545
|
-
*
|
|
8546
|
-
*
|
|
8547
|
-
*
|
|
8548
|
-
* deleting it is rejected at the cap level.
|
|
8617
|
+
* `isSystem` is a legacy persisted flag. Seed still creates the initial
|
|
8618
|
+
* `<type>:default` locations; the flag is no longer a lock, a badge, or a
|
|
8619
|
+
* prune selector. New writes leave it false. Deletion is gated on uniqueness
|
|
8620
|
+
* / last-enabled, not on this bit.
|
|
8549
8621
|
*/
|
|
8550
8622
|
var StorageLocationSchema = object({
|
|
8551
8623
|
id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
|
|
@@ -12856,6 +12928,12 @@ method(object({
|
|
|
12856
12928
|
}), _void(), {
|
|
12857
12929
|
kind: "mutation",
|
|
12858
12930
|
auth: "admin"
|
|
12931
|
+
}), method(object({
|
|
12932
|
+
from: string(),
|
|
12933
|
+
to: string()
|
|
12934
|
+
}), object({ moved: number() }), {
|
|
12935
|
+
kind: "mutation",
|
|
12936
|
+
auth: "admin"
|
|
12859
12937
|
}), method(object({
|
|
12860
12938
|
deviceId: number(),
|
|
12861
12939
|
disabled: boolean()
|
|
@@ -18805,46 +18883,6 @@ var RecentTracksPageSchema = object({
|
|
|
18805
18883
|
/** Cursor for the next page, or null when this page is the last. */
|
|
18806
18884
|
nextCursor: string().nullable()
|
|
18807
18885
|
});
|
|
18808
|
-
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
18809
|
-
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
18810
|
-
var AnalyticsGroupRecordSchema = object({
|
|
18811
|
-
id: string(),
|
|
18812
|
-
deviceId: number().int(),
|
|
18813
|
-
openedAt: number().int(),
|
|
18814
|
-
closedAt: number().int(),
|
|
18815
|
-
timestamp: number().int(),
|
|
18816
|
-
memberCount: number().int(),
|
|
18817
|
-
memberTrackIds: array(string()).readonly(),
|
|
18818
|
-
className: string(),
|
|
18819
|
-
classes: array(string()).readonly(),
|
|
18820
|
-
/** Relative event-media path, or null when the group has no picture yet. */
|
|
18821
|
-
mediaUrl: string().nullable(),
|
|
18822
|
-
singleton: boolean()
|
|
18823
|
-
});
|
|
18824
|
-
var AnalyticsGroupMemberSchema = object({
|
|
18825
|
-
trackId: string(),
|
|
18826
|
-
deviceId: number().int(),
|
|
18827
|
-
className: string(),
|
|
18828
|
-
firstSeen: number().int(),
|
|
18829
|
-
lastSeen: number().int(),
|
|
18830
|
-
mediaUrl: string().nullable()
|
|
18831
|
-
});
|
|
18832
|
-
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
18833
|
-
var ListGroupsQueryInput = object({
|
|
18834
|
-
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
18835
|
-
deviceIds: array(number()),
|
|
18836
|
-
/** Window lower bound on `closedAt` (inclusive). */
|
|
18837
|
-
since: number().optional(),
|
|
18838
|
-
/** Window upper bound on `openedAt` (inclusive). */
|
|
18839
|
-
until: number().optional(),
|
|
18840
|
-
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
18841
|
-
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
18842
|
-
cursor: string().optional()
|
|
18843
|
-
});
|
|
18844
|
-
var ListGroupsPageSchema = object({
|
|
18845
|
-
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
18846
|
-
nextCursor: string().nullable()
|
|
18847
|
-
});
|
|
18848
18886
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
18849
18887
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
18850
18888
|
var KeyEventQueryInput = object({
|
|
@@ -18948,9 +18986,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
18948
18986
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
18949
18987
|
plates: number().int(),
|
|
18950
18988
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
18951
|
-
embeddings: number().int()
|
|
18952
|
-
/** Group membership + group rows removed with their last member (best-effort). */
|
|
18953
|
-
groups: number().int()
|
|
18989
|
+
embeddings: number().int()
|
|
18954
18990
|
});
|
|
18955
18991
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
18956
18992
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19120,6 +19156,47 @@ var RebuildStatusSchema = object({
|
|
|
19120
19156
|
/** Present when the pass ended by throwing. */
|
|
19121
19157
|
error: string().nullable()
|
|
19122
19158
|
});
|
|
19159
|
+
/**
|
|
19160
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19161
|
+
*
|
|
19162
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19163
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19164
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19165
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19166
|
+
*/
|
|
19167
|
+
var MediaReclaimStartResultSchema = object({
|
|
19168
|
+
started: boolean(),
|
|
19169
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19170
|
+
alreadyRunning: boolean()
|
|
19171
|
+
});
|
|
19172
|
+
var MediaReclaimInputSchema = object({
|
|
19173
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19174
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19175
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19176
|
+
restart: boolean().optional(),
|
|
19177
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19178
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19179
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19180
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19181
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19182
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19183
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19184
|
+
});
|
|
19185
|
+
var MediaReclaimStatusSchema = object({
|
|
19186
|
+
running: boolean(),
|
|
19187
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19188
|
+
totalExamined: number(),
|
|
19189
|
+
totalEligible: number(),
|
|
19190
|
+
totalReclaimed: number(),
|
|
19191
|
+
totalBytesReclaimed: number(),
|
|
19192
|
+
totalRefused: number(),
|
|
19193
|
+
/** Device+scope windows finished in this pass. */
|
|
19194
|
+
devicesDone: number(),
|
|
19195
|
+
complete: boolean().nullable(),
|
|
19196
|
+
startedAtMs: number().nullable(),
|
|
19197
|
+
finishedAtMs: number().nullable(),
|
|
19198
|
+
error: string().nullable()
|
|
19199
|
+
});
|
|
19123
19200
|
var ReplayFrameInputSchema = object({
|
|
19124
19201
|
timestamp: number(),
|
|
19125
19202
|
frame: PipelineRunResultBridge
|
|
@@ -19158,10 +19235,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19158
19235
|
* stationary registry). Default false: the timeline lists passages,
|
|
19159
19236
|
* not parking records (operator decision, 2026-08-15). */
|
|
19160
19237
|
includeStationary: boolean().optional()
|
|
19161
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
19162
|
-
deviceId: number(),
|
|
19163
|
-
groupId: string().min(1)
|
|
19164
|
-
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
19238
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19165
19239
|
kind: "mutation",
|
|
19166
19240
|
auth: "admin"
|
|
19167
19241
|
}), 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({
|
|
@@ -19261,6 +19335,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19261
19335
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19262
19336
|
kind: "query",
|
|
19263
19337
|
auth: "admin"
|
|
19338
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19339
|
+
kind: "mutation",
|
|
19340
|
+
auth: "admin"
|
|
19341
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19342
|
+
kind: "query",
|
|
19343
|
+
auth: "admin"
|
|
19264
19344
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19265
19345
|
kind: "query",
|
|
19266
19346
|
auth: "admin"
|
|
@@ -21231,7 +21311,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21231
21311
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21232
21312
|
kind: "mutation",
|
|
21233
21313
|
auth: "admin"
|
|
21234
|
-
})
|
|
21314
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21315
|
+
kind: "mutation",
|
|
21316
|
+
auth: "admin"
|
|
21317
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21318
|
+
kind: "mutation",
|
|
21319
|
+
auth: "admin"
|
|
21320
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21235
21321
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21236
21322
|
providerId: string().min(1),
|
|
21237
21323
|
displayName: string().min(1),
|
|
@@ -26609,6 +26695,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
26609
26695
|
minMoveGb: number().min(0).optional()
|
|
26610
26696
|
});
|
|
26611
26697
|
/**
|
|
26698
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
26699
|
+
*
|
|
26700
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
26701
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
26702
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
26703
|
+
*/
|
|
26704
|
+
var RecordingDevicePlacementSchema = object({
|
|
26705
|
+
deviceId: number().int(),
|
|
26706
|
+
profile: string(),
|
|
26707
|
+
locationId: string()
|
|
26708
|
+
});
|
|
26709
|
+
var RecordingDevicePinSchema = object({
|
|
26710
|
+
deviceId: number().int(),
|
|
26711
|
+
/** Recordings-class location this camera is pinned to. */
|
|
26712
|
+
locationId: string()
|
|
26713
|
+
});
|
|
26714
|
+
var RecordingPlacementViewSchema = object({
|
|
26715
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
26716
|
+
pins: array(RecordingDevicePinSchema),
|
|
26717
|
+
defaultLocations: record(string(), string())
|
|
26718
|
+
});
|
|
26719
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
26720
|
+
deviceId: number().int(),
|
|
26721
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
26722
|
+
locationId: string().nullable()
|
|
26723
|
+
});
|
|
26724
|
+
/**
|
|
26612
26725
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
26613
26726
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
26614
26727
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -26834,6 +26947,12 @@ method(object({
|
|
|
26834
26947
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
26835
26948
|
kind: "mutation",
|
|
26836
26949
|
auth: "admin"
|
|
26950
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
26951
|
+
kind: "query",
|
|
26952
|
+
auth: "admin"
|
|
26953
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
26954
|
+
kind: "mutation",
|
|
26955
|
+
auth: "admin"
|
|
26837
26956
|
});
|
|
26838
26957
|
/**
|
|
26839
26958
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -30204,6 +30323,12 @@ Object.freeze({
|
|
|
30204
30323
|
addonId: null,
|
|
30205
30324
|
access: "delete"
|
|
30206
30325
|
},
|
|
30326
|
+
"deviceManager.renameLocation": {
|
|
30327
|
+
capName: "device-manager",
|
|
30328
|
+
capScope: "system",
|
|
30329
|
+
addonId: null,
|
|
30330
|
+
access: "create"
|
|
30331
|
+
},
|
|
30207
30332
|
"deviceManager.runDeviceAction": {
|
|
30208
30333
|
capName: "device-manager",
|
|
30209
30334
|
capScope: "system",
|
|
@@ -31896,19 +32021,19 @@ Object.freeze({
|
|
|
31896
32021
|
addonId: null,
|
|
31897
32022
|
access: "view"
|
|
31898
32023
|
},
|
|
31899
|
-
"pipelineAnalytics.
|
|
32024
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
31900
32025
|
capName: "pipeline-analytics",
|
|
31901
32026
|
capScope: "device",
|
|
31902
32027
|
addonId: null,
|
|
31903
32028
|
access: "view"
|
|
31904
32029
|
},
|
|
31905
|
-
"pipelineAnalytics.
|
|
32030
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
31906
32031
|
capName: "pipeline-analytics",
|
|
31907
32032
|
capScope: "device",
|
|
31908
32033
|
addonId: null,
|
|
31909
32034
|
access: "view"
|
|
31910
32035
|
},
|
|
31911
|
-
"pipelineAnalytics.
|
|
32036
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
31912
32037
|
capName: "pipeline-analytics",
|
|
31913
32038
|
capScope: "device",
|
|
31914
32039
|
addonId: null,
|
|
@@ -31998,12 +32123,6 @@ Object.freeze({
|
|
|
31998
32123
|
addonId: null,
|
|
31999
32124
|
access: "view"
|
|
32000
32125
|
},
|
|
32001
|
-
"pipelineAnalytics.listGroups": {
|
|
32002
|
-
capName: "pipeline-analytics",
|
|
32003
|
-
capScope: "device",
|
|
32004
|
-
addonId: null,
|
|
32005
|
-
access: "view"
|
|
32006
|
-
},
|
|
32007
32126
|
"pipelineAnalytics.listOpsLog": {
|
|
32008
32127
|
capName: "pipeline-analytics",
|
|
32009
32128
|
capScope: "device",
|
|
@@ -32088,6 +32207,12 @@ Object.freeze({
|
|
|
32088
32207
|
addonId: null,
|
|
32089
32208
|
access: "create"
|
|
32090
32209
|
},
|
|
32210
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
32211
|
+
capName: "pipeline-analytics",
|
|
32212
|
+
capScope: "device",
|
|
32213
|
+
addonId: null,
|
|
32214
|
+
access: "create"
|
|
32215
|
+
},
|
|
32091
32216
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
32092
32217
|
capName: "pipeline-analytics",
|
|
32093
32218
|
capScope: "device",
|
|
@@ -33012,6 +33137,12 @@ Object.freeze({
|
|
|
33012
33137
|
addonId: null,
|
|
33013
33138
|
access: "view"
|
|
33014
33139
|
},
|
|
33140
|
+
"recording.getPlacement": {
|
|
33141
|
+
capName: "recording",
|
|
33142
|
+
capScope: "system",
|
|
33143
|
+
addonId: null,
|
|
33144
|
+
access: "view"
|
|
33145
|
+
},
|
|
33015
33146
|
"recording.getPlaybackManifest": {
|
|
33016
33147
|
capName: "recording",
|
|
33017
33148
|
capScope: "system",
|
|
@@ -33138,6 +33269,12 @@ Object.freeze({
|
|
|
33138
33269
|
addonId: null,
|
|
33139
33270
|
access: "create"
|
|
33140
33271
|
},
|
|
33272
|
+
"recording.setDevicePlacement": {
|
|
33273
|
+
capName: "recording",
|
|
33274
|
+
capScope: "system",
|
|
33275
|
+
addonId: null,
|
|
33276
|
+
access: "create"
|
|
33277
|
+
},
|
|
33141
33278
|
"recording.startStorageMigrationMove": {
|
|
33142
33279
|
capName: "recording",
|
|
33143
33280
|
capScope: "system",
|
|
@@ -33582,12 +33719,36 @@ Object.freeze({
|
|
|
33582
33719
|
addonId: null,
|
|
33583
33720
|
access: "create"
|
|
33584
33721
|
},
|
|
33722
|
+
"storageMigration.cleanupCancel": {
|
|
33723
|
+
capName: "storage-migration",
|
|
33724
|
+
capScope: "system",
|
|
33725
|
+
addonId: null,
|
|
33726
|
+
access: "create"
|
|
33727
|
+
},
|
|
33728
|
+
"storageMigration.cleanupStart": {
|
|
33729
|
+
capName: "storage-migration",
|
|
33730
|
+
capScope: "system",
|
|
33731
|
+
addonId: null,
|
|
33732
|
+
access: "create"
|
|
33733
|
+
},
|
|
33734
|
+
"storageMigration.cleanupStatus": {
|
|
33735
|
+
capName: "storage-migration",
|
|
33736
|
+
capScope: "system",
|
|
33737
|
+
addonId: null,
|
|
33738
|
+
access: "view"
|
|
33739
|
+
},
|
|
33585
33740
|
"storageMigration.drain": {
|
|
33586
33741
|
capName: "storage-migration",
|
|
33587
33742
|
capScope: "system",
|
|
33588
33743
|
addonId: null,
|
|
33589
33744
|
access: "create"
|
|
33590
33745
|
},
|
|
33746
|
+
"storageMigration.history": {
|
|
33747
|
+
capName: "storage-migration",
|
|
33748
|
+
capScope: "system",
|
|
33749
|
+
addonId: null,
|
|
33750
|
+
access: "view"
|
|
33751
|
+
},
|
|
33591
33752
|
"storageMigration.movers": {
|
|
33592
33753
|
capName: "storage-migration",
|
|
33593
33754
|
capScope: "system",
|
|
@@ -35584,11 +35745,6 @@ Object.freeze({
|
|
|
35584
35745
|
form: "single",
|
|
35585
35746
|
optional: true
|
|
35586
35747
|
}],
|
|
35587
|
-
"pipelineAnalytics.getGroup": [{
|
|
35588
|
-
name: "deviceId",
|
|
35589
|
-
form: "single",
|
|
35590
|
-
optional: false
|
|
35591
|
-
}],
|
|
35592
35748
|
"pipelineAnalytics.getKeyEvents": [{
|
|
35593
35749
|
name: "deviceId",
|
|
35594
35750
|
form: "single",
|
|
@@ -35654,11 +35810,6 @@ Object.freeze({
|
|
|
35654
35810
|
form: "single",
|
|
35655
35811
|
optional: false
|
|
35656
35812
|
}],
|
|
35657
|
-
"pipelineAnalytics.listGroups": [{
|
|
35658
|
-
name: "deviceIds",
|
|
35659
|
-
form: "array",
|
|
35660
|
-
optional: false
|
|
35661
|
-
}],
|
|
35662
35813
|
"pipelineAnalytics.listOpsLog": [{
|
|
35663
35814
|
name: "deviceId",
|
|
35664
35815
|
form: "single",
|
|
@@ -35704,6 +35855,11 @@ Object.freeze({
|
|
|
35704
35855
|
form: "single",
|
|
35705
35856
|
optional: true
|
|
35706
35857
|
}],
|
|
35858
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
35859
|
+
name: "deviceIds",
|
|
35860
|
+
form: "array",
|
|
35861
|
+
optional: true
|
|
35862
|
+
}],
|
|
35707
35863
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
35708
35864
|
name: "deviceId",
|
|
35709
35865
|
form: "single",
|
|
@@ -36069,6 +36225,11 @@ Object.freeze({
|
|
|
36069
36225
|
form: "single",
|
|
36070
36226
|
optional: false
|
|
36071
36227
|
}],
|
|
36228
|
+
"recording.setDevicePlacement": [{
|
|
36229
|
+
name: "deviceId",
|
|
36230
|
+
form: "single",
|
|
36231
|
+
optional: false
|
|
36232
|
+
}],
|
|
36072
36233
|
"recording.startStorageMigrationMove": [{
|
|
36073
36234
|
name: "deviceId",
|
|
36074
36235
|
form: "single",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-mqtt-broker",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.50",
|
|
4
4
|
"description": "MQTT broker registry addon for CamStack — manages external broker entries + an optional embedded aedes broker. Consumers spin up their own `mqtt.js` clients via the `mqtt-broker` cap.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|