@camstack/addon-ai 0.4.45 → 0.4.47
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
|
@@ -8299,6 +8299,13 @@ var MediaRelocateModeSchema = _enum([
|
|
|
8299
8299
|
]);
|
|
8300
8300
|
var RelocateMediaInputSchema = object({
|
|
8301
8301
|
toLocationId: string(),
|
|
8302
|
+
/**
|
|
8303
|
+
* Restrict the pass to rows currently on this location. Omitted / `'*'` =
|
|
8304
|
+
* every row that is not already on `toLocationId` (the historical
|
|
8305
|
+
* behaviour). A named source is what a from→to migration needs: without it
|
|
8306
|
+
* "move events off disk 2" also emptied disk 1.
|
|
8307
|
+
*/
|
|
8308
|
+
fromLocationId: string().optional(),
|
|
8302
8309
|
throttleMbps: number$1().min(1).max(1e3).optional(),
|
|
8303
8310
|
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8304
8311
|
mode: MediaRelocateModeSchema.optional()
|
|
@@ -8366,6 +8373,19 @@ var StorageMigrationDestinationsSchema = object({
|
|
|
8366
8373
|
galleryMedia: string().min(1).optional()
|
|
8367
8374
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8368
8375
|
/**
|
|
8376
|
+
* Optional named source per class. Omitted = the class's current default
|
|
8377
|
+
* (the historical behaviour). A named source that is NOT the default is a
|
|
8378
|
+
* drain of that disk: bytes move, the default stays, and the source is
|
|
8379
|
+
* disabled when the move finishes.
|
|
8380
|
+
*/
|
|
8381
|
+
var StorageMigrationSourcesSchema = object({
|
|
8382
|
+
recordings: string().min(1).optional(),
|
|
8383
|
+
recordingsLow: string().min(1).optional(),
|
|
8384
|
+
eventMedia: string().min(1).optional(),
|
|
8385
|
+
backups: string().min(1).optional(),
|
|
8386
|
+
galleryMedia: string().min(1).optional()
|
|
8387
|
+
}).optional();
|
|
8388
|
+
/**
|
|
8369
8389
|
* How a migration sequences the cutover against the byte move.
|
|
8370
8390
|
*
|
|
8371
8391
|
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
@@ -8387,6 +8407,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
|
8387
8407
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8388
8408
|
var StorageMigrationInputSchema = object({
|
|
8389
8409
|
destinations: StorageMigrationDestinationsSchema,
|
|
8410
|
+
/** Omitted = each class's current default. */
|
|
8411
|
+
sources: StorageMigrationSourcesSchema,
|
|
8390
8412
|
throttleMbps: number$1().min(1).max(1e3).optional(),
|
|
8391
8413
|
/** Omitted = `blocking`, which stays the default. */
|
|
8392
8414
|
mode: StorageMigrationModeSchema.optional()
|
|
@@ -8466,6 +8488,13 @@ var StorageMigrationMoveSchema = object({
|
|
|
8466
8488
|
storageClass: StorageMigrationClassSchema,
|
|
8467
8489
|
fromLocationId: string(),
|
|
8468
8490
|
toLocationId: string(),
|
|
8491
|
+
/**
|
|
8492
|
+
* True when `from` was NOT the class default at plan time. The move still
|
|
8493
|
+
* copies bytes, but the default is left alone and the source is disabled
|
|
8494
|
+
* once the copy verifies. Absent on jobs planned before this field existed
|
|
8495
|
+
* — those jobs always repointed, which is `false`.
|
|
8496
|
+
*/
|
|
8497
|
+
freezeSource: boolean().optional(),
|
|
8469
8498
|
moverJobId: string().nullable(),
|
|
8470
8499
|
state: RelocateJobStateSchema.nullable(),
|
|
8471
8500
|
error: string().nullable(),
|
|
@@ -8479,6 +8508,7 @@ var StorageMigrationJobSchema = object({
|
|
|
8479
8508
|
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8480
8509
|
mode: StorageMigrationModeSchema,
|
|
8481
8510
|
destinations: StorageMigrationDestinationsSchema,
|
|
8511
|
+
sources: StorageMigrationSourcesSchema,
|
|
8482
8512
|
throttleMbps: number$1(),
|
|
8483
8513
|
moves: array(StorageMigrationMoveSchema),
|
|
8484
8514
|
pauseLeaseId: string().nullable(),
|
|
@@ -8504,6 +8534,7 @@ var StorageMigrationFindingSchema = object({
|
|
|
8504
8534
|
});
|
|
8505
8535
|
var StorageMigrationPlanSchema = object({
|
|
8506
8536
|
destinations: StorageMigrationDestinationsSchema,
|
|
8537
|
+
sources: StorageMigrationSourcesSchema,
|
|
8507
8538
|
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8508
8539
|
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8509
8540
|
* it. */
|
|
@@ -8511,7 +8542,8 @@ var StorageMigrationPlanSchema = object({
|
|
|
8511
8542
|
moves: array(object({
|
|
8512
8543
|
storageClass: StorageMigrationClassSchema,
|
|
8513
8544
|
fromLocationId: string(),
|
|
8514
|
-
toLocationId: string()
|
|
8545
|
+
toLocationId: string(),
|
|
8546
|
+
freezeSource: boolean().optional()
|
|
8515
8547
|
})),
|
|
8516
8548
|
findings: array(StorageMigrationFindingSchema)
|
|
8517
8549
|
});
|
|
@@ -8689,10 +8721,51 @@ var LedgerWalkReportSchema = object({
|
|
|
8689
8721
|
var RelocatableMediaCountSchema = object({ rows: number$1().int().nonnegative() }).nullable();
|
|
8690
8722
|
var RelocatableMediaCountInputSchema = object({
|
|
8691
8723
|
toLocationId: string().min(1),
|
|
8724
|
+
/** Restrict the count to one source; omitted / `'*'` = every non-target row. */
|
|
8725
|
+
fromLocationId: string().optional(),
|
|
8692
8726
|
/** Omitted = `move`. */
|
|
8693
8727
|
mode: MediaRelocateModeSchema.optional()
|
|
8694
8728
|
});
|
|
8695
8729
|
/**
|
|
8730
|
+
* Operator cleanup of leftover analytics rows, optional debug media, and
|
|
8731
|
+
* ghost ledger entries on frozen footage locations.
|
|
8732
|
+
*
|
|
8733
|
+
* A pass is tens of minutes on a standing backlog. The hub method RETURNS
|
|
8734
|
+
* `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
|
|
8735
|
+
* is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
|
|
8736
|
+
* with no operator-visible status.
|
|
8737
|
+
*/
|
|
8738
|
+
var StorageCleanupPhaseSchema = _enum([
|
|
8739
|
+
"orphans",
|
|
8740
|
+
"debug-media",
|
|
8741
|
+
"ghost-ledger",
|
|
8742
|
+
"done",
|
|
8743
|
+
"failed",
|
|
8744
|
+
"cancelled"
|
|
8745
|
+
]);
|
|
8746
|
+
var StorageCleanupInputSchema = object({
|
|
8747
|
+
/** Also walk motion stills / track filmstrips. Off by default. */
|
|
8748
|
+
includeDebugMedia: boolean().optional() });
|
|
8749
|
+
var StorageCleanupJobSchema = object({
|
|
8750
|
+
jobId: string(),
|
|
8751
|
+
phase: StorageCleanupPhaseSchema,
|
|
8752
|
+
includeDebugMedia: boolean(),
|
|
8753
|
+
orphansReclaimed: number$1().int().nonnegative(),
|
|
8754
|
+
orphanBytesReclaimed: number$1().int().nonnegative(),
|
|
8755
|
+
debugMediaReclaimed: number$1().int().nonnegative(),
|
|
8756
|
+
debugMediaBytesReclaimed: number$1().int().nonnegative(),
|
|
8757
|
+
ghostsForgotten: number$1().int().nonnegative(),
|
|
8758
|
+
ghostBytesForgotten: number$1().int().nonnegative(),
|
|
8759
|
+
/** Short operator-facing line: current collection, pass, or location. */
|
|
8760
|
+
detail: string().nullable(),
|
|
8761
|
+
cancelRequested: boolean(),
|
|
8762
|
+
startedAt: number$1(),
|
|
8763
|
+
updatedAt: number$1(),
|
|
8764
|
+
finishedAt: number$1().nullable(),
|
|
8765
|
+
error: string().nullable()
|
|
8766
|
+
});
|
|
8767
|
+
var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
|
|
8768
|
+
/**
|
|
8696
8769
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
8697
8770
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
8698
8771
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -8720,11 +8793,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
|
|
|
8720
8793
|
* The default location for a type uses `id === <type>:default` by
|
|
8721
8794
|
* convention (the bare type ref like `'backups'` resolves to it).
|
|
8722
8795
|
*
|
|
8723
|
-
* `isSystem
|
|
8724
|
-
*
|
|
8725
|
-
*
|
|
8726
|
-
*
|
|
8727
|
-
* deleting it is rejected at the cap level.
|
|
8796
|
+
* `isSystem` is a legacy persisted flag. Seed still creates the initial
|
|
8797
|
+
* `<type>:default` locations; the flag is no longer a lock, a badge, or a
|
|
8798
|
+
* prune selector. New writes leave it false. Deletion is gated on uniqueness
|
|
8799
|
+
* / last-enabled, not on this bit.
|
|
8728
8800
|
*/
|
|
8729
8801
|
var StorageLocationSchema = object({
|
|
8730
8802
|
id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
|
|
@@ -12986,6 +13058,12 @@ method(object({
|
|
|
12986
13058
|
}), _void(), {
|
|
12987
13059
|
kind: "mutation",
|
|
12988
13060
|
auth: "admin"
|
|
13061
|
+
}), method(object({
|
|
13062
|
+
from: string(),
|
|
13063
|
+
to: string()
|
|
13064
|
+
}), object({ moved: number$1() }), {
|
|
13065
|
+
kind: "mutation",
|
|
13066
|
+
auth: "admin"
|
|
12989
13067
|
}), method(object({
|
|
12990
13068
|
deviceId: number$1(),
|
|
12991
13069
|
disabled: boolean()
|
|
@@ -19010,46 +19088,6 @@ var RecentTracksPageSchema = object({
|
|
|
19010
19088
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19011
19089
|
nextCursor: string().nullable()
|
|
19012
19090
|
});
|
|
19013
|
-
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
19014
|
-
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
19015
|
-
var AnalyticsGroupRecordSchema = object({
|
|
19016
|
-
id: string(),
|
|
19017
|
-
deviceId: number$1().int(),
|
|
19018
|
-
openedAt: number$1().int(),
|
|
19019
|
-
closedAt: number$1().int(),
|
|
19020
|
-
timestamp: number$1().int(),
|
|
19021
|
-
memberCount: number$1().int(),
|
|
19022
|
-
memberTrackIds: array(string()).readonly(),
|
|
19023
|
-
className: string(),
|
|
19024
|
-
classes: array(string()).readonly(),
|
|
19025
|
-
/** Relative event-media path, or null when the group has no picture yet. */
|
|
19026
|
-
mediaUrl: string().nullable(),
|
|
19027
|
-
singleton: boolean()
|
|
19028
|
-
});
|
|
19029
|
-
var AnalyticsGroupMemberSchema = object({
|
|
19030
|
-
trackId: string(),
|
|
19031
|
-
deviceId: number$1().int(),
|
|
19032
|
-
className: string(),
|
|
19033
|
-
firstSeen: number$1().int(),
|
|
19034
|
-
lastSeen: number$1().int(),
|
|
19035
|
-
mediaUrl: string().nullable()
|
|
19036
|
-
});
|
|
19037
|
-
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
19038
|
-
var ListGroupsQueryInput = object({
|
|
19039
|
-
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
19040
|
-
deviceIds: array(number$1()),
|
|
19041
|
-
/** Window lower bound on `closedAt` (inclusive). */
|
|
19042
|
-
since: number$1().optional(),
|
|
19043
|
-
/** Window upper bound on `openedAt` (inclusive). */
|
|
19044
|
-
until: number$1().optional(),
|
|
19045
|
-
limit: number$1().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
19046
|
-
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
19047
|
-
cursor: string().optional()
|
|
19048
|
-
});
|
|
19049
|
-
var ListGroupsPageSchema = object({
|
|
19050
|
-
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
19051
|
-
nextCursor: string().nullable()
|
|
19052
|
-
});
|
|
19053
19091
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19054
19092
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19055
19093
|
var KeyEventQueryInput = object({
|
|
@@ -19153,9 +19191,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19153
19191
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19154
19192
|
plates: number$1().int(),
|
|
19155
19193
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
19156
|
-
embeddings: number$1().int()
|
|
19157
|
-
/** Group membership + group rows removed with their last member (best-effort). */
|
|
19158
|
-
groups: number$1().int()
|
|
19194
|
+
embeddings: number$1().int()
|
|
19159
19195
|
});
|
|
19160
19196
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19161
19197
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19325,6 +19361,47 @@ var RebuildStatusSchema = object({
|
|
|
19325
19361
|
/** Present when the pass ended by throwing. */
|
|
19326
19362
|
error: string().nullable()
|
|
19327
19363
|
});
|
|
19364
|
+
/**
|
|
19365
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19366
|
+
*
|
|
19367
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19368
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19369
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19370
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19371
|
+
*/
|
|
19372
|
+
var MediaReclaimStartResultSchema = object({
|
|
19373
|
+
started: boolean(),
|
|
19374
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19375
|
+
alreadyRunning: boolean()
|
|
19376
|
+
});
|
|
19377
|
+
var MediaReclaimInputSchema = object({
|
|
19378
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19379
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19380
|
+
deviceIds: array(number$1().int()).min(1).optional(),
|
|
19381
|
+
restart: boolean().optional(),
|
|
19382
|
+
pageSize: number$1().int().min(50).max(5e3).optional(),
|
|
19383
|
+
maxRowsPerDevice: number$1().int().min(1).max(5e5).optional(),
|
|
19384
|
+
maxReclaimPerDevice: number$1().int().min(1).max(5e5).optional(),
|
|
19385
|
+
maxBytesPerRun: number$1().int().min(1).optional(),
|
|
19386
|
+
budgetMinutes: number$1().int().min(1).max(720).optional(),
|
|
19387
|
+
throttleBytesPerSec: number$1().int().min(64 * 1024).optional(),
|
|
19388
|
+
graceMinutes: number$1().int().min(1).max(10080).optional()
|
|
19389
|
+
});
|
|
19390
|
+
var MediaReclaimStatusSchema = object({
|
|
19391
|
+
running: boolean(),
|
|
19392
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19393
|
+
totalExamined: number$1(),
|
|
19394
|
+
totalEligible: number$1(),
|
|
19395
|
+
totalReclaimed: number$1(),
|
|
19396
|
+
totalBytesReclaimed: number$1(),
|
|
19397
|
+
totalRefused: number$1(),
|
|
19398
|
+
/** Device+scope windows finished in this pass. */
|
|
19399
|
+
devicesDone: number$1(),
|
|
19400
|
+
complete: boolean().nullable(),
|
|
19401
|
+
startedAtMs: number$1().nullable(),
|
|
19402
|
+
finishedAtMs: number$1().nullable(),
|
|
19403
|
+
error: string().nullable()
|
|
19404
|
+
});
|
|
19328
19405
|
var ReplayFrameInputSchema = object({
|
|
19329
19406
|
timestamp: number$1(),
|
|
19330
19407
|
frame: PipelineRunResultBridge
|
|
@@ -19363,10 +19440,7 @@ DeviceType.Camera, method(object({ deviceId: number$1() }), array(TrackSchema).r
|
|
|
19363
19440
|
* stationary registry). Default false: the timeline lists passages,
|
|
19364
19441
|
* not parking records (operator decision, 2026-08-15). */
|
|
19365
19442
|
includeStationary: boolean().optional()
|
|
19366
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
19367
|
-
deviceId: number$1(),
|
|
19368
|
-
groupId: string().min(1)
|
|
19369
|
-
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number$1() }), _void(), {
|
|
19443
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number$1() }), _void(), {
|
|
19370
19444
|
kind: "mutation",
|
|
19371
19445
|
auth: "admin"
|
|
19372
19446
|
}), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({ deviceId: number$1() }), array(EventKindDescriptorSchema).readonly()), method(object({ deviceIds: array(number$1()).min(1).max(200) }), array(EventKindsForDeviceSchema).readonly()), method(object({
|
|
@@ -19466,6 +19540,12 @@ DeviceType.Camera, method(object({ deviceId: number$1() }), array(TrackSchema).r
|
|
|
19466
19540
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19467
19541
|
kind: "query",
|
|
19468
19542
|
auth: "admin"
|
|
19543
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19544
|
+
kind: "mutation",
|
|
19545
|
+
auth: "admin"
|
|
19546
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19547
|
+
kind: "query",
|
|
19548
|
+
auth: "admin"
|
|
19469
19549
|
}), method(object({ deviceIds: array(number$1()).optional() }), TrainingExportSummarySchema, {
|
|
19470
19550
|
kind: "query",
|
|
19471
19551
|
auth: "admin"
|
|
@@ -21436,7 +21516,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21436
21516
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21437
21517
|
kind: "mutation",
|
|
21438
21518
|
auth: "admin"
|
|
21439
|
-
})
|
|
21519
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21520
|
+
kind: "mutation",
|
|
21521
|
+
auth: "admin"
|
|
21522
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21523
|
+
kind: "mutation",
|
|
21524
|
+
auth: "admin"
|
|
21525
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21440
21526
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21441
21527
|
providerId: string().min(1),
|
|
21442
21528
|
displayName: string().min(1),
|
|
@@ -26814,6 +26900,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
26814
26900
|
minMoveGb: number$1().min(0).optional()
|
|
26815
26901
|
});
|
|
26816
26902
|
/**
|
|
26903
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
26904
|
+
*
|
|
26905
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
26906
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
26907
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
26908
|
+
*/
|
|
26909
|
+
var RecordingDevicePlacementSchema = object({
|
|
26910
|
+
deviceId: number$1().int(),
|
|
26911
|
+
profile: string(),
|
|
26912
|
+
locationId: string()
|
|
26913
|
+
});
|
|
26914
|
+
var RecordingDevicePinSchema = object({
|
|
26915
|
+
deviceId: number$1().int(),
|
|
26916
|
+
/** Recordings-class location this camera is pinned to. */
|
|
26917
|
+
locationId: string()
|
|
26918
|
+
});
|
|
26919
|
+
var RecordingPlacementViewSchema = object({
|
|
26920
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
26921
|
+
pins: array(RecordingDevicePinSchema),
|
|
26922
|
+
defaultLocations: record(string(), string())
|
|
26923
|
+
});
|
|
26924
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
26925
|
+
deviceId: number$1().int(),
|
|
26926
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
26927
|
+
locationId: string().nullable()
|
|
26928
|
+
});
|
|
26929
|
+
/**
|
|
26817
26930
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
26818
26931
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
26819
26932
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -27039,6 +27152,12 @@ method(object({
|
|
|
27039
27152
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
27040
27153
|
kind: "mutation",
|
|
27041
27154
|
auth: "admin"
|
|
27155
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
27156
|
+
kind: "query",
|
|
27157
|
+
auth: "admin"
|
|
27158
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
27159
|
+
kind: "mutation",
|
|
27160
|
+
auth: "admin"
|
|
27042
27161
|
});
|
|
27043
27162
|
/**
|
|
27044
27163
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -30409,6 +30528,12 @@ Object.freeze({
|
|
|
30409
30528
|
addonId: null,
|
|
30410
30529
|
access: "delete"
|
|
30411
30530
|
},
|
|
30531
|
+
"deviceManager.renameLocation": {
|
|
30532
|
+
capName: "device-manager",
|
|
30533
|
+
capScope: "system",
|
|
30534
|
+
addonId: null,
|
|
30535
|
+
access: "create"
|
|
30536
|
+
},
|
|
30412
30537
|
"deviceManager.runDeviceAction": {
|
|
30413
30538
|
capName: "device-manager",
|
|
30414
30539
|
capScope: "system",
|
|
@@ -32101,19 +32226,19 @@ Object.freeze({
|
|
|
32101
32226
|
addonId: null,
|
|
32102
32227
|
access: "view"
|
|
32103
32228
|
},
|
|
32104
|
-
"pipelineAnalytics.
|
|
32229
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
32105
32230
|
capName: "pipeline-analytics",
|
|
32106
32231
|
capScope: "device",
|
|
32107
32232
|
addonId: null,
|
|
32108
32233
|
access: "view"
|
|
32109
32234
|
},
|
|
32110
|
-
"pipelineAnalytics.
|
|
32235
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
32111
32236
|
capName: "pipeline-analytics",
|
|
32112
32237
|
capScope: "device",
|
|
32113
32238
|
addonId: null,
|
|
32114
32239
|
access: "view"
|
|
32115
32240
|
},
|
|
32116
|
-
"pipelineAnalytics.
|
|
32241
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
32117
32242
|
capName: "pipeline-analytics",
|
|
32118
32243
|
capScope: "device",
|
|
32119
32244
|
addonId: null,
|
|
@@ -32203,12 +32328,6 @@ Object.freeze({
|
|
|
32203
32328
|
addonId: null,
|
|
32204
32329
|
access: "view"
|
|
32205
32330
|
},
|
|
32206
|
-
"pipelineAnalytics.listGroups": {
|
|
32207
|
-
capName: "pipeline-analytics",
|
|
32208
|
-
capScope: "device",
|
|
32209
|
-
addonId: null,
|
|
32210
|
-
access: "view"
|
|
32211
|
-
},
|
|
32212
32331
|
"pipelineAnalytics.listOpsLog": {
|
|
32213
32332
|
capName: "pipeline-analytics",
|
|
32214
32333
|
capScope: "device",
|
|
@@ -32293,6 +32412,12 @@ Object.freeze({
|
|
|
32293
32412
|
addonId: null,
|
|
32294
32413
|
access: "create"
|
|
32295
32414
|
},
|
|
32415
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
32416
|
+
capName: "pipeline-analytics",
|
|
32417
|
+
capScope: "device",
|
|
32418
|
+
addonId: null,
|
|
32419
|
+
access: "create"
|
|
32420
|
+
},
|
|
32296
32421
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
32297
32422
|
capName: "pipeline-analytics",
|
|
32298
32423
|
capScope: "device",
|
|
@@ -33217,6 +33342,12 @@ Object.freeze({
|
|
|
33217
33342
|
addonId: null,
|
|
33218
33343
|
access: "view"
|
|
33219
33344
|
},
|
|
33345
|
+
"recording.getPlacement": {
|
|
33346
|
+
capName: "recording",
|
|
33347
|
+
capScope: "system",
|
|
33348
|
+
addonId: null,
|
|
33349
|
+
access: "view"
|
|
33350
|
+
},
|
|
33220
33351
|
"recording.getPlaybackManifest": {
|
|
33221
33352
|
capName: "recording",
|
|
33222
33353
|
capScope: "system",
|
|
@@ -33343,6 +33474,12 @@ Object.freeze({
|
|
|
33343
33474
|
addonId: null,
|
|
33344
33475
|
access: "create"
|
|
33345
33476
|
},
|
|
33477
|
+
"recording.setDevicePlacement": {
|
|
33478
|
+
capName: "recording",
|
|
33479
|
+
capScope: "system",
|
|
33480
|
+
addonId: null,
|
|
33481
|
+
access: "create"
|
|
33482
|
+
},
|
|
33346
33483
|
"recording.startStorageMigrationMove": {
|
|
33347
33484
|
capName: "recording",
|
|
33348
33485
|
capScope: "system",
|
|
@@ -33787,12 +33924,36 @@ Object.freeze({
|
|
|
33787
33924
|
addonId: null,
|
|
33788
33925
|
access: "create"
|
|
33789
33926
|
},
|
|
33927
|
+
"storageMigration.cleanupCancel": {
|
|
33928
|
+
capName: "storage-migration",
|
|
33929
|
+
capScope: "system",
|
|
33930
|
+
addonId: null,
|
|
33931
|
+
access: "create"
|
|
33932
|
+
},
|
|
33933
|
+
"storageMigration.cleanupStart": {
|
|
33934
|
+
capName: "storage-migration",
|
|
33935
|
+
capScope: "system",
|
|
33936
|
+
addonId: null,
|
|
33937
|
+
access: "create"
|
|
33938
|
+
},
|
|
33939
|
+
"storageMigration.cleanupStatus": {
|
|
33940
|
+
capName: "storage-migration",
|
|
33941
|
+
capScope: "system",
|
|
33942
|
+
addonId: null,
|
|
33943
|
+
access: "view"
|
|
33944
|
+
},
|
|
33790
33945
|
"storageMigration.drain": {
|
|
33791
33946
|
capName: "storage-migration",
|
|
33792
33947
|
capScope: "system",
|
|
33793
33948
|
addonId: null,
|
|
33794
33949
|
access: "create"
|
|
33795
33950
|
},
|
|
33951
|
+
"storageMigration.history": {
|
|
33952
|
+
capName: "storage-migration",
|
|
33953
|
+
capScope: "system",
|
|
33954
|
+
addonId: null,
|
|
33955
|
+
access: "view"
|
|
33956
|
+
},
|
|
33796
33957
|
"storageMigration.movers": {
|
|
33797
33958
|
capName: "storage-migration",
|
|
33798
33959
|
capScope: "system",
|
|
@@ -35789,11 +35950,6 @@ Object.freeze({
|
|
|
35789
35950
|
form: "single",
|
|
35790
35951
|
optional: true
|
|
35791
35952
|
}],
|
|
35792
|
-
"pipelineAnalytics.getGroup": [{
|
|
35793
|
-
name: "deviceId",
|
|
35794
|
-
form: "single",
|
|
35795
|
-
optional: false
|
|
35796
|
-
}],
|
|
35797
35953
|
"pipelineAnalytics.getKeyEvents": [{
|
|
35798
35954
|
name: "deviceId",
|
|
35799
35955
|
form: "single",
|
|
@@ -35859,11 +36015,6 @@ Object.freeze({
|
|
|
35859
36015
|
form: "single",
|
|
35860
36016
|
optional: false
|
|
35861
36017
|
}],
|
|
35862
|
-
"pipelineAnalytics.listGroups": [{
|
|
35863
|
-
name: "deviceIds",
|
|
35864
|
-
form: "array",
|
|
35865
|
-
optional: false
|
|
35866
|
-
}],
|
|
35867
36018
|
"pipelineAnalytics.listOpsLog": [{
|
|
35868
36019
|
name: "deviceId",
|
|
35869
36020
|
form: "single",
|
|
@@ -35909,6 +36060,11 @@ Object.freeze({
|
|
|
35909
36060
|
form: "single",
|
|
35910
36061
|
optional: true
|
|
35911
36062
|
}],
|
|
36063
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
36064
|
+
name: "deviceIds",
|
|
36065
|
+
form: "array",
|
|
36066
|
+
optional: true
|
|
36067
|
+
}],
|
|
35912
36068
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
35913
36069
|
name: "deviceId",
|
|
35914
36070
|
form: "single",
|
|
@@ -36274,6 +36430,11 @@ Object.freeze({
|
|
|
36274
36430
|
form: "single",
|
|
36275
36431
|
optional: false
|
|
36276
36432
|
}],
|
|
36433
|
+
"recording.setDevicePlacement": [{
|
|
36434
|
+
name: "deviceId",
|
|
36435
|
+
form: "single",
|
|
36436
|
+
optional: false
|
|
36437
|
+
}],
|
|
36277
36438
|
"recording.startStorageMigrationMove": [{
|
|
36278
36439
|
name: "deviceId",
|
|
36279
36440
|
form: "single",
|
package/dist/addon.mjs
CHANGED
|
@@ -8326,6 +8326,13 @@ var MediaRelocateModeSchema = _enum([
|
|
|
8326
8326
|
]);
|
|
8327
8327
|
var RelocateMediaInputSchema = object({
|
|
8328
8328
|
toLocationId: string(),
|
|
8329
|
+
/**
|
|
8330
|
+
* Restrict the pass to rows currently on this location. Omitted / `'*'` =
|
|
8331
|
+
* every row that is not already on `toLocationId` (the historical
|
|
8332
|
+
* behaviour). A named source is what a from→to migration needs: without it
|
|
8333
|
+
* "move events off disk 2" also emptied disk 1.
|
|
8334
|
+
*/
|
|
8335
|
+
fromLocationId: string().optional(),
|
|
8329
8336
|
throttleMbps: number$1().min(1).max(1e3).optional(),
|
|
8330
8337
|
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8331
8338
|
mode: MediaRelocateModeSchema.optional()
|
|
@@ -8393,6 +8400,19 @@ var StorageMigrationDestinationsSchema = object({
|
|
|
8393
8400
|
galleryMedia: string().min(1).optional()
|
|
8394
8401
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8395
8402
|
/**
|
|
8403
|
+
* Optional named source per class. Omitted = the class's current default
|
|
8404
|
+
* (the historical behaviour). A named source that is NOT the default is a
|
|
8405
|
+
* drain of that disk: bytes move, the default stays, and the source is
|
|
8406
|
+
* disabled when the move finishes.
|
|
8407
|
+
*/
|
|
8408
|
+
var StorageMigrationSourcesSchema = object({
|
|
8409
|
+
recordings: string().min(1).optional(),
|
|
8410
|
+
recordingsLow: string().min(1).optional(),
|
|
8411
|
+
eventMedia: string().min(1).optional(),
|
|
8412
|
+
backups: string().min(1).optional(),
|
|
8413
|
+
galleryMedia: string().min(1).optional()
|
|
8414
|
+
}).optional();
|
|
8415
|
+
/**
|
|
8396
8416
|
* How a migration sequences the cutover against the byte move.
|
|
8397
8417
|
*
|
|
8398
8418
|
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
@@ -8414,6 +8434,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
|
8414
8434
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8415
8435
|
var StorageMigrationInputSchema = object({
|
|
8416
8436
|
destinations: StorageMigrationDestinationsSchema,
|
|
8437
|
+
/** Omitted = each class's current default. */
|
|
8438
|
+
sources: StorageMigrationSourcesSchema,
|
|
8417
8439
|
throttleMbps: number$1().min(1).max(1e3).optional(),
|
|
8418
8440
|
/** Omitted = `blocking`, which stays the default. */
|
|
8419
8441
|
mode: StorageMigrationModeSchema.optional()
|
|
@@ -8493,6 +8515,13 @@ var StorageMigrationMoveSchema = object({
|
|
|
8493
8515
|
storageClass: StorageMigrationClassSchema,
|
|
8494
8516
|
fromLocationId: string(),
|
|
8495
8517
|
toLocationId: string(),
|
|
8518
|
+
/**
|
|
8519
|
+
* True when `from` was NOT the class default at plan time. The move still
|
|
8520
|
+
* copies bytes, but the default is left alone and the source is disabled
|
|
8521
|
+
* once the copy verifies. Absent on jobs planned before this field existed
|
|
8522
|
+
* — those jobs always repointed, which is `false`.
|
|
8523
|
+
*/
|
|
8524
|
+
freezeSource: boolean().optional(),
|
|
8496
8525
|
moverJobId: string().nullable(),
|
|
8497
8526
|
state: RelocateJobStateSchema.nullable(),
|
|
8498
8527
|
error: string().nullable(),
|
|
@@ -8506,6 +8535,7 @@ var StorageMigrationJobSchema = object({
|
|
|
8506
8535
|
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8507
8536
|
mode: StorageMigrationModeSchema,
|
|
8508
8537
|
destinations: StorageMigrationDestinationsSchema,
|
|
8538
|
+
sources: StorageMigrationSourcesSchema,
|
|
8509
8539
|
throttleMbps: number$1(),
|
|
8510
8540
|
moves: array(StorageMigrationMoveSchema),
|
|
8511
8541
|
pauseLeaseId: string().nullable(),
|
|
@@ -8531,6 +8561,7 @@ var StorageMigrationFindingSchema = object({
|
|
|
8531
8561
|
});
|
|
8532
8562
|
var StorageMigrationPlanSchema = object({
|
|
8533
8563
|
destinations: StorageMigrationDestinationsSchema,
|
|
8564
|
+
sources: StorageMigrationSourcesSchema,
|
|
8534
8565
|
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8535
8566
|
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8536
8567
|
* it. */
|
|
@@ -8538,7 +8569,8 @@ var StorageMigrationPlanSchema = object({
|
|
|
8538
8569
|
moves: array(object({
|
|
8539
8570
|
storageClass: StorageMigrationClassSchema,
|
|
8540
8571
|
fromLocationId: string(),
|
|
8541
|
-
toLocationId: string()
|
|
8572
|
+
toLocationId: string(),
|
|
8573
|
+
freezeSource: boolean().optional()
|
|
8542
8574
|
})),
|
|
8543
8575
|
findings: array(StorageMigrationFindingSchema)
|
|
8544
8576
|
});
|
|
@@ -8716,10 +8748,51 @@ var LedgerWalkReportSchema = object({
|
|
|
8716
8748
|
var RelocatableMediaCountSchema = object({ rows: number$1().int().nonnegative() }).nullable();
|
|
8717
8749
|
var RelocatableMediaCountInputSchema = object({
|
|
8718
8750
|
toLocationId: string().min(1),
|
|
8751
|
+
/** Restrict the count to one source; omitted / `'*'` = every non-target row. */
|
|
8752
|
+
fromLocationId: string().optional(),
|
|
8719
8753
|
/** Omitted = `move`. */
|
|
8720
8754
|
mode: MediaRelocateModeSchema.optional()
|
|
8721
8755
|
});
|
|
8722
8756
|
/**
|
|
8757
|
+
* Operator cleanup of leftover analytics rows, optional debug media, and
|
|
8758
|
+
* ghost ledger entries on frozen footage locations.
|
|
8759
|
+
*
|
|
8760
|
+
* A pass is tens of minutes on a standing backlog. The hub method RETURNS
|
|
8761
|
+
* `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
|
|
8762
|
+
* is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
|
|
8763
|
+
* with no operator-visible status.
|
|
8764
|
+
*/
|
|
8765
|
+
var StorageCleanupPhaseSchema = _enum([
|
|
8766
|
+
"orphans",
|
|
8767
|
+
"debug-media",
|
|
8768
|
+
"ghost-ledger",
|
|
8769
|
+
"done",
|
|
8770
|
+
"failed",
|
|
8771
|
+
"cancelled"
|
|
8772
|
+
]);
|
|
8773
|
+
var StorageCleanupInputSchema = object({
|
|
8774
|
+
/** Also walk motion stills / track filmstrips. Off by default. */
|
|
8775
|
+
includeDebugMedia: boolean().optional() });
|
|
8776
|
+
var StorageCleanupJobSchema = object({
|
|
8777
|
+
jobId: string(),
|
|
8778
|
+
phase: StorageCleanupPhaseSchema,
|
|
8779
|
+
includeDebugMedia: boolean(),
|
|
8780
|
+
orphansReclaimed: number$1().int().nonnegative(),
|
|
8781
|
+
orphanBytesReclaimed: number$1().int().nonnegative(),
|
|
8782
|
+
debugMediaReclaimed: number$1().int().nonnegative(),
|
|
8783
|
+
debugMediaBytesReclaimed: number$1().int().nonnegative(),
|
|
8784
|
+
ghostsForgotten: number$1().int().nonnegative(),
|
|
8785
|
+
ghostBytesForgotten: number$1().int().nonnegative(),
|
|
8786
|
+
/** Short operator-facing line: current collection, pass, or location. */
|
|
8787
|
+
detail: string().nullable(),
|
|
8788
|
+
cancelRequested: boolean(),
|
|
8789
|
+
startedAt: number$1(),
|
|
8790
|
+
updatedAt: number$1(),
|
|
8791
|
+
finishedAt: number$1().nullable(),
|
|
8792
|
+
error: string().nullable()
|
|
8793
|
+
});
|
|
8794
|
+
var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
|
|
8795
|
+
/**
|
|
8723
8796
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
8724
8797
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
8725
8798
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -8747,11 +8820,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
|
|
|
8747
8820
|
* The default location for a type uses `id === <type>:default` by
|
|
8748
8821
|
* convention (the bare type ref like `'backups'` resolves to it).
|
|
8749
8822
|
*
|
|
8750
|
-
* `isSystem
|
|
8751
|
-
*
|
|
8752
|
-
*
|
|
8753
|
-
*
|
|
8754
|
-
* deleting it is rejected at the cap level.
|
|
8823
|
+
* `isSystem` is a legacy persisted flag. Seed still creates the initial
|
|
8824
|
+
* `<type>:default` locations; the flag is no longer a lock, a badge, or a
|
|
8825
|
+
* prune selector. New writes leave it false. Deletion is gated on uniqueness
|
|
8826
|
+
* / last-enabled, not on this bit.
|
|
8755
8827
|
*/
|
|
8756
8828
|
var StorageLocationSchema = object({
|
|
8757
8829
|
id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
|
|
@@ -13013,6 +13085,12 @@ method(object({
|
|
|
13013
13085
|
}), _void(), {
|
|
13014
13086
|
kind: "mutation",
|
|
13015
13087
|
auth: "admin"
|
|
13088
|
+
}), method(object({
|
|
13089
|
+
from: string(),
|
|
13090
|
+
to: string()
|
|
13091
|
+
}), object({ moved: number$1() }), {
|
|
13092
|
+
kind: "mutation",
|
|
13093
|
+
auth: "admin"
|
|
13016
13094
|
}), method(object({
|
|
13017
13095
|
deviceId: number$1(),
|
|
13018
13096
|
disabled: boolean()
|
|
@@ -19037,46 +19115,6 @@ var RecentTracksPageSchema = object({
|
|
|
19037
19115
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19038
19116
|
nextCursor: string().nullable()
|
|
19039
19117
|
});
|
|
19040
|
-
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
19041
|
-
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
19042
|
-
var AnalyticsGroupRecordSchema = object({
|
|
19043
|
-
id: string(),
|
|
19044
|
-
deviceId: number$1().int(),
|
|
19045
|
-
openedAt: number$1().int(),
|
|
19046
|
-
closedAt: number$1().int(),
|
|
19047
|
-
timestamp: number$1().int(),
|
|
19048
|
-
memberCount: number$1().int(),
|
|
19049
|
-
memberTrackIds: array(string()).readonly(),
|
|
19050
|
-
className: string(),
|
|
19051
|
-
classes: array(string()).readonly(),
|
|
19052
|
-
/** Relative event-media path, or null when the group has no picture yet. */
|
|
19053
|
-
mediaUrl: string().nullable(),
|
|
19054
|
-
singleton: boolean()
|
|
19055
|
-
});
|
|
19056
|
-
var AnalyticsGroupMemberSchema = object({
|
|
19057
|
-
trackId: string(),
|
|
19058
|
-
deviceId: number$1().int(),
|
|
19059
|
-
className: string(),
|
|
19060
|
-
firstSeen: number$1().int(),
|
|
19061
|
-
lastSeen: number$1().int(),
|
|
19062
|
-
mediaUrl: string().nullable()
|
|
19063
|
-
});
|
|
19064
|
-
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
19065
|
-
var ListGroupsQueryInput = object({
|
|
19066
|
-
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
19067
|
-
deviceIds: array(number$1()),
|
|
19068
|
-
/** Window lower bound on `closedAt` (inclusive). */
|
|
19069
|
-
since: number$1().optional(),
|
|
19070
|
-
/** Window upper bound on `openedAt` (inclusive). */
|
|
19071
|
-
until: number$1().optional(),
|
|
19072
|
-
limit: number$1().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
19073
|
-
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
19074
|
-
cursor: string().optional()
|
|
19075
|
-
});
|
|
19076
|
-
var ListGroupsPageSchema = object({
|
|
19077
|
-
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
19078
|
-
nextCursor: string().nullable()
|
|
19079
|
-
});
|
|
19080
19118
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19081
19119
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19082
19120
|
var KeyEventQueryInput = object({
|
|
@@ -19180,9 +19218,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19180
19218
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19181
19219
|
plates: number$1().int(),
|
|
19182
19220
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
19183
|
-
embeddings: number$1().int()
|
|
19184
|
-
/** Group membership + group rows removed with their last member (best-effort). */
|
|
19185
|
-
groups: number$1().int()
|
|
19221
|
+
embeddings: number$1().int()
|
|
19186
19222
|
});
|
|
19187
19223
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19188
19224
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19352,6 +19388,47 @@ var RebuildStatusSchema = object({
|
|
|
19352
19388
|
/** Present when the pass ended by throwing. */
|
|
19353
19389
|
error: string().nullable()
|
|
19354
19390
|
});
|
|
19391
|
+
/**
|
|
19392
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19393
|
+
*
|
|
19394
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19395
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19396
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19397
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19398
|
+
*/
|
|
19399
|
+
var MediaReclaimStartResultSchema = object({
|
|
19400
|
+
started: boolean(),
|
|
19401
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19402
|
+
alreadyRunning: boolean()
|
|
19403
|
+
});
|
|
19404
|
+
var MediaReclaimInputSchema = object({
|
|
19405
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19406
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19407
|
+
deviceIds: array(number$1().int()).min(1).optional(),
|
|
19408
|
+
restart: boolean().optional(),
|
|
19409
|
+
pageSize: number$1().int().min(50).max(5e3).optional(),
|
|
19410
|
+
maxRowsPerDevice: number$1().int().min(1).max(5e5).optional(),
|
|
19411
|
+
maxReclaimPerDevice: number$1().int().min(1).max(5e5).optional(),
|
|
19412
|
+
maxBytesPerRun: number$1().int().min(1).optional(),
|
|
19413
|
+
budgetMinutes: number$1().int().min(1).max(720).optional(),
|
|
19414
|
+
throttleBytesPerSec: number$1().int().min(64 * 1024).optional(),
|
|
19415
|
+
graceMinutes: number$1().int().min(1).max(10080).optional()
|
|
19416
|
+
});
|
|
19417
|
+
var MediaReclaimStatusSchema = object({
|
|
19418
|
+
running: boolean(),
|
|
19419
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19420
|
+
totalExamined: number$1(),
|
|
19421
|
+
totalEligible: number$1(),
|
|
19422
|
+
totalReclaimed: number$1(),
|
|
19423
|
+
totalBytesReclaimed: number$1(),
|
|
19424
|
+
totalRefused: number$1(),
|
|
19425
|
+
/** Device+scope windows finished in this pass. */
|
|
19426
|
+
devicesDone: number$1(),
|
|
19427
|
+
complete: boolean().nullable(),
|
|
19428
|
+
startedAtMs: number$1().nullable(),
|
|
19429
|
+
finishedAtMs: number$1().nullable(),
|
|
19430
|
+
error: string().nullable()
|
|
19431
|
+
});
|
|
19355
19432
|
var ReplayFrameInputSchema = object({
|
|
19356
19433
|
timestamp: number$1(),
|
|
19357
19434
|
frame: PipelineRunResultBridge
|
|
@@ -19390,10 +19467,7 @@ DeviceType.Camera, method(object({ deviceId: number$1() }), array(TrackSchema).r
|
|
|
19390
19467
|
* stationary registry). Default false: the timeline lists passages,
|
|
19391
19468
|
* not parking records (operator decision, 2026-08-15). */
|
|
19392
19469
|
includeStationary: boolean().optional()
|
|
19393
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
19394
|
-
deviceId: number$1(),
|
|
19395
|
-
groupId: string().min(1)
|
|
19396
|
-
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number$1() }), _void(), {
|
|
19470
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number$1() }), _void(), {
|
|
19397
19471
|
kind: "mutation",
|
|
19398
19472
|
auth: "admin"
|
|
19399
19473
|
}), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({ deviceId: number$1() }), array(EventKindDescriptorSchema).readonly()), method(object({ deviceIds: array(number$1()).min(1).max(200) }), array(EventKindsForDeviceSchema).readonly()), method(object({
|
|
@@ -19493,6 +19567,12 @@ DeviceType.Camera, method(object({ deviceId: number$1() }), array(TrackSchema).r
|
|
|
19493
19567
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19494
19568
|
kind: "query",
|
|
19495
19569
|
auth: "admin"
|
|
19570
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19571
|
+
kind: "mutation",
|
|
19572
|
+
auth: "admin"
|
|
19573
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19574
|
+
kind: "query",
|
|
19575
|
+
auth: "admin"
|
|
19496
19576
|
}), method(object({ deviceIds: array(number$1()).optional() }), TrainingExportSummarySchema, {
|
|
19497
19577
|
kind: "query",
|
|
19498
19578
|
auth: "admin"
|
|
@@ -21463,7 +21543,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21463
21543
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21464
21544
|
kind: "mutation",
|
|
21465
21545
|
auth: "admin"
|
|
21466
|
-
})
|
|
21546
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21547
|
+
kind: "mutation",
|
|
21548
|
+
auth: "admin"
|
|
21549
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21550
|
+
kind: "mutation",
|
|
21551
|
+
auth: "admin"
|
|
21552
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21467
21553
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21468
21554
|
providerId: string().min(1),
|
|
21469
21555
|
displayName: string().min(1),
|
|
@@ -26841,6 +26927,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
26841
26927
|
minMoveGb: number$1().min(0).optional()
|
|
26842
26928
|
});
|
|
26843
26929
|
/**
|
|
26930
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
26931
|
+
*
|
|
26932
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
26933
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
26934
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
26935
|
+
*/
|
|
26936
|
+
var RecordingDevicePlacementSchema = object({
|
|
26937
|
+
deviceId: number$1().int(),
|
|
26938
|
+
profile: string(),
|
|
26939
|
+
locationId: string()
|
|
26940
|
+
});
|
|
26941
|
+
var RecordingDevicePinSchema = object({
|
|
26942
|
+
deviceId: number$1().int(),
|
|
26943
|
+
/** Recordings-class location this camera is pinned to. */
|
|
26944
|
+
locationId: string()
|
|
26945
|
+
});
|
|
26946
|
+
var RecordingPlacementViewSchema = object({
|
|
26947
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
26948
|
+
pins: array(RecordingDevicePinSchema),
|
|
26949
|
+
defaultLocations: record(string(), string())
|
|
26950
|
+
});
|
|
26951
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
26952
|
+
deviceId: number$1().int(),
|
|
26953
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
26954
|
+
locationId: string().nullable()
|
|
26955
|
+
});
|
|
26956
|
+
/**
|
|
26844
26957
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
26845
26958
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
26846
26959
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -27066,6 +27179,12 @@ method(object({
|
|
|
27066
27179
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
27067
27180
|
kind: "mutation",
|
|
27068
27181
|
auth: "admin"
|
|
27182
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
27183
|
+
kind: "query",
|
|
27184
|
+
auth: "admin"
|
|
27185
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
27186
|
+
kind: "mutation",
|
|
27187
|
+
auth: "admin"
|
|
27069
27188
|
});
|
|
27070
27189
|
/**
|
|
27071
27190
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -30436,6 +30555,12 @@ Object.freeze({
|
|
|
30436
30555
|
addonId: null,
|
|
30437
30556
|
access: "delete"
|
|
30438
30557
|
},
|
|
30558
|
+
"deviceManager.renameLocation": {
|
|
30559
|
+
capName: "device-manager",
|
|
30560
|
+
capScope: "system",
|
|
30561
|
+
addonId: null,
|
|
30562
|
+
access: "create"
|
|
30563
|
+
},
|
|
30439
30564
|
"deviceManager.runDeviceAction": {
|
|
30440
30565
|
capName: "device-manager",
|
|
30441
30566
|
capScope: "system",
|
|
@@ -32128,19 +32253,19 @@ Object.freeze({
|
|
|
32128
32253
|
addonId: null,
|
|
32129
32254
|
access: "view"
|
|
32130
32255
|
},
|
|
32131
|
-
"pipelineAnalytics.
|
|
32256
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
32132
32257
|
capName: "pipeline-analytics",
|
|
32133
32258
|
capScope: "device",
|
|
32134
32259
|
addonId: null,
|
|
32135
32260
|
access: "view"
|
|
32136
32261
|
},
|
|
32137
|
-
"pipelineAnalytics.
|
|
32262
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
32138
32263
|
capName: "pipeline-analytics",
|
|
32139
32264
|
capScope: "device",
|
|
32140
32265
|
addonId: null,
|
|
32141
32266
|
access: "view"
|
|
32142
32267
|
},
|
|
32143
|
-
"pipelineAnalytics.
|
|
32268
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
32144
32269
|
capName: "pipeline-analytics",
|
|
32145
32270
|
capScope: "device",
|
|
32146
32271
|
addonId: null,
|
|
@@ -32230,12 +32355,6 @@ Object.freeze({
|
|
|
32230
32355
|
addonId: null,
|
|
32231
32356
|
access: "view"
|
|
32232
32357
|
},
|
|
32233
|
-
"pipelineAnalytics.listGroups": {
|
|
32234
|
-
capName: "pipeline-analytics",
|
|
32235
|
-
capScope: "device",
|
|
32236
|
-
addonId: null,
|
|
32237
|
-
access: "view"
|
|
32238
|
-
},
|
|
32239
32358
|
"pipelineAnalytics.listOpsLog": {
|
|
32240
32359
|
capName: "pipeline-analytics",
|
|
32241
32360
|
capScope: "device",
|
|
@@ -32320,6 +32439,12 @@ Object.freeze({
|
|
|
32320
32439
|
addonId: null,
|
|
32321
32440
|
access: "create"
|
|
32322
32441
|
},
|
|
32442
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
32443
|
+
capName: "pipeline-analytics",
|
|
32444
|
+
capScope: "device",
|
|
32445
|
+
addonId: null,
|
|
32446
|
+
access: "create"
|
|
32447
|
+
},
|
|
32323
32448
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
32324
32449
|
capName: "pipeline-analytics",
|
|
32325
32450
|
capScope: "device",
|
|
@@ -33244,6 +33369,12 @@ Object.freeze({
|
|
|
33244
33369
|
addonId: null,
|
|
33245
33370
|
access: "view"
|
|
33246
33371
|
},
|
|
33372
|
+
"recording.getPlacement": {
|
|
33373
|
+
capName: "recording",
|
|
33374
|
+
capScope: "system",
|
|
33375
|
+
addonId: null,
|
|
33376
|
+
access: "view"
|
|
33377
|
+
},
|
|
33247
33378
|
"recording.getPlaybackManifest": {
|
|
33248
33379
|
capName: "recording",
|
|
33249
33380
|
capScope: "system",
|
|
@@ -33370,6 +33501,12 @@ Object.freeze({
|
|
|
33370
33501
|
addonId: null,
|
|
33371
33502
|
access: "create"
|
|
33372
33503
|
},
|
|
33504
|
+
"recording.setDevicePlacement": {
|
|
33505
|
+
capName: "recording",
|
|
33506
|
+
capScope: "system",
|
|
33507
|
+
addonId: null,
|
|
33508
|
+
access: "create"
|
|
33509
|
+
},
|
|
33373
33510
|
"recording.startStorageMigrationMove": {
|
|
33374
33511
|
capName: "recording",
|
|
33375
33512
|
capScope: "system",
|
|
@@ -33814,12 +33951,36 @@ Object.freeze({
|
|
|
33814
33951
|
addonId: null,
|
|
33815
33952
|
access: "create"
|
|
33816
33953
|
},
|
|
33954
|
+
"storageMigration.cleanupCancel": {
|
|
33955
|
+
capName: "storage-migration",
|
|
33956
|
+
capScope: "system",
|
|
33957
|
+
addonId: null,
|
|
33958
|
+
access: "create"
|
|
33959
|
+
},
|
|
33960
|
+
"storageMigration.cleanupStart": {
|
|
33961
|
+
capName: "storage-migration",
|
|
33962
|
+
capScope: "system",
|
|
33963
|
+
addonId: null,
|
|
33964
|
+
access: "create"
|
|
33965
|
+
},
|
|
33966
|
+
"storageMigration.cleanupStatus": {
|
|
33967
|
+
capName: "storage-migration",
|
|
33968
|
+
capScope: "system",
|
|
33969
|
+
addonId: null,
|
|
33970
|
+
access: "view"
|
|
33971
|
+
},
|
|
33817
33972
|
"storageMigration.drain": {
|
|
33818
33973
|
capName: "storage-migration",
|
|
33819
33974
|
capScope: "system",
|
|
33820
33975
|
addonId: null,
|
|
33821
33976
|
access: "create"
|
|
33822
33977
|
},
|
|
33978
|
+
"storageMigration.history": {
|
|
33979
|
+
capName: "storage-migration",
|
|
33980
|
+
capScope: "system",
|
|
33981
|
+
addonId: null,
|
|
33982
|
+
access: "view"
|
|
33983
|
+
},
|
|
33823
33984
|
"storageMigration.movers": {
|
|
33824
33985
|
capName: "storage-migration",
|
|
33825
33986
|
capScope: "system",
|
|
@@ -35816,11 +35977,6 @@ Object.freeze({
|
|
|
35816
35977
|
form: "single",
|
|
35817
35978
|
optional: true
|
|
35818
35979
|
}],
|
|
35819
|
-
"pipelineAnalytics.getGroup": [{
|
|
35820
|
-
name: "deviceId",
|
|
35821
|
-
form: "single",
|
|
35822
|
-
optional: false
|
|
35823
|
-
}],
|
|
35824
35980
|
"pipelineAnalytics.getKeyEvents": [{
|
|
35825
35981
|
name: "deviceId",
|
|
35826
35982
|
form: "single",
|
|
@@ -35886,11 +36042,6 @@ Object.freeze({
|
|
|
35886
36042
|
form: "single",
|
|
35887
36043
|
optional: false
|
|
35888
36044
|
}],
|
|
35889
|
-
"pipelineAnalytics.listGroups": [{
|
|
35890
|
-
name: "deviceIds",
|
|
35891
|
-
form: "array",
|
|
35892
|
-
optional: false
|
|
35893
|
-
}],
|
|
35894
36045
|
"pipelineAnalytics.listOpsLog": [{
|
|
35895
36046
|
name: "deviceId",
|
|
35896
36047
|
form: "single",
|
|
@@ -35936,6 +36087,11 @@ Object.freeze({
|
|
|
35936
36087
|
form: "single",
|
|
35937
36088
|
optional: true
|
|
35938
36089
|
}],
|
|
36090
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
36091
|
+
name: "deviceIds",
|
|
36092
|
+
form: "array",
|
|
36093
|
+
optional: true
|
|
36094
|
+
}],
|
|
35939
36095
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
35940
36096
|
name: "deviceId",
|
|
35941
36097
|
form: "single",
|
|
@@ -36301,6 +36457,11 @@ Object.freeze({
|
|
|
36301
36457
|
form: "single",
|
|
36302
36458
|
optional: false
|
|
36303
36459
|
}],
|
|
36460
|
+
"recording.setDevicePlacement": [{
|
|
36461
|
+
name: "deviceId",
|
|
36462
|
+
form: "single",
|
|
36463
|
+
optional: false
|
|
36464
|
+
}],
|
|
36304
36465
|
"recording.startStorageMigrationMove": [{
|
|
36305
36466
|
name: "deviceId",
|
|
36306
36467
|
form: "single",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-ai",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.47",
|
|
4
4
|
"description": "AI addon for CamStack — the `llm` collection provider (cloud, LAN, and camstack-managed local llama.cpp profiles) plus the per-node `llm-runtime` managed executor.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|