@camstack/addon-import-alexa 0.2.48 → 0.2.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/addon.js +236 -73
- package/dist/addon.mjs +236 -73
- package/package.json +1 -1
package/dist/addon.js
CHANGED
|
@@ -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()
|
|
@@ -16040,6 +16118,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
16040
16118
|
"device-offline",
|
|
16041
16119
|
"device-disabled",
|
|
16042
16120
|
"device-enabled",
|
|
16121
|
+
"device-battery-low",
|
|
16122
|
+
"device-battery-normal",
|
|
16043
16123
|
"stream-online",
|
|
16044
16124
|
"stream-offline",
|
|
16045
16125
|
"node-online",
|
|
@@ -19298,46 +19378,6 @@ var RecentTracksPageSchema = object({
|
|
|
19298
19378
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19299
19379
|
nextCursor: string().nullable()
|
|
19300
19380
|
});
|
|
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
19381
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19342
19382
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19343
19383
|
var KeyEventQueryInput = object({
|
|
@@ -19441,9 +19481,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19441
19481
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19442
19482
|
plates: number().int(),
|
|
19443
19483
|
/** 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()
|
|
19484
|
+
embeddings: number().int()
|
|
19447
19485
|
});
|
|
19448
19486
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19449
19487
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19613,6 +19651,47 @@ var RebuildStatusSchema = object({
|
|
|
19613
19651
|
/** Present when the pass ended by throwing. */
|
|
19614
19652
|
error: string().nullable()
|
|
19615
19653
|
});
|
|
19654
|
+
/**
|
|
19655
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19656
|
+
*
|
|
19657
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19658
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19659
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19660
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19661
|
+
*/
|
|
19662
|
+
var MediaReclaimStartResultSchema = object({
|
|
19663
|
+
started: boolean(),
|
|
19664
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19665
|
+
alreadyRunning: boolean()
|
|
19666
|
+
});
|
|
19667
|
+
var MediaReclaimInputSchema = object({
|
|
19668
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19669
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19670
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19671
|
+
restart: boolean().optional(),
|
|
19672
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19673
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19674
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19675
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19676
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19677
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19678
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19679
|
+
});
|
|
19680
|
+
var MediaReclaimStatusSchema = object({
|
|
19681
|
+
running: boolean(),
|
|
19682
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19683
|
+
totalExamined: number(),
|
|
19684
|
+
totalEligible: number(),
|
|
19685
|
+
totalReclaimed: number(),
|
|
19686
|
+
totalBytesReclaimed: number(),
|
|
19687
|
+
totalRefused: number(),
|
|
19688
|
+
/** Device+scope windows finished in this pass. */
|
|
19689
|
+
devicesDone: number(),
|
|
19690
|
+
complete: boolean().nullable(),
|
|
19691
|
+
startedAtMs: number().nullable(),
|
|
19692
|
+
finishedAtMs: number().nullable(),
|
|
19693
|
+
error: string().nullable()
|
|
19694
|
+
});
|
|
19616
19695
|
var ReplayFrameInputSchema = object({
|
|
19617
19696
|
timestamp: number(),
|
|
19618
19697
|
frame: PipelineRunResultBridge
|
|
@@ -19651,10 +19730,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19651
19730
|
* stationary registry). Default false: the timeline lists passages,
|
|
19652
19731
|
* not parking records (operator decision, 2026-08-15). */
|
|
19653
19732
|
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(), {
|
|
19733
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19658
19734
|
kind: "mutation",
|
|
19659
19735
|
auth: "admin"
|
|
19660
19736
|
}), 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 +19830,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19754
19830
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19755
19831
|
kind: "query",
|
|
19756
19832
|
auth: "admin"
|
|
19833
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19834
|
+
kind: "mutation",
|
|
19835
|
+
auth: "admin"
|
|
19836
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19837
|
+
kind: "query",
|
|
19838
|
+
auth: "admin"
|
|
19757
19839
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19758
19840
|
kind: "query",
|
|
19759
19841
|
auth: "admin"
|
|
@@ -21724,7 +21806,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21724
21806
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21725
21807
|
kind: "mutation",
|
|
21726
21808
|
auth: "admin"
|
|
21727
|
-
})
|
|
21809
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21810
|
+
kind: "mutation",
|
|
21811
|
+
auth: "admin"
|
|
21812
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21813
|
+
kind: "mutation",
|
|
21814
|
+
auth: "admin"
|
|
21815
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21728
21816
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21729
21817
|
providerId: string().min(1),
|
|
21730
21818
|
displayName: string().min(1),
|
|
@@ -28834,6 +28922,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
28834
28922
|
minMoveGb: number().min(0).optional()
|
|
28835
28923
|
});
|
|
28836
28924
|
/**
|
|
28925
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
28926
|
+
*
|
|
28927
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
28928
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
28929
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
28930
|
+
*/
|
|
28931
|
+
var RecordingDevicePlacementSchema = object({
|
|
28932
|
+
deviceId: number().int(),
|
|
28933
|
+
profile: string(),
|
|
28934
|
+
locationId: string()
|
|
28935
|
+
});
|
|
28936
|
+
var RecordingDevicePinSchema = object({
|
|
28937
|
+
deviceId: number().int(),
|
|
28938
|
+
/** Recordings-class location this camera is pinned to. */
|
|
28939
|
+
locationId: string()
|
|
28940
|
+
});
|
|
28941
|
+
var RecordingPlacementViewSchema = object({
|
|
28942
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
28943
|
+
pins: array(RecordingDevicePinSchema),
|
|
28944
|
+
defaultLocations: record(string(), string())
|
|
28945
|
+
});
|
|
28946
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
28947
|
+
deviceId: number().int(),
|
|
28948
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
28949
|
+
locationId: string().nullable()
|
|
28950
|
+
});
|
|
28951
|
+
/**
|
|
28837
28952
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
28838
28953
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
28839
28954
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -29059,6 +29174,12 @@ method(object({
|
|
|
29059
29174
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
29060
29175
|
kind: "mutation",
|
|
29061
29176
|
auth: "admin"
|
|
29177
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
29178
|
+
kind: "query",
|
|
29179
|
+
auth: "admin"
|
|
29180
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
29181
|
+
kind: "mutation",
|
|
29182
|
+
auth: "admin"
|
|
29062
29183
|
});
|
|
29063
29184
|
/**
|
|
29064
29185
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -34128,6 +34249,12 @@ Object.freeze({
|
|
|
34128
34249
|
addonId: null,
|
|
34129
34250
|
access: "delete"
|
|
34130
34251
|
},
|
|
34252
|
+
"deviceManager.renameLocation": {
|
|
34253
|
+
capName: "device-manager",
|
|
34254
|
+
capScope: "system",
|
|
34255
|
+
addonId: null,
|
|
34256
|
+
access: "create"
|
|
34257
|
+
},
|
|
34131
34258
|
"deviceManager.runDeviceAction": {
|
|
34132
34259
|
capName: "device-manager",
|
|
34133
34260
|
capScope: "system",
|
|
@@ -35820,19 +35947,19 @@ Object.freeze({
|
|
|
35820
35947
|
addonId: null,
|
|
35821
35948
|
access: "view"
|
|
35822
35949
|
},
|
|
35823
|
-
"pipelineAnalytics.
|
|
35950
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
35824
35951
|
capName: "pipeline-analytics",
|
|
35825
35952
|
capScope: "device",
|
|
35826
35953
|
addonId: null,
|
|
35827
35954
|
access: "view"
|
|
35828
35955
|
},
|
|
35829
|
-
"pipelineAnalytics.
|
|
35956
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
35830
35957
|
capName: "pipeline-analytics",
|
|
35831
35958
|
capScope: "device",
|
|
35832
35959
|
addonId: null,
|
|
35833
35960
|
access: "view"
|
|
35834
35961
|
},
|
|
35835
|
-
"pipelineAnalytics.
|
|
35962
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
35836
35963
|
capName: "pipeline-analytics",
|
|
35837
35964
|
capScope: "device",
|
|
35838
35965
|
addonId: null,
|
|
@@ -35922,12 +36049,6 @@ Object.freeze({
|
|
|
35922
36049
|
addonId: null,
|
|
35923
36050
|
access: "view"
|
|
35924
36051
|
},
|
|
35925
|
-
"pipelineAnalytics.listGroups": {
|
|
35926
|
-
capName: "pipeline-analytics",
|
|
35927
|
-
capScope: "device",
|
|
35928
|
-
addonId: null,
|
|
35929
|
-
access: "view"
|
|
35930
|
-
},
|
|
35931
36052
|
"pipelineAnalytics.listOpsLog": {
|
|
35932
36053
|
capName: "pipeline-analytics",
|
|
35933
36054
|
capScope: "device",
|
|
@@ -36012,6 +36133,12 @@ Object.freeze({
|
|
|
36012
36133
|
addonId: null,
|
|
36013
36134
|
access: "create"
|
|
36014
36135
|
},
|
|
36136
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
36137
|
+
capName: "pipeline-analytics",
|
|
36138
|
+
capScope: "device",
|
|
36139
|
+
addonId: null,
|
|
36140
|
+
access: "create"
|
|
36141
|
+
},
|
|
36015
36142
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
36016
36143
|
capName: "pipeline-analytics",
|
|
36017
36144
|
capScope: "device",
|
|
@@ -36936,6 +37063,12 @@ Object.freeze({
|
|
|
36936
37063
|
addonId: null,
|
|
36937
37064
|
access: "view"
|
|
36938
37065
|
},
|
|
37066
|
+
"recording.getPlacement": {
|
|
37067
|
+
capName: "recording",
|
|
37068
|
+
capScope: "system",
|
|
37069
|
+
addonId: null,
|
|
37070
|
+
access: "view"
|
|
37071
|
+
},
|
|
36939
37072
|
"recording.getPlaybackManifest": {
|
|
36940
37073
|
capName: "recording",
|
|
36941
37074
|
capScope: "system",
|
|
@@ -37062,6 +37195,12 @@ Object.freeze({
|
|
|
37062
37195
|
addonId: null,
|
|
37063
37196
|
access: "create"
|
|
37064
37197
|
},
|
|
37198
|
+
"recording.setDevicePlacement": {
|
|
37199
|
+
capName: "recording",
|
|
37200
|
+
capScope: "system",
|
|
37201
|
+
addonId: null,
|
|
37202
|
+
access: "create"
|
|
37203
|
+
},
|
|
37065
37204
|
"recording.startStorageMigrationMove": {
|
|
37066
37205
|
capName: "recording",
|
|
37067
37206
|
capScope: "system",
|
|
@@ -37506,12 +37645,36 @@ Object.freeze({
|
|
|
37506
37645
|
addonId: null,
|
|
37507
37646
|
access: "create"
|
|
37508
37647
|
},
|
|
37648
|
+
"storageMigration.cleanupCancel": {
|
|
37649
|
+
capName: "storage-migration",
|
|
37650
|
+
capScope: "system",
|
|
37651
|
+
addonId: null,
|
|
37652
|
+
access: "create"
|
|
37653
|
+
},
|
|
37654
|
+
"storageMigration.cleanupStart": {
|
|
37655
|
+
capName: "storage-migration",
|
|
37656
|
+
capScope: "system",
|
|
37657
|
+
addonId: null,
|
|
37658
|
+
access: "create"
|
|
37659
|
+
},
|
|
37660
|
+
"storageMigration.cleanupStatus": {
|
|
37661
|
+
capName: "storage-migration",
|
|
37662
|
+
capScope: "system",
|
|
37663
|
+
addonId: null,
|
|
37664
|
+
access: "view"
|
|
37665
|
+
},
|
|
37509
37666
|
"storageMigration.drain": {
|
|
37510
37667
|
capName: "storage-migration",
|
|
37511
37668
|
capScope: "system",
|
|
37512
37669
|
addonId: null,
|
|
37513
37670
|
access: "create"
|
|
37514
37671
|
},
|
|
37672
|
+
"storageMigration.history": {
|
|
37673
|
+
capName: "storage-migration",
|
|
37674
|
+
capScope: "system",
|
|
37675
|
+
addonId: null,
|
|
37676
|
+
access: "view"
|
|
37677
|
+
},
|
|
37515
37678
|
"storageMigration.movers": {
|
|
37516
37679
|
capName: "storage-migration",
|
|
37517
37680
|
capScope: "system",
|
|
@@ -39508,11 +39671,6 @@ Object.freeze({
|
|
|
39508
39671
|
form: "single",
|
|
39509
39672
|
optional: true
|
|
39510
39673
|
}],
|
|
39511
|
-
"pipelineAnalytics.getGroup": [{
|
|
39512
|
-
name: "deviceId",
|
|
39513
|
-
form: "single",
|
|
39514
|
-
optional: false
|
|
39515
|
-
}],
|
|
39516
39674
|
"pipelineAnalytics.getKeyEvents": [{
|
|
39517
39675
|
name: "deviceId",
|
|
39518
39676
|
form: "single",
|
|
@@ -39578,11 +39736,6 @@ Object.freeze({
|
|
|
39578
39736
|
form: "single",
|
|
39579
39737
|
optional: false
|
|
39580
39738
|
}],
|
|
39581
|
-
"pipelineAnalytics.listGroups": [{
|
|
39582
|
-
name: "deviceIds",
|
|
39583
|
-
form: "array",
|
|
39584
|
-
optional: false
|
|
39585
|
-
}],
|
|
39586
39739
|
"pipelineAnalytics.listOpsLog": [{
|
|
39587
39740
|
name: "deviceId",
|
|
39588
39741
|
form: "single",
|
|
@@ -39628,6 +39781,11 @@ Object.freeze({
|
|
|
39628
39781
|
form: "single",
|
|
39629
39782
|
optional: true
|
|
39630
39783
|
}],
|
|
39784
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
39785
|
+
name: "deviceIds",
|
|
39786
|
+
form: "array",
|
|
39787
|
+
optional: true
|
|
39788
|
+
}],
|
|
39631
39789
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
39632
39790
|
name: "deviceId",
|
|
39633
39791
|
form: "single",
|
|
@@ -39993,6 +40151,11 @@ Object.freeze({
|
|
|
39993
40151
|
form: "single",
|
|
39994
40152
|
optional: false
|
|
39995
40153
|
}],
|
|
40154
|
+
"recording.setDevicePlacement": [{
|
|
40155
|
+
name: "deviceId",
|
|
40156
|
+
form: "single",
|
|
40157
|
+
optional: false
|
|
40158
|
+
}],
|
|
39996
40159
|
"recording.startStorageMigrationMove": [{
|
|
39997
40160
|
name: "deviceId",
|
|
39998
40161
|
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()
|
|
@@ -16040,6 +16118,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
16040
16118
|
"device-offline",
|
|
16041
16119
|
"device-disabled",
|
|
16042
16120
|
"device-enabled",
|
|
16121
|
+
"device-battery-low",
|
|
16122
|
+
"device-battery-normal",
|
|
16043
16123
|
"stream-online",
|
|
16044
16124
|
"stream-offline",
|
|
16045
16125
|
"node-online",
|
|
@@ -19298,46 +19378,6 @@ var RecentTracksPageSchema = object({
|
|
|
19298
19378
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19299
19379
|
nextCursor: string().nullable()
|
|
19300
19380
|
});
|
|
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
19381
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19342
19382
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19343
19383
|
var KeyEventQueryInput = object({
|
|
@@ -19441,9 +19481,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19441
19481
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19442
19482
|
plates: number().int(),
|
|
19443
19483
|
/** 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()
|
|
19484
|
+
embeddings: number().int()
|
|
19447
19485
|
});
|
|
19448
19486
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19449
19487
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19613,6 +19651,47 @@ var RebuildStatusSchema = object({
|
|
|
19613
19651
|
/** Present when the pass ended by throwing. */
|
|
19614
19652
|
error: string().nullable()
|
|
19615
19653
|
});
|
|
19654
|
+
/**
|
|
19655
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19656
|
+
*
|
|
19657
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19658
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19659
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19660
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19661
|
+
*/
|
|
19662
|
+
var MediaReclaimStartResultSchema = object({
|
|
19663
|
+
started: boolean(),
|
|
19664
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19665
|
+
alreadyRunning: boolean()
|
|
19666
|
+
});
|
|
19667
|
+
var MediaReclaimInputSchema = object({
|
|
19668
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19669
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19670
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19671
|
+
restart: boolean().optional(),
|
|
19672
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19673
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19674
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19675
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19676
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19677
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19678
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19679
|
+
});
|
|
19680
|
+
var MediaReclaimStatusSchema = object({
|
|
19681
|
+
running: boolean(),
|
|
19682
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19683
|
+
totalExamined: number(),
|
|
19684
|
+
totalEligible: number(),
|
|
19685
|
+
totalReclaimed: number(),
|
|
19686
|
+
totalBytesReclaimed: number(),
|
|
19687
|
+
totalRefused: number(),
|
|
19688
|
+
/** Device+scope windows finished in this pass. */
|
|
19689
|
+
devicesDone: number(),
|
|
19690
|
+
complete: boolean().nullable(),
|
|
19691
|
+
startedAtMs: number().nullable(),
|
|
19692
|
+
finishedAtMs: number().nullable(),
|
|
19693
|
+
error: string().nullable()
|
|
19694
|
+
});
|
|
19616
19695
|
var ReplayFrameInputSchema = object({
|
|
19617
19696
|
timestamp: number(),
|
|
19618
19697
|
frame: PipelineRunResultBridge
|
|
@@ -19651,10 +19730,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19651
19730
|
* stationary registry). Default false: the timeline lists passages,
|
|
19652
19731
|
* not parking records (operator decision, 2026-08-15). */
|
|
19653
19732
|
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(), {
|
|
19733
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19658
19734
|
kind: "mutation",
|
|
19659
19735
|
auth: "admin"
|
|
19660
19736
|
}), 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 +19830,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19754
19830
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19755
19831
|
kind: "query",
|
|
19756
19832
|
auth: "admin"
|
|
19833
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19834
|
+
kind: "mutation",
|
|
19835
|
+
auth: "admin"
|
|
19836
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19837
|
+
kind: "query",
|
|
19838
|
+
auth: "admin"
|
|
19757
19839
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19758
19840
|
kind: "query",
|
|
19759
19841
|
auth: "admin"
|
|
@@ -21724,7 +21806,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21724
21806
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21725
21807
|
kind: "mutation",
|
|
21726
21808
|
auth: "admin"
|
|
21727
|
-
})
|
|
21809
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21810
|
+
kind: "mutation",
|
|
21811
|
+
auth: "admin"
|
|
21812
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21813
|
+
kind: "mutation",
|
|
21814
|
+
auth: "admin"
|
|
21815
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21728
21816
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21729
21817
|
providerId: string().min(1),
|
|
21730
21818
|
displayName: string().min(1),
|
|
@@ -28834,6 +28922,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
28834
28922
|
minMoveGb: number().min(0).optional()
|
|
28835
28923
|
});
|
|
28836
28924
|
/**
|
|
28925
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
28926
|
+
*
|
|
28927
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
28928
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
28929
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
28930
|
+
*/
|
|
28931
|
+
var RecordingDevicePlacementSchema = object({
|
|
28932
|
+
deviceId: number().int(),
|
|
28933
|
+
profile: string(),
|
|
28934
|
+
locationId: string()
|
|
28935
|
+
});
|
|
28936
|
+
var RecordingDevicePinSchema = object({
|
|
28937
|
+
deviceId: number().int(),
|
|
28938
|
+
/** Recordings-class location this camera is pinned to. */
|
|
28939
|
+
locationId: string()
|
|
28940
|
+
});
|
|
28941
|
+
var RecordingPlacementViewSchema = object({
|
|
28942
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
28943
|
+
pins: array(RecordingDevicePinSchema),
|
|
28944
|
+
defaultLocations: record(string(), string())
|
|
28945
|
+
});
|
|
28946
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
28947
|
+
deviceId: number().int(),
|
|
28948
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
28949
|
+
locationId: string().nullable()
|
|
28950
|
+
});
|
|
28951
|
+
/**
|
|
28837
28952
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
28838
28953
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
28839
28954
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -29059,6 +29174,12 @@ method(object({
|
|
|
29059
29174
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
29060
29175
|
kind: "mutation",
|
|
29061
29176
|
auth: "admin"
|
|
29177
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
29178
|
+
kind: "query",
|
|
29179
|
+
auth: "admin"
|
|
29180
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
29181
|
+
kind: "mutation",
|
|
29182
|
+
auth: "admin"
|
|
29062
29183
|
});
|
|
29063
29184
|
/**
|
|
29064
29185
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -34128,6 +34249,12 @@ Object.freeze({
|
|
|
34128
34249
|
addonId: null,
|
|
34129
34250
|
access: "delete"
|
|
34130
34251
|
},
|
|
34252
|
+
"deviceManager.renameLocation": {
|
|
34253
|
+
capName: "device-manager",
|
|
34254
|
+
capScope: "system",
|
|
34255
|
+
addonId: null,
|
|
34256
|
+
access: "create"
|
|
34257
|
+
},
|
|
34131
34258
|
"deviceManager.runDeviceAction": {
|
|
34132
34259
|
capName: "device-manager",
|
|
34133
34260
|
capScope: "system",
|
|
@@ -35820,19 +35947,19 @@ Object.freeze({
|
|
|
35820
35947
|
addonId: null,
|
|
35821
35948
|
access: "view"
|
|
35822
35949
|
},
|
|
35823
|
-
"pipelineAnalytics.
|
|
35950
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
35824
35951
|
capName: "pipeline-analytics",
|
|
35825
35952
|
capScope: "device",
|
|
35826
35953
|
addonId: null,
|
|
35827
35954
|
access: "view"
|
|
35828
35955
|
},
|
|
35829
|
-
"pipelineAnalytics.
|
|
35956
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
35830
35957
|
capName: "pipeline-analytics",
|
|
35831
35958
|
capScope: "device",
|
|
35832
35959
|
addonId: null,
|
|
35833
35960
|
access: "view"
|
|
35834
35961
|
},
|
|
35835
|
-
"pipelineAnalytics.
|
|
35962
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
35836
35963
|
capName: "pipeline-analytics",
|
|
35837
35964
|
capScope: "device",
|
|
35838
35965
|
addonId: null,
|
|
@@ -35922,12 +36049,6 @@ Object.freeze({
|
|
|
35922
36049
|
addonId: null,
|
|
35923
36050
|
access: "view"
|
|
35924
36051
|
},
|
|
35925
|
-
"pipelineAnalytics.listGroups": {
|
|
35926
|
-
capName: "pipeline-analytics",
|
|
35927
|
-
capScope: "device",
|
|
35928
|
-
addonId: null,
|
|
35929
|
-
access: "view"
|
|
35930
|
-
},
|
|
35931
36052
|
"pipelineAnalytics.listOpsLog": {
|
|
35932
36053
|
capName: "pipeline-analytics",
|
|
35933
36054
|
capScope: "device",
|
|
@@ -36012,6 +36133,12 @@ Object.freeze({
|
|
|
36012
36133
|
addonId: null,
|
|
36013
36134
|
access: "create"
|
|
36014
36135
|
},
|
|
36136
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
36137
|
+
capName: "pipeline-analytics",
|
|
36138
|
+
capScope: "device",
|
|
36139
|
+
addonId: null,
|
|
36140
|
+
access: "create"
|
|
36141
|
+
},
|
|
36015
36142
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
36016
36143
|
capName: "pipeline-analytics",
|
|
36017
36144
|
capScope: "device",
|
|
@@ -36936,6 +37063,12 @@ Object.freeze({
|
|
|
36936
37063
|
addonId: null,
|
|
36937
37064
|
access: "view"
|
|
36938
37065
|
},
|
|
37066
|
+
"recording.getPlacement": {
|
|
37067
|
+
capName: "recording",
|
|
37068
|
+
capScope: "system",
|
|
37069
|
+
addonId: null,
|
|
37070
|
+
access: "view"
|
|
37071
|
+
},
|
|
36939
37072
|
"recording.getPlaybackManifest": {
|
|
36940
37073
|
capName: "recording",
|
|
36941
37074
|
capScope: "system",
|
|
@@ -37062,6 +37195,12 @@ Object.freeze({
|
|
|
37062
37195
|
addonId: null,
|
|
37063
37196
|
access: "create"
|
|
37064
37197
|
},
|
|
37198
|
+
"recording.setDevicePlacement": {
|
|
37199
|
+
capName: "recording",
|
|
37200
|
+
capScope: "system",
|
|
37201
|
+
addonId: null,
|
|
37202
|
+
access: "create"
|
|
37203
|
+
},
|
|
37065
37204
|
"recording.startStorageMigrationMove": {
|
|
37066
37205
|
capName: "recording",
|
|
37067
37206
|
capScope: "system",
|
|
@@ -37506,12 +37645,36 @@ Object.freeze({
|
|
|
37506
37645
|
addonId: null,
|
|
37507
37646
|
access: "create"
|
|
37508
37647
|
},
|
|
37648
|
+
"storageMigration.cleanupCancel": {
|
|
37649
|
+
capName: "storage-migration",
|
|
37650
|
+
capScope: "system",
|
|
37651
|
+
addonId: null,
|
|
37652
|
+
access: "create"
|
|
37653
|
+
},
|
|
37654
|
+
"storageMigration.cleanupStart": {
|
|
37655
|
+
capName: "storage-migration",
|
|
37656
|
+
capScope: "system",
|
|
37657
|
+
addonId: null,
|
|
37658
|
+
access: "create"
|
|
37659
|
+
},
|
|
37660
|
+
"storageMigration.cleanupStatus": {
|
|
37661
|
+
capName: "storage-migration",
|
|
37662
|
+
capScope: "system",
|
|
37663
|
+
addonId: null,
|
|
37664
|
+
access: "view"
|
|
37665
|
+
},
|
|
37509
37666
|
"storageMigration.drain": {
|
|
37510
37667
|
capName: "storage-migration",
|
|
37511
37668
|
capScope: "system",
|
|
37512
37669
|
addonId: null,
|
|
37513
37670
|
access: "create"
|
|
37514
37671
|
},
|
|
37672
|
+
"storageMigration.history": {
|
|
37673
|
+
capName: "storage-migration",
|
|
37674
|
+
capScope: "system",
|
|
37675
|
+
addonId: null,
|
|
37676
|
+
access: "view"
|
|
37677
|
+
},
|
|
37515
37678
|
"storageMigration.movers": {
|
|
37516
37679
|
capName: "storage-migration",
|
|
37517
37680
|
capScope: "system",
|
|
@@ -39508,11 +39671,6 @@ Object.freeze({
|
|
|
39508
39671
|
form: "single",
|
|
39509
39672
|
optional: true
|
|
39510
39673
|
}],
|
|
39511
|
-
"pipelineAnalytics.getGroup": [{
|
|
39512
|
-
name: "deviceId",
|
|
39513
|
-
form: "single",
|
|
39514
|
-
optional: false
|
|
39515
|
-
}],
|
|
39516
39674
|
"pipelineAnalytics.getKeyEvents": [{
|
|
39517
39675
|
name: "deviceId",
|
|
39518
39676
|
form: "single",
|
|
@@ -39578,11 +39736,6 @@ Object.freeze({
|
|
|
39578
39736
|
form: "single",
|
|
39579
39737
|
optional: false
|
|
39580
39738
|
}],
|
|
39581
|
-
"pipelineAnalytics.listGroups": [{
|
|
39582
|
-
name: "deviceIds",
|
|
39583
|
-
form: "array",
|
|
39584
|
-
optional: false
|
|
39585
|
-
}],
|
|
39586
39739
|
"pipelineAnalytics.listOpsLog": [{
|
|
39587
39740
|
name: "deviceId",
|
|
39588
39741
|
form: "single",
|
|
@@ -39628,6 +39781,11 @@ Object.freeze({
|
|
|
39628
39781
|
form: "single",
|
|
39629
39782
|
optional: true
|
|
39630
39783
|
}],
|
|
39784
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
39785
|
+
name: "deviceIds",
|
|
39786
|
+
form: "array",
|
|
39787
|
+
optional: true
|
|
39788
|
+
}],
|
|
39631
39789
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
39632
39790
|
name: "deviceId",
|
|
39633
39791
|
form: "single",
|
|
@@ -39993,6 +40151,11 @@ Object.freeze({
|
|
|
39993
40151
|
form: "single",
|
|
39994
40152
|
optional: false
|
|
39995
40153
|
}],
|
|
40154
|
+
"recording.setDevicePlacement": [{
|
|
40155
|
+
name: "deviceId",
|
|
40156
|
+
form: "single",
|
|
40157
|
+
optional: false
|
|
40158
|
+
}],
|
|
39996
40159
|
"recording.startStorageMigrationMove": [{
|
|
39997
40160
|
name: "deviceId",
|
|
39998
40161
|
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.50",
|
|
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",
|