@camstack/addon-provider-amcrest 0.2.50 → 0.2.52
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
|
@@ -8089,6 +8089,13 @@ var MediaRelocateModeSchema = _enum([
|
|
|
8089
8089
|
]);
|
|
8090
8090
|
var RelocateMediaInputSchema = object({
|
|
8091
8091
|
toLocationId: string(),
|
|
8092
|
+
/**
|
|
8093
|
+
* Restrict the pass to rows currently on this location. Omitted / `'*'` =
|
|
8094
|
+
* every row that is not already on `toLocationId` (the historical
|
|
8095
|
+
* behaviour). A named source is what a from→to migration needs: without it
|
|
8096
|
+
* "move events off disk 2" also emptied disk 1.
|
|
8097
|
+
*/
|
|
8098
|
+
fromLocationId: string().optional(),
|
|
8092
8099
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8093
8100
|
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8094
8101
|
mode: MediaRelocateModeSchema.optional()
|
|
@@ -8156,6 +8163,19 @@ var StorageMigrationDestinationsSchema = object({
|
|
|
8156
8163
|
galleryMedia: string().min(1).optional()
|
|
8157
8164
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8158
8165
|
/**
|
|
8166
|
+
* Optional named source per class. Omitted = the class's current default
|
|
8167
|
+
* (the historical behaviour). A named source that is NOT the default is a
|
|
8168
|
+
* drain of that disk: bytes move, the default stays, and the source is
|
|
8169
|
+
* disabled when the move finishes.
|
|
8170
|
+
*/
|
|
8171
|
+
var StorageMigrationSourcesSchema = object({
|
|
8172
|
+
recordings: string().min(1).optional(),
|
|
8173
|
+
recordingsLow: string().min(1).optional(),
|
|
8174
|
+
eventMedia: string().min(1).optional(),
|
|
8175
|
+
backups: string().min(1).optional(),
|
|
8176
|
+
galleryMedia: string().min(1).optional()
|
|
8177
|
+
}).optional();
|
|
8178
|
+
/**
|
|
8159
8179
|
* How a migration sequences the cutover against the byte move.
|
|
8160
8180
|
*
|
|
8161
8181
|
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
@@ -8177,6 +8197,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
|
8177
8197
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8178
8198
|
var StorageMigrationInputSchema = object({
|
|
8179
8199
|
destinations: StorageMigrationDestinationsSchema,
|
|
8200
|
+
/** Omitted = each class's current default. */
|
|
8201
|
+
sources: StorageMigrationSourcesSchema,
|
|
8180
8202
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8181
8203
|
/** Omitted = `blocking`, which stays the default. */
|
|
8182
8204
|
mode: StorageMigrationModeSchema.optional()
|
|
@@ -8256,6 +8278,13 @@ var StorageMigrationMoveSchema = object({
|
|
|
8256
8278
|
storageClass: StorageMigrationClassSchema,
|
|
8257
8279
|
fromLocationId: string(),
|
|
8258
8280
|
toLocationId: string(),
|
|
8281
|
+
/**
|
|
8282
|
+
* True when `from` was NOT the class default at plan time. The move still
|
|
8283
|
+
* copies bytes, but the default is left alone and the source is disabled
|
|
8284
|
+
* once the copy verifies. Absent on jobs planned before this field existed
|
|
8285
|
+
* — those jobs always repointed, which is `false`.
|
|
8286
|
+
*/
|
|
8287
|
+
freezeSource: boolean().optional(),
|
|
8259
8288
|
moverJobId: string().nullable(),
|
|
8260
8289
|
state: RelocateJobStateSchema.nullable(),
|
|
8261
8290
|
error: string().nullable(),
|
|
@@ -8269,6 +8298,7 @@ var StorageMigrationJobSchema = object({
|
|
|
8269
8298
|
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8270
8299
|
mode: StorageMigrationModeSchema,
|
|
8271
8300
|
destinations: StorageMigrationDestinationsSchema,
|
|
8301
|
+
sources: StorageMigrationSourcesSchema,
|
|
8272
8302
|
throttleMbps: number(),
|
|
8273
8303
|
moves: array(StorageMigrationMoveSchema),
|
|
8274
8304
|
pauseLeaseId: string().nullable(),
|
|
@@ -8294,6 +8324,7 @@ var StorageMigrationFindingSchema = object({
|
|
|
8294
8324
|
});
|
|
8295
8325
|
var StorageMigrationPlanSchema = object({
|
|
8296
8326
|
destinations: StorageMigrationDestinationsSchema,
|
|
8327
|
+
sources: StorageMigrationSourcesSchema,
|
|
8297
8328
|
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8298
8329
|
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8299
8330
|
* it. */
|
|
@@ -8301,7 +8332,8 @@ var StorageMigrationPlanSchema = object({
|
|
|
8301
8332
|
moves: array(object({
|
|
8302
8333
|
storageClass: StorageMigrationClassSchema,
|
|
8303
8334
|
fromLocationId: string(),
|
|
8304
|
-
toLocationId: string()
|
|
8335
|
+
toLocationId: string(),
|
|
8336
|
+
freezeSource: boolean().optional()
|
|
8305
8337
|
})),
|
|
8306
8338
|
findings: array(StorageMigrationFindingSchema)
|
|
8307
8339
|
});
|
|
@@ -8479,10 +8511,51 @@ var LedgerWalkReportSchema = object({
|
|
|
8479
8511
|
var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
|
|
8480
8512
|
var RelocatableMediaCountInputSchema = object({
|
|
8481
8513
|
toLocationId: string().min(1),
|
|
8514
|
+
/** Restrict the count to one source; omitted / `'*'` = every non-target row. */
|
|
8515
|
+
fromLocationId: string().optional(),
|
|
8482
8516
|
/** Omitted = `move`. */
|
|
8483
8517
|
mode: MediaRelocateModeSchema.optional()
|
|
8484
8518
|
});
|
|
8485
8519
|
/**
|
|
8520
|
+
* Operator cleanup of leftover analytics rows, optional debug media, and
|
|
8521
|
+
* ghost ledger entries on frozen footage locations.
|
|
8522
|
+
*
|
|
8523
|
+
* A pass is tens of minutes on a standing backlog. The hub method RETURNS
|
|
8524
|
+
* `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
|
|
8525
|
+
* is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
|
|
8526
|
+
* with no operator-visible status.
|
|
8527
|
+
*/
|
|
8528
|
+
var StorageCleanupPhaseSchema = _enum([
|
|
8529
|
+
"orphans",
|
|
8530
|
+
"debug-media",
|
|
8531
|
+
"ghost-ledger",
|
|
8532
|
+
"done",
|
|
8533
|
+
"failed",
|
|
8534
|
+
"cancelled"
|
|
8535
|
+
]);
|
|
8536
|
+
var StorageCleanupInputSchema = object({
|
|
8537
|
+
/** Also walk motion stills / track filmstrips. Off by default. */
|
|
8538
|
+
includeDebugMedia: boolean().optional() });
|
|
8539
|
+
var StorageCleanupJobSchema = object({
|
|
8540
|
+
jobId: string(),
|
|
8541
|
+
phase: StorageCleanupPhaseSchema,
|
|
8542
|
+
includeDebugMedia: boolean(),
|
|
8543
|
+
orphansReclaimed: number().int().nonnegative(),
|
|
8544
|
+
orphanBytesReclaimed: number().int().nonnegative(),
|
|
8545
|
+
debugMediaReclaimed: number().int().nonnegative(),
|
|
8546
|
+
debugMediaBytesReclaimed: number().int().nonnegative(),
|
|
8547
|
+
ghostsForgotten: number().int().nonnegative(),
|
|
8548
|
+
ghostBytesForgotten: number().int().nonnegative(),
|
|
8549
|
+
/** Short operator-facing line: current collection, pass, or location. */
|
|
8550
|
+
detail: string().nullable(),
|
|
8551
|
+
cancelRequested: boolean(),
|
|
8552
|
+
startedAt: number(),
|
|
8553
|
+
updatedAt: number(),
|
|
8554
|
+
finishedAt: number().nullable(),
|
|
8555
|
+
error: string().nullable()
|
|
8556
|
+
});
|
|
8557
|
+
var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
|
|
8558
|
+
/**
|
|
8486
8559
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
8487
8560
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
8488
8561
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -8510,11 +8583,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
|
|
|
8510
8583
|
* The default location for a type uses `id === <type>:default` by
|
|
8511
8584
|
* convention (the bare type ref like `'backups'` resolves to it).
|
|
8512
8585
|
*
|
|
8513
|
-
* `isSystem
|
|
8514
|
-
*
|
|
8515
|
-
*
|
|
8516
|
-
*
|
|
8517
|
-
* deleting it is rejected at the cap level.
|
|
8586
|
+
* `isSystem` is a legacy persisted flag. Seed still creates the initial
|
|
8587
|
+
* `<type>:default` locations; the flag is no longer a lock, a badge, or a
|
|
8588
|
+
* prune selector. New writes leave it false. Deletion is gated on uniqueness
|
|
8589
|
+
* / last-enabled, not on this bit.
|
|
8518
8590
|
*/
|
|
8519
8591
|
var StorageLocationSchema = object({
|
|
8520
8592
|
id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
|
|
@@ -13040,6 +13112,12 @@ method(object({
|
|
|
13040
13112
|
}), _void(), {
|
|
13041
13113
|
kind: "mutation",
|
|
13042
13114
|
auth: "admin"
|
|
13115
|
+
}), method(object({
|
|
13116
|
+
from: string(),
|
|
13117
|
+
to: string()
|
|
13118
|
+
}), object({ moved: number() }), {
|
|
13119
|
+
kind: "mutation",
|
|
13120
|
+
auth: "admin"
|
|
13043
13121
|
}), method(object({
|
|
13044
13122
|
deviceId: number(),
|
|
13045
13123
|
disabled: boolean()
|
|
@@ -15790,6 +15868,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
15790
15868
|
"device-offline",
|
|
15791
15869
|
"device-disabled",
|
|
15792
15870
|
"device-enabled",
|
|
15871
|
+
"device-battery-low",
|
|
15872
|
+
"device-battery-normal",
|
|
15793
15873
|
"stream-online",
|
|
15794
15874
|
"stream-offline",
|
|
15795
15875
|
"node-online",
|
|
@@ -19048,46 +19128,6 @@ var RecentTracksPageSchema = object({
|
|
|
19048
19128
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19049
19129
|
nextCursor: string().nullable()
|
|
19050
19130
|
});
|
|
19051
|
-
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
19052
|
-
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
19053
|
-
var AnalyticsGroupRecordSchema = object({
|
|
19054
|
-
id: string(),
|
|
19055
|
-
deviceId: number().int(),
|
|
19056
|
-
openedAt: number().int(),
|
|
19057
|
-
closedAt: number().int(),
|
|
19058
|
-
timestamp: number().int(),
|
|
19059
|
-
memberCount: number().int(),
|
|
19060
|
-
memberTrackIds: array(string()).readonly(),
|
|
19061
|
-
className: string(),
|
|
19062
|
-
classes: array(string()).readonly(),
|
|
19063
|
-
/** Relative event-media path, or null when the group has no picture yet. */
|
|
19064
|
-
mediaUrl: string().nullable(),
|
|
19065
|
-
singleton: boolean()
|
|
19066
|
-
});
|
|
19067
|
-
var AnalyticsGroupMemberSchema = object({
|
|
19068
|
-
trackId: string(),
|
|
19069
|
-
deviceId: number().int(),
|
|
19070
|
-
className: string(),
|
|
19071
|
-
firstSeen: number().int(),
|
|
19072
|
-
lastSeen: number().int(),
|
|
19073
|
-
mediaUrl: string().nullable()
|
|
19074
|
-
});
|
|
19075
|
-
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
19076
|
-
var ListGroupsQueryInput = object({
|
|
19077
|
-
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
19078
|
-
deviceIds: array(number()),
|
|
19079
|
-
/** Window lower bound on `closedAt` (inclusive). */
|
|
19080
|
-
since: number().optional(),
|
|
19081
|
-
/** Window upper bound on `openedAt` (inclusive). */
|
|
19082
|
-
until: number().optional(),
|
|
19083
|
-
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
19084
|
-
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
19085
|
-
cursor: string().optional()
|
|
19086
|
-
});
|
|
19087
|
-
var ListGroupsPageSchema = object({
|
|
19088
|
-
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
19089
|
-
nextCursor: string().nullable()
|
|
19090
|
-
});
|
|
19091
19131
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19092
19132
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19093
19133
|
var KeyEventQueryInput = object({
|
|
@@ -19191,9 +19231,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19191
19231
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19192
19232
|
plates: number().int(),
|
|
19193
19233
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
19194
|
-
embeddings: number().int()
|
|
19195
|
-
/** Group membership + group rows removed with their last member (best-effort). */
|
|
19196
|
-
groups: number().int()
|
|
19234
|
+
embeddings: number().int()
|
|
19197
19235
|
});
|
|
19198
19236
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19199
19237
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19363,6 +19401,47 @@ var RebuildStatusSchema = object({
|
|
|
19363
19401
|
/** Present when the pass ended by throwing. */
|
|
19364
19402
|
error: string().nullable()
|
|
19365
19403
|
});
|
|
19404
|
+
/**
|
|
19405
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19406
|
+
*
|
|
19407
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19408
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19409
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19410
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19411
|
+
*/
|
|
19412
|
+
var MediaReclaimStartResultSchema = object({
|
|
19413
|
+
started: boolean(),
|
|
19414
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19415
|
+
alreadyRunning: boolean()
|
|
19416
|
+
});
|
|
19417
|
+
var MediaReclaimInputSchema = object({
|
|
19418
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19419
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19420
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19421
|
+
restart: boolean().optional(),
|
|
19422
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19423
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19424
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19425
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19426
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19427
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19428
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19429
|
+
});
|
|
19430
|
+
var MediaReclaimStatusSchema = object({
|
|
19431
|
+
running: boolean(),
|
|
19432
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19433
|
+
totalExamined: number(),
|
|
19434
|
+
totalEligible: number(),
|
|
19435
|
+
totalReclaimed: number(),
|
|
19436
|
+
totalBytesReclaimed: number(),
|
|
19437
|
+
totalRefused: number(),
|
|
19438
|
+
/** Device+scope windows finished in this pass. */
|
|
19439
|
+
devicesDone: number(),
|
|
19440
|
+
complete: boolean().nullable(),
|
|
19441
|
+
startedAtMs: number().nullable(),
|
|
19442
|
+
finishedAtMs: number().nullable(),
|
|
19443
|
+
error: string().nullable()
|
|
19444
|
+
});
|
|
19366
19445
|
var ReplayFrameInputSchema = object({
|
|
19367
19446
|
timestamp: number(),
|
|
19368
19447
|
frame: PipelineRunResultBridge
|
|
@@ -19401,10 +19480,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19401
19480
|
* stationary registry). Default false: the timeline lists passages,
|
|
19402
19481
|
* not parking records (operator decision, 2026-08-15). */
|
|
19403
19482
|
includeStationary: boolean().optional()
|
|
19404
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
19405
|
-
deviceId: number(),
|
|
19406
|
-
groupId: string().min(1)
|
|
19407
|
-
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
19483
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19408
19484
|
kind: "mutation",
|
|
19409
19485
|
auth: "admin"
|
|
19410
19486
|
}), 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({
|
|
@@ -19504,6 +19580,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19504
19580
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19505
19581
|
kind: "query",
|
|
19506
19582
|
auth: "admin"
|
|
19583
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19584
|
+
kind: "mutation",
|
|
19585
|
+
auth: "admin"
|
|
19586
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19587
|
+
kind: "query",
|
|
19588
|
+
auth: "admin"
|
|
19507
19589
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19508
19590
|
kind: "query",
|
|
19509
19591
|
auth: "admin"
|
|
@@ -21578,7 +21660,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21578
21660
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21579
21661
|
kind: "mutation",
|
|
21580
21662
|
auth: "admin"
|
|
21581
|
-
})
|
|
21663
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21664
|
+
kind: "mutation",
|
|
21665
|
+
auth: "admin"
|
|
21666
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21667
|
+
kind: "mutation",
|
|
21668
|
+
auth: "admin"
|
|
21669
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21582
21670
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21583
21671
|
providerId: string().min(1),
|
|
21584
21672
|
displayName: string().min(1),
|
|
@@ -28759,6 +28847,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
28759
28847
|
minMoveGb: number().min(0).optional()
|
|
28760
28848
|
});
|
|
28761
28849
|
/**
|
|
28850
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
28851
|
+
*
|
|
28852
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
28853
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
28854
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
28855
|
+
*/
|
|
28856
|
+
var RecordingDevicePlacementSchema = object({
|
|
28857
|
+
deviceId: number().int(),
|
|
28858
|
+
profile: string(),
|
|
28859
|
+
locationId: string()
|
|
28860
|
+
});
|
|
28861
|
+
var RecordingDevicePinSchema = object({
|
|
28862
|
+
deviceId: number().int(),
|
|
28863
|
+
/** Recordings-class location this camera is pinned to. */
|
|
28864
|
+
locationId: string()
|
|
28865
|
+
});
|
|
28866
|
+
var RecordingPlacementViewSchema = object({
|
|
28867
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
28868
|
+
pins: array(RecordingDevicePinSchema),
|
|
28869
|
+
defaultLocations: record(string(), string())
|
|
28870
|
+
});
|
|
28871
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
28872
|
+
deviceId: number().int(),
|
|
28873
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
28874
|
+
locationId: string().nullable()
|
|
28875
|
+
});
|
|
28876
|
+
/**
|
|
28762
28877
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
28763
28878
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
28764
28879
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -28984,6 +29099,12 @@ method(object({
|
|
|
28984
29099
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
28985
29100
|
kind: "mutation",
|
|
28986
29101
|
auth: "admin"
|
|
29102
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
29103
|
+
kind: "query",
|
|
29104
|
+
auth: "admin"
|
|
29105
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
29106
|
+
kind: "mutation",
|
|
29107
|
+
auth: "admin"
|
|
28987
29108
|
});
|
|
28988
29109
|
/**
|
|
28989
29110
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -34457,6 +34578,12 @@ Object.freeze({
|
|
|
34457
34578
|
addonId: null,
|
|
34458
34579
|
access: "delete"
|
|
34459
34580
|
},
|
|
34581
|
+
"deviceManager.renameLocation": {
|
|
34582
|
+
capName: "device-manager",
|
|
34583
|
+
capScope: "system",
|
|
34584
|
+
addonId: null,
|
|
34585
|
+
access: "create"
|
|
34586
|
+
},
|
|
34460
34587
|
"deviceManager.runDeviceAction": {
|
|
34461
34588
|
capName: "device-manager",
|
|
34462
34589
|
capScope: "system",
|
|
@@ -36149,19 +36276,19 @@ Object.freeze({
|
|
|
36149
36276
|
addonId: null,
|
|
36150
36277
|
access: "view"
|
|
36151
36278
|
},
|
|
36152
|
-
"pipelineAnalytics.
|
|
36279
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
36153
36280
|
capName: "pipeline-analytics",
|
|
36154
36281
|
capScope: "device",
|
|
36155
36282
|
addonId: null,
|
|
36156
36283
|
access: "view"
|
|
36157
36284
|
},
|
|
36158
|
-
"pipelineAnalytics.
|
|
36285
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
36159
36286
|
capName: "pipeline-analytics",
|
|
36160
36287
|
capScope: "device",
|
|
36161
36288
|
addonId: null,
|
|
36162
36289
|
access: "view"
|
|
36163
36290
|
},
|
|
36164
|
-
"pipelineAnalytics.
|
|
36291
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
36165
36292
|
capName: "pipeline-analytics",
|
|
36166
36293
|
capScope: "device",
|
|
36167
36294
|
addonId: null,
|
|
@@ -36251,12 +36378,6 @@ Object.freeze({
|
|
|
36251
36378
|
addonId: null,
|
|
36252
36379
|
access: "view"
|
|
36253
36380
|
},
|
|
36254
|
-
"pipelineAnalytics.listGroups": {
|
|
36255
|
-
capName: "pipeline-analytics",
|
|
36256
|
-
capScope: "device",
|
|
36257
|
-
addonId: null,
|
|
36258
|
-
access: "view"
|
|
36259
|
-
},
|
|
36260
36381
|
"pipelineAnalytics.listOpsLog": {
|
|
36261
36382
|
capName: "pipeline-analytics",
|
|
36262
36383
|
capScope: "device",
|
|
@@ -36341,6 +36462,12 @@ Object.freeze({
|
|
|
36341
36462
|
addonId: null,
|
|
36342
36463
|
access: "create"
|
|
36343
36464
|
},
|
|
36465
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
36466
|
+
capName: "pipeline-analytics",
|
|
36467
|
+
capScope: "device",
|
|
36468
|
+
addonId: null,
|
|
36469
|
+
access: "create"
|
|
36470
|
+
},
|
|
36344
36471
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
36345
36472
|
capName: "pipeline-analytics",
|
|
36346
36473
|
capScope: "device",
|
|
@@ -37265,6 +37392,12 @@ Object.freeze({
|
|
|
37265
37392
|
addonId: null,
|
|
37266
37393
|
access: "view"
|
|
37267
37394
|
},
|
|
37395
|
+
"recording.getPlacement": {
|
|
37396
|
+
capName: "recording",
|
|
37397
|
+
capScope: "system",
|
|
37398
|
+
addonId: null,
|
|
37399
|
+
access: "view"
|
|
37400
|
+
},
|
|
37268
37401
|
"recording.getPlaybackManifest": {
|
|
37269
37402
|
capName: "recording",
|
|
37270
37403
|
capScope: "system",
|
|
@@ -37391,6 +37524,12 @@ Object.freeze({
|
|
|
37391
37524
|
addonId: null,
|
|
37392
37525
|
access: "create"
|
|
37393
37526
|
},
|
|
37527
|
+
"recording.setDevicePlacement": {
|
|
37528
|
+
capName: "recording",
|
|
37529
|
+
capScope: "system",
|
|
37530
|
+
addonId: null,
|
|
37531
|
+
access: "create"
|
|
37532
|
+
},
|
|
37394
37533
|
"recording.startStorageMigrationMove": {
|
|
37395
37534
|
capName: "recording",
|
|
37396
37535
|
capScope: "system",
|
|
@@ -37835,12 +37974,36 @@ Object.freeze({
|
|
|
37835
37974
|
addonId: null,
|
|
37836
37975
|
access: "create"
|
|
37837
37976
|
},
|
|
37977
|
+
"storageMigration.cleanupCancel": {
|
|
37978
|
+
capName: "storage-migration",
|
|
37979
|
+
capScope: "system",
|
|
37980
|
+
addonId: null,
|
|
37981
|
+
access: "create"
|
|
37982
|
+
},
|
|
37983
|
+
"storageMigration.cleanupStart": {
|
|
37984
|
+
capName: "storage-migration",
|
|
37985
|
+
capScope: "system",
|
|
37986
|
+
addonId: null,
|
|
37987
|
+
access: "create"
|
|
37988
|
+
},
|
|
37989
|
+
"storageMigration.cleanupStatus": {
|
|
37990
|
+
capName: "storage-migration",
|
|
37991
|
+
capScope: "system",
|
|
37992
|
+
addonId: null,
|
|
37993
|
+
access: "view"
|
|
37994
|
+
},
|
|
37838
37995
|
"storageMigration.drain": {
|
|
37839
37996
|
capName: "storage-migration",
|
|
37840
37997
|
capScope: "system",
|
|
37841
37998
|
addonId: null,
|
|
37842
37999
|
access: "create"
|
|
37843
38000
|
},
|
|
38001
|
+
"storageMigration.history": {
|
|
38002
|
+
capName: "storage-migration",
|
|
38003
|
+
capScope: "system",
|
|
38004
|
+
addonId: null,
|
|
38005
|
+
access: "view"
|
|
38006
|
+
},
|
|
37844
38007
|
"storageMigration.movers": {
|
|
37845
38008
|
capName: "storage-migration",
|
|
37846
38009
|
capScope: "system",
|
|
@@ -39837,11 +40000,6 @@ Object.freeze({
|
|
|
39837
40000
|
form: "single",
|
|
39838
40001
|
optional: true
|
|
39839
40002
|
}],
|
|
39840
|
-
"pipelineAnalytics.getGroup": [{
|
|
39841
|
-
name: "deviceId",
|
|
39842
|
-
form: "single",
|
|
39843
|
-
optional: false
|
|
39844
|
-
}],
|
|
39845
40003
|
"pipelineAnalytics.getKeyEvents": [{
|
|
39846
40004
|
name: "deviceId",
|
|
39847
40005
|
form: "single",
|
|
@@ -39907,11 +40065,6 @@ Object.freeze({
|
|
|
39907
40065
|
form: "single",
|
|
39908
40066
|
optional: false
|
|
39909
40067
|
}],
|
|
39910
|
-
"pipelineAnalytics.listGroups": [{
|
|
39911
|
-
name: "deviceIds",
|
|
39912
|
-
form: "array",
|
|
39913
|
-
optional: false
|
|
39914
|
-
}],
|
|
39915
40068
|
"pipelineAnalytics.listOpsLog": [{
|
|
39916
40069
|
name: "deviceId",
|
|
39917
40070
|
form: "single",
|
|
@@ -39957,6 +40110,11 @@ Object.freeze({
|
|
|
39957
40110
|
form: "single",
|
|
39958
40111
|
optional: true
|
|
39959
40112
|
}],
|
|
40113
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
40114
|
+
name: "deviceIds",
|
|
40115
|
+
form: "array",
|
|
40116
|
+
optional: true
|
|
40117
|
+
}],
|
|
39960
40118
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
39961
40119
|
name: "deviceId",
|
|
39962
40120
|
form: "single",
|
|
@@ -40322,6 +40480,11 @@ Object.freeze({
|
|
|
40322
40480
|
form: "single",
|
|
40323
40481
|
optional: false
|
|
40324
40482
|
}],
|
|
40483
|
+
"recording.setDevicePlacement": [{
|
|
40484
|
+
name: "deviceId",
|
|
40485
|
+
form: "single",
|
|
40486
|
+
optional: false
|
|
40487
|
+
}],
|
|
40325
40488
|
"recording.startStorageMigrationMove": [{
|
|
40326
40489
|
name: "deviceId",
|
|
40327
40490
|
form: "single",
|
package/dist/addon.mjs
CHANGED
|
@@ -8090,6 +8090,13 @@ var MediaRelocateModeSchema = _enum([
|
|
|
8090
8090
|
]);
|
|
8091
8091
|
var RelocateMediaInputSchema = object({
|
|
8092
8092
|
toLocationId: string(),
|
|
8093
|
+
/**
|
|
8094
|
+
* Restrict the pass to rows currently on this location. Omitted / `'*'` =
|
|
8095
|
+
* every row that is not already on `toLocationId` (the historical
|
|
8096
|
+
* behaviour). A named source is what a from→to migration needs: without it
|
|
8097
|
+
* "move events off disk 2" also emptied disk 1.
|
|
8098
|
+
*/
|
|
8099
|
+
fromLocationId: string().optional(),
|
|
8093
8100
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8094
8101
|
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8095
8102
|
mode: MediaRelocateModeSchema.optional()
|
|
@@ -8157,6 +8164,19 @@ var StorageMigrationDestinationsSchema = object({
|
|
|
8157
8164
|
galleryMedia: string().min(1).optional()
|
|
8158
8165
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8159
8166
|
/**
|
|
8167
|
+
* Optional named source per class. Omitted = the class's current default
|
|
8168
|
+
* (the historical behaviour). A named source that is NOT the default is a
|
|
8169
|
+
* drain of that disk: bytes move, the default stays, and the source is
|
|
8170
|
+
* disabled when the move finishes.
|
|
8171
|
+
*/
|
|
8172
|
+
var StorageMigrationSourcesSchema = object({
|
|
8173
|
+
recordings: string().min(1).optional(),
|
|
8174
|
+
recordingsLow: string().min(1).optional(),
|
|
8175
|
+
eventMedia: string().min(1).optional(),
|
|
8176
|
+
backups: string().min(1).optional(),
|
|
8177
|
+
galleryMedia: string().min(1).optional()
|
|
8178
|
+
}).optional();
|
|
8179
|
+
/**
|
|
8160
8180
|
* How a migration sequences the cutover against the byte move.
|
|
8161
8181
|
*
|
|
8162
8182
|
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
@@ -8178,6 +8198,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
|
8178
8198
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8179
8199
|
var StorageMigrationInputSchema = object({
|
|
8180
8200
|
destinations: StorageMigrationDestinationsSchema,
|
|
8201
|
+
/** Omitted = each class's current default. */
|
|
8202
|
+
sources: StorageMigrationSourcesSchema,
|
|
8181
8203
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8182
8204
|
/** Omitted = `blocking`, which stays the default. */
|
|
8183
8205
|
mode: StorageMigrationModeSchema.optional()
|
|
@@ -8257,6 +8279,13 @@ var StorageMigrationMoveSchema = object({
|
|
|
8257
8279
|
storageClass: StorageMigrationClassSchema,
|
|
8258
8280
|
fromLocationId: string(),
|
|
8259
8281
|
toLocationId: string(),
|
|
8282
|
+
/**
|
|
8283
|
+
* True when `from` was NOT the class default at plan time. The move still
|
|
8284
|
+
* copies bytes, but the default is left alone and the source is disabled
|
|
8285
|
+
* once the copy verifies. Absent on jobs planned before this field existed
|
|
8286
|
+
* — those jobs always repointed, which is `false`.
|
|
8287
|
+
*/
|
|
8288
|
+
freezeSource: boolean().optional(),
|
|
8260
8289
|
moverJobId: string().nullable(),
|
|
8261
8290
|
state: RelocateJobStateSchema.nullable(),
|
|
8262
8291
|
error: string().nullable(),
|
|
@@ -8270,6 +8299,7 @@ var StorageMigrationJobSchema = object({
|
|
|
8270
8299
|
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8271
8300
|
mode: StorageMigrationModeSchema,
|
|
8272
8301
|
destinations: StorageMigrationDestinationsSchema,
|
|
8302
|
+
sources: StorageMigrationSourcesSchema,
|
|
8273
8303
|
throttleMbps: number(),
|
|
8274
8304
|
moves: array(StorageMigrationMoveSchema),
|
|
8275
8305
|
pauseLeaseId: string().nullable(),
|
|
@@ -8295,6 +8325,7 @@ var StorageMigrationFindingSchema = object({
|
|
|
8295
8325
|
});
|
|
8296
8326
|
var StorageMigrationPlanSchema = object({
|
|
8297
8327
|
destinations: StorageMigrationDestinationsSchema,
|
|
8328
|
+
sources: StorageMigrationSourcesSchema,
|
|
8298
8329
|
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8299
8330
|
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8300
8331
|
* it. */
|
|
@@ -8302,7 +8333,8 @@ var StorageMigrationPlanSchema = object({
|
|
|
8302
8333
|
moves: array(object({
|
|
8303
8334
|
storageClass: StorageMigrationClassSchema,
|
|
8304
8335
|
fromLocationId: string(),
|
|
8305
|
-
toLocationId: string()
|
|
8336
|
+
toLocationId: string(),
|
|
8337
|
+
freezeSource: boolean().optional()
|
|
8306
8338
|
})),
|
|
8307
8339
|
findings: array(StorageMigrationFindingSchema)
|
|
8308
8340
|
});
|
|
@@ -8480,10 +8512,51 @@ var LedgerWalkReportSchema = object({
|
|
|
8480
8512
|
var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
|
|
8481
8513
|
var RelocatableMediaCountInputSchema = object({
|
|
8482
8514
|
toLocationId: string().min(1),
|
|
8515
|
+
/** Restrict the count to one source; omitted / `'*'` = every non-target row. */
|
|
8516
|
+
fromLocationId: string().optional(),
|
|
8483
8517
|
/** Omitted = `move`. */
|
|
8484
8518
|
mode: MediaRelocateModeSchema.optional()
|
|
8485
8519
|
});
|
|
8486
8520
|
/**
|
|
8521
|
+
* Operator cleanup of leftover analytics rows, optional debug media, and
|
|
8522
|
+
* ghost ledger entries on frozen footage locations.
|
|
8523
|
+
*
|
|
8524
|
+
* A pass is tens of minutes on a standing backlog. The hub method RETURNS
|
|
8525
|
+
* `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
|
|
8526
|
+
* is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
|
|
8527
|
+
* with no operator-visible status.
|
|
8528
|
+
*/
|
|
8529
|
+
var StorageCleanupPhaseSchema = _enum([
|
|
8530
|
+
"orphans",
|
|
8531
|
+
"debug-media",
|
|
8532
|
+
"ghost-ledger",
|
|
8533
|
+
"done",
|
|
8534
|
+
"failed",
|
|
8535
|
+
"cancelled"
|
|
8536
|
+
]);
|
|
8537
|
+
var StorageCleanupInputSchema = object({
|
|
8538
|
+
/** Also walk motion stills / track filmstrips. Off by default. */
|
|
8539
|
+
includeDebugMedia: boolean().optional() });
|
|
8540
|
+
var StorageCleanupJobSchema = object({
|
|
8541
|
+
jobId: string(),
|
|
8542
|
+
phase: StorageCleanupPhaseSchema,
|
|
8543
|
+
includeDebugMedia: boolean(),
|
|
8544
|
+
orphansReclaimed: number().int().nonnegative(),
|
|
8545
|
+
orphanBytesReclaimed: number().int().nonnegative(),
|
|
8546
|
+
debugMediaReclaimed: number().int().nonnegative(),
|
|
8547
|
+
debugMediaBytesReclaimed: number().int().nonnegative(),
|
|
8548
|
+
ghostsForgotten: number().int().nonnegative(),
|
|
8549
|
+
ghostBytesForgotten: number().int().nonnegative(),
|
|
8550
|
+
/** Short operator-facing line: current collection, pass, or location. */
|
|
8551
|
+
detail: string().nullable(),
|
|
8552
|
+
cancelRequested: boolean(),
|
|
8553
|
+
startedAt: number(),
|
|
8554
|
+
updatedAt: number(),
|
|
8555
|
+
finishedAt: number().nullable(),
|
|
8556
|
+
error: string().nullable()
|
|
8557
|
+
});
|
|
8558
|
+
var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
|
|
8559
|
+
/**
|
|
8487
8560
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
8488
8561
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
8489
8562
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -8511,11 +8584,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
|
|
|
8511
8584
|
* The default location for a type uses `id === <type>:default` by
|
|
8512
8585
|
* convention (the bare type ref like `'backups'` resolves to it).
|
|
8513
8586
|
*
|
|
8514
|
-
* `isSystem
|
|
8515
|
-
*
|
|
8516
|
-
*
|
|
8517
|
-
*
|
|
8518
|
-
* deleting it is rejected at the cap level.
|
|
8587
|
+
* `isSystem` is a legacy persisted flag. Seed still creates the initial
|
|
8588
|
+
* `<type>:default` locations; the flag is no longer a lock, a badge, or a
|
|
8589
|
+
* prune selector. New writes leave it false. Deletion is gated on uniqueness
|
|
8590
|
+
* / last-enabled, not on this bit.
|
|
8519
8591
|
*/
|
|
8520
8592
|
var StorageLocationSchema = object({
|
|
8521
8593
|
id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
|
|
@@ -13041,6 +13113,12 @@ method(object({
|
|
|
13041
13113
|
}), _void(), {
|
|
13042
13114
|
kind: "mutation",
|
|
13043
13115
|
auth: "admin"
|
|
13116
|
+
}), method(object({
|
|
13117
|
+
from: string(),
|
|
13118
|
+
to: string()
|
|
13119
|
+
}), object({ moved: number() }), {
|
|
13120
|
+
kind: "mutation",
|
|
13121
|
+
auth: "admin"
|
|
13044
13122
|
}), method(object({
|
|
13045
13123
|
deviceId: number(),
|
|
13046
13124
|
disabled: boolean()
|
|
@@ -15791,6 +15869,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
15791
15869
|
"device-offline",
|
|
15792
15870
|
"device-disabled",
|
|
15793
15871
|
"device-enabled",
|
|
15872
|
+
"device-battery-low",
|
|
15873
|
+
"device-battery-normal",
|
|
15794
15874
|
"stream-online",
|
|
15795
15875
|
"stream-offline",
|
|
15796
15876
|
"node-online",
|
|
@@ -19049,46 +19129,6 @@ var RecentTracksPageSchema = object({
|
|
|
19049
19129
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19050
19130
|
nextCursor: string().nullable()
|
|
19051
19131
|
});
|
|
19052
|
-
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
19053
|
-
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
19054
|
-
var AnalyticsGroupRecordSchema = object({
|
|
19055
|
-
id: string(),
|
|
19056
|
-
deviceId: number().int(),
|
|
19057
|
-
openedAt: number().int(),
|
|
19058
|
-
closedAt: number().int(),
|
|
19059
|
-
timestamp: number().int(),
|
|
19060
|
-
memberCount: number().int(),
|
|
19061
|
-
memberTrackIds: array(string()).readonly(),
|
|
19062
|
-
className: string(),
|
|
19063
|
-
classes: array(string()).readonly(),
|
|
19064
|
-
/** Relative event-media path, or null when the group has no picture yet. */
|
|
19065
|
-
mediaUrl: string().nullable(),
|
|
19066
|
-
singleton: boolean()
|
|
19067
|
-
});
|
|
19068
|
-
var AnalyticsGroupMemberSchema = object({
|
|
19069
|
-
trackId: string(),
|
|
19070
|
-
deviceId: number().int(),
|
|
19071
|
-
className: string(),
|
|
19072
|
-
firstSeen: number().int(),
|
|
19073
|
-
lastSeen: number().int(),
|
|
19074
|
-
mediaUrl: string().nullable()
|
|
19075
|
-
});
|
|
19076
|
-
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
19077
|
-
var ListGroupsQueryInput = object({
|
|
19078
|
-
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
19079
|
-
deviceIds: array(number()),
|
|
19080
|
-
/** Window lower bound on `closedAt` (inclusive). */
|
|
19081
|
-
since: number().optional(),
|
|
19082
|
-
/** Window upper bound on `openedAt` (inclusive). */
|
|
19083
|
-
until: number().optional(),
|
|
19084
|
-
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
19085
|
-
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
19086
|
-
cursor: string().optional()
|
|
19087
|
-
});
|
|
19088
|
-
var ListGroupsPageSchema = object({
|
|
19089
|
-
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
19090
|
-
nextCursor: string().nullable()
|
|
19091
|
-
});
|
|
19092
19132
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19093
19133
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19094
19134
|
var KeyEventQueryInput = object({
|
|
@@ -19192,9 +19232,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19192
19232
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19193
19233
|
plates: number().int(),
|
|
19194
19234
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
19195
|
-
embeddings: number().int()
|
|
19196
|
-
/** Group membership + group rows removed with their last member (best-effort). */
|
|
19197
|
-
groups: number().int()
|
|
19235
|
+
embeddings: number().int()
|
|
19198
19236
|
});
|
|
19199
19237
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19200
19238
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19364,6 +19402,47 @@ var RebuildStatusSchema = object({
|
|
|
19364
19402
|
/** Present when the pass ended by throwing. */
|
|
19365
19403
|
error: string().nullable()
|
|
19366
19404
|
});
|
|
19405
|
+
/**
|
|
19406
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19407
|
+
*
|
|
19408
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19409
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19410
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19411
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19412
|
+
*/
|
|
19413
|
+
var MediaReclaimStartResultSchema = object({
|
|
19414
|
+
started: boolean(),
|
|
19415
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19416
|
+
alreadyRunning: boolean()
|
|
19417
|
+
});
|
|
19418
|
+
var MediaReclaimInputSchema = object({
|
|
19419
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19420
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19421
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19422
|
+
restart: boolean().optional(),
|
|
19423
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19424
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19425
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19426
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19427
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19428
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19429
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19430
|
+
});
|
|
19431
|
+
var MediaReclaimStatusSchema = object({
|
|
19432
|
+
running: boolean(),
|
|
19433
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19434
|
+
totalExamined: number(),
|
|
19435
|
+
totalEligible: number(),
|
|
19436
|
+
totalReclaimed: number(),
|
|
19437
|
+
totalBytesReclaimed: number(),
|
|
19438
|
+
totalRefused: number(),
|
|
19439
|
+
/** Device+scope windows finished in this pass. */
|
|
19440
|
+
devicesDone: number(),
|
|
19441
|
+
complete: boolean().nullable(),
|
|
19442
|
+
startedAtMs: number().nullable(),
|
|
19443
|
+
finishedAtMs: number().nullable(),
|
|
19444
|
+
error: string().nullable()
|
|
19445
|
+
});
|
|
19367
19446
|
var ReplayFrameInputSchema = object({
|
|
19368
19447
|
timestamp: number(),
|
|
19369
19448
|
frame: PipelineRunResultBridge
|
|
@@ -19402,10 +19481,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19402
19481
|
* stationary registry). Default false: the timeline lists passages,
|
|
19403
19482
|
* not parking records (operator decision, 2026-08-15). */
|
|
19404
19483
|
includeStationary: boolean().optional()
|
|
19405
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
19406
|
-
deviceId: number(),
|
|
19407
|
-
groupId: string().min(1)
|
|
19408
|
-
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
19484
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19409
19485
|
kind: "mutation",
|
|
19410
19486
|
auth: "admin"
|
|
19411
19487
|
}), 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({
|
|
@@ -19505,6 +19581,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19505
19581
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19506
19582
|
kind: "query",
|
|
19507
19583
|
auth: "admin"
|
|
19584
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19585
|
+
kind: "mutation",
|
|
19586
|
+
auth: "admin"
|
|
19587
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19588
|
+
kind: "query",
|
|
19589
|
+
auth: "admin"
|
|
19508
19590
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19509
19591
|
kind: "query",
|
|
19510
19592
|
auth: "admin"
|
|
@@ -21579,7 +21661,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21579
21661
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21580
21662
|
kind: "mutation",
|
|
21581
21663
|
auth: "admin"
|
|
21582
|
-
})
|
|
21664
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21665
|
+
kind: "mutation",
|
|
21666
|
+
auth: "admin"
|
|
21667
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21668
|
+
kind: "mutation",
|
|
21669
|
+
auth: "admin"
|
|
21670
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21583
21671
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21584
21672
|
providerId: string().min(1),
|
|
21585
21673
|
displayName: string().min(1),
|
|
@@ -28760,6 +28848,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
28760
28848
|
minMoveGb: number().min(0).optional()
|
|
28761
28849
|
});
|
|
28762
28850
|
/**
|
|
28851
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
28852
|
+
*
|
|
28853
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
28854
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
28855
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
28856
|
+
*/
|
|
28857
|
+
var RecordingDevicePlacementSchema = object({
|
|
28858
|
+
deviceId: number().int(),
|
|
28859
|
+
profile: string(),
|
|
28860
|
+
locationId: string()
|
|
28861
|
+
});
|
|
28862
|
+
var RecordingDevicePinSchema = object({
|
|
28863
|
+
deviceId: number().int(),
|
|
28864
|
+
/** Recordings-class location this camera is pinned to. */
|
|
28865
|
+
locationId: string()
|
|
28866
|
+
});
|
|
28867
|
+
var RecordingPlacementViewSchema = object({
|
|
28868
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
28869
|
+
pins: array(RecordingDevicePinSchema),
|
|
28870
|
+
defaultLocations: record(string(), string())
|
|
28871
|
+
});
|
|
28872
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
28873
|
+
deviceId: number().int(),
|
|
28874
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
28875
|
+
locationId: string().nullable()
|
|
28876
|
+
});
|
|
28877
|
+
/**
|
|
28763
28878
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
28764
28879
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
28765
28880
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -28985,6 +29100,12 @@ method(object({
|
|
|
28985
29100
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
28986
29101
|
kind: "mutation",
|
|
28987
29102
|
auth: "admin"
|
|
29103
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
29104
|
+
kind: "query",
|
|
29105
|
+
auth: "admin"
|
|
29106
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
29107
|
+
kind: "mutation",
|
|
29108
|
+
auth: "admin"
|
|
28988
29109
|
});
|
|
28989
29110
|
/**
|
|
28990
29111
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -34458,6 +34579,12 @@ Object.freeze({
|
|
|
34458
34579
|
addonId: null,
|
|
34459
34580
|
access: "delete"
|
|
34460
34581
|
},
|
|
34582
|
+
"deviceManager.renameLocation": {
|
|
34583
|
+
capName: "device-manager",
|
|
34584
|
+
capScope: "system",
|
|
34585
|
+
addonId: null,
|
|
34586
|
+
access: "create"
|
|
34587
|
+
},
|
|
34461
34588
|
"deviceManager.runDeviceAction": {
|
|
34462
34589
|
capName: "device-manager",
|
|
34463
34590
|
capScope: "system",
|
|
@@ -36150,19 +36277,19 @@ Object.freeze({
|
|
|
36150
36277
|
addonId: null,
|
|
36151
36278
|
access: "view"
|
|
36152
36279
|
},
|
|
36153
|
-
"pipelineAnalytics.
|
|
36280
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
36154
36281
|
capName: "pipeline-analytics",
|
|
36155
36282
|
capScope: "device",
|
|
36156
36283
|
addonId: null,
|
|
36157
36284
|
access: "view"
|
|
36158
36285
|
},
|
|
36159
|
-
"pipelineAnalytics.
|
|
36286
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
36160
36287
|
capName: "pipeline-analytics",
|
|
36161
36288
|
capScope: "device",
|
|
36162
36289
|
addonId: null,
|
|
36163
36290
|
access: "view"
|
|
36164
36291
|
},
|
|
36165
|
-
"pipelineAnalytics.
|
|
36292
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
36166
36293
|
capName: "pipeline-analytics",
|
|
36167
36294
|
capScope: "device",
|
|
36168
36295
|
addonId: null,
|
|
@@ -36252,12 +36379,6 @@ Object.freeze({
|
|
|
36252
36379
|
addonId: null,
|
|
36253
36380
|
access: "view"
|
|
36254
36381
|
},
|
|
36255
|
-
"pipelineAnalytics.listGroups": {
|
|
36256
|
-
capName: "pipeline-analytics",
|
|
36257
|
-
capScope: "device",
|
|
36258
|
-
addonId: null,
|
|
36259
|
-
access: "view"
|
|
36260
|
-
},
|
|
36261
36382
|
"pipelineAnalytics.listOpsLog": {
|
|
36262
36383
|
capName: "pipeline-analytics",
|
|
36263
36384
|
capScope: "device",
|
|
@@ -36342,6 +36463,12 @@ Object.freeze({
|
|
|
36342
36463
|
addonId: null,
|
|
36343
36464
|
access: "create"
|
|
36344
36465
|
},
|
|
36466
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
36467
|
+
capName: "pipeline-analytics",
|
|
36468
|
+
capScope: "device",
|
|
36469
|
+
addonId: null,
|
|
36470
|
+
access: "create"
|
|
36471
|
+
},
|
|
36345
36472
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
36346
36473
|
capName: "pipeline-analytics",
|
|
36347
36474
|
capScope: "device",
|
|
@@ -37266,6 +37393,12 @@ Object.freeze({
|
|
|
37266
37393
|
addonId: null,
|
|
37267
37394
|
access: "view"
|
|
37268
37395
|
},
|
|
37396
|
+
"recording.getPlacement": {
|
|
37397
|
+
capName: "recording",
|
|
37398
|
+
capScope: "system",
|
|
37399
|
+
addonId: null,
|
|
37400
|
+
access: "view"
|
|
37401
|
+
},
|
|
37269
37402
|
"recording.getPlaybackManifest": {
|
|
37270
37403
|
capName: "recording",
|
|
37271
37404
|
capScope: "system",
|
|
@@ -37392,6 +37525,12 @@ Object.freeze({
|
|
|
37392
37525
|
addonId: null,
|
|
37393
37526
|
access: "create"
|
|
37394
37527
|
},
|
|
37528
|
+
"recording.setDevicePlacement": {
|
|
37529
|
+
capName: "recording",
|
|
37530
|
+
capScope: "system",
|
|
37531
|
+
addonId: null,
|
|
37532
|
+
access: "create"
|
|
37533
|
+
},
|
|
37395
37534
|
"recording.startStorageMigrationMove": {
|
|
37396
37535
|
capName: "recording",
|
|
37397
37536
|
capScope: "system",
|
|
@@ -37836,12 +37975,36 @@ Object.freeze({
|
|
|
37836
37975
|
addonId: null,
|
|
37837
37976
|
access: "create"
|
|
37838
37977
|
},
|
|
37978
|
+
"storageMigration.cleanupCancel": {
|
|
37979
|
+
capName: "storage-migration",
|
|
37980
|
+
capScope: "system",
|
|
37981
|
+
addonId: null,
|
|
37982
|
+
access: "create"
|
|
37983
|
+
},
|
|
37984
|
+
"storageMigration.cleanupStart": {
|
|
37985
|
+
capName: "storage-migration",
|
|
37986
|
+
capScope: "system",
|
|
37987
|
+
addonId: null,
|
|
37988
|
+
access: "create"
|
|
37989
|
+
},
|
|
37990
|
+
"storageMigration.cleanupStatus": {
|
|
37991
|
+
capName: "storage-migration",
|
|
37992
|
+
capScope: "system",
|
|
37993
|
+
addonId: null,
|
|
37994
|
+
access: "view"
|
|
37995
|
+
},
|
|
37839
37996
|
"storageMigration.drain": {
|
|
37840
37997
|
capName: "storage-migration",
|
|
37841
37998
|
capScope: "system",
|
|
37842
37999
|
addonId: null,
|
|
37843
38000
|
access: "create"
|
|
37844
38001
|
},
|
|
38002
|
+
"storageMigration.history": {
|
|
38003
|
+
capName: "storage-migration",
|
|
38004
|
+
capScope: "system",
|
|
38005
|
+
addonId: null,
|
|
38006
|
+
access: "view"
|
|
38007
|
+
},
|
|
37845
38008
|
"storageMigration.movers": {
|
|
37846
38009
|
capName: "storage-migration",
|
|
37847
38010
|
capScope: "system",
|
|
@@ -39838,11 +40001,6 @@ Object.freeze({
|
|
|
39838
40001
|
form: "single",
|
|
39839
40002
|
optional: true
|
|
39840
40003
|
}],
|
|
39841
|
-
"pipelineAnalytics.getGroup": [{
|
|
39842
|
-
name: "deviceId",
|
|
39843
|
-
form: "single",
|
|
39844
|
-
optional: false
|
|
39845
|
-
}],
|
|
39846
40004
|
"pipelineAnalytics.getKeyEvents": [{
|
|
39847
40005
|
name: "deviceId",
|
|
39848
40006
|
form: "single",
|
|
@@ -39908,11 +40066,6 @@ Object.freeze({
|
|
|
39908
40066
|
form: "single",
|
|
39909
40067
|
optional: false
|
|
39910
40068
|
}],
|
|
39911
|
-
"pipelineAnalytics.listGroups": [{
|
|
39912
|
-
name: "deviceIds",
|
|
39913
|
-
form: "array",
|
|
39914
|
-
optional: false
|
|
39915
|
-
}],
|
|
39916
40069
|
"pipelineAnalytics.listOpsLog": [{
|
|
39917
40070
|
name: "deviceId",
|
|
39918
40071
|
form: "single",
|
|
@@ -39958,6 +40111,11 @@ Object.freeze({
|
|
|
39958
40111
|
form: "single",
|
|
39959
40112
|
optional: true
|
|
39960
40113
|
}],
|
|
40114
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
40115
|
+
name: "deviceIds",
|
|
40116
|
+
form: "array",
|
|
40117
|
+
optional: true
|
|
40118
|
+
}],
|
|
39961
40119
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
39962
40120
|
name: "deviceId",
|
|
39963
40121
|
form: "single",
|
|
@@ -40323,6 +40481,11 @@ Object.freeze({
|
|
|
40323
40481
|
form: "single",
|
|
40324
40482
|
optional: false
|
|
40325
40483
|
}],
|
|
40484
|
+
"recording.setDevicePlacement": [{
|
|
40485
|
+
name: "deviceId",
|
|
40486
|
+
form: "single",
|
|
40487
|
+
optional: false
|
|
40488
|
+
}],
|
|
40326
40489
|
"recording.startStorageMigrationMove": [{
|
|
40327
40490
|
name: "deviceId",
|
|
40328
40491
|
form: "single",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-provider-amcrest",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.52",
|
|
4
4
|
"description": "Amcrest/Dahua camera device provider addon for CamStack — Dahua CGI over HTTP(S) with digest auth (snapshot, RTSP catalog, PTZ, image/day-night config)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|