@camstack/addon-mqtt-broker 1.2.49 → 1.2.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/mqtt-broker.addon.js +236 -73
- package/dist/mqtt-broker.addon.mjs +236 -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()
|
|
@@ -15592,6 +15670,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
15592
15670
|
"device-offline",
|
|
15593
15671
|
"device-disabled",
|
|
15594
15672
|
"device-enabled",
|
|
15673
|
+
"device-battery-low",
|
|
15674
|
+
"device-battery-normal",
|
|
15595
15675
|
"stream-online",
|
|
15596
15676
|
"stream-offline",
|
|
15597
15677
|
"node-online",
|
|
@@ -18810,46 +18890,6 @@ var RecentTracksPageSchema = object({
|
|
|
18810
18890
|
/** Cursor for the next page, or null when this page is the last. */
|
|
18811
18891
|
nextCursor: string().nullable()
|
|
18812
18892
|
});
|
|
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
18893
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
18854
18894
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
18855
18895
|
var KeyEventQueryInput = object({
|
|
@@ -18953,9 +18993,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
18953
18993
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
18954
18994
|
plates: number().int(),
|
|
18955
18995
|
/** 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()
|
|
18996
|
+
embeddings: number().int()
|
|
18959
18997
|
});
|
|
18960
18998
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
18961
18999
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19125,6 +19163,47 @@ var RebuildStatusSchema = object({
|
|
|
19125
19163
|
/** Present when the pass ended by throwing. */
|
|
19126
19164
|
error: string().nullable()
|
|
19127
19165
|
});
|
|
19166
|
+
/**
|
|
19167
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19168
|
+
*
|
|
19169
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19170
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19171
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19172
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19173
|
+
*/
|
|
19174
|
+
var MediaReclaimStartResultSchema = object({
|
|
19175
|
+
started: boolean(),
|
|
19176
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19177
|
+
alreadyRunning: boolean()
|
|
19178
|
+
});
|
|
19179
|
+
var MediaReclaimInputSchema = object({
|
|
19180
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19181
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19182
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19183
|
+
restart: boolean().optional(),
|
|
19184
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19185
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19186
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19187
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19188
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19189
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19190
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19191
|
+
});
|
|
19192
|
+
var MediaReclaimStatusSchema = object({
|
|
19193
|
+
running: boolean(),
|
|
19194
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19195
|
+
totalExamined: number(),
|
|
19196
|
+
totalEligible: number(),
|
|
19197
|
+
totalReclaimed: number(),
|
|
19198
|
+
totalBytesReclaimed: number(),
|
|
19199
|
+
totalRefused: number(),
|
|
19200
|
+
/** Device+scope windows finished in this pass. */
|
|
19201
|
+
devicesDone: number(),
|
|
19202
|
+
complete: boolean().nullable(),
|
|
19203
|
+
startedAtMs: number().nullable(),
|
|
19204
|
+
finishedAtMs: number().nullable(),
|
|
19205
|
+
error: string().nullable()
|
|
19206
|
+
});
|
|
19128
19207
|
var ReplayFrameInputSchema = object({
|
|
19129
19208
|
timestamp: number(),
|
|
19130
19209
|
frame: PipelineRunResultBridge
|
|
@@ -19163,10 +19242,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19163
19242
|
* stationary registry). Default false: the timeline lists passages,
|
|
19164
19243
|
* not parking records (operator decision, 2026-08-15). */
|
|
19165
19244
|
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(), {
|
|
19245
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19170
19246
|
kind: "mutation",
|
|
19171
19247
|
auth: "admin"
|
|
19172
19248
|
}), 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 +19342,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19266
19342
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19267
19343
|
kind: "query",
|
|
19268
19344
|
auth: "admin"
|
|
19345
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19346
|
+
kind: "mutation",
|
|
19347
|
+
auth: "admin"
|
|
19348
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19349
|
+
kind: "query",
|
|
19350
|
+
auth: "admin"
|
|
19269
19351
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19270
19352
|
kind: "query",
|
|
19271
19353
|
auth: "admin"
|
|
@@ -21236,7 +21318,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21236
21318
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21237
21319
|
kind: "mutation",
|
|
21238
21320
|
auth: "admin"
|
|
21239
|
-
})
|
|
21321
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21322
|
+
kind: "mutation",
|
|
21323
|
+
auth: "admin"
|
|
21324
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21325
|
+
kind: "mutation",
|
|
21326
|
+
auth: "admin"
|
|
21327
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21240
21328
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21241
21329
|
providerId: string().min(1),
|
|
21242
21330
|
displayName: string().min(1),
|
|
@@ -26614,6 +26702,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
26614
26702
|
minMoveGb: number().min(0).optional()
|
|
26615
26703
|
});
|
|
26616
26704
|
/**
|
|
26705
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
26706
|
+
*
|
|
26707
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
26708
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
26709
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
26710
|
+
*/
|
|
26711
|
+
var RecordingDevicePlacementSchema = object({
|
|
26712
|
+
deviceId: number().int(),
|
|
26713
|
+
profile: string(),
|
|
26714
|
+
locationId: string()
|
|
26715
|
+
});
|
|
26716
|
+
var RecordingDevicePinSchema = object({
|
|
26717
|
+
deviceId: number().int(),
|
|
26718
|
+
/** Recordings-class location this camera is pinned to. */
|
|
26719
|
+
locationId: string()
|
|
26720
|
+
});
|
|
26721
|
+
var RecordingPlacementViewSchema = object({
|
|
26722
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
26723
|
+
pins: array(RecordingDevicePinSchema),
|
|
26724
|
+
defaultLocations: record(string(), string())
|
|
26725
|
+
});
|
|
26726
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
26727
|
+
deviceId: number().int(),
|
|
26728
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
26729
|
+
locationId: string().nullable()
|
|
26730
|
+
});
|
|
26731
|
+
/**
|
|
26617
26732
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
26618
26733
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
26619
26734
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -26839,6 +26954,12 @@ method(object({
|
|
|
26839
26954
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
26840
26955
|
kind: "mutation",
|
|
26841
26956
|
auth: "admin"
|
|
26957
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
26958
|
+
kind: "query",
|
|
26959
|
+
auth: "admin"
|
|
26960
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
26961
|
+
kind: "mutation",
|
|
26962
|
+
auth: "admin"
|
|
26842
26963
|
});
|
|
26843
26964
|
/**
|
|
26844
26965
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -30209,6 +30330,12 @@ Object.freeze({
|
|
|
30209
30330
|
addonId: null,
|
|
30210
30331
|
access: "delete"
|
|
30211
30332
|
},
|
|
30333
|
+
"deviceManager.renameLocation": {
|
|
30334
|
+
capName: "device-manager",
|
|
30335
|
+
capScope: "system",
|
|
30336
|
+
addonId: null,
|
|
30337
|
+
access: "create"
|
|
30338
|
+
},
|
|
30212
30339
|
"deviceManager.runDeviceAction": {
|
|
30213
30340
|
capName: "device-manager",
|
|
30214
30341
|
capScope: "system",
|
|
@@ -31901,19 +32028,19 @@ Object.freeze({
|
|
|
31901
32028
|
addonId: null,
|
|
31902
32029
|
access: "view"
|
|
31903
32030
|
},
|
|
31904
|
-
"pipelineAnalytics.
|
|
32031
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
31905
32032
|
capName: "pipeline-analytics",
|
|
31906
32033
|
capScope: "device",
|
|
31907
32034
|
addonId: null,
|
|
31908
32035
|
access: "view"
|
|
31909
32036
|
},
|
|
31910
|
-
"pipelineAnalytics.
|
|
32037
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
31911
32038
|
capName: "pipeline-analytics",
|
|
31912
32039
|
capScope: "device",
|
|
31913
32040
|
addonId: null,
|
|
31914
32041
|
access: "view"
|
|
31915
32042
|
},
|
|
31916
|
-
"pipelineAnalytics.
|
|
32043
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
31917
32044
|
capName: "pipeline-analytics",
|
|
31918
32045
|
capScope: "device",
|
|
31919
32046
|
addonId: null,
|
|
@@ -32003,12 +32130,6 @@ Object.freeze({
|
|
|
32003
32130
|
addonId: null,
|
|
32004
32131
|
access: "view"
|
|
32005
32132
|
},
|
|
32006
|
-
"pipelineAnalytics.listGroups": {
|
|
32007
|
-
capName: "pipeline-analytics",
|
|
32008
|
-
capScope: "device",
|
|
32009
|
-
addonId: null,
|
|
32010
|
-
access: "view"
|
|
32011
|
-
},
|
|
32012
32133
|
"pipelineAnalytics.listOpsLog": {
|
|
32013
32134
|
capName: "pipeline-analytics",
|
|
32014
32135
|
capScope: "device",
|
|
@@ -32093,6 +32214,12 @@ Object.freeze({
|
|
|
32093
32214
|
addonId: null,
|
|
32094
32215
|
access: "create"
|
|
32095
32216
|
},
|
|
32217
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
32218
|
+
capName: "pipeline-analytics",
|
|
32219
|
+
capScope: "device",
|
|
32220
|
+
addonId: null,
|
|
32221
|
+
access: "create"
|
|
32222
|
+
},
|
|
32096
32223
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
32097
32224
|
capName: "pipeline-analytics",
|
|
32098
32225
|
capScope: "device",
|
|
@@ -33017,6 +33144,12 @@ Object.freeze({
|
|
|
33017
33144
|
addonId: null,
|
|
33018
33145
|
access: "view"
|
|
33019
33146
|
},
|
|
33147
|
+
"recording.getPlacement": {
|
|
33148
|
+
capName: "recording",
|
|
33149
|
+
capScope: "system",
|
|
33150
|
+
addonId: null,
|
|
33151
|
+
access: "view"
|
|
33152
|
+
},
|
|
33020
33153
|
"recording.getPlaybackManifest": {
|
|
33021
33154
|
capName: "recording",
|
|
33022
33155
|
capScope: "system",
|
|
@@ -33143,6 +33276,12 @@ Object.freeze({
|
|
|
33143
33276
|
addonId: null,
|
|
33144
33277
|
access: "create"
|
|
33145
33278
|
},
|
|
33279
|
+
"recording.setDevicePlacement": {
|
|
33280
|
+
capName: "recording",
|
|
33281
|
+
capScope: "system",
|
|
33282
|
+
addonId: null,
|
|
33283
|
+
access: "create"
|
|
33284
|
+
},
|
|
33146
33285
|
"recording.startStorageMigrationMove": {
|
|
33147
33286
|
capName: "recording",
|
|
33148
33287
|
capScope: "system",
|
|
@@ -33587,12 +33726,36 @@ Object.freeze({
|
|
|
33587
33726
|
addonId: null,
|
|
33588
33727
|
access: "create"
|
|
33589
33728
|
},
|
|
33729
|
+
"storageMigration.cleanupCancel": {
|
|
33730
|
+
capName: "storage-migration",
|
|
33731
|
+
capScope: "system",
|
|
33732
|
+
addonId: null,
|
|
33733
|
+
access: "create"
|
|
33734
|
+
},
|
|
33735
|
+
"storageMigration.cleanupStart": {
|
|
33736
|
+
capName: "storage-migration",
|
|
33737
|
+
capScope: "system",
|
|
33738
|
+
addonId: null,
|
|
33739
|
+
access: "create"
|
|
33740
|
+
},
|
|
33741
|
+
"storageMigration.cleanupStatus": {
|
|
33742
|
+
capName: "storage-migration",
|
|
33743
|
+
capScope: "system",
|
|
33744
|
+
addonId: null,
|
|
33745
|
+
access: "view"
|
|
33746
|
+
},
|
|
33590
33747
|
"storageMigration.drain": {
|
|
33591
33748
|
capName: "storage-migration",
|
|
33592
33749
|
capScope: "system",
|
|
33593
33750
|
addonId: null,
|
|
33594
33751
|
access: "create"
|
|
33595
33752
|
},
|
|
33753
|
+
"storageMigration.history": {
|
|
33754
|
+
capName: "storage-migration",
|
|
33755
|
+
capScope: "system",
|
|
33756
|
+
addonId: null,
|
|
33757
|
+
access: "view"
|
|
33758
|
+
},
|
|
33596
33759
|
"storageMigration.movers": {
|
|
33597
33760
|
capName: "storage-migration",
|
|
33598
33761
|
capScope: "system",
|
|
@@ -35589,11 +35752,6 @@ Object.freeze({
|
|
|
35589
35752
|
form: "single",
|
|
35590
35753
|
optional: true
|
|
35591
35754
|
}],
|
|
35592
|
-
"pipelineAnalytics.getGroup": [{
|
|
35593
|
-
name: "deviceId",
|
|
35594
|
-
form: "single",
|
|
35595
|
-
optional: false
|
|
35596
|
-
}],
|
|
35597
35755
|
"pipelineAnalytics.getKeyEvents": [{
|
|
35598
35756
|
name: "deviceId",
|
|
35599
35757
|
form: "single",
|
|
@@ -35659,11 +35817,6 @@ Object.freeze({
|
|
|
35659
35817
|
form: "single",
|
|
35660
35818
|
optional: false
|
|
35661
35819
|
}],
|
|
35662
|
-
"pipelineAnalytics.listGroups": [{
|
|
35663
|
-
name: "deviceIds",
|
|
35664
|
-
form: "array",
|
|
35665
|
-
optional: false
|
|
35666
|
-
}],
|
|
35667
35820
|
"pipelineAnalytics.listOpsLog": [{
|
|
35668
35821
|
name: "deviceId",
|
|
35669
35822
|
form: "single",
|
|
@@ -35709,6 +35862,11 @@ Object.freeze({
|
|
|
35709
35862
|
form: "single",
|
|
35710
35863
|
optional: true
|
|
35711
35864
|
}],
|
|
35865
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
35866
|
+
name: "deviceIds",
|
|
35867
|
+
form: "array",
|
|
35868
|
+
optional: true
|
|
35869
|
+
}],
|
|
35712
35870
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
35713
35871
|
name: "deviceId",
|
|
35714
35872
|
form: "single",
|
|
@@ -36074,6 +36232,11 @@ Object.freeze({
|
|
|
36074
36232
|
form: "single",
|
|
36075
36233
|
optional: false
|
|
36076
36234
|
}],
|
|
36235
|
+
"recording.setDevicePlacement": [{
|
|
36236
|
+
name: "deviceId",
|
|
36237
|
+
form: "single",
|
|
36238
|
+
optional: false
|
|
36239
|
+
}],
|
|
36077
36240
|
"recording.startStorageMigrationMove": [{
|
|
36078
36241
|
name: "deviceId",
|
|
36079
36242
|
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()
|
|
@@ -15587,6 +15665,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
15587
15665
|
"device-offline",
|
|
15588
15666
|
"device-disabled",
|
|
15589
15667
|
"device-enabled",
|
|
15668
|
+
"device-battery-low",
|
|
15669
|
+
"device-battery-normal",
|
|
15590
15670
|
"stream-online",
|
|
15591
15671
|
"stream-offline",
|
|
15592
15672
|
"node-online",
|
|
@@ -18805,46 +18885,6 @@ var RecentTracksPageSchema = object({
|
|
|
18805
18885
|
/** Cursor for the next page, or null when this page is the last. */
|
|
18806
18886
|
nextCursor: string().nullable()
|
|
18807
18887
|
});
|
|
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
18888
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
18849
18889
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
18850
18890
|
var KeyEventQueryInput = object({
|
|
@@ -18948,9 +18988,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
18948
18988
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
18949
18989
|
plates: number().int(),
|
|
18950
18990
|
/** 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()
|
|
18991
|
+
embeddings: number().int()
|
|
18954
18992
|
});
|
|
18955
18993
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
18956
18994
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19120,6 +19158,47 @@ var RebuildStatusSchema = object({
|
|
|
19120
19158
|
/** Present when the pass ended by throwing. */
|
|
19121
19159
|
error: string().nullable()
|
|
19122
19160
|
});
|
|
19161
|
+
/**
|
|
19162
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19163
|
+
*
|
|
19164
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19165
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19166
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19167
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19168
|
+
*/
|
|
19169
|
+
var MediaReclaimStartResultSchema = object({
|
|
19170
|
+
started: boolean(),
|
|
19171
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19172
|
+
alreadyRunning: boolean()
|
|
19173
|
+
});
|
|
19174
|
+
var MediaReclaimInputSchema = object({
|
|
19175
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19176
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19177
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19178
|
+
restart: boolean().optional(),
|
|
19179
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19180
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19181
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19182
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19183
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19184
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19185
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19186
|
+
});
|
|
19187
|
+
var MediaReclaimStatusSchema = object({
|
|
19188
|
+
running: boolean(),
|
|
19189
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19190
|
+
totalExamined: number(),
|
|
19191
|
+
totalEligible: number(),
|
|
19192
|
+
totalReclaimed: number(),
|
|
19193
|
+
totalBytesReclaimed: number(),
|
|
19194
|
+
totalRefused: number(),
|
|
19195
|
+
/** Device+scope windows finished in this pass. */
|
|
19196
|
+
devicesDone: number(),
|
|
19197
|
+
complete: boolean().nullable(),
|
|
19198
|
+
startedAtMs: number().nullable(),
|
|
19199
|
+
finishedAtMs: number().nullable(),
|
|
19200
|
+
error: string().nullable()
|
|
19201
|
+
});
|
|
19123
19202
|
var ReplayFrameInputSchema = object({
|
|
19124
19203
|
timestamp: number(),
|
|
19125
19204
|
frame: PipelineRunResultBridge
|
|
@@ -19158,10 +19237,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19158
19237
|
* stationary registry). Default false: the timeline lists passages,
|
|
19159
19238
|
* not parking records (operator decision, 2026-08-15). */
|
|
19160
19239
|
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(), {
|
|
19240
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19165
19241
|
kind: "mutation",
|
|
19166
19242
|
auth: "admin"
|
|
19167
19243
|
}), 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 +19337,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19261
19337
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19262
19338
|
kind: "query",
|
|
19263
19339
|
auth: "admin"
|
|
19340
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19341
|
+
kind: "mutation",
|
|
19342
|
+
auth: "admin"
|
|
19343
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19344
|
+
kind: "query",
|
|
19345
|
+
auth: "admin"
|
|
19264
19346
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19265
19347
|
kind: "query",
|
|
19266
19348
|
auth: "admin"
|
|
@@ -21231,7 +21313,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21231
21313
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21232
21314
|
kind: "mutation",
|
|
21233
21315
|
auth: "admin"
|
|
21234
|
-
})
|
|
21316
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21317
|
+
kind: "mutation",
|
|
21318
|
+
auth: "admin"
|
|
21319
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21320
|
+
kind: "mutation",
|
|
21321
|
+
auth: "admin"
|
|
21322
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21235
21323
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21236
21324
|
providerId: string().min(1),
|
|
21237
21325
|
displayName: string().min(1),
|
|
@@ -26609,6 +26697,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
26609
26697
|
minMoveGb: number().min(0).optional()
|
|
26610
26698
|
});
|
|
26611
26699
|
/**
|
|
26700
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
26701
|
+
*
|
|
26702
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
26703
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
26704
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
26705
|
+
*/
|
|
26706
|
+
var RecordingDevicePlacementSchema = object({
|
|
26707
|
+
deviceId: number().int(),
|
|
26708
|
+
profile: string(),
|
|
26709
|
+
locationId: string()
|
|
26710
|
+
});
|
|
26711
|
+
var RecordingDevicePinSchema = object({
|
|
26712
|
+
deviceId: number().int(),
|
|
26713
|
+
/** Recordings-class location this camera is pinned to. */
|
|
26714
|
+
locationId: string()
|
|
26715
|
+
});
|
|
26716
|
+
var RecordingPlacementViewSchema = object({
|
|
26717
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
26718
|
+
pins: array(RecordingDevicePinSchema),
|
|
26719
|
+
defaultLocations: record(string(), string())
|
|
26720
|
+
});
|
|
26721
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
26722
|
+
deviceId: number().int(),
|
|
26723
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
26724
|
+
locationId: string().nullable()
|
|
26725
|
+
});
|
|
26726
|
+
/**
|
|
26612
26727
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
26613
26728
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
26614
26729
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -26834,6 +26949,12 @@ method(object({
|
|
|
26834
26949
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
26835
26950
|
kind: "mutation",
|
|
26836
26951
|
auth: "admin"
|
|
26952
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
26953
|
+
kind: "query",
|
|
26954
|
+
auth: "admin"
|
|
26955
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
26956
|
+
kind: "mutation",
|
|
26957
|
+
auth: "admin"
|
|
26837
26958
|
});
|
|
26838
26959
|
/**
|
|
26839
26960
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -30204,6 +30325,12 @@ Object.freeze({
|
|
|
30204
30325
|
addonId: null,
|
|
30205
30326
|
access: "delete"
|
|
30206
30327
|
},
|
|
30328
|
+
"deviceManager.renameLocation": {
|
|
30329
|
+
capName: "device-manager",
|
|
30330
|
+
capScope: "system",
|
|
30331
|
+
addonId: null,
|
|
30332
|
+
access: "create"
|
|
30333
|
+
},
|
|
30207
30334
|
"deviceManager.runDeviceAction": {
|
|
30208
30335
|
capName: "device-manager",
|
|
30209
30336
|
capScope: "system",
|
|
@@ -31896,19 +32023,19 @@ Object.freeze({
|
|
|
31896
32023
|
addonId: null,
|
|
31897
32024
|
access: "view"
|
|
31898
32025
|
},
|
|
31899
|
-
"pipelineAnalytics.
|
|
32026
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
31900
32027
|
capName: "pipeline-analytics",
|
|
31901
32028
|
capScope: "device",
|
|
31902
32029
|
addonId: null,
|
|
31903
32030
|
access: "view"
|
|
31904
32031
|
},
|
|
31905
|
-
"pipelineAnalytics.
|
|
32032
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
31906
32033
|
capName: "pipeline-analytics",
|
|
31907
32034
|
capScope: "device",
|
|
31908
32035
|
addonId: null,
|
|
31909
32036
|
access: "view"
|
|
31910
32037
|
},
|
|
31911
|
-
"pipelineAnalytics.
|
|
32038
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
31912
32039
|
capName: "pipeline-analytics",
|
|
31913
32040
|
capScope: "device",
|
|
31914
32041
|
addonId: null,
|
|
@@ -31998,12 +32125,6 @@ Object.freeze({
|
|
|
31998
32125
|
addonId: null,
|
|
31999
32126
|
access: "view"
|
|
32000
32127
|
},
|
|
32001
|
-
"pipelineAnalytics.listGroups": {
|
|
32002
|
-
capName: "pipeline-analytics",
|
|
32003
|
-
capScope: "device",
|
|
32004
|
-
addonId: null,
|
|
32005
|
-
access: "view"
|
|
32006
|
-
},
|
|
32007
32128
|
"pipelineAnalytics.listOpsLog": {
|
|
32008
32129
|
capName: "pipeline-analytics",
|
|
32009
32130
|
capScope: "device",
|
|
@@ -32088,6 +32209,12 @@ Object.freeze({
|
|
|
32088
32209
|
addonId: null,
|
|
32089
32210
|
access: "create"
|
|
32090
32211
|
},
|
|
32212
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
32213
|
+
capName: "pipeline-analytics",
|
|
32214
|
+
capScope: "device",
|
|
32215
|
+
addonId: null,
|
|
32216
|
+
access: "create"
|
|
32217
|
+
},
|
|
32091
32218
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
32092
32219
|
capName: "pipeline-analytics",
|
|
32093
32220
|
capScope: "device",
|
|
@@ -33012,6 +33139,12 @@ Object.freeze({
|
|
|
33012
33139
|
addonId: null,
|
|
33013
33140
|
access: "view"
|
|
33014
33141
|
},
|
|
33142
|
+
"recording.getPlacement": {
|
|
33143
|
+
capName: "recording",
|
|
33144
|
+
capScope: "system",
|
|
33145
|
+
addonId: null,
|
|
33146
|
+
access: "view"
|
|
33147
|
+
},
|
|
33015
33148
|
"recording.getPlaybackManifest": {
|
|
33016
33149
|
capName: "recording",
|
|
33017
33150
|
capScope: "system",
|
|
@@ -33138,6 +33271,12 @@ Object.freeze({
|
|
|
33138
33271
|
addonId: null,
|
|
33139
33272
|
access: "create"
|
|
33140
33273
|
},
|
|
33274
|
+
"recording.setDevicePlacement": {
|
|
33275
|
+
capName: "recording",
|
|
33276
|
+
capScope: "system",
|
|
33277
|
+
addonId: null,
|
|
33278
|
+
access: "create"
|
|
33279
|
+
},
|
|
33141
33280
|
"recording.startStorageMigrationMove": {
|
|
33142
33281
|
capName: "recording",
|
|
33143
33282
|
capScope: "system",
|
|
@@ -33582,12 +33721,36 @@ Object.freeze({
|
|
|
33582
33721
|
addonId: null,
|
|
33583
33722
|
access: "create"
|
|
33584
33723
|
},
|
|
33724
|
+
"storageMigration.cleanupCancel": {
|
|
33725
|
+
capName: "storage-migration",
|
|
33726
|
+
capScope: "system",
|
|
33727
|
+
addonId: null,
|
|
33728
|
+
access: "create"
|
|
33729
|
+
},
|
|
33730
|
+
"storageMigration.cleanupStart": {
|
|
33731
|
+
capName: "storage-migration",
|
|
33732
|
+
capScope: "system",
|
|
33733
|
+
addonId: null,
|
|
33734
|
+
access: "create"
|
|
33735
|
+
},
|
|
33736
|
+
"storageMigration.cleanupStatus": {
|
|
33737
|
+
capName: "storage-migration",
|
|
33738
|
+
capScope: "system",
|
|
33739
|
+
addonId: null,
|
|
33740
|
+
access: "view"
|
|
33741
|
+
},
|
|
33585
33742
|
"storageMigration.drain": {
|
|
33586
33743
|
capName: "storage-migration",
|
|
33587
33744
|
capScope: "system",
|
|
33588
33745
|
addonId: null,
|
|
33589
33746
|
access: "create"
|
|
33590
33747
|
},
|
|
33748
|
+
"storageMigration.history": {
|
|
33749
|
+
capName: "storage-migration",
|
|
33750
|
+
capScope: "system",
|
|
33751
|
+
addonId: null,
|
|
33752
|
+
access: "view"
|
|
33753
|
+
},
|
|
33591
33754
|
"storageMigration.movers": {
|
|
33592
33755
|
capName: "storage-migration",
|
|
33593
33756
|
capScope: "system",
|
|
@@ -35584,11 +35747,6 @@ Object.freeze({
|
|
|
35584
35747
|
form: "single",
|
|
35585
35748
|
optional: true
|
|
35586
35749
|
}],
|
|
35587
|
-
"pipelineAnalytics.getGroup": [{
|
|
35588
|
-
name: "deviceId",
|
|
35589
|
-
form: "single",
|
|
35590
|
-
optional: false
|
|
35591
|
-
}],
|
|
35592
35750
|
"pipelineAnalytics.getKeyEvents": [{
|
|
35593
35751
|
name: "deviceId",
|
|
35594
35752
|
form: "single",
|
|
@@ -35654,11 +35812,6 @@ Object.freeze({
|
|
|
35654
35812
|
form: "single",
|
|
35655
35813
|
optional: false
|
|
35656
35814
|
}],
|
|
35657
|
-
"pipelineAnalytics.listGroups": [{
|
|
35658
|
-
name: "deviceIds",
|
|
35659
|
-
form: "array",
|
|
35660
|
-
optional: false
|
|
35661
|
-
}],
|
|
35662
35815
|
"pipelineAnalytics.listOpsLog": [{
|
|
35663
35816
|
name: "deviceId",
|
|
35664
35817
|
form: "single",
|
|
@@ -35704,6 +35857,11 @@ Object.freeze({
|
|
|
35704
35857
|
form: "single",
|
|
35705
35858
|
optional: true
|
|
35706
35859
|
}],
|
|
35860
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
35861
|
+
name: "deviceIds",
|
|
35862
|
+
form: "array",
|
|
35863
|
+
optional: true
|
|
35864
|
+
}],
|
|
35707
35865
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
35708
35866
|
name: "deviceId",
|
|
35709
35867
|
form: "single",
|
|
@@ -36069,6 +36227,11 @@ Object.freeze({
|
|
|
36069
36227
|
form: "single",
|
|
36070
36228
|
optional: false
|
|
36071
36229
|
}],
|
|
36230
|
+
"recording.setDevicePlacement": [{
|
|
36231
|
+
name: "deviceId",
|
|
36232
|
+
form: "single",
|
|
36233
|
+
optional: false
|
|
36234
|
+
}],
|
|
36072
36235
|
"recording.startStorageMigrationMove": [{
|
|
36073
36236
|
name: "deviceId",
|
|
36074
36237
|
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.51",
|
|
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",
|