@camstack/addon-import-alexa 0.2.48 → 0.2.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/addon.js +234 -73
- package/dist/addon.mjs +234 -73
- package/package.json +1 -1
package/dist/addon.js
CHANGED
|
@@ -8254,6 +8254,13 @@ var MediaRelocateModeSchema = _enum([
|
|
|
8254
8254
|
]);
|
|
8255
8255
|
var RelocateMediaInputSchema = object({
|
|
8256
8256
|
toLocationId: string(),
|
|
8257
|
+
/**
|
|
8258
|
+
* Restrict the pass to rows currently on this location. Omitted / `'*'` =
|
|
8259
|
+
* every row that is not already on `toLocationId` (the historical
|
|
8260
|
+
* behaviour). A named source is what a from→to migration needs: without it
|
|
8261
|
+
* "move events off disk 2" also emptied disk 1.
|
|
8262
|
+
*/
|
|
8263
|
+
fromLocationId: string().optional(),
|
|
8257
8264
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8258
8265
|
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8259
8266
|
mode: MediaRelocateModeSchema.optional()
|
|
@@ -8321,6 +8328,19 @@ var StorageMigrationDestinationsSchema = object({
|
|
|
8321
8328
|
galleryMedia: string().min(1).optional()
|
|
8322
8329
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8323
8330
|
/**
|
|
8331
|
+
* Optional named source per class. Omitted = the class's current default
|
|
8332
|
+
* (the historical behaviour). A named source that is NOT the default is a
|
|
8333
|
+
* drain of that disk: bytes move, the default stays, and the source is
|
|
8334
|
+
* disabled when the move finishes.
|
|
8335
|
+
*/
|
|
8336
|
+
var StorageMigrationSourcesSchema = object({
|
|
8337
|
+
recordings: string().min(1).optional(),
|
|
8338
|
+
recordingsLow: string().min(1).optional(),
|
|
8339
|
+
eventMedia: string().min(1).optional(),
|
|
8340
|
+
backups: string().min(1).optional(),
|
|
8341
|
+
galleryMedia: string().min(1).optional()
|
|
8342
|
+
}).optional();
|
|
8343
|
+
/**
|
|
8324
8344
|
* How a migration sequences the cutover against the byte move.
|
|
8325
8345
|
*
|
|
8326
8346
|
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
@@ -8342,6 +8362,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
|
8342
8362
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8343
8363
|
var StorageMigrationInputSchema = object({
|
|
8344
8364
|
destinations: StorageMigrationDestinationsSchema,
|
|
8365
|
+
/** Omitted = each class's current default. */
|
|
8366
|
+
sources: StorageMigrationSourcesSchema,
|
|
8345
8367
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8346
8368
|
/** Omitted = `blocking`, which stays the default. */
|
|
8347
8369
|
mode: StorageMigrationModeSchema.optional()
|
|
@@ -8421,6 +8443,13 @@ var StorageMigrationMoveSchema = object({
|
|
|
8421
8443
|
storageClass: StorageMigrationClassSchema,
|
|
8422
8444
|
fromLocationId: string(),
|
|
8423
8445
|
toLocationId: string(),
|
|
8446
|
+
/**
|
|
8447
|
+
* True when `from` was NOT the class default at plan time. The move still
|
|
8448
|
+
* copies bytes, but the default is left alone and the source is disabled
|
|
8449
|
+
* once the copy verifies. Absent on jobs planned before this field existed
|
|
8450
|
+
* — those jobs always repointed, which is `false`.
|
|
8451
|
+
*/
|
|
8452
|
+
freezeSource: boolean().optional(),
|
|
8424
8453
|
moverJobId: string().nullable(),
|
|
8425
8454
|
state: RelocateJobStateSchema.nullable(),
|
|
8426
8455
|
error: string().nullable(),
|
|
@@ -8434,6 +8463,7 @@ var StorageMigrationJobSchema = object({
|
|
|
8434
8463
|
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8435
8464
|
mode: StorageMigrationModeSchema,
|
|
8436
8465
|
destinations: StorageMigrationDestinationsSchema,
|
|
8466
|
+
sources: StorageMigrationSourcesSchema,
|
|
8437
8467
|
throttleMbps: number(),
|
|
8438
8468
|
moves: array(StorageMigrationMoveSchema),
|
|
8439
8469
|
pauseLeaseId: string().nullable(),
|
|
@@ -8459,6 +8489,7 @@ var StorageMigrationFindingSchema = object({
|
|
|
8459
8489
|
});
|
|
8460
8490
|
var StorageMigrationPlanSchema = object({
|
|
8461
8491
|
destinations: StorageMigrationDestinationsSchema,
|
|
8492
|
+
sources: StorageMigrationSourcesSchema,
|
|
8462
8493
|
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8463
8494
|
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8464
8495
|
* it. */
|
|
@@ -8466,7 +8497,8 @@ var StorageMigrationPlanSchema = object({
|
|
|
8466
8497
|
moves: array(object({
|
|
8467
8498
|
storageClass: StorageMigrationClassSchema,
|
|
8468
8499
|
fromLocationId: string(),
|
|
8469
|
-
toLocationId: string()
|
|
8500
|
+
toLocationId: string(),
|
|
8501
|
+
freezeSource: boolean().optional()
|
|
8470
8502
|
})),
|
|
8471
8503
|
findings: array(StorageMigrationFindingSchema)
|
|
8472
8504
|
});
|
|
@@ -8644,10 +8676,51 @@ var LedgerWalkReportSchema = object({
|
|
|
8644
8676
|
var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
|
|
8645
8677
|
var RelocatableMediaCountInputSchema = object({
|
|
8646
8678
|
toLocationId: string().min(1),
|
|
8679
|
+
/** Restrict the count to one source; omitted / `'*'` = every non-target row. */
|
|
8680
|
+
fromLocationId: string().optional(),
|
|
8647
8681
|
/** Omitted = `move`. */
|
|
8648
8682
|
mode: MediaRelocateModeSchema.optional()
|
|
8649
8683
|
});
|
|
8650
8684
|
/**
|
|
8685
|
+
* Operator cleanup of leftover analytics rows, optional debug media, and
|
|
8686
|
+
* ghost ledger entries on frozen footage locations.
|
|
8687
|
+
*
|
|
8688
|
+
* A pass is tens of minutes on a standing backlog. The hub method RETURNS
|
|
8689
|
+
* `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
|
|
8690
|
+
* is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
|
|
8691
|
+
* with no operator-visible status.
|
|
8692
|
+
*/
|
|
8693
|
+
var StorageCleanupPhaseSchema = _enum([
|
|
8694
|
+
"orphans",
|
|
8695
|
+
"debug-media",
|
|
8696
|
+
"ghost-ledger",
|
|
8697
|
+
"done",
|
|
8698
|
+
"failed",
|
|
8699
|
+
"cancelled"
|
|
8700
|
+
]);
|
|
8701
|
+
var StorageCleanupInputSchema = object({
|
|
8702
|
+
/** Also walk motion stills / track filmstrips. Off by default. */
|
|
8703
|
+
includeDebugMedia: boolean().optional() });
|
|
8704
|
+
var StorageCleanupJobSchema = object({
|
|
8705
|
+
jobId: string(),
|
|
8706
|
+
phase: StorageCleanupPhaseSchema,
|
|
8707
|
+
includeDebugMedia: boolean(),
|
|
8708
|
+
orphansReclaimed: number().int().nonnegative(),
|
|
8709
|
+
orphanBytesReclaimed: number().int().nonnegative(),
|
|
8710
|
+
debugMediaReclaimed: number().int().nonnegative(),
|
|
8711
|
+
debugMediaBytesReclaimed: number().int().nonnegative(),
|
|
8712
|
+
ghostsForgotten: number().int().nonnegative(),
|
|
8713
|
+
ghostBytesForgotten: number().int().nonnegative(),
|
|
8714
|
+
/** Short operator-facing line: current collection, pass, or location. */
|
|
8715
|
+
detail: string().nullable(),
|
|
8716
|
+
cancelRequested: boolean(),
|
|
8717
|
+
startedAt: number(),
|
|
8718
|
+
updatedAt: number(),
|
|
8719
|
+
finishedAt: number().nullable(),
|
|
8720
|
+
error: string().nullable()
|
|
8721
|
+
});
|
|
8722
|
+
var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
|
|
8723
|
+
/**
|
|
8651
8724
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
8652
8725
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
8653
8726
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -8675,11 +8748,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
|
|
|
8675
8748
|
* The default location for a type uses `id === <type>:default` by
|
|
8676
8749
|
* convention (the bare type ref like `'backups'` resolves to it).
|
|
8677
8750
|
*
|
|
8678
|
-
* `isSystem
|
|
8679
|
-
*
|
|
8680
|
-
*
|
|
8681
|
-
*
|
|
8682
|
-
* deleting it is rejected at the cap level.
|
|
8751
|
+
* `isSystem` is a legacy persisted flag. Seed still creates the initial
|
|
8752
|
+
* `<type>:default` locations; the flag is no longer a lock, a badge, or a
|
|
8753
|
+
* prune selector. New writes leave it false. Deletion is gated on uniqueness
|
|
8754
|
+
* / last-enabled, not on this bit.
|
|
8683
8755
|
*/
|
|
8684
8756
|
var StorageLocationSchema = object({
|
|
8685
8757
|
id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
|
|
@@ -13290,6 +13362,12 @@ method(object({
|
|
|
13290
13362
|
}), _void(), {
|
|
13291
13363
|
kind: "mutation",
|
|
13292
13364
|
auth: "admin"
|
|
13365
|
+
}), method(object({
|
|
13366
|
+
from: string(),
|
|
13367
|
+
to: string()
|
|
13368
|
+
}), object({ moved: number() }), {
|
|
13369
|
+
kind: "mutation",
|
|
13370
|
+
auth: "admin"
|
|
13293
13371
|
}), method(object({
|
|
13294
13372
|
deviceId: number(),
|
|
13295
13373
|
disabled: boolean()
|
|
@@ -19298,46 +19376,6 @@ var RecentTracksPageSchema = object({
|
|
|
19298
19376
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19299
19377
|
nextCursor: string().nullable()
|
|
19300
19378
|
});
|
|
19301
|
-
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
19302
|
-
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
19303
|
-
var AnalyticsGroupRecordSchema = object({
|
|
19304
|
-
id: string(),
|
|
19305
|
-
deviceId: number().int(),
|
|
19306
|
-
openedAt: number().int(),
|
|
19307
|
-
closedAt: number().int(),
|
|
19308
|
-
timestamp: number().int(),
|
|
19309
|
-
memberCount: number().int(),
|
|
19310
|
-
memberTrackIds: array(string()).readonly(),
|
|
19311
|
-
className: string(),
|
|
19312
|
-
classes: array(string()).readonly(),
|
|
19313
|
-
/** Relative event-media path, or null when the group has no picture yet. */
|
|
19314
|
-
mediaUrl: string().nullable(),
|
|
19315
|
-
singleton: boolean()
|
|
19316
|
-
});
|
|
19317
|
-
var AnalyticsGroupMemberSchema = object({
|
|
19318
|
-
trackId: string(),
|
|
19319
|
-
deviceId: number().int(),
|
|
19320
|
-
className: string(),
|
|
19321
|
-
firstSeen: number().int(),
|
|
19322
|
-
lastSeen: number().int(),
|
|
19323
|
-
mediaUrl: string().nullable()
|
|
19324
|
-
});
|
|
19325
|
-
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
19326
|
-
var ListGroupsQueryInput = object({
|
|
19327
|
-
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
19328
|
-
deviceIds: array(number()),
|
|
19329
|
-
/** Window lower bound on `closedAt` (inclusive). */
|
|
19330
|
-
since: number().optional(),
|
|
19331
|
-
/** Window upper bound on `openedAt` (inclusive). */
|
|
19332
|
-
until: number().optional(),
|
|
19333
|
-
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
19334
|
-
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
19335
|
-
cursor: string().optional()
|
|
19336
|
-
});
|
|
19337
|
-
var ListGroupsPageSchema = object({
|
|
19338
|
-
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
19339
|
-
nextCursor: string().nullable()
|
|
19340
|
-
});
|
|
19341
19379
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19342
19380
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19343
19381
|
var KeyEventQueryInput = object({
|
|
@@ -19441,9 +19479,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19441
19479
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19442
19480
|
plates: number().int(),
|
|
19443
19481
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
19444
|
-
embeddings: number().int()
|
|
19445
|
-
/** Group membership + group rows removed with their last member (best-effort). */
|
|
19446
|
-
groups: number().int()
|
|
19482
|
+
embeddings: number().int()
|
|
19447
19483
|
});
|
|
19448
19484
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19449
19485
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19613,6 +19649,47 @@ var RebuildStatusSchema = object({
|
|
|
19613
19649
|
/** Present when the pass ended by throwing. */
|
|
19614
19650
|
error: string().nullable()
|
|
19615
19651
|
});
|
|
19652
|
+
/**
|
|
19653
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19654
|
+
*
|
|
19655
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19656
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19657
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19658
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19659
|
+
*/
|
|
19660
|
+
var MediaReclaimStartResultSchema = object({
|
|
19661
|
+
started: boolean(),
|
|
19662
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19663
|
+
alreadyRunning: boolean()
|
|
19664
|
+
});
|
|
19665
|
+
var MediaReclaimInputSchema = object({
|
|
19666
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19667
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19668
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19669
|
+
restart: boolean().optional(),
|
|
19670
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19671
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19672
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19673
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19674
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19675
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19676
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19677
|
+
});
|
|
19678
|
+
var MediaReclaimStatusSchema = object({
|
|
19679
|
+
running: boolean(),
|
|
19680
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19681
|
+
totalExamined: number(),
|
|
19682
|
+
totalEligible: number(),
|
|
19683
|
+
totalReclaimed: number(),
|
|
19684
|
+
totalBytesReclaimed: number(),
|
|
19685
|
+
totalRefused: number(),
|
|
19686
|
+
/** Device+scope windows finished in this pass. */
|
|
19687
|
+
devicesDone: number(),
|
|
19688
|
+
complete: boolean().nullable(),
|
|
19689
|
+
startedAtMs: number().nullable(),
|
|
19690
|
+
finishedAtMs: number().nullable(),
|
|
19691
|
+
error: string().nullable()
|
|
19692
|
+
});
|
|
19616
19693
|
var ReplayFrameInputSchema = object({
|
|
19617
19694
|
timestamp: number(),
|
|
19618
19695
|
frame: PipelineRunResultBridge
|
|
@@ -19651,10 +19728,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19651
19728
|
* stationary registry). Default false: the timeline lists passages,
|
|
19652
19729
|
* not parking records (operator decision, 2026-08-15). */
|
|
19653
19730
|
includeStationary: boolean().optional()
|
|
19654
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
19655
|
-
deviceId: number(),
|
|
19656
|
-
groupId: string().min(1)
|
|
19657
|
-
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
19731
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19658
19732
|
kind: "mutation",
|
|
19659
19733
|
auth: "admin"
|
|
19660
19734
|
}), 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({
|
|
@@ -19754,6 +19828,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19754
19828
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19755
19829
|
kind: "query",
|
|
19756
19830
|
auth: "admin"
|
|
19831
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19832
|
+
kind: "mutation",
|
|
19833
|
+
auth: "admin"
|
|
19834
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19835
|
+
kind: "query",
|
|
19836
|
+
auth: "admin"
|
|
19757
19837
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19758
19838
|
kind: "query",
|
|
19759
19839
|
auth: "admin"
|
|
@@ -21724,7 +21804,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21724
21804
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21725
21805
|
kind: "mutation",
|
|
21726
21806
|
auth: "admin"
|
|
21727
|
-
})
|
|
21807
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21808
|
+
kind: "mutation",
|
|
21809
|
+
auth: "admin"
|
|
21810
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21811
|
+
kind: "mutation",
|
|
21812
|
+
auth: "admin"
|
|
21813
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21728
21814
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21729
21815
|
providerId: string().min(1),
|
|
21730
21816
|
displayName: string().min(1),
|
|
@@ -28834,6 +28920,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
28834
28920
|
minMoveGb: number().min(0).optional()
|
|
28835
28921
|
});
|
|
28836
28922
|
/**
|
|
28923
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
28924
|
+
*
|
|
28925
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
28926
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
28927
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
28928
|
+
*/
|
|
28929
|
+
var RecordingDevicePlacementSchema = object({
|
|
28930
|
+
deviceId: number().int(),
|
|
28931
|
+
profile: string(),
|
|
28932
|
+
locationId: string()
|
|
28933
|
+
});
|
|
28934
|
+
var RecordingDevicePinSchema = object({
|
|
28935
|
+
deviceId: number().int(),
|
|
28936
|
+
/** Recordings-class location this camera is pinned to. */
|
|
28937
|
+
locationId: string()
|
|
28938
|
+
});
|
|
28939
|
+
var RecordingPlacementViewSchema = object({
|
|
28940
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
28941
|
+
pins: array(RecordingDevicePinSchema),
|
|
28942
|
+
defaultLocations: record(string(), string())
|
|
28943
|
+
});
|
|
28944
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
28945
|
+
deviceId: number().int(),
|
|
28946
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
28947
|
+
locationId: string().nullable()
|
|
28948
|
+
});
|
|
28949
|
+
/**
|
|
28837
28950
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
28838
28951
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
28839
28952
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -29059,6 +29172,12 @@ method(object({
|
|
|
29059
29172
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
29060
29173
|
kind: "mutation",
|
|
29061
29174
|
auth: "admin"
|
|
29175
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
29176
|
+
kind: "query",
|
|
29177
|
+
auth: "admin"
|
|
29178
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
29179
|
+
kind: "mutation",
|
|
29180
|
+
auth: "admin"
|
|
29062
29181
|
});
|
|
29063
29182
|
/**
|
|
29064
29183
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -34128,6 +34247,12 @@ Object.freeze({
|
|
|
34128
34247
|
addonId: null,
|
|
34129
34248
|
access: "delete"
|
|
34130
34249
|
},
|
|
34250
|
+
"deviceManager.renameLocation": {
|
|
34251
|
+
capName: "device-manager",
|
|
34252
|
+
capScope: "system",
|
|
34253
|
+
addonId: null,
|
|
34254
|
+
access: "create"
|
|
34255
|
+
},
|
|
34131
34256
|
"deviceManager.runDeviceAction": {
|
|
34132
34257
|
capName: "device-manager",
|
|
34133
34258
|
capScope: "system",
|
|
@@ -35820,19 +35945,19 @@ Object.freeze({
|
|
|
35820
35945
|
addonId: null,
|
|
35821
35946
|
access: "view"
|
|
35822
35947
|
},
|
|
35823
|
-
"pipelineAnalytics.
|
|
35948
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
35824
35949
|
capName: "pipeline-analytics",
|
|
35825
35950
|
capScope: "device",
|
|
35826
35951
|
addonId: null,
|
|
35827
35952
|
access: "view"
|
|
35828
35953
|
},
|
|
35829
|
-
"pipelineAnalytics.
|
|
35954
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
35830
35955
|
capName: "pipeline-analytics",
|
|
35831
35956
|
capScope: "device",
|
|
35832
35957
|
addonId: null,
|
|
35833
35958
|
access: "view"
|
|
35834
35959
|
},
|
|
35835
|
-
"pipelineAnalytics.
|
|
35960
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
35836
35961
|
capName: "pipeline-analytics",
|
|
35837
35962
|
capScope: "device",
|
|
35838
35963
|
addonId: null,
|
|
@@ -35922,12 +36047,6 @@ Object.freeze({
|
|
|
35922
36047
|
addonId: null,
|
|
35923
36048
|
access: "view"
|
|
35924
36049
|
},
|
|
35925
|
-
"pipelineAnalytics.listGroups": {
|
|
35926
|
-
capName: "pipeline-analytics",
|
|
35927
|
-
capScope: "device",
|
|
35928
|
-
addonId: null,
|
|
35929
|
-
access: "view"
|
|
35930
|
-
},
|
|
35931
36050
|
"pipelineAnalytics.listOpsLog": {
|
|
35932
36051
|
capName: "pipeline-analytics",
|
|
35933
36052
|
capScope: "device",
|
|
@@ -36012,6 +36131,12 @@ Object.freeze({
|
|
|
36012
36131
|
addonId: null,
|
|
36013
36132
|
access: "create"
|
|
36014
36133
|
},
|
|
36134
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
36135
|
+
capName: "pipeline-analytics",
|
|
36136
|
+
capScope: "device",
|
|
36137
|
+
addonId: null,
|
|
36138
|
+
access: "create"
|
|
36139
|
+
},
|
|
36015
36140
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
36016
36141
|
capName: "pipeline-analytics",
|
|
36017
36142
|
capScope: "device",
|
|
@@ -36936,6 +37061,12 @@ Object.freeze({
|
|
|
36936
37061
|
addonId: null,
|
|
36937
37062
|
access: "view"
|
|
36938
37063
|
},
|
|
37064
|
+
"recording.getPlacement": {
|
|
37065
|
+
capName: "recording",
|
|
37066
|
+
capScope: "system",
|
|
37067
|
+
addonId: null,
|
|
37068
|
+
access: "view"
|
|
37069
|
+
},
|
|
36939
37070
|
"recording.getPlaybackManifest": {
|
|
36940
37071
|
capName: "recording",
|
|
36941
37072
|
capScope: "system",
|
|
@@ -37062,6 +37193,12 @@ Object.freeze({
|
|
|
37062
37193
|
addonId: null,
|
|
37063
37194
|
access: "create"
|
|
37064
37195
|
},
|
|
37196
|
+
"recording.setDevicePlacement": {
|
|
37197
|
+
capName: "recording",
|
|
37198
|
+
capScope: "system",
|
|
37199
|
+
addonId: null,
|
|
37200
|
+
access: "create"
|
|
37201
|
+
},
|
|
37065
37202
|
"recording.startStorageMigrationMove": {
|
|
37066
37203
|
capName: "recording",
|
|
37067
37204
|
capScope: "system",
|
|
@@ -37506,12 +37643,36 @@ Object.freeze({
|
|
|
37506
37643
|
addonId: null,
|
|
37507
37644
|
access: "create"
|
|
37508
37645
|
},
|
|
37646
|
+
"storageMigration.cleanupCancel": {
|
|
37647
|
+
capName: "storage-migration",
|
|
37648
|
+
capScope: "system",
|
|
37649
|
+
addonId: null,
|
|
37650
|
+
access: "create"
|
|
37651
|
+
},
|
|
37652
|
+
"storageMigration.cleanupStart": {
|
|
37653
|
+
capName: "storage-migration",
|
|
37654
|
+
capScope: "system",
|
|
37655
|
+
addonId: null,
|
|
37656
|
+
access: "create"
|
|
37657
|
+
},
|
|
37658
|
+
"storageMigration.cleanupStatus": {
|
|
37659
|
+
capName: "storage-migration",
|
|
37660
|
+
capScope: "system",
|
|
37661
|
+
addonId: null,
|
|
37662
|
+
access: "view"
|
|
37663
|
+
},
|
|
37509
37664
|
"storageMigration.drain": {
|
|
37510
37665
|
capName: "storage-migration",
|
|
37511
37666
|
capScope: "system",
|
|
37512
37667
|
addonId: null,
|
|
37513
37668
|
access: "create"
|
|
37514
37669
|
},
|
|
37670
|
+
"storageMigration.history": {
|
|
37671
|
+
capName: "storage-migration",
|
|
37672
|
+
capScope: "system",
|
|
37673
|
+
addonId: null,
|
|
37674
|
+
access: "view"
|
|
37675
|
+
},
|
|
37515
37676
|
"storageMigration.movers": {
|
|
37516
37677
|
capName: "storage-migration",
|
|
37517
37678
|
capScope: "system",
|
|
@@ -39508,11 +39669,6 @@ Object.freeze({
|
|
|
39508
39669
|
form: "single",
|
|
39509
39670
|
optional: true
|
|
39510
39671
|
}],
|
|
39511
|
-
"pipelineAnalytics.getGroup": [{
|
|
39512
|
-
name: "deviceId",
|
|
39513
|
-
form: "single",
|
|
39514
|
-
optional: false
|
|
39515
|
-
}],
|
|
39516
39672
|
"pipelineAnalytics.getKeyEvents": [{
|
|
39517
39673
|
name: "deviceId",
|
|
39518
39674
|
form: "single",
|
|
@@ -39578,11 +39734,6 @@ Object.freeze({
|
|
|
39578
39734
|
form: "single",
|
|
39579
39735
|
optional: false
|
|
39580
39736
|
}],
|
|
39581
|
-
"pipelineAnalytics.listGroups": [{
|
|
39582
|
-
name: "deviceIds",
|
|
39583
|
-
form: "array",
|
|
39584
|
-
optional: false
|
|
39585
|
-
}],
|
|
39586
39737
|
"pipelineAnalytics.listOpsLog": [{
|
|
39587
39738
|
name: "deviceId",
|
|
39588
39739
|
form: "single",
|
|
@@ -39628,6 +39779,11 @@ Object.freeze({
|
|
|
39628
39779
|
form: "single",
|
|
39629
39780
|
optional: true
|
|
39630
39781
|
}],
|
|
39782
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
39783
|
+
name: "deviceIds",
|
|
39784
|
+
form: "array",
|
|
39785
|
+
optional: true
|
|
39786
|
+
}],
|
|
39631
39787
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
39632
39788
|
name: "deviceId",
|
|
39633
39789
|
form: "single",
|
|
@@ -39993,6 +40149,11 @@ Object.freeze({
|
|
|
39993
40149
|
form: "single",
|
|
39994
40150
|
optional: false
|
|
39995
40151
|
}],
|
|
40152
|
+
"recording.setDevicePlacement": [{
|
|
40153
|
+
name: "deviceId",
|
|
40154
|
+
form: "single",
|
|
40155
|
+
optional: false
|
|
40156
|
+
}],
|
|
39996
40157
|
"recording.startStorageMigrationMove": [{
|
|
39997
40158
|
name: "deviceId",
|
|
39998
40159
|
form: "single",
|
package/dist/addon.mjs
CHANGED
|
@@ -8254,6 +8254,13 @@ var MediaRelocateModeSchema = _enum([
|
|
|
8254
8254
|
]);
|
|
8255
8255
|
var RelocateMediaInputSchema = object({
|
|
8256
8256
|
toLocationId: string(),
|
|
8257
|
+
/**
|
|
8258
|
+
* Restrict the pass to rows currently on this location. Omitted / `'*'` =
|
|
8259
|
+
* every row that is not already on `toLocationId` (the historical
|
|
8260
|
+
* behaviour). A named source is what a from→to migration needs: without it
|
|
8261
|
+
* "move events off disk 2" also emptied disk 1.
|
|
8262
|
+
*/
|
|
8263
|
+
fromLocationId: string().optional(),
|
|
8257
8264
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8258
8265
|
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8259
8266
|
mode: MediaRelocateModeSchema.optional()
|
|
@@ -8321,6 +8328,19 @@ var StorageMigrationDestinationsSchema = object({
|
|
|
8321
8328
|
galleryMedia: string().min(1).optional()
|
|
8322
8329
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8323
8330
|
/**
|
|
8331
|
+
* Optional named source per class. Omitted = the class's current default
|
|
8332
|
+
* (the historical behaviour). A named source that is NOT the default is a
|
|
8333
|
+
* drain of that disk: bytes move, the default stays, and the source is
|
|
8334
|
+
* disabled when the move finishes.
|
|
8335
|
+
*/
|
|
8336
|
+
var StorageMigrationSourcesSchema = object({
|
|
8337
|
+
recordings: string().min(1).optional(),
|
|
8338
|
+
recordingsLow: string().min(1).optional(),
|
|
8339
|
+
eventMedia: string().min(1).optional(),
|
|
8340
|
+
backups: string().min(1).optional(),
|
|
8341
|
+
galleryMedia: string().min(1).optional()
|
|
8342
|
+
}).optional();
|
|
8343
|
+
/**
|
|
8324
8344
|
* How a migration sequences the cutover against the byte move.
|
|
8325
8345
|
*
|
|
8326
8346
|
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
@@ -8342,6 +8362,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
|
8342
8362
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8343
8363
|
var StorageMigrationInputSchema = object({
|
|
8344
8364
|
destinations: StorageMigrationDestinationsSchema,
|
|
8365
|
+
/** Omitted = each class's current default. */
|
|
8366
|
+
sources: StorageMigrationSourcesSchema,
|
|
8345
8367
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8346
8368
|
/** Omitted = `blocking`, which stays the default. */
|
|
8347
8369
|
mode: StorageMigrationModeSchema.optional()
|
|
@@ -8421,6 +8443,13 @@ var StorageMigrationMoveSchema = object({
|
|
|
8421
8443
|
storageClass: StorageMigrationClassSchema,
|
|
8422
8444
|
fromLocationId: string(),
|
|
8423
8445
|
toLocationId: string(),
|
|
8446
|
+
/**
|
|
8447
|
+
* True when `from` was NOT the class default at plan time. The move still
|
|
8448
|
+
* copies bytes, but the default is left alone and the source is disabled
|
|
8449
|
+
* once the copy verifies. Absent on jobs planned before this field existed
|
|
8450
|
+
* — those jobs always repointed, which is `false`.
|
|
8451
|
+
*/
|
|
8452
|
+
freezeSource: boolean().optional(),
|
|
8424
8453
|
moverJobId: string().nullable(),
|
|
8425
8454
|
state: RelocateJobStateSchema.nullable(),
|
|
8426
8455
|
error: string().nullable(),
|
|
@@ -8434,6 +8463,7 @@ var StorageMigrationJobSchema = object({
|
|
|
8434
8463
|
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8435
8464
|
mode: StorageMigrationModeSchema,
|
|
8436
8465
|
destinations: StorageMigrationDestinationsSchema,
|
|
8466
|
+
sources: StorageMigrationSourcesSchema,
|
|
8437
8467
|
throttleMbps: number(),
|
|
8438
8468
|
moves: array(StorageMigrationMoveSchema),
|
|
8439
8469
|
pauseLeaseId: string().nullable(),
|
|
@@ -8459,6 +8489,7 @@ var StorageMigrationFindingSchema = object({
|
|
|
8459
8489
|
});
|
|
8460
8490
|
var StorageMigrationPlanSchema = object({
|
|
8461
8491
|
destinations: StorageMigrationDestinationsSchema,
|
|
8492
|
+
sources: StorageMigrationSourcesSchema,
|
|
8462
8493
|
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8463
8494
|
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8464
8495
|
* it. */
|
|
@@ -8466,7 +8497,8 @@ var StorageMigrationPlanSchema = object({
|
|
|
8466
8497
|
moves: array(object({
|
|
8467
8498
|
storageClass: StorageMigrationClassSchema,
|
|
8468
8499
|
fromLocationId: string(),
|
|
8469
|
-
toLocationId: string()
|
|
8500
|
+
toLocationId: string(),
|
|
8501
|
+
freezeSource: boolean().optional()
|
|
8470
8502
|
})),
|
|
8471
8503
|
findings: array(StorageMigrationFindingSchema)
|
|
8472
8504
|
});
|
|
@@ -8644,10 +8676,51 @@ var LedgerWalkReportSchema = object({
|
|
|
8644
8676
|
var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
|
|
8645
8677
|
var RelocatableMediaCountInputSchema = object({
|
|
8646
8678
|
toLocationId: string().min(1),
|
|
8679
|
+
/** Restrict the count to one source; omitted / `'*'` = every non-target row. */
|
|
8680
|
+
fromLocationId: string().optional(),
|
|
8647
8681
|
/** Omitted = `move`. */
|
|
8648
8682
|
mode: MediaRelocateModeSchema.optional()
|
|
8649
8683
|
});
|
|
8650
8684
|
/**
|
|
8685
|
+
* Operator cleanup of leftover analytics rows, optional debug media, and
|
|
8686
|
+
* ghost ledger entries on frozen footage locations.
|
|
8687
|
+
*
|
|
8688
|
+
* A pass is tens of minutes on a standing backlog. The hub method RETURNS
|
|
8689
|
+
* `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
|
|
8690
|
+
* is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
|
|
8691
|
+
* with no operator-visible status.
|
|
8692
|
+
*/
|
|
8693
|
+
var StorageCleanupPhaseSchema = _enum([
|
|
8694
|
+
"orphans",
|
|
8695
|
+
"debug-media",
|
|
8696
|
+
"ghost-ledger",
|
|
8697
|
+
"done",
|
|
8698
|
+
"failed",
|
|
8699
|
+
"cancelled"
|
|
8700
|
+
]);
|
|
8701
|
+
var StorageCleanupInputSchema = object({
|
|
8702
|
+
/** Also walk motion stills / track filmstrips. Off by default. */
|
|
8703
|
+
includeDebugMedia: boolean().optional() });
|
|
8704
|
+
var StorageCleanupJobSchema = object({
|
|
8705
|
+
jobId: string(),
|
|
8706
|
+
phase: StorageCleanupPhaseSchema,
|
|
8707
|
+
includeDebugMedia: boolean(),
|
|
8708
|
+
orphansReclaimed: number().int().nonnegative(),
|
|
8709
|
+
orphanBytesReclaimed: number().int().nonnegative(),
|
|
8710
|
+
debugMediaReclaimed: number().int().nonnegative(),
|
|
8711
|
+
debugMediaBytesReclaimed: number().int().nonnegative(),
|
|
8712
|
+
ghostsForgotten: number().int().nonnegative(),
|
|
8713
|
+
ghostBytesForgotten: number().int().nonnegative(),
|
|
8714
|
+
/** Short operator-facing line: current collection, pass, or location. */
|
|
8715
|
+
detail: string().nullable(),
|
|
8716
|
+
cancelRequested: boolean(),
|
|
8717
|
+
startedAt: number(),
|
|
8718
|
+
updatedAt: number(),
|
|
8719
|
+
finishedAt: number().nullable(),
|
|
8720
|
+
error: string().nullable()
|
|
8721
|
+
});
|
|
8722
|
+
var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
|
|
8723
|
+
/**
|
|
8651
8724
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
8652
8725
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
8653
8726
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -8675,11 +8748,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
|
|
|
8675
8748
|
* The default location for a type uses `id === <type>:default` by
|
|
8676
8749
|
* convention (the bare type ref like `'backups'` resolves to it).
|
|
8677
8750
|
*
|
|
8678
|
-
* `isSystem
|
|
8679
|
-
*
|
|
8680
|
-
*
|
|
8681
|
-
*
|
|
8682
|
-
* deleting it is rejected at the cap level.
|
|
8751
|
+
* `isSystem` is a legacy persisted flag. Seed still creates the initial
|
|
8752
|
+
* `<type>:default` locations; the flag is no longer a lock, a badge, or a
|
|
8753
|
+
* prune selector. New writes leave it false. Deletion is gated on uniqueness
|
|
8754
|
+
* / last-enabled, not on this bit.
|
|
8683
8755
|
*/
|
|
8684
8756
|
var StorageLocationSchema = object({
|
|
8685
8757
|
id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
|
|
@@ -13290,6 +13362,12 @@ method(object({
|
|
|
13290
13362
|
}), _void(), {
|
|
13291
13363
|
kind: "mutation",
|
|
13292
13364
|
auth: "admin"
|
|
13365
|
+
}), method(object({
|
|
13366
|
+
from: string(),
|
|
13367
|
+
to: string()
|
|
13368
|
+
}), object({ moved: number() }), {
|
|
13369
|
+
kind: "mutation",
|
|
13370
|
+
auth: "admin"
|
|
13293
13371
|
}), method(object({
|
|
13294
13372
|
deviceId: number(),
|
|
13295
13373
|
disabled: boolean()
|
|
@@ -19298,46 +19376,6 @@ var RecentTracksPageSchema = object({
|
|
|
19298
19376
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19299
19377
|
nextCursor: string().nullable()
|
|
19300
19378
|
});
|
|
19301
|
-
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
19302
|
-
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
19303
|
-
var AnalyticsGroupRecordSchema = object({
|
|
19304
|
-
id: string(),
|
|
19305
|
-
deviceId: number().int(),
|
|
19306
|
-
openedAt: number().int(),
|
|
19307
|
-
closedAt: number().int(),
|
|
19308
|
-
timestamp: number().int(),
|
|
19309
|
-
memberCount: number().int(),
|
|
19310
|
-
memberTrackIds: array(string()).readonly(),
|
|
19311
|
-
className: string(),
|
|
19312
|
-
classes: array(string()).readonly(),
|
|
19313
|
-
/** Relative event-media path, or null when the group has no picture yet. */
|
|
19314
|
-
mediaUrl: string().nullable(),
|
|
19315
|
-
singleton: boolean()
|
|
19316
|
-
});
|
|
19317
|
-
var AnalyticsGroupMemberSchema = object({
|
|
19318
|
-
trackId: string(),
|
|
19319
|
-
deviceId: number().int(),
|
|
19320
|
-
className: string(),
|
|
19321
|
-
firstSeen: number().int(),
|
|
19322
|
-
lastSeen: number().int(),
|
|
19323
|
-
mediaUrl: string().nullable()
|
|
19324
|
-
});
|
|
19325
|
-
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
19326
|
-
var ListGroupsQueryInput = object({
|
|
19327
|
-
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
19328
|
-
deviceIds: array(number()),
|
|
19329
|
-
/** Window lower bound on `closedAt` (inclusive). */
|
|
19330
|
-
since: number().optional(),
|
|
19331
|
-
/** Window upper bound on `openedAt` (inclusive). */
|
|
19332
|
-
until: number().optional(),
|
|
19333
|
-
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
19334
|
-
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
19335
|
-
cursor: string().optional()
|
|
19336
|
-
});
|
|
19337
|
-
var ListGroupsPageSchema = object({
|
|
19338
|
-
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
19339
|
-
nextCursor: string().nullable()
|
|
19340
|
-
});
|
|
19341
19379
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19342
19380
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19343
19381
|
var KeyEventQueryInput = object({
|
|
@@ -19441,9 +19479,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19441
19479
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19442
19480
|
plates: number().int(),
|
|
19443
19481
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
19444
|
-
embeddings: number().int()
|
|
19445
|
-
/** Group membership + group rows removed with their last member (best-effort). */
|
|
19446
|
-
groups: number().int()
|
|
19482
|
+
embeddings: number().int()
|
|
19447
19483
|
});
|
|
19448
19484
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19449
19485
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19613,6 +19649,47 @@ var RebuildStatusSchema = object({
|
|
|
19613
19649
|
/** Present when the pass ended by throwing. */
|
|
19614
19650
|
error: string().nullable()
|
|
19615
19651
|
});
|
|
19652
|
+
/**
|
|
19653
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19654
|
+
*
|
|
19655
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19656
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19657
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19658
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19659
|
+
*/
|
|
19660
|
+
var MediaReclaimStartResultSchema = object({
|
|
19661
|
+
started: boolean(),
|
|
19662
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19663
|
+
alreadyRunning: boolean()
|
|
19664
|
+
});
|
|
19665
|
+
var MediaReclaimInputSchema = object({
|
|
19666
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19667
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19668
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19669
|
+
restart: boolean().optional(),
|
|
19670
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19671
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19672
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19673
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19674
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19675
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19676
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19677
|
+
});
|
|
19678
|
+
var MediaReclaimStatusSchema = object({
|
|
19679
|
+
running: boolean(),
|
|
19680
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19681
|
+
totalExamined: number(),
|
|
19682
|
+
totalEligible: number(),
|
|
19683
|
+
totalReclaimed: number(),
|
|
19684
|
+
totalBytesReclaimed: number(),
|
|
19685
|
+
totalRefused: number(),
|
|
19686
|
+
/** Device+scope windows finished in this pass. */
|
|
19687
|
+
devicesDone: number(),
|
|
19688
|
+
complete: boolean().nullable(),
|
|
19689
|
+
startedAtMs: number().nullable(),
|
|
19690
|
+
finishedAtMs: number().nullable(),
|
|
19691
|
+
error: string().nullable()
|
|
19692
|
+
});
|
|
19616
19693
|
var ReplayFrameInputSchema = object({
|
|
19617
19694
|
timestamp: number(),
|
|
19618
19695
|
frame: PipelineRunResultBridge
|
|
@@ -19651,10 +19728,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19651
19728
|
* stationary registry). Default false: the timeline lists passages,
|
|
19652
19729
|
* not parking records (operator decision, 2026-08-15). */
|
|
19653
19730
|
includeStationary: boolean().optional()
|
|
19654
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
19655
|
-
deviceId: number(),
|
|
19656
|
-
groupId: string().min(1)
|
|
19657
|
-
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
19731
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19658
19732
|
kind: "mutation",
|
|
19659
19733
|
auth: "admin"
|
|
19660
19734
|
}), 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({
|
|
@@ -19754,6 +19828,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19754
19828
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19755
19829
|
kind: "query",
|
|
19756
19830
|
auth: "admin"
|
|
19831
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19832
|
+
kind: "mutation",
|
|
19833
|
+
auth: "admin"
|
|
19834
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19835
|
+
kind: "query",
|
|
19836
|
+
auth: "admin"
|
|
19757
19837
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19758
19838
|
kind: "query",
|
|
19759
19839
|
auth: "admin"
|
|
@@ -21724,7 +21804,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21724
21804
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21725
21805
|
kind: "mutation",
|
|
21726
21806
|
auth: "admin"
|
|
21727
|
-
})
|
|
21807
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21808
|
+
kind: "mutation",
|
|
21809
|
+
auth: "admin"
|
|
21810
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21811
|
+
kind: "mutation",
|
|
21812
|
+
auth: "admin"
|
|
21813
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21728
21814
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21729
21815
|
providerId: string().min(1),
|
|
21730
21816
|
displayName: string().min(1),
|
|
@@ -28834,6 +28920,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
28834
28920
|
minMoveGb: number().min(0).optional()
|
|
28835
28921
|
});
|
|
28836
28922
|
/**
|
|
28923
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
28924
|
+
*
|
|
28925
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
28926
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
28927
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
28928
|
+
*/
|
|
28929
|
+
var RecordingDevicePlacementSchema = object({
|
|
28930
|
+
deviceId: number().int(),
|
|
28931
|
+
profile: string(),
|
|
28932
|
+
locationId: string()
|
|
28933
|
+
});
|
|
28934
|
+
var RecordingDevicePinSchema = object({
|
|
28935
|
+
deviceId: number().int(),
|
|
28936
|
+
/** Recordings-class location this camera is pinned to. */
|
|
28937
|
+
locationId: string()
|
|
28938
|
+
});
|
|
28939
|
+
var RecordingPlacementViewSchema = object({
|
|
28940
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
28941
|
+
pins: array(RecordingDevicePinSchema),
|
|
28942
|
+
defaultLocations: record(string(), string())
|
|
28943
|
+
});
|
|
28944
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
28945
|
+
deviceId: number().int(),
|
|
28946
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
28947
|
+
locationId: string().nullable()
|
|
28948
|
+
});
|
|
28949
|
+
/**
|
|
28837
28950
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
28838
28951
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
28839
28952
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -29059,6 +29172,12 @@ method(object({
|
|
|
29059
29172
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
29060
29173
|
kind: "mutation",
|
|
29061
29174
|
auth: "admin"
|
|
29175
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
29176
|
+
kind: "query",
|
|
29177
|
+
auth: "admin"
|
|
29178
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
29179
|
+
kind: "mutation",
|
|
29180
|
+
auth: "admin"
|
|
29062
29181
|
});
|
|
29063
29182
|
/**
|
|
29064
29183
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -34128,6 +34247,12 @@ Object.freeze({
|
|
|
34128
34247
|
addonId: null,
|
|
34129
34248
|
access: "delete"
|
|
34130
34249
|
},
|
|
34250
|
+
"deviceManager.renameLocation": {
|
|
34251
|
+
capName: "device-manager",
|
|
34252
|
+
capScope: "system",
|
|
34253
|
+
addonId: null,
|
|
34254
|
+
access: "create"
|
|
34255
|
+
},
|
|
34131
34256
|
"deviceManager.runDeviceAction": {
|
|
34132
34257
|
capName: "device-manager",
|
|
34133
34258
|
capScope: "system",
|
|
@@ -35820,19 +35945,19 @@ Object.freeze({
|
|
|
35820
35945
|
addonId: null,
|
|
35821
35946
|
access: "view"
|
|
35822
35947
|
},
|
|
35823
|
-
"pipelineAnalytics.
|
|
35948
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
35824
35949
|
capName: "pipeline-analytics",
|
|
35825
35950
|
capScope: "device",
|
|
35826
35951
|
addonId: null,
|
|
35827
35952
|
access: "view"
|
|
35828
35953
|
},
|
|
35829
|
-
"pipelineAnalytics.
|
|
35954
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
35830
35955
|
capName: "pipeline-analytics",
|
|
35831
35956
|
capScope: "device",
|
|
35832
35957
|
addonId: null,
|
|
35833
35958
|
access: "view"
|
|
35834
35959
|
},
|
|
35835
|
-
"pipelineAnalytics.
|
|
35960
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
35836
35961
|
capName: "pipeline-analytics",
|
|
35837
35962
|
capScope: "device",
|
|
35838
35963
|
addonId: null,
|
|
@@ -35922,12 +36047,6 @@ Object.freeze({
|
|
|
35922
36047
|
addonId: null,
|
|
35923
36048
|
access: "view"
|
|
35924
36049
|
},
|
|
35925
|
-
"pipelineAnalytics.listGroups": {
|
|
35926
|
-
capName: "pipeline-analytics",
|
|
35927
|
-
capScope: "device",
|
|
35928
|
-
addonId: null,
|
|
35929
|
-
access: "view"
|
|
35930
|
-
},
|
|
35931
36050
|
"pipelineAnalytics.listOpsLog": {
|
|
35932
36051
|
capName: "pipeline-analytics",
|
|
35933
36052
|
capScope: "device",
|
|
@@ -36012,6 +36131,12 @@ Object.freeze({
|
|
|
36012
36131
|
addonId: null,
|
|
36013
36132
|
access: "create"
|
|
36014
36133
|
},
|
|
36134
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
36135
|
+
capName: "pipeline-analytics",
|
|
36136
|
+
capScope: "device",
|
|
36137
|
+
addonId: null,
|
|
36138
|
+
access: "create"
|
|
36139
|
+
},
|
|
36015
36140
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
36016
36141
|
capName: "pipeline-analytics",
|
|
36017
36142
|
capScope: "device",
|
|
@@ -36936,6 +37061,12 @@ Object.freeze({
|
|
|
36936
37061
|
addonId: null,
|
|
36937
37062
|
access: "view"
|
|
36938
37063
|
},
|
|
37064
|
+
"recording.getPlacement": {
|
|
37065
|
+
capName: "recording",
|
|
37066
|
+
capScope: "system",
|
|
37067
|
+
addonId: null,
|
|
37068
|
+
access: "view"
|
|
37069
|
+
},
|
|
36939
37070
|
"recording.getPlaybackManifest": {
|
|
36940
37071
|
capName: "recording",
|
|
36941
37072
|
capScope: "system",
|
|
@@ -37062,6 +37193,12 @@ Object.freeze({
|
|
|
37062
37193
|
addonId: null,
|
|
37063
37194
|
access: "create"
|
|
37064
37195
|
},
|
|
37196
|
+
"recording.setDevicePlacement": {
|
|
37197
|
+
capName: "recording",
|
|
37198
|
+
capScope: "system",
|
|
37199
|
+
addonId: null,
|
|
37200
|
+
access: "create"
|
|
37201
|
+
},
|
|
37065
37202
|
"recording.startStorageMigrationMove": {
|
|
37066
37203
|
capName: "recording",
|
|
37067
37204
|
capScope: "system",
|
|
@@ -37506,12 +37643,36 @@ Object.freeze({
|
|
|
37506
37643
|
addonId: null,
|
|
37507
37644
|
access: "create"
|
|
37508
37645
|
},
|
|
37646
|
+
"storageMigration.cleanupCancel": {
|
|
37647
|
+
capName: "storage-migration",
|
|
37648
|
+
capScope: "system",
|
|
37649
|
+
addonId: null,
|
|
37650
|
+
access: "create"
|
|
37651
|
+
},
|
|
37652
|
+
"storageMigration.cleanupStart": {
|
|
37653
|
+
capName: "storage-migration",
|
|
37654
|
+
capScope: "system",
|
|
37655
|
+
addonId: null,
|
|
37656
|
+
access: "create"
|
|
37657
|
+
},
|
|
37658
|
+
"storageMigration.cleanupStatus": {
|
|
37659
|
+
capName: "storage-migration",
|
|
37660
|
+
capScope: "system",
|
|
37661
|
+
addonId: null,
|
|
37662
|
+
access: "view"
|
|
37663
|
+
},
|
|
37509
37664
|
"storageMigration.drain": {
|
|
37510
37665
|
capName: "storage-migration",
|
|
37511
37666
|
capScope: "system",
|
|
37512
37667
|
addonId: null,
|
|
37513
37668
|
access: "create"
|
|
37514
37669
|
},
|
|
37670
|
+
"storageMigration.history": {
|
|
37671
|
+
capName: "storage-migration",
|
|
37672
|
+
capScope: "system",
|
|
37673
|
+
addonId: null,
|
|
37674
|
+
access: "view"
|
|
37675
|
+
},
|
|
37515
37676
|
"storageMigration.movers": {
|
|
37516
37677
|
capName: "storage-migration",
|
|
37517
37678
|
capScope: "system",
|
|
@@ -39508,11 +39669,6 @@ Object.freeze({
|
|
|
39508
39669
|
form: "single",
|
|
39509
39670
|
optional: true
|
|
39510
39671
|
}],
|
|
39511
|
-
"pipelineAnalytics.getGroup": [{
|
|
39512
|
-
name: "deviceId",
|
|
39513
|
-
form: "single",
|
|
39514
|
-
optional: false
|
|
39515
|
-
}],
|
|
39516
39672
|
"pipelineAnalytics.getKeyEvents": [{
|
|
39517
39673
|
name: "deviceId",
|
|
39518
39674
|
form: "single",
|
|
@@ -39578,11 +39734,6 @@ Object.freeze({
|
|
|
39578
39734
|
form: "single",
|
|
39579
39735
|
optional: false
|
|
39580
39736
|
}],
|
|
39581
|
-
"pipelineAnalytics.listGroups": [{
|
|
39582
|
-
name: "deviceIds",
|
|
39583
|
-
form: "array",
|
|
39584
|
-
optional: false
|
|
39585
|
-
}],
|
|
39586
39737
|
"pipelineAnalytics.listOpsLog": [{
|
|
39587
39738
|
name: "deviceId",
|
|
39588
39739
|
form: "single",
|
|
@@ -39628,6 +39779,11 @@ Object.freeze({
|
|
|
39628
39779
|
form: "single",
|
|
39629
39780
|
optional: true
|
|
39630
39781
|
}],
|
|
39782
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
39783
|
+
name: "deviceIds",
|
|
39784
|
+
form: "array",
|
|
39785
|
+
optional: true
|
|
39786
|
+
}],
|
|
39631
39787
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
39632
39788
|
name: "deviceId",
|
|
39633
39789
|
form: "single",
|
|
@@ -39993,6 +40149,11 @@ Object.freeze({
|
|
|
39993
40149
|
form: "single",
|
|
39994
40150
|
optional: false
|
|
39995
40151
|
}],
|
|
40152
|
+
"recording.setDevicePlacement": [{
|
|
40153
|
+
name: "deviceId",
|
|
40154
|
+
form: "single",
|
|
40155
|
+
optional: false
|
|
40156
|
+
}],
|
|
39996
40157
|
"recording.startStorageMigrationMove": [{
|
|
39997
40158
|
name: "deviceId",
|
|
39998
40159
|
form: "single",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-import-alexa",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.49",
|
|
4
4
|
"description": "Alexa device-import provider for CamStack — imports the smart-home devices in a user's Alexa account via the unofficial alexa-remote2 cookie/token client (the inverse of the Alexa exporter)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|