@camstack/addon-provider-amcrest 0.2.50 → 0.2.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/addon.js +234 -73
- package/dist/addon.mjs +234 -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()
|
|
@@ -19048,46 +19126,6 @@ var RecentTracksPageSchema = object({
|
|
|
19048
19126
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19049
19127
|
nextCursor: string().nullable()
|
|
19050
19128
|
});
|
|
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
19129
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19092
19130
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19093
19131
|
var KeyEventQueryInput = object({
|
|
@@ -19191,9 +19229,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19191
19229
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19192
19230
|
plates: number().int(),
|
|
19193
19231
|
/** 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()
|
|
19232
|
+
embeddings: number().int()
|
|
19197
19233
|
});
|
|
19198
19234
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19199
19235
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19363,6 +19399,47 @@ var RebuildStatusSchema = object({
|
|
|
19363
19399
|
/** Present when the pass ended by throwing. */
|
|
19364
19400
|
error: string().nullable()
|
|
19365
19401
|
});
|
|
19402
|
+
/**
|
|
19403
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19404
|
+
*
|
|
19405
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19406
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19407
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19408
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19409
|
+
*/
|
|
19410
|
+
var MediaReclaimStartResultSchema = object({
|
|
19411
|
+
started: boolean(),
|
|
19412
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19413
|
+
alreadyRunning: boolean()
|
|
19414
|
+
});
|
|
19415
|
+
var MediaReclaimInputSchema = object({
|
|
19416
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19417
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19418
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19419
|
+
restart: boolean().optional(),
|
|
19420
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19421
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19422
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19423
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19424
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19425
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19426
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19427
|
+
});
|
|
19428
|
+
var MediaReclaimStatusSchema = object({
|
|
19429
|
+
running: boolean(),
|
|
19430
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19431
|
+
totalExamined: number(),
|
|
19432
|
+
totalEligible: number(),
|
|
19433
|
+
totalReclaimed: number(),
|
|
19434
|
+
totalBytesReclaimed: number(),
|
|
19435
|
+
totalRefused: number(),
|
|
19436
|
+
/** Device+scope windows finished in this pass. */
|
|
19437
|
+
devicesDone: number(),
|
|
19438
|
+
complete: boolean().nullable(),
|
|
19439
|
+
startedAtMs: number().nullable(),
|
|
19440
|
+
finishedAtMs: number().nullable(),
|
|
19441
|
+
error: string().nullable()
|
|
19442
|
+
});
|
|
19366
19443
|
var ReplayFrameInputSchema = object({
|
|
19367
19444
|
timestamp: number(),
|
|
19368
19445
|
frame: PipelineRunResultBridge
|
|
@@ -19401,10 +19478,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19401
19478
|
* stationary registry). Default false: the timeline lists passages,
|
|
19402
19479
|
* not parking records (operator decision, 2026-08-15). */
|
|
19403
19480
|
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(), {
|
|
19481
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19408
19482
|
kind: "mutation",
|
|
19409
19483
|
auth: "admin"
|
|
19410
19484
|
}), 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 +19578,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19504
19578
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19505
19579
|
kind: "query",
|
|
19506
19580
|
auth: "admin"
|
|
19581
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19582
|
+
kind: "mutation",
|
|
19583
|
+
auth: "admin"
|
|
19584
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19585
|
+
kind: "query",
|
|
19586
|
+
auth: "admin"
|
|
19507
19587
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19508
19588
|
kind: "query",
|
|
19509
19589
|
auth: "admin"
|
|
@@ -21578,7 +21658,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21578
21658
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21579
21659
|
kind: "mutation",
|
|
21580
21660
|
auth: "admin"
|
|
21581
|
-
})
|
|
21661
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21662
|
+
kind: "mutation",
|
|
21663
|
+
auth: "admin"
|
|
21664
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21665
|
+
kind: "mutation",
|
|
21666
|
+
auth: "admin"
|
|
21667
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21582
21668
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21583
21669
|
providerId: string().min(1),
|
|
21584
21670
|
displayName: string().min(1),
|
|
@@ -28759,6 +28845,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
28759
28845
|
minMoveGb: number().min(0).optional()
|
|
28760
28846
|
});
|
|
28761
28847
|
/**
|
|
28848
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
28849
|
+
*
|
|
28850
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
28851
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
28852
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
28853
|
+
*/
|
|
28854
|
+
var RecordingDevicePlacementSchema = object({
|
|
28855
|
+
deviceId: number().int(),
|
|
28856
|
+
profile: string(),
|
|
28857
|
+
locationId: string()
|
|
28858
|
+
});
|
|
28859
|
+
var RecordingDevicePinSchema = object({
|
|
28860
|
+
deviceId: number().int(),
|
|
28861
|
+
/** Recordings-class location this camera is pinned to. */
|
|
28862
|
+
locationId: string()
|
|
28863
|
+
});
|
|
28864
|
+
var RecordingPlacementViewSchema = object({
|
|
28865
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
28866
|
+
pins: array(RecordingDevicePinSchema),
|
|
28867
|
+
defaultLocations: record(string(), string())
|
|
28868
|
+
});
|
|
28869
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
28870
|
+
deviceId: number().int(),
|
|
28871
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
28872
|
+
locationId: string().nullable()
|
|
28873
|
+
});
|
|
28874
|
+
/**
|
|
28762
28875
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
28763
28876
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
28764
28877
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -28984,6 +29097,12 @@ method(object({
|
|
|
28984
29097
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
28985
29098
|
kind: "mutation",
|
|
28986
29099
|
auth: "admin"
|
|
29100
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
29101
|
+
kind: "query",
|
|
29102
|
+
auth: "admin"
|
|
29103
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
29104
|
+
kind: "mutation",
|
|
29105
|
+
auth: "admin"
|
|
28987
29106
|
});
|
|
28988
29107
|
/**
|
|
28989
29108
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -34457,6 +34576,12 @@ Object.freeze({
|
|
|
34457
34576
|
addonId: null,
|
|
34458
34577
|
access: "delete"
|
|
34459
34578
|
},
|
|
34579
|
+
"deviceManager.renameLocation": {
|
|
34580
|
+
capName: "device-manager",
|
|
34581
|
+
capScope: "system",
|
|
34582
|
+
addonId: null,
|
|
34583
|
+
access: "create"
|
|
34584
|
+
},
|
|
34460
34585
|
"deviceManager.runDeviceAction": {
|
|
34461
34586
|
capName: "device-manager",
|
|
34462
34587
|
capScope: "system",
|
|
@@ -36149,19 +36274,19 @@ Object.freeze({
|
|
|
36149
36274
|
addonId: null,
|
|
36150
36275
|
access: "view"
|
|
36151
36276
|
},
|
|
36152
|
-
"pipelineAnalytics.
|
|
36277
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
36153
36278
|
capName: "pipeline-analytics",
|
|
36154
36279
|
capScope: "device",
|
|
36155
36280
|
addonId: null,
|
|
36156
36281
|
access: "view"
|
|
36157
36282
|
},
|
|
36158
|
-
"pipelineAnalytics.
|
|
36283
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
36159
36284
|
capName: "pipeline-analytics",
|
|
36160
36285
|
capScope: "device",
|
|
36161
36286
|
addonId: null,
|
|
36162
36287
|
access: "view"
|
|
36163
36288
|
},
|
|
36164
|
-
"pipelineAnalytics.
|
|
36289
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
36165
36290
|
capName: "pipeline-analytics",
|
|
36166
36291
|
capScope: "device",
|
|
36167
36292
|
addonId: null,
|
|
@@ -36251,12 +36376,6 @@ Object.freeze({
|
|
|
36251
36376
|
addonId: null,
|
|
36252
36377
|
access: "view"
|
|
36253
36378
|
},
|
|
36254
|
-
"pipelineAnalytics.listGroups": {
|
|
36255
|
-
capName: "pipeline-analytics",
|
|
36256
|
-
capScope: "device",
|
|
36257
|
-
addonId: null,
|
|
36258
|
-
access: "view"
|
|
36259
|
-
},
|
|
36260
36379
|
"pipelineAnalytics.listOpsLog": {
|
|
36261
36380
|
capName: "pipeline-analytics",
|
|
36262
36381
|
capScope: "device",
|
|
@@ -36341,6 +36460,12 @@ Object.freeze({
|
|
|
36341
36460
|
addonId: null,
|
|
36342
36461
|
access: "create"
|
|
36343
36462
|
},
|
|
36463
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
36464
|
+
capName: "pipeline-analytics",
|
|
36465
|
+
capScope: "device",
|
|
36466
|
+
addonId: null,
|
|
36467
|
+
access: "create"
|
|
36468
|
+
},
|
|
36344
36469
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
36345
36470
|
capName: "pipeline-analytics",
|
|
36346
36471
|
capScope: "device",
|
|
@@ -37265,6 +37390,12 @@ Object.freeze({
|
|
|
37265
37390
|
addonId: null,
|
|
37266
37391
|
access: "view"
|
|
37267
37392
|
},
|
|
37393
|
+
"recording.getPlacement": {
|
|
37394
|
+
capName: "recording",
|
|
37395
|
+
capScope: "system",
|
|
37396
|
+
addonId: null,
|
|
37397
|
+
access: "view"
|
|
37398
|
+
},
|
|
37268
37399
|
"recording.getPlaybackManifest": {
|
|
37269
37400
|
capName: "recording",
|
|
37270
37401
|
capScope: "system",
|
|
@@ -37391,6 +37522,12 @@ Object.freeze({
|
|
|
37391
37522
|
addonId: null,
|
|
37392
37523
|
access: "create"
|
|
37393
37524
|
},
|
|
37525
|
+
"recording.setDevicePlacement": {
|
|
37526
|
+
capName: "recording",
|
|
37527
|
+
capScope: "system",
|
|
37528
|
+
addonId: null,
|
|
37529
|
+
access: "create"
|
|
37530
|
+
},
|
|
37394
37531
|
"recording.startStorageMigrationMove": {
|
|
37395
37532
|
capName: "recording",
|
|
37396
37533
|
capScope: "system",
|
|
@@ -37835,12 +37972,36 @@ Object.freeze({
|
|
|
37835
37972
|
addonId: null,
|
|
37836
37973
|
access: "create"
|
|
37837
37974
|
},
|
|
37975
|
+
"storageMigration.cleanupCancel": {
|
|
37976
|
+
capName: "storage-migration",
|
|
37977
|
+
capScope: "system",
|
|
37978
|
+
addonId: null,
|
|
37979
|
+
access: "create"
|
|
37980
|
+
},
|
|
37981
|
+
"storageMigration.cleanupStart": {
|
|
37982
|
+
capName: "storage-migration",
|
|
37983
|
+
capScope: "system",
|
|
37984
|
+
addonId: null,
|
|
37985
|
+
access: "create"
|
|
37986
|
+
},
|
|
37987
|
+
"storageMigration.cleanupStatus": {
|
|
37988
|
+
capName: "storage-migration",
|
|
37989
|
+
capScope: "system",
|
|
37990
|
+
addonId: null,
|
|
37991
|
+
access: "view"
|
|
37992
|
+
},
|
|
37838
37993
|
"storageMigration.drain": {
|
|
37839
37994
|
capName: "storage-migration",
|
|
37840
37995
|
capScope: "system",
|
|
37841
37996
|
addonId: null,
|
|
37842
37997
|
access: "create"
|
|
37843
37998
|
},
|
|
37999
|
+
"storageMigration.history": {
|
|
38000
|
+
capName: "storage-migration",
|
|
38001
|
+
capScope: "system",
|
|
38002
|
+
addonId: null,
|
|
38003
|
+
access: "view"
|
|
38004
|
+
},
|
|
37844
38005
|
"storageMigration.movers": {
|
|
37845
38006
|
capName: "storage-migration",
|
|
37846
38007
|
capScope: "system",
|
|
@@ -39837,11 +39998,6 @@ Object.freeze({
|
|
|
39837
39998
|
form: "single",
|
|
39838
39999
|
optional: true
|
|
39839
40000
|
}],
|
|
39840
|
-
"pipelineAnalytics.getGroup": [{
|
|
39841
|
-
name: "deviceId",
|
|
39842
|
-
form: "single",
|
|
39843
|
-
optional: false
|
|
39844
|
-
}],
|
|
39845
40001
|
"pipelineAnalytics.getKeyEvents": [{
|
|
39846
40002
|
name: "deviceId",
|
|
39847
40003
|
form: "single",
|
|
@@ -39907,11 +40063,6 @@ Object.freeze({
|
|
|
39907
40063
|
form: "single",
|
|
39908
40064
|
optional: false
|
|
39909
40065
|
}],
|
|
39910
|
-
"pipelineAnalytics.listGroups": [{
|
|
39911
|
-
name: "deviceIds",
|
|
39912
|
-
form: "array",
|
|
39913
|
-
optional: false
|
|
39914
|
-
}],
|
|
39915
40066
|
"pipelineAnalytics.listOpsLog": [{
|
|
39916
40067
|
name: "deviceId",
|
|
39917
40068
|
form: "single",
|
|
@@ -39957,6 +40108,11 @@ Object.freeze({
|
|
|
39957
40108
|
form: "single",
|
|
39958
40109
|
optional: true
|
|
39959
40110
|
}],
|
|
40111
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
40112
|
+
name: "deviceIds",
|
|
40113
|
+
form: "array",
|
|
40114
|
+
optional: true
|
|
40115
|
+
}],
|
|
39960
40116
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
39961
40117
|
name: "deviceId",
|
|
39962
40118
|
form: "single",
|
|
@@ -40322,6 +40478,11 @@ Object.freeze({
|
|
|
40322
40478
|
form: "single",
|
|
40323
40479
|
optional: false
|
|
40324
40480
|
}],
|
|
40481
|
+
"recording.setDevicePlacement": [{
|
|
40482
|
+
name: "deviceId",
|
|
40483
|
+
form: "single",
|
|
40484
|
+
optional: false
|
|
40485
|
+
}],
|
|
40325
40486
|
"recording.startStorageMigrationMove": [{
|
|
40326
40487
|
name: "deviceId",
|
|
40327
40488
|
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()
|
|
@@ -19049,46 +19127,6 @@ var RecentTracksPageSchema = object({
|
|
|
19049
19127
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19050
19128
|
nextCursor: string().nullable()
|
|
19051
19129
|
});
|
|
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
19130
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19093
19131
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19094
19132
|
var KeyEventQueryInput = object({
|
|
@@ -19192,9 +19230,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19192
19230
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19193
19231
|
plates: number().int(),
|
|
19194
19232
|
/** 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()
|
|
19233
|
+
embeddings: number().int()
|
|
19198
19234
|
});
|
|
19199
19235
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19200
19236
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19364,6 +19400,47 @@ var RebuildStatusSchema = object({
|
|
|
19364
19400
|
/** Present when the pass ended by throwing. */
|
|
19365
19401
|
error: string().nullable()
|
|
19366
19402
|
});
|
|
19403
|
+
/**
|
|
19404
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19405
|
+
*
|
|
19406
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19407
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19408
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19409
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19410
|
+
*/
|
|
19411
|
+
var MediaReclaimStartResultSchema = object({
|
|
19412
|
+
started: boolean(),
|
|
19413
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19414
|
+
alreadyRunning: boolean()
|
|
19415
|
+
});
|
|
19416
|
+
var MediaReclaimInputSchema = object({
|
|
19417
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19418
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19419
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19420
|
+
restart: boolean().optional(),
|
|
19421
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19422
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19423
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19424
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19425
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19426
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19427
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19428
|
+
});
|
|
19429
|
+
var MediaReclaimStatusSchema = object({
|
|
19430
|
+
running: boolean(),
|
|
19431
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19432
|
+
totalExamined: number(),
|
|
19433
|
+
totalEligible: number(),
|
|
19434
|
+
totalReclaimed: number(),
|
|
19435
|
+
totalBytesReclaimed: number(),
|
|
19436
|
+
totalRefused: number(),
|
|
19437
|
+
/** Device+scope windows finished in this pass. */
|
|
19438
|
+
devicesDone: number(),
|
|
19439
|
+
complete: boolean().nullable(),
|
|
19440
|
+
startedAtMs: number().nullable(),
|
|
19441
|
+
finishedAtMs: number().nullable(),
|
|
19442
|
+
error: string().nullable()
|
|
19443
|
+
});
|
|
19367
19444
|
var ReplayFrameInputSchema = object({
|
|
19368
19445
|
timestamp: number(),
|
|
19369
19446
|
frame: PipelineRunResultBridge
|
|
@@ -19402,10 +19479,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19402
19479
|
* stationary registry). Default false: the timeline lists passages,
|
|
19403
19480
|
* not parking records (operator decision, 2026-08-15). */
|
|
19404
19481
|
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(), {
|
|
19482
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19409
19483
|
kind: "mutation",
|
|
19410
19484
|
auth: "admin"
|
|
19411
19485
|
}), 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 +19579,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19505
19579
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19506
19580
|
kind: "query",
|
|
19507
19581
|
auth: "admin"
|
|
19582
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19583
|
+
kind: "mutation",
|
|
19584
|
+
auth: "admin"
|
|
19585
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19586
|
+
kind: "query",
|
|
19587
|
+
auth: "admin"
|
|
19508
19588
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19509
19589
|
kind: "query",
|
|
19510
19590
|
auth: "admin"
|
|
@@ -21579,7 +21659,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21579
21659
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21580
21660
|
kind: "mutation",
|
|
21581
21661
|
auth: "admin"
|
|
21582
|
-
})
|
|
21662
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21663
|
+
kind: "mutation",
|
|
21664
|
+
auth: "admin"
|
|
21665
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21666
|
+
kind: "mutation",
|
|
21667
|
+
auth: "admin"
|
|
21668
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21583
21669
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21584
21670
|
providerId: string().min(1),
|
|
21585
21671
|
displayName: string().min(1),
|
|
@@ -28760,6 +28846,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
28760
28846
|
minMoveGb: number().min(0).optional()
|
|
28761
28847
|
});
|
|
28762
28848
|
/**
|
|
28849
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
28850
|
+
*
|
|
28851
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
28852
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
28853
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
28854
|
+
*/
|
|
28855
|
+
var RecordingDevicePlacementSchema = object({
|
|
28856
|
+
deviceId: number().int(),
|
|
28857
|
+
profile: string(),
|
|
28858
|
+
locationId: string()
|
|
28859
|
+
});
|
|
28860
|
+
var RecordingDevicePinSchema = object({
|
|
28861
|
+
deviceId: number().int(),
|
|
28862
|
+
/** Recordings-class location this camera is pinned to. */
|
|
28863
|
+
locationId: string()
|
|
28864
|
+
});
|
|
28865
|
+
var RecordingPlacementViewSchema = object({
|
|
28866
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
28867
|
+
pins: array(RecordingDevicePinSchema),
|
|
28868
|
+
defaultLocations: record(string(), string())
|
|
28869
|
+
});
|
|
28870
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
28871
|
+
deviceId: number().int(),
|
|
28872
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
28873
|
+
locationId: string().nullable()
|
|
28874
|
+
});
|
|
28875
|
+
/**
|
|
28763
28876
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
28764
28877
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
28765
28878
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -28985,6 +29098,12 @@ method(object({
|
|
|
28985
29098
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
28986
29099
|
kind: "mutation",
|
|
28987
29100
|
auth: "admin"
|
|
29101
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
29102
|
+
kind: "query",
|
|
29103
|
+
auth: "admin"
|
|
29104
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
29105
|
+
kind: "mutation",
|
|
29106
|
+
auth: "admin"
|
|
28988
29107
|
});
|
|
28989
29108
|
/**
|
|
28990
29109
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -34458,6 +34577,12 @@ Object.freeze({
|
|
|
34458
34577
|
addonId: null,
|
|
34459
34578
|
access: "delete"
|
|
34460
34579
|
},
|
|
34580
|
+
"deviceManager.renameLocation": {
|
|
34581
|
+
capName: "device-manager",
|
|
34582
|
+
capScope: "system",
|
|
34583
|
+
addonId: null,
|
|
34584
|
+
access: "create"
|
|
34585
|
+
},
|
|
34461
34586
|
"deviceManager.runDeviceAction": {
|
|
34462
34587
|
capName: "device-manager",
|
|
34463
34588
|
capScope: "system",
|
|
@@ -36150,19 +36275,19 @@ Object.freeze({
|
|
|
36150
36275
|
addonId: null,
|
|
36151
36276
|
access: "view"
|
|
36152
36277
|
},
|
|
36153
|
-
"pipelineAnalytics.
|
|
36278
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
36154
36279
|
capName: "pipeline-analytics",
|
|
36155
36280
|
capScope: "device",
|
|
36156
36281
|
addonId: null,
|
|
36157
36282
|
access: "view"
|
|
36158
36283
|
},
|
|
36159
|
-
"pipelineAnalytics.
|
|
36284
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
36160
36285
|
capName: "pipeline-analytics",
|
|
36161
36286
|
capScope: "device",
|
|
36162
36287
|
addonId: null,
|
|
36163
36288
|
access: "view"
|
|
36164
36289
|
},
|
|
36165
|
-
"pipelineAnalytics.
|
|
36290
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
36166
36291
|
capName: "pipeline-analytics",
|
|
36167
36292
|
capScope: "device",
|
|
36168
36293
|
addonId: null,
|
|
@@ -36252,12 +36377,6 @@ Object.freeze({
|
|
|
36252
36377
|
addonId: null,
|
|
36253
36378
|
access: "view"
|
|
36254
36379
|
},
|
|
36255
|
-
"pipelineAnalytics.listGroups": {
|
|
36256
|
-
capName: "pipeline-analytics",
|
|
36257
|
-
capScope: "device",
|
|
36258
|
-
addonId: null,
|
|
36259
|
-
access: "view"
|
|
36260
|
-
},
|
|
36261
36380
|
"pipelineAnalytics.listOpsLog": {
|
|
36262
36381
|
capName: "pipeline-analytics",
|
|
36263
36382
|
capScope: "device",
|
|
@@ -36342,6 +36461,12 @@ Object.freeze({
|
|
|
36342
36461
|
addonId: null,
|
|
36343
36462
|
access: "create"
|
|
36344
36463
|
},
|
|
36464
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
36465
|
+
capName: "pipeline-analytics",
|
|
36466
|
+
capScope: "device",
|
|
36467
|
+
addonId: null,
|
|
36468
|
+
access: "create"
|
|
36469
|
+
},
|
|
36345
36470
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
36346
36471
|
capName: "pipeline-analytics",
|
|
36347
36472
|
capScope: "device",
|
|
@@ -37266,6 +37391,12 @@ Object.freeze({
|
|
|
37266
37391
|
addonId: null,
|
|
37267
37392
|
access: "view"
|
|
37268
37393
|
},
|
|
37394
|
+
"recording.getPlacement": {
|
|
37395
|
+
capName: "recording",
|
|
37396
|
+
capScope: "system",
|
|
37397
|
+
addonId: null,
|
|
37398
|
+
access: "view"
|
|
37399
|
+
},
|
|
37269
37400
|
"recording.getPlaybackManifest": {
|
|
37270
37401
|
capName: "recording",
|
|
37271
37402
|
capScope: "system",
|
|
@@ -37392,6 +37523,12 @@ Object.freeze({
|
|
|
37392
37523
|
addonId: null,
|
|
37393
37524
|
access: "create"
|
|
37394
37525
|
},
|
|
37526
|
+
"recording.setDevicePlacement": {
|
|
37527
|
+
capName: "recording",
|
|
37528
|
+
capScope: "system",
|
|
37529
|
+
addonId: null,
|
|
37530
|
+
access: "create"
|
|
37531
|
+
},
|
|
37395
37532
|
"recording.startStorageMigrationMove": {
|
|
37396
37533
|
capName: "recording",
|
|
37397
37534
|
capScope: "system",
|
|
@@ -37836,12 +37973,36 @@ Object.freeze({
|
|
|
37836
37973
|
addonId: null,
|
|
37837
37974
|
access: "create"
|
|
37838
37975
|
},
|
|
37976
|
+
"storageMigration.cleanupCancel": {
|
|
37977
|
+
capName: "storage-migration",
|
|
37978
|
+
capScope: "system",
|
|
37979
|
+
addonId: null,
|
|
37980
|
+
access: "create"
|
|
37981
|
+
},
|
|
37982
|
+
"storageMigration.cleanupStart": {
|
|
37983
|
+
capName: "storage-migration",
|
|
37984
|
+
capScope: "system",
|
|
37985
|
+
addonId: null,
|
|
37986
|
+
access: "create"
|
|
37987
|
+
},
|
|
37988
|
+
"storageMigration.cleanupStatus": {
|
|
37989
|
+
capName: "storage-migration",
|
|
37990
|
+
capScope: "system",
|
|
37991
|
+
addonId: null,
|
|
37992
|
+
access: "view"
|
|
37993
|
+
},
|
|
37839
37994
|
"storageMigration.drain": {
|
|
37840
37995
|
capName: "storage-migration",
|
|
37841
37996
|
capScope: "system",
|
|
37842
37997
|
addonId: null,
|
|
37843
37998
|
access: "create"
|
|
37844
37999
|
},
|
|
38000
|
+
"storageMigration.history": {
|
|
38001
|
+
capName: "storage-migration",
|
|
38002
|
+
capScope: "system",
|
|
38003
|
+
addonId: null,
|
|
38004
|
+
access: "view"
|
|
38005
|
+
},
|
|
37845
38006
|
"storageMigration.movers": {
|
|
37846
38007
|
capName: "storage-migration",
|
|
37847
38008
|
capScope: "system",
|
|
@@ -39838,11 +39999,6 @@ Object.freeze({
|
|
|
39838
39999
|
form: "single",
|
|
39839
40000
|
optional: true
|
|
39840
40001
|
}],
|
|
39841
|
-
"pipelineAnalytics.getGroup": [{
|
|
39842
|
-
name: "deviceId",
|
|
39843
|
-
form: "single",
|
|
39844
|
-
optional: false
|
|
39845
|
-
}],
|
|
39846
40002
|
"pipelineAnalytics.getKeyEvents": [{
|
|
39847
40003
|
name: "deviceId",
|
|
39848
40004
|
form: "single",
|
|
@@ -39908,11 +40064,6 @@ Object.freeze({
|
|
|
39908
40064
|
form: "single",
|
|
39909
40065
|
optional: false
|
|
39910
40066
|
}],
|
|
39911
|
-
"pipelineAnalytics.listGroups": [{
|
|
39912
|
-
name: "deviceIds",
|
|
39913
|
-
form: "array",
|
|
39914
|
-
optional: false
|
|
39915
|
-
}],
|
|
39916
40067
|
"pipelineAnalytics.listOpsLog": [{
|
|
39917
40068
|
name: "deviceId",
|
|
39918
40069
|
form: "single",
|
|
@@ -39958,6 +40109,11 @@ Object.freeze({
|
|
|
39958
40109
|
form: "single",
|
|
39959
40110
|
optional: true
|
|
39960
40111
|
}],
|
|
40112
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
40113
|
+
name: "deviceIds",
|
|
40114
|
+
form: "array",
|
|
40115
|
+
optional: true
|
|
40116
|
+
}],
|
|
39961
40117
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
39962
40118
|
name: "deviceId",
|
|
39963
40119
|
form: "single",
|
|
@@ -40323,6 +40479,11 @@ Object.freeze({
|
|
|
40323
40479
|
form: "single",
|
|
40324
40480
|
optional: false
|
|
40325
40481
|
}],
|
|
40482
|
+
"recording.setDevicePlacement": [{
|
|
40483
|
+
name: "deviceId",
|
|
40484
|
+
form: "single",
|
|
40485
|
+
optional: false
|
|
40486
|
+
}],
|
|
40326
40487
|
"recording.startStorageMigrationMove": [{
|
|
40327
40488
|
name: "deviceId",
|
|
40328
40489
|
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.51",
|
|
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",
|