@camstack/addon-smtp-nodemailer 1.2.48 → 1.2.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/smtp.addon.js +236 -73
- package/dist/smtp.addon.mjs +236 -73
- package/package.json +1 -1
package/dist/smtp.addon.js
CHANGED
|
@@ -8117,6 +8117,13 @@ var MediaRelocateModeSchema = _enum([
|
|
|
8117
8117
|
]);
|
|
8118
8118
|
var RelocateMediaInputSchema = object({
|
|
8119
8119
|
toLocationId: string(),
|
|
8120
|
+
/**
|
|
8121
|
+
* Restrict the pass to rows currently on this location. Omitted / `'*'` =
|
|
8122
|
+
* every row that is not already on `toLocationId` (the historical
|
|
8123
|
+
* behaviour). A named source is what a from→to migration needs: without it
|
|
8124
|
+
* "move events off disk 2" also emptied disk 1.
|
|
8125
|
+
*/
|
|
8126
|
+
fromLocationId: string().optional(),
|
|
8120
8127
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8121
8128
|
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8122
8129
|
mode: MediaRelocateModeSchema.optional()
|
|
@@ -8184,6 +8191,19 @@ var StorageMigrationDestinationsSchema = object({
|
|
|
8184
8191
|
galleryMedia: string().min(1).optional()
|
|
8185
8192
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8186
8193
|
/**
|
|
8194
|
+
* Optional named source per class. Omitted = the class's current default
|
|
8195
|
+
* (the historical behaviour). A named source that is NOT the default is a
|
|
8196
|
+
* drain of that disk: bytes move, the default stays, and the source is
|
|
8197
|
+
* disabled when the move finishes.
|
|
8198
|
+
*/
|
|
8199
|
+
var StorageMigrationSourcesSchema = object({
|
|
8200
|
+
recordings: string().min(1).optional(),
|
|
8201
|
+
recordingsLow: string().min(1).optional(),
|
|
8202
|
+
eventMedia: string().min(1).optional(),
|
|
8203
|
+
backups: string().min(1).optional(),
|
|
8204
|
+
galleryMedia: string().min(1).optional()
|
|
8205
|
+
}).optional();
|
|
8206
|
+
/**
|
|
8187
8207
|
* How a migration sequences the cutover against the byte move.
|
|
8188
8208
|
*
|
|
8189
8209
|
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
@@ -8205,6 +8225,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
|
8205
8225
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8206
8226
|
var StorageMigrationInputSchema = object({
|
|
8207
8227
|
destinations: StorageMigrationDestinationsSchema,
|
|
8228
|
+
/** Omitted = each class's current default. */
|
|
8229
|
+
sources: StorageMigrationSourcesSchema,
|
|
8208
8230
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8209
8231
|
/** Omitted = `blocking`, which stays the default. */
|
|
8210
8232
|
mode: StorageMigrationModeSchema.optional()
|
|
@@ -8284,6 +8306,13 @@ var StorageMigrationMoveSchema = object({
|
|
|
8284
8306
|
storageClass: StorageMigrationClassSchema,
|
|
8285
8307
|
fromLocationId: string(),
|
|
8286
8308
|
toLocationId: string(),
|
|
8309
|
+
/**
|
|
8310
|
+
* True when `from` was NOT the class default at plan time. The move still
|
|
8311
|
+
* copies bytes, but the default is left alone and the source is disabled
|
|
8312
|
+
* once the copy verifies. Absent on jobs planned before this field existed
|
|
8313
|
+
* — those jobs always repointed, which is `false`.
|
|
8314
|
+
*/
|
|
8315
|
+
freezeSource: boolean().optional(),
|
|
8287
8316
|
moverJobId: string().nullable(),
|
|
8288
8317
|
state: RelocateJobStateSchema.nullable(),
|
|
8289
8318
|
error: string().nullable(),
|
|
@@ -8297,6 +8326,7 @@ var StorageMigrationJobSchema = object({
|
|
|
8297
8326
|
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8298
8327
|
mode: StorageMigrationModeSchema,
|
|
8299
8328
|
destinations: StorageMigrationDestinationsSchema,
|
|
8329
|
+
sources: StorageMigrationSourcesSchema,
|
|
8300
8330
|
throttleMbps: number(),
|
|
8301
8331
|
moves: array(StorageMigrationMoveSchema),
|
|
8302
8332
|
pauseLeaseId: string().nullable(),
|
|
@@ -8322,6 +8352,7 @@ var StorageMigrationFindingSchema = object({
|
|
|
8322
8352
|
});
|
|
8323
8353
|
var StorageMigrationPlanSchema = object({
|
|
8324
8354
|
destinations: StorageMigrationDestinationsSchema,
|
|
8355
|
+
sources: StorageMigrationSourcesSchema,
|
|
8325
8356
|
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8326
8357
|
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8327
8358
|
* it. */
|
|
@@ -8329,7 +8360,8 @@ var StorageMigrationPlanSchema = object({
|
|
|
8329
8360
|
moves: array(object({
|
|
8330
8361
|
storageClass: StorageMigrationClassSchema,
|
|
8331
8362
|
fromLocationId: string(),
|
|
8332
|
-
toLocationId: string()
|
|
8363
|
+
toLocationId: string(),
|
|
8364
|
+
freezeSource: boolean().optional()
|
|
8333
8365
|
})),
|
|
8334
8366
|
findings: array(StorageMigrationFindingSchema)
|
|
8335
8367
|
});
|
|
@@ -8507,10 +8539,51 @@ var LedgerWalkReportSchema = object({
|
|
|
8507
8539
|
var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
|
|
8508
8540
|
var RelocatableMediaCountInputSchema = object({
|
|
8509
8541
|
toLocationId: string().min(1),
|
|
8542
|
+
/** Restrict the count to one source; omitted / `'*'` = every non-target row. */
|
|
8543
|
+
fromLocationId: string().optional(),
|
|
8510
8544
|
/** Omitted = `move`. */
|
|
8511
8545
|
mode: MediaRelocateModeSchema.optional()
|
|
8512
8546
|
});
|
|
8513
8547
|
/**
|
|
8548
|
+
* Operator cleanup of leftover analytics rows, optional debug media, and
|
|
8549
|
+
* ghost ledger entries on frozen footage locations.
|
|
8550
|
+
*
|
|
8551
|
+
* A pass is tens of minutes on a standing backlog. The hub method RETURNS
|
|
8552
|
+
* `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
|
|
8553
|
+
* is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
|
|
8554
|
+
* with no operator-visible status.
|
|
8555
|
+
*/
|
|
8556
|
+
var StorageCleanupPhaseSchema = _enum([
|
|
8557
|
+
"orphans",
|
|
8558
|
+
"debug-media",
|
|
8559
|
+
"ghost-ledger",
|
|
8560
|
+
"done",
|
|
8561
|
+
"failed",
|
|
8562
|
+
"cancelled"
|
|
8563
|
+
]);
|
|
8564
|
+
var StorageCleanupInputSchema = object({
|
|
8565
|
+
/** Also walk motion stills / track filmstrips. Off by default. */
|
|
8566
|
+
includeDebugMedia: boolean().optional() });
|
|
8567
|
+
var StorageCleanupJobSchema = object({
|
|
8568
|
+
jobId: string(),
|
|
8569
|
+
phase: StorageCleanupPhaseSchema,
|
|
8570
|
+
includeDebugMedia: boolean(),
|
|
8571
|
+
orphansReclaimed: number().int().nonnegative(),
|
|
8572
|
+
orphanBytesReclaimed: number().int().nonnegative(),
|
|
8573
|
+
debugMediaReclaimed: number().int().nonnegative(),
|
|
8574
|
+
debugMediaBytesReclaimed: number().int().nonnegative(),
|
|
8575
|
+
ghostsForgotten: number().int().nonnegative(),
|
|
8576
|
+
ghostBytesForgotten: number().int().nonnegative(),
|
|
8577
|
+
/** Short operator-facing line: current collection, pass, or location. */
|
|
8578
|
+
detail: string().nullable(),
|
|
8579
|
+
cancelRequested: boolean(),
|
|
8580
|
+
startedAt: number(),
|
|
8581
|
+
updatedAt: number(),
|
|
8582
|
+
finishedAt: number().nullable(),
|
|
8583
|
+
error: string().nullable()
|
|
8584
|
+
});
|
|
8585
|
+
var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
|
|
8586
|
+
/**
|
|
8514
8587
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
8515
8588
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
8516
8589
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -8538,11 +8611,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
|
|
|
8538
8611
|
* The default location for a type uses `id === <type>:default` by
|
|
8539
8612
|
* convention (the bare type ref like `'backups'` resolves to it).
|
|
8540
8613
|
*
|
|
8541
|
-
* `isSystem
|
|
8542
|
-
*
|
|
8543
|
-
*
|
|
8544
|
-
*
|
|
8545
|
-
* deleting it is rejected at the cap level.
|
|
8614
|
+
* `isSystem` is a legacy persisted flag. Seed still creates the initial
|
|
8615
|
+
* `<type>:default` locations; the flag is no longer a lock, a badge, or a
|
|
8616
|
+
* prune selector. New writes leave it false. Deletion is gated on uniqueness
|
|
8617
|
+
* / last-enabled, not on this bit.
|
|
8546
8618
|
*/
|
|
8547
8619
|
var StorageLocationSchema = object({
|
|
8548
8620
|
id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
|
|
@@ -12804,6 +12876,12 @@ method(object({
|
|
|
12804
12876
|
}), _void(), {
|
|
12805
12877
|
kind: "mutation",
|
|
12806
12878
|
auth: "admin"
|
|
12879
|
+
}), method(object({
|
|
12880
|
+
from: string(),
|
|
12881
|
+
to: string()
|
|
12882
|
+
}), object({ moved: number() }), {
|
|
12883
|
+
kind: "mutation",
|
|
12884
|
+
auth: "admin"
|
|
12807
12885
|
}), method(object({
|
|
12808
12886
|
deviceId: number(),
|
|
12809
12887
|
disabled: boolean()
|
|
@@ -15516,6 +15594,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
15516
15594
|
"device-offline",
|
|
15517
15595
|
"device-disabled",
|
|
15518
15596
|
"device-enabled",
|
|
15597
|
+
"device-battery-low",
|
|
15598
|
+
"device-battery-normal",
|
|
15519
15599
|
"stream-online",
|
|
15520
15600
|
"stream-offline",
|
|
15521
15601
|
"node-online",
|
|
@@ -18734,46 +18814,6 @@ var RecentTracksPageSchema = object({
|
|
|
18734
18814
|
/** Cursor for the next page, or null when this page is the last. */
|
|
18735
18815
|
nextCursor: string().nullable()
|
|
18736
18816
|
});
|
|
18737
|
-
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
18738
|
-
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
18739
|
-
var AnalyticsGroupRecordSchema = object({
|
|
18740
|
-
id: string(),
|
|
18741
|
-
deviceId: number().int(),
|
|
18742
|
-
openedAt: number().int(),
|
|
18743
|
-
closedAt: number().int(),
|
|
18744
|
-
timestamp: number().int(),
|
|
18745
|
-
memberCount: number().int(),
|
|
18746
|
-
memberTrackIds: array(string()).readonly(),
|
|
18747
|
-
className: string(),
|
|
18748
|
-
classes: array(string()).readonly(),
|
|
18749
|
-
/** Relative event-media path, or null when the group has no picture yet. */
|
|
18750
|
-
mediaUrl: string().nullable(),
|
|
18751
|
-
singleton: boolean()
|
|
18752
|
-
});
|
|
18753
|
-
var AnalyticsGroupMemberSchema = object({
|
|
18754
|
-
trackId: string(),
|
|
18755
|
-
deviceId: number().int(),
|
|
18756
|
-
className: string(),
|
|
18757
|
-
firstSeen: number().int(),
|
|
18758
|
-
lastSeen: number().int(),
|
|
18759
|
-
mediaUrl: string().nullable()
|
|
18760
|
-
});
|
|
18761
|
-
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
18762
|
-
var ListGroupsQueryInput = object({
|
|
18763
|
-
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
18764
|
-
deviceIds: array(number()),
|
|
18765
|
-
/** Window lower bound on `closedAt` (inclusive). */
|
|
18766
|
-
since: number().optional(),
|
|
18767
|
-
/** Window upper bound on `openedAt` (inclusive). */
|
|
18768
|
-
until: number().optional(),
|
|
18769
|
-
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
18770
|
-
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
18771
|
-
cursor: string().optional()
|
|
18772
|
-
});
|
|
18773
|
-
var ListGroupsPageSchema = object({
|
|
18774
|
-
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
18775
|
-
nextCursor: string().nullable()
|
|
18776
|
-
});
|
|
18777
18817
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
18778
18818
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
18779
18819
|
var KeyEventQueryInput = object({
|
|
@@ -18877,9 +18917,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
18877
18917
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
18878
18918
|
plates: number().int(),
|
|
18879
18919
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
18880
|
-
embeddings: number().int()
|
|
18881
|
-
/** Group membership + group rows removed with their last member (best-effort). */
|
|
18882
|
-
groups: number().int()
|
|
18920
|
+
embeddings: number().int()
|
|
18883
18921
|
});
|
|
18884
18922
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
18885
18923
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19049,6 +19087,47 @@ var RebuildStatusSchema = object({
|
|
|
19049
19087
|
/** Present when the pass ended by throwing. */
|
|
19050
19088
|
error: string().nullable()
|
|
19051
19089
|
});
|
|
19090
|
+
/**
|
|
19091
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19092
|
+
*
|
|
19093
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19094
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19095
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19096
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19097
|
+
*/
|
|
19098
|
+
var MediaReclaimStartResultSchema = object({
|
|
19099
|
+
started: boolean(),
|
|
19100
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19101
|
+
alreadyRunning: boolean()
|
|
19102
|
+
});
|
|
19103
|
+
var MediaReclaimInputSchema = object({
|
|
19104
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19105
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19106
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19107
|
+
restart: boolean().optional(),
|
|
19108
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19109
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19110
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19111
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19112
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19113
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19114
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19115
|
+
});
|
|
19116
|
+
var MediaReclaimStatusSchema = object({
|
|
19117
|
+
running: boolean(),
|
|
19118
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19119
|
+
totalExamined: number(),
|
|
19120
|
+
totalEligible: number(),
|
|
19121
|
+
totalReclaimed: number(),
|
|
19122
|
+
totalBytesReclaimed: number(),
|
|
19123
|
+
totalRefused: number(),
|
|
19124
|
+
/** Device+scope windows finished in this pass. */
|
|
19125
|
+
devicesDone: number(),
|
|
19126
|
+
complete: boolean().nullable(),
|
|
19127
|
+
startedAtMs: number().nullable(),
|
|
19128
|
+
finishedAtMs: number().nullable(),
|
|
19129
|
+
error: string().nullable()
|
|
19130
|
+
});
|
|
19052
19131
|
var ReplayFrameInputSchema = object({
|
|
19053
19132
|
timestamp: number(),
|
|
19054
19133
|
frame: PipelineRunResultBridge
|
|
@@ -19087,10 +19166,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19087
19166
|
* stationary registry). Default false: the timeline lists passages,
|
|
19088
19167
|
* not parking records (operator decision, 2026-08-15). */
|
|
19089
19168
|
includeStationary: boolean().optional()
|
|
19090
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
19091
|
-
deviceId: number(),
|
|
19092
|
-
groupId: string().min(1)
|
|
19093
|
-
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
19169
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19094
19170
|
kind: "mutation",
|
|
19095
19171
|
auth: "admin"
|
|
19096
19172
|
}), 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({
|
|
@@ -19190,6 +19266,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19190
19266
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19191
19267
|
kind: "query",
|
|
19192
19268
|
auth: "admin"
|
|
19269
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19270
|
+
kind: "mutation",
|
|
19271
|
+
auth: "admin"
|
|
19272
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19273
|
+
kind: "query",
|
|
19274
|
+
auth: "admin"
|
|
19193
19275
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19194
19276
|
kind: "query",
|
|
19195
19277
|
auth: "admin"
|
|
@@ -21173,7 +21255,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21173
21255
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21174
21256
|
kind: "mutation",
|
|
21175
21257
|
auth: "admin"
|
|
21176
|
-
})
|
|
21258
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21259
|
+
kind: "mutation",
|
|
21260
|
+
auth: "admin"
|
|
21261
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21262
|
+
kind: "mutation",
|
|
21263
|
+
auth: "admin"
|
|
21264
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21177
21265
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21178
21266
|
providerId: string().min(1),
|
|
21179
21267
|
displayName: string().min(1),
|
|
@@ -26551,6 +26639,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
26551
26639
|
minMoveGb: number().min(0).optional()
|
|
26552
26640
|
});
|
|
26553
26641
|
/**
|
|
26642
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
26643
|
+
*
|
|
26644
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
26645
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
26646
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
26647
|
+
*/
|
|
26648
|
+
var RecordingDevicePlacementSchema = object({
|
|
26649
|
+
deviceId: number().int(),
|
|
26650
|
+
profile: string(),
|
|
26651
|
+
locationId: string()
|
|
26652
|
+
});
|
|
26653
|
+
var RecordingDevicePinSchema = object({
|
|
26654
|
+
deviceId: number().int(),
|
|
26655
|
+
/** Recordings-class location this camera is pinned to. */
|
|
26656
|
+
locationId: string()
|
|
26657
|
+
});
|
|
26658
|
+
var RecordingPlacementViewSchema = object({
|
|
26659
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
26660
|
+
pins: array(RecordingDevicePinSchema),
|
|
26661
|
+
defaultLocations: record(string(), string())
|
|
26662
|
+
});
|
|
26663
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
26664
|
+
deviceId: number().int(),
|
|
26665
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
26666
|
+
locationId: string().nullable()
|
|
26667
|
+
});
|
|
26668
|
+
/**
|
|
26554
26669
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
26555
26670
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
26556
26671
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -26776,6 +26891,12 @@ method(object({
|
|
|
26776
26891
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
26777
26892
|
kind: "mutation",
|
|
26778
26893
|
auth: "admin"
|
|
26894
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
26895
|
+
kind: "query",
|
|
26896
|
+
auth: "admin"
|
|
26897
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
26898
|
+
kind: "mutation",
|
|
26899
|
+
auth: "admin"
|
|
26779
26900
|
});
|
|
26780
26901
|
/**
|
|
26781
26902
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -30146,6 +30267,12 @@ Object.freeze({
|
|
|
30146
30267
|
addonId: null,
|
|
30147
30268
|
access: "delete"
|
|
30148
30269
|
},
|
|
30270
|
+
"deviceManager.renameLocation": {
|
|
30271
|
+
capName: "device-manager",
|
|
30272
|
+
capScope: "system",
|
|
30273
|
+
addonId: null,
|
|
30274
|
+
access: "create"
|
|
30275
|
+
},
|
|
30149
30276
|
"deviceManager.runDeviceAction": {
|
|
30150
30277
|
capName: "device-manager",
|
|
30151
30278
|
capScope: "system",
|
|
@@ -31838,19 +31965,19 @@ Object.freeze({
|
|
|
31838
31965
|
addonId: null,
|
|
31839
31966
|
access: "view"
|
|
31840
31967
|
},
|
|
31841
|
-
"pipelineAnalytics.
|
|
31968
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
31842
31969
|
capName: "pipeline-analytics",
|
|
31843
31970
|
capScope: "device",
|
|
31844
31971
|
addonId: null,
|
|
31845
31972
|
access: "view"
|
|
31846
31973
|
},
|
|
31847
|
-
"pipelineAnalytics.
|
|
31974
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
31848
31975
|
capName: "pipeline-analytics",
|
|
31849
31976
|
capScope: "device",
|
|
31850
31977
|
addonId: null,
|
|
31851
31978
|
access: "view"
|
|
31852
31979
|
},
|
|
31853
|
-
"pipelineAnalytics.
|
|
31980
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
31854
31981
|
capName: "pipeline-analytics",
|
|
31855
31982
|
capScope: "device",
|
|
31856
31983
|
addonId: null,
|
|
@@ -31940,12 +32067,6 @@ Object.freeze({
|
|
|
31940
32067
|
addonId: null,
|
|
31941
32068
|
access: "view"
|
|
31942
32069
|
},
|
|
31943
|
-
"pipelineAnalytics.listGroups": {
|
|
31944
|
-
capName: "pipeline-analytics",
|
|
31945
|
-
capScope: "device",
|
|
31946
|
-
addonId: null,
|
|
31947
|
-
access: "view"
|
|
31948
|
-
},
|
|
31949
32070
|
"pipelineAnalytics.listOpsLog": {
|
|
31950
32071
|
capName: "pipeline-analytics",
|
|
31951
32072
|
capScope: "device",
|
|
@@ -32030,6 +32151,12 @@ Object.freeze({
|
|
|
32030
32151
|
addonId: null,
|
|
32031
32152
|
access: "create"
|
|
32032
32153
|
},
|
|
32154
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
32155
|
+
capName: "pipeline-analytics",
|
|
32156
|
+
capScope: "device",
|
|
32157
|
+
addonId: null,
|
|
32158
|
+
access: "create"
|
|
32159
|
+
},
|
|
32033
32160
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
32034
32161
|
capName: "pipeline-analytics",
|
|
32035
32162
|
capScope: "device",
|
|
@@ -32954,6 +33081,12 @@ Object.freeze({
|
|
|
32954
33081
|
addonId: null,
|
|
32955
33082
|
access: "view"
|
|
32956
33083
|
},
|
|
33084
|
+
"recording.getPlacement": {
|
|
33085
|
+
capName: "recording",
|
|
33086
|
+
capScope: "system",
|
|
33087
|
+
addonId: null,
|
|
33088
|
+
access: "view"
|
|
33089
|
+
},
|
|
32957
33090
|
"recording.getPlaybackManifest": {
|
|
32958
33091
|
capName: "recording",
|
|
32959
33092
|
capScope: "system",
|
|
@@ -33080,6 +33213,12 @@ Object.freeze({
|
|
|
33080
33213
|
addonId: null,
|
|
33081
33214
|
access: "create"
|
|
33082
33215
|
},
|
|
33216
|
+
"recording.setDevicePlacement": {
|
|
33217
|
+
capName: "recording",
|
|
33218
|
+
capScope: "system",
|
|
33219
|
+
addonId: null,
|
|
33220
|
+
access: "create"
|
|
33221
|
+
},
|
|
33083
33222
|
"recording.startStorageMigrationMove": {
|
|
33084
33223
|
capName: "recording",
|
|
33085
33224
|
capScope: "system",
|
|
@@ -33524,12 +33663,36 @@ Object.freeze({
|
|
|
33524
33663
|
addonId: null,
|
|
33525
33664
|
access: "create"
|
|
33526
33665
|
},
|
|
33666
|
+
"storageMigration.cleanupCancel": {
|
|
33667
|
+
capName: "storage-migration",
|
|
33668
|
+
capScope: "system",
|
|
33669
|
+
addonId: null,
|
|
33670
|
+
access: "create"
|
|
33671
|
+
},
|
|
33672
|
+
"storageMigration.cleanupStart": {
|
|
33673
|
+
capName: "storage-migration",
|
|
33674
|
+
capScope: "system",
|
|
33675
|
+
addonId: null,
|
|
33676
|
+
access: "create"
|
|
33677
|
+
},
|
|
33678
|
+
"storageMigration.cleanupStatus": {
|
|
33679
|
+
capName: "storage-migration",
|
|
33680
|
+
capScope: "system",
|
|
33681
|
+
addonId: null,
|
|
33682
|
+
access: "view"
|
|
33683
|
+
},
|
|
33527
33684
|
"storageMigration.drain": {
|
|
33528
33685
|
capName: "storage-migration",
|
|
33529
33686
|
capScope: "system",
|
|
33530
33687
|
addonId: null,
|
|
33531
33688
|
access: "create"
|
|
33532
33689
|
},
|
|
33690
|
+
"storageMigration.history": {
|
|
33691
|
+
capName: "storage-migration",
|
|
33692
|
+
capScope: "system",
|
|
33693
|
+
addonId: null,
|
|
33694
|
+
access: "view"
|
|
33695
|
+
},
|
|
33533
33696
|
"storageMigration.movers": {
|
|
33534
33697
|
capName: "storage-migration",
|
|
33535
33698
|
capScope: "system",
|
|
@@ -35526,11 +35689,6 @@ Object.freeze({
|
|
|
35526
35689
|
form: "single",
|
|
35527
35690
|
optional: true
|
|
35528
35691
|
}],
|
|
35529
|
-
"pipelineAnalytics.getGroup": [{
|
|
35530
|
-
name: "deviceId",
|
|
35531
|
-
form: "single",
|
|
35532
|
-
optional: false
|
|
35533
|
-
}],
|
|
35534
35692
|
"pipelineAnalytics.getKeyEvents": [{
|
|
35535
35693
|
name: "deviceId",
|
|
35536
35694
|
form: "single",
|
|
@@ -35596,11 +35754,6 @@ Object.freeze({
|
|
|
35596
35754
|
form: "single",
|
|
35597
35755
|
optional: false
|
|
35598
35756
|
}],
|
|
35599
|
-
"pipelineAnalytics.listGroups": [{
|
|
35600
|
-
name: "deviceIds",
|
|
35601
|
-
form: "array",
|
|
35602
|
-
optional: false
|
|
35603
|
-
}],
|
|
35604
35757
|
"pipelineAnalytics.listOpsLog": [{
|
|
35605
35758
|
name: "deviceId",
|
|
35606
35759
|
form: "single",
|
|
@@ -35646,6 +35799,11 @@ Object.freeze({
|
|
|
35646
35799
|
form: "single",
|
|
35647
35800
|
optional: true
|
|
35648
35801
|
}],
|
|
35802
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
35803
|
+
name: "deviceIds",
|
|
35804
|
+
form: "array",
|
|
35805
|
+
optional: true
|
|
35806
|
+
}],
|
|
35649
35807
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
35650
35808
|
name: "deviceId",
|
|
35651
35809
|
form: "single",
|
|
@@ -36011,6 +36169,11 @@ Object.freeze({
|
|
|
36011
36169
|
form: "single",
|
|
36012
36170
|
optional: false
|
|
36013
36171
|
}],
|
|
36172
|
+
"recording.setDevicePlacement": [{
|
|
36173
|
+
name: "deviceId",
|
|
36174
|
+
form: "single",
|
|
36175
|
+
optional: false
|
|
36176
|
+
}],
|
|
36014
36177
|
"recording.startStorageMigrationMove": [{
|
|
36015
36178
|
name: "deviceId",
|
|
36016
36179
|
form: "single",
|
package/dist/smtp.addon.mjs
CHANGED
|
@@ -8115,6 +8115,13 @@ var MediaRelocateModeSchema = _enum([
|
|
|
8115
8115
|
]);
|
|
8116
8116
|
var RelocateMediaInputSchema = object({
|
|
8117
8117
|
toLocationId: string(),
|
|
8118
|
+
/**
|
|
8119
|
+
* Restrict the pass to rows currently on this location. Omitted / `'*'` =
|
|
8120
|
+
* every row that is not already on `toLocationId` (the historical
|
|
8121
|
+
* behaviour). A named source is what a from→to migration needs: without it
|
|
8122
|
+
* "move events off disk 2" also emptied disk 1.
|
|
8123
|
+
*/
|
|
8124
|
+
fromLocationId: string().optional(),
|
|
8118
8125
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8119
8126
|
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8120
8127
|
mode: MediaRelocateModeSchema.optional()
|
|
@@ -8182,6 +8189,19 @@ var StorageMigrationDestinationsSchema = object({
|
|
|
8182
8189
|
galleryMedia: string().min(1).optional()
|
|
8183
8190
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8184
8191
|
/**
|
|
8192
|
+
* Optional named source per class. Omitted = the class's current default
|
|
8193
|
+
* (the historical behaviour). A named source that is NOT the default is a
|
|
8194
|
+
* drain of that disk: bytes move, the default stays, and the source is
|
|
8195
|
+
* disabled when the move finishes.
|
|
8196
|
+
*/
|
|
8197
|
+
var StorageMigrationSourcesSchema = object({
|
|
8198
|
+
recordings: string().min(1).optional(),
|
|
8199
|
+
recordingsLow: string().min(1).optional(),
|
|
8200
|
+
eventMedia: string().min(1).optional(),
|
|
8201
|
+
backups: string().min(1).optional(),
|
|
8202
|
+
galleryMedia: string().min(1).optional()
|
|
8203
|
+
}).optional();
|
|
8204
|
+
/**
|
|
8185
8205
|
* How a migration sequences the cutover against the byte move.
|
|
8186
8206
|
*
|
|
8187
8207
|
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
@@ -8203,6 +8223,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
|
8203
8223
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8204
8224
|
var StorageMigrationInputSchema = object({
|
|
8205
8225
|
destinations: StorageMigrationDestinationsSchema,
|
|
8226
|
+
/** Omitted = each class's current default. */
|
|
8227
|
+
sources: StorageMigrationSourcesSchema,
|
|
8206
8228
|
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8207
8229
|
/** Omitted = `blocking`, which stays the default. */
|
|
8208
8230
|
mode: StorageMigrationModeSchema.optional()
|
|
@@ -8282,6 +8304,13 @@ var StorageMigrationMoveSchema = object({
|
|
|
8282
8304
|
storageClass: StorageMigrationClassSchema,
|
|
8283
8305
|
fromLocationId: string(),
|
|
8284
8306
|
toLocationId: string(),
|
|
8307
|
+
/**
|
|
8308
|
+
* True when `from` was NOT the class default at plan time. The move still
|
|
8309
|
+
* copies bytes, but the default is left alone and the source is disabled
|
|
8310
|
+
* once the copy verifies. Absent on jobs planned before this field existed
|
|
8311
|
+
* — those jobs always repointed, which is `false`.
|
|
8312
|
+
*/
|
|
8313
|
+
freezeSource: boolean().optional(),
|
|
8285
8314
|
moverJobId: string().nullable(),
|
|
8286
8315
|
state: RelocateJobStateSchema.nullable(),
|
|
8287
8316
|
error: string().nullable(),
|
|
@@ -8295,6 +8324,7 @@ var StorageMigrationJobSchema = object({
|
|
|
8295
8324
|
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8296
8325
|
mode: StorageMigrationModeSchema,
|
|
8297
8326
|
destinations: StorageMigrationDestinationsSchema,
|
|
8327
|
+
sources: StorageMigrationSourcesSchema,
|
|
8298
8328
|
throttleMbps: number(),
|
|
8299
8329
|
moves: array(StorageMigrationMoveSchema),
|
|
8300
8330
|
pauseLeaseId: string().nullable(),
|
|
@@ -8320,6 +8350,7 @@ var StorageMigrationFindingSchema = object({
|
|
|
8320
8350
|
});
|
|
8321
8351
|
var StorageMigrationPlanSchema = object({
|
|
8322
8352
|
destinations: StorageMigrationDestinationsSchema,
|
|
8353
|
+
sources: StorageMigrationSourcesSchema,
|
|
8323
8354
|
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8324
8355
|
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8325
8356
|
* it. */
|
|
@@ -8327,7 +8358,8 @@ var StorageMigrationPlanSchema = object({
|
|
|
8327
8358
|
moves: array(object({
|
|
8328
8359
|
storageClass: StorageMigrationClassSchema,
|
|
8329
8360
|
fromLocationId: string(),
|
|
8330
|
-
toLocationId: string()
|
|
8361
|
+
toLocationId: string(),
|
|
8362
|
+
freezeSource: boolean().optional()
|
|
8331
8363
|
})),
|
|
8332
8364
|
findings: array(StorageMigrationFindingSchema)
|
|
8333
8365
|
});
|
|
@@ -8505,10 +8537,51 @@ var LedgerWalkReportSchema = object({
|
|
|
8505
8537
|
var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
|
|
8506
8538
|
var RelocatableMediaCountInputSchema = object({
|
|
8507
8539
|
toLocationId: string().min(1),
|
|
8540
|
+
/** Restrict the count to one source; omitted / `'*'` = every non-target row. */
|
|
8541
|
+
fromLocationId: string().optional(),
|
|
8508
8542
|
/** Omitted = `move`. */
|
|
8509
8543
|
mode: MediaRelocateModeSchema.optional()
|
|
8510
8544
|
});
|
|
8511
8545
|
/**
|
|
8546
|
+
* Operator cleanup of leftover analytics rows, optional debug media, and
|
|
8547
|
+
* ghost ledger entries on frozen footage locations.
|
|
8548
|
+
*
|
|
8549
|
+
* A pass is tens of minutes on a standing backlog. The hub method RETURNS
|
|
8550
|
+
* `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
|
|
8551
|
+
* is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
|
|
8552
|
+
* with no operator-visible status.
|
|
8553
|
+
*/
|
|
8554
|
+
var StorageCleanupPhaseSchema = _enum([
|
|
8555
|
+
"orphans",
|
|
8556
|
+
"debug-media",
|
|
8557
|
+
"ghost-ledger",
|
|
8558
|
+
"done",
|
|
8559
|
+
"failed",
|
|
8560
|
+
"cancelled"
|
|
8561
|
+
]);
|
|
8562
|
+
var StorageCleanupInputSchema = object({
|
|
8563
|
+
/** Also walk motion stills / track filmstrips. Off by default. */
|
|
8564
|
+
includeDebugMedia: boolean().optional() });
|
|
8565
|
+
var StorageCleanupJobSchema = object({
|
|
8566
|
+
jobId: string(),
|
|
8567
|
+
phase: StorageCleanupPhaseSchema,
|
|
8568
|
+
includeDebugMedia: boolean(),
|
|
8569
|
+
orphansReclaimed: number().int().nonnegative(),
|
|
8570
|
+
orphanBytesReclaimed: number().int().nonnegative(),
|
|
8571
|
+
debugMediaReclaimed: number().int().nonnegative(),
|
|
8572
|
+
debugMediaBytesReclaimed: number().int().nonnegative(),
|
|
8573
|
+
ghostsForgotten: number().int().nonnegative(),
|
|
8574
|
+
ghostBytesForgotten: number().int().nonnegative(),
|
|
8575
|
+
/** Short operator-facing line: current collection, pass, or location. */
|
|
8576
|
+
detail: string().nullable(),
|
|
8577
|
+
cancelRequested: boolean(),
|
|
8578
|
+
startedAt: number(),
|
|
8579
|
+
updatedAt: number(),
|
|
8580
|
+
finishedAt: number().nullable(),
|
|
8581
|
+
error: string().nullable()
|
|
8582
|
+
});
|
|
8583
|
+
var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
|
|
8584
|
+
/**
|
|
8512
8585
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
8513
8586
|
* storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
|
|
8514
8587
|
* so the persisted record schema and the consumer-facing cap can both consume it
|
|
@@ -8536,11 +8609,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
|
|
|
8536
8609
|
* The default location for a type uses `id === <type>:default` by
|
|
8537
8610
|
* convention (the bare type ref like `'backups'` resolves to it).
|
|
8538
8611
|
*
|
|
8539
|
-
* `isSystem
|
|
8540
|
-
*
|
|
8541
|
-
*
|
|
8542
|
-
*
|
|
8543
|
-
* deleting it is rejected at the cap level.
|
|
8612
|
+
* `isSystem` is a legacy persisted flag. Seed still creates the initial
|
|
8613
|
+
* `<type>:default` locations; the flag is no longer a lock, a badge, or a
|
|
8614
|
+
* prune selector. New writes leave it false. Deletion is gated on uniqueness
|
|
8615
|
+
* / last-enabled, not on this bit.
|
|
8544
8616
|
*/
|
|
8545
8617
|
var StorageLocationSchema = object({
|
|
8546
8618
|
id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
|
|
@@ -12802,6 +12874,12 @@ method(object({
|
|
|
12802
12874
|
}), _void(), {
|
|
12803
12875
|
kind: "mutation",
|
|
12804
12876
|
auth: "admin"
|
|
12877
|
+
}), method(object({
|
|
12878
|
+
from: string(),
|
|
12879
|
+
to: string()
|
|
12880
|
+
}), object({ moved: number() }), {
|
|
12881
|
+
kind: "mutation",
|
|
12882
|
+
auth: "admin"
|
|
12805
12883
|
}), method(object({
|
|
12806
12884
|
deviceId: number(),
|
|
12807
12885
|
disabled: boolean()
|
|
@@ -15514,6 +15592,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
15514
15592
|
"device-offline",
|
|
15515
15593
|
"device-disabled",
|
|
15516
15594
|
"device-enabled",
|
|
15595
|
+
"device-battery-low",
|
|
15596
|
+
"device-battery-normal",
|
|
15517
15597
|
"stream-online",
|
|
15518
15598
|
"stream-offline",
|
|
15519
15599
|
"node-online",
|
|
@@ -18732,46 +18812,6 @@ var RecentTracksPageSchema = object({
|
|
|
18732
18812
|
/** Cursor for the next page, or null when this page is the last. */
|
|
18733
18813
|
nextCursor: string().nullable()
|
|
18734
18814
|
});
|
|
18735
|
-
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
18736
|
-
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
18737
|
-
var AnalyticsGroupRecordSchema = object({
|
|
18738
|
-
id: string(),
|
|
18739
|
-
deviceId: number().int(),
|
|
18740
|
-
openedAt: number().int(),
|
|
18741
|
-
closedAt: number().int(),
|
|
18742
|
-
timestamp: number().int(),
|
|
18743
|
-
memberCount: number().int(),
|
|
18744
|
-
memberTrackIds: array(string()).readonly(),
|
|
18745
|
-
className: string(),
|
|
18746
|
-
classes: array(string()).readonly(),
|
|
18747
|
-
/** Relative event-media path, or null when the group has no picture yet. */
|
|
18748
|
-
mediaUrl: string().nullable(),
|
|
18749
|
-
singleton: boolean()
|
|
18750
|
-
});
|
|
18751
|
-
var AnalyticsGroupMemberSchema = object({
|
|
18752
|
-
trackId: string(),
|
|
18753
|
-
deviceId: number().int(),
|
|
18754
|
-
className: string(),
|
|
18755
|
-
firstSeen: number().int(),
|
|
18756
|
-
lastSeen: number().int(),
|
|
18757
|
-
mediaUrl: string().nullable()
|
|
18758
|
-
});
|
|
18759
|
-
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
18760
|
-
var ListGroupsQueryInput = object({
|
|
18761
|
-
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
18762
|
-
deviceIds: array(number()),
|
|
18763
|
-
/** Window lower bound on `closedAt` (inclusive). */
|
|
18764
|
-
since: number().optional(),
|
|
18765
|
-
/** Window upper bound on `openedAt` (inclusive). */
|
|
18766
|
-
until: number().optional(),
|
|
18767
|
-
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
18768
|
-
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
18769
|
-
cursor: string().optional()
|
|
18770
|
-
});
|
|
18771
|
-
var ListGroupsPageSchema = object({
|
|
18772
|
-
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
18773
|
-
nextCursor: string().nullable()
|
|
18774
|
-
});
|
|
18775
18815
|
var KEY_EVENTS_DEFAULT_LIMIT = 50;
|
|
18776
18816
|
var KEY_EVENTS_MAX_LIMIT = 200;
|
|
18777
18817
|
var KeyEventQueryInput = object({
|
|
@@ -18875,9 +18915,7 @@ var TrackCascadeCountsSchema = object({
|
|
|
18875
18915
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
18876
18916
|
plates: number().int(),
|
|
18877
18917
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
18878
|
-
embeddings: number().int()
|
|
18879
|
-
/** Group membership + group rows removed with their last member (best-effort). */
|
|
18880
|
-
groups: number().int()
|
|
18918
|
+
embeddings: number().int()
|
|
18881
18919
|
});
|
|
18882
18920
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
18883
18921
|
var DiskReconcileCountsSchema = object({
|
|
@@ -19047,6 +19085,47 @@ var RebuildStatusSchema = object({
|
|
|
19047
19085
|
/** Present when the pass ended by throwing. */
|
|
19048
19086
|
error: string().nullable()
|
|
19049
19087
|
});
|
|
19088
|
+
/**
|
|
19089
|
+
* Acknowledgement that a debug-media reclaim STARTED.
|
|
19090
|
+
*
|
|
19091
|
+
* The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
|
|
19092
|
+
* it runs detached and this returns immediately. Awaiting it is how the
|
|
19093
|
+
* `addons.custom` door hit the 60 s UDS deadline while the walk carried on
|
|
19094
|
+
* with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
|
|
19095
|
+
*/
|
|
19096
|
+
var MediaReclaimStartResultSchema = object({
|
|
19097
|
+
started: boolean(),
|
|
19098
|
+
/** True when a pass was already running; the new request is ignored. */
|
|
19099
|
+
alreadyRunning: boolean()
|
|
19100
|
+
});
|
|
19101
|
+
var MediaReclaimInputSchema = object({
|
|
19102
|
+
mode: _enum(["report", "reclaim"]).default("report"),
|
|
19103
|
+
scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
|
|
19104
|
+
deviceIds: array(number().int()).min(1).optional(),
|
|
19105
|
+
restart: boolean().optional(),
|
|
19106
|
+
pageSize: number().int().min(50).max(5e3).optional(),
|
|
19107
|
+
maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19108
|
+
maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
|
|
19109
|
+
maxBytesPerRun: number().int().min(1).optional(),
|
|
19110
|
+
budgetMinutes: number().int().min(1).max(720).optional(),
|
|
19111
|
+
throttleBytesPerSec: number().int().min(64 * 1024).optional(),
|
|
19112
|
+
graceMinutes: number().int().min(1).max(10080).optional()
|
|
19113
|
+
});
|
|
19114
|
+
var MediaReclaimStatusSchema = object({
|
|
19115
|
+
running: boolean(),
|
|
19116
|
+
mode: _enum(["report", "reclaim"]).nullable(),
|
|
19117
|
+
totalExamined: number(),
|
|
19118
|
+
totalEligible: number(),
|
|
19119
|
+
totalReclaimed: number(),
|
|
19120
|
+
totalBytesReclaimed: number(),
|
|
19121
|
+
totalRefused: number(),
|
|
19122
|
+
/** Device+scope windows finished in this pass. */
|
|
19123
|
+
devicesDone: number(),
|
|
19124
|
+
complete: boolean().nullable(),
|
|
19125
|
+
startedAtMs: number().nullable(),
|
|
19126
|
+
finishedAtMs: number().nullable(),
|
|
19127
|
+
error: string().nullable()
|
|
19128
|
+
});
|
|
19050
19129
|
var ReplayFrameInputSchema = object({
|
|
19051
19130
|
timestamp: number(),
|
|
19052
19131
|
frame: PipelineRunResultBridge
|
|
@@ -19085,10 +19164,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19085
19164
|
* stationary registry). Default false: the timeline lists passages,
|
|
19086
19165
|
* not parking records (operator decision, 2026-08-15). */
|
|
19087
19166
|
includeStationary: boolean().optional()
|
|
19088
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
19089
|
-
deviceId: number(),
|
|
19090
|
-
groupId: string().min(1)
|
|
19091
|
-
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
19167
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
|
|
19092
19168
|
kind: "mutation",
|
|
19093
19169
|
auth: "admin"
|
|
19094
19170
|
}), 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({
|
|
@@ -19188,6 +19264,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19188
19264
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
19189
19265
|
kind: "query",
|
|
19190
19266
|
auth: "admin"
|
|
19267
|
+
}), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
|
|
19268
|
+
kind: "mutation",
|
|
19269
|
+
auth: "admin"
|
|
19270
|
+
}), method(object({}), MediaReclaimStatusSchema, {
|
|
19271
|
+
kind: "query",
|
|
19272
|
+
auth: "admin"
|
|
19191
19273
|
}), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
|
|
19192
19274
|
kind: "query",
|
|
19193
19275
|
auth: "admin"
|
|
@@ -21171,7 +21253,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
21171
21253
|
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
|
|
21172
21254
|
kind: "mutation",
|
|
21173
21255
|
auth: "admin"
|
|
21174
|
-
})
|
|
21256
|
+
}), method(StorageCleanupInputSchema, object({ jobId: string() }), {
|
|
21257
|
+
kind: "mutation",
|
|
21258
|
+
auth: "admin"
|
|
21259
|
+
}), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
21260
|
+
kind: "mutation",
|
|
21261
|
+
auth: "admin"
|
|
21262
|
+
}), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
|
|
21175
21263
|
var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
21176
21264
|
providerId: string().min(1),
|
|
21177
21265
|
displayName: string().min(1),
|
|
@@ -26549,6 +26637,33 @@ var RecordingRebalanceInputSchema = object({
|
|
|
26549
26637
|
minMoveGb: number().min(0).optional()
|
|
26550
26638
|
});
|
|
26551
26639
|
/**
|
|
26640
|
+
* Operator-facing placement of one camera onto a recordings location.
|
|
26641
|
+
*
|
|
26642
|
+
* `pinLocationId` is the operator instruction: a location id, or `null` for
|
|
26643
|
+
* Auto (the planner may move this camera). `locationId` is where high/mid
|
|
26644
|
+
* currently write — the plan, which may disagree with the pin when Auto.
|
|
26645
|
+
*/
|
|
26646
|
+
var RecordingDevicePlacementSchema = object({
|
|
26647
|
+
deviceId: number().int(),
|
|
26648
|
+
profile: string(),
|
|
26649
|
+
locationId: string()
|
|
26650
|
+
});
|
|
26651
|
+
var RecordingDevicePinSchema = object({
|
|
26652
|
+
deviceId: number().int(),
|
|
26653
|
+
/** Recordings-class location this camera is pinned to. */
|
|
26654
|
+
locationId: string()
|
|
26655
|
+
});
|
|
26656
|
+
var RecordingPlacementViewSchema = object({
|
|
26657
|
+
assignments: array(RecordingDevicePlacementSchema),
|
|
26658
|
+
pins: array(RecordingDevicePinSchema),
|
|
26659
|
+
defaultLocations: record(string(), string())
|
|
26660
|
+
});
|
|
26661
|
+
var RecordingSetDevicePlacementInputSchema = object({
|
|
26662
|
+
deviceId: number().int(),
|
|
26663
|
+
/** `null` = Auto. Otherwise a `recordings:*` location id. */
|
|
26664
|
+
locationId: string().nullable()
|
|
26665
|
+
});
|
|
26666
|
+
/**
|
|
26552
26667
|
* Result of locating footage at a wall-clock instant for one device/profile.
|
|
26553
26668
|
* `segment` carries the covering segment's window; `gap` reports the forward
|
|
26554
26669
|
* nearest covered edge (`null` past the end of footage / when none exists)
|
|
@@ -26774,6 +26889,12 @@ method(object({
|
|
|
26774
26889
|
}), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
|
|
26775
26890
|
kind: "mutation",
|
|
26776
26891
|
auth: "admin"
|
|
26892
|
+
}), method(object({}), RecordingPlacementViewSchema, {
|
|
26893
|
+
kind: "query",
|
|
26894
|
+
auth: "admin"
|
|
26895
|
+
}), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
|
|
26896
|
+
kind: "mutation",
|
|
26897
|
+
auth: "admin"
|
|
26777
26898
|
});
|
|
26778
26899
|
/**
|
|
26779
26900
|
* `recording-export` cap — render a footage time range into a single downloadable
|
|
@@ -30144,6 +30265,12 @@ Object.freeze({
|
|
|
30144
30265
|
addonId: null,
|
|
30145
30266
|
access: "delete"
|
|
30146
30267
|
},
|
|
30268
|
+
"deviceManager.renameLocation": {
|
|
30269
|
+
capName: "device-manager",
|
|
30270
|
+
capScope: "system",
|
|
30271
|
+
addonId: null,
|
|
30272
|
+
access: "create"
|
|
30273
|
+
},
|
|
30147
30274
|
"deviceManager.runDeviceAction": {
|
|
30148
30275
|
capName: "device-manager",
|
|
30149
30276
|
capScope: "system",
|
|
@@ -31836,19 +31963,19 @@ Object.freeze({
|
|
|
31836
31963
|
addonId: null,
|
|
31837
31964
|
access: "view"
|
|
31838
31965
|
},
|
|
31839
|
-
"pipelineAnalytics.
|
|
31966
|
+
"pipelineAnalytics.getKeyEvents": {
|
|
31840
31967
|
capName: "pipeline-analytics",
|
|
31841
31968
|
capScope: "device",
|
|
31842
31969
|
addonId: null,
|
|
31843
31970
|
access: "view"
|
|
31844
31971
|
},
|
|
31845
|
-
"pipelineAnalytics.
|
|
31972
|
+
"pipelineAnalytics.getKeyEventsBatch": {
|
|
31846
31973
|
capName: "pipeline-analytics",
|
|
31847
31974
|
capScope: "device",
|
|
31848
31975
|
addonId: null,
|
|
31849
31976
|
access: "view"
|
|
31850
31977
|
},
|
|
31851
|
-
"pipelineAnalytics.
|
|
31978
|
+
"pipelineAnalytics.getMediaReclaimStatus": {
|
|
31852
31979
|
capName: "pipeline-analytics",
|
|
31853
31980
|
capScope: "device",
|
|
31854
31981
|
addonId: null,
|
|
@@ -31938,12 +32065,6 @@ Object.freeze({
|
|
|
31938
32065
|
addonId: null,
|
|
31939
32066
|
access: "view"
|
|
31940
32067
|
},
|
|
31941
|
-
"pipelineAnalytics.listGroups": {
|
|
31942
|
-
capName: "pipeline-analytics",
|
|
31943
|
-
capScope: "device",
|
|
31944
|
-
addonId: null,
|
|
31945
|
-
access: "view"
|
|
31946
|
-
},
|
|
31947
32068
|
"pipelineAnalytics.listOpsLog": {
|
|
31948
32069
|
capName: "pipeline-analytics",
|
|
31949
32070
|
capScope: "device",
|
|
@@ -32028,6 +32149,12 @@ Object.freeze({
|
|
|
32028
32149
|
addonId: null,
|
|
32029
32150
|
access: "create"
|
|
32030
32151
|
},
|
|
32152
|
+
"pipelineAnalytics.reclaimDebugMedia": {
|
|
32153
|
+
capName: "pipeline-analytics",
|
|
32154
|
+
capScope: "device",
|
|
32155
|
+
addonId: null,
|
|
32156
|
+
access: "create"
|
|
32157
|
+
},
|
|
32031
32158
|
"pipelineAnalytics.reconcileFromDisk": {
|
|
32032
32159
|
capName: "pipeline-analytics",
|
|
32033
32160
|
capScope: "device",
|
|
@@ -32952,6 +33079,12 @@ Object.freeze({
|
|
|
32952
33079
|
addonId: null,
|
|
32953
33080
|
access: "view"
|
|
32954
33081
|
},
|
|
33082
|
+
"recording.getPlacement": {
|
|
33083
|
+
capName: "recording",
|
|
33084
|
+
capScope: "system",
|
|
33085
|
+
addonId: null,
|
|
33086
|
+
access: "view"
|
|
33087
|
+
},
|
|
32955
33088
|
"recording.getPlaybackManifest": {
|
|
32956
33089
|
capName: "recording",
|
|
32957
33090
|
capScope: "system",
|
|
@@ -33078,6 +33211,12 @@ Object.freeze({
|
|
|
33078
33211
|
addonId: null,
|
|
33079
33212
|
access: "create"
|
|
33080
33213
|
},
|
|
33214
|
+
"recording.setDevicePlacement": {
|
|
33215
|
+
capName: "recording",
|
|
33216
|
+
capScope: "system",
|
|
33217
|
+
addonId: null,
|
|
33218
|
+
access: "create"
|
|
33219
|
+
},
|
|
33081
33220
|
"recording.startStorageMigrationMove": {
|
|
33082
33221
|
capName: "recording",
|
|
33083
33222
|
capScope: "system",
|
|
@@ -33522,12 +33661,36 @@ Object.freeze({
|
|
|
33522
33661
|
addonId: null,
|
|
33523
33662
|
access: "create"
|
|
33524
33663
|
},
|
|
33664
|
+
"storageMigration.cleanupCancel": {
|
|
33665
|
+
capName: "storage-migration",
|
|
33666
|
+
capScope: "system",
|
|
33667
|
+
addonId: null,
|
|
33668
|
+
access: "create"
|
|
33669
|
+
},
|
|
33670
|
+
"storageMigration.cleanupStart": {
|
|
33671
|
+
capName: "storage-migration",
|
|
33672
|
+
capScope: "system",
|
|
33673
|
+
addonId: null,
|
|
33674
|
+
access: "create"
|
|
33675
|
+
},
|
|
33676
|
+
"storageMigration.cleanupStatus": {
|
|
33677
|
+
capName: "storage-migration",
|
|
33678
|
+
capScope: "system",
|
|
33679
|
+
addonId: null,
|
|
33680
|
+
access: "view"
|
|
33681
|
+
},
|
|
33525
33682
|
"storageMigration.drain": {
|
|
33526
33683
|
capName: "storage-migration",
|
|
33527
33684
|
capScope: "system",
|
|
33528
33685
|
addonId: null,
|
|
33529
33686
|
access: "create"
|
|
33530
33687
|
},
|
|
33688
|
+
"storageMigration.history": {
|
|
33689
|
+
capName: "storage-migration",
|
|
33690
|
+
capScope: "system",
|
|
33691
|
+
addonId: null,
|
|
33692
|
+
access: "view"
|
|
33693
|
+
},
|
|
33531
33694
|
"storageMigration.movers": {
|
|
33532
33695
|
capName: "storage-migration",
|
|
33533
33696
|
capScope: "system",
|
|
@@ -35524,11 +35687,6 @@ Object.freeze({
|
|
|
35524
35687
|
form: "single",
|
|
35525
35688
|
optional: true
|
|
35526
35689
|
}],
|
|
35527
|
-
"pipelineAnalytics.getGroup": [{
|
|
35528
|
-
name: "deviceId",
|
|
35529
|
-
form: "single",
|
|
35530
|
-
optional: false
|
|
35531
|
-
}],
|
|
35532
35690
|
"pipelineAnalytics.getKeyEvents": [{
|
|
35533
35691
|
name: "deviceId",
|
|
35534
35692
|
form: "single",
|
|
@@ -35594,11 +35752,6 @@ Object.freeze({
|
|
|
35594
35752
|
form: "single",
|
|
35595
35753
|
optional: false
|
|
35596
35754
|
}],
|
|
35597
|
-
"pipelineAnalytics.listGroups": [{
|
|
35598
|
-
name: "deviceIds",
|
|
35599
|
-
form: "array",
|
|
35600
|
-
optional: false
|
|
35601
|
-
}],
|
|
35602
35755
|
"pipelineAnalytics.listOpsLog": [{
|
|
35603
35756
|
name: "deviceId",
|
|
35604
35757
|
form: "single",
|
|
@@ -35644,6 +35797,11 @@ Object.freeze({
|
|
|
35644
35797
|
form: "single",
|
|
35645
35798
|
optional: true
|
|
35646
35799
|
}],
|
|
35800
|
+
"pipelineAnalytics.reclaimDebugMedia": [{
|
|
35801
|
+
name: "deviceIds",
|
|
35802
|
+
form: "array",
|
|
35803
|
+
optional: true
|
|
35804
|
+
}],
|
|
35647
35805
|
"pipelineAnalytics.reconcileFromDisk": [{
|
|
35648
35806
|
name: "deviceId",
|
|
35649
35807
|
form: "single",
|
|
@@ -36009,6 +36167,11 @@ Object.freeze({
|
|
|
36009
36167
|
form: "single",
|
|
36010
36168
|
optional: false
|
|
36011
36169
|
}],
|
|
36170
|
+
"recording.setDevicePlacement": [{
|
|
36171
|
+
name: "deviceId",
|
|
36172
|
+
form: "single",
|
|
36173
|
+
optional: false
|
|
36174
|
+
}],
|
|
36012
36175
|
"recording.startStorageMigrationMove": [{
|
|
36013
36176
|
name: "deviceId",
|
|
36014
36177
|
form: "single",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-smtp-nodemailer",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.50",
|
|
4
4
|
"description": "SMTP email provider addon for CamStack — wraps `nodemailer` and registers a `smtp-provider` cap collection entry. Used by magic-link login + notifier addons.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|