@camstack/addon-provider-hikvision 1.2.57 → 1.2.59
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
|
@@ -8091,6 +8091,13 @@ var MediaRelocateModeSchema = _enum([
|
|
|
8091
8091
|
]);
|
|
8092
8092
|
var RelocateMediaInputSchema = object({
|
|
8093
8093
|
toLocationId: string(),
|
|
8094
|
+
/**
|
|
8095
|
+
* Restrict the pass to rows currently on this location. Omitted / `'*'` =
|
|
8096
|
+
* every row that is not already on `toLocationId` (the historical
|
|
8097
|
+
* behaviour). A named source is what a from→to migration needs: without it
|
|
8098
|
+
* "move events off disk 2" also emptied disk 1.
|
|
8099
|
+
*/
|
|
8100
|
+
fromLocationId: string().optional(),
|
|
8094
8101
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8095
8102
|
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8096
8103
|
mode: MediaRelocateModeSchema.optional()
|
|
@@ -8158,6 +8165,19 @@ var StorageMigrationDestinationsSchema = object({
|
|
|
8158
8165
|
galleryMedia: string().min(1).optional()
|
|
8159
8166
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8160
8167
|
/**
|
|
8168
|
+
* Optional named source per class. Omitted = the class's current default
|
|
8169
|
+
* (the historical behaviour). A named source that is NOT the default is a
|
|
8170
|
+
* drain of that disk: bytes move, the default stays, and the source is
|
|
8171
|
+
* disabled when the move finishes.
|
|
8172
|
+
*/
|
|
8173
|
+
var StorageMigrationSourcesSchema = object({
|
|
8174
|
+
recordings: string().min(1).optional(),
|
|
8175
|
+
recordingsLow: string().min(1).optional(),
|
|
8176
|
+
eventMedia: string().min(1).optional(),
|
|
8177
|
+
backups: string().min(1).optional(),
|
|
8178
|
+
galleryMedia: string().min(1).optional()
|
|
8179
|
+
}).optional();
|
|
8180
|
+
/**
|
|
8161
8181
|
* How a migration sequences the cutover against the byte move.
|
|
8162
8182
|
*
|
|
8163
8183
|
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
@@ -8179,6 +8199,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
|
8179
8199
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8180
8200
|
var StorageMigrationInputSchema = object({
|
|
8181
8201
|
destinations: StorageMigrationDestinationsSchema,
|
|
8202
|
+
/** Omitted = each class's current default. */
|
|
8203
|
+
sources: StorageMigrationSourcesSchema,
|
|
8182
8204
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8183
8205
|
/** Omitted = `blocking`, which stays the default. */
|
|
8184
8206
|
mode: StorageMigrationModeSchema.optional()
|
|
@@ -8258,6 +8280,13 @@ var StorageMigrationMoveSchema = object({
|
|
|
8258
8280
|
storageClass: StorageMigrationClassSchema,
|
|
8259
8281
|
fromLocationId: string(),
|
|
8260
8282
|
toLocationId: string(),
|
|
8283
|
+
/**
|
|
8284
|
+
* True when `from` was NOT the class default at plan time. The move still
|
|
8285
|
+
* copies bytes, but the default is left alone and the source is disabled
|
|
8286
|
+
* once the copy verifies. Absent on jobs planned before this field existed
|
|
8287
|
+
* — those jobs always repointed, which is `false`.
|
|
8288
|
+
*/
|
|
8289
|
+
freezeSource: boolean().optional(),
|
|
8261
8290
|
moverJobId: string().nullable(),
|
|
8262
8291
|
state: RelocateJobStateSchema.nullable(),
|
|
8263
8292
|
error: string().nullable(),
|
|
@@ -8271,6 +8300,7 @@ var StorageMigrationJobSchema = object({
|
|
|
8271
8300
|
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8272
8301
|
mode: StorageMigrationModeSchema,
|
|
8273
8302
|
destinations: StorageMigrationDestinationsSchema,
|
|
8303
|
+
sources: StorageMigrationSourcesSchema,
|
|
8274
8304
|
throttleMbps: number(),
|
|
8275
8305
|
moves: array(StorageMigrationMoveSchema),
|
|
8276
8306
|
pauseLeaseId: string().nullable(),
|
|
@@ -8296,6 +8326,7 @@ var StorageMigrationFindingSchema = object({
|
|
|
8296
8326
|
});
|
|
8297
8327
|
var StorageMigrationPlanSchema = object({
|
|
8298
8328
|
destinations: StorageMigrationDestinationsSchema,
|
|
8329
|
+
sources: StorageMigrationSourcesSchema,
|
|
8299
8330
|
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8300
8331
|
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8301
8332
|
* it. */
|
|
@@ -8303,7 +8334,8 @@ var StorageMigrationPlanSchema = object({
|
|
|
8303
8334
|
moves: array(object({
|
|
8304
8335
|
storageClass: StorageMigrationClassSchema,
|
|
8305
8336
|
fromLocationId: string(),
|
|
8306
|
-
toLocationId: string()
|
|
8337
|
+
toLocationId: string(),
|
|
8338
|
+
freezeSource: boolean().optional()
|
|
8307
8339
|
})),
|
|
8308
8340
|
findings: array(StorageMigrationFindingSchema)
|
|
8309
8341
|
});
|
|
@@ -8481,10 +8513,51 @@ var LedgerWalkReportSchema = object({
|
|
|
8481
8513
|
var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
|
|
8482
8514
|
var RelocatableMediaCountInputSchema = object({
|
|
8483
8515
|
toLocationId: string().min(1),
|
|
8516
|
+
/** Restrict the count to one source; omitted / `'*'` = every non-target row. */
|
|
8517
|
+
fromLocationId: string().optional(),
|
|
8484
8518
|
/** Omitted = `move`. */
|
|
8485
8519
|
mode: MediaRelocateModeSchema.optional()
|
|
8486
8520
|
});
|
|
8487
8521
|
/**
|
|
8522
|
+
* Operator cleanup of leftover analytics rows, optional debug media, and
|
|
8523
|
+
* ghost ledger entries on frozen footage locations.
|
|
8524
|
+
*
|
|
8525
|
+
* A pass is tens of minutes on a standing backlog. The hub method RETURNS
|
|
8526
|
+
* `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
|
|
8527
|
+
* is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
|
|
8528
|
+
* with no operator-visible status.
|
|
8529
|
+
*/
|
|
8530
|
+
var StorageCleanupPhaseSchema = _enum([
|
|
8531
|
+
"orphans",
|
|
8532
|
+
"debug-media",
|
|
8533
|
+
"ghost-ledger",
|
|
8534
|
+
"done",
|
|
8535
|
+
"failed",
|
|
8536
|
+
"cancelled"
|
|
8537
|
+
]);
|
|
8538
|
+
var StorageCleanupInputSchema = object({
|
|
8539
|
+
/** Also walk motion stills / track filmstrips. Off by default. */
|
|
8540
|
+
includeDebugMedia: boolean().optional() });
|
|
8541
|
+
var StorageCleanupJobSchema = object({
|
|
8542
|
+
jobId: string(),
|
|
8543
|
+
phase: StorageCleanupPhaseSchema,
|
|
8544
|
+
includeDebugMedia: boolean(),
|
|
8545
|
+
orphansReclaimed: number().int().nonnegative(),
|
|
8546
|
+
orphanBytesReclaimed: number().int().nonnegative(),
|
|
8547
|
+
debugMediaReclaimed: number().int().nonnegative(),
|
|
8548
|
+
debugMediaBytesReclaimed: number().int().nonnegative(),
|
|
8549
|
+
ghostsForgotten: number().int().nonnegative(),
|
|
8550
|
+
ghostBytesForgotten: number().int().nonnegative(),
|
|
8551
|
+
/** Short operator-facing line: current collection, pass, or location. */
|
|
8552
|
+
detail: string().nullable(),
|
|
8553
|
+
cancelRequested: boolean(),
|
|
8554
|
+
startedAt: number(),
|
|
8555
|
+
updatedAt: number(),
|
|
8556
|
+
finishedAt: number().nullable(),
|
|
8557
|
+
error: string().nullable()
|
|
8558
|
+
});
|
|
8559
|
+
var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
|
|
8560
|
+
/**
|
|
8488
8561
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
8489
8562
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
8490
8563
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -8512,11 +8585,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
|
|
|
8512
8585
|
* The default location for a type uses `id === <type>:default` by
|
|
8513
8586
|
* convention (the bare type ref like `'backups'` resolves to it).
|
|
8514
8587
|
*
|
|
8515
|
-
* `isSystem
|
|
8516
|
-
*
|
|
8517
|
-
*
|
|
8518
|
-
*
|
|
8519
|
-
* deleting it is rejected at the cap level.
|
|
8588
|
+
* `isSystem` is a legacy persisted flag. Seed still creates the initial
|
|
8589
|
+
* `<type>:default` locations; the flag is no longer a lock, a badge, or a
|
|
8590
|
+
* prune selector. New writes leave it false. Deletion is gated on uniqueness
|
|
8591
|
+
* / last-enabled, not on this bit.
|
|
8520
8592
|
*/
|
|
8521
8593
|
var StorageLocationSchema = object({
|
|
8522
8594
|
id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
|
|
@@ -13335,6 +13407,12 @@ method(object({
|
|
|
13335
13407
|
}), _void(), {
|
|
13336
13408
|
kind: "mutation",
|
|
13337
13409
|
auth: "admin"
|
|
13410
|
+
}), method(object({
|
|
13411
|
+
from: string(),
|
|
13412
|
+
to: string()
|
|
13413
|
+
}), object({ moved: number() }), {
|
|
13414
|
+
kind: "mutation",
|
|
13415
|
+
auth: "admin"
|
|
13338
13416
|
}), method(object({
|
|
13339
13417
|
deviceId: number(),
|
|
13340
13418
|
disabled: boolean()
|
|
@@ -16104,6 +16182,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
16104
16182
|
"device-offline",
|
|
16105
16183
|
"device-disabled",
|
|
16106
16184
|
"device-enabled",
|
|
16185
|
+
"device-battery-low",
|
|
16186
|
+
"device-battery-normal",
|
|
16107
16187
|
"stream-online",
|
|
16108
16188
|
"stream-offline",
|
|
16109
16189
|
"node-online",
|
|
@@ -19362,46 +19442,6 @@ var RecentTracksPageSchema = object({
|
|
|
19362
19442
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19363
19443
|
nextCursor: string().nullable()
|
|
19364
19444
|
});
|
|
19365
|
-
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
19366
|
-
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
19367
|
-
var AnalyticsGroupRecordSchema = object({
|
|
19368
|
-
id: string(),
|
|
19369
|
-
deviceId: number().int(),
|
|
19370
|
-
openedAt: number().int(),
|
|
19371
|
-
closedAt: number().int(),
|
|
19372
|
-
timestamp: number().int(),
|
|
19373
|
-
memberCount: number().int(),
|
|
19374
|
-
memberTrackIds: array(string()).readonly(),
|
|
19375
|
-
className: string(),
|
|
19376
|
-
classes: array(string()).readonly(),
|
|
19377
|
-
/** Relative event-media path, or null when the group has no picture yet. */
|
|
19378
|
-
mediaUrl: string().nullable(),
|
|
19379
|
-
singleton: boolean()
|
|
19380
|
-
});
|
|
19381
|
-
var AnalyticsGroupMemberSchema = object({
|
|
19382
|
-
trackId: string(),
|
|
19383
|
-
deviceId: number().int(),
|
|
19384
|
-
className: string(),
|
|
19385
|
-
firstSeen: number().int(),
|
|
19386
|
-
lastSeen: number().int(),
|
|
19387
|
-
mediaUrl: string().nullable()
|
|
19388
|
-
});
|
|
19389
|
-
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
19390
|
-
var ListGroupsQueryInput = object({
|
|
19391
|
-
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
19392
|
-
deviceIds: array(number()),
|
|
19393
|
-
/** Window lower bound on `closedAt` (inclusive). */
|
|
19394
|
-
since: number().optional(),
|
|
19395
|
-
/** Window upper bound on `openedAt` (inclusive). */
|
|
19396
|
-
until: number().optional(),
|
|
19397
|
-
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
19398
|
-
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
19399
|
-
cursor: string().optional()
|
|
19400
|
-
});
|
|
19401
|
-
var ListGroupsPageSchema = object({
|
|
19402
|
-
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
19403
|
-
nextCursor: string().nullable()
|
|
19404
|
-
});
|
|
19405
19445
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19406
19446
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19407
19447
|
var KeyEventQueryInput = object({
|
|
@@ -19505,9 +19545,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19505
19545
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19506
19546
|
plates: number().int(),
|
|
19507
19547
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
19508
|
-
embeddings: number().int()
|
|
19509
|
-
/** Group membership + group rows removed with their last member (best-effort). */
|
|
19510
|
-
groups: number().int()
|
|
19548
|
+
embeddings: number().int()
|
|
19511
19549
|
});
|
|
19512
19550
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19513
19551
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19677,6 +19715,47 @@ var RebuildStatusSchema = object({
|
|
|
19677
19715
|
/** Present when the pass ended by throwing. */
|
|
19678
19716
|
error: string().nullable()
|
|
19679
19717
|
});
|
|
19718
|
+
/**
|
|
19719
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19720
|
+
*
|
|
19721
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19722
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19723
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19724
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19725
|
+
*/
|
|
19726
|
+
var MediaReclaimStartResultSchema = object({
|
|
19727
|
+
started: boolean(),
|
|
19728
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19729
|
+
alreadyRunning: boolean()
|
|
19730
|
+
});
|
|
19731
|
+
var MediaReclaimInputSchema = object({
|
|
19732
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19733
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19734
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19735
|
+
restart: boolean().optional(),
|
|
19736
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19737
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19738
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19739
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19740
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19741
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19742
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19743
|
+
});
|
|
19744
|
+
var MediaReclaimStatusSchema = object({
|
|
19745
|
+
running: boolean(),
|
|
19746
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19747
|
+
totalExamined: number(),
|
|
19748
|
+
totalEligible: number(),
|
|
19749
|
+
totalReclaimed: number(),
|
|
19750
|
+
totalBytesReclaimed: number(),
|
|
19751
|
+
totalRefused: number(),
|
|
19752
|
+
/** Device+scope windows finished in this pass. */
|
|
19753
|
+
devicesDone: number(),
|
|
19754
|
+
complete: boolean().nullable(),
|
|
19755
|
+
startedAtMs: number().nullable(),
|
|
19756
|
+
finishedAtMs: number().nullable(),
|
|
19757
|
+
error: string().nullable()
|
|
19758
|
+
});
|
|
19680
19759
|
var ReplayFrameInputSchema = object({
|
|
19681
19760
|
timestamp: number(),
|
|
19682
19761
|
frame: PipelineRunResultBridge
|
|
@@ -19715,10 +19794,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19715
19794
|
* stationary registry). Default false: the timeline lists passages,
|
|
19716
19795
|
* not parking records (operator decision, 2026-08-15). */
|
|
19717
19796
|
includeStationary: boolean().optional()
|
|
19718
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
19719
|
-
deviceId: number(),
|
|
19720
|
-
groupId: string().min(1)
|
|
19721
|
-
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
19797
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19722
19798
|
kind: "mutation",
|
|
19723
19799
|
auth: "admin"
|
|
19724
19800
|
}), 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({
|
|
@@ -19818,6 +19894,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19818
19894
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19819
19895
|
kind: "query",
|
|
19820
19896
|
auth: "admin"
|
|
19897
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19898
|
+
kind: "mutation",
|
|
19899
|
+
auth: "admin"
|
|
19900
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19901
|
+
kind: "query",
|
|
19902
|
+
auth: "admin"
|
|
19821
19903
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19822
19904
|
kind: "query",
|
|
19823
19905
|
auth: "admin"
|
|
@@ -21892,7 +21974,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21892
21974
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21893
21975
|
kind: "mutation",
|
|
21894
21976
|
auth: "admin"
|
|
21895
|
-
})
|
|
21977
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21978
|
+
kind: "mutation",
|
|
21979
|
+
auth: "admin"
|
|
21980
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21981
|
+
kind: "mutation",
|
|
21982
|
+
auth: "admin"
|
|
21983
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21896
21984
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21897
21985
|
providerId: string().min(1),
|
|
21898
21986
|
displayName: string().min(1),
|
|
@@ -29118,6 +29206,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
29118
29206
|
minMoveGb: number().min(0).optional()
|
|
29119
29207
|
});
|
|
29120
29208
|
/**
|
|
29209
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
29210
|
+
*
|
|
29211
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
29212
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
29213
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
29214
|
+
*/
|
|
29215
|
+
var RecordingDevicePlacementSchema = object({
|
|
29216
|
+
deviceId: number().int(),
|
|
29217
|
+
profile: string(),
|
|
29218
|
+
locationId: string()
|
|
29219
|
+
});
|
|
29220
|
+
var RecordingDevicePinSchema = object({
|
|
29221
|
+
deviceId: number().int(),
|
|
29222
|
+
/** Recordings-class location this camera is pinned to. */
|
|
29223
|
+
locationId: string()
|
|
29224
|
+
});
|
|
29225
|
+
var RecordingPlacementViewSchema = object({
|
|
29226
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
29227
|
+
pins: array(RecordingDevicePinSchema),
|
|
29228
|
+
defaultLocations: record(string(), string())
|
|
29229
|
+
});
|
|
29230
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
29231
|
+
deviceId: number().int(),
|
|
29232
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
29233
|
+
locationId: string().nullable()
|
|
29234
|
+
});
|
|
29235
|
+
/**
|
|
29121
29236
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
29122
29237
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
29123
29238
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -29343,6 +29458,12 @@ method(object({
|
|
|
29343
29458
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
29344
29459
|
kind: "mutation",
|
|
29345
29460
|
auth: "admin"
|
|
29461
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
29462
|
+
kind: "query",
|
|
29463
|
+
auth: "admin"
|
|
29464
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
29465
|
+
kind: "mutation",
|
|
29466
|
+
auth: "admin"
|
|
29346
29467
|
});
|
|
29347
29468
|
/**
|
|
29348
29469
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -34843,6 +34964,12 @@ Object.freeze({
|
|
|
34843
34964
|
addonId: null,
|
|
34844
34965
|
access: "delete"
|
|
34845
34966
|
},
|
|
34967
|
+
"deviceManager.renameLocation": {
|
|
34968
|
+
capName: "device-manager",
|
|
34969
|
+
capScope: "system",
|
|
34970
|
+
addonId: null,
|
|
34971
|
+
access: "create"
|
|
34972
|
+
},
|
|
34846
34973
|
"deviceManager.runDeviceAction": {
|
|
34847
34974
|
capName: "device-manager",
|
|
34848
34975
|
capScope: "system",
|
|
@@ -36535,19 +36662,19 @@ Object.freeze({
|
|
|
36535
36662
|
addonId: null,
|
|
36536
36663
|
access: "view"
|
|
36537
36664
|
},
|
|
36538
|
-
"pipelineAnalytics.
|
|
36665
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
36539
36666
|
capName: "pipeline-analytics",
|
|
36540
36667
|
capScope: "device",
|
|
36541
36668
|
addonId: null,
|
|
36542
36669
|
access: "view"
|
|
36543
36670
|
},
|
|
36544
|
-
"pipelineAnalytics.
|
|
36671
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
36545
36672
|
capName: "pipeline-analytics",
|
|
36546
36673
|
capScope: "device",
|
|
36547
36674
|
addonId: null,
|
|
36548
36675
|
access: "view"
|
|
36549
36676
|
},
|
|
36550
|
-
"pipelineAnalytics.
|
|
36677
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
36551
36678
|
capName: "pipeline-analytics",
|
|
36552
36679
|
capScope: "device",
|
|
36553
36680
|
addonId: null,
|
|
@@ -36637,12 +36764,6 @@ Object.freeze({
|
|
|
36637
36764
|
addonId: null,
|
|
36638
36765
|
access: "view"
|
|
36639
36766
|
},
|
|
36640
|
-
"pipelineAnalytics.listGroups": {
|
|
36641
|
-
capName: "pipeline-analytics",
|
|
36642
|
-
capScope: "device",
|
|
36643
|
-
addonId: null,
|
|
36644
|
-
access: "view"
|
|
36645
|
-
},
|
|
36646
36767
|
"pipelineAnalytics.listOpsLog": {
|
|
36647
36768
|
capName: "pipeline-analytics",
|
|
36648
36769
|
capScope: "device",
|
|
@@ -36727,6 +36848,12 @@ Object.freeze({
|
|
|
36727
36848
|
addonId: null,
|
|
36728
36849
|
access: "create"
|
|
36729
36850
|
},
|
|
36851
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
36852
|
+
capName: "pipeline-analytics",
|
|
36853
|
+
capScope: "device",
|
|
36854
|
+
addonId: null,
|
|
36855
|
+
access: "create"
|
|
36856
|
+
},
|
|
36730
36857
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
36731
36858
|
capName: "pipeline-analytics",
|
|
36732
36859
|
capScope: "device",
|
|
@@ -37651,6 +37778,12 @@ Object.freeze({
|
|
|
37651
37778
|
addonId: null,
|
|
37652
37779
|
access: "view"
|
|
37653
37780
|
},
|
|
37781
|
+
"recording.getPlacement": {
|
|
37782
|
+
capName: "recording",
|
|
37783
|
+
capScope: "system",
|
|
37784
|
+
addonId: null,
|
|
37785
|
+
access: "view"
|
|
37786
|
+
},
|
|
37654
37787
|
"recording.getPlaybackManifest": {
|
|
37655
37788
|
capName: "recording",
|
|
37656
37789
|
capScope: "system",
|
|
@@ -37777,6 +37910,12 @@ Object.freeze({
|
|
|
37777
37910
|
addonId: null,
|
|
37778
37911
|
access: "create"
|
|
37779
37912
|
},
|
|
37913
|
+
"recording.setDevicePlacement": {
|
|
37914
|
+
capName: "recording",
|
|
37915
|
+
capScope: "system",
|
|
37916
|
+
addonId: null,
|
|
37917
|
+
access: "create"
|
|
37918
|
+
},
|
|
37780
37919
|
"recording.startStorageMigrationMove": {
|
|
37781
37920
|
capName: "recording",
|
|
37782
37921
|
capScope: "system",
|
|
@@ -38221,12 +38360,36 @@ Object.freeze({
|
|
|
38221
38360
|
addonId: null,
|
|
38222
38361
|
access: "create"
|
|
38223
38362
|
},
|
|
38363
|
+
"storageMigration.cleanupCancel": {
|
|
38364
|
+
capName: "storage-migration",
|
|
38365
|
+
capScope: "system",
|
|
38366
|
+
addonId: null,
|
|
38367
|
+
access: "create"
|
|
38368
|
+
},
|
|
38369
|
+
"storageMigration.cleanupStart": {
|
|
38370
|
+
capName: "storage-migration",
|
|
38371
|
+
capScope: "system",
|
|
38372
|
+
addonId: null,
|
|
38373
|
+
access: "create"
|
|
38374
|
+
},
|
|
38375
|
+
"storageMigration.cleanupStatus": {
|
|
38376
|
+
capName: "storage-migration",
|
|
38377
|
+
capScope: "system",
|
|
38378
|
+
addonId: null,
|
|
38379
|
+
access: "view"
|
|
38380
|
+
},
|
|
38224
38381
|
"storageMigration.drain": {
|
|
38225
38382
|
capName: "storage-migration",
|
|
38226
38383
|
capScope: "system",
|
|
38227
38384
|
addonId: null,
|
|
38228
38385
|
access: "create"
|
|
38229
38386
|
},
|
|
38387
|
+
"storageMigration.history": {
|
|
38388
|
+
capName: "storage-migration",
|
|
38389
|
+
capScope: "system",
|
|
38390
|
+
addonId: null,
|
|
38391
|
+
access: "view"
|
|
38392
|
+
},
|
|
38230
38393
|
"storageMigration.movers": {
|
|
38231
38394
|
capName: "storage-migration",
|
|
38232
38395
|
capScope: "system",
|
|
@@ -40223,11 +40386,6 @@ Object.freeze({
|
|
|
40223
40386
|
form: "single",
|
|
40224
40387
|
optional: true
|
|
40225
40388
|
}],
|
|
40226
|
-
"pipelineAnalytics.getGroup": [{
|
|
40227
|
-
name: "deviceId",
|
|
40228
|
-
form: "single",
|
|
40229
|
-
optional: false
|
|
40230
|
-
}],
|
|
40231
40389
|
"pipelineAnalytics.getKeyEvents": [{
|
|
40232
40390
|
name: "deviceId",
|
|
40233
40391
|
form: "single",
|
|
@@ -40293,11 +40451,6 @@ Object.freeze({
|
|
|
40293
40451
|
form: "single",
|
|
40294
40452
|
optional: false
|
|
40295
40453
|
}],
|
|
40296
|
-
"pipelineAnalytics.listGroups": [{
|
|
40297
|
-
name: "deviceIds",
|
|
40298
|
-
form: "array",
|
|
40299
|
-
optional: false
|
|
40300
|
-
}],
|
|
40301
40454
|
"pipelineAnalytics.listOpsLog": [{
|
|
40302
40455
|
name: "deviceId",
|
|
40303
40456
|
form: "single",
|
|
@@ -40343,6 +40496,11 @@ Object.freeze({
|
|
|
40343
40496
|
form: "single",
|
|
40344
40497
|
optional: true
|
|
40345
40498
|
}],
|
|
40499
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
40500
|
+
name: "deviceIds",
|
|
40501
|
+
form: "array",
|
|
40502
|
+
optional: true
|
|
40503
|
+
}],
|
|
40346
40504
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
40347
40505
|
name: "deviceId",
|
|
40348
40506
|
form: "single",
|
|
@@ -40708,6 +40866,11 @@ Object.freeze({
|
|
|
40708
40866
|
form: "single",
|
|
40709
40867
|
optional: false
|
|
40710
40868
|
}],
|
|
40869
|
+
"recording.setDevicePlacement": [{
|
|
40870
|
+
name: "deviceId",
|
|
40871
|
+
form: "single",
|
|
40872
|
+
optional: false
|
|
40873
|
+
}],
|
|
40711
40874
|
"recording.startStorageMigrationMove": [{
|
|
40712
40875
|
name: "deviceId",
|
|
40713
40876
|
form: "single",
|
package/dist/addon.mjs
CHANGED
|
@@ -8092,6 +8092,13 @@ var MediaRelocateModeSchema = _enum([
|
|
|
8092
8092
|
]);
|
|
8093
8093
|
var RelocateMediaInputSchema = object({
|
|
8094
8094
|
toLocationId: string(),
|
|
8095
|
+
/**
|
|
8096
|
+
* Restrict the pass to rows currently on this location. Omitted / `'*'` =
|
|
8097
|
+
* every row that is not already on `toLocationId` (the historical
|
|
8098
|
+
* behaviour). A named source is what a from→to migration needs: without it
|
|
8099
|
+
* "move events off disk 2" also emptied disk 1.
|
|
8100
|
+
*/
|
|
8101
|
+
fromLocationId: string().optional(),
|
|
8095
8102
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8096
8103
|
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8097
8104
|
mode: MediaRelocateModeSchema.optional()
|
|
@@ -8159,6 +8166,19 @@ var StorageMigrationDestinationsSchema = object({
|
|
|
8159
8166
|
galleryMedia: string().min(1).optional()
|
|
8160
8167
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8161
8168
|
/**
|
|
8169
|
+
* Optional named source per class. Omitted = the class's current default
|
|
8170
|
+
* (the historical behaviour). A named source that is NOT the default is a
|
|
8171
|
+
* drain of that disk: bytes move, the default stays, and the source is
|
|
8172
|
+
* disabled when the move finishes.
|
|
8173
|
+
*/
|
|
8174
|
+
var StorageMigrationSourcesSchema = object({
|
|
8175
|
+
recordings: string().min(1).optional(),
|
|
8176
|
+
recordingsLow: string().min(1).optional(),
|
|
8177
|
+
eventMedia: string().min(1).optional(),
|
|
8178
|
+
backups: string().min(1).optional(),
|
|
8179
|
+
galleryMedia: string().min(1).optional()
|
|
8180
|
+
}).optional();
|
|
8181
|
+
/**
|
|
8162
8182
|
* How a migration sequences the cutover against the byte move.
|
|
8163
8183
|
*
|
|
8164
8184
|
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
@@ -8180,6 +8200,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
|
8180
8200
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8181
8201
|
var StorageMigrationInputSchema = object({
|
|
8182
8202
|
destinations: StorageMigrationDestinationsSchema,
|
|
8203
|
+
/** Omitted = each class's current default. */
|
|
8204
|
+
sources: StorageMigrationSourcesSchema,
|
|
8183
8205
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8184
8206
|
/** Omitted = `blocking`, which stays the default. */
|
|
8185
8207
|
mode: StorageMigrationModeSchema.optional()
|
|
@@ -8259,6 +8281,13 @@ var StorageMigrationMoveSchema = object({
|
|
|
8259
8281
|
storageClass: StorageMigrationClassSchema,
|
|
8260
8282
|
fromLocationId: string(),
|
|
8261
8283
|
toLocationId: string(),
|
|
8284
|
+
/**
|
|
8285
|
+
* True when `from` was NOT the class default at plan time. The move still
|
|
8286
|
+
* copies bytes, but the default is left alone and the source is disabled
|
|
8287
|
+
* once the copy verifies. Absent on jobs planned before this field existed
|
|
8288
|
+
* — those jobs always repointed, which is `false`.
|
|
8289
|
+
*/
|
|
8290
|
+
freezeSource: boolean().optional(),
|
|
8262
8291
|
moverJobId: string().nullable(),
|
|
8263
8292
|
state: RelocateJobStateSchema.nullable(),
|
|
8264
8293
|
error: string().nullable(),
|
|
@@ -8272,6 +8301,7 @@ var StorageMigrationJobSchema = object({
|
|
|
8272
8301
|
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8273
8302
|
mode: StorageMigrationModeSchema,
|
|
8274
8303
|
destinations: StorageMigrationDestinationsSchema,
|
|
8304
|
+
sources: StorageMigrationSourcesSchema,
|
|
8275
8305
|
throttleMbps: number(),
|
|
8276
8306
|
moves: array(StorageMigrationMoveSchema),
|
|
8277
8307
|
pauseLeaseId: string().nullable(),
|
|
@@ -8297,6 +8327,7 @@ var StorageMigrationFindingSchema = object({
|
|
|
8297
8327
|
});
|
|
8298
8328
|
var StorageMigrationPlanSchema = object({
|
|
8299
8329
|
destinations: StorageMigrationDestinationsSchema,
|
|
8330
|
+
sources: StorageMigrationSourcesSchema,
|
|
8300
8331
|
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8301
8332
|
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8302
8333
|
* it. */
|
|
@@ -8304,7 +8335,8 @@ var StorageMigrationPlanSchema = object({
|
|
|
8304
8335
|
moves: array(object({
|
|
8305
8336
|
storageClass: StorageMigrationClassSchema,
|
|
8306
8337
|
fromLocationId: string(),
|
|
8307
|
-
toLocationId: string()
|
|
8338
|
+
toLocationId: string(),
|
|
8339
|
+
freezeSource: boolean().optional()
|
|
8308
8340
|
})),
|
|
8309
8341
|
findings: array(StorageMigrationFindingSchema)
|
|
8310
8342
|
});
|
|
@@ -8482,10 +8514,51 @@ var LedgerWalkReportSchema = object({
|
|
|
8482
8514
|
var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
|
|
8483
8515
|
var RelocatableMediaCountInputSchema = object({
|
|
8484
8516
|
toLocationId: string().min(1),
|
|
8517
|
+
/** Restrict the count to one source; omitted / `'*'` = every non-target row. */
|
|
8518
|
+
fromLocationId: string().optional(),
|
|
8485
8519
|
/** Omitted = `move`. */
|
|
8486
8520
|
mode: MediaRelocateModeSchema.optional()
|
|
8487
8521
|
});
|
|
8488
8522
|
/**
|
|
8523
|
+
* Operator cleanup of leftover analytics rows, optional debug media, and
|
|
8524
|
+
* ghost ledger entries on frozen footage locations.
|
|
8525
|
+
*
|
|
8526
|
+
* A pass is tens of minutes on a standing backlog. The hub method RETURNS
|
|
8527
|
+
* `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
|
|
8528
|
+
* is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
|
|
8529
|
+
* with no operator-visible status.
|
|
8530
|
+
*/
|
|
8531
|
+
var StorageCleanupPhaseSchema = _enum([
|
|
8532
|
+
"orphans",
|
|
8533
|
+
"debug-media",
|
|
8534
|
+
"ghost-ledger",
|
|
8535
|
+
"done",
|
|
8536
|
+
"failed",
|
|
8537
|
+
"cancelled"
|
|
8538
|
+
]);
|
|
8539
|
+
var StorageCleanupInputSchema = object({
|
|
8540
|
+
/** Also walk motion stills / track filmstrips. Off by default. */
|
|
8541
|
+
includeDebugMedia: boolean().optional() });
|
|
8542
|
+
var StorageCleanupJobSchema = object({
|
|
8543
|
+
jobId: string(),
|
|
8544
|
+
phase: StorageCleanupPhaseSchema,
|
|
8545
|
+
includeDebugMedia: boolean(),
|
|
8546
|
+
orphansReclaimed: number().int().nonnegative(),
|
|
8547
|
+
orphanBytesReclaimed: number().int().nonnegative(),
|
|
8548
|
+
debugMediaReclaimed: number().int().nonnegative(),
|
|
8549
|
+
debugMediaBytesReclaimed: number().int().nonnegative(),
|
|
8550
|
+
ghostsForgotten: number().int().nonnegative(),
|
|
8551
|
+
ghostBytesForgotten: number().int().nonnegative(),
|
|
8552
|
+
/** Short operator-facing line: current collection, pass, or location. */
|
|
8553
|
+
detail: string().nullable(),
|
|
8554
|
+
cancelRequested: boolean(),
|
|
8555
|
+
startedAt: number(),
|
|
8556
|
+
updatedAt: number(),
|
|
8557
|
+
finishedAt: number().nullable(),
|
|
8558
|
+
error: string().nullable()
|
|
8559
|
+
});
|
|
8560
|
+
var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
|
|
8561
|
+
/**
|
|
8489
8562
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
8490
8563
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
8491
8564
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -8513,11 +8586,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
|
|
|
8513
8586
|
* The default location for a type uses `id === <type>:default` by
|
|
8514
8587
|
* convention (the bare type ref like `'backups'` resolves to it).
|
|
8515
8588
|
*
|
|
8516
|
-
* `isSystem
|
|
8517
|
-
*
|
|
8518
|
-
*
|
|
8519
|
-
*
|
|
8520
|
-
* deleting it is rejected at the cap level.
|
|
8589
|
+
* `isSystem` is a legacy persisted flag. Seed still creates the initial
|
|
8590
|
+
* `<type>:default` locations; the flag is no longer a lock, a badge, or a
|
|
8591
|
+
* prune selector. New writes leave it false. Deletion is gated on uniqueness
|
|
8592
|
+
* / last-enabled, not on this bit.
|
|
8521
8593
|
*/
|
|
8522
8594
|
var StorageLocationSchema = object({
|
|
8523
8595
|
id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
|
|
@@ -13336,6 +13408,12 @@ method(object({
|
|
|
13336
13408
|
}), _void(), {
|
|
13337
13409
|
kind: "mutation",
|
|
13338
13410
|
auth: "admin"
|
|
13411
|
+
}), method(object({
|
|
13412
|
+
from: string(),
|
|
13413
|
+
to: string()
|
|
13414
|
+
}), object({ moved: number() }), {
|
|
13415
|
+
kind: "mutation",
|
|
13416
|
+
auth: "admin"
|
|
13339
13417
|
}), method(object({
|
|
13340
13418
|
deviceId: number(),
|
|
13341
13419
|
disabled: boolean()
|
|
@@ -16105,6 +16183,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
16105
16183
|
"device-offline",
|
|
16106
16184
|
"device-disabled",
|
|
16107
16185
|
"device-enabled",
|
|
16186
|
+
"device-battery-low",
|
|
16187
|
+
"device-battery-normal",
|
|
16108
16188
|
"stream-online",
|
|
16109
16189
|
"stream-offline",
|
|
16110
16190
|
"node-online",
|
|
@@ -19363,46 +19443,6 @@ var RecentTracksPageSchema = object({
|
|
|
19363
19443
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19364
19444
|
nextCursor: string().nullable()
|
|
19365
19445
|
});
|
|
19366
|
-
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
19367
|
-
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
19368
|
-
var AnalyticsGroupRecordSchema = object({
|
|
19369
|
-
id: string(),
|
|
19370
|
-
deviceId: number().int(),
|
|
19371
|
-
openedAt: number().int(),
|
|
19372
|
-
closedAt: number().int(),
|
|
19373
|
-
timestamp: number().int(),
|
|
19374
|
-
memberCount: number().int(),
|
|
19375
|
-
memberTrackIds: array(string()).readonly(),
|
|
19376
|
-
className: string(),
|
|
19377
|
-
classes: array(string()).readonly(),
|
|
19378
|
-
/** Relative event-media path, or null when the group has no picture yet. */
|
|
19379
|
-
mediaUrl: string().nullable(),
|
|
19380
|
-
singleton: boolean()
|
|
19381
|
-
});
|
|
19382
|
-
var AnalyticsGroupMemberSchema = object({
|
|
19383
|
-
trackId: string(),
|
|
19384
|
-
deviceId: number().int(),
|
|
19385
|
-
className: string(),
|
|
19386
|
-
firstSeen: number().int(),
|
|
19387
|
-
lastSeen: number().int(),
|
|
19388
|
-
mediaUrl: string().nullable()
|
|
19389
|
-
});
|
|
19390
|
-
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
19391
|
-
var ListGroupsQueryInput = object({
|
|
19392
|
-
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
19393
|
-
deviceIds: array(number()),
|
|
19394
|
-
/** Window lower bound on `closedAt` (inclusive). */
|
|
19395
|
-
since: number().optional(),
|
|
19396
|
-
/** Window upper bound on `openedAt` (inclusive). */
|
|
19397
|
-
until: number().optional(),
|
|
19398
|
-
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
19399
|
-
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
19400
|
-
cursor: string().optional()
|
|
19401
|
-
});
|
|
19402
|
-
var ListGroupsPageSchema = object({
|
|
19403
|
-
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
19404
|
-
nextCursor: string().nullable()
|
|
19405
|
-
});
|
|
19406
19446
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19407
19447
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19408
19448
|
var KeyEventQueryInput = object({
|
|
@@ -19506,9 +19546,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19506
19546
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19507
19547
|
plates: number().int(),
|
|
19508
19548
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
19509
|
-
embeddings: number().int()
|
|
19510
|
-
/** Group membership + group rows removed with their last member (best-effort). */
|
|
19511
|
-
groups: number().int()
|
|
19549
|
+
embeddings: number().int()
|
|
19512
19550
|
});
|
|
19513
19551
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19514
19552
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19678,6 +19716,47 @@ var RebuildStatusSchema = object({
|
|
|
19678
19716
|
/** Present when the pass ended by throwing. */
|
|
19679
19717
|
error: string().nullable()
|
|
19680
19718
|
});
|
|
19719
|
+
/**
|
|
19720
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19721
|
+
*
|
|
19722
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19723
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19724
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19725
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19726
|
+
*/
|
|
19727
|
+
var MediaReclaimStartResultSchema = object({
|
|
19728
|
+
started: boolean(),
|
|
19729
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19730
|
+
alreadyRunning: boolean()
|
|
19731
|
+
});
|
|
19732
|
+
var MediaReclaimInputSchema = object({
|
|
19733
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19734
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19735
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19736
|
+
restart: boolean().optional(),
|
|
19737
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19738
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19739
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19740
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19741
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19742
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19743
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19744
|
+
});
|
|
19745
|
+
var MediaReclaimStatusSchema = object({
|
|
19746
|
+
running: boolean(),
|
|
19747
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19748
|
+
totalExamined: number(),
|
|
19749
|
+
totalEligible: number(),
|
|
19750
|
+
totalReclaimed: number(),
|
|
19751
|
+
totalBytesReclaimed: number(),
|
|
19752
|
+
totalRefused: number(),
|
|
19753
|
+
/** Device+scope windows finished in this pass. */
|
|
19754
|
+
devicesDone: number(),
|
|
19755
|
+
complete: boolean().nullable(),
|
|
19756
|
+
startedAtMs: number().nullable(),
|
|
19757
|
+
finishedAtMs: number().nullable(),
|
|
19758
|
+
error: string().nullable()
|
|
19759
|
+
});
|
|
19681
19760
|
var ReplayFrameInputSchema = object({
|
|
19682
19761
|
timestamp: number(),
|
|
19683
19762
|
frame: PipelineRunResultBridge
|
|
@@ -19716,10 +19795,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19716
19795
|
* stationary registry). Default false: the timeline lists passages,
|
|
19717
19796
|
* not parking records (operator decision, 2026-08-15). */
|
|
19718
19797
|
includeStationary: boolean().optional()
|
|
19719
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
19720
|
-
deviceId: number(),
|
|
19721
|
-
groupId: string().min(1)
|
|
19722
|
-
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
19798
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19723
19799
|
kind: "mutation",
|
|
19724
19800
|
auth: "admin"
|
|
19725
19801
|
}), 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({
|
|
@@ -19819,6 +19895,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19819
19895
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19820
19896
|
kind: "query",
|
|
19821
19897
|
auth: "admin"
|
|
19898
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19899
|
+
kind: "mutation",
|
|
19900
|
+
auth: "admin"
|
|
19901
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19902
|
+
kind: "query",
|
|
19903
|
+
auth: "admin"
|
|
19822
19904
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19823
19905
|
kind: "query",
|
|
19824
19906
|
auth: "admin"
|
|
@@ -21893,7 +21975,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21893
21975
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21894
21976
|
kind: "mutation",
|
|
21895
21977
|
auth: "admin"
|
|
21896
|
-
})
|
|
21978
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21979
|
+
kind: "mutation",
|
|
21980
|
+
auth: "admin"
|
|
21981
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21982
|
+
kind: "mutation",
|
|
21983
|
+
auth: "admin"
|
|
21984
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21897
21985
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21898
21986
|
providerId: string().min(1),
|
|
21899
21987
|
displayName: string().min(1),
|
|
@@ -29119,6 +29207,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
29119
29207
|
minMoveGb: number().min(0).optional()
|
|
29120
29208
|
});
|
|
29121
29209
|
/**
|
|
29210
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
29211
|
+
*
|
|
29212
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
29213
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
29214
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
29215
|
+
*/
|
|
29216
|
+
var RecordingDevicePlacementSchema = object({
|
|
29217
|
+
deviceId: number().int(),
|
|
29218
|
+
profile: string(),
|
|
29219
|
+
locationId: string()
|
|
29220
|
+
});
|
|
29221
|
+
var RecordingDevicePinSchema = object({
|
|
29222
|
+
deviceId: number().int(),
|
|
29223
|
+
/** Recordings-class location this camera is pinned to. */
|
|
29224
|
+
locationId: string()
|
|
29225
|
+
});
|
|
29226
|
+
var RecordingPlacementViewSchema = object({
|
|
29227
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
29228
|
+
pins: array(RecordingDevicePinSchema),
|
|
29229
|
+
defaultLocations: record(string(), string())
|
|
29230
|
+
});
|
|
29231
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
29232
|
+
deviceId: number().int(),
|
|
29233
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
29234
|
+
locationId: string().nullable()
|
|
29235
|
+
});
|
|
29236
|
+
/**
|
|
29122
29237
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
29123
29238
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
29124
29239
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -29344,6 +29459,12 @@ method(object({
|
|
|
29344
29459
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
29345
29460
|
kind: "mutation",
|
|
29346
29461
|
auth: "admin"
|
|
29462
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
29463
|
+
kind: "query",
|
|
29464
|
+
auth: "admin"
|
|
29465
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
29466
|
+
kind: "mutation",
|
|
29467
|
+
auth: "admin"
|
|
29347
29468
|
});
|
|
29348
29469
|
/**
|
|
29349
29470
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -34844,6 +34965,12 @@ Object.freeze({
|
|
|
34844
34965
|
addonId: null,
|
|
34845
34966
|
access: "delete"
|
|
34846
34967
|
},
|
|
34968
|
+
"deviceManager.renameLocation": {
|
|
34969
|
+
capName: "device-manager",
|
|
34970
|
+
capScope: "system",
|
|
34971
|
+
addonId: null,
|
|
34972
|
+
access: "create"
|
|
34973
|
+
},
|
|
34847
34974
|
"deviceManager.runDeviceAction": {
|
|
34848
34975
|
capName: "device-manager",
|
|
34849
34976
|
capScope: "system",
|
|
@@ -36536,19 +36663,19 @@ Object.freeze({
|
|
|
36536
36663
|
addonId: null,
|
|
36537
36664
|
access: "view"
|
|
36538
36665
|
},
|
|
36539
|
-
"pipelineAnalytics.
|
|
36666
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
36540
36667
|
capName: "pipeline-analytics",
|
|
36541
36668
|
capScope: "device",
|
|
36542
36669
|
addonId: null,
|
|
36543
36670
|
access: "view"
|
|
36544
36671
|
},
|
|
36545
|
-
"pipelineAnalytics.
|
|
36672
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
36546
36673
|
capName: "pipeline-analytics",
|
|
36547
36674
|
capScope: "device",
|
|
36548
36675
|
addonId: null,
|
|
36549
36676
|
access: "view"
|
|
36550
36677
|
},
|
|
36551
|
-
"pipelineAnalytics.
|
|
36678
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
36552
36679
|
capName: "pipeline-analytics",
|
|
36553
36680
|
capScope: "device",
|
|
36554
36681
|
addonId: null,
|
|
@@ -36638,12 +36765,6 @@ Object.freeze({
|
|
|
36638
36765
|
addonId: null,
|
|
36639
36766
|
access: "view"
|
|
36640
36767
|
},
|
|
36641
|
-
"pipelineAnalytics.listGroups": {
|
|
36642
|
-
capName: "pipeline-analytics",
|
|
36643
|
-
capScope: "device",
|
|
36644
|
-
addonId: null,
|
|
36645
|
-
access: "view"
|
|
36646
|
-
},
|
|
36647
36768
|
"pipelineAnalytics.listOpsLog": {
|
|
36648
36769
|
capName: "pipeline-analytics",
|
|
36649
36770
|
capScope: "device",
|
|
@@ -36728,6 +36849,12 @@ Object.freeze({
|
|
|
36728
36849
|
addonId: null,
|
|
36729
36850
|
access: "create"
|
|
36730
36851
|
},
|
|
36852
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
36853
|
+
capName: "pipeline-analytics",
|
|
36854
|
+
capScope: "device",
|
|
36855
|
+
addonId: null,
|
|
36856
|
+
access: "create"
|
|
36857
|
+
},
|
|
36731
36858
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
36732
36859
|
capName: "pipeline-analytics",
|
|
36733
36860
|
capScope: "device",
|
|
@@ -37652,6 +37779,12 @@ Object.freeze({
|
|
|
37652
37779
|
addonId: null,
|
|
37653
37780
|
access: "view"
|
|
37654
37781
|
},
|
|
37782
|
+
"recording.getPlacement": {
|
|
37783
|
+
capName: "recording",
|
|
37784
|
+
capScope: "system",
|
|
37785
|
+
addonId: null,
|
|
37786
|
+
access: "view"
|
|
37787
|
+
},
|
|
37655
37788
|
"recording.getPlaybackManifest": {
|
|
37656
37789
|
capName: "recording",
|
|
37657
37790
|
capScope: "system",
|
|
@@ -37778,6 +37911,12 @@ Object.freeze({
|
|
|
37778
37911
|
addonId: null,
|
|
37779
37912
|
access: "create"
|
|
37780
37913
|
},
|
|
37914
|
+
"recording.setDevicePlacement": {
|
|
37915
|
+
capName: "recording",
|
|
37916
|
+
capScope: "system",
|
|
37917
|
+
addonId: null,
|
|
37918
|
+
access: "create"
|
|
37919
|
+
},
|
|
37781
37920
|
"recording.startStorageMigrationMove": {
|
|
37782
37921
|
capName: "recording",
|
|
37783
37922
|
capScope: "system",
|
|
@@ -38222,12 +38361,36 @@ Object.freeze({
|
|
|
38222
38361
|
addonId: null,
|
|
38223
38362
|
access: "create"
|
|
38224
38363
|
},
|
|
38364
|
+
"storageMigration.cleanupCancel": {
|
|
38365
|
+
capName: "storage-migration",
|
|
38366
|
+
capScope: "system",
|
|
38367
|
+
addonId: null,
|
|
38368
|
+
access: "create"
|
|
38369
|
+
},
|
|
38370
|
+
"storageMigration.cleanupStart": {
|
|
38371
|
+
capName: "storage-migration",
|
|
38372
|
+
capScope: "system",
|
|
38373
|
+
addonId: null,
|
|
38374
|
+
access: "create"
|
|
38375
|
+
},
|
|
38376
|
+
"storageMigration.cleanupStatus": {
|
|
38377
|
+
capName: "storage-migration",
|
|
38378
|
+
capScope: "system",
|
|
38379
|
+
addonId: null,
|
|
38380
|
+
access: "view"
|
|
38381
|
+
},
|
|
38225
38382
|
"storageMigration.drain": {
|
|
38226
38383
|
capName: "storage-migration",
|
|
38227
38384
|
capScope: "system",
|
|
38228
38385
|
addonId: null,
|
|
38229
38386
|
access: "create"
|
|
38230
38387
|
},
|
|
38388
|
+
"storageMigration.history": {
|
|
38389
|
+
capName: "storage-migration",
|
|
38390
|
+
capScope: "system",
|
|
38391
|
+
addonId: null,
|
|
38392
|
+
access: "view"
|
|
38393
|
+
},
|
|
38231
38394
|
"storageMigration.movers": {
|
|
38232
38395
|
capName: "storage-migration",
|
|
38233
38396
|
capScope: "system",
|
|
@@ -40224,11 +40387,6 @@ Object.freeze({
|
|
|
40224
40387
|
form: "single",
|
|
40225
40388
|
optional: true
|
|
40226
40389
|
}],
|
|
40227
|
-
"pipelineAnalytics.getGroup": [{
|
|
40228
|
-
name: "deviceId",
|
|
40229
|
-
form: "single",
|
|
40230
|
-
optional: false
|
|
40231
|
-
}],
|
|
40232
40390
|
"pipelineAnalytics.getKeyEvents": [{
|
|
40233
40391
|
name: "deviceId",
|
|
40234
40392
|
form: "single",
|
|
@@ -40294,11 +40452,6 @@ Object.freeze({
|
|
|
40294
40452
|
form: "single",
|
|
40295
40453
|
optional: false
|
|
40296
40454
|
}],
|
|
40297
|
-
"pipelineAnalytics.listGroups": [{
|
|
40298
|
-
name: "deviceIds",
|
|
40299
|
-
form: "array",
|
|
40300
|
-
optional: false
|
|
40301
|
-
}],
|
|
40302
40455
|
"pipelineAnalytics.listOpsLog": [{
|
|
40303
40456
|
name: "deviceId",
|
|
40304
40457
|
form: "single",
|
|
@@ -40344,6 +40497,11 @@ Object.freeze({
|
|
|
40344
40497
|
form: "single",
|
|
40345
40498
|
optional: true
|
|
40346
40499
|
}],
|
|
40500
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
40501
|
+
name: "deviceIds",
|
|
40502
|
+
form: "array",
|
|
40503
|
+
optional: true
|
|
40504
|
+
}],
|
|
40347
40505
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
40348
40506
|
name: "deviceId",
|
|
40349
40507
|
form: "single",
|
|
@@ -40709,6 +40867,11 @@ Object.freeze({
|
|
|
40709
40867
|
form: "single",
|
|
40710
40868
|
optional: false
|
|
40711
40869
|
}],
|
|
40870
|
+
"recording.setDevicePlacement": [{
|
|
40871
|
+
name: "deviceId",
|
|
40872
|
+
form: "single",
|
|
40873
|
+
optional: false
|
|
40874
|
+
}],
|
|
40712
40875
|
"recording.startStorageMigrationMove": [{
|
|
40713
40876
|
name: "deviceId",
|
|
40714
40877
|
form: "single",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-provider-hikvision",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.59",
|
|
4
4
|
"description": "Hikvision camera device provider addon for CamStack — ISAPI over HTTP(S) with digest auth (snapshot, alarm stream, RTSP discovery)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|