@camstack/addon-export-alexa 1.2.55 → 1.2.56
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/export-alexa.addon.js +234 -73
- package/dist/export-alexa.addon.mjs +234 -73
- package/package.json +1 -1
|
@@ -8264,6 +8264,13 @@ var MediaRelocateModeSchema = _enum([
|
|
|
8264
8264
|
]);
|
|
8265
8265
|
var RelocateMediaInputSchema = object({
|
|
8266
8266
|
toLocationId: string(),
|
|
8267
|
+
/**
|
|
8268
|
+
* Restrict the pass to rows currently on this location. Omitted / `'*'` =
|
|
8269
|
+
* every row that is not already on `toLocationId` (the historical
|
|
8270
|
+
* behaviour). A named source is what a from→to migration needs: without it
|
|
8271
|
+
* "move events off disk 2" also emptied disk 1.
|
|
8272
|
+
*/
|
|
8273
|
+
fromLocationId: string().optional(),
|
|
8267
8274
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8268
8275
|
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8269
8276
|
mode: MediaRelocateModeSchema.optional()
|
|
@@ -8331,6 +8338,19 @@ var StorageMigrationDestinationsSchema = object({
|
|
|
8331
8338
|
galleryMedia: string().min(1).optional()
|
|
8332
8339
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8333
8340
|
/**
|
|
8341
|
+
* Optional named source per class. Omitted = the class's current default
|
|
8342
|
+
* (the historical behaviour). A named source that is NOT the default is a
|
|
8343
|
+
* drain of that disk: bytes move, the default stays, and the source is
|
|
8344
|
+
* disabled when the move finishes.
|
|
8345
|
+
*/
|
|
8346
|
+
var StorageMigrationSourcesSchema = object({
|
|
8347
|
+
recordings: string().min(1).optional(),
|
|
8348
|
+
recordingsLow: string().min(1).optional(),
|
|
8349
|
+
eventMedia: string().min(1).optional(),
|
|
8350
|
+
backups: string().min(1).optional(),
|
|
8351
|
+
galleryMedia: string().min(1).optional()
|
|
8352
|
+
}).optional();
|
|
8353
|
+
/**
|
|
8334
8354
|
* How a migration sequences the cutover against the byte move.
|
|
8335
8355
|
*
|
|
8336
8356
|
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
@@ -8352,6 +8372,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
|
8352
8372
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8353
8373
|
var StorageMigrationInputSchema = object({
|
|
8354
8374
|
destinations: StorageMigrationDestinationsSchema,
|
|
8375
|
+
/** Omitted = each class's current default. */
|
|
8376
|
+
sources: StorageMigrationSourcesSchema,
|
|
8355
8377
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8356
8378
|
/** Omitted = `blocking`, which stays the default. */
|
|
8357
8379
|
mode: StorageMigrationModeSchema.optional()
|
|
@@ -8431,6 +8453,13 @@ var StorageMigrationMoveSchema = object({
|
|
|
8431
8453
|
storageClass: StorageMigrationClassSchema,
|
|
8432
8454
|
fromLocationId: string(),
|
|
8433
8455
|
toLocationId: string(),
|
|
8456
|
+
/**
|
|
8457
|
+
* True when `from` was NOT the class default at plan time. The move still
|
|
8458
|
+
* copies bytes, but the default is left alone and the source is disabled
|
|
8459
|
+
* once the copy verifies. Absent on jobs planned before this field existed
|
|
8460
|
+
* — those jobs always repointed, which is `false`.
|
|
8461
|
+
*/
|
|
8462
|
+
freezeSource: boolean().optional(),
|
|
8434
8463
|
moverJobId: string().nullable(),
|
|
8435
8464
|
state: RelocateJobStateSchema.nullable(),
|
|
8436
8465
|
error: string().nullable(),
|
|
@@ -8444,6 +8473,7 @@ var StorageMigrationJobSchema = object({
|
|
|
8444
8473
|
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8445
8474
|
mode: StorageMigrationModeSchema,
|
|
8446
8475
|
destinations: StorageMigrationDestinationsSchema,
|
|
8476
|
+
sources: StorageMigrationSourcesSchema,
|
|
8447
8477
|
throttleMbps: number(),
|
|
8448
8478
|
moves: array(StorageMigrationMoveSchema),
|
|
8449
8479
|
pauseLeaseId: string().nullable(),
|
|
@@ -8469,6 +8499,7 @@ var StorageMigrationFindingSchema = object({
|
|
|
8469
8499
|
});
|
|
8470
8500
|
var StorageMigrationPlanSchema = object({
|
|
8471
8501
|
destinations: StorageMigrationDestinationsSchema,
|
|
8502
|
+
sources: StorageMigrationSourcesSchema,
|
|
8472
8503
|
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8473
8504
|
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8474
8505
|
* it. */
|
|
@@ -8476,7 +8507,8 @@ var StorageMigrationPlanSchema = object({
|
|
|
8476
8507
|
moves: array(object({
|
|
8477
8508
|
storageClass: StorageMigrationClassSchema,
|
|
8478
8509
|
fromLocationId: string(),
|
|
8479
|
-
toLocationId: string()
|
|
8510
|
+
toLocationId: string(),
|
|
8511
|
+
freezeSource: boolean().optional()
|
|
8480
8512
|
})),
|
|
8481
8513
|
findings: array(StorageMigrationFindingSchema)
|
|
8482
8514
|
});
|
|
@@ -8654,10 +8686,51 @@ var LedgerWalkReportSchema = object({
|
|
|
8654
8686
|
var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
|
|
8655
8687
|
var RelocatableMediaCountInputSchema = object({
|
|
8656
8688
|
toLocationId: string().min(1),
|
|
8689
|
+
/** Restrict the count to one source; omitted / `'*'` = every non-target row. */
|
|
8690
|
+
fromLocationId: string().optional(),
|
|
8657
8691
|
/** Omitted = `move`. */
|
|
8658
8692
|
mode: MediaRelocateModeSchema.optional()
|
|
8659
8693
|
});
|
|
8660
8694
|
/**
|
|
8695
|
+
* Operator cleanup of leftover analytics rows, optional debug media, and
|
|
8696
|
+
* ghost ledger entries on frozen footage locations.
|
|
8697
|
+
*
|
|
8698
|
+
* A pass is tens of minutes on a standing backlog. The hub method RETURNS
|
|
8699
|
+
* `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
|
|
8700
|
+
* is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
|
|
8701
|
+
* with no operator-visible status.
|
|
8702
|
+
*/
|
|
8703
|
+
var StorageCleanupPhaseSchema = _enum([
|
|
8704
|
+
"orphans",
|
|
8705
|
+
"debug-media",
|
|
8706
|
+
"ghost-ledger",
|
|
8707
|
+
"done",
|
|
8708
|
+
"failed",
|
|
8709
|
+
"cancelled"
|
|
8710
|
+
]);
|
|
8711
|
+
var StorageCleanupInputSchema = object({
|
|
8712
|
+
/** Also walk motion stills / track filmstrips. Off by default. */
|
|
8713
|
+
includeDebugMedia: boolean().optional() });
|
|
8714
|
+
var StorageCleanupJobSchema = object({
|
|
8715
|
+
jobId: string(),
|
|
8716
|
+
phase: StorageCleanupPhaseSchema,
|
|
8717
|
+
includeDebugMedia: boolean(),
|
|
8718
|
+
orphansReclaimed: number().int().nonnegative(),
|
|
8719
|
+
orphanBytesReclaimed: number().int().nonnegative(),
|
|
8720
|
+
debugMediaReclaimed: number().int().nonnegative(),
|
|
8721
|
+
debugMediaBytesReclaimed: number().int().nonnegative(),
|
|
8722
|
+
ghostsForgotten: number().int().nonnegative(),
|
|
8723
|
+
ghostBytesForgotten: number().int().nonnegative(),
|
|
8724
|
+
/** Short operator-facing line: current collection, pass, or location. */
|
|
8725
|
+
detail: string().nullable(),
|
|
8726
|
+
cancelRequested: boolean(),
|
|
8727
|
+
startedAt: number(),
|
|
8728
|
+
updatedAt: number(),
|
|
8729
|
+
finishedAt: number().nullable(),
|
|
8730
|
+
error: string().nullable()
|
|
8731
|
+
});
|
|
8732
|
+
var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
|
|
8733
|
+
/**
|
|
8661
8734
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
8662
8735
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
8663
8736
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -8685,11 +8758,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
|
|
|
8685
8758
|
* The default location for a type uses `id === <type>:default` by
|
|
8686
8759
|
* convention (the bare type ref like `'backups'` resolves to it).
|
|
8687
8760
|
*
|
|
8688
|
-
* `isSystem
|
|
8689
|
-
*
|
|
8690
|
-
*
|
|
8691
|
-
*
|
|
8692
|
-
* deleting it is rejected at the cap level.
|
|
8761
|
+
* `isSystem` is a legacy persisted flag. Seed still creates the initial
|
|
8762
|
+
* `<type>:default` locations; the flag is no longer a lock, a badge, or a
|
|
8763
|
+
* prune selector. New writes leave it false. Deletion is gated on uniqueness
|
|
8764
|
+
* / last-enabled, not on this bit.
|
|
8693
8765
|
*/
|
|
8694
8766
|
var StorageLocationSchema = object({
|
|
8695
8767
|
id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
|
|
@@ -13078,6 +13150,12 @@ method(object({
|
|
|
13078
13150
|
}), _void(), {
|
|
13079
13151
|
kind: "mutation",
|
|
13080
13152
|
auth: "admin"
|
|
13153
|
+
}), method(object({
|
|
13154
|
+
from: string(),
|
|
13155
|
+
to: string()
|
|
13156
|
+
}), object({ moved: number() }), {
|
|
13157
|
+
kind: "mutation",
|
|
13158
|
+
auth: "admin"
|
|
13081
13159
|
}), method(object({
|
|
13082
13160
|
deviceId: number(),
|
|
13083
13161
|
disabled: boolean()
|
|
@@ -19024,46 +19102,6 @@ var RecentTracksPageSchema = object({
|
|
|
19024
19102
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19025
19103
|
nextCursor: string().nullable()
|
|
19026
19104
|
});
|
|
19027
|
-
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
19028
|
-
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
19029
|
-
var AnalyticsGroupRecordSchema = object({
|
|
19030
|
-
id: string(),
|
|
19031
|
-
deviceId: number().int(),
|
|
19032
|
-
openedAt: number().int(),
|
|
19033
|
-
closedAt: number().int(),
|
|
19034
|
-
timestamp: number().int(),
|
|
19035
|
-
memberCount: number().int(),
|
|
19036
|
-
memberTrackIds: array(string()).readonly(),
|
|
19037
|
-
className: string(),
|
|
19038
|
-
classes: array(string()).readonly(),
|
|
19039
|
-
/** Relative event-media path, or null when the group has no picture yet. */
|
|
19040
|
-
mediaUrl: string().nullable(),
|
|
19041
|
-
singleton: boolean()
|
|
19042
|
-
});
|
|
19043
|
-
var AnalyticsGroupMemberSchema = object({
|
|
19044
|
-
trackId: string(),
|
|
19045
|
-
deviceId: number().int(),
|
|
19046
|
-
className: string(),
|
|
19047
|
-
firstSeen: number().int(),
|
|
19048
|
-
lastSeen: number().int(),
|
|
19049
|
-
mediaUrl: string().nullable()
|
|
19050
|
-
});
|
|
19051
|
-
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
19052
|
-
var ListGroupsQueryInput = object({
|
|
19053
|
-
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
19054
|
-
deviceIds: array(number()),
|
|
19055
|
-
/** Window lower bound on `closedAt` (inclusive). */
|
|
19056
|
-
since: number().optional(),
|
|
19057
|
-
/** Window upper bound on `openedAt` (inclusive). */
|
|
19058
|
-
until: number().optional(),
|
|
19059
|
-
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
19060
|
-
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
19061
|
-
cursor: string().optional()
|
|
19062
|
-
});
|
|
19063
|
-
var ListGroupsPageSchema = object({
|
|
19064
|
-
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
19065
|
-
nextCursor: string().nullable()
|
|
19066
|
-
});
|
|
19067
19105
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19068
19106
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19069
19107
|
var KeyEventQueryInput = object({
|
|
@@ -19167,9 +19205,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19167
19205
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19168
19206
|
plates: number().int(),
|
|
19169
19207
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
19170
|
-
embeddings: number().int()
|
|
19171
|
-
/** Group membership + group rows removed with their last member (best-effort). */
|
|
19172
|
-
groups: number().int()
|
|
19208
|
+
embeddings: number().int()
|
|
19173
19209
|
});
|
|
19174
19210
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19175
19211
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19339,6 +19375,47 @@ var RebuildStatusSchema = object({
|
|
|
19339
19375
|
/** Present when the pass ended by throwing. */
|
|
19340
19376
|
error: string().nullable()
|
|
19341
19377
|
});
|
|
19378
|
+
/**
|
|
19379
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19380
|
+
*
|
|
19381
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19382
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19383
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19384
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19385
|
+
*/
|
|
19386
|
+
var MediaReclaimStartResultSchema = object({
|
|
19387
|
+
started: boolean(),
|
|
19388
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19389
|
+
alreadyRunning: boolean()
|
|
19390
|
+
});
|
|
19391
|
+
var MediaReclaimInputSchema = object({
|
|
19392
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19393
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19394
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19395
|
+
restart: boolean().optional(),
|
|
19396
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19397
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19398
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19399
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19400
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19401
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19402
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19403
|
+
});
|
|
19404
|
+
var MediaReclaimStatusSchema = object({
|
|
19405
|
+
running: boolean(),
|
|
19406
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19407
|
+
totalExamined: number(),
|
|
19408
|
+
totalEligible: number(),
|
|
19409
|
+
totalReclaimed: number(),
|
|
19410
|
+
totalBytesReclaimed: number(),
|
|
19411
|
+
totalRefused: number(),
|
|
19412
|
+
/** Device+scope windows finished in this pass. */
|
|
19413
|
+
devicesDone: number(),
|
|
19414
|
+
complete: boolean().nullable(),
|
|
19415
|
+
startedAtMs: number().nullable(),
|
|
19416
|
+
finishedAtMs: number().nullable(),
|
|
19417
|
+
error: string().nullable()
|
|
19418
|
+
});
|
|
19342
19419
|
var ReplayFrameInputSchema = object({
|
|
19343
19420
|
timestamp: number(),
|
|
19344
19421
|
frame: PipelineRunResultBridge
|
|
@@ -19377,10 +19454,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19377
19454
|
* stationary registry). Default false: the timeline lists passages,
|
|
19378
19455
|
* not parking records (operator decision, 2026-08-15). */
|
|
19379
19456
|
includeStationary: boolean().optional()
|
|
19380
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
19381
|
-
deviceId: number(),
|
|
19382
|
-
groupId: string().min(1)
|
|
19383
|
-
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
19457
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19384
19458
|
kind: "mutation",
|
|
19385
19459
|
auth: "admin"
|
|
19386
19460
|
}), 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({
|
|
@@ -19480,6 +19554,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19480
19554
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19481
19555
|
kind: "query",
|
|
19482
19556
|
auth: "admin"
|
|
19557
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19558
|
+
kind: "mutation",
|
|
19559
|
+
auth: "admin"
|
|
19560
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19561
|
+
kind: "query",
|
|
19562
|
+
auth: "admin"
|
|
19483
19563
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19484
19564
|
kind: "query",
|
|
19485
19565
|
auth: "admin"
|
|
@@ -21450,7 +21530,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21450
21530
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21451
21531
|
kind: "mutation",
|
|
21452
21532
|
auth: "admin"
|
|
21453
|
-
})
|
|
21533
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21534
|
+
kind: "mutation",
|
|
21535
|
+
auth: "admin"
|
|
21536
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21537
|
+
kind: "mutation",
|
|
21538
|
+
auth: "admin"
|
|
21539
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21454
21540
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21455
21541
|
providerId: string().min(1),
|
|
21456
21542
|
displayName: string().min(1),
|
|
@@ -26828,6 +26914,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
26828
26914
|
minMoveGb: number().min(0).optional()
|
|
26829
26915
|
});
|
|
26830
26916
|
/**
|
|
26917
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
26918
|
+
*
|
|
26919
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
26920
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
26921
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
26922
|
+
*/
|
|
26923
|
+
var RecordingDevicePlacementSchema = object({
|
|
26924
|
+
deviceId: number().int(),
|
|
26925
|
+
profile: string(),
|
|
26926
|
+
locationId: string()
|
|
26927
|
+
});
|
|
26928
|
+
var RecordingDevicePinSchema = object({
|
|
26929
|
+
deviceId: number().int(),
|
|
26930
|
+
/** Recordings-class location this camera is pinned to. */
|
|
26931
|
+
locationId: string()
|
|
26932
|
+
});
|
|
26933
|
+
var RecordingPlacementViewSchema = object({
|
|
26934
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
26935
|
+
pins: array(RecordingDevicePinSchema),
|
|
26936
|
+
defaultLocations: record(string(), string())
|
|
26937
|
+
});
|
|
26938
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
26939
|
+
deviceId: number().int(),
|
|
26940
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
26941
|
+
locationId: string().nullable()
|
|
26942
|
+
});
|
|
26943
|
+
/**
|
|
26831
26944
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
26832
26945
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
26833
26946
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -27053,6 +27166,12 @@ method(object({
|
|
|
27053
27166
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
27054
27167
|
kind: "mutation",
|
|
27055
27168
|
auth: "admin"
|
|
27169
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
27170
|
+
kind: "query",
|
|
27171
|
+
auth: "admin"
|
|
27172
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
27173
|
+
kind: "mutation",
|
|
27174
|
+
auth: "admin"
|
|
27056
27175
|
});
|
|
27057
27176
|
/**
|
|
27058
27177
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -30423,6 +30542,12 @@ Object.freeze({
|
|
|
30423
30542
|
addonId: null,
|
|
30424
30543
|
access: "delete"
|
|
30425
30544
|
},
|
|
30545
|
+
"deviceManager.renameLocation": {
|
|
30546
|
+
capName: "device-manager",
|
|
30547
|
+
capScope: "system",
|
|
30548
|
+
addonId: null,
|
|
30549
|
+
access: "create"
|
|
30550
|
+
},
|
|
30426
30551
|
"deviceManager.runDeviceAction": {
|
|
30427
30552
|
capName: "device-manager",
|
|
30428
30553
|
capScope: "system",
|
|
@@ -32115,19 +32240,19 @@ Object.freeze({
|
|
|
32115
32240
|
addonId: null,
|
|
32116
32241
|
access: "view"
|
|
32117
32242
|
},
|
|
32118
|
-
"pipelineAnalytics.
|
|
32243
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
32119
32244
|
capName: "pipeline-analytics",
|
|
32120
32245
|
capScope: "device",
|
|
32121
32246
|
addonId: null,
|
|
32122
32247
|
access: "view"
|
|
32123
32248
|
},
|
|
32124
|
-
"pipelineAnalytics.
|
|
32249
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
32125
32250
|
capName: "pipeline-analytics",
|
|
32126
32251
|
capScope: "device",
|
|
32127
32252
|
addonId: null,
|
|
32128
32253
|
access: "view"
|
|
32129
32254
|
},
|
|
32130
|
-
"pipelineAnalytics.
|
|
32255
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
32131
32256
|
capName: "pipeline-analytics",
|
|
32132
32257
|
capScope: "device",
|
|
32133
32258
|
addonId: null,
|
|
@@ -32217,12 +32342,6 @@ Object.freeze({
|
|
|
32217
32342
|
addonId: null,
|
|
32218
32343
|
access: "view"
|
|
32219
32344
|
},
|
|
32220
|
-
"pipelineAnalytics.listGroups": {
|
|
32221
|
-
capName: "pipeline-analytics",
|
|
32222
|
-
capScope: "device",
|
|
32223
|
-
addonId: null,
|
|
32224
|
-
access: "view"
|
|
32225
|
-
},
|
|
32226
32345
|
"pipelineAnalytics.listOpsLog": {
|
|
32227
32346
|
capName: "pipeline-analytics",
|
|
32228
32347
|
capScope: "device",
|
|
@@ -32307,6 +32426,12 @@ Object.freeze({
|
|
|
32307
32426
|
addonId: null,
|
|
32308
32427
|
access: "create"
|
|
32309
32428
|
},
|
|
32429
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
32430
|
+
capName: "pipeline-analytics",
|
|
32431
|
+
capScope: "device",
|
|
32432
|
+
addonId: null,
|
|
32433
|
+
access: "create"
|
|
32434
|
+
},
|
|
32310
32435
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
32311
32436
|
capName: "pipeline-analytics",
|
|
32312
32437
|
capScope: "device",
|
|
@@ -33231,6 +33356,12 @@ Object.freeze({
|
|
|
33231
33356
|
addonId: null,
|
|
33232
33357
|
access: "view"
|
|
33233
33358
|
},
|
|
33359
|
+
"recording.getPlacement": {
|
|
33360
|
+
capName: "recording",
|
|
33361
|
+
capScope: "system",
|
|
33362
|
+
addonId: null,
|
|
33363
|
+
access: "view"
|
|
33364
|
+
},
|
|
33234
33365
|
"recording.getPlaybackManifest": {
|
|
33235
33366
|
capName: "recording",
|
|
33236
33367
|
capScope: "system",
|
|
@@ -33357,6 +33488,12 @@ Object.freeze({
|
|
|
33357
33488
|
addonId: null,
|
|
33358
33489
|
access: "create"
|
|
33359
33490
|
},
|
|
33491
|
+
"recording.setDevicePlacement": {
|
|
33492
|
+
capName: "recording",
|
|
33493
|
+
capScope: "system",
|
|
33494
|
+
addonId: null,
|
|
33495
|
+
access: "create"
|
|
33496
|
+
},
|
|
33360
33497
|
"recording.startStorageMigrationMove": {
|
|
33361
33498
|
capName: "recording",
|
|
33362
33499
|
capScope: "system",
|
|
@@ -33801,12 +33938,36 @@ Object.freeze({
|
|
|
33801
33938
|
addonId: null,
|
|
33802
33939
|
access: "create"
|
|
33803
33940
|
},
|
|
33941
|
+
"storageMigration.cleanupCancel": {
|
|
33942
|
+
capName: "storage-migration",
|
|
33943
|
+
capScope: "system",
|
|
33944
|
+
addonId: null,
|
|
33945
|
+
access: "create"
|
|
33946
|
+
},
|
|
33947
|
+
"storageMigration.cleanupStart": {
|
|
33948
|
+
capName: "storage-migration",
|
|
33949
|
+
capScope: "system",
|
|
33950
|
+
addonId: null,
|
|
33951
|
+
access: "create"
|
|
33952
|
+
},
|
|
33953
|
+
"storageMigration.cleanupStatus": {
|
|
33954
|
+
capName: "storage-migration",
|
|
33955
|
+
capScope: "system",
|
|
33956
|
+
addonId: null,
|
|
33957
|
+
access: "view"
|
|
33958
|
+
},
|
|
33804
33959
|
"storageMigration.drain": {
|
|
33805
33960
|
capName: "storage-migration",
|
|
33806
33961
|
capScope: "system",
|
|
33807
33962
|
addonId: null,
|
|
33808
33963
|
access: "create"
|
|
33809
33964
|
},
|
|
33965
|
+
"storageMigration.history": {
|
|
33966
|
+
capName: "storage-migration",
|
|
33967
|
+
capScope: "system",
|
|
33968
|
+
addonId: null,
|
|
33969
|
+
access: "view"
|
|
33970
|
+
},
|
|
33810
33971
|
"storageMigration.movers": {
|
|
33811
33972
|
capName: "storage-migration",
|
|
33812
33973
|
capScope: "system",
|
|
@@ -35803,11 +35964,6 @@ Object.freeze({
|
|
|
35803
35964
|
form: "single",
|
|
35804
35965
|
optional: true
|
|
35805
35966
|
}],
|
|
35806
|
-
"pipelineAnalytics.getGroup": [{
|
|
35807
|
-
name: "deviceId",
|
|
35808
|
-
form: "single",
|
|
35809
|
-
optional: false
|
|
35810
|
-
}],
|
|
35811
35967
|
"pipelineAnalytics.getKeyEvents": [{
|
|
35812
35968
|
name: "deviceId",
|
|
35813
35969
|
form: "single",
|
|
@@ -35873,11 +36029,6 @@ Object.freeze({
|
|
|
35873
36029
|
form: "single",
|
|
35874
36030
|
optional: false
|
|
35875
36031
|
}],
|
|
35876
|
-
"pipelineAnalytics.listGroups": [{
|
|
35877
|
-
name: "deviceIds",
|
|
35878
|
-
form: "array",
|
|
35879
|
-
optional: false
|
|
35880
|
-
}],
|
|
35881
36032
|
"pipelineAnalytics.listOpsLog": [{
|
|
35882
36033
|
name: "deviceId",
|
|
35883
36034
|
form: "single",
|
|
@@ -35923,6 +36074,11 @@ Object.freeze({
|
|
|
35923
36074
|
form: "single",
|
|
35924
36075
|
optional: true
|
|
35925
36076
|
}],
|
|
36077
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
36078
|
+
name: "deviceIds",
|
|
36079
|
+
form: "array",
|
|
36080
|
+
optional: true
|
|
36081
|
+
}],
|
|
35926
36082
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
35927
36083
|
name: "deviceId",
|
|
35928
36084
|
form: "single",
|
|
@@ -36288,6 +36444,11 @@ Object.freeze({
|
|
|
36288
36444
|
form: "single",
|
|
36289
36445
|
optional: false
|
|
36290
36446
|
}],
|
|
36447
|
+
"recording.setDevicePlacement": [{
|
|
36448
|
+
name: "deviceId",
|
|
36449
|
+
form: "single",
|
|
36450
|
+
optional: false
|
|
36451
|
+
}],
|
|
36291
36452
|
"recording.startStorageMigrationMove": [{
|
|
36292
36453
|
name: "deviceId",
|
|
36293
36454
|
form: "single",
|
|
@@ -8237,6 +8237,13 @@ var MediaRelocateModeSchema = _enum([
|
|
|
8237
8237
|
]);
|
|
8238
8238
|
var RelocateMediaInputSchema = object({
|
|
8239
8239
|
toLocationId: string(),
|
|
8240
|
+
/**
|
|
8241
|
+
* Restrict the pass to rows currently on this location. Omitted / `'*'` =
|
|
8242
|
+
* every row that is not already on `toLocationId` (the historical
|
|
8243
|
+
* behaviour). A named source is what a from→to migration needs: without it
|
|
8244
|
+
* "move events off disk 2" also emptied disk 1.
|
|
8245
|
+
*/
|
|
8246
|
+
fromLocationId: string().optional(),
|
|
8240
8247
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8241
8248
|
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8242
8249
|
mode: MediaRelocateModeSchema.optional()
|
|
@@ -8304,6 +8311,19 @@ var StorageMigrationDestinationsSchema = object({
|
|
|
8304
8311
|
galleryMedia: string().min(1).optional()
|
|
8305
8312
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8306
8313
|
/**
|
|
8314
|
+
* Optional named source per class. Omitted = the class's current default
|
|
8315
|
+
* (the historical behaviour). A named source that is NOT the default is a
|
|
8316
|
+
* drain of that disk: bytes move, the default stays, and the source is
|
|
8317
|
+
* disabled when the move finishes.
|
|
8318
|
+
*/
|
|
8319
|
+
var StorageMigrationSourcesSchema = object({
|
|
8320
|
+
recordings: string().min(1).optional(),
|
|
8321
|
+
recordingsLow: string().min(1).optional(),
|
|
8322
|
+
eventMedia: string().min(1).optional(),
|
|
8323
|
+
backups: string().min(1).optional(),
|
|
8324
|
+
galleryMedia: string().min(1).optional()
|
|
8325
|
+
}).optional();
|
|
8326
|
+
/**
|
|
8307
8327
|
* How a migration sequences the cutover against the byte move.
|
|
8308
8328
|
*
|
|
8309
8329
|
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
@@ -8325,6 +8345,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
|
8325
8345
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8326
8346
|
var StorageMigrationInputSchema = object({
|
|
8327
8347
|
destinations: StorageMigrationDestinationsSchema,
|
|
8348
|
+
/** Omitted = each class's current default. */
|
|
8349
|
+
sources: StorageMigrationSourcesSchema,
|
|
8328
8350
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8329
8351
|
/** Omitted = `blocking`, which stays the default. */
|
|
8330
8352
|
mode: StorageMigrationModeSchema.optional()
|
|
@@ -8404,6 +8426,13 @@ var StorageMigrationMoveSchema = object({
|
|
|
8404
8426
|
storageClass: StorageMigrationClassSchema,
|
|
8405
8427
|
fromLocationId: string(),
|
|
8406
8428
|
toLocationId: string(),
|
|
8429
|
+
/**
|
|
8430
|
+
* True when `from` was NOT the class default at plan time. The move still
|
|
8431
|
+
* copies bytes, but the default is left alone and the source is disabled
|
|
8432
|
+
* once the copy verifies. Absent on jobs planned before this field existed
|
|
8433
|
+
* — those jobs always repointed, which is `false`.
|
|
8434
|
+
*/
|
|
8435
|
+
freezeSource: boolean().optional(),
|
|
8407
8436
|
moverJobId: string().nullable(),
|
|
8408
8437
|
state: RelocateJobStateSchema.nullable(),
|
|
8409
8438
|
error: string().nullable(),
|
|
@@ -8417,6 +8446,7 @@ var StorageMigrationJobSchema = object({
|
|
|
8417
8446
|
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8418
8447
|
mode: StorageMigrationModeSchema,
|
|
8419
8448
|
destinations: StorageMigrationDestinationsSchema,
|
|
8449
|
+
sources: StorageMigrationSourcesSchema,
|
|
8420
8450
|
throttleMbps: number(),
|
|
8421
8451
|
moves: array(StorageMigrationMoveSchema),
|
|
8422
8452
|
pauseLeaseId: string().nullable(),
|
|
@@ -8442,6 +8472,7 @@ var StorageMigrationFindingSchema = object({
|
|
|
8442
8472
|
});
|
|
8443
8473
|
var StorageMigrationPlanSchema = object({
|
|
8444
8474
|
destinations: StorageMigrationDestinationsSchema,
|
|
8475
|
+
sources: StorageMigrationSourcesSchema,
|
|
8445
8476
|
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8446
8477
|
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8447
8478
|
* it. */
|
|
@@ -8449,7 +8480,8 @@ var StorageMigrationPlanSchema = object({
|
|
|
8449
8480
|
moves: array(object({
|
|
8450
8481
|
storageClass: StorageMigrationClassSchema,
|
|
8451
8482
|
fromLocationId: string(),
|
|
8452
|
-
toLocationId: string()
|
|
8483
|
+
toLocationId: string(),
|
|
8484
|
+
freezeSource: boolean().optional()
|
|
8453
8485
|
})),
|
|
8454
8486
|
findings: array(StorageMigrationFindingSchema)
|
|
8455
8487
|
});
|
|
@@ -8627,10 +8659,51 @@ var LedgerWalkReportSchema = object({
|
|
|
8627
8659
|
var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
|
|
8628
8660
|
var RelocatableMediaCountInputSchema = object({
|
|
8629
8661
|
toLocationId: string().min(1),
|
|
8662
|
+
/** Restrict the count to one source; omitted / `'*'` = every non-target row. */
|
|
8663
|
+
fromLocationId: string().optional(),
|
|
8630
8664
|
/** Omitted = `move`. */
|
|
8631
8665
|
mode: MediaRelocateModeSchema.optional()
|
|
8632
8666
|
});
|
|
8633
8667
|
/**
|
|
8668
|
+
* Operator cleanup of leftover analytics rows, optional debug media, and
|
|
8669
|
+
* ghost ledger entries on frozen footage locations.
|
|
8670
|
+
*
|
|
8671
|
+
* A pass is tens of minutes on a standing backlog. The hub method RETURNS
|
|
8672
|
+
* `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
|
|
8673
|
+
* is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
|
|
8674
|
+
* with no operator-visible status.
|
|
8675
|
+
*/
|
|
8676
|
+
var StorageCleanupPhaseSchema = _enum([
|
|
8677
|
+
"orphans",
|
|
8678
|
+
"debug-media",
|
|
8679
|
+
"ghost-ledger",
|
|
8680
|
+
"done",
|
|
8681
|
+
"failed",
|
|
8682
|
+
"cancelled"
|
|
8683
|
+
]);
|
|
8684
|
+
var StorageCleanupInputSchema = object({
|
|
8685
|
+
/** Also walk motion stills / track filmstrips. Off by default. */
|
|
8686
|
+
includeDebugMedia: boolean().optional() });
|
|
8687
|
+
var StorageCleanupJobSchema = object({
|
|
8688
|
+
jobId: string(),
|
|
8689
|
+
phase: StorageCleanupPhaseSchema,
|
|
8690
|
+
includeDebugMedia: boolean(),
|
|
8691
|
+
orphansReclaimed: number().int().nonnegative(),
|
|
8692
|
+
orphanBytesReclaimed: number().int().nonnegative(),
|
|
8693
|
+
debugMediaReclaimed: number().int().nonnegative(),
|
|
8694
|
+
debugMediaBytesReclaimed: number().int().nonnegative(),
|
|
8695
|
+
ghostsForgotten: number().int().nonnegative(),
|
|
8696
|
+
ghostBytesForgotten: number().int().nonnegative(),
|
|
8697
|
+
/** Short operator-facing line: current collection, pass, or location. */
|
|
8698
|
+
detail: string().nullable(),
|
|
8699
|
+
cancelRequested: boolean(),
|
|
8700
|
+
startedAt: number(),
|
|
8701
|
+
updatedAt: number(),
|
|
8702
|
+
finishedAt: number().nullable(),
|
|
8703
|
+
error: string().nullable()
|
|
8704
|
+
});
|
|
8705
|
+
var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
|
|
8706
|
+
/**
|
|
8634
8707
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
8635
8708
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
8636
8709
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -8658,11 +8731,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
|
|
|
8658
8731
|
* The default location for a type uses `id === <type>:default` by
|
|
8659
8732
|
* convention (the bare type ref like `'backups'` resolves to it).
|
|
8660
8733
|
*
|
|
8661
|
-
* `isSystem
|
|
8662
|
-
*
|
|
8663
|
-
*
|
|
8664
|
-
*
|
|
8665
|
-
* deleting it is rejected at the cap level.
|
|
8734
|
+
* `isSystem` is a legacy persisted flag. Seed still creates the initial
|
|
8735
|
+
* `<type>:default` locations; the flag is no longer a lock, a badge, or a
|
|
8736
|
+
* prune selector. New writes leave it false. Deletion is gated on uniqueness
|
|
8737
|
+
* / last-enabled, not on this bit.
|
|
8666
8738
|
*/
|
|
8667
8739
|
var StorageLocationSchema = object({
|
|
8668
8740
|
id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
|
|
@@ -13051,6 +13123,12 @@ method(object({
|
|
|
13051
13123
|
}), _void(), {
|
|
13052
13124
|
kind: "mutation",
|
|
13053
13125
|
auth: "admin"
|
|
13126
|
+
}), method(object({
|
|
13127
|
+
from: string(),
|
|
13128
|
+
to: string()
|
|
13129
|
+
}), object({ moved: number() }), {
|
|
13130
|
+
kind: "mutation",
|
|
13131
|
+
auth: "admin"
|
|
13054
13132
|
}), method(object({
|
|
13055
13133
|
deviceId: number(),
|
|
13056
13134
|
disabled: boolean()
|
|
@@ -18997,46 +19075,6 @@ var RecentTracksPageSchema = object({
|
|
|
18997
19075
|
/** Cursor for the next page, or null when this page is the last. */
|
|
18998
19076
|
nextCursor: string().nullable()
|
|
18999
19077
|
});
|
|
19000
|
-
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
19001
|
-
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
19002
|
-
var AnalyticsGroupRecordSchema = object({
|
|
19003
|
-
id: string(),
|
|
19004
|
-
deviceId: number().int(),
|
|
19005
|
-
openedAt: number().int(),
|
|
19006
|
-
closedAt: number().int(),
|
|
19007
|
-
timestamp: number().int(),
|
|
19008
|
-
memberCount: number().int(),
|
|
19009
|
-
memberTrackIds: array(string()).readonly(),
|
|
19010
|
-
className: string(),
|
|
19011
|
-
classes: array(string()).readonly(),
|
|
19012
|
-
/** Relative event-media path, or null when the group has no picture yet. */
|
|
19013
|
-
mediaUrl: string().nullable(),
|
|
19014
|
-
singleton: boolean()
|
|
19015
|
-
});
|
|
19016
|
-
var AnalyticsGroupMemberSchema = object({
|
|
19017
|
-
trackId: string(),
|
|
19018
|
-
deviceId: number().int(),
|
|
19019
|
-
className: string(),
|
|
19020
|
-
firstSeen: number().int(),
|
|
19021
|
-
lastSeen: number().int(),
|
|
19022
|
-
mediaUrl: string().nullable()
|
|
19023
|
-
});
|
|
19024
|
-
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
19025
|
-
var ListGroupsQueryInput = object({
|
|
19026
|
-
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
19027
|
-
deviceIds: array(number()),
|
|
19028
|
-
/** Window lower bound on `closedAt` (inclusive). */
|
|
19029
|
-
since: number().optional(),
|
|
19030
|
-
/** Window upper bound on `openedAt` (inclusive). */
|
|
19031
|
-
until: number().optional(),
|
|
19032
|
-
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
19033
|
-
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
19034
|
-
cursor: string().optional()
|
|
19035
|
-
});
|
|
19036
|
-
var ListGroupsPageSchema = object({
|
|
19037
|
-
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
19038
|
-
nextCursor: string().nullable()
|
|
19039
|
-
});
|
|
19040
19078
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19041
19079
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19042
19080
|
var KeyEventQueryInput = object({
|
|
@@ -19140,9 +19178,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19140
19178
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19141
19179
|
plates: number().int(),
|
|
19142
19180
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
19143
|
-
embeddings: number().int()
|
|
19144
|
-
/** Group membership + group rows removed with their last member (best-effort). */
|
|
19145
|
-
groups: number().int()
|
|
19181
|
+
embeddings: number().int()
|
|
19146
19182
|
});
|
|
19147
19183
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19148
19184
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19312,6 +19348,47 @@ var RebuildStatusSchema = object({
|
|
|
19312
19348
|
/** Present when the pass ended by throwing. */
|
|
19313
19349
|
error: string().nullable()
|
|
19314
19350
|
});
|
|
19351
|
+
/**
|
|
19352
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19353
|
+
*
|
|
19354
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19355
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19356
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19357
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19358
|
+
*/
|
|
19359
|
+
var MediaReclaimStartResultSchema = object({
|
|
19360
|
+
started: boolean(),
|
|
19361
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19362
|
+
alreadyRunning: boolean()
|
|
19363
|
+
});
|
|
19364
|
+
var MediaReclaimInputSchema = object({
|
|
19365
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19366
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19367
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19368
|
+
restart: boolean().optional(),
|
|
19369
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19370
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19371
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19372
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19373
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19374
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19375
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19376
|
+
});
|
|
19377
|
+
var MediaReclaimStatusSchema = object({
|
|
19378
|
+
running: boolean(),
|
|
19379
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19380
|
+
totalExamined: number(),
|
|
19381
|
+
totalEligible: number(),
|
|
19382
|
+
totalReclaimed: number(),
|
|
19383
|
+
totalBytesReclaimed: number(),
|
|
19384
|
+
totalRefused: number(),
|
|
19385
|
+
/** Device+scope windows finished in this pass. */
|
|
19386
|
+
devicesDone: number(),
|
|
19387
|
+
complete: boolean().nullable(),
|
|
19388
|
+
startedAtMs: number().nullable(),
|
|
19389
|
+
finishedAtMs: number().nullable(),
|
|
19390
|
+
error: string().nullable()
|
|
19391
|
+
});
|
|
19315
19392
|
var ReplayFrameInputSchema = object({
|
|
19316
19393
|
timestamp: number(),
|
|
19317
19394
|
frame: PipelineRunResultBridge
|
|
@@ -19350,10 +19427,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19350
19427
|
* stationary registry). Default false: the timeline lists passages,
|
|
19351
19428
|
* not parking records (operator decision, 2026-08-15). */
|
|
19352
19429
|
includeStationary: boolean().optional()
|
|
19353
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
19354
|
-
deviceId: number(),
|
|
19355
|
-
groupId: string().min(1)
|
|
19356
|
-
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
19430
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19357
19431
|
kind: "mutation",
|
|
19358
19432
|
auth: "admin"
|
|
19359
19433
|
}), 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({
|
|
@@ -19453,6 +19527,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19453
19527
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19454
19528
|
kind: "query",
|
|
19455
19529
|
auth: "admin"
|
|
19530
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19531
|
+
kind: "mutation",
|
|
19532
|
+
auth: "admin"
|
|
19533
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19534
|
+
kind: "query",
|
|
19535
|
+
auth: "admin"
|
|
19456
19536
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19457
19537
|
kind: "query",
|
|
19458
19538
|
auth: "admin"
|
|
@@ -21423,7 +21503,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21423
21503
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21424
21504
|
kind: "mutation",
|
|
21425
21505
|
auth: "admin"
|
|
21426
|
-
})
|
|
21506
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21507
|
+
kind: "mutation",
|
|
21508
|
+
auth: "admin"
|
|
21509
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21510
|
+
kind: "mutation",
|
|
21511
|
+
auth: "admin"
|
|
21512
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21427
21513
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21428
21514
|
providerId: string().min(1),
|
|
21429
21515
|
displayName: string().min(1),
|
|
@@ -26801,6 +26887,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
26801
26887
|
minMoveGb: number().min(0).optional()
|
|
26802
26888
|
});
|
|
26803
26889
|
/**
|
|
26890
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
26891
|
+
*
|
|
26892
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
26893
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
26894
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
26895
|
+
*/
|
|
26896
|
+
var RecordingDevicePlacementSchema = object({
|
|
26897
|
+
deviceId: number().int(),
|
|
26898
|
+
profile: string(),
|
|
26899
|
+
locationId: string()
|
|
26900
|
+
});
|
|
26901
|
+
var RecordingDevicePinSchema = object({
|
|
26902
|
+
deviceId: number().int(),
|
|
26903
|
+
/** Recordings-class location this camera is pinned to. */
|
|
26904
|
+
locationId: string()
|
|
26905
|
+
});
|
|
26906
|
+
var RecordingPlacementViewSchema = object({
|
|
26907
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
26908
|
+
pins: array(RecordingDevicePinSchema),
|
|
26909
|
+
defaultLocations: record(string(), string())
|
|
26910
|
+
});
|
|
26911
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
26912
|
+
deviceId: number().int(),
|
|
26913
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
26914
|
+
locationId: string().nullable()
|
|
26915
|
+
});
|
|
26916
|
+
/**
|
|
26804
26917
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
26805
26918
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
26806
26919
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -27026,6 +27139,12 @@ method(object({
|
|
|
27026
27139
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
27027
27140
|
kind: "mutation",
|
|
27028
27141
|
auth: "admin"
|
|
27142
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
27143
|
+
kind: "query",
|
|
27144
|
+
auth: "admin"
|
|
27145
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
27146
|
+
kind: "mutation",
|
|
27147
|
+
auth: "admin"
|
|
27029
27148
|
});
|
|
27030
27149
|
/**
|
|
27031
27150
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -30396,6 +30515,12 @@ Object.freeze({
|
|
|
30396
30515
|
addonId: null,
|
|
30397
30516
|
access: "delete"
|
|
30398
30517
|
},
|
|
30518
|
+
"deviceManager.renameLocation": {
|
|
30519
|
+
capName: "device-manager",
|
|
30520
|
+
capScope: "system",
|
|
30521
|
+
addonId: null,
|
|
30522
|
+
access: "create"
|
|
30523
|
+
},
|
|
30399
30524
|
"deviceManager.runDeviceAction": {
|
|
30400
30525
|
capName: "device-manager",
|
|
30401
30526
|
capScope: "system",
|
|
@@ -32088,19 +32213,19 @@ Object.freeze({
|
|
|
32088
32213
|
addonId: null,
|
|
32089
32214
|
access: "view"
|
|
32090
32215
|
},
|
|
32091
|
-
"pipelineAnalytics.
|
|
32216
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
32092
32217
|
capName: "pipeline-analytics",
|
|
32093
32218
|
capScope: "device",
|
|
32094
32219
|
addonId: null,
|
|
32095
32220
|
access: "view"
|
|
32096
32221
|
},
|
|
32097
|
-
"pipelineAnalytics.
|
|
32222
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
32098
32223
|
capName: "pipeline-analytics",
|
|
32099
32224
|
capScope: "device",
|
|
32100
32225
|
addonId: null,
|
|
32101
32226
|
access: "view"
|
|
32102
32227
|
},
|
|
32103
|
-
"pipelineAnalytics.
|
|
32228
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
32104
32229
|
capName: "pipeline-analytics",
|
|
32105
32230
|
capScope: "device",
|
|
32106
32231
|
addonId: null,
|
|
@@ -32190,12 +32315,6 @@ Object.freeze({
|
|
|
32190
32315
|
addonId: null,
|
|
32191
32316
|
access: "view"
|
|
32192
32317
|
},
|
|
32193
|
-
"pipelineAnalytics.listGroups": {
|
|
32194
|
-
capName: "pipeline-analytics",
|
|
32195
|
-
capScope: "device",
|
|
32196
|
-
addonId: null,
|
|
32197
|
-
access: "view"
|
|
32198
|
-
},
|
|
32199
32318
|
"pipelineAnalytics.listOpsLog": {
|
|
32200
32319
|
capName: "pipeline-analytics",
|
|
32201
32320
|
capScope: "device",
|
|
@@ -32280,6 +32399,12 @@ Object.freeze({
|
|
|
32280
32399
|
addonId: null,
|
|
32281
32400
|
access: "create"
|
|
32282
32401
|
},
|
|
32402
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
32403
|
+
capName: "pipeline-analytics",
|
|
32404
|
+
capScope: "device",
|
|
32405
|
+
addonId: null,
|
|
32406
|
+
access: "create"
|
|
32407
|
+
},
|
|
32283
32408
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
32284
32409
|
capName: "pipeline-analytics",
|
|
32285
32410
|
capScope: "device",
|
|
@@ -33204,6 +33329,12 @@ Object.freeze({
|
|
|
33204
33329
|
addonId: null,
|
|
33205
33330
|
access: "view"
|
|
33206
33331
|
},
|
|
33332
|
+
"recording.getPlacement": {
|
|
33333
|
+
capName: "recording",
|
|
33334
|
+
capScope: "system",
|
|
33335
|
+
addonId: null,
|
|
33336
|
+
access: "view"
|
|
33337
|
+
},
|
|
33207
33338
|
"recording.getPlaybackManifest": {
|
|
33208
33339
|
capName: "recording",
|
|
33209
33340
|
capScope: "system",
|
|
@@ -33330,6 +33461,12 @@ Object.freeze({
|
|
|
33330
33461
|
addonId: null,
|
|
33331
33462
|
access: "create"
|
|
33332
33463
|
},
|
|
33464
|
+
"recording.setDevicePlacement": {
|
|
33465
|
+
capName: "recording",
|
|
33466
|
+
capScope: "system",
|
|
33467
|
+
addonId: null,
|
|
33468
|
+
access: "create"
|
|
33469
|
+
},
|
|
33333
33470
|
"recording.startStorageMigrationMove": {
|
|
33334
33471
|
capName: "recording",
|
|
33335
33472
|
capScope: "system",
|
|
@@ -33774,12 +33911,36 @@ Object.freeze({
|
|
|
33774
33911
|
addonId: null,
|
|
33775
33912
|
access: "create"
|
|
33776
33913
|
},
|
|
33914
|
+
"storageMigration.cleanupCancel": {
|
|
33915
|
+
capName: "storage-migration",
|
|
33916
|
+
capScope: "system",
|
|
33917
|
+
addonId: null,
|
|
33918
|
+
access: "create"
|
|
33919
|
+
},
|
|
33920
|
+
"storageMigration.cleanupStart": {
|
|
33921
|
+
capName: "storage-migration",
|
|
33922
|
+
capScope: "system",
|
|
33923
|
+
addonId: null,
|
|
33924
|
+
access: "create"
|
|
33925
|
+
},
|
|
33926
|
+
"storageMigration.cleanupStatus": {
|
|
33927
|
+
capName: "storage-migration",
|
|
33928
|
+
capScope: "system",
|
|
33929
|
+
addonId: null,
|
|
33930
|
+
access: "view"
|
|
33931
|
+
},
|
|
33777
33932
|
"storageMigration.drain": {
|
|
33778
33933
|
capName: "storage-migration",
|
|
33779
33934
|
capScope: "system",
|
|
33780
33935
|
addonId: null,
|
|
33781
33936
|
access: "create"
|
|
33782
33937
|
},
|
|
33938
|
+
"storageMigration.history": {
|
|
33939
|
+
capName: "storage-migration",
|
|
33940
|
+
capScope: "system",
|
|
33941
|
+
addonId: null,
|
|
33942
|
+
access: "view"
|
|
33943
|
+
},
|
|
33783
33944
|
"storageMigration.movers": {
|
|
33784
33945
|
capName: "storage-migration",
|
|
33785
33946
|
capScope: "system",
|
|
@@ -35776,11 +35937,6 @@ Object.freeze({
|
|
|
35776
35937
|
form: "single",
|
|
35777
35938
|
optional: true
|
|
35778
35939
|
}],
|
|
35779
|
-
"pipelineAnalytics.getGroup": [{
|
|
35780
|
-
name: "deviceId",
|
|
35781
|
-
form: "single",
|
|
35782
|
-
optional: false
|
|
35783
|
-
}],
|
|
35784
35940
|
"pipelineAnalytics.getKeyEvents": [{
|
|
35785
35941
|
name: "deviceId",
|
|
35786
35942
|
form: "single",
|
|
@@ -35846,11 +36002,6 @@ Object.freeze({
|
|
|
35846
36002
|
form: "single",
|
|
35847
36003
|
optional: false
|
|
35848
36004
|
}],
|
|
35849
|
-
"pipelineAnalytics.listGroups": [{
|
|
35850
|
-
name: "deviceIds",
|
|
35851
|
-
form: "array",
|
|
35852
|
-
optional: false
|
|
35853
|
-
}],
|
|
35854
36005
|
"pipelineAnalytics.listOpsLog": [{
|
|
35855
36006
|
name: "deviceId",
|
|
35856
36007
|
form: "single",
|
|
@@ -35896,6 +36047,11 @@ Object.freeze({
|
|
|
35896
36047
|
form: "single",
|
|
35897
36048
|
optional: true
|
|
35898
36049
|
}],
|
|
36050
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
36051
|
+
name: "deviceIds",
|
|
36052
|
+
form: "array",
|
|
36053
|
+
optional: true
|
|
36054
|
+
}],
|
|
35899
36055
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
35900
36056
|
name: "deviceId",
|
|
35901
36057
|
form: "single",
|
|
@@ -36261,6 +36417,11 @@ Object.freeze({
|
|
|
36261
36417
|
form: "single",
|
|
36262
36418
|
optional: false
|
|
36263
36419
|
}],
|
|
36420
|
+
"recording.setDevicePlacement": [{
|
|
36421
|
+
name: "deviceId",
|
|
36422
|
+
form: "single",
|
|
36423
|
+
optional: false
|
|
36424
|
+
}],
|
|
36264
36425
|
"recording.startStorageMigrationMove": [{
|
|
36265
36426
|
name: "deviceId",
|
|
36266
36427
|
form: "single",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-export-alexa",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.56",
|
|
4
4
|
"description": "Alexa Smart Home Skill export — hub-side OAuth provider + directive handler. The companion AWS Lambda forwards Alexa directives to this addon's /addon/export-alexa/directive endpoint.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|