@camstack/addon-export-hap 1.2.60 → 1.2.62
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/hap-export.addon.js +236 -73
- package/dist/hap-export.addon.mjs +236 -73
- package/package.json +1 -1
package/dist/hap-export.addon.js
CHANGED
|
@@ -8762,6 +8762,13 @@ var MediaRelocateModeSchema = _enum([
|
|
|
8762
8762
|
]);
|
|
8763
8763
|
var RelocateMediaInputSchema = object({
|
|
8764
8764
|
toLocationId: string(),
|
|
8765
|
+
/**
|
|
8766
|
+
* Restrict the pass to rows currently on this location. Omitted / `'*'` =
|
|
8767
|
+
* every row that is not already on `toLocationId` (the historical
|
|
8768
|
+
* behaviour). A named source is what a from→to migration needs: without it
|
|
8769
|
+
* "move events off disk 2" also emptied disk 1.
|
|
8770
|
+
*/
|
|
8771
|
+
fromLocationId: string().optional(),
|
|
8765
8772
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8766
8773
|
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8767
8774
|
mode: MediaRelocateModeSchema.optional()
|
|
@@ -8829,6 +8836,19 @@ var StorageMigrationDestinationsSchema = object({
|
|
|
8829
8836
|
galleryMedia: string().min(1).optional()
|
|
8830
8837
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8831
8838
|
/**
|
|
8839
|
+
* Optional named source per class. Omitted = the class's current default
|
|
8840
|
+
* (the historical behaviour). A named source that is NOT the default is a
|
|
8841
|
+
* drain of that disk: bytes move, the default stays, and the source is
|
|
8842
|
+
* disabled when the move finishes.
|
|
8843
|
+
*/
|
|
8844
|
+
var StorageMigrationSourcesSchema = object({
|
|
8845
|
+
recordings: string().min(1).optional(),
|
|
8846
|
+
recordingsLow: string().min(1).optional(),
|
|
8847
|
+
eventMedia: string().min(1).optional(),
|
|
8848
|
+
backups: string().min(1).optional(),
|
|
8849
|
+
galleryMedia: string().min(1).optional()
|
|
8850
|
+
}).optional();
|
|
8851
|
+
/**
|
|
8832
8852
|
* How a migration sequences the cutover against the byte move.
|
|
8833
8853
|
*
|
|
8834
8854
|
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
@@ -8850,6 +8870,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
|
8850
8870
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8851
8871
|
var StorageMigrationInputSchema = object({
|
|
8852
8872
|
destinations: StorageMigrationDestinationsSchema,
|
|
8873
|
+
/** Omitted = each class's current default. */
|
|
8874
|
+
sources: StorageMigrationSourcesSchema,
|
|
8853
8875
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8854
8876
|
/** Omitted = `blocking`, which stays the default. */
|
|
8855
8877
|
mode: StorageMigrationModeSchema.optional()
|
|
@@ -8929,6 +8951,13 @@ var StorageMigrationMoveSchema = object({
|
|
|
8929
8951
|
storageClass: StorageMigrationClassSchema,
|
|
8930
8952
|
fromLocationId: string(),
|
|
8931
8953
|
toLocationId: string(),
|
|
8954
|
+
/**
|
|
8955
|
+
* True when `from` was NOT the class default at plan time. The move still
|
|
8956
|
+
* copies bytes, but the default is left alone and the source is disabled
|
|
8957
|
+
* once the copy verifies. Absent on jobs planned before this field existed
|
|
8958
|
+
* — those jobs always repointed, which is `false`.
|
|
8959
|
+
*/
|
|
8960
|
+
freezeSource: boolean().optional(),
|
|
8932
8961
|
moverJobId: string().nullable(),
|
|
8933
8962
|
state: RelocateJobStateSchema.nullable(),
|
|
8934
8963
|
error: string().nullable(),
|
|
@@ -8942,6 +8971,7 @@ var StorageMigrationJobSchema = object({
|
|
|
8942
8971
|
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8943
8972
|
mode: StorageMigrationModeSchema,
|
|
8944
8973
|
destinations: StorageMigrationDestinationsSchema,
|
|
8974
|
+
sources: StorageMigrationSourcesSchema,
|
|
8945
8975
|
throttleMbps: number(),
|
|
8946
8976
|
moves: array(StorageMigrationMoveSchema),
|
|
8947
8977
|
pauseLeaseId: string().nullable(),
|
|
@@ -8967,6 +8997,7 @@ var StorageMigrationFindingSchema = object({
|
|
|
8967
8997
|
});
|
|
8968
8998
|
var StorageMigrationPlanSchema = object({
|
|
8969
8999
|
destinations: StorageMigrationDestinationsSchema,
|
|
9000
|
+
sources: StorageMigrationSourcesSchema,
|
|
8970
9001
|
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8971
9002
|
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8972
9003
|
* it. */
|
|
@@ -8974,7 +9005,8 @@ var StorageMigrationPlanSchema = object({
|
|
|
8974
9005
|
moves: array(object({
|
|
8975
9006
|
storageClass: StorageMigrationClassSchema,
|
|
8976
9007
|
fromLocationId: string(),
|
|
8977
|
-
toLocationId: string()
|
|
9008
|
+
toLocationId: string(),
|
|
9009
|
+
freezeSource: boolean().optional()
|
|
8978
9010
|
})),
|
|
8979
9011
|
findings: array(StorageMigrationFindingSchema)
|
|
8980
9012
|
});
|
|
@@ -9152,10 +9184,51 @@ var LedgerWalkReportSchema = object({
|
|
|
9152
9184
|
var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
|
|
9153
9185
|
var RelocatableMediaCountInputSchema = object({
|
|
9154
9186
|
toLocationId: string().min(1),
|
|
9187
|
+
/** Restrict the count to one source; omitted / `'*'` = every non-target row. */
|
|
9188
|
+
fromLocationId: string().optional(),
|
|
9155
9189
|
/** Omitted = `move`. */
|
|
9156
9190
|
mode: MediaRelocateModeSchema.optional()
|
|
9157
9191
|
});
|
|
9158
9192
|
/**
|
|
9193
|
+
* Operator cleanup of leftover analytics rows, optional debug media, and
|
|
9194
|
+
* ghost ledger entries on frozen footage locations.
|
|
9195
|
+
*
|
|
9196
|
+
* A pass is tens of minutes on a standing backlog. The hub method RETURNS
|
|
9197
|
+
* `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
|
|
9198
|
+
* is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
|
|
9199
|
+
* with no operator-visible status.
|
|
9200
|
+
*/
|
|
9201
|
+
var StorageCleanupPhaseSchema = _enum([
|
|
9202
|
+
"orphans",
|
|
9203
|
+
"debug-media",
|
|
9204
|
+
"ghost-ledger",
|
|
9205
|
+
"done",
|
|
9206
|
+
"failed",
|
|
9207
|
+
"cancelled"
|
|
9208
|
+
]);
|
|
9209
|
+
var StorageCleanupInputSchema = object({
|
|
9210
|
+
/** Also walk motion stills / track filmstrips. Off by default. */
|
|
9211
|
+
includeDebugMedia: boolean().optional() });
|
|
9212
|
+
var StorageCleanupJobSchema = object({
|
|
9213
|
+
jobId: string(),
|
|
9214
|
+
phase: StorageCleanupPhaseSchema,
|
|
9215
|
+
includeDebugMedia: boolean(),
|
|
9216
|
+
orphansReclaimed: number().int().nonnegative(),
|
|
9217
|
+
orphanBytesReclaimed: number().int().nonnegative(),
|
|
9218
|
+
debugMediaReclaimed: number().int().nonnegative(),
|
|
9219
|
+
debugMediaBytesReclaimed: number().int().nonnegative(),
|
|
9220
|
+
ghostsForgotten: number().int().nonnegative(),
|
|
9221
|
+
ghostBytesForgotten: number().int().nonnegative(),
|
|
9222
|
+
/** Short operator-facing line: current collection, pass, or location. */
|
|
9223
|
+
detail: string().nullable(),
|
|
9224
|
+
cancelRequested: boolean(),
|
|
9225
|
+
startedAt: number(),
|
|
9226
|
+
updatedAt: number(),
|
|
9227
|
+
finishedAt: number().nullable(),
|
|
9228
|
+
error: string().nullable()
|
|
9229
|
+
});
|
|
9230
|
+
var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
|
|
9231
|
+
/**
|
|
9159
9232
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
9160
9233
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
9161
9234
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -9183,11 +9256,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
|
|
|
9183
9256
|
* The default location for a type uses `id === <type>:default` by
|
|
9184
9257
|
* convention (the bare type ref like `'backups'` resolves to it).
|
|
9185
9258
|
*
|
|
9186
|
-
* `isSystem
|
|
9187
|
-
*
|
|
9188
|
-
*
|
|
9189
|
-
*
|
|
9190
|
-
* deleting it is rejected at the cap level.
|
|
9259
|
+
* `isSystem` is a legacy persisted flag. Seed still creates the initial
|
|
9260
|
+
* `<type>:default` locations; the flag is no longer a lock, a badge, or a
|
|
9261
|
+
* prune selector. New writes leave it false. Deletion is gated on uniqueness
|
|
9262
|
+
* / last-enabled, not on this bit.
|
|
9191
9263
|
*/
|
|
9192
9264
|
var StorageLocationSchema = object({
|
|
9193
9265
|
id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
|
|
@@ -13584,6 +13656,12 @@ method(object({
|
|
|
13584
13656
|
}), _void(), {
|
|
13585
13657
|
kind: "mutation",
|
|
13586
13658
|
auth: "admin"
|
|
13659
|
+
}), method(object({
|
|
13660
|
+
from: string(),
|
|
13661
|
+
to: string()
|
|
13662
|
+
}), object({ moved: number() }), {
|
|
13663
|
+
kind: "mutation",
|
|
13664
|
+
auth: "admin"
|
|
13587
13665
|
}), method(object({
|
|
13588
13666
|
deviceId: number(),
|
|
13589
13667
|
disabled: boolean()
|
|
@@ -16296,6 +16374,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
16296
16374
|
"device-offline",
|
|
16297
16375
|
"device-disabled",
|
|
16298
16376
|
"device-enabled",
|
|
16377
|
+
"device-battery-low",
|
|
16378
|
+
"device-battery-normal",
|
|
16299
16379
|
"stream-online",
|
|
16300
16380
|
"stream-offline",
|
|
16301
16381
|
"node-online",
|
|
@@ -19514,46 +19594,6 @@ var RecentTracksPageSchema = object({
|
|
|
19514
19594
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19515
19595
|
nextCursor: string().nullable()
|
|
19516
19596
|
});
|
|
19517
|
-
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
19518
|
-
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
19519
|
-
var AnalyticsGroupRecordSchema = object({
|
|
19520
|
-
id: string(),
|
|
19521
|
-
deviceId: number().int(),
|
|
19522
|
-
openedAt: number().int(),
|
|
19523
|
-
closedAt: number().int(),
|
|
19524
|
-
timestamp: number().int(),
|
|
19525
|
-
memberCount: number().int(),
|
|
19526
|
-
memberTrackIds: array(string()).readonly(),
|
|
19527
|
-
className: string(),
|
|
19528
|
-
classes: array(string()).readonly(),
|
|
19529
|
-
/** Relative event-media path, or null when the group has no picture yet. */
|
|
19530
|
-
mediaUrl: string().nullable(),
|
|
19531
|
-
singleton: boolean()
|
|
19532
|
-
});
|
|
19533
|
-
var AnalyticsGroupMemberSchema = object({
|
|
19534
|
-
trackId: string(),
|
|
19535
|
-
deviceId: number().int(),
|
|
19536
|
-
className: string(),
|
|
19537
|
-
firstSeen: number().int(),
|
|
19538
|
-
lastSeen: number().int(),
|
|
19539
|
-
mediaUrl: string().nullable()
|
|
19540
|
-
});
|
|
19541
|
-
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
19542
|
-
var ListGroupsQueryInput = object({
|
|
19543
|
-
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
19544
|
-
deviceIds: array(number()),
|
|
19545
|
-
/** Window lower bound on `closedAt` (inclusive). */
|
|
19546
|
-
since: number().optional(),
|
|
19547
|
-
/** Window upper bound on `openedAt` (inclusive). */
|
|
19548
|
-
until: number().optional(),
|
|
19549
|
-
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
19550
|
-
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
19551
|
-
cursor: string().optional()
|
|
19552
|
-
});
|
|
19553
|
-
var ListGroupsPageSchema = object({
|
|
19554
|
-
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
19555
|
-
nextCursor: string().nullable()
|
|
19556
|
-
});
|
|
19557
19597
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19558
19598
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19559
19599
|
var KeyEventQueryInput = object({
|
|
@@ -19657,9 +19697,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19657
19697
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19658
19698
|
plates: number().int(),
|
|
19659
19699
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
19660
|
-
embeddings: number().int()
|
|
19661
|
-
/** Group membership + group rows removed with their last member (best-effort). */
|
|
19662
|
-
groups: number().int()
|
|
19700
|
+
embeddings: number().int()
|
|
19663
19701
|
});
|
|
19664
19702
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19665
19703
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19829,6 +19867,47 @@ var RebuildStatusSchema = object({
|
|
|
19829
19867
|
/** Present when the pass ended by throwing. */
|
|
19830
19868
|
error: string().nullable()
|
|
19831
19869
|
});
|
|
19870
|
+
/**
|
|
19871
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19872
|
+
*
|
|
19873
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19874
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19875
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19876
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19877
|
+
*/
|
|
19878
|
+
var MediaReclaimStartResultSchema = object({
|
|
19879
|
+
started: boolean(),
|
|
19880
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19881
|
+
alreadyRunning: boolean()
|
|
19882
|
+
});
|
|
19883
|
+
var MediaReclaimInputSchema = object({
|
|
19884
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19885
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19886
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19887
|
+
restart: boolean().optional(),
|
|
19888
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19889
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19890
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19891
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19892
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19893
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19894
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19895
|
+
});
|
|
19896
|
+
var MediaReclaimStatusSchema = object({
|
|
19897
|
+
running: boolean(),
|
|
19898
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19899
|
+
totalExamined: number(),
|
|
19900
|
+
totalEligible: number(),
|
|
19901
|
+
totalReclaimed: number(),
|
|
19902
|
+
totalBytesReclaimed: number(),
|
|
19903
|
+
totalRefused: number(),
|
|
19904
|
+
/** Device+scope windows finished in this pass. */
|
|
19905
|
+
devicesDone: number(),
|
|
19906
|
+
complete: boolean().nullable(),
|
|
19907
|
+
startedAtMs: number().nullable(),
|
|
19908
|
+
finishedAtMs: number().nullable(),
|
|
19909
|
+
error: string().nullable()
|
|
19910
|
+
});
|
|
19832
19911
|
var ReplayFrameInputSchema = object({
|
|
19833
19912
|
timestamp: number(),
|
|
19834
19913
|
frame: PipelineRunResultBridge
|
|
@@ -19867,10 +19946,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19867
19946
|
* stationary registry). Default false: the timeline lists passages,
|
|
19868
19947
|
* not parking records (operator decision, 2026-08-15). */
|
|
19869
19948
|
includeStationary: boolean().optional()
|
|
19870
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
19871
|
-
deviceId: number(),
|
|
19872
|
-
groupId: string().min(1)
|
|
19873
|
-
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
19949
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19874
19950
|
kind: "mutation",
|
|
19875
19951
|
auth: "admin"
|
|
19876
19952
|
}), 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({
|
|
@@ -19970,6 +20046,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19970
20046
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19971
20047
|
kind: "query",
|
|
19972
20048
|
auth: "admin"
|
|
20049
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
20050
|
+
kind: "mutation",
|
|
20051
|
+
auth: "admin"
|
|
20052
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
20053
|
+
kind: "query",
|
|
20054
|
+
auth: "admin"
|
|
19973
20055
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19974
20056
|
kind: "query",
|
|
19975
20057
|
auth: "admin"
|
|
@@ -21940,7 +22022,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21940
22022
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21941
22023
|
kind: "mutation",
|
|
21942
22024
|
auth: "admin"
|
|
21943
|
-
})
|
|
22025
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
22026
|
+
kind: "mutation",
|
|
22027
|
+
auth: "admin"
|
|
22028
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
22029
|
+
kind: "mutation",
|
|
22030
|
+
auth: "admin"
|
|
22031
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21944
22032
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21945
22033
|
providerId: string().min(1),
|
|
21946
22034
|
displayName: string().min(1),
|
|
@@ -27366,6 +27454,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
27366
27454
|
minMoveGb: number().min(0).optional()
|
|
27367
27455
|
});
|
|
27368
27456
|
/**
|
|
27457
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
27458
|
+
*
|
|
27459
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
27460
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
27461
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
27462
|
+
*/
|
|
27463
|
+
var RecordingDevicePlacementSchema = object({
|
|
27464
|
+
deviceId: number().int(),
|
|
27465
|
+
profile: string(),
|
|
27466
|
+
locationId: string()
|
|
27467
|
+
});
|
|
27468
|
+
var RecordingDevicePinSchema = object({
|
|
27469
|
+
deviceId: number().int(),
|
|
27470
|
+
/** Recordings-class location this camera is pinned to. */
|
|
27471
|
+
locationId: string()
|
|
27472
|
+
});
|
|
27473
|
+
var RecordingPlacementViewSchema = object({
|
|
27474
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
27475
|
+
pins: array(RecordingDevicePinSchema),
|
|
27476
|
+
defaultLocations: record(string(), string())
|
|
27477
|
+
});
|
|
27478
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
27479
|
+
deviceId: number().int(),
|
|
27480
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
27481
|
+
locationId: string().nullable()
|
|
27482
|
+
});
|
|
27483
|
+
/**
|
|
27369
27484
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
27370
27485
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
27371
27486
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -27591,6 +27706,12 @@ method(object({
|
|
|
27591
27706
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
27592
27707
|
kind: "mutation",
|
|
27593
27708
|
auth: "admin"
|
|
27709
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
27710
|
+
kind: "query",
|
|
27711
|
+
auth: "admin"
|
|
27712
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
27713
|
+
kind: "mutation",
|
|
27714
|
+
auth: "admin"
|
|
27594
27715
|
});
|
|
27595
27716
|
/**
|
|
27596
27717
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -30986,6 +31107,12 @@ Object.freeze({
|
|
|
30986
31107
|
addonId: null,
|
|
30987
31108
|
access: "delete"
|
|
30988
31109
|
},
|
|
31110
|
+
"deviceManager.renameLocation": {
|
|
31111
|
+
capName: "device-manager",
|
|
31112
|
+
capScope: "system",
|
|
31113
|
+
addonId: null,
|
|
31114
|
+
access: "create"
|
|
31115
|
+
},
|
|
30989
31116
|
"deviceManager.runDeviceAction": {
|
|
30990
31117
|
capName: "device-manager",
|
|
30991
31118
|
capScope: "system",
|
|
@@ -32678,19 +32805,19 @@ Object.freeze({
|
|
|
32678
32805
|
addonId: null,
|
|
32679
32806
|
access: "view"
|
|
32680
32807
|
},
|
|
32681
|
-
"pipelineAnalytics.
|
|
32808
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
32682
32809
|
capName: "pipeline-analytics",
|
|
32683
32810
|
capScope: "device",
|
|
32684
32811
|
addonId: null,
|
|
32685
32812
|
access: "view"
|
|
32686
32813
|
},
|
|
32687
|
-
"pipelineAnalytics.
|
|
32814
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
32688
32815
|
capName: "pipeline-analytics",
|
|
32689
32816
|
capScope: "device",
|
|
32690
32817
|
addonId: null,
|
|
32691
32818
|
access: "view"
|
|
32692
32819
|
},
|
|
32693
|
-
"pipelineAnalytics.
|
|
32820
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
32694
32821
|
capName: "pipeline-analytics",
|
|
32695
32822
|
capScope: "device",
|
|
32696
32823
|
addonId: null,
|
|
@@ -32780,12 +32907,6 @@ Object.freeze({
|
|
|
32780
32907
|
addonId: null,
|
|
32781
32908
|
access: "view"
|
|
32782
32909
|
},
|
|
32783
|
-
"pipelineAnalytics.listGroups": {
|
|
32784
|
-
capName: "pipeline-analytics",
|
|
32785
|
-
capScope: "device",
|
|
32786
|
-
addonId: null,
|
|
32787
|
-
access: "view"
|
|
32788
|
-
},
|
|
32789
32910
|
"pipelineAnalytics.listOpsLog": {
|
|
32790
32911
|
capName: "pipeline-analytics",
|
|
32791
32912
|
capScope: "device",
|
|
@@ -32870,6 +32991,12 @@ Object.freeze({
|
|
|
32870
32991
|
addonId: null,
|
|
32871
32992
|
access: "create"
|
|
32872
32993
|
},
|
|
32994
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
32995
|
+
capName: "pipeline-analytics",
|
|
32996
|
+
capScope: "device",
|
|
32997
|
+
addonId: null,
|
|
32998
|
+
access: "create"
|
|
32999
|
+
},
|
|
32873
33000
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
32874
33001
|
capName: "pipeline-analytics",
|
|
32875
33002
|
capScope: "device",
|
|
@@ -33794,6 +33921,12 @@ Object.freeze({
|
|
|
33794
33921
|
addonId: null,
|
|
33795
33922
|
access: "view"
|
|
33796
33923
|
},
|
|
33924
|
+
"recording.getPlacement": {
|
|
33925
|
+
capName: "recording",
|
|
33926
|
+
capScope: "system",
|
|
33927
|
+
addonId: null,
|
|
33928
|
+
access: "view"
|
|
33929
|
+
},
|
|
33797
33930
|
"recording.getPlaybackManifest": {
|
|
33798
33931
|
capName: "recording",
|
|
33799
33932
|
capScope: "system",
|
|
@@ -33920,6 +34053,12 @@ Object.freeze({
|
|
|
33920
34053
|
addonId: null,
|
|
33921
34054
|
access: "create"
|
|
33922
34055
|
},
|
|
34056
|
+
"recording.setDevicePlacement": {
|
|
34057
|
+
capName: "recording",
|
|
34058
|
+
capScope: "system",
|
|
34059
|
+
addonId: null,
|
|
34060
|
+
access: "create"
|
|
34061
|
+
},
|
|
33923
34062
|
"recording.startStorageMigrationMove": {
|
|
33924
34063
|
capName: "recording",
|
|
33925
34064
|
capScope: "system",
|
|
@@ -34364,12 +34503,36 @@ Object.freeze({
|
|
|
34364
34503
|
addonId: null,
|
|
34365
34504
|
access: "create"
|
|
34366
34505
|
},
|
|
34506
|
+
"storageMigration.cleanupCancel": {
|
|
34507
|
+
capName: "storage-migration",
|
|
34508
|
+
capScope: "system",
|
|
34509
|
+
addonId: null,
|
|
34510
|
+
access: "create"
|
|
34511
|
+
},
|
|
34512
|
+
"storageMigration.cleanupStart": {
|
|
34513
|
+
capName: "storage-migration",
|
|
34514
|
+
capScope: "system",
|
|
34515
|
+
addonId: null,
|
|
34516
|
+
access: "create"
|
|
34517
|
+
},
|
|
34518
|
+
"storageMigration.cleanupStatus": {
|
|
34519
|
+
capName: "storage-migration",
|
|
34520
|
+
capScope: "system",
|
|
34521
|
+
addonId: null,
|
|
34522
|
+
access: "view"
|
|
34523
|
+
},
|
|
34367
34524
|
"storageMigration.drain": {
|
|
34368
34525
|
capName: "storage-migration",
|
|
34369
34526
|
capScope: "system",
|
|
34370
34527
|
addonId: null,
|
|
34371
34528
|
access: "create"
|
|
34372
34529
|
},
|
|
34530
|
+
"storageMigration.history": {
|
|
34531
|
+
capName: "storage-migration",
|
|
34532
|
+
capScope: "system",
|
|
34533
|
+
addonId: null,
|
|
34534
|
+
access: "view"
|
|
34535
|
+
},
|
|
34373
34536
|
"storageMigration.movers": {
|
|
34374
34537
|
capName: "storage-migration",
|
|
34375
34538
|
capScope: "system",
|
|
@@ -36366,11 +36529,6 @@ Object.freeze({
|
|
|
36366
36529
|
form: "single",
|
|
36367
36530
|
optional: true
|
|
36368
36531
|
}],
|
|
36369
|
-
"pipelineAnalytics.getGroup": [{
|
|
36370
|
-
name: "deviceId",
|
|
36371
|
-
form: "single",
|
|
36372
|
-
optional: false
|
|
36373
|
-
}],
|
|
36374
36532
|
"pipelineAnalytics.getKeyEvents": [{
|
|
36375
36533
|
name: "deviceId",
|
|
36376
36534
|
form: "single",
|
|
@@ -36436,11 +36594,6 @@ Object.freeze({
|
|
|
36436
36594
|
form: "single",
|
|
36437
36595
|
optional: false
|
|
36438
36596
|
}],
|
|
36439
|
-
"pipelineAnalytics.listGroups": [{
|
|
36440
|
-
name: "deviceIds",
|
|
36441
|
-
form: "array",
|
|
36442
|
-
optional: false
|
|
36443
|
-
}],
|
|
36444
36597
|
"pipelineAnalytics.listOpsLog": [{
|
|
36445
36598
|
name: "deviceId",
|
|
36446
36599
|
form: "single",
|
|
@@ -36486,6 +36639,11 @@ Object.freeze({
|
|
|
36486
36639
|
form: "single",
|
|
36487
36640
|
optional: true
|
|
36488
36641
|
}],
|
|
36642
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
36643
|
+
name: "deviceIds",
|
|
36644
|
+
form: "array",
|
|
36645
|
+
optional: true
|
|
36646
|
+
}],
|
|
36489
36647
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
36490
36648
|
name: "deviceId",
|
|
36491
36649
|
form: "single",
|
|
@@ -36851,6 +37009,11 @@ Object.freeze({
|
|
|
36851
37009
|
form: "single",
|
|
36852
37010
|
optional: false
|
|
36853
37011
|
}],
|
|
37012
|
+
"recording.setDevicePlacement": [{
|
|
37013
|
+
name: "deviceId",
|
|
37014
|
+
form: "single",
|
|
37015
|
+
optional: false
|
|
37016
|
+
}],
|
|
36854
37017
|
"recording.startStorageMigrationMove": [{
|
|
36855
37018
|
name: "deviceId",
|
|
36856
37019
|
form: "single",
|
|
@@ -8750,6 +8750,13 @@ var MediaRelocateModeSchema = _enum([
|
|
|
8750
8750
|
]);
|
|
8751
8751
|
var RelocateMediaInputSchema = object({
|
|
8752
8752
|
toLocationId: string(),
|
|
8753
|
+
/**
|
|
8754
|
+
* Restrict the pass to rows currently on this location. Omitted / `'*'` =
|
|
8755
|
+
* every row that is not already on `toLocationId` (the historical
|
|
8756
|
+
* behaviour). A named source is what a from→to migration needs: without it
|
|
8757
|
+
* "move events off disk 2" also emptied disk 1.
|
|
8758
|
+
*/
|
|
8759
|
+
fromLocationId: string().optional(),
|
|
8753
8760
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8754
8761
|
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8755
8762
|
mode: MediaRelocateModeSchema.optional()
|
|
@@ -8817,6 +8824,19 @@ var StorageMigrationDestinationsSchema = object({
|
|
|
8817
8824
|
galleryMedia: string().min(1).optional()
|
|
8818
8825
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8819
8826
|
/**
|
|
8827
|
+
* Optional named source per class. Omitted = the class's current default
|
|
8828
|
+
* (the historical behaviour). A named source that is NOT the default is a
|
|
8829
|
+
* drain of that disk: bytes move, the default stays, and the source is
|
|
8830
|
+
* disabled when the move finishes.
|
|
8831
|
+
*/
|
|
8832
|
+
var StorageMigrationSourcesSchema = object({
|
|
8833
|
+
recordings: string().min(1).optional(),
|
|
8834
|
+
recordingsLow: string().min(1).optional(),
|
|
8835
|
+
eventMedia: string().min(1).optional(),
|
|
8836
|
+
backups: string().min(1).optional(),
|
|
8837
|
+
galleryMedia: string().min(1).optional()
|
|
8838
|
+
}).optional();
|
|
8839
|
+
/**
|
|
8820
8840
|
* How a migration sequences the cutover against the byte move.
|
|
8821
8841
|
*
|
|
8822
8842
|
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
@@ -8838,6 +8858,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
|
8838
8858
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8839
8859
|
var StorageMigrationInputSchema = object({
|
|
8840
8860
|
destinations: StorageMigrationDestinationsSchema,
|
|
8861
|
+
/** Omitted = each class's current default. */
|
|
8862
|
+
sources: StorageMigrationSourcesSchema,
|
|
8841
8863
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8842
8864
|
/** Omitted = `blocking`, which stays the default. */
|
|
8843
8865
|
mode: StorageMigrationModeSchema.optional()
|
|
@@ -8917,6 +8939,13 @@ var StorageMigrationMoveSchema = object({
|
|
|
8917
8939
|
storageClass: StorageMigrationClassSchema,
|
|
8918
8940
|
fromLocationId: string(),
|
|
8919
8941
|
toLocationId: string(),
|
|
8942
|
+
/**
|
|
8943
|
+
* True when `from` was NOT the class default at plan time. The move still
|
|
8944
|
+
* copies bytes, but the default is left alone and the source is disabled
|
|
8945
|
+
* once the copy verifies. Absent on jobs planned before this field existed
|
|
8946
|
+
* — those jobs always repointed, which is `false`.
|
|
8947
|
+
*/
|
|
8948
|
+
freezeSource: boolean().optional(),
|
|
8920
8949
|
moverJobId: string().nullable(),
|
|
8921
8950
|
state: RelocateJobStateSchema.nullable(),
|
|
8922
8951
|
error: string().nullable(),
|
|
@@ -8930,6 +8959,7 @@ var StorageMigrationJobSchema = object({
|
|
|
8930
8959
|
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8931
8960
|
mode: StorageMigrationModeSchema,
|
|
8932
8961
|
destinations: StorageMigrationDestinationsSchema,
|
|
8962
|
+
sources: StorageMigrationSourcesSchema,
|
|
8933
8963
|
throttleMbps: number(),
|
|
8934
8964
|
moves: array(StorageMigrationMoveSchema),
|
|
8935
8965
|
pauseLeaseId: string().nullable(),
|
|
@@ -8955,6 +8985,7 @@ var StorageMigrationFindingSchema = object({
|
|
|
8955
8985
|
});
|
|
8956
8986
|
var StorageMigrationPlanSchema = object({
|
|
8957
8987
|
destinations: StorageMigrationDestinationsSchema,
|
|
8988
|
+
sources: StorageMigrationSourcesSchema,
|
|
8958
8989
|
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8959
8990
|
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8960
8991
|
* it. */
|
|
@@ -8962,7 +8993,8 @@ var StorageMigrationPlanSchema = object({
|
|
|
8962
8993
|
moves: array(object({
|
|
8963
8994
|
storageClass: StorageMigrationClassSchema,
|
|
8964
8995
|
fromLocationId: string(),
|
|
8965
|
-
toLocationId: string()
|
|
8996
|
+
toLocationId: string(),
|
|
8997
|
+
freezeSource: boolean().optional()
|
|
8966
8998
|
})),
|
|
8967
8999
|
findings: array(StorageMigrationFindingSchema)
|
|
8968
9000
|
});
|
|
@@ -9140,10 +9172,51 @@ var LedgerWalkReportSchema = object({
|
|
|
9140
9172
|
var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
|
|
9141
9173
|
var RelocatableMediaCountInputSchema = object({
|
|
9142
9174
|
toLocationId: string().min(1),
|
|
9175
|
+
/** Restrict the count to one source; omitted / `'*'` = every non-target row. */
|
|
9176
|
+
fromLocationId: string().optional(),
|
|
9143
9177
|
/** Omitted = `move`. */
|
|
9144
9178
|
mode: MediaRelocateModeSchema.optional()
|
|
9145
9179
|
});
|
|
9146
9180
|
/**
|
|
9181
|
+
* Operator cleanup of leftover analytics rows, optional debug media, and
|
|
9182
|
+
* ghost ledger entries on frozen footage locations.
|
|
9183
|
+
*
|
|
9184
|
+
* A pass is tens of minutes on a standing backlog. The hub method RETURNS
|
|
9185
|
+
* `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
|
|
9186
|
+
* is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
|
|
9187
|
+
* with no operator-visible status.
|
|
9188
|
+
*/
|
|
9189
|
+
var StorageCleanupPhaseSchema = _enum([
|
|
9190
|
+
"orphans",
|
|
9191
|
+
"debug-media",
|
|
9192
|
+
"ghost-ledger",
|
|
9193
|
+
"done",
|
|
9194
|
+
"failed",
|
|
9195
|
+
"cancelled"
|
|
9196
|
+
]);
|
|
9197
|
+
var StorageCleanupInputSchema = object({
|
|
9198
|
+
/** Also walk motion stills / track filmstrips. Off by default. */
|
|
9199
|
+
includeDebugMedia: boolean().optional() });
|
|
9200
|
+
var StorageCleanupJobSchema = object({
|
|
9201
|
+
jobId: string(),
|
|
9202
|
+
phase: StorageCleanupPhaseSchema,
|
|
9203
|
+
includeDebugMedia: boolean(),
|
|
9204
|
+
orphansReclaimed: number().int().nonnegative(),
|
|
9205
|
+
orphanBytesReclaimed: number().int().nonnegative(),
|
|
9206
|
+
debugMediaReclaimed: number().int().nonnegative(),
|
|
9207
|
+
debugMediaBytesReclaimed: number().int().nonnegative(),
|
|
9208
|
+
ghostsForgotten: number().int().nonnegative(),
|
|
9209
|
+
ghostBytesForgotten: number().int().nonnegative(),
|
|
9210
|
+
/** Short operator-facing line: current collection, pass, or location. */
|
|
9211
|
+
detail: string().nullable(),
|
|
9212
|
+
cancelRequested: boolean(),
|
|
9213
|
+
startedAt: number(),
|
|
9214
|
+
updatedAt: number(),
|
|
9215
|
+
finishedAt: number().nullable(),
|
|
9216
|
+
error: string().nullable()
|
|
9217
|
+
});
|
|
9218
|
+
var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
|
|
9219
|
+
/**
|
|
9147
9220
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
9148
9221
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
9149
9222
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -9171,11 +9244,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
|
|
|
9171
9244
|
* The default location for a type uses `id === <type>:default` by
|
|
9172
9245
|
* convention (the bare type ref like `'backups'` resolves to it).
|
|
9173
9246
|
*
|
|
9174
|
-
* `isSystem
|
|
9175
|
-
*
|
|
9176
|
-
*
|
|
9177
|
-
*
|
|
9178
|
-
* deleting it is rejected at the cap level.
|
|
9247
|
+
* `isSystem` is a legacy persisted flag. Seed still creates the initial
|
|
9248
|
+
* `<type>:default` locations; the flag is no longer a lock, a badge, or a
|
|
9249
|
+
* prune selector. New writes leave it false. Deletion is gated on uniqueness
|
|
9250
|
+
* / last-enabled, not on this bit.
|
|
9179
9251
|
*/
|
|
9180
9252
|
var StorageLocationSchema = object({
|
|
9181
9253
|
id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
|
|
@@ -13572,6 +13644,12 @@ method(object({
|
|
|
13572
13644
|
}), _void(), {
|
|
13573
13645
|
kind: "mutation",
|
|
13574
13646
|
auth: "admin"
|
|
13647
|
+
}), method(object({
|
|
13648
|
+
from: string(),
|
|
13649
|
+
to: string()
|
|
13650
|
+
}), object({ moved: number() }), {
|
|
13651
|
+
kind: "mutation",
|
|
13652
|
+
auth: "admin"
|
|
13575
13653
|
}), method(object({
|
|
13576
13654
|
deviceId: number(),
|
|
13577
13655
|
disabled: boolean()
|
|
@@ -16284,6 +16362,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
16284
16362
|
"device-offline",
|
|
16285
16363
|
"device-disabled",
|
|
16286
16364
|
"device-enabled",
|
|
16365
|
+
"device-battery-low",
|
|
16366
|
+
"device-battery-normal",
|
|
16287
16367
|
"stream-online",
|
|
16288
16368
|
"stream-offline",
|
|
16289
16369
|
"node-online",
|
|
@@ -19502,46 +19582,6 @@ var RecentTracksPageSchema = object({
|
|
|
19502
19582
|
/** Cursor for the next page, or null when this page is the last. */
|
|
19503
19583
|
nextCursor: string().nullable()
|
|
19504
19584
|
});
|
|
19505
|
-
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
19506
|
-
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
19507
|
-
var AnalyticsGroupRecordSchema = object({
|
|
19508
|
-
id: string(),
|
|
19509
|
-
deviceId: number().int(),
|
|
19510
|
-
openedAt: number().int(),
|
|
19511
|
-
closedAt: number().int(),
|
|
19512
|
-
timestamp: number().int(),
|
|
19513
|
-
memberCount: number().int(),
|
|
19514
|
-
memberTrackIds: array(string()).readonly(),
|
|
19515
|
-
className: string(),
|
|
19516
|
-
classes: array(string()).readonly(),
|
|
19517
|
-
/** Relative event-media path, or null when the group has no picture yet. */
|
|
19518
|
-
mediaUrl: string().nullable(),
|
|
19519
|
-
singleton: boolean()
|
|
19520
|
-
});
|
|
19521
|
-
var AnalyticsGroupMemberSchema = object({
|
|
19522
|
-
trackId: string(),
|
|
19523
|
-
deviceId: number().int(),
|
|
19524
|
-
className: string(),
|
|
19525
|
-
firstSeen: number().int(),
|
|
19526
|
-
lastSeen: number().int(),
|
|
19527
|
-
mediaUrl: string().nullable()
|
|
19528
|
-
});
|
|
19529
|
-
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
19530
|
-
var ListGroupsQueryInput = object({
|
|
19531
|
-
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
19532
|
-
deviceIds: array(number()),
|
|
19533
|
-
/** Window lower bound on `closedAt` (inclusive). */
|
|
19534
|
-
since: number().optional(),
|
|
19535
|
-
/** Window upper bound on `openedAt` (inclusive). */
|
|
19536
|
-
until: number().optional(),
|
|
19537
|
-
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
19538
|
-
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
19539
|
-
cursor: string().optional()
|
|
19540
|
-
});
|
|
19541
|
-
var ListGroupsPageSchema = object({
|
|
19542
|
-
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
19543
|
-
nextCursor: string().nullable()
|
|
19544
|
-
});
|
|
19545
19585
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
19546
19586
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
19547
19587
|
var KeyEventQueryInput = object({
|
|
@@ -19645,9 +19685,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
19645
19685
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
19646
19686
|
plates: number().int(),
|
|
19647
19687
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
19648
|
-
embeddings: number().int()
|
|
19649
|
-
/** Group membership + group rows removed with their last member (best-effort). */
|
|
19650
|
-
groups: number().int()
|
|
19688
|
+
embeddings: number().int()
|
|
19651
19689
|
});
|
|
19652
19690
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
19653
19691
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19817,6 +19855,47 @@ var RebuildStatusSchema = object({
|
|
|
19817
19855
|
/** Present when the pass ended by throwing. */
|
|
19818
19856
|
error: string().nullable()
|
|
19819
19857
|
});
|
|
19858
|
+
/**
|
|
19859
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19860
|
+
*
|
|
19861
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19862
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19863
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19864
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19865
|
+
*/
|
|
19866
|
+
var MediaReclaimStartResultSchema = object({
|
|
19867
|
+
started: boolean(),
|
|
19868
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19869
|
+
alreadyRunning: boolean()
|
|
19870
|
+
});
|
|
19871
|
+
var MediaReclaimInputSchema = object({
|
|
19872
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19873
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19874
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19875
|
+
restart: boolean().optional(),
|
|
19876
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19877
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19878
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19879
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19880
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19881
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19882
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19883
|
+
});
|
|
19884
|
+
var MediaReclaimStatusSchema = object({
|
|
19885
|
+
running: boolean(),
|
|
19886
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19887
|
+
totalExamined: number(),
|
|
19888
|
+
totalEligible: number(),
|
|
19889
|
+
totalReclaimed: number(),
|
|
19890
|
+
totalBytesReclaimed: number(),
|
|
19891
|
+
totalRefused: number(),
|
|
19892
|
+
/** Device+scope windows finished in this pass. */
|
|
19893
|
+
devicesDone: number(),
|
|
19894
|
+
complete: boolean().nullable(),
|
|
19895
|
+
startedAtMs: number().nullable(),
|
|
19896
|
+
finishedAtMs: number().nullable(),
|
|
19897
|
+
error: string().nullable()
|
|
19898
|
+
});
|
|
19820
19899
|
var ReplayFrameInputSchema = object({
|
|
19821
19900
|
timestamp: number(),
|
|
19822
19901
|
frame: PipelineRunResultBridge
|
|
@@ -19855,10 +19934,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19855
19934
|
* stationary registry). Default false: the timeline lists passages,
|
|
19856
19935
|
* not parking records (operator decision, 2026-08-15). */
|
|
19857
19936
|
includeStationary: boolean().optional()
|
|
19858
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
19859
|
-
deviceId: number(),
|
|
19860
|
-
groupId: string().min(1)
|
|
19861
|
-
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
19937
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19862
19938
|
kind: "mutation",
|
|
19863
19939
|
auth: "admin"
|
|
19864
19940
|
}), 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({
|
|
@@ -19958,6 +20034,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19958
20034
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19959
20035
|
kind: "query",
|
|
19960
20036
|
auth: "admin"
|
|
20037
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
20038
|
+
kind: "mutation",
|
|
20039
|
+
auth: "admin"
|
|
20040
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
20041
|
+
kind: "query",
|
|
20042
|
+
auth: "admin"
|
|
19961
20043
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19962
20044
|
kind: "query",
|
|
19963
20045
|
auth: "admin"
|
|
@@ -21928,7 +22010,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21928
22010
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21929
22011
|
kind: "mutation",
|
|
21930
22012
|
auth: "admin"
|
|
21931
|
-
})
|
|
22013
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
22014
|
+
kind: "mutation",
|
|
22015
|
+
auth: "admin"
|
|
22016
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
22017
|
+
kind: "mutation",
|
|
22018
|
+
auth: "admin"
|
|
22019
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21932
22020
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21933
22021
|
providerId: string().min(1),
|
|
21934
22022
|
displayName: string().min(1),
|
|
@@ -27354,6 +27442,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
27354
27442
|
minMoveGb: number().min(0).optional()
|
|
27355
27443
|
});
|
|
27356
27444
|
/**
|
|
27445
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
27446
|
+
*
|
|
27447
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
27448
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
27449
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
27450
|
+
*/
|
|
27451
|
+
var RecordingDevicePlacementSchema = object({
|
|
27452
|
+
deviceId: number().int(),
|
|
27453
|
+
profile: string(),
|
|
27454
|
+
locationId: string()
|
|
27455
|
+
});
|
|
27456
|
+
var RecordingDevicePinSchema = object({
|
|
27457
|
+
deviceId: number().int(),
|
|
27458
|
+
/** Recordings-class location this camera is pinned to. */
|
|
27459
|
+
locationId: string()
|
|
27460
|
+
});
|
|
27461
|
+
var RecordingPlacementViewSchema = object({
|
|
27462
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
27463
|
+
pins: array(RecordingDevicePinSchema),
|
|
27464
|
+
defaultLocations: record(string(), string())
|
|
27465
|
+
});
|
|
27466
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
27467
|
+
deviceId: number().int(),
|
|
27468
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
27469
|
+
locationId: string().nullable()
|
|
27470
|
+
});
|
|
27471
|
+
/**
|
|
27357
27472
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
27358
27473
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
27359
27474
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -27579,6 +27694,12 @@ method(object({
|
|
|
27579
27694
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
27580
27695
|
kind: "mutation",
|
|
27581
27696
|
auth: "admin"
|
|
27697
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
27698
|
+
kind: "query",
|
|
27699
|
+
auth: "admin"
|
|
27700
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
27701
|
+
kind: "mutation",
|
|
27702
|
+
auth: "admin"
|
|
27582
27703
|
});
|
|
27583
27704
|
/**
|
|
27584
27705
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -30974,6 +31095,12 @@ Object.freeze({
|
|
|
30974
31095
|
addonId: null,
|
|
30975
31096
|
access: "delete"
|
|
30976
31097
|
},
|
|
31098
|
+
"deviceManager.renameLocation": {
|
|
31099
|
+
capName: "device-manager",
|
|
31100
|
+
capScope: "system",
|
|
31101
|
+
addonId: null,
|
|
31102
|
+
access: "create"
|
|
31103
|
+
},
|
|
30977
31104
|
"deviceManager.runDeviceAction": {
|
|
30978
31105
|
capName: "device-manager",
|
|
30979
31106
|
capScope: "system",
|
|
@@ -32666,19 +32793,19 @@ Object.freeze({
|
|
|
32666
32793
|
addonId: null,
|
|
32667
32794
|
access: "view"
|
|
32668
32795
|
},
|
|
32669
|
-
"pipelineAnalytics.
|
|
32796
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
32670
32797
|
capName: "pipeline-analytics",
|
|
32671
32798
|
capScope: "device",
|
|
32672
32799
|
addonId: null,
|
|
32673
32800
|
access: "view"
|
|
32674
32801
|
},
|
|
32675
|
-
"pipelineAnalytics.
|
|
32802
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
32676
32803
|
capName: "pipeline-analytics",
|
|
32677
32804
|
capScope: "device",
|
|
32678
32805
|
addonId: null,
|
|
32679
32806
|
access: "view"
|
|
32680
32807
|
},
|
|
32681
|
-
"pipelineAnalytics.
|
|
32808
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
32682
32809
|
capName: "pipeline-analytics",
|
|
32683
32810
|
capScope: "device",
|
|
32684
32811
|
addonId: null,
|
|
@@ -32768,12 +32895,6 @@ Object.freeze({
|
|
|
32768
32895
|
addonId: null,
|
|
32769
32896
|
access: "view"
|
|
32770
32897
|
},
|
|
32771
|
-
"pipelineAnalytics.listGroups": {
|
|
32772
|
-
capName: "pipeline-analytics",
|
|
32773
|
-
capScope: "device",
|
|
32774
|
-
addonId: null,
|
|
32775
|
-
access: "view"
|
|
32776
|
-
},
|
|
32777
32898
|
"pipelineAnalytics.listOpsLog": {
|
|
32778
32899
|
capName: "pipeline-analytics",
|
|
32779
32900
|
capScope: "device",
|
|
@@ -32858,6 +32979,12 @@ Object.freeze({
|
|
|
32858
32979
|
addonId: null,
|
|
32859
32980
|
access: "create"
|
|
32860
32981
|
},
|
|
32982
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
32983
|
+
capName: "pipeline-analytics",
|
|
32984
|
+
capScope: "device",
|
|
32985
|
+
addonId: null,
|
|
32986
|
+
access: "create"
|
|
32987
|
+
},
|
|
32861
32988
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
32862
32989
|
capName: "pipeline-analytics",
|
|
32863
32990
|
capScope: "device",
|
|
@@ -33782,6 +33909,12 @@ Object.freeze({
|
|
|
33782
33909
|
addonId: null,
|
|
33783
33910
|
access: "view"
|
|
33784
33911
|
},
|
|
33912
|
+
"recording.getPlacement": {
|
|
33913
|
+
capName: "recording",
|
|
33914
|
+
capScope: "system",
|
|
33915
|
+
addonId: null,
|
|
33916
|
+
access: "view"
|
|
33917
|
+
},
|
|
33785
33918
|
"recording.getPlaybackManifest": {
|
|
33786
33919
|
capName: "recording",
|
|
33787
33920
|
capScope: "system",
|
|
@@ -33908,6 +34041,12 @@ Object.freeze({
|
|
|
33908
34041
|
addonId: null,
|
|
33909
34042
|
access: "create"
|
|
33910
34043
|
},
|
|
34044
|
+
"recording.setDevicePlacement": {
|
|
34045
|
+
capName: "recording",
|
|
34046
|
+
capScope: "system",
|
|
34047
|
+
addonId: null,
|
|
34048
|
+
access: "create"
|
|
34049
|
+
},
|
|
33911
34050
|
"recording.startStorageMigrationMove": {
|
|
33912
34051
|
capName: "recording",
|
|
33913
34052
|
capScope: "system",
|
|
@@ -34352,12 +34491,36 @@ Object.freeze({
|
|
|
34352
34491
|
addonId: null,
|
|
34353
34492
|
access: "create"
|
|
34354
34493
|
},
|
|
34494
|
+
"storageMigration.cleanupCancel": {
|
|
34495
|
+
capName: "storage-migration",
|
|
34496
|
+
capScope: "system",
|
|
34497
|
+
addonId: null,
|
|
34498
|
+
access: "create"
|
|
34499
|
+
},
|
|
34500
|
+
"storageMigration.cleanupStart": {
|
|
34501
|
+
capName: "storage-migration",
|
|
34502
|
+
capScope: "system",
|
|
34503
|
+
addonId: null,
|
|
34504
|
+
access: "create"
|
|
34505
|
+
},
|
|
34506
|
+
"storageMigration.cleanupStatus": {
|
|
34507
|
+
capName: "storage-migration",
|
|
34508
|
+
capScope: "system",
|
|
34509
|
+
addonId: null,
|
|
34510
|
+
access: "view"
|
|
34511
|
+
},
|
|
34355
34512
|
"storageMigration.drain": {
|
|
34356
34513
|
capName: "storage-migration",
|
|
34357
34514
|
capScope: "system",
|
|
34358
34515
|
addonId: null,
|
|
34359
34516
|
access: "create"
|
|
34360
34517
|
},
|
|
34518
|
+
"storageMigration.history": {
|
|
34519
|
+
capName: "storage-migration",
|
|
34520
|
+
capScope: "system",
|
|
34521
|
+
addonId: null,
|
|
34522
|
+
access: "view"
|
|
34523
|
+
},
|
|
34361
34524
|
"storageMigration.movers": {
|
|
34362
34525
|
capName: "storage-migration",
|
|
34363
34526
|
capScope: "system",
|
|
@@ -36354,11 +36517,6 @@ Object.freeze({
|
|
|
36354
36517
|
form: "single",
|
|
36355
36518
|
optional: true
|
|
36356
36519
|
}],
|
|
36357
|
-
"pipelineAnalytics.getGroup": [{
|
|
36358
|
-
name: "deviceId",
|
|
36359
|
-
form: "single",
|
|
36360
|
-
optional: false
|
|
36361
|
-
}],
|
|
36362
36520
|
"pipelineAnalytics.getKeyEvents": [{
|
|
36363
36521
|
name: "deviceId",
|
|
36364
36522
|
form: "single",
|
|
@@ -36424,11 +36582,6 @@ Object.freeze({
|
|
|
36424
36582
|
form: "single",
|
|
36425
36583
|
optional: false
|
|
36426
36584
|
}],
|
|
36427
|
-
"pipelineAnalytics.listGroups": [{
|
|
36428
|
-
name: "deviceIds",
|
|
36429
|
-
form: "array",
|
|
36430
|
-
optional: false
|
|
36431
|
-
}],
|
|
36432
36585
|
"pipelineAnalytics.listOpsLog": [{
|
|
36433
36586
|
name: "deviceId",
|
|
36434
36587
|
form: "single",
|
|
@@ -36474,6 +36627,11 @@ Object.freeze({
|
|
|
36474
36627
|
form: "single",
|
|
36475
36628
|
optional: true
|
|
36476
36629
|
}],
|
|
36630
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
36631
|
+
name: "deviceIds",
|
|
36632
|
+
form: "array",
|
|
36633
|
+
optional: true
|
|
36634
|
+
}],
|
|
36477
36635
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
36478
36636
|
name: "deviceId",
|
|
36479
36637
|
form: "single",
|
|
@@ -36839,6 +36997,11 @@ Object.freeze({
|
|
|
36839
36997
|
form: "single",
|
|
36840
36998
|
optional: false
|
|
36841
36999
|
}],
|
|
37000
|
+
"recording.setDevicePlacement": [{
|
|
37001
|
+
name: "deviceId",
|
|
37002
|
+
form: "single",
|
|
37003
|
+
optional: false
|
|
37004
|
+
}],
|
|
36842
37005
|
"recording.startStorageMigrationMove": [{
|
|
36843
37006
|
name: "deviceId",
|
|
36844
37007
|
form: "single",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-export-hap",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.62",
|
|
4
4
|
"description": "HomeKit (HAP) exporter for CamStack devices. Publishes each exposed device as its own HomeKit accessory: cameras and doorbells with SRTP streaming, HomeKit Secure Video, motion, two-way audio, PTZ and battery; switches, lights, locks and sensors through a capability→service table.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|