@camstack/addon-notifiers 1.2.45 → 1.2.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/addon.js +127 -19
- package/dist/addon.mjs +127 -19
- package/package.json +1 -1
package/dist/addon.js
CHANGED
|
@@ -8172,18 +8172,61 @@ var RelocateFootageInputSchema = object({
|
|
|
8172
8172
|
* `RecordingConfig.enabled` or camera wrapper bindings. */
|
|
8173
8173
|
var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
|
|
8174
8174
|
var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
|
|
8175
|
+
/**
|
|
8176
|
+
* What a `relocateMedia` pass DOES. One engine, three passes — never a second
|
|
8177
|
+
* mover (the engine already walks both collections with a timestamp cursor and
|
|
8178
|
+
* already has a stamp-without-copy path).
|
|
8179
|
+
*
|
|
8180
|
+
* - `move` — the default and the historical behaviour: event-media and
|
|
8181
|
+
* retrain blobs move to `toLocationId` and their rows are
|
|
8182
|
+
* stamped. The enrolled gallery is skipped (D197).
|
|
8183
|
+
* - `seal` — ROWS ONLY, no bytes. Every row whose `locationId` is NULL is
|
|
8184
|
+
* stamped with `toLocationId`. `toLocationId` here is the id the
|
|
8185
|
+
* bytes ALREADY sit on — today's `eventMedia` default — because
|
|
8186
|
+
* a NULL row means "wherever `eventMedia` points *now*", and the
|
|
8187
|
+
* instant a repoint moves that pointer the row reads from the
|
|
8188
|
+
* new disk while its bytes are on the old one.
|
|
8189
|
+
* - `gallery` — the inverse selection of `move`: ONLY the retention-exempt
|
|
8190
|
+
* (enrolled-gallery) rows, which `move` deliberately skips.
|
|
8191
|
+
* `galleryMedia` is `cardinality: 'single'`, so this pass can
|
|
8192
|
+
* never run beside a live second location: it is stop-the-world
|
|
8193
|
+
* by construction, which is acceptable only because the gallery
|
|
8194
|
+
* is a few KB per enrolled sample.
|
|
8195
|
+
*/
|
|
8196
|
+
var MediaRelocateModeSchema = _enum([
|
|
8197
|
+
"move",
|
|
8198
|
+
"seal",
|
|
8199
|
+
"gallery"
|
|
8200
|
+
]);
|
|
8175
8201
|
var RelocateMediaInputSchema = object({
|
|
8176
8202
|
toLocationId: string(),
|
|
8177
|
-
throttleMbps: number().min(1).max(1e3).optional()
|
|
8203
|
+
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8204
|
+
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8205
|
+
mode: MediaRelocateModeSchema.optional()
|
|
8206
|
+
});
|
|
8207
|
+
/** How many rows still carry NO `locationId` — the population a repoint would
|
|
8208
|
+
* silently re-aim at a disk that does not hold their bytes. Zero is the only
|
|
8209
|
+
* value that permits a non-blocking `eventMedia` cutover. */
|
|
8210
|
+
var UnstampedEventMediaCountSchema = object({
|
|
8211
|
+
media: number().int().nonnegative(),
|
|
8212
|
+
retrainFrames: number().int().nonnegative(),
|
|
8213
|
+
total: number().int().nonnegative()
|
|
8178
8214
|
});
|
|
8179
8215
|
var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
|
|
8180
|
-
/** The independently selectable logical storage classes
|
|
8181
|
-
*
|
|
8182
|
-
*
|
|
8216
|
+
/** The independently selectable logical storage classes — every class
|
|
8217
|
+
* `storage.listLocationDeclarations` reports, so an operator never meets a
|
|
8218
|
+
* Zod enum error where they should meet an explanation.
|
|
8219
|
+
*
|
|
8220
|
+
* `recordings` encompasses the high and mid segment profiles; `recordingsLow`
|
|
8221
|
+
* is low segments; `eventMedia` is post-analysis blobs; `galleryMedia` is the
|
|
8222
|
+
* enrolled gallery; `backups` is the system backup archive. The last two have
|
|
8223
|
+
* their own rules — see {@link StorageMigrationFindingCodeSchema}. */
|
|
8183
8224
|
var StorageMigrationClassSchema = _enum([
|
|
8184
8225
|
"recordings",
|
|
8185
8226
|
"recordingsLow",
|
|
8186
|
-
"eventMedia"
|
|
8227
|
+
"eventMedia",
|
|
8228
|
+
"backups",
|
|
8229
|
+
"galleryMedia"
|
|
8187
8230
|
]);
|
|
8188
8231
|
/** A destination is always an existing, fully-qualified location id. The
|
|
8189
8232
|
* migration API intentionally never changes a source location's `basePath`:
|
|
@@ -8191,20 +8234,56 @@ var StorageMigrationClassSchema = _enum([
|
|
|
8191
8234
|
var StorageMigrationDestinationsSchema = object({
|
|
8192
8235
|
recordings: string().min(1).optional(),
|
|
8193
8236
|
recordingsLow: string().min(1).optional(),
|
|
8194
|
-
eventMedia: string().min(1).optional()
|
|
8237
|
+
eventMedia: string().min(1).optional(),
|
|
8238
|
+
backups: string().min(1).optional(),
|
|
8239
|
+
galleryMedia: string().min(1).optional()
|
|
8195
8240
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8241
|
+
/**
|
|
8242
|
+
* How a migration sequences the cutover against the byte move.
|
|
8243
|
+
*
|
|
8244
|
+
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
8245
|
+
* resume. Recording is stopped for the whole move. Right
|
|
8246
|
+
* for a small or a cold class, and the only legal mode for
|
|
8247
|
+
* a `cardinality: 'single'` class.
|
|
8248
|
+
* - `nonBlocking` — repoint FIRST, drain behind: seal, pause, repoint,
|
|
8249
|
+
* refresh, resume, then move the past with everything
|
|
8250
|
+
* running. The pause is three bounded instants (a detach +
|
|
8251
|
+
* attach round, a write-gate drain, a lease) instead of one
|
|
8252
|
+
* bounded by bytes. 1.09 TB at 7–14 MB/s is thirty hours of
|
|
8253
|
+
* stopped recording under `blocking`; the same move is
|
|
8254
|
+
* seconds of stopped recording under `nonBlocking`.
|
|
8255
|
+
*
|
|
8256
|
+
* The mode is on the JOB, not only on the input, because `status` is where an
|
|
8257
|
+
* operator finds out which one is running.
|
|
8258
|
+
*/
|
|
8259
|
+
var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
8196
8260
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8197
8261
|
var StorageMigrationInputSchema = object({
|
|
8198
8262
|
destinations: StorageMigrationDestinationsSchema,
|
|
8199
|
-
throttleMbps: number().min(1).max(1e3).optional()
|
|
8263
|
+
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8264
|
+
/** Omitted = `blocking`, which stays the default. */
|
|
8265
|
+
mode: StorageMigrationModeSchema.optional()
|
|
8200
8266
|
});
|
|
8201
|
-
/**
|
|
8202
|
-
*
|
|
8203
|
-
*
|
|
8267
|
+
/**
|
|
8268
|
+
* The durable coordinator state machine.
|
|
8269
|
+
*
|
|
8270
|
+
* `blocking`:
|
|
8271
|
+
* planning → pausing → moving → verifying → repointing → refreshing → resuming → done
|
|
8272
|
+
*
|
|
8273
|
+
* `nonBlocking`:
|
|
8274
|
+
* planning → sealing → pausing → repointing → refreshing → resuming → draining → verifying → done
|
|
8275
|
+
*
|
|
8276
|
+
* Same phases, different order plus two new ones — not a second mover.
|
|
8277
|
+
* `sealing` closes the `eventMedia` NULL-row hole BEFORE anything is paused;
|
|
8278
|
+
* `draining` runs the same movers UNLEASED, after every writer is back up.
|
|
8279
|
+
* `repointing` is still the only phase that changes a default location.
|
|
8280
|
+
*/
|
|
8204
8281
|
var StorageMigrationPhaseSchema = _enum([
|
|
8205
8282
|
"planning",
|
|
8283
|
+
"sealing",
|
|
8206
8284
|
"pausing",
|
|
8207
8285
|
"moving",
|
|
8286
|
+
"draining",
|
|
8208
8287
|
"verifying",
|
|
8209
8288
|
"repointing",
|
|
8210
8289
|
"refreshing",
|
|
@@ -8229,6 +8308,9 @@ var StorageMigrationMoveSchema = object({
|
|
|
8229
8308
|
var StorageMigrationJobSchema = object({
|
|
8230
8309
|
jobId: string(),
|
|
8231
8310
|
phase: StorageMigrationPhaseSchema,
|
|
8311
|
+
/** Which order this job is running. `status` is the only place an operator
|
|
8312
|
+
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8313
|
+
mode: StorageMigrationModeSchema,
|
|
8232
8314
|
destinations: StorageMigrationDestinationsSchema,
|
|
8233
8315
|
throttleMbps: number(),
|
|
8234
8316
|
moves: array(StorageMigrationMoveSchema),
|
|
@@ -8241,13 +8323,30 @@ var StorageMigrationJobSchema = object({
|
|
|
8241
8323
|
finishedAt: number().nullable(),
|
|
8242
8324
|
error: string().nullable()
|
|
8243
8325
|
});
|
|
8326
|
+
var StorageMigrationFindingSchema = object({
|
|
8327
|
+
code: _enum([
|
|
8328
|
+
"sharesDeviceWithSource",
|
|
8329
|
+
"deviceIdentityUnknown",
|
|
8330
|
+
"unstampedEventMediaRows",
|
|
8331
|
+
"blockingOnly",
|
|
8332
|
+
"noMover"
|
|
8333
|
+
]),
|
|
8334
|
+
storageClass: StorageMigrationClassSchema,
|
|
8335
|
+
/** Human-readable, already carrying the ids and counts. */
|
|
8336
|
+
message: string()
|
|
8337
|
+
});
|
|
8244
8338
|
var StorageMigrationPlanSchema = object({
|
|
8245
8339
|
destinations: StorageMigrationDestinationsSchema,
|
|
8340
|
+
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8341
|
+
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8342
|
+
* it. */
|
|
8343
|
+
mode: StorageMigrationModeSchema,
|
|
8246
8344
|
moves: array(object({
|
|
8247
8345
|
storageClass: StorageMigrationClassSchema,
|
|
8248
8346
|
fromLocationId: string(),
|
|
8249
8347
|
toLocationId: string()
|
|
8250
|
-
}))
|
|
8348
|
+
})),
|
|
8349
|
+
findings: array(StorageMigrationFindingSchema)
|
|
8251
8350
|
});
|
|
8252
8351
|
/**
|
|
8253
8352
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
@@ -18813,7 +18912,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
18813
18912
|
}), method(RelocateMediaInputSchema, object({ jobId: string() }), {
|
|
18814
18913
|
kind: "mutation",
|
|
18815
18914
|
auth: "admin"
|
|
18816
|
-
}), method(object({}), array(RelocateJobSchema).readonly(), {
|
|
18915
|
+
}), method(object({}), UnstampedEventMediaCountSchema, { auth: "admin" }), method(object({}), array(RelocateJobSchema).readonly(), {
|
|
18817
18916
|
kind: "query",
|
|
18818
18917
|
auth: "admin"
|
|
18819
18918
|
}), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
@@ -20720,7 +20819,10 @@ method(object({
|
|
|
20720
20819
|
}), StorageLocationSchema, {
|
|
20721
20820
|
kind: "mutation",
|
|
20722
20821
|
auth: "admin"
|
|
20723
|
-
}), method(object({
|
|
20822
|
+
}), method(object({
|
|
20823
|
+
id: string(),
|
|
20824
|
+
force: boolean().optional()
|
|
20825
|
+
}), _void(), {
|
|
20724
20826
|
kind: "mutation",
|
|
20725
20827
|
auth: "admin"
|
|
20726
20828
|
}), method(object({ id: string() }), object({
|
|
@@ -23806,23 +23908,23 @@ DeviceType.Camera, method(object({ deviceId: number() }), object({
|
|
|
23806
23908
|
sdpOffer: string()
|
|
23807
23909
|
}), {
|
|
23808
23910
|
kind: "mutation",
|
|
23809
|
-
auth: "
|
|
23911
|
+
auth: "protected"
|
|
23810
23912
|
}), method(object({
|
|
23811
23913
|
deviceId: number(),
|
|
23812
23914
|
sessionId: string(),
|
|
23813
23915
|
sdpAnswer: string()
|
|
23814
23916
|
}), _void(), {
|
|
23815
23917
|
kind: "mutation",
|
|
23816
|
-
auth: "
|
|
23918
|
+
auth: "protected"
|
|
23817
23919
|
}), method(object({
|
|
23818
23920
|
deviceId: number(),
|
|
23819
23921
|
sessionId: string()
|
|
23820
23922
|
}), _void(), {
|
|
23821
23923
|
kind: "mutation",
|
|
23822
|
-
auth: "
|
|
23924
|
+
auth: "protected"
|
|
23823
23925
|
}), method(object({ deviceId: number() }), object({ sessionId: string() }), {
|
|
23824
23926
|
kind: "mutation",
|
|
23825
|
-
auth: "
|
|
23927
|
+
auth: "protected"
|
|
23826
23928
|
}), method(object({
|
|
23827
23929
|
deviceId: number(),
|
|
23828
23930
|
/** Audio bytes for ONE frame, base64-encoded so the payload
|
|
@@ -23841,10 +23943,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), object({
|
|
|
23841
23943
|
sequenceNumber: number().int()
|
|
23842
23944
|
}), object({ accepted: boolean() }), {
|
|
23843
23945
|
kind: "mutation",
|
|
23844
|
-
auth: "
|
|
23946
|
+
auth: "protected"
|
|
23845
23947
|
}), method(object({ deviceId: number() }), _void(), {
|
|
23846
23948
|
kind: "mutation",
|
|
23847
|
-
auth: "
|
|
23949
|
+
auth: "protected"
|
|
23848
23950
|
}), object({
|
|
23849
23951
|
deviceId: number(),
|
|
23850
23952
|
status: IntercomStatusSchema
|
|
@@ -31193,6 +31295,12 @@ Object.freeze({
|
|
|
31193
31295
|
addonId: null,
|
|
31194
31296
|
access: "create"
|
|
31195
31297
|
},
|
|
31298
|
+
"pipelineAnalytics.countUnstampedEventMedia": {
|
|
31299
|
+
capName: "pipeline-analytics",
|
|
31300
|
+
capScope: "device",
|
|
31301
|
+
addonId: null,
|
|
31302
|
+
access: "view"
|
|
31303
|
+
},
|
|
31196
31304
|
"pipelineAnalytics.deleteDeviceEvents": {
|
|
31197
31305
|
capName: "pipeline-analytics",
|
|
31198
31306
|
capScope: "device",
|
package/dist/addon.mjs
CHANGED
|
@@ -8145,18 +8145,61 @@ var RelocateFootageInputSchema = object({
|
|
|
8145
8145
|
* `RecordingConfig.enabled` or camera wrapper bindings. */
|
|
8146
8146
|
var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
|
|
8147
8147
|
var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
|
|
8148
|
+
/**
|
|
8149
|
+
* What a `relocateMedia` pass DOES. One engine, three passes — never a second
|
|
8150
|
+
* mover (the engine already walks both collections with a timestamp cursor and
|
|
8151
|
+
* already has a stamp-without-copy path).
|
|
8152
|
+
*
|
|
8153
|
+
* - `move` — the default and the historical behaviour: event-media and
|
|
8154
|
+
* retrain blobs move to `toLocationId` and their rows are
|
|
8155
|
+
* stamped. The enrolled gallery is skipped (D197).
|
|
8156
|
+
* - `seal` — ROWS ONLY, no bytes. Every row whose `locationId` is NULL is
|
|
8157
|
+
* stamped with `toLocationId`. `toLocationId` here is the id the
|
|
8158
|
+
* bytes ALREADY sit on — today's `eventMedia` default — because
|
|
8159
|
+
* a NULL row means "wherever `eventMedia` points *now*", and the
|
|
8160
|
+
* instant a repoint moves that pointer the row reads from the
|
|
8161
|
+
* new disk while its bytes are on the old one.
|
|
8162
|
+
* - `gallery` — the inverse selection of `move`: ONLY the retention-exempt
|
|
8163
|
+
* (enrolled-gallery) rows, which `move` deliberately skips.
|
|
8164
|
+
* `galleryMedia` is `cardinality: 'single'`, so this pass can
|
|
8165
|
+
* never run beside a live second location: it is stop-the-world
|
|
8166
|
+
* by construction, which is acceptable only because the gallery
|
|
8167
|
+
* is a few KB per enrolled sample.
|
|
8168
|
+
*/
|
|
8169
|
+
var MediaRelocateModeSchema = _enum([
|
|
8170
|
+
"move",
|
|
8171
|
+
"seal",
|
|
8172
|
+
"gallery"
|
|
8173
|
+
]);
|
|
8148
8174
|
var RelocateMediaInputSchema = object({
|
|
8149
8175
|
toLocationId: string(),
|
|
8150
|
-
throttleMbps: number().min(1).max(1e3).optional()
|
|
8176
|
+
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8177
|
+
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8178
|
+
mode: MediaRelocateModeSchema.optional()
|
|
8179
|
+
});
|
|
8180
|
+
/** How many rows still carry NO `locationId` — the population a repoint would
|
|
8181
|
+
* silently re-aim at a disk that does not hold their bytes. Zero is the only
|
|
8182
|
+
* value that permits a non-blocking `eventMedia` cutover. */
|
|
8183
|
+
var UnstampedEventMediaCountSchema = object({
|
|
8184
|
+
media: number().int().nonnegative(),
|
|
8185
|
+
retrainFrames: number().int().nonnegative(),
|
|
8186
|
+
total: number().int().nonnegative()
|
|
8151
8187
|
});
|
|
8152
8188
|
var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
|
|
8153
|
-
/** The independently selectable logical storage classes
|
|
8154
|
-
*
|
|
8155
|
-
*
|
|
8189
|
+
/** The independently selectable logical storage classes — every class
|
|
8190
|
+
* `storage.listLocationDeclarations` reports, so an operator never meets a
|
|
8191
|
+
* Zod enum error where they should meet an explanation.
|
|
8192
|
+
*
|
|
8193
|
+
* `recordings` encompasses the high and mid segment profiles; `recordingsLow`
|
|
8194
|
+
* is low segments; `eventMedia` is post-analysis blobs; `galleryMedia` is the
|
|
8195
|
+
* enrolled gallery; `backups` is the system backup archive. The last two have
|
|
8196
|
+
* their own rules — see {@link StorageMigrationFindingCodeSchema}. */
|
|
8156
8197
|
var StorageMigrationClassSchema = _enum([
|
|
8157
8198
|
"recordings",
|
|
8158
8199
|
"recordingsLow",
|
|
8159
|
-
"eventMedia"
|
|
8200
|
+
"eventMedia",
|
|
8201
|
+
"backups",
|
|
8202
|
+
"galleryMedia"
|
|
8160
8203
|
]);
|
|
8161
8204
|
/** A destination is always an existing, fully-qualified location id. The
|
|
8162
8205
|
* migration API intentionally never changes a source location's `basePath`:
|
|
@@ -8164,20 +8207,56 @@ var StorageMigrationClassSchema = _enum([
|
|
|
8164
8207
|
var StorageMigrationDestinationsSchema = object({
|
|
8165
8208
|
recordings: string().min(1).optional(),
|
|
8166
8209
|
recordingsLow: string().min(1).optional(),
|
|
8167
|
-
eventMedia: string().min(1).optional()
|
|
8210
|
+
eventMedia: string().min(1).optional(),
|
|
8211
|
+
backups: string().min(1).optional(),
|
|
8212
|
+
galleryMedia: string().min(1).optional()
|
|
8168
8213
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8214
|
+
/**
|
|
8215
|
+
* How a migration sequences the cutover against the byte move.
|
|
8216
|
+
*
|
|
8217
|
+
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
8218
|
+
* resume. Recording is stopped for the whole move. Right
|
|
8219
|
+
* for a small or a cold class, and the only legal mode for
|
|
8220
|
+
* a `cardinality: 'single'` class.
|
|
8221
|
+
* - `nonBlocking` — repoint FIRST, drain behind: seal, pause, repoint,
|
|
8222
|
+
* refresh, resume, then move the past with everything
|
|
8223
|
+
* running. The pause is three bounded instants (a detach +
|
|
8224
|
+
* attach round, a write-gate drain, a lease) instead of one
|
|
8225
|
+
* bounded by bytes. 1.09 TB at 7–14 MB/s is thirty hours of
|
|
8226
|
+
* stopped recording under `blocking`; the same move is
|
|
8227
|
+
* seconds of stopped recording under `nonBlocking`.
|
|
8228
|
+
*
|
|
8229
|
+
* The mode is on the JOB, not only on the input, because `status` is where an
|
|
8230
|
+
* operator finds out which one is running.
|
|
8231
|
+
*/
|
|
8232
|
+
var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
8169
8233
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8170
8234
|
var StorageMigrationInputSchema = object({
|
|
8171
8235
|
destinations: StorageMigrationDestinationsSchema,
|
|
8172
|
-
throttleMbps: number().min(1).max(1e3).optional()
|
|
8236
|
+
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8237
|
+
/** Omitted = `blocking`, which stays the default. */
|
|
8238
|
+
mode: StorageMigrationModeSchema.optional()
|
|
8173
8239
|
});
|
|
8174
|
-
/**
|
|
8175
|
-
*
|
|
8176
|
-
*
|
|
8240
|
+
/**
|
|
8241
|
+
* The durable coordinator state machine.
|
|
8242
|
+
*
|
|
8243
|
+
* `blocking`:
|
|
8244
|
+
* planning → pausing → moving → verifying → repointing → refreshing → resuming → done
|
|
8245
|
+
*
|
|
8246
|
+
* `nonBlocking`:
|
|
8247
|
+
* planning → sealing → pausing → repointing → refreshing → resuming → draining → verifying → done
|
|
8248
|
+
*
|
|
8249
|
+
* Same phases, different order plus two new ones — not a second mover.
|
|
8250
|
+
* `sealing` closes the `eventMedia` NULL-row hole BEFORE anything is paused;
|
|
8251
|
+
* `draining` runs the same movers UNLEASED, after every writer is back up.
|
|
8252
|
+
* `repointing` is still the only phase that changes a default location.
|
|
8253
|
+
*/
|
|
8177
8254
|
var StorageMigrationPhaseSchema = _enum([
|
|
8178
8255
|
"planning",
|
|
8256
|
+
"sealing",
|
|
8179
8257
|
"pausing",
|
|
8180
8258
|
"moving",
|
|
8259
|
+
"draining",
|
|
8181
8260
|
"verifying",
|
|
8182
8261
|
"repointing",
|
|
8183
8262
|
"refreshing",
|
|
@@ -8202,6 +8281,9 @@ var StorageMigrationMoveSchema = object({
|
|
|
8202
8281
|
var StorageMigrationJobSchema = object({
|
|
8203
8282
|
jobId: string(),
|
|
8204
8283
|
phase: StorageMigrationPhaseSchema,
|
|
8284
|
+
/** Which order this job is running. `status` is the only place an operator
|
|
8285
|
+
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8286
|
+
mode: StorageMigrationModeSchema,
|
|
8205
8287
|
destinations: StorageMigrationDestinationsSchema,
|
|
8206
8288
|
throttleMbps: number(),
|
|
8207
8289
|
moves: array(StorageMigrationMoveSchema),
|
|
@@ -8214,13 +8296,30 @@ var StorageMigrationJobSchema = object({
|
|
|
8214
8296
|
finishedAt: number().nullable(),
|
|
8215
8297
|
error: string().nullable()
|
|
8216
8298
|
});
|
|
8299
|
+
var StorageMigrationFindingSchema = object({
|
|
8300
|
+
code: _enum([
|
|
8301
|
+
"sharesDeviceWithSource",
|
|
8302
|
+
"deviceIdentityUnknown",
|
|
8303
|
+
"unstampedEventMediaRows",
|
|
8304
|
+
"blockingOnly",
|
|
8305
|
+
"noMover"
|
|
8306
|
+
]),
|
|
8307
|
+
storageClass: StorageMigrationClassSchema,
|
|
8308
|
+
/** Human-readable, already carrying the ids and counts. */
|
|
8309
|
+
message: string()
|
|
8310
|
+
});
|
|
8217
8311
|
var StorageMigrationPlanSchema = object({
|
|
8218
8312
|
destinations: StorageMigrationDestinationsSchema,
|
|
8313
|
+
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8314
|
+
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8315
|
+
* it. */
|
|
8316
|
+
mode: StorageMigrationModeSchema,
|
|
8219
8317
|
moves: array(object({
|
|
8220
8318
|
storageClass: StorageMigrationClassSchema,
|
|
8221
8319
|
fromLocationId: string(),
|
|
8222
8320
|
toLocationId: string()
|
|
8223
|
-
}))
|
|
8321
|
+
})),
|
|
8322
|
+
findings: array(StorageMigrationFindingSchema)
|
|
8224
8323
|
});
|
|
8225
8324
|
/**
|
|
8226
8325
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
@@ -18786,7 +18885,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
18786
18885
|
}), method(RelocateMediaInputSchema, object({ jobId: string() }), {
|
|
18787
18886
|
kind: "mutation",
|
|
18788
18887
|
auth: "admin"
|
|
18789
|
-
}), method(object({}), array(RelocateJobSchema).readonly(), {
|
|
18888
|
+
}), method(object({}), UnstampedEventMediaCountSchema, { auth: "admin" }), method(object({}), array(RelocateJobSchema).readonly(), {
|
|
18790
18889
|
kind: "query",
|
|
18791
18890
|
auth: "admin"
|
|
18792
18891
|
}), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
@@ -20693,7 +20792,10 @@ method(object({
|
|
|
20693
20792
|
}), StorageLocationSchema, {
|
|
20694
20793
|
kind: "mutation",
|
|
20695
20794
|
auth: "admin"
|
|
20696
|
-
}), method(object({
|
|
20795
|
+
}), method(object({
|
|
20796
|
+
id: string(),
|
|
20797
|
+
force: boolean().optional()
|
|
20798
|
+
}), _void(), {
|
|
20697
20799
|
kind: "mutation",
|
|
20698
20800
|
auth: "admin"
|
|
20699
20801
|
}), method(object({ id: string() }), object({
|
|
@@ -23779,23 +23881,23 @@ DeviceType.Camera, method(object({ deviceId: number() }), object({
|
|
|
23779
23881
|
sdpOffer: string()
|
|
23780
23882
|
}), {
|
|
23781
23883
|
kind: "mutation",
|
|
23782
|
-
auth: "
|
|
23884
|
+
auth: "protected"
|
|
23783
23885
|
}), method(object({
|
|
23784
23886
|
deviceId: number(),
|
|
23785
23887
|
sessionId: string(),
|
|
23786
23888
|
sdpAnswer: string()
|
|
23787
23889
|
}), _void(), {
|
|
23788
23890
|
kind: "mutation",
|
|
23789
|
-
auth: "
|
|
23891
|
+
auth: "protected"
|
|
23790
23892
|
}), method(object({
|
|
23791
23893
|
deviceId: number(),
|
|
23792
23894
|
sessionId: string()
|
|
23793
23895
|
}), _void(), {
|
|
23794
23896
|
kind: "mutation",
|
|
23795
|
-
auth: "
|
|
23897
|
+
auth: "protected"
|
|
23796
23898
|
}), method(object({ deviceId: number() }), object({ sessionId: string() }), {
|
|
23797
23899
|
kind: "mutation",
|
|
23798
|
-
auth: "
|
|
23900
|
+
auth: "protected"
|
|
23799
23901
|
}), method(object({
|
|
23800
23902
|
deviceId: number(),
|
|
23801
23903
|
/** Audio bytes for ONE frame, base64-encoded so the payload
|
|
@@ -23814,10 +23916,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), object({
|
|
|
23814
23916
|
sequenceNumber: number().int()
|
|
23815
23917
|
}), object({ accepted: boolean() }), {
|
|
23816
23918
|
kind: "mutation",
|
|
23817
|
-
auth: "
|
|
23919
|
+
auth: "protected"
|
|
23818
23920
|
}), method(object({ deviceId: number() }), _void(), {
|
|
23819
23921
|
kind: "mutation",
|
|
23820
|
-
auth: "
|
|
23922
|
+
auth: "protected"
|
|
23821
23923
|
}), object({
|
|
23822
23924
|
deviceId: number(),
|
|
23823
23925
|
status: IntercomStatusSchema
|
|
@@ -31166,6 +31268,12 @@ Object.freeze({
|
|
|
31166
31268
|
addonId: null,
|
|
31167
31269
|
access: "create"
|
|
31168
31270
|
},
|
|
31271
|
+
"pipelineAnalytics.countUnstampedEventMedia": {
|
|
31272
|
+
capName: "pipeline-analytics",
|
|
31273
|
+
capScope: "device",
|
|
31274
|
+
addonId: null,
|
|
31275
|
+
access: "view"
|
|
31276
|
+
},
|
|
31169
31277
|
"pipelineAnalytics.deleteDeviceEvents": {
|
|
31170
31278
|
capName: "pipeline-analytics",
|
|
31171
31279
|
capScope: "device",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-notifiers",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.47",
|
|
4
4
|
"description": "System notifiers addon for CamStack — a `notification-output` collection provider hosting per-kind notifier adapters (ntfy, pushover, gotify, telegram, discord, webhook, zentik).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|