@camstack/addon-provider-dreo 0.2.49 → 0.2.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/addon.js +236 -73
- package/dist/addon.mjs +236 -73
- package/package.json +1 -1
package/dist/addon.js
CHANGED
|
@@ -8132,6 +8132,13 @@ var MediaRelocateModeSchema = _enum([
|
|
|
8132
8132
|
]);
|
|
8133
8133
|
var RelocateMediaInputSchema = object({
|
|
8134
8134
|
toLocationId: string(),
|
|
8135
|
+
/**
|
|
8136
|
+
* Restrict the pass to rows currently on this location. Omitted / `'*'` =
|
|
8137
|
+
* every row that is not already on `toLocationId` (the historical
|
|
8138
|
+
* behaviour). A named source is what a from→to migration needs: without it
|
|
8139
|
+
* "move events off disk 2" also emptied disk 1.
|
|
8140
|
+
*/
|
|
8141
|
+
fromLocationId: string().optional(),
|
|
8135
8142
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8136
8143
|
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8137
8144
|
mode: MediaRelocateModeSchema.optional()
|
|
@@ -8199,6 +8206,19 @@ var StorageMigrationDestinationsSchema = object({
|
|
|
8199
8206
|
galleryMedia: string().min(1).optional()
|
|
8200
8207
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8201
8208
|
/**
|
|
8209
|
+
* Optional named source per class. Omitted = the class's current default
|
|
8210
|
+
* (the historical behaviour). A named source that is NOT the default is a
|
|
8211
|
+
* drain of that disk: bytes move, the default stays, and the source is
|
|
8212
|
+
* disabled when the move finishes.
|
|
8213
|
+
*/
|
|
8214
|
+
var StorageMigrationSourcesSchema = object({
|
|
8215
|
+
recordings: string().min(1).optional(),
|
|
8216
|
+
recordingsLow: string().min(1).optional(),
|
|
8217
|
+
eventMedia: string().min(1).optional(),
|
|
8218
|
+
backups: string().min(1).optional(),
|
|
8219
|
+
galleryMedia: string().min(1).optional()
|
|
8220
|
+
}).optional();
|
|
8221
|
+
/**
|
|
8202
8222
|
* How a migration sequences the cutover against the byte move.
|
|
8203
8223
|
*
|
|
8204
8224
|
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
@@ -8220,6 +8240,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
|
8220
8240
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8221
8241
|
var StorageMigrationInputSchema = object({
|
|
8222
8242
|
destinations: StorageMigrationDestinationsSchema,
|
|
8243
|
+
/** Omitted = each class's current default. */
|
|
8244
|
+
sources: StorageMigrationSourcesSchema,
|
|
8223
8245
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8224
8246
|
/** Omitted = `blocking`, which stays the default. */
|
|
8225
8247
|
mode: StorageMigrationModeSchema.optional()
|
|
@@ -8299,6 +8321,13 @@ var StorageMigrationMoveSchema = object({
|
|
|
8299
8321
|
storageClass: StorageMigrationClassSchema,
|
|
8300
8322
|
fromLocationId: string(),
|
|
8301
8323
|
toLocationId: string(),
|
|
8324
|
+
/**
|
|
8325
|
+
* True when `from` was NOT the class default at plan time. The move still
|
|
8326
|
+
* copies bytes, but the default is left alone and the source is disabled
|
|
8327
|
+
* once the copy verifies. Absent on jobs planned before this field existed
|
|
8328
|
+
* — those jobs always repointed, which is `false`.
|
|
8329
|
+
*/
|
|
8330
|
+
freezeSource: boolean().optional(),
|
|
8302
8331
|
moverJobId: string().nullable(),
|
|
8303
8332
|
state: RelocateJobStateSchema.nullable(),
|
|
8304
8333
|
error: string().nullable(),
|
|
@@ -8312,6 +8341,7 @@ var StorageMigrationJobSchema = object({
|
|
|
8312
8341
|
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8313
8342
|
mode: StorageMigrationModeSchema,
|
|
8314
8343
|
destinations: StorageMigrationDestinationsSchema,
|
|
8344
|
+
sources: StorageMigrationSourcesSchema,
|
|
8315
8345
|
throttleMbps: number(),
|
|
8316
8346
|
moves: array(StorageMigrationMoveSchema),
|
|
8317
8347
|
pauseLeaseId: string().nullable(),
|
|
@@ -8337,6 +8367,7 @@ var StorageMigrationFindingSchema = object({
|
|
|
8337
8367
|
});
|
|
8338
8368
|
var StorageMigrationPlanSchema = object({
|
|
8339
8369
|
destinations: StorageMigrationDestinationsSchema,
|
|
8370
|
+
sources: StorageMigrationSourcesSchema,
|
|
8340
8371
|
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8341
8372
|
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8342
8373
|
* it. */
|
|
@@ -8344,7 +8375,8 @@ var StorageMigrationPlanSchema = object({
|
|
|
8344
8375
|
moves: array(object({
|
|
8345
8376
|
storageClass: StorageMigrationClassSchema,
|
|
8346
8377
|
fromLocationId: string(),
|
|
8347
|
-
toLocationId: string()
|
|
8378
|
+
toLocationId: string(),
|
|
8379
|
+
freezeSource: boolean().optional()
|
|
8348
8380
|
})),
|
|
8349
8381
|
findings: array(StorageMigrationFindingSchema)
|
|
8350
8382
|
});
|
|
@@ -8522,10 +8554,51 @@ var LedgerWalkReportSchema = object({
|
|
|
8522
8554
|
var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
|
|
8523
8555
|
var RelocatableMediaCountInputSchema = object({
|
|
8524
8556
|
toLocationId: string().min(1),
|
|
8557
|
+
/** Restrict the count to one source; omitted / `'*'` = every non-target row. */
|
|
8558
|
+
fromLocationId: string().optional(),
|
|
8525
8559
|
/** Omitted = `move`. */
|
|
8526
8560
|
mode: MediaRelocateModeSchema.optional()
|
|
8527
8561
|
});
|
|
8528
8562
|
/**
|
|
8563
|
+
* Operator cleanup of leftover analytics rows, optional debug media, and
|
|
8564
|
+
* ghost ledger entries on frozen footage locations.
|
|
8565
|
+
*
|
|
8566
|
+
* A pass is tens of minutes on a standing backlog. The hub method RETURNS
|
|
8567
|
+
* `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
|
|
8568
|
+
* is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
|
|
8569
|
+
* with no operator-visible status.
|
|
8570
|
+
*/
|
|
8571
|
+
var StorageCleanupPhaseSchema = _enum([
|
|
8572
|
+
"orphans",
|
|
8573
|
+
"debug-media",
|
|
8574
|
+
"ghost-ledger",
|
|
8575
|
+
"done",
|
|
8576
|
+
"failed",
|
|
8577
|
+
"cancelled"
|
|
8578
|
+
]);
|
|
8579
|
+
var StorageCleanupInputSchema = object({
|
|
8580
|
+
/** Also walk motion stills / track filmstrips. Off by default. */
|
|
8581
|
+
includeDebugMedia: boolean().optional() });
|
|
8582
|
+
var StorageCleanupJobSchema = object({
|
|
8583
|
+
jobId: string(),
|
|
8584
|
+
phase: StorageCleanupPhaseSchema,
|
|
8585
|
+
includeDebugMedia: boolean(),
|
|
8586
|
+
orphansReclaimed: number().int().nonnegative(),
|
|
8587
|
+
orphanBytesReclaimed: number().int().nonnegative(),
|
|
8588
|
+
debugMediaReclaimed: number().int().nonnegative(),
|
|
8589
|
+
debugMediaBytesReclaimed: number().int().nonnegative(),
|
|
8590
|
+
ghostsForgotten: number().int().nonnegative(),
|
|
8591
|
+
ghostBytesForgotten: number().int().nonnegative(),
|
|
8592
|
+
/** Short operator-facing line: current collection, pass, or location. */
|
|
8593
|
+
detail: string().nullable(),
|
|
8594
|
+
cancelRequested: boolean(),
|
|
8595
|
+
startedAt: number(),
|
|
8596
|
+
updatedAt: number(),
|
|
8597
|
+
finishedAt: number().nullable(),
|
|
8598
|
+
error: string().nullable()
|
|
8599
|
+
});
|
|
8600
|
+
var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
|
|
8601
|
+
/**
|
|
8529
8602
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
8530
8603
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
8531
8604
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -8553,11 +8626,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
|
|
|
8553
8626
|
* The default location for a type uses `id === <type>:default` by
|
|
8554
8627
|
* convention (the bare type ref like `'backups'` resolves to it).
|
|
8555
8628
|
*
|
|
8556
|
-
* `isSystem
|
|
8557
|
-
*
|
|
8558
|
-
*
|
|
8559
|
-
*
|
|
8560
|
-
* deleting it is rejected at the cap level.
|
|
8629
|
+
* `isSystem` is a legacy persisted flag. Seed still creates the initial
|
|
8630
|
+
* `<type>:default` locations; the flag is no longer a lock, a badge, or a
|
|
8631
|
+
* prune selector. New writes leave it false. Deletion is gated on uniqueness
|
|
8632
|
+
* / last-enabled, not on this bit.
|
|
8561
8633
|
*/
|
|
8562
8634
|
var StorageLocationSchema = object({
|
|
8563
8635
|
id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
|
|
@@ -13100,6 +13172,12 @@ method(object({
|
|
|
13100
13172
|
}), _void(), {
|
|
13101
13173
|
kind: "mutation",
|
|
13102
13174
|
auth: "admin"
|
|
13175
|
+
}), method(object({
|
|
13176
|
+
from: string(),
|
|
13177
|
+
to: string()
|
|
13178
|
+
}), object({ moved: number() }), {
|
|
13179
|
+
kind: "mutation",
|
|
13180
|
+
auth: "admin"
|
|
13103
13181
|
}), method(object({
|
|
13104
13182
|
deviceId: number(),
|
|
13105
13183
|
disabled: boolean()
|
|
@@ -15850,6 +15928,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
15850
15928
|
"device-offline",
|
|
15851
15929
|
"device-disabled",
|
|
15852
15930
|
"device-enabled",
|
|
15931
|
+
"device-battery-low",
|
|
15932
|
+
"device-battery-normal",
|
|
15853
15933
|
"stream-online",
|
|
15854
15934
|
"stream-offline",
|
|
15855
15935
|
"node-online",
|
|
@@ -19108,46 +19188,6 @@ var RecentTracksPageSchema = object({
|
|
|
19108
19188
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19109
19189
|
nextCursor: string().nullable()
|
|
19110
19190
|
});
|
|
19111
|
-
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
19112
|
-
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
19113
|
-
var AnalyticsGroupRecordSchema = object({
|
|
19114
|
-
id: string(),
|
|
19115
|
-
deviceId: number().int(),
|
|
19116
|
-
openedAt: number().int(),
|
|
19117
|
-
closedAt: number().int(),
|
|
19118
|
-
timestamp: number().int(),
|
|
19119
|
-
memberCount: number().int(),
|
|
19120
|
-
memberTrackIds: array(string()).readonly(),
|
|
19121
|
-
className: string(),
|
|
19122
|
-
classes: array(string()).readonly(),
|
|
19123
|
-
/** Relative event-media path, or null when the group has no picture yet. */
|
|
19124
|
-
mediaUrl: string().nullable(),
|
|
19125
|
-
singleton: boolean()
|
|
19126
|
-
});
|
|
19127
|
-
var AnalyticsGroupMemberSchema = object({
|
|
19128
|
-
trackId: string(),
|
|
19129
|
-
deviceId: number().int(),
|
|
19130
|
-
className: string(),
|
|
19131
|
-
firstSeen: number().int(),
|
|
19132
|
-
lastSeen: number().int(),
|
|
19133
|
-
mediaUrl: string().nullable()
|
|
19134
|
-
});
|
|
19135
|
-
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
19136
|
-
var ListGroupsQueryInput = object({
|
|
19137
|
-
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
19138
|
-
deviceIds: array(number()),
|
|
19139
|
-
/** Window lower bound on `closedAt` (inclusive). */
|
|
19140
|
-
since: number().optional(),
|
|
19141
|
-
/** Window upper bound on `openedAt` (inclusive). */
|
|
19142
|
-
until: number().optional(),
|
|
19143
|
-
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
19144
|
-
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
19145
|
-
cursor: string().optional()
|
|
19146
|
-
});
|
|
19147
|
-
var ListGroupsPageSchema = object({
|
|
19148
|
-
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
19149
|
-
nextCursor: string().nullable()
|
|
19150
|
-
});
|
|
19151
19191
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19152
19192
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19153
19193
|
var KeyEventQueryInput = object({
|
|
@@ -19251,9 +19291,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19251
19291
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19252
19292
|
plates: number().int(),
|
|
19253
19293
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
19254
|
-
embeddings: number().int()
|
|
19255
|
-
/** Group membership + group rows removed with their last member (best-effort). */
|
|
19256
|
-
groups: number().int()
|
|
19294
|
+
embeddings: number().int()
|
|
19257
19295
|
});
|
|
19258
19296
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19259
19297
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19423,6 +19461,47 @@ var RebuildStatusSchema = object({
|
|
|
19423
19461
|
/** Present when the pass ended by throwing. */
|
|
19424
19462
|
error: string().nullable()
|
|
19425
19463
|
});
|
|
19464
|
+
/**
|
|
19465
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19466
|
+
*
|
|
19467
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19468
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19469
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19470
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19471
|
+
*/
|
|
19472
|
+
var MediaReclaimStartResultSchema = object({
|
|
19473
|
+
started: boolean(),
|
|
19474
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19475
|
+
alreadyRunning: boolean()
|
|
19476
|
+
});
|
|
19477
|
+
var MediaReclaimInputSchema = object({
|
|
19478
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19479
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19480
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19481
|
+
restart: boolean().optional(),
|
|
19482
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19483
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19484
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19485
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19486
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19487
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19488
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19489
|
+
});
|
|
19490
|
+
var MediaReclaimStatusSchema = object({
|
|
19491
|
+
running: boolean(),
|
|
19492
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19493
|
+
totalExamined: number(),
|
|
19494
|
+
totalEligible: number(),
|
|
19495
|
+
totalReclaimed: number(),
|
|
19496
|
+
totalBytesReclaimed: number(),
|
|
19497
|
+
totalRefused: number(),
|
|
19498
|
+
/** Device+scope windows finished in this pass. */
|
|
19499
|
+
devicesDone: number(),
|
|
19500
|
+
complete: boolean().nullable(),
|
|
19501
|
+
startedAtMs: number().nullable(),
|
|
19502
|
+
finishedAtMs: number().nullable(),
|
|
19503
|
+
error: string().nullable()
|
|
19504
|
+
});
|
|
19426
19505
|
var ReplayFrameInputSchema = object({
|
|
19427
19506
|
timestamp: number(),
|
|
19428
19507
|
frame: PipelineRunResultBridge
|
|
@@ -19461,10 +19540,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19461
19540
|
* stationary registry). Default false: the timeline lists passages,
|
|
19462
19541
|
* not parking records (operator decision, 2026-08-15). */
|
|
19463
19542
|
includeStationary: boolean().optional()
|
|
19464
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
19465
|
-
deviceId: number(),
|
|
19466
|
-
groupId: string().min(1)
|
|
19467
|
-
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
19543
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19468
19544
|
kind: "mutation",
|
|
19469
19545
|
auth: "admin"
|
|
19470
19546
|
}), 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({
|
|
@@ -19564,6 +19640,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19564
19640
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19565
19641
|
kind: "query",
|
|
19566
19642
|
auth: "admin"
|
|
19643
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19644
|
+
kind: "mutation",
|
|
19645
|
+
auth: "admin"
|
|
19646
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19647
|
+
kind: "query",
|
|
19648
|
+
auth: "admin"
|
|
19567
19649
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19568
19650
|
kind: "query",
|
|
19569
19651
|
auth: "admin"
|
|
@@ -21534,7 +21616,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21534
21616
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21535
21617
|
kind: "mutation",
|
|
21536
21618
|
auth: "admin"
|
|
21537
|
-
})
|
|
21619
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21620
|
+
kind: "mutation",
|
|
21621
|
+
auth: "admin"
|
|
21622
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21623
|
+
kind: "mutation",
|
|
21624
|
+
auth: "admin"
|
|
21625
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21538
21626
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21539
21627
|
providerId: string().min(1),
|
|
21540
21628
|
displayName: string().min(1),
|
|
@@ -28635,6 +28723,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
28635
28723
|
minMoveGb: number().min(0).optional()
|
|
28636
28724
|
});
|
|
28637
28725
|
/**
|
|
28726
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
28727
|
+
*
|
|
28728
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
28729
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
28730
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
28731
|
+
*/
|
|
28732
|
+
var RecordingDevicePlacementSchema = object({
|
|
28733
|
+
deviceId: number().int(),
|
|
28734
|
+
profile: string(),
|
|
28735
|
+
locationId: string()
|
|
28736
|
+
});
|
|
28737
|
+
var RecordingDevicePinSchema = object({
|
|
28738
|
+
deviceId: number().int(),
|
|
28739
|
+
/** Recordings-class location this camera is pinned to. */
|
|
28740
|
+
locationId: string()
|
|
28741
|
+
});
|
|
28742
|
+
var RecordingPlacementViewSchema = object({
|
|
28743
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
28744
|
+
pins: array(RecordingDevicePinSchema),
|
|
28745
|
+
defaultLocations: record(string(), string())
|
|
28746
|
+
});
|
|
28747
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
28748
|
+
deviceId: number().int(),
|
|
28749
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
28750
|
+
locationId: string().nullable()
|
|
28751
|
+
});
|
|
28752
|
+
/**
|
|
28638
28753
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
28639
28754
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
28640
28755
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -28860,6 +28975,12 @@ method(object({
|
|
|
28860
28975
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
28861
28976
|
kind: "mutation",
|
|
28862
28977
|
auth: "admin"
|
|
28978
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
28979
|
+
kind: "query",
|
|
28980
|
+
auth: "admin"
|
|
28981
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
28982
|
+
kind: "mutation",
|
|
28983
|
+
auth: "admin"
|
|
28863
28984
|
});
|
|
28864
28985
|
/**
|
|
28865
28986
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -33929,6 +34050,12 @@ Object.freeze({
|
|
|
33929
34050
|
addonId: null,
|
|
33930
34051
|
access: "delete"
|
|
33931
34052
|
},
|
|
34053
|
+
"deviceManager.renameLocation": {
|
|
34054
|
+
capName: "device-manager",
|
|
34055
|
+
capScope: "system",
|
|
34056
|
+
addonId: null,
|
|
34057
|
+
access: "create"
|
|
34058
|
+
},
|
|
33932
34059
|
"deviceManager.runDeviceAction": {
|
|
33933
34060
|
capName: "device-manager",
|
|
33934
34061
|
capScope: "system",
|
|
@@ -35621,19 +35748,19 @@ Object.freeze({
|
|
|
35621
35748
|
addonId: null,
|
|
35622
35749
|
access: "view"
|
|
35623
35750
|
},
|
|
35624
|
-
"pipelineAnalytics.
|
|
35751
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
35625
35752
|
capName: "pipeline-analytics",
|
|
35626
35753
|
capScope: "device",
|
|
35627
35754
|
addonId: null,
|
|
35628
35755
|
access: "view"
|
|
35629
35756
|
},
|
|
35630
|
-
"pipelineAnalytics.
|
|
35757
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
35631
35758
|
capName: "pipeline-analytics",
|
|
35632
35759
|
capScope: "device",
|
|
35633
35760
|
addonId: null,
|
|
35634
35761
|
access: "view"
|
|
35635
35762
|
},
|
|
35636
|
-
"pipelineAnalytics.
|
|
35763
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
35637
35764
|
capName: "pipeline-analytics",
|
|
35638
35765
|
capScope: "device",
|
|
35639
35766
|
addonId: null,
|
|
@@ -35723,12 +35850,6 @@ Object.freeze({
|
|
|
35723
35850
|
addonId: null,
|
|
35724
35851
|
access: "view"
|
|
35725
35852
|
},
|
|
35726
|
-
"pipelineAnalytics.listGroups": {
|
|
35727
|
-
capName: "pipeline-analytics",
|
|
35728
|
-
capScope: "device",
|
|
35729
|
-
addonId: null,
|
|
35730
|
-
access: "view"
|
|
35731
|
-
},
|
|
35732
35853
|
"pipelineAnalytics.listOpsLog": {
|
|
35733
35854
|
capName: "pipeline-analytics",
|
|
35734
35855
|
capScope: "device",
|
|
@@ -35813,6 +35934,12 @@ Object.freeze({
|
|
|
35813
35934
|
addonId: null,
|
|
35814
35935
|
access: "create"
|
|
35815
35936
|
},
|
|
35937
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
35938
|
+
capName: "pipeline-analytics",
|
|
35939
|
+
capScope: "device",
|
|
35940
|
+
addonId: null,
|
|
35941
|
+
access: "create"
|
|
35942
|
+
},
|
|
35816
35943
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
35817
35944
|
capName: "pipeline-analytics",
|
|
35818
35945
|
capScope: "device",
|
|
@@ -36737,6 +36864,12 @@ Object.freeze({
|
|
|
36737
36864
|
addonId: null,
|
|
36738
36865
|
access: "view"
|
|
36739
36866
|
},
|
|
36867
|
+
"recording.getPlacement": {
|
|
36868
|
+
capName: "recording",
|
|
36869
|
+
capScope: "system",
|
|
36870
|
+
addonId: null,
|
|
36871
|
+
access: "view"
|
|
36872
|
+
},
|
|
36740
36873
|
"recording.getPlaybackManifest": {
|
|
36741
36874
|
capName: "recording",
|
|
36742
36875
|
capScope: "system",
|
|
@@ -36863,6 +36996,12 @@ Object.freeze({
|
|
|
36863
36996
|
addonId: null,
|
|
36864
36997
|
access: "create"
|
|
36865
36998
|
},
|
|
36999
|
+
"recording.setDevicePlacement": {
|
|
37000
|
+
capName: "recording",
|
|
37001
|
+
capScope: "system",
|
|
37002
|
+
addonId: null,
|
|
37003
|
+
access: "create"
|
|
37004
|
+
},
|
|
36866
37005
|
"recording.startStorageMigrationMove": {
|
|
36867
37006
|
capName: "recording",
|
|
36868
37007
|
capScope: "system",
|
|
@@ -37307,12 +37446,36 @@ Object.freeze({
|
|
|
37307
37446
|
addonId: null,
|
|
37308
37447
|
access: "create"
|
|
37309
37448
|
},
|
|
37449
|
+
"storageMigration.cleanupCancel": {
|
|
37450
|
+
capName: "storage-migration",
|
|
37451
|
+
capScope: "system",
|
|
37452
|
+
addonId: null,
|
|
37453
|
+
access: "create"
|
|
37454
|
+
},
|
|
37455
|
+
"storageMigration.cleanupStart": {
|
|
37456
|
+
capName: "storage-migration",
|
|
37457
|
+
capScope: "system",
|
|
37458
|
+
addonId: null,
|
|
37459
|
+
access: "create"
|
|
37460
|
+
},
|
|
37461
|
+
"storageMigration.cleanupStatus": {
|
|
37462
|
+
capName: "storage-migration",
|
|
37463
|
+
capScope: "system",
|
|
37464
|
+
addonId: null,
|
|
37465
|
+
access: "view"
|
|
37466
|
+
},
|
|
37310
37467
|
"storageMigration.drain": {
|
|
37311
37468
|
capName: "storage-migration",
|
|
37312
37469
|
capScope: "system",
|
|
37313
37470
|
addonId: null,
|
|
37314
37471
|
access: "create"
|
|
37315
37472
|
},
|
|
37473
|
+
"storageMigration.history": {
|
|
37474
|
+
capName: "storage-migration",
|
|
37475
|
+
capScope: "system",
|
|
37476
|
+
addonId: null,
|
|
37477
|
+
access: "view"
|
|
37478
|
+
},
|
|
37316
37479
|
"storageMigration.movers": {
|
|
37317
37480
|
capName: "storage-migration",
|
|
37318
37481
|
capScope: "system",
|
|
@@ -39309,11 +39472,6 @@ Object.freeze({
|
|
|
39309
39472
|
form: "single",
|
|
39310
39473
|
optional: true
|
|
39311
39474
|
}],
|
|
39312
|
-
"pipelineAnalytics.getGroup": [{
|
|
39313
|
-
name: "deviceId",
|
|
39314
|
-
form: "single",
|
|
39315
|
-
optional: false
|
|
39316
|
-
}],
|
|
39317
39475
|
"pipelineAnalytics.getKeyEvents": [{
|
|
39318
39476
|
name: "deviceId",
|
|
39319
39477
|
form: "single",
|
|
@@ -39379,11 +39537,6 @@ Object.freeze({
|
|
|
39379
39537
|
form: "single",
|
|
39380
39538
|
optional: false
|
|
39381
39539
|
}],
|
|
39382
|
-
"pipelineAnalytics.listGroups": [{
|
|
39383
|
-
name: "deviceIds",
|
|
39384
|
-
form: "array",
|
|
39385
|
-
optional: false
|
|
39386
|
-
}],
|
|
39387
39540
|
"pipelineAnalytics.listOpsLog": [{
|
|
39388
39541
|
name: "deviceId",
|
|
39389
39542
|
form: "single",
|
|
@@ -39429,6 +39582,11 @@ Object.freeze({
|
|
|
39429
39582
|
form: "single",
|
|
39430
39583
|
optional: true
|
|
39431
39584
|
}],
|
|
39585
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
39586
|
+
name: "deviceIds",
|
|
39587
|
+
form: "array",
|
|
39588
|
+
optional: true
|
|
39589
|
+
}],
|
|
39432
39590
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
39433
39591
|
name: "deviceId",
|
|
39434
39592
|
form: "single",
|
|
@@ -39794,6 +39952,11 @@ Object.freeze({
|
|
|
39794
39952
|
form: "single",
|
|
39795
39953
|
optional: false
|
|
39796
39954
|
}],
|
|
39955
|
+
"recording.setDevicePlacement": [{
|
|
39956
|
+
name: "deviceId",
|
|
39957
|
+
form: "single",
|
|
39958
|
+
optional: false
|
|
39959
|
+
}],
|
|
39797
39960
|
"recording.startStorageMigrationMove": [{
|
|
39798
39961
|
name: "deviceId",
|
|
39799
39962
|
form: "single",
|
package/dist/addon.mjs
CHANGED
|
@@ -8133,6 +8133,13 @@ var MediaRelocateModeSchema = _enum([
|
|
|
8133
8133
|
]);
|
|
8134
8134
|
var RelocateMediaInputSchema = object({
|
|
8135
8135
|
toLocationId: string(),
|
|
8136
|
+
/**
|
|
8137
|
+
* Restrict the pass to rows currently on this location. Omitted / `'*'` =
|
|
8138
|
+
* every row that is not already on `toLocationId` (the historical
|
|
8139
|
+
* behaviour). A named source is what a from→to migration needs: without it
|
|
8140
|
+
* "move events off disk 2" also emptied disk 1.
|
|
8141
|
+
*/
|
|
8142
|
+
fromLocationId: string().optional(),
|
|
8136
8143
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8137
8144
|
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8138
8145
|
mode: MediaRelocateModeSchema.optional()
|
|
@@ -8200,6 +8207,19 @@ var StorageMigrationDestinationsSchema = object({
|
|
|
8200
8207
|
galleryMedia: string().min(1).optional()
|
|
8201
8208
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8202
8209
|
/**
|
|
8210
|
+
* Optional named source per class. Omitted = the class's current default
|
|
8211
|
+
* (the historical behaviour). A named source that is NOT the default is a
|
|
8212
|
+
* drain of that disk: bytes move, the default stays, and the source is
|
|
8213
|
+
* disabled when the move finishes.
|
|
8214
|
+
*/
|
|
8215
|
+
var StorageMigrationSourcesSchema = object({
|
|
8216
|
+
recordings: string().min(1).optional(),
|
|
8217
|
+
recordingsLow: string().min(1).optional(),
|
|
8218
|
+
eventMedia: string().min(1).optional(),
|
|
8219
|
+
backups: string().min(1).optional(),
|
|
8220
|
+
galleryMedia: string().min(1).optional()
|
|
8221
|
+
}).optional();
|
|
8222
|
+
/**
|
|
8203
8223
|
* How a migration sequences the cutover against the byte move.
|
|
8204
8224
|
*
|
|
8205
8225
|
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
@@ -8221,6 +8241,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
|
8221
8241
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8222
8242
|
var StorageMigrationInputSchema = object({
|
|
8223
8243
|
destinations: StorageMigrationDestinationsSchema,
|
|
8244
|
+
/** Omitted = each class's current default. */
|
|
8245
|
+
sources: StorageMigrationSourcesSchema,
|
|
8224
8246
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8225
8247
|
/** Omitted = `blocking`, which stays the default. */
|
|
8226
8248
|
mode: StorageMigrationModeSchema.optional()
|
|
@@ -8300,6 +8322,13 @@ var StorageMigrationMoveSchema = object({
|
|
|
8300
8322
|
storageClass: StorageMigrationClassSchema,
|
|
8301
8323
|
fromLocationId: string(),
|
|
8302
8324
|
toLocationId: string(),
|
|
8325
|
+
/**
|
|
8326
|
+
* True when `from` was NOT the class default at plan time. The move still
|
|
8327
|
+
* copies bytes, but the default is left alone and the source is disabled
|
|
8328
|
+
* once the copy verifies. Absent on jobs planned before this field existed
|
|
8329
|
+
* — those jobs always repointed, which is `false`.
|
|
8330
|
+
*/
|
|
8331
|
+
freezeSource: boolean().optional(),
|
|
8303
8332
|
moverJobId: string().nullable(),
|
|
8304
8333
|
state: RelocateJobStateSchema.nullable(),
|
|
8305
8334
|
error: string().nullable(),
|
|
@@ -8313,6 +8342,7 @@ var StorageMigrationJobSchema = object({
|
|
|
8313
8342
|
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8314
8343
|
mode: StorageMigrationModeSchema,
|
|
8315
8344
|
destinations: StorageMigrationDestinationsSchema,
|
|
8345
|
+
sources: StorageMigrationSourcesSchema,
|
|
8316
8346
|
throttleMbps: number(),
|
|
8317
8347
|
moves: array(StorageMigrationMoveSchema),
|
|
8318
8348
|
pauseLeaseId: string().nullable(),
|
|
@@ -8338,6 +8368,7 @@ var StorageMigrationFindingSchema = object({
|
|
|
8338
8368
|
});
|
|
8339
8369
|
var StorageMigrationPlanSchema = object({
|
|
8340
8370
|
destinations: StorageMigrationDestinationsSchema,
|
|
8371
|
+
sources: StorageMigrationSourcesSchema,
|
|
8341
8372
|
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8342
8373
|
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8343
8374
|
* it. */
|
|
@@ -8345,7 +8376,8 @@ var StorageMigrationPlanSchema = object({
|
|
|
8345
8376
|
moves: array(object({
|
|
8346
8377
|
storageClass: StorageMigrationClassSchema,
|
|
8347
8378
|
fromLocationId: string(),
|
|
8348
|
-
toLocationId: string()
|
|
8379
|
+
toLocationId: string(),
|
|
8380
|
+
freezeSource: boolean().optional()
|
|
8349
8381
|
})),
|
|
8350
8382
|
findings: array(StorageMigrationFindingSchema)
|
|
8351
8383
|
});
|
|
@@ -8523,10 +8555,51 @@ var LedgerWalkReportSchema = object({
|
|
|
8523
8555
|
var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
|
|
8524
8556
|
var RelocatableMediaCountInputSchema = object({
|
|
8525
8557
|
toLocationId: string().min(1),
|
|
8558
|
+
/** Restrict the count to one source; omitted / `'*'` = every non-target row. */
|
|
8559
|
+
fromLocationId: string().optional(),
|
|
8526
8560
|
/** Omitted = `move`. */
|
|
8527
8561
|
mode: MediaRelocateModeSchema.optional()
|
|
8528
8562
|
});
|
|
8529
8563
|
/**
|
|
8564
|
+
* Operator cleanup of leftover analytics rows, optional debug media, and
|
|
8565
|
+
* ghost ledger entries on frozen footage locations.
|
|
8566
|
+
*
|
|
8567
|
+
* A pass is tens of minutes on a standing backlog. The hub method RETURNS
|
|
8568
|
+
* `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
|
|
8569
|
+
* is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
|
|
8570
|
+
* with no operator-visible status.
|
|
8571
|
+
*/
|
|
8572
|
+
var StorageCleanupPhaseSchema = _enum([
|
|
8573
|
+
"orphans",
|
|
8574
|
+
"debug-media",
|
|
8575
|
+
"ghost-ledger",
|
|
8576
|
+
"done",
|
|
8577
|
+
"failed",
|
|
8578
|
+
"cancelled"
|
|
8579
|
+
]);
|
|
8580
|
+
var StorageCleanupInputSchema = object({
|
|
8581
|
+
/** Also walk motion stills / track filmstrips. Off by default. */
|
|
8582
|
+
includeDebugMedia: boolean().optional() });
|
|
8583
|
+
var StorageCleanupJobSchema = object({
|
|
8584
|
+
jobId: string(),
|
|
8585
|
+
phase: StorageCleanupPhaseSchema,
|
|
8586
|
+
includeDebugMedia: boolean(),
|
|
8587
|
+
orphansReclaimed: number().int().nonnegative(),
|
|
8588
|
+
orphanBytesReclaimed: number().int().nonnegative(),
|
|
8589
|
+
debugMediaReclaimed: number().int().nonnegative(),
|
|
8590
|
+
debugMediaBytesReclaimed: number().int().nonnegative(),
|
|
8591
|
+
ghostsForgotten: number().int().nonnegative(),
|
|
8592
|
+
ghostBytesForgotten: number().int().nonnegative(),
|
|
8593
|
+
/** Short operator-facing line: current collection, pass, or location. */
|
|
8594
|
+
detail: string().nullable(),
|
|
8595
|
+
cancelRequested: boolean(),
|
|
8596
|
+
startedAt: number(),
|
|
8597
|
+
updatedAt: number(),
|
|
8598
|
+
finishedAt: number().nullable(),
|
|
8599
|
+
error: string().nullable()
|
|
8600
|
+
});
|
|
8601
|
+
var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
|
|
8602
|
+
/**
|
|
8530
8603
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
8531
8604
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
8532
8605
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -8554,11 +8627,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
|
|
|
8554
8627
|
* The default location for a type uses `id === <type>:default` by
|
|
8555
8628
|
* convention (the bare type ref like `'backups'` resolves to it).
|
|
8556
8629
|
*
|
|
8557
|
-
* `isSystem
|
|
8558
|
-
*
|
|
8559
|
-
*
|
|
8560
|
-
*
|
|
8561
|
-
* deleting it is rejected at the cap level.
|
|
8630
|
+
* `isSystem` is a legacy persisted flag. Seed still creates the initial
|
|
8631
|
+
* `<type>:default` locations; the flag is no longer a lock, a badge, or a
|
|
8632
|
+
* prune selector. New writes leave it false. Deletion is gated on uniqueness
|
|
8633
|
+
* / last-enabled, not on this bit.
|
|
8562
8634
|
*/
|
|
8563
8635
|
var StorageLocationSchema = object({
|
|
8564
8636
|
id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
|
|
@@ -13101,6 +13173,12 @@ method(object({
|
|
|
13101
13173
|
}), _void(), {
|
|
13102
13174
|
kind: "mutation",
|
|
13103
13175
|
auth: "admin"
|
|
13176
|
+
}), method(object({
|
|
13177
|
+
from: string(),
|
|
13178
|
+
to: string()
|
|
13179
|
+
}), object({ moved: number() }), {
|
|
13180
|
+
kind: "mutation",
|
|
13181
|
+
auth: "admin"
|
|
13104
13182
|
}), method(object({
|
|
13105
13183
|
deviceId: number(),
|
|
13106
13184
|
disabled: boolean()
|
|
@@ -15851,6 +15929,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
15851
15929
|
"device-offline",
|
|
15852
15930
|
"device-disabled",
|
|
15853
15931
|
"device-enabled",
|
|
15932
|
+
"device-battery-low",
|
|
15933
|
+
"device-battery-normal",
|
|
15854
15934
|
"stream-online",
|
|
15855
15935
|
"stream-offline",
|
|
15856
15936
|
"node-online",
|
|
@@ -19109,46 +19189,6 @@ var RecentTracksPageSchema = object({
|
|
|
19109
19189
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19110
19190
|
nextCursor: string().nullable()
|
|
19111
19191
|
});
|
|
19112
|
-
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
19113
|
-
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
19114
|
-
var AnalyticsGroupRecordSchema = object({
|
|
19115
|
-
id: string(),
|
|
19116
|
-
deviceId: number().int(),
|
|
19117
|
-
openedAt: number().int(),
|
|
19118
|
-
closedAt: number().int(),
|
|
19119
|
-
timestamp: number().int(),
|
|
19120
|
-
memberCount: number().int(),
|
|
19121
|
-
memberTrackIds: array(string()).readonly(),
|
|
19122
|
-
className: string(),
|
|
19123
|
-
classes: array(string()).readonly(),
|
|
19124
|
-
/** Relative event-media path, or null when the group has no picture yet. */
|
|
19125
|
-
mediaUrl: string().nullable(),
|
|
19126
|
-
singleton: boolean()
|
|
19127
|
-
});
|
|
19128
|
-
var AnalyticsGroupMemberSchema = object({
|
|
19129
|
-
trackId: string(),
|
|
19130
|
-
deviceId: number().int(),
|
|
19131
|
-
className: string(),
|
|
19132
|
-
firstSeen: number().int(),
|
|
19133
|
-
lastSeen: number().int(),
|
|
19134
|
-
mediaUrl: string().nullable()
|
|
19135
|
-
});
|
|
19136
|
-
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
19137
|
-
var ListGroupsQueryInput = object({
|
|
19138
|
-
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
19139
|
-
deviceIds: array(number()),
|
|
19140
|
-
/** Window lower bound on `closedAt` (inclusive). */
|
|
19141
|
-
since: number().optional(),
|
|
19142
|
-
/** Window upper bound on `openedAt` (inclusive). */
|
|
19143
|
-
until: number().optional(),
|
|
19144
|
-
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
19145
|
-
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
19146
|
-
cursor: string().optional()
|
|
19147
|
-
});
|
|
19148
|
-
var ListGroupsPageSchema = object({
|
|
19149
|
-
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
19150
|
-
nextCursor: string().nullable()
|
|
19151
|
-
});
|
|
19152
19192
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19153
19193
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19154
19194
|
var KeyEventQueryInput = object({
|
|
@@ -19252,9 +19292,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19252
19292
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19253
19293
|
plates: number().int(),
|
|
19254
19294
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
19255
|
-
embeddings: number().int()
|
|
19256
|
-
/** Group membership + group rows removed with their last member (best-effort). */
|
|
19257
|
-
groups: number().int()
|
|
19295
|
+
embeddings: number().int()
|
|
19258
19296
|
});
|
|
19259
19297
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19260
19298
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19424,6 +19462,47 @@ var RebuildStatusSchema = object({
|
|
|
19424
19462
|
/** Present when the pass ended by throwing. */
|
|
19425
19463
|
error: string().nullable()
|
|
19426
19464
|
});
|
|
19465
|
+
/**
|
|
19466
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19467
|
+
*
|
|
19468
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19469
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19470
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19471
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19472
|
+
*/
|
|
19473
|
+
var MediaReclaimStartResultSchema = object({
|
|
19474
|
+
started: boolean(),
|
|
19475
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19476
|
+
alreadyRunning: boolean()
|
|
19477
|
+
});
|
|
19478
|
+
var MediaReclaimInputSchema = object({
|
|
19479
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19480
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19481
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19482
|
+
restart: boolean().optional(),
|
|
19483
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19484
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19485
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19486
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19487
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19488
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19489
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19490
|
+
});
|
|
19491
|
+
var MediaReclaimStatusSchema = object({
|
|
19492
|
+
running: boolean(),
|
|
19493
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19494
|
+
totalExamined: number(),
|
|
19495
|
+
totalEligible: number(),
|
|
19496
|
+
totalReclaimed: number(),
|
|
19497
|
+
totalBytesReclaimed: number(),
|
|
19498
|
+
totalRefused: number(),
|
|
19499
|
+
/** Device+scope windows finished in this pass. */
|
|
19500
|
+
devicesDone: number(),
|
|
19501
|
+
complete: boolean().nullable(),
|
|
19502
|
+
startedAtMs: number().nullable(),
|
|
19503
|
+
finishedAtMs: number().nullable(),
|
|
19504
|
+
error: string().nullable()
|
|
19505
|
+
});
|
|
19427
19506
|
var ReplayFrameInputSchema = object({
|
|
19428
19507
|
timestamp: number(),
|
|
19429
19508
|
frame: PipelineRunResultBridge
|
|
@@ -19462,10 +19541,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19462
19541
|
* stationary registry). Default false: the timeline lists passages,
|
|
19463
19542
|
* not parking records (operator decision, 2026-08-15). */
|
|
19464
19543
|
includeStationary: boolean().optional()
|
|
19465
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
19466
|
-
deviceId: number(),
|
|
19467
|
-
groupId: string().min(1)
|
|
19468
|
-
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
19544
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19469
19545
|
kind: "mutation",
|
|
19470
19546
|
auth: "admin"
|
|
19471
19547
|
}), 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({
|
|
@@ -19565,6 +19641,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19565
19641
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19566
19642
|
kind: "query",
|
|
19567
19643
|
auth: "admin"
|
|
19644
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19645
|
+
kind: "mutation",
|
|
19646
|
+
auth: "admin"
|
|
19647
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19648
|
+
kind: "query",
|
|
19649
|
+
auth: "admin"
|
|
19568
19650
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19569
19651
|
kind: "query",
|
|
19570
19652
|
auth: "admin"
|
|
@@ -21535,7 +21617,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21535
21617
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21536
21618
|
kind: "mutation",
|
|
21537
21619
|
auth: "admin"
|
|
21538
|
-
})
|
|
21620
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21621
|
+
kind: "mutation",
|
|
21622
|
+
auth: "admin"
|
|
21623
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21624
|
+
kind: "mutation",
|
|
21625
|
+
auth: "admin"
|
|
21626
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21539
21627
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21540
21628
|
providerId: string().min(1),
|
|
21541
21629
|
displayName: string().min(1),
|
|
@@ -28636,6 +28724,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
28636
28724
|
minMoveGb: number().min(0).optional()
|
|
28637
28725
|
});
|
|
28638
28726
|
/**
|
|
28727
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
28728
|
+
*
|
|
28729
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
28730
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
28731
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
28732
|
+
*/
|
|
28733
|
+
var RecordingDevicePlacementSchema = object({
|
|
28734
|
+
deviceId: number().int(),
|
|
28735
|
+
profile: string(),
|
|
28736
|
+
locationId: string()
|
|
28737
|
+
});
|
|
28738
|
+
var RecordingDevicePinSchema = object({
|
|
28739
|
+
deviceId: number().int(),
|
|
28740
|
+
/** Recordings-class location this camera is pinned to. */
|
|
28741
|
+
locationId: string()
|
|
28742
|
+
});
|
|
28743
|
+
var RecordingPlacementViewSchema = object({
|
|
28744
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
28745
|
+
pins: array(RecordingDevicePinSchema),
|
|
28746
|
+
defaultLocations: record(string(), string())
|
|
28747
|
+
});
|
|
28748
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
28749
|
+
deviceId: number().int(),
|
|
28750
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
28751
|
+
locationId: string().nullable()
|
|
28752
|
+
});
|
|
28753
|
+
/**
|
|
28639
28754
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
28640
28755
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
28641
28756
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -28861,6 +28976,12 @@ method(object({
|
|
|
28861
28976
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
28862
28977
|
kind: "mutation",
|
|
28863
28978
|
auth: "admin"
|
|
28979
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
28980
|
+
kind: "query",
|
|
28981
|
+
auth: "admin"
|
|
28982
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
28983
|
+
kind: "mutation",
|
|
28984
|
+
auth: "admin"
|
|
28864
28985
|
});
|
|
28865
28986
|
/**
|
|
28866
28987
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -33930,6 +34051,12 @@ Object.freeze({
|
|
|
33930
34051
|
addonId: null,
|
|
33931
34052
|
access: "delete"
|
|
33932
34053
|
},
|
|
34054
|
+
"deviceManager.renameLocation": {
|
|
34055
|
+
capName: "device-manager",
|
|
34056
|
+
capScope: "system",
|
|
34057
|
+
addonId: null,
|
|
34058
|
+
access: "create"
|
|
34059
|
+
},
|
|
33933
34060
|
"deviceManager.runDeviceAction": {
|
|
33934
34061
|
capName: "device-manager",
|
|
33935
34062
|
capScope: "system",
|
|
@@ -35622,19 +35749,19 @@ Object.freeze({
|
|
|
35622
35749
|
addonId: null,
|
|
35623
35750
|
access: "view"
|
|
35624
35751
|
},
|
|
35625
|
-
"pipelineAnalytics.
|
|
35752
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
35626
35753
|
capName: "pipeline-analytics",
|
|
35627
35754
|
capScope: "device",
|
|
35628
35755
|
addonId: null,
|
|
35629
35756
|
access: "view"
|
|
35630
35757
|
},
|
|
35631
|
-
"pipelineAnalytics.
|
|
35758
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
35632
35759
|
capName: "pipeline-analytics",
|
|
35633
35760
|
capScope: "device",
|
|
35634
35761
|
addonId: null,
|
|
35635
35762
|
access: "view"
|
|
35636
35763
|
},
|
|
35637
|
-
"pipelineAnalytics.
|
|
35764
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
35638
35765
|
capName: "pipeline-analytics",
|
|
35639
35766
|
capScope: "device",
|
|
35640
35767
|
addonId: null,
|
|
@@ -35724,12 +35851,6 @@ Object.freeze({
|
|
|
35724
35851
|
addonId: null,
|
|
35725
35852
|
access: "view"
|
|
35726
35853
|
},
|
|
35727
|
-
"pipelineAnalytics.listGroups": {
|
|
35728
|
-
capName: "pipeline-analytics",
|
|
35729
|
-
capScope: "device",
|
|
35730
|
-
addonId: null,
|
|
35731
|
-
access: "view"
|
|
35732
|
-
},
|
|
35733
35854
|
"pipelineAnalytics.listOpsLog": {
|
|
35734
35855
|
capName: "pipeline-analytics",
|
|
35735
35856
|
capScope: "device",
|
|
@@ -35814,6 +35935,12 @@ Object.freeze({
|
|
|
35814
35935
|
addonId: null,
|
|
35815
35936
|
access: "create"
|
|
35816
35937
|
},
|
|
35938
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
35939
|
+
capName: "pipeline-analytics",
|
|
35940
|
+
capScope: "device",
|
|
35941
|
+
addonId: null,
|
|
35942
|
+
access: "create"
|
|
35943
|
+
},
|
|
35817
35944
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
35818
35945
|
capName: "pipeline-analytics",
|
|
35819
35946
|
capScope: "device",
|
|
@@ -36738,6 +36865,12 @@ Object.freeze({
|
|
|
36738
36865
|
addonId: null,
|
|
36739
36866
|
access: "view"
|
|
36740
36867
|
},
|
|
36868
|
+
"recording.getPlacement": {
|
|
36869
|
+
capName: "recording",
|
|
36870
|
+
capScope: "system",
|
|
36871
|
+
addonId: null,
|
|
36872
|
+
access: "view"
|
|
36873
|
+
},
|
|
36741
36874
|
"recording.getPlaybackManifest": {
|
|
36742
36875
|
capName: "recording",
|
|
36743
36876
|
capScope: "system",
|
|
@@ -36864,6 +36997,12 @@ Object.freeze({
|
|
|
36864
36997
|
addonId: null,
|
|
36865
36998
|
access: "create"
|
|
36866
36999
|
},
|
|
37000
|
+
"recording.setDevicePlacement": {
|
|
37001
|
+
capName: "recording",
|
|
37002
|
+
capScope: "system",
|
|
37003
|
+
addonId: null,
|
|
37004
|
+
access: "create"
|
|
37005
|
+
},
|
|
36867
37006
|
"recording.startStorageMigrationMove": {
|
|
36868
37007
|
capName: "recording",
|
|
36869
37008
|
capScope: "system",
|
|
@@ -37308,12 +37447,36 @@ Object.freeze({
|
|
|
37308
37447
|
addonId: null,
|
|
37309
37448
|
access: "create"
|
|
37310
37449
|
},
|
|
37450
|
+
"storageMigration.cleanupCancel": {
|
|
37451
|
+
capName: "storage-migration",
|
|
37452
|
+
capScope: "system",
|
|
37453
|
+
addonId: null,
|
|
37454
|
+
access: "create"
|
|
37455
|
+
},
|
|
37456
|
+
"storageMigration.cleanupStart": {
|
|
37457
|
+
capName: "storage-migration",
|
|
37458
|
+
capScope: "system",
|
|
37459
|
+
addonId: null,
|
|
37460
|
+
access: "create"
|
|
37461
|
+
},
|
|
37462
|
+
"storageMigration.cleanupStatus": {
|
|
37463
|
+
capName: "storage-migration",
|
|
37464
|
+
capScope: "system",
|
|
37465
|
+
addonId: null,
|
|
37466
|
+
access: "view"
|
|
37467
|
+
},
|
|
37311
37468
|
"storageMigration.drain": {
|
|
37312
37469
|
capName: "storage-migration",
|
|
37313
37470
|
capScope: "system",
|
|
37314
37471
|
addonId: null,
|
|
37315
37472
|
access: "create"
|
|
37316
37473
|
},
|
|
37474
|
+
"storageMigration.history": {
|
|
37475
|
+
capName: "storage-migration",
|
|
37476
|
+
capScope: "system",
|
|
37477
|
+
addonId: null,
|
|
37478
|
+
access: "view"
|
|
37479
|
+
},
|
|
37317
37480
|
"storageMigration.movers": {
|
|
37318
37481
|
capName: "storage-migration",
|
|
37319
37482
|
capScope: "system",
|
|
@@ -39310,11 +39473,6 @@ Object.freeze({
|
|
|
39310
39473
|
form: "single",
|
|
39311
39474
|
optional: true
|
|
39312
39475
|
}],
|
|
39313
|
-
"pipelineAnalytics.getGroup": [{
|
|
39314
|
-
name: "deviceId",
|
|
39315
|
-
form: "single",
|
|
39316
|
-
optional: false
|
|
39317
|
-
}],
|
|
39318
39476
|
"pipelineAnalytics.getKeyEvents": [{
|
|
39319
39477
|
name: "deviceId",
|
|
39320
39478
|
form: "single",
|
|
@@ -39380,11 +39538,6 @@ Object.freeze({
|
|
|
39380
39538
|
form: "single",
|
|
39381
39539
|
optional: false
|
|
39382
39540
|
}],
|
|
39383
|
-
"pipelineAnalytics.listGroups": [{
|
|
39384
|
-
name: "deviceIds",
|
|
39385
|
-
form: "array",
|
|
39386
|
-
optional: false
|
|
39387
|
-
}],
|
|
39388
39541
|
"pipelineAnalytics.listOpsLog": [{
|
|
39389
39542
|
name: "deviceId",
|
|
39390
39543
|
form: "single",
|
|
@@ -39430,6 +39583,11 @@ Object.freeze({
|
|
|
39430
39583
|
form: "single",
|
|
39431
39584
|
optional: true
|
|
39432
39585
|
}],
|
|
39586
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
39587
|
+
name: "deviceIds",
|
|
39588
|
+
form: "array",
|
|
39589
|
+
optional: true
|
|
39590
|
+
}],
|
|
39433
39591
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
39434
39592
|
name: "deviceId",
|
|
39435
39593
|
form: "single",
|
|
@@ -39795,6 +39953,11 @@ Object.freeze({
|
|
|
39795
39953
|
form: "single",
|
|
39796
39954
|
optional: false
|
|
39797
39955
|
}],
|
|
39956
|
+
"recording.setDevicePlacement": [{
|
|
39957
|
+
name: "deviceId",
|
|
39958
|
+
form: "single",
|
|
39959
|
+
optional: false
|
|
39960
|
+
}],
|
|
39798
39961
|
"recording.startStorageMigrationMove": [{
|
|
39799
39962
|
name: "deviceId",
|
|
39800
39963
|
form: "single",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-provider-dreo",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.51",
|
|
4
4
|
"description": "Dreo smart-device (fan / air-circulator / purifier / heater / humidifier) device-provider addon for CamStack — wraps the @apocaliss92/nodedreo Dreo cloud client (REST + WebSocket)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|