@camstack/addon-export-hap 1.2.52 → 1.2.54
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 +127 -19
- package/dist/hap-export.addon.mjs +127 -19
- package/package.json +1 -1
package/dist/hap-export.addon.js
CHANGED
|
@@ -8705,18 +8705,61 @@ var RelocateFootageInputSchema = object({
|
|
|
8705
8705
|
* `RecordingConfig.enabled` or camera wrapper bindings. */
|
|
8706
8706
|
var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
|
|
8707
8707
|
var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
|
|
8708
|
+
/**
|
|
8709
|
+
* What a `relocateMedia` pass DOES. One engine, three passes — never a second
|
|
8710
|
+
* mover (the engine already walks both collections with a timestamp cursor and
|
|
8711
|
+
* already has a stamp-without-copy path).
|
|
8712
|
+
*
|
|
8713
|
+
* - `move` — the default and the historical behaviour: event-media and
|
|
8714
|
+
* retrain blobs move to `toLocationId` and their rows are
|
|
8715
|
+
* stamped. The enrolled gallery is skipped (D197).
|
|
8716
|
+
* - `seal` — ROWS ONLY, no bytes. Every row whose `locationId` is NULL is
|
|
8717
|
+
* stamped with `toLocationId`. `toLocationId` here is the id the
|
|
8718
|
+
* bytes ALREADY sit on — today's `eventMedia` default — because
|
|
8719
|
+
* a NULL row means "wherever `eventMedia` points *now*", and the
|
|
8720
|
+
* instant a repoint moves that pointer the row reads from the
|
|
8721
|
+
* new disk while its bytes are on the old one.
|
|
8722
|
+
* - `gallery` — the inverse selection of `move`: ONLY the retention-exempt
|
|
8723
|
+
* (enrolled-gallery) rows, which `move` deliberately skips.
|
|
8724
|
+
* `galleryMedia` is `cardinality: 'single'`, so this pass can
|
|
8725
|
+
* never run beside a live second location: it is stop-the-world
|
|
8726
|
+
* by construction, which is acceptable only because the gallery
|
|
8727
|
+
* is a few KB per enrolled sample.
|
|
8728
|
+
*/
|
|
8729
|
+
var MediaRelocateModeSchema = _enum([
|
|
8730
|
+
"move",
|
|
8731
|
+
"seal",
|
|
8732
|
+
"gallery"
|
|
8733
|
+
]);
|
|
8708
8734
|
var RelocateMediaInputSchema = object({
|
|
8709
8735
|
toLocationId: string(),
|
|
8710
|
-
throttleMbps: number().min(1).max(1e3).optional()
|
|
8736
|
+
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8737
|
+
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8738
|
+
mode: MediaRelocateModeSchema.optional()
|
|
8739
|
+
});
|
|
8740
|
+
/** How many rows still carry NO `locationId` — the population a repoint would
|
|
8741
|
+
* silently re-aim at a disk that does not hold their bytes. Zero is the only
|
|
8742
|
+
* value that permits a non-blocking `eventMedia` cutover. */
|
|
8743
|
+
var UnstampedEventMediaCountSchema = object({
|
|
8744
|
+
media: number().int().nonnegative(),
|
|
8745
|
+
retrainFrames: number().int().nonnegative(),
|
|
8746
|
+
total: number().int().nonnegative()
|
|
8711
8747
|
});
|
|
8712
8748
|
var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
|
|
8713
|
-
/** The independently selectable logical storage classes
|
|
8714
|
-
*
|
|
8715
|
-
*
|
|
8749
|
+
/** The independently selectable logical storage classes — every class
|
|
8750
|
+
* `storage.listLocationDeclarations` reports, so an operator never meets a
|
|
8751
|
+
* Zod enum error where they should meet an explanation.
|
|
8752
|
+
*
|
|
8753
|
+
* `recordings` encompasses the high and mid segment profiles; `recordingsLow`
|
|
8754
|
+
* is low segments; `eventMedia` is post-analysis blobs; `galleryMedia` is the
|
|
8755
|
+
* enrolled gallery; `backups` is the system backup archive. The last two have
|
|
8756
|
+
* their own rules — see {@link StorageMigrationFindingCodeSchema}. */
|
|
8716
8757
|
var StorageMigrationClassSchema = _enum([
|
|
8717
8758
|
"recordings",
|
|
8718
8759
|
"recordingsLow",
|
|
8719
|
-
"eventMedia"
|
|
8760
|
+
"eventMedia",
|
|
8761
|
+
"backups",
|
|
8762
|
+
"galleryMedia"
|
|
8720
8763
|
]);
|
|
8721
8764
|
/** A destination is always an existing, fully-qualified location id. The
|
|
8722
8765
|
* migration API intentionally never changes a source location's `basePath`:
|
|
@@ -8724,20 +8767,56 @@ var StorageMigrationClassSchema = _enum([
|
|
|
8724
8767
|
var StorageMigrationDestinationsSchema = object({
|
|
8725
8768
|
recordings: string().min(1).optional(),
|
|
8726
8769
|
recordingsLow: string().min(1).optional(),
|
|
8727
|
-
eventMedia: string().min(1).optional()
|
|
8770
|
+
eventMedia: string().min(1).optional(),
|
|
8771
|
+
backups: string().min(1).optional(),
|
|
8772
|
+
galleryMedia: string().min(1).optional()
|
|
8728
8773
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8774
|
+
/**
|
|
8775
|
+
* How a migration sequences the cutover against the byte move.
|
|
8776
|
+
*
|
|
8777
|
+
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
8778
|
+
* resume. Recording is stopped for the whole move. Right
|
|
8779
|
+
* for a small or a cold class, and the only legal mode for
|
|
8780
|
+
* a `cardinality: 'single'` class.
|
|
8781
|
+
* - `nonBlocking` — repoint FIRST, drain behind: seal, pause, repoint,
|
|
8782
|
+
* refresh, resume, then move the past with everything
|
|
8783
|
+
* running. The pause is three bounded instants (a detach +
|
|
8784
|
+
* attach round, a write-gate drain, a lease) instead of one
|
|
8785
|
+
* bounded by bytes. 1.09 TB at 7–14 MB/s is thirty hours of
|
|
8786
|
+
* stopped recording under `blocking`; the same move is
|
|
8787
|
+
* seconds of stopped recording under `nonBlocking`.
|
|
8788
|
+
*
|
|
8789
|
+
* The mode is on the JOB, not only on the input, because `status` is where an
|
|
8790
|
+
* operator finds out which one is running.
|
|
8791
|
+
*/
|
|
8792
|
+
var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
8729
8793
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8730
8794
|
var StorageMigrationInputSchema = object({
|
|
8731
8795
|
destinations: StorageMigrationDestinationsSchema,
|
|
8732
|
-
throttleMbps: number().min(1).max(1e3).optional()
|
|
8796
|
+
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8797
|
+
/** Omitted = `blocking`, which stays the default. */
|
|
8798
|
+
mode: StorageMigrationModeSchema.optional()
|
|
8733
8799
|
});
|
|
8734
|
-
/**
|
|
8735
|
-
*
|
|
8736
|
-
*
|
|
8800
|
+
/**
|
|
8801
|
+
* The durable coordinator state machine.
|
|
8802
|
+
*
|
|
8803
|
+
* `blocking`:
|
|
8804
|
+
* planning → pausing → moving → verifying → repointing → refreshing → resuming → done
|
|
8805
|
+
*
|
|
8806
|
+
* `nonBlocking`:
|
|
8807
|
+
* planning → sealing → pausing → repointing → refreshing → resuming → draining → verifying → done
|
|
8808
|
+
*
|
|
8809
|
+
* Same phases, different order plus two new ones — not a second mover.
|
|
8810
|
+
* `sealing` closes the `eventMedia` NULL-row hole BEFORE anything is paused;
|
|
8811
|
+
* `draining` runs the same movers UNLEASED, after every writer is back up.
|
|
8812
|
+
* `repointing` is still the only phase that changes a default location.
|
|
8813
|
+
*/
|
|
8737
8814
|
var StorageMigrationPhaseSchema = _enum([
|
|
8738
8815
|
"planning",
|
|
8816
|
+
"sealing",
|
|
8739
8817
|
"pausing",
|
|
8740
8818
|
"moving",
|
|
8819
|
+
"draining",
|
|
8741
8820
|
"verifying",
|
|
8742
8821
|
"repointing",
|
|
8743
8822
|
"refreshing",
|
|
@@ -8762,6 +8841,9 @@ var StorageMigrationMoveSchema = object({
|
|
|
8762
8841
|
var StorageMigrationJobSchema = object({
|
|
8763
8842
|
jobId: string(),
|
|
8764
8843
|
phase: StorageMigrationPhaseSchema,
|
|
8844
|
+
/** Which order this job is running. `status` is the only place an operator
|
|
8845
|
+
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8846
|
+
mode: StorageMigrationModeSchema,
|
|
8765
8847
|
destinations: StorageMigrationDestinationsSchema,
|
|
8766
8848
|
throttleMbps: number(),
|
|
8767
8849
|
moves: array(StorageMigrationMoveSchema),
|
|
@@ -8774,13 +8856,30 @@ var StorageMigrationJobSchema = object({
|
|
|
8774
8856
|
finishedAt: number().nullable(),
|
|
8775
8857
|
error: string().nullable()
|
|
8776
8858
|
});
|
|
8859
|
+
var StorageMigrationFindingSchema = object({
|
|
8860
|
+
code: _enum([
|
|
8861
|
+
"sharesDeviceWithSource",
|
|
8862
|
+
"deviceIdentityUnknown",
|
|
8863
|
+
"unstampedEventMediaRows",
|
|
8864
|
+
"blockingOnly",
|
|
8865
|
+
"noMover"
|
|
8866
|
+
]),
|
|
8867
|
+
storageClass: StorageMigrationClassSchema,
|
|
8868
|
+
/** Human-readable, already carrying the ids and counts. */
|
|
8869
|
+
message: string()
|
|
8870
|
+
});
|
|
8777
8871
|
var StorageMigrationPlanSchema = object({
|
|
8778
8872
|
destinations: StorageMigrationDestinationsSchema,
|
|
8873
|
+
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8874
|
+
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8875
|
+
* it. */
|
|
8876
|
+
mode: StorageMigrationModeSchema,
|
|
8779
8877
|
moves: array(object({
|
|
8780
8878
|
storageClass: StorageMigrationClassSchema,
|
|
8781
8879
|
fromLocationId: string(),
|
|
8782
8880
|
toLocationId: string()
|
|
8783
|
-
}))
|
|
8881
|
+
})),
|
|
8882
|
+
findings: array(StorageMigrationFindingSchema)
|
|
8784
8883
|
});
|
|
8785
8884
|
/**
|
|
8786
8885
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
@@ -19426,7 +19525,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19426
19525
|
}), method(RelocateMediaInputSchema, object({ jobId: string() }), {
|
|
19427
19526
|
kind: "mutation",
|
|
19428
19527
|
auth: "admin"
|
|
19429
|
-
}), method(object({}), array(RelocateJobSchema).readonly(), {
|
|
19528
|
+
}), method(object({}), UnstampedEventMediaCountSchema, { auth: "admin" }), method(object({}), array(RelocateJobSchema).readonly(), {
|
|
19430
19529
|
kind: "query",
|
|
19431
19530
|
auth: "admin"
|
|
19432
19531
|
}), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
@@ -21333,7 +21432,10 @@ method(object({
|
|
|
21333
21432
|
}), StorageLocationSchema, {
|
|
21334
21433
|
kind: "mutation",
|
|
21335
21434
|
auth: "admin"
|
|
21336
|
-
}), method(object({
|
|
21435
|
+
}), method(object({
|
|
21436
|
+
id: string(),
|
|
21437
|
+
force: boolean().optional()
|
|
21438
|
+
}), _void(), {
|
|
21337
21439
|
kind: "mutation",
|
|
21338
21440
|
auth: "admin"
|
|
21339
21441
|
}), method(object({ id: string() }), object({
|
|
@@ -24455,23 +24557,23 @@ DeviceType.Camera, method(object({ deviceId: number() }), object({
|
|
|
24455
24557
|
sdpOffer: string()
|
|
24456
24558
|
}), {
|
|
24457
24559
|
kind: "mutation",
|
|
24458
|
-
auth: "
|
|
24560
|
+
auth: "protected"
|
|
24459
24561
|
}), method(object({
|
|
24460
24562
|
deviceId: number(),
|
|
24461
24563
|
sessionId: string(),
|
|
24462
24564
|
sdpAnswer: string()
|
|
24463
24565
|
}), _void(), {
|
|
24464
24566
|
kind: "mutation",
|
|
24465
|
-
auth: "
|
|
24567
|
+
auth: "protected"
|
|
24466
24568
|
}), method(object({
|
|
24467
24569
|
deviceId: number(),
|
|
24468
24570
|
sessionId: string()
|
|
24469
24571
|
}), _void(), {
|
|
24470
24572
|
kind: "mutation",
|
|
24471
|
-
auth: "
|
|
24573
|
+
auth: "protected"
|
|
24472
24574
|
}), method(object({ deviceId: number() }), object({ sessionId: string() }), {
|
|
24473
24575
|
kind: "mutation",
|
|
24474
|
-
auth: "
|
|
24576
|
+
auth: "protected"
|
|
24475
24577
|
}), method(object({
|
|
24476
24578
|
deviceId: number(),
|
|
24477
24579
|
/** Audio bytes for ONE frame, base64-encoded so the payload
|
|
@@ -24490,10 +24592,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), object({
|
|
|
24490
24592
|
sequenceNumber: number().int()
|
|
24491
24593
|
}), object({ accepted: boolean() }), {
|
|
24492
24594
|
kind: "mutation",
|
|
24493
|
-
auth: "
|
|
24595
|
+
auth: "protected"
|
|
24494
24596
|
}), method(object({ deviceId: number() }), _void(), {
|
|
24495
24597
|
kind: "mutation",
|
|
24496
|
-
auth: "
|
|
24598
|
+
auth: "protected"
|
|
24497
24599
|
}), object({
|
|
24498
24600
|
deviceId: number(),
|
|
24499
24601
|
status: IntercomStatusSchema
|
|
@@ -31879,6 +31981,12 @@ Object.freeze({
|
|
|
31879
31981
|
addonId: null,
|
|
31880
31982
|
access: "create"
|
|
31881
31983
|
},
|
|
31984
|
+
"pipelineAnalytics.countUnstampedEventMedia": {
|
|
31985
|
+
capName: "pipeline-analytics",
|
|
31986
|
+
capScope: "device",
|
|
31987
|
+
addonId: null,
|
|
31988
|
+
access: "view"
|
|
31989
|
+
},
|
|
31882
31990
|
"pipelineAnalytics.deleteDeviceEvents": {
|
|
31883
31991
|
capName: "pipeline-analytics",
|
|
31884
31992
|
capScope: "device",
|
|
@@ -8693,18 +8693,61 @@ var RelocateFootageInputSchema = object({
|
|
|
8693
8693
|
* `RecordingConfig.enabled` or camera wrapper bindings. */
|
|
8694
8694
|
var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
|
|
8695
8695
|
var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
|
|
8696
|
+
/**
|
|
8697
|
+
* What a `relocateMedia` pass DOES. One engine, three passes — never a second
|
|
8698
|
+
* mover (the engine already walks both collections with a timestamp cursor and
|
|
8699
|
+
* already has a stamp-without-copy path).
|
|
8700
|
+
*
|
|
8701
|
+
* - `move` — the default and the historical behaviour: event-media and
|
|
8702
|
+
* retrain blobs move to `toLocationId` and their rows are
|
|
8703
|
+
* stamped. The enrolled gallery is skipped (D197).
|
|
8704
|
+
* - `seal` — ROWS ONLY, no bytes. Every row whose `locationId` is NULL is
|
|
8705
|
+
* stamped with `toLocationId`. `toLocationId` here is the id the
|
|
8706
|
+
* bytes ALREADY sit on — today's `eventMedia` default — because
|
|
8707
|
+
* a NULL row means "wherever `eventMedia` points *now*", and the
|
|
8708
|
+
* instant a repoint moves that pointer the row reads from the
|
|
8709
|
+
* new disk while its bytes are on the old one.
|
|
8710
|
+
* - `gallery` — the inverse selection of `move`: ONLY the retention-exempt
|
|
8711
|
+
* (enrolled-gallery) rows, which `move` deliberately skips.
|
|
8712
|
+
* `galleryMedia` is `cardinality: 'single'`, so this pass can
|
|
8713
|
+
* never run beside a live second location: it is stop-the-world
|
|
8714
|
+
* by construction, which is acceptable only because the gallery
|
|
8715
|
+
* is a few KB per enrolled sample.
|
|
8716
|
+
*/
|
|
8717
|
+
var MediaRelocateModeSchema = _enum([
|
|
8718
|
+
"move",
|
|
8719
|
+
"seal",
|
|
8720
|
+
"gallery"
|
|
8721
|
+
]);
|
|
8696
8722
|
var RelocateMediaInputSchema = object({
|
|
8697
8723
|
toLocationId: string(),
|
|
8698
|
-
throttleMbps: number().min(1).max(1e3).optional()
|
|
8724
|
+
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8725
|
+
/** Omitted = `move`, the pre-existing behaviour. */
|
|
8726
|
+
mode: MediaRelocateModeSchema.optional()
|
|
8727
|
+
});
|
|
8728
|
+
/** How many rows still carry NO `locationId` — the population a repoint would
|
|
8729
|
+
* silently re-aim at a disk that does not hold their bytes. Zero is the only
|
|
8730
|
+
* value that permits a non-blocking `eventMedia` cutover. */
|
|
8731
|
+
var UnstampedEventMediaCountSchema = object({
|
|
8732
|
+
media: number().int().nonnegative(),
|
|
8733
|
+
retrainFrames: number().int().nonnegative(),
|
|
8734
|
+
total: number().int().nonnegative()
|
|
8699
8735
|
});
|
|
8700
8736
|
var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
|
|
8701
|
-
/** The independently selectable logical storage classes
|
|
8702
|
-
*
|
|
8703
|
-
*
|
|
8737
|
+
/** The independently selectable logical storage classes — every class
|
|
8738
|
+
* `storage.listLocationDeclarations` reports, so an operator never meets a
|
|
8739
|
+
* Zod enum error where they should meet an explanation.
|
|
8740
|
+
*
|
|
8741
|
+
* `recordings` encompasses the high and mid segment profiles; `recordingsLow`
|
|
8742
|
+
* is low segments; `eventMedia` is post-analysis blobs; `galleryMedia` is the
|
|
8743
|
+
* enrolled gallery; `backups` is the system backup archive. The last two have
|
|
8744
|
+
* their own rules — see {@link StorageMigrationFindingCodeSchema}. */
|
|
8704
8745
|
var StorageMigrationClassSchema = _enum([
|
|
8705
8746
|
"recordings",
|
|
8706
8747
|
"recordingsLow",
|
|
8707
|
-
"eventMedia"
|
|
8748
|
+
"eventMedia",
|
|
8749
|
+
"backups",
|
|
8750
|
+
"galleryMedia"
|
|
8708
8751
|
]);
|
|
8709
8752
|
/** A destination is always an existing, fully-qualified location id. The
|
|
8710
8753
|
* migration API intentionally never changes a source location's `basePath`:
|
|
@@ -8712,20 +8755,56 @@ var StorageMigrationClassSchema = _enum([
|
|
|
8712
8755
|
var StorageMigrationDestinationsSchema = object({
|
|
8713
8756
|
recordings: string().min(1).optional(),
|
|
8714
8757
|
recordingsLow: string().min(1).optional(),
|
|
8715
|
-
eventMedia: string().min(1).optional()
|
|
8758
|
+
eventMedia: string().min(1).optional(),
|
|
8759
|
+
backups: string().min(1).optional(),
|
|
8760
|
+
galleryMedia: string().min(1).optional()
|
|
8716
8761
|
}).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
|
|
8762
|
+
/**
|
|
8763
|
+
* How a migration sequences the cutover against the byte move.
|
|
8764
|
+
*
|
|
8765
|
+
* - `blocking` — the historical order: pause, move every byte, repoint,
|
|
8766
|
+
* resume. Recording is stopped for the whole move. Right
|
|
8767
|
+
* for a small or a cold class, and the only legal mode for
|
|
8768
|
+
* a `cardinality: 'single'` class.
|
|
8769
|
+
* - `nonBlocking` — repoint FIRST, drain behind: seal, pause, repoint,
|
|
8770
|
+
* refresh, resume, then move the past with everything
|
|
8771
|
+
* running. The pause is three bounded instants (a detach +
|
|
8772
|
+
* attach round, a write-gate drain, a lease) instead of one
|
|
8773
|
+
* bounded by bytes. 1.09 TB at 7–14 MB/s is thirty hours of
|
|
8774
|
+
* stopped recording under `blocking`; the same move is
|
|
8775
|
+
* seconds of stopped recording under `nonBlocking`.
|
|
8776
|
+
*
|
|
8777
|
+
* The mode is on the JOB, not only on the input, because `status` is where an
|
|
8778
|
+
* operator finds out which one is running.
|
|
8779
|
+
*/
|
|
8780
|
+
var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
|
|
8717
8781
|
/** Shared input for planning and starting an orchestrated storage migration. */
|
|
8718
8782
|
var StorageMigrationInputSchema = object({
|
|
8719
8783
|
destinations: StorageMigrationDestinationsSchema,
|
|
8720
|
-
throttleMbps: number().min(1).max(1e3).optional()
|
|
8784
|
+
throttleMbps: number().min(1).max(1e3).optional(),
|
|
8785
|
+
/** Omitted = `blocking`, which stays the default. */
|
|
8786
|
+
mode: StorageMigrationModeSchema.optional()
|
|
8721
8787
|
});
|
|
8722
|
-
/**
|
|
8723
|
-
*
|
|
8724
|
-
*
|
|
8788
|
+
/**
|
|
8789
|
+
* The durable coordinator state machine.
|
|
8790
|
+
*
|
|
8791
|
+
* `blocking`:
|
|
8792
|
+
* planning → pausing → moving → verifying → repointing → refreshing → resuming → done
|
|
8793
|
+
*
|
|
8794
|
+
* `nonBlocking`:
|
|
8795
|
+
* planning → sealing → pausing → repointing → refreshing → resuming → draining → verifying → done
|
|
8796
|
+
*
|
|
8797
|
+
* Same phases, different order plus two new ones — not a second mover.
|
|
8798
|
+
* `sealing` closes the `eventMedia` NULL-row hole BEFORE anything is paused;
|
|
8799
|
+
* `draining` runs the same movers UNLEASED, after every writer is back up.
|
|
8800
|
+
* `repointing` is still the only phase that changes a default location.
|
|
8801
|
+
*/
|
|
8725
8802
|
var StorageMigrationPhaseSchema = _enum([
|
|
8726
8803
|
"planning",
|
|
8804
|
+
"sealing",
|
|
8727
8805
|
"pausing",
|
|
8728
8806
|
"moving",
|
|
8807
|
+
"draining",
|
|
8729
8808
|
"verifying",
|
|
8730
8809
|
"repointing",
|
|
8731
8810
|
"refreshing",
|
|
@@ -8750,6 +8829,9 @@ var StorageMigrationMoveSchema = object({
|
|
|
8750
8829
|
var StorageMigrationJobSchema = object({
|
|
8751
8830
|
jobId: string(),
|
|
8752
8831
|
phase: StorageMigrationPhaseSchema,
|
|
8832
|
+
/** Which order this job is running. `status` is the only place an operator
|
|
8833
|
+
* can tell a seconds-long cutover from a thirty-hour one. */
|
|
8834
|
+
mode: StorageMigrationModeSchema,
|
|
8753
8835
|
destinations: StorageMigrationDestinationsSchema,
|
|
8754
8836
|
throttleMbps: number(),
|
|
8755
8837
|
moves: array(StorageMigrationMoveSchema),
|
|
@@ -8762,13 +8844,30 @@ var StorageMigrationJobSchema = object({
|
|
|
8762
8844
|
finishedAt: number().nullable(),
|
|
8763
8845
|
error: string().nullable()
|
|
8764
8846
|
});
|
|
8847
|
+
var StorageMigrationFindingSchema = object({
|
|
8848
|
+
code: _enum([
|
|
8849
|
+
"sharesDeviceWithSource",
|
|
8850
|
+
"deviceIdentityUnknown",
|
|
8851
|
+
"unstampedEventMediaRows",
|
|
8852
|
+
"blockingOnly",
|
|
8853
|
+
"noMover"
|
|
8854
|
+
]),
|
|
8855
|
+
storageClass: StorageMigrationClassSchema,
|
|
8856
|
+
/** Human-readable, already carrying the ids and counts. */
|
|
8857
|
+
message: string()
|
|
8858
|
+
});
|
|
8765
8859
|
var StorageMigrationPlanSchema = object({
|
|
8766
8860
|
destinations: StorageMigrationDestinationsSchema,
|
|
8861
|
+
/** The mode this plan was built for. A plan is only valid for its mode: the
|
|
8862
|
+
* `eventMedia` seal gate and the single-cardinality refusal both depend on
|
|
8863
|
+
* it. */
|
|
8864
|
+
mode: StorageMigrationModeSchema,
|
|
8767
8865
|
moves: array(object({
|
|
8768
8866
|
storageClass: StorageMigrationClassSchema,
|
|
8769
8867
|
fromLocationId: string(),
|
|
8770
8868
|
toLocationId: string()
|
|
8771
|
-
}))
|
|
8869
|
+
})),
|
|
8870
|
+
findings: array(StorageMigrationFindingSchema)
|
|
8772
8871
|
});
|
|
8773
8872
|
/**
|
|
8774
8873
|
* `StorageLocationType` — an addon-declared id that identifies the *kind* of
|
|
@@ -19414,7 +19513,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19414
19513
|
}), method(RelocateMediaInputSchema, object({ jobId: string() }), {
|
|
19415
19514
|
kind: "mutation",
|
|
19416
19515
|
auth: "admin"
|
|
19417
|
-
}), method(object({}), array(RelocateJobSchema).readonly(), {
|
|
19516
|
+
}), method(object({}), UnstampedEventMediaCountSchema, { auth: "admin" }), method(object({}), array(RelocateJobSchema).readonly(), {
|
|
19418
19517
|
kind: "query",
|
|
19419
19518
|
auth: "admin"
|
|
19420
19519
|
}), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
@@ -21321,7 +21420,10 @@ method(object({
|
|
|
21321
21420
|
}), StorageLocationSchema, {
|
|
21322
21421
|
kind: "mutation",
|
|
21323
21422
|
auth: "admin"
|
|
21324
|
-
}), method(object({
|
|
21423
|
+
}), method(object({
|
|
21424
|
+
id: string(),
|
|
21425
|
+
force: boolean().optional()
|
|
21426
|
+
}), _void(), {
|
|
21325
21427
|
kind: "mutation",
|
|
21326
21428
|
auth: "admin"
|
|
21327
21429
|
}), method(object({ id: string() }), object({
|
|
@@ -24443,23 +24545,23 @@ DeviceType.Camera, method(object({ deviceId: number() }), object({
|
|
|
24443
24545
|
sdpOffer: string()
|
|
24444
24546
|
}), {
|
|
24445
24547
|
kind: "mutation",
|
|
24446
|
-
auth: "
|
|
24548
|
+
auth: "protected"
|
|
24447
24549
|
}), method(object({
|
|
24448
24550
|
deviceId: number(),
|
|
24449
24551
|
sessionId: string(),
|
|
24450
24552
|
sdpAnswer: string()
|
|
24451
24553
|
}), _void(), {
|
|
24452
24554
|
kind: "mutation",
|
|
24453
|
-
auth: "
|
|
24555
|
+
auth: "protected"
|
|
24454
24556
|
}), method(object({
|
|
24455
24557
|
deviceId: number(),
|
|
24456
24558
|
sessionId: string()
|
|
24457
24559
|
}), _void(), {
|
|
24458
24560
|
kind: "mutation",
|
|
24459
|
-
auth: "
|
|
24561
|
+
auth: "protected"
|
|
24460
24562
|
}), method(object({ deviceId: number() }), object({ sessionId: string() }), {
|
|
24461
24563
|
kind: "mutation",
|
|
24462
|
-
auth: "
|
|
24564
|
+
auth: "protected"
|
|
24463
24565
|
}), method(object({
|
|
24464
24566
|
deviceId: number(),
|
|
24465
24567
|
/** Audio bytes for ONE frame, base64-encoded so the payload
|
|
@@ -24478,10 +24580,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), object({
|
|
|
24478
24580
|
sequenceNumber: number().int()
|
|
24479
24581
|
}), object({ accepted: boolean() }), {
|
|
24480
24582
|
kind: "mutation",
|
|
24481
|
-
auth: "
|
|
24583
|
+
auth: "protected"
|
|
24482
24584
|
}), method(object({ deviceId: number() }), _void(), {
|
|
24483
24585
|
kind: "mutation",
|
|
24484
|
-
auth: "
|
|
24586
|
+
auth: "protected"
|
|
24485
24587
|
}), object({
|
|
24486
24588
|
deviceId: number(),
|
|
24487
24589
|
status: IntercomStatusSchema
|
|
@@ -31867,6 +31969,12 @@ Object.freeze({
|
|
|
31867
31969
|
addonId: null,
|
|
31868
31970
|
access: "create"
|
|
31869
31971
|
},
|
|
31972
|
+
"pipelineAnalytics.countUnstampedEventMedia": {
|
|
31973
|
+
capName: "pipeline-analytics",
|
|
31974
|
+
capScope: "device",
|
|
31975
|
+
addonId: null,
|
|
31976
|
+
access: "view"
|
|
31977
|
+
},
|
|
31870
31978
|
"pipelineAnalytics.deleteDeviceEvents": {
|
|
31871
31979
|
capName: "pipeline-analytics",
|
|
31872
31980
|
capScope: "device",
|
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.54",
|
|
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",
|