@camstack/addon-export-alexa 1.2.55 → 1.2.57
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 +236 -73
- package/dist/export-alexa.addon.mjs +236 -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()
|
|
@@ -15790,6 +15868,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
15790
15868
|
"device-offline",
|
|
15791
15869
|
"device-disabled",
|
|
15792
15870
|
"device-enabled",
|
|
15871
|
+
"device-battery-low",
|
|
15872
|
+
"device-battery-normal",
|
|
15793
15873
|
"stream-online",
|
|
15794
15874
|
"stream-offline",
|
|
15795
15875
|
"node-online",
|
|
@@ -19024,46 +19104,6 @@ var RecentTracksPageSchema = object({
|
|
|
19024
19104
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19025
19105
|
nextCursor: string().nullable()
|
|
19026
19106
|
});
|
|
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
19107
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19068
19108
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19069
19109
|
var KeyEventQueryInput = object({
|
|
@@ -19167,9 +19207,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19167
19207
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19168
19208
|
plates: number().int(),
|
|
19169
19209
|
/** 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()
|
|
19210
|
+
embeddings: number().int()
|
|
19173
19211
|
});
|
|
19174
19212
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19175
19213
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19339,6 +19377,47 @@ var RebuildStatusSchema = object({
|
|
|
19339
19377
|
/** Present when the pass ended by throwing. */
|
|
19340
19378
|
error: string().nullable()
|
|
19341
19379
|
});
|
|
19380
|
+
/**
|
|
19381
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19382
|
+
*
|
|
19383
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19384
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19385
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19386
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19387
|
+
*/
|
|
19388
|
+
var MediaReclaimStartResultSchema = object({
|
|
19389
|
+
started: boolean(),
|
|
19390
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19391
|
+
alreadyRunning: boolean()
|
|
19392
|
+
});
|
|
19393
|
+
var MediaReclaimInputSchema = object({
|
|
19394
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19395
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19396
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19397
|
+
restart: boolean().optional(),
|
|
19398
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19399
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19400
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19401
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19402
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19403
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19404
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19405
|
+
});
|
|
19406
|
+
var MediaReclaimStatusSchema = object({
|
|
19407
|
+
running: boolean(),
|
|
19408
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19409
|
+
totalExamined: number(),
|
|
19410
|
+
totalEligible: number(),
|
|
19411
|
+
totalReclaimed: number(),
|
|
19412
|
+
totalBytesReclaimed: number(),
|
|
19413
|
+
totalRefused: number(),
|
|
19414
|
+
/** Device+scope windows finished in this pass. */
|
|
19415
|
+
devicesDone: number(),
|
|
19416
|
+
complete: boolean().nullable(),
|
|
19417
|
+
startedAtMs: number().nullable(),
|
|
19418
|
+
finishedAtMs: number().nullable(),
|
|
19419
|
+
error: string().nullable()
|
|
19420
|
+
});
|
|
19342
19421
|
var ReplayFrameInputSchema = object({
|
|
19343
19422
|
timestamp: number(),
|
|
19344
19423
|
frame: PipelineRunResultBridge
|
|
@@ -19377,10 +19456,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19377
19456
|
* stationary registry). Default false: the timeline lists passages,
|
|
19378
19457
|
* not parking records (operator decision, 2026-08-15). */
|
|
19379
19458
|
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(), {
|
|
19459
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19384
19460
|
kind: "mutation",
|
|
19385
19461
|
auth: "admin"
|
|
19386
19462
|
}), 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 +19556,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19480
19556
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19481
19557
|
kind: "query",
|
|
19482
19558
|
auth: "admin"
|
|
19559
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19560
|
+
kind: "mutation",
|
|
19561
|
+
auth: "admin"
|
|
19562
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19563
|
+
kind: "query",
|
|
19564
|
+
auth: "admin"
|
|
19483
19565
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19484
19566
|
kind: "query",
|
|
19485
19567
|
auth: "admin"
|
|
@@ -21450,7 +21532,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21450
21532
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21451
21533
|
kind: "mutation",
|
|
21452
21534
|
auth: "admin"
|
|
21453
|
-
})
|
|
21535
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21536
|
+
kind: "mutation",
|
|
21537
|
+
auth: "admin"
|
|
21538
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21539
|
+
kind: "mutation",
|
|
21540
|
+
auth: "admin"
|
|
21541
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21454
21542
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21455
21543
|
providerId: string().min(1),
|
|
21456
21544
|
displayName: string().min(1),
|
|
@@ -26828,6 +26916,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
26828
26916
|
minMoveGb: number().min(0).optional()
|
|
26829
26917
|
});
|
|
26830
26918
|
/**
|
|
26919
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
26920
|
+
*
|
|
26921
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
26922
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
26923
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
26924
|
+
*/
|
|
26925
|
+
var RecordingDevicePlacementSchema = object({
|
|
26926
|
+
deviceId: number().int(),
|
|
26927
|
+
profile: string(),
|
|
26928
|
+
locationId: string()
|
|
26929
|
+
});
|
|
26930
|
+
var RecordingDevicePinSchema = object({
|
|
26931
|
+
deviceId: number().int(),
|
|
26932
|
+
/** Recordings-class location this camera is pinned to. */
|
|
26933
|
+
locationId: string()
|
|
26934
|
+
});
|
|
26935
|
+
var RecordingPlacementViewSchema = object({
|
|
26936
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
26937
|
+
pins: array(RecordingDevicePinSchema),
|
|
26938
|
+
defaultLocations: record(string(), string())
|
|
26939
|
+
});
|
|
26940
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
26941
|
+
deviceId: number().int(),
|
|
26942
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
26943
|
+
locationId: string().nullable()
|
|
26944
|
+
});
|
|
26945
|
+
/**
|
|
26831
26946
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
26832
26947
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
26833
26948
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -27053,6 +27168,12 @@ method(object({
|
|
|
27053
27168
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
27054
27169
|
kind: "mutation",
|
|
27055
27170
|
auth: "admin"
|
|
27171
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
27172
|
+
kind: "query",
|
|
27173
|
+
auth: "admin"
|
|
27174
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
27175
|
+
kind: "mutation",
|
|
27176
|
+
auth: "admin"
|
|
27056
27177
|
});
|
|
27057
27178
|
/**
|
|
27058
27179
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -30423,6 +30544,12 @@ Object.freeze({
|
|
|
30423
30544
|
addonId: null,
|
|
30424
30545
|
access: "delete"
|
|
30425
30546
|
},
|
|
30547
|
+
"deviceManager.renameLocation": {
|
|
30548
|
+
capName: "device-manager",
|
|
30549
|
+
capScope: "system",
|
|
30550
|
+
addonId: null,
|
|
30551
|
+
access: "create"
|
|
30552
|
+
},
|
|
30426
30553
|
"deviceManager.runDeviceAction": {
|
|
30427
30554
|
capName: "device-manager",
|
|
30428
30555
|
capScope: "system",
|
|
@@ -32115,19 +32242,19 @@ Object.freeze({
|
|
|
32115
32242
|
addonId: null,
|
|
32116
32243
|
access: "view"
|
|
32117
32244
|
},
|
|
32118
|
-
"pipelineAnalytics.
|
|
32245
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
32119
32246
|
capName: "pipeline-analytics",
|
|
32120
32247
|
capScope: "device",
|
|
32121
32248
|
addonId: null,
|
|
32122
32249
|
access: "view"
|
|
32123
32250
|
},
|
|
32124
|
-
"pipelineAnalytics.
|
|
32251
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
32125
32252
|
capName: "pipeline-analytics",
|
|
32126
32253
|
capScope: "device",
|
|
32127
32254
|
addonId: null,
|
|
32128
32255
|
access: "view"
|
|
32129
32256
|
},
|
|
32130
|
-
"pipelineAnalytics.
|
|
32257
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
32131
32258
|
capName: "pipeline-analytics",
|
|
32132
32259
|
capScope: "device",
|
|
32133
32260
|
addonId: null,
|
|
@@ -32217,12 +32344,6 @@ Object.freeze({
|
|
|
32217
32344
|
addonId: null,
|
|
32218
32345
|
access: "view"
|
|
32219
32346
|
},
|
|
32220
|
-
"pipelineAnalytics.listGroups": {
|
|
32221
|
-
capName: "pipeline-analytics",
|
|
32222
|
-
capScope: "device",
|
|
32223
|
-
addonId: null,
|
|
32224
|
-
access: "view"
|
|
32225
|
-
},
|
|
32226
32347
|
"pipelineAnalytics.listOpsLog": {
|
|
32227
32348
|
capName: "pipeline-analytics",
|
|
32228
32349
|
capScope: "device",
|
|
@@ -32307,6 +32428,12 @@ Object.freeze({
|
|
|
32307
32428
|
addonId: null,
|
|
32308
32429
|
access: "create"
|
|
32309
32430
|
},
|
|
32431
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
32432
|
+
capName: "pipeline-analytics",
|
|
32433
|
+
capScope: "device",
|
|
32434
|
+
addonId: null,
|
|
32435
|
+
access: "create"
|
|
32436
|
+
},
|
|
32310
32437
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
32311
32438
|
capName: "pipeline-analytics",
|
|
32312
32439
|
capScope: "device",
|
|
@@ -33231,6 +33358,12 @@ Object.freeze({
|
|
|
33231
33358
|
addonId: null,
|
|
33232
33359
|
access: "view"
|
|
33233
33360
|
},
|
|
33361
|
+
"recording.getPlacement": {
|
|
33362
|
+
capName: "recording",
|
|
33363
|
+
capScope: "system",
|
|
33364
|
+
addonId: null,
|
|
33365
|
+
access: "view"
|
|
33366
|
+
},
|
|
33234
33367
|
"recording.getPlaybackManifest": {
|
|
33235
33368
|
capName: "recording",
|
|
33236
33369
|
capScope: "system",
|
|
@@ -33357,6 +33490,12 @@ Object.freeze({
|
|
|
33357
33490
|
addonId: null,
|
|
33358
33491
|
access: "create"
|
|
33359
33492
|
},
|
|
33493
|
+
"recording.setDevicePlacement": {
|
|
33494
|
+
capName: "recording",
|
|
33495
|
+
capScope: "system",
|
|
33496
|
+
addonId: null,
|
|
33497
|
+
access: "create"
|
|
33498
|
+
},
|
|
33360
33499
|
"recording.startStorageMigrationMove": {
|
|
33361
33500
|
capName: "recording",
|
|
33362
33501
|
capScope: "system",
|
|
@@ -33801,12 +33940,36 @@ Object.freeze({
|
|
|
33801
33940
|
addonId: null,
|
|
33802
33941
|
access: "create"
|
|
33803
33942
|
},
|
|
33943
|
+
"storageMigration.cleanupCancel": {
|
|
33944
|
+
capName: "storage-migration",
|
|
33945
|
+
capScope: "system",
|
|
33946
|
+
addonId: null,
|
|
33947
|
+
access: "create"
|
|
33948
|
+
},
|
|
33949
|
+
"storageMigration.cleanupStart": {
|
|
33950
|
+
capName: "storage-migration",
|
|
33951
|
+
capScope: "system",
|
|
33952
|
+
addonId: null,
|
|
33953
|
+
access: "create"
|
|
33954
|
+
},
|
|
33955
|
+
"storageMigration.cleanupStatus": {
|
|
33956
|
+
capName: "storage-migration",
|
|
33957
|
+
capScope: "system",
|
|
33958
|
+
addonId: null,
|
|
33959
|
+
access: "view"
|
|
33960
|
+
},
|
|
33804
33961
|
"storageMigration.drain": {
|
|
33805
33962
|
capName: "storage-migration",
|
|
33806
33963
|
capScope: "system",
|
|
33807
33964
|
addonId: null,
|
|
33808
33965
|
access: "create"
|
|
33809
33966
|
},
|
|
33967
|
+
"storageMigration.history": {
|
|
33968
|
+
capName: "storage-migration",
|
|
33969
|
+
capScope: "system",
|
|
33970
|
+
addonId: null,
|
|
33971
|
+
access: "view"
|
|
33972
|
+
},
|
|
33810
33973
|
"storageMigration.movers": {
|
|
33811
33974
|
capName: "storage-migration",
|
|
33812
33975
|
capScope: "system",
|
|
@@ -35803,11 +35966,6 @@ Object.freeze({
|
|
|
35803
35966
|
form: "single",
|
|
35804
35967
|
optional: true
|
|
35805
35968
|
}],
|
|
35806
|
-
"pipelineAnalytics.getGroup": [{
|
|
35807
|
-
name: "deviceId",
|
|
35808
|
-
form: "single",
|
|
35809
|
-
optional: false
|
|
35810
|
-
}],
|
|
35811
35969
|
"pipelineAnalytics.getKeyEvents": [{
|
|
35812
35970
|
name: "deviceId",
|
|
35813
35971
|
form: "single",
|
|
@@ -35873,11 +36031,6 @@ Object.freeze({
|
|
|
35873
36031
|
form: "single",
|
|
35874
36032
|
optional: false
|
|
35875
36033
|
}],
|
|
35876
|
-
"pipelineAnalytics.listGroups": [{
|
|
35877
|
-
name: "deviceIds",
|
|
35878
|
-
form: "array",
|
|
35879
|
-
optional: false
|
|
35880
|
-
}],
|
|
35881
36034
|
"pipelineAnalytics.listOpsLog": [{
|
|
35882
36035
|
name: "deviceId",
|
|
35883
36036
|
form: "single",
|
|
@@ -35923,6 +36076,11 @@ Object.freeze({
|
|
|
35923
36076
|
form: "single",
|
|
35924
36077
|
optional: true
|
|
35925
36078
|
}],
|
|
36079
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
36080
|
+
name: "deviceIds",
|
|
36081
|
+
form: "array",
|
|
36082
|
+
optional: true
|
|
36083
|
+
}],
|
|
35926
36084
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
35927
36085
|
name: "deviceId",
|
|
35928
36086
|
form: "single",
|
|
@@ -36288,6 +36446,11 @@ Object.freeze({
|
|
|
36288
36446
|
form: "single",
|
|
36289
36447
|
optional: false
|
|
36290
36448
|
}],
|
|
36449
|
+
"recording.setDevicePlacement": [{
|
|
36450
|
+
name: "deviceId",
|
|
36451
|
+
form: "single",
|
|
36452
|
+
optional: false
|
|
36453
|
+
}],
|
|
36291
36454
|
"recording.startStorageMigrationMove": [{
|
|
36292
36455
|
name: "deviceId",
|
|
36293
36456
|
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()
|
|
@@ -15763,6 +15841,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
15763
15841
|
"device-offline",
|
|
15764
15842
|
"device-disabled",
|
|
15765
15843
|
"device-enabled",
|
|
15844
|
+
"device-battery-low",
|
|
15845
|
+
"device-battery-normal",
|
|
15766
15846
|
"stream-online",
|
|
15767
15847
|
"stream-offline",
|
|
15768
15848
|
"node-online",
|
|
@@ -18997,46 +19077,6 @@ var RecentTracksPageSchema = object({
|
|
|
18997
19077
|
/** Cursor for the next page, or null when this page is the last. */
|
|
18998
19078
|
nextCursor: string().nullable()
|
|
18999
19079
|
});
|
|
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
19080
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19041
19081
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19042
19082
|
var KeyEventQueryInput = object({
|
|
@@ -19140,9 +19180,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19140
19180
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19141
19181
|
plates: number().int(),
|
|
19142
19182
|
/** 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()
|
|
19183
|
+
embeddings: number().int()
|
|
19146
19184
|
});
|
|
19147
19185
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19148
19186
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19312,6 +19350,47 @@ var RebuildStatusSchema = object({
|
|
|
19312
19350
|
/** Present when the pass ended by throwing. */
|
|
19313
19351
|
error: string().nullable()
|
|
19314
19352
|
});
|
|
19353
|
+
/**
|
|
19354
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19355
|
+
*
|
|
19356
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19357
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19358
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19359
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19360
|
+
*/
|
|
19361
|
+
var MediaReclaimStartResultSchema = object({
|
|
19362
|
+
started: boolean(),
|
|
19363
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19364
|
+
alreadyRunning: boolean()
|
|
19365
|
+
});
|
|
19366
|
+
var MediaReclaimInputSchema = object({
|
|
19367
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19368
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19369
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19370
|
+
restart: boolean().optional(),
|
|
19371
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19372
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19373
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19374
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19375
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19376
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19377
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19378
|
+
});
|
|
19379
|
+
var MediaReclaimStatusSchema = object({
|
|
19380
|
+
running: boolean(),
|
|
19381
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19382
|
+
totalExamined: number(),
|
|
19383
|
+
totalEligible: number(),
|
|
19384
|
+
totalReclaimed: number(),
|
|
19385
|
+
totalBytesReclaimed: number(),
|
|
19386
|
+
totalRefused: number(),
|
|
19387
|
+
/** Device+scope windows finished in this pass. */
|
|
19388
|
+
devicesDone: number(),
|
|
19389
|
+
complete: boolean().nullable(),
|
|
19390
|
+
startedAtMs: number().nullable(),
|
|
19391
|
+
finishedAtMs: number().nullable(),
|
|
19392
|
+
error: string().nullable()
|
|
19393
|
+
});
|
|
19315
19394
|
var ReplayFrameInputSchema = object({
|
|
19316
19395
|
timestamp: number(),
|
|
19317
19396
|
frame: PipelineRunResultBridge
|
|
@@ -19350,10 +19429,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19350
19429
|
* stationary registry). Default false: the timeline lists passages,
|
|
19351
19430
|
* not parking records (operator decision, 2026-08-15). */
|
|
19352
19431
|
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(), {
|
|
19432
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19357
19433
|
kind: "mutation",
|
|
19358
19434
|
auth: "admin"
|
|
19359
19435
|
}), 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 +19529,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19453
19529
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19454
19530
|
kind: "query",
|
|
19455
19531
|
auth: "admin"
|
|
19532
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19533
|
+
kind: "mutation",
|
|
19534
|
+
auth: "admin"
|
|
19535
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19536
|
+
kind: "query",
|
|
19537
|
+
auth: "admin"
|
|
19456
19538
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19457
19539
|
kind: "query",
|
|
19458
19540
|
auth: "admin"
|
|
@@ -21423,7 +21505,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21423
21505
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21424
21506
|
kind: "mutation",
|
|
21425
21507
|
auth: "admin"
|
|
21426
|
-
})
|
|
21508
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21509
|
+
kind: "mutation",
|
|
21510
|
+
auth: "admin"
|
|
21511
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21512
|
+
kind: "mutation",
|
|
21513
|
+
auth: "admin"
|
|
21514
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21427
21515
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21428
21516
|
providerId: string().min(1),
|
|
21429
21517
|
displayName: string().min(1),
|
|
@@ -26801,6 +26889,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
26801
26889
|
minMoveGb: number().min(0).optional()
|
|
26802
26890
|
});
|
|
26803
26891
|
/**
|
|
26892
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
26893
|
+
*
|
|
26894
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
26895
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
26896
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
26897
|
+
*/
|
|
26898
|
+
var RecordingDevicePlacementSchema = object({
|
|
26899
|
+
deviceId: number().int(),
|
|
26900
|
+
profile: string(),
|
|
26901
|
+
locationId: string()
|
|
26902
|
+
});
|
|
26903
|
+
var RecordingDevicePinSchema = object({
|
|
26904
|
+
deviceId: number().int(),
|
|
26905
|
+
/** Recordings-class location this camera is pinned to. */
|
|
26906
|
+
locationId: string()
|
|
26907
|
+
});
|
|
26908
|
+
var RecordingPlacementViewSchema = object({
|
|
26909
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
26910
|
+
pins: array(RecordingDevicePinSchema),
|
|
26911
|
+
defaultLocations: record(string(), string())
|
|
26912
|
+
});
|
|
26913
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
26914
|
+
deviceId: number().int(),
|
|
26915
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
26916
|
+
locationId: string().nullable()
|
|
26917
|
+
});
|
|
26918
|
+
/**
|
|
26804
26919
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
26805
26920
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
26806
26921
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -27026,6 +27141,12 @@ method(object({
|
|
|
27026
27141
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
27027
27142
|
kind: "mutation",
|
|
27028
27143
|
auth: "admin"
|
|
27144
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
27145
|
+
kind: "query",
|
|
27146
|
+
auth: "admin"
|
|
27147
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
27148
|
+
kind: "mutation",
|
|
27149
|
+
auth: "admin"
|
|
27029
27150
|
});
|
|
27030
27151
|
/**
|
|
27031
27152
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -30396,6 +30517,12 @@ Object.freeze({
|
|
|
30396
30517
|
addonId: null,
|
|
30397
30518
|
access: "delete"
|
|
30398
30519
|
},
|
|
30520
|
+
"deviceManager.renameLocation": {
|
|
30521
|
+
capName: "device-manager",
|
|
30522
|
+
capScope: "system",
|
|
30523
|
+
addonId: null,
|
|
30524
|
+
access: "create"
|
|
30525
|
+
},
|
|
30399
30526
|
"deviceManager.runDeviceAction": {
|
|
30400
30527
|
capName: "device-manager",
|
|
30401
30528
|
capScope: "system",
|
|
@@ -32088,19 +32215,19 @@ Object.freeze({
|
|
|
32088
32215
|
addonId: null,
|
|
32089
32216
|
access: "view"
|
|
32090
32217
|
},
|
|
32091
|
-
"pipelineAnalytics.
|
|
32218
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
32092
32219
|
capName: "pipeline-analytics",
|
|
32093
32220
|
capScope: "device",
|
|
32094
32221
|
addonId: null,
|
|
32095
32222
|
access: "view"
|
|
32096
32223
|
},
|
|
32097
|
-
"pipelineAnalytics.
|
|
32224
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
32098
32225
|
capName: "pipeline-analytics",
|
|
32099
32226
|
capScope: "device",
|
|
32100
32227
|
addonId: null,
|
|
32101
32228
|
access: "view"
|
|
32102
32229
|
},
|
|
32103
|
-
"pipelineAnalytics.
|
|
32230
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
32104
32231
|
capName: "pipeline-analytics",
|
|
32105
32232
|
capScope: "device",
|
|
32106
32233
|
addonId: null,
|
|
@@ -32190,12 +32317,6 @@ Object.freeze({
|
|
|
32190
32317
|
addonId: null,
|
|
32191
32318
|
access: "view"
|
|
32192
32319
|
},
|
|
32193
|
-
"pipelineAnalytics.listGroups": {
|
|
32194
|
-
capName: "pipeline-analytics",
|
|
32195
|
-
capScope: "device",
|
|
32196
|
-
addonId: null,
|
|
32197
|
-
access: "view"
|
|
32198
|
-
},
|
|
32199
32320
|
"pipelineAnalytics.listOpsLog": {
|
|
32200
32321
|
capName: "pipeline-analytics",
|
|
32201
32322
|
capScope: "device",
|
|
@@ -32280,6 +32401,12 @@ Object.freeze({
|
|
|
32280
32401
|
addonId: null,
|
|
32281
32402
|
access: "create"
|
|
32282
32403
|
},
|
|
32404
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
32405
|
+
capName: "pipeline-analytics",
|
|
32406
|
+
capScope: "device",
|
|
32407
|
+
addonId: null,
|
|
32408
|
+
access: "create"
|
|
32409
|
+
},
|
|
32283
32410
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
32284
32411
|
capName: "pipeline-analytics",
|
|
32285
32412
|
capScope: "device",
|
|
@@ -33204,6 +33331,12 @@ Object.freeze({
|
|
|
33204
33331
|
addonId: null,
|
|
33205
33332
|
access: "view"
|
|
33206
33333
|
},
|
|
33334
|
+
"recording.getPlacement": {
|
|
33335
|
+
capName: "recording",
|
|
33336
|
+
capScope: "system",
|
|
33337
|
+
addonId: null,
|
|
33338
|
+
access: "view"
|
|
33339
|
+
},
|
|
33207
33340
|
"recording.getPlaybackManifest": {
|
|
33208
33341
|
capName: "recording",
|
|
33209
33342
|
capScope: "system",
|
|
@@ -33330,6 +33463,12 @@ Object.freeze({
|
|
|
33330
33463
|
addonId: null,
|
|
33331
33464
|
access: "create"
|
|
33332
33465
|
},
|
|
33466
|
+
"recording.setDevicePlacement": {
|
|
33467
|
+
capName: "recording",
|
|
33468
|
+
capScope: "system",
|
|
33469
|
+
addonId: null,
|
|
33470
|
+
access: "create"
|
|
33471
|
+
},
|
|
33333
33472
|
"recording.startStorageMigrationMove": {
|
|
33334
33473
|
capName: "recording",
|
|
33335
33474
|
capScope: "system",
|
|
@@ -33774,12 +33913,36 @@ Object.freeze({
|
|
|
33774
33913
|
addonId: null,
|
|
33775
33914
|
access: "create"
|
|
33776
33915
|
},
|
|
33916
|
+
"storageMigration.cleanupCancel": {
|
|
33917
|
+
capName: "storage-migration",
|
|
33918
|
+
capScope: "system",
|
|
33919
|
+
addonId: null,
|
|
33920
|
+
access: "create"
|
|
33921
|
+
},
|
|
33922
|
+
"storageMigration.cleanupStart": {
|
|
33923
|
+
capName: "storage-migration",
|
|
33924
|
+
capScope: "system",
|
|
33925
|
+
addonId: null,
|
|
33926
|
+
access: "create"
|
|
33927
|
+
},
|
|
33928
|
+
"storageMigration.cleanupStatus": {
|
|
33929
|
+
capName: "storage-migration",
|
|
33930
|
+
capScope: "system",
|
|
33931
|
+
addonId: null,
|
|
33932
|
+
access: "view"
|
|
33933
|
+
},
|
|
33777
33934
|
"storageMigration.drain": {
|
|
33778
33935
|
capName: "storage-migration",
|
|
33779
33936
|
capScope: "system",
|
|
33780
33937
|
addonId: null,
|
|
33781
33938
|
access: "create"
|
|
33782
33939
|
},
|
|
33940
|
+
"storageMigration.history": {
|
|
33941
|
+
capName: "storage-migration",
|
|
33942
|
+
capScope: "system",
|
|
33943
|
+
addonId: null,
|
|
33944
|
+
access: "view"
|
|
33945
|
+
},
|
|
33783
33946
|
"storageMigration.movers": {
|
|
33784
33947
|
capName: "storage-migration",
|
|
33785
33948
|
capScope: "system",
|
|
@@ -35776,11 +35939,6 @@ Object.freeze({
|
|
|
35776
35939
|
form: "single",
|
|
35777
35940
|
optional: true
|
|
35778
35941
|
}],
|
|
35779
|
-
"pipelineAnalytics.getGroup": [{
|
|
35780
|
-
name: "deviceId",
|
|
35781
|
-
form: "single",
|
|
35782
|
-
optional: false
|
|
35783
|
-
}],
|
|
35784
35942
|
"pipelineAnalytics.getKeyEvents": [{
|
|
35785
35943
|
name: "deviceId",
|
|
35786
35944
|
form: "single",
|
|
@@ -35846,11 +36004,6 @@ Object.freeze({
|
|
|
35846
36004
|
form: "single",
|
|
35847
36005
|
optional: false
|
|
35848
36006
|
}],
|
|
35849
|
-
"pipelineAnalytics.listGroups": [{
|
|
35850
|
-
name: "deviceIds",
|
|
35851
|
-
form: "array",
|
|
35852
|
-
optional: false
|
|
35853
|
-
}],
|
|
35854
36007
|
"pipelineAnalytics.listOpsLog": [{
|
|
35855
36008
|
name: "deviceId",
|
|
35856
36009
|
form: "single",
|
|
@@ -35896,6 +36049,11 @@ Object.freeze({
|
|
|
35896
36049
|
form: "single",
|
|
35897
36050
|
optional: true
|
|
35898
36051
|
}],
|
|
36052
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
36053
|
+
name: "deviceIds",
|
|
36054
|
+
form: "array",
|
|
36055
|
+
optional: true
|
|
36056
|
+
}],
|
|
35899
36057
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
35900
36058
|
name: "deviceId",
|
|
35901
36059
|
form: "single",
|
|
@@ -36261,6 +36419,11 @@ Object.freeze({
|
|
|
36261
36419
|
form: "single",
|
|
36262
36420
|
optional: false
|
|
36263
36421
|
}],
|
|
36422
|
+
"recording.setDevicePlacement": [{
|
|
36423
|
+
name: "deviceId",
|
|
36424
|
+
form: "single",
|
|
36425
|
+
optional: false
|
|
36426
|
+
}],
|
|
36264
36427
|
"recording.startStorageMigrationMove": [{
|
|
36265
36428
|
name: "deviceId",
|
|
36266
36429
|
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.57",
|
|
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",
|