@camstack/addon-provider-tuya 0.2.27 → 0.2.29
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 +431 -111
- package/dist/addon.mjs +431 -111
- package/package.json +1 -1
package/dist/addon.mjs
CHANGED
|
@@ -6620,6 +6620,13 @@ var BaseAddon = class {
|
|
|
6620
6620
|
_readinessGeneration = typeof crypto !== "undefined" && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).slice(2, 14);
|
|
6621
6621
|
/** Capability names this addon registered at init — used to emit matching `down` events on shutdown. */
|
|
6622
6622
|
_registeredCapNames = [];
|
|
6623
|
+
/**
|
|
6624
|
+
* True only after `readAddonStore` actually answered. Constructor
|
|
6625
|
+
* defaults look like stored config when the store is down — a forked
|
|
6626
|
+
* addon that auto-starts from those defaults (cloudflare-tunnel quick
|
|
6627
|
+
* mode, 2026-08-25) is not "the operator chose this".
|
|
6628
|
+
*/
|
|
6629
|
+
settingsStoreReady = false;
|
|
6623
6630
|
/** Default config values. Provided via constructor. */
|
|
6624
6631
|
defaults;
|
|
6625
6632
|
constructor(defaults) {
|
|
@@ -7020,7 +7027,9 @@ var BaseAddon = class {
|
|
|
7020
7027
|
];
|
|
7021
7028
|
let lastErr;
|
|
7022
7029
|
for (let attempt = 0; attempt <= delaysMs.length; attempt++) try {
|
|
7023
|
-
|
|
7030
|
+
const stored = await settings.readAddonStore() ?? {};
|
|
7031
|
+
this.settingsStoreReady = true;
|
|
7032
|
+
return stored;
|
|
7024
7033
|
} catch (err) {
|
|
7025
7034
|
lastErr = err;
|
|
7026
7035
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -7028,6 +7037,7 @@ var BaseAddon = class {
|
|
|
7028
7037
|
if (attempt === delaysMs.length) break;
|
|
7029
7038
|
await new Promise((r) => setTimeout(r, delaysMs[attempt]));
|
|
7030
7039
|
}
|
|
7040
|
+
this.settingsStoreReady = false;
|
|
7031
7041
|
this._ctx?.logger?.warn?.("readAddonStore: settings-store unavailable after retries — using defaults", { meta: { error: lastErr instanceof Error ? lastErr.message : String(lastErr) } });
|
|
7032
7042
|
return {};
|
|
7033
7043
|
}
|
|
@@ -7439,7 +7449,7 @@ function method(input, output, options) {
|
|
|
7439
7449
|
input,
|
|
7440
7450
|
output,
|
|
7441
7451
|
kind: options?.kind ?? "query",
|
|
7442
|
-
auth: options
|
|
7452
|
+
...options?.auth !== void 0 ? { auth: options.auth } : {},
|
|
7443
7453
|
...options?.access !== void 0 ? { access: options.access } : {},
|
|
7444
7454
|
...options?.caller !== void 0 ? { caller: options.caller } : {},
|
|
7445
7455
|
timeoutMs: options?.timeoutMs
|
|
@@ -7463,7 +7473,7 @@ function event(data) {
|
|
|
7463
7473
|
}
|
|
7464
7474
|
var StaticDirOutputSchema$1 = object({ staticDir: string() });
|
|
7465
7475
|
var VersionOutputSchema$1 = object({ version: string() });
|
|
7466
|
-
method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
|
|
7476
|
+
method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
|
|
7467
7477
|
var DeviceType = /* @__PURE__ */ function(DeviceType) {
|
|
7468
7478
|
DeviceType["Camera"] = "camera";
|
|
7469
7479
|
DeviceType["Hub"] = "hub";
|
|
@@ -7784,7 +7794,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
|
|
|
7784
7794
|
}({});
|
|
7785
7795
|
var StaticDirOutputSchema = object({ staticDir: string() });
|
|
7786
7796
|
var VersionOutputSchema = object({ version: string() });
|
|
7787
|
-
method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
|
|
7797
|
+
method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
|
|
7788
7798
|
/**
|
|
7789
7799
|
* device-ops — device-scoped cap that unifies the per-IDevice operations
|
|
7790
7800
|
* previously routed through the `.device-ops` Moleculer bridge service.
|
|
@@ -8410,24 +8420,6 @@ var RecordingRetentionSchema = object({
|
|
|
8410
8420
|
maxSizeGb: number().min(0).optional()
|
|
8411
8421
|
});
|
|
8412
8422
|
/**
|
|
8413
|
-
* Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
|
|
8414
|
-
* sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
|
|
8415
|
-
* previews at. Five graduated steps; absent on a config = `standard` (the
|
|
8416
|
-
* shipped default, matching `sheet-geometry`/`sheet-composer`).
|
|
8417
|
-
*
|
|
8418
|
-
* Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
|
|
8419
|
-
* Each window's index sidecar carries its own tile dims, so a camera whose
|
|
8420
|
-
* preset changed over time renders every historical window at the dims it was
|
|
8421
|
-
* written with.
|
|
8422
|
-
*/
|
|
8423
|
-
var ScrubThumbnailPresetSchema = _enum([
|
|
8424
|
-
"minimal",
|
|
8425
|
-
"low",
|
|
8426
|
-
"standard",
|
|
8427
|
-
"high",
|
|
8428
|
-
"max"
|
|
8429
|
-
]);
|
|
8430
|
-
/**
|
|
8431
8423
|
* The full per-camera recording intent — the wire shape of a RecordingTarget.
|
|
8432
8424
|
*
|
|
8433
8425
|
* `bands` is the ONLY authored recording intent: what to record, when, and on
|
|
@@ -8435,7 +8427,11 @@ var ScrubThumbnailPresetSchema = _enum([
|
|
|
8435
8427
|
* other field is a storage knob (profiles, segment length, retention, scrub).
|
|
8436
8428
|
*
|
|
8437
8429
|
* STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
|
|
8438
|
-
* `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30
|
|
8430
|
+
* `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
|
|
8431
|
+
* and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
|
|
8432
|
+
* deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
|
|
8433
|
+
* (D62: a switch that writes a store nobody reads is worse than no switch).
|
|
8434
|
+
* Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
|
|
8439
8435
|
* A stale caller must fail loudly — silently stripping its legacy intent would
|
|
8440
8436
|
* persist a band-less config, i.e. silently stop recording the camera.
|
|
8441
8437
|
*/
|
|
@@ -8458,14 +8454,7 @@ var RecordingConfigSchema = object({
|
|
|
8458
8454
|
* "off" is the absence of a covering band, never a band value.
|
|
8459
8455
|
*/
|
|
8460
8456
|
bands: array(RecordingBandSchema).default([]),
|
|
8461
|
-
retention: RecordingRetentionSchema.optional()
|
|
8462
|
-
/**
|
|
8463
|
-
* Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
|
|
8464
|
-
* timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
|
|
8465
|
-
* windows only — existing sheets are immutable, and each window's index
|
|
8466
|
-
* carries its own tile dims so mixed-preset history renders correctly.
|
|
8467
|
-
*/
|
|
8468
|
-
scrubThumbnails: ScrubThumbnailPresetSchema.optional()
|
|
8457
|
+
retention: RecordingRetentionSchema.optional()
|
|
8469
8458
|
}).strict();
|
|
8470
8459
|
/**
|
|
8471
8460
|
* Entity-relocation job state (storage entity-routing spec, Phase 4).
|
|
@@ -8541,10 +8530,11 @@ var RelocateFootageInputSchema = object({
|
|
|
8541
8530
|
* `RecordingConfig.enabled` or camera wrapper bindings. */
|
|
8542
8531
|
var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
|
|
8543
8532
|
var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
|
|
8544
|
-
var
|
|
8533
|
+
var RelocateMediaInputSchema = object({
|
|
8545
8534
|
toLocationId: string(),
|
|
8546
8535
|
throttleMbps: number().min(1).max(1e3).optional()
|
|
8547
|
-
})
|
|
8536
|
+
});
|
|
8537
|
+
var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
|
|
8548
8538
|
/** The independently selectable logical storage classes. `recordings`
|
|
8549
8539
|
* encompasses the high and mid segment profiles; `recordingsLow` is low
|
|
8550
8540
|
* segments; `eventMedia` is post-analysis blobs. */
|
|
@@ -8839,7 +8829,26 @@ var LabelDefinitionSchema = object({
|
|
|
8839
8829
|
description: string().optional(),
|
|
8840
8830
|
icon: string().optional()
|
|
8841
8831
|
});
|
|
8842
|
-
|
|
8832
|
+
/**
|
|
8833
|
+
* Wire schema for a per-model CATALOG classMap override
|
|
8834
|
+
* (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
|
|
8835
|
+
* restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
|
|
8836
|
+
* detection pipeline executor actually routes.
|
|
8837
|
+
*
|
|
8838
|
+
* This is deliberately a DIFFERENT, narrower shape than the general-purpose
|
|
8839
|
+
* `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
|
|
8840
|
+
* and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
|
|
8841
|
+
* enum) — the two used to share the name `ClassMapDefinition`/
|
|
8842
|
+
* `ClassMapDefinitionSchema`, which made the schema-type-twin guard
|
|
8843
|
+
* (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
|
|
8844
|
+
* are not: it is two different concepts colliding on a name. Keep this type
|
|
8845
|
+
* under its own name rather than reusing `ClassMapDefinition` — reusing it
|
|
8846
|
+
* would either narrow every `ClassMapDefinition` consumer to the four
|
|
8847
|
+
* detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
|
|
8848
|
+
* schema exists for (see the "rejects a classMap whose target is not a
|
|
8849
|
+
* detection macro" test in `model-catalog-schema.test.ts`).
|
|
8850
|
+
*/
|
|
8851
|
+
var DetectionCatalogClassMapSchema = object({
|
|
8843
8852
|
mapping: record(string(), _enum([
|
|
8844
8853
|
"person",
|
|
8845
8854
|
"vehicle",
|
|
@@ -8931,6 +8940,12 @@ var ModelVariantGroupSchema = object({
|
|
|
8931
8940
|
*/
|
|
8932
8941
|
resolution: number().int().positive().optional()
|
|
8933
8942
|
});
|
|
8943
|
+
var ModelProviderIdSchema = _enum([
|
|
8944
|
+
"camstack",
|
|
8945
|
+
"frigate",
|
|
8946
|
+
"scrypted",
|
|
8947
|
+
"custom"
|
|
8948
|
+
]);
|
|
8934
8949
|
var ModelCatalogEntrySchema = object({
|
|
8935
8950
|
id: string(),
|
|
8936
8951
|
name: string(),
|
|
@@ -9028,11 +9043,17 @@ var ModelCatalogEntrySchema = object({
|
|
|
9028
9043
|
*/
|
|
9029
9044
|
group: ModelVariantGroupSchema.optional(),
|
|
9030
9045
|
/**
|
|
9046
|
+
* Catalog source for the pipeline stepper's provider-first picker. Absent on
|
|
9047
|
+
* built-in CamStack entries (treated as `camstack`) and on registry rows
|
|
9048
|
+
* persisted before this field existed (`inferModelProvider` fills those).
|
|
9049
|
+
*/
|
|
9050
|
+
provider: ModelProviderIdSchema.optional(),
|
|
9051
|
+
/**
|
|
9031
9052
|
* Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
|
|
9032
9053
|
* applies (Frigate / COCO public catalog). Set on a custom model whose raw
|
|
9033
9054
|
* labels already ARE the CamStack macros (Scrypted identity map).
|
|
9034
9055
|
*/
|
|
9035
|
-
classMap:
|
|
9056
|
+
classMap: DetectionCatalogClassMapSchema.optional()
|
|
9036
9057
|
});
|
|
9037
9058
|
var ConvertTargetSchema = discriminatedUnion("format", [object({
|
|
9038
9059
|
format: literal("openvino"),
|
|
@@ -9062,7 +9083,7 @@ var ModelConvertMetadataSchema = object({
|
|
|
9062
9083
|
"segmentation"
|
|
9063
9084
|
]),
|
|
9064
9085
|
faceAlignment: boolean().optional(),
|
|
9065
|
-
classMap:
|
|
9086
|
+
classMap: DetectionCatalogClassMapSchema.optional()
|
|
9066
9087
|
});
|
|
9067
9088
|
var ConvertResultSchema = object({
|
|
9068
9089
|
entry: ModelCatalogEntrySchema,
|
|
@@ -9925,7 +9946,7 @@ var AddonPageDeclarationSchema = object({
|
|
|
9925
9946
|
/** Display label for a CUSTOM `section` id (ignored for well-known ids). */
|
|
9926
9947
|
sectionLabel: string().optional()
|
|
9927
9948
|
});
|
|
9928
|
-
method(_void(), array(AddonPageDeclarationSchema).readonly());
|
|
9949
|
+
method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
|
|
9929
9950
|
var AddonHttpRouteSchema = object({
|
|
9930
9951
|
method: _enum([
|
|
9931
9952
|
"GET",
|
|
@@ -10160,7 +10181,7 @@ var WidgetMetadataSchema = object({
|
|
|
10160
10181
|
defaultColumns: number().int().min(1).max(12).default(6),
|
|
10161
10182
|
defaultRows: number().int().min(1).max(12).default(1)
|
|
10162
10183
|
});
|
|
10163
|
-
method(_void(), array(WidgetMetadataSchema).readonly());
|
|
10184
|
+
method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
|
|
10164
10185
|
/**
|
|
10165
10186
|
* `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
|
|
10166
10187
|
* surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
|
|
@@ -11784,7 +11805,7 @@ var CustomModelDescriptorSchema = object({
|
|
|
11784
11805
|
stepId: string(),
|
|
11785
11806
|
entry: ModelCatalogEntrySchema
|
|
11786
11807
|
});
|
|
11787
|
-
method(_void(), array(CustomModelDescriptorSchema).readonly());
|
|
11808
|
+
method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
|
|
11788
11809
|
/**
|
|
11789
11810
|
* Query filter for settings-store collections.
|
|
11790
11811
|
*/
|
|
@@ -11871,7 +11892,8 @@ method(object({
|
|
|
11871
11892
|
}), _void(), { kind: "mutation" }), method(object({
|
|
11872
11893
|
namespace: string().optional(),
|
|
11873
11894
|
collection: string(),
|
|
11874
|
-
filter: QueryFilterSchema.optional()
|
|
11895
|
+
filter: QueryFilterSchema.optional(),
|
|
11896
|
+
columns: array(string()).readonly().optional()
|
|
11875
11897
|
}), array(SettingsRecordSchema).readonly()), method(object({
|
|
11876
11898
|
namespace: string().optional(),
|
|
11877
11899
|
collection: string(),
|
|
@@ -11934,46 +11956,87 @@ var EngineInfoSchema = object({
|
|
|
11934
11956
|
kind: _enum(["relational", "vector"]),
|
|
11935
11957
|
displayName: string()
|
|
11936
11958
|
});
|
|
11937
|
-
method(_void(), EngineInfoSchema), method(object({
|
|
11959
|
+
method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
|
|
11938
11960
|
namespace: string().optional(),
|
|
11939
11961
|
collection: string(),
|
|
11940
11962
|
key: string()
|
|
11941
|
-
}), unknown()), method(object({
|
|
11963
|
+
}), unknown(), { auth: "admin" }), method(object({
|
|
11942
11964
|
namespace: string().optional(),
|
|
11943
11965
|
collection: string(),
|
|
11944
11966
|
key: string(),
|
|
11945
11967
|
value: unknown()
|
|
11946
|
-
}), _void(), {
|
|
11968
|
+
}), _void(), {
|
|
11969
|
+
kind: "mutation",
|
|
11970
|
+
auth: "admin"
|
|
11971
|
+
}), method(object({
|
|
11947
11972
|
namespace: string().optional(),
|
|
11948
11973
|
collection: string(),
|
|
11949
|
-
filter: QueryFilterSchema.optional()
|
|
11950
|
-
|
|
11974
|
+
filter: QueryFilterSchema.optional(),
|
|
11975
|
+
/**
|
|
11976
|
+
* SQL-level column projection — MUST mirror `settings-store.query`.
|
|
11977
|
+
*
|
|
11978
|
+
* ⚠ An earlier version of this comment blamed Zod stripping, and that
|
|
11979
|
+
* was wrong — corrected 2026-08-26 after the hop map
|
|
11980
|
+
* (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
|
|
11981
|
+
* There is **no Zod parse at all** between the door and the engine: the
|
|
11982
|
+
* dispatcher forwards the payload verbatim and UDS carries it whole. A
|
|
11983
|
+
* field declared here reaches `SqliteSettingsBackend` either way.
|
|
11984
|
+
*
|
|
11985
|
+
* What actually lost `columns` was the THIRD declaration of this shape:
|
|
11986
|
+
* `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
|
|
11987
|
+
* interface the engine destructures from. The field existed on both
|
|
11988
|
+
* schemas and the engine still never read it, because nothing checks a
|
|
11989
|
+
* registered provider against `InferProvider<cap>` —
|
|
11990
|
+
* `ProviderRegistration.provider` is typed `object`.
|
|
11991
|
+
*
|
|
11992
|
+
* It is declared here anyway, and must stay in step with
|
|
11993
|
+
* `settings-store.query`: a caller reading only the cap definitions has
|
|
11994
|
+
* to be able to see that this call carries a projection.
|
|
11995
|
+
* `data-door-schema-parity.spec.ts` keeps the two aligned.
|
|
11996
|
+
*/
|
|
11997
|
+
columns: array(string()).readonly().optional()
|
|
11998
|
+
}), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
|
|
11951
11999
|
namespace: string().optional(),
|
|
11952
12000
|
collection: string(),
|
|
11953
12001
|
record: SettingsRecordSchema
|
|
11954
|
-
}), _void(), {
|
|
12002
|
+
}), _void(), {
|
|
12003
|
+
kind: "mutation",
|
|
12004
|
+
auth: "admin"
|
|
12005
|
+
}), method(object({
|
|
11955
12006
|
namespace: string().optional(),
|
|
11956
12007
|
collection: string(),
|
|
11957
12008
|
id: string(),
|
|
11958
12009
|
data: record(string(), unknown())
|
|
11959
|
-
}), _void(), {
|
|
12010
|
+
}), _void(), {
|
|
12011
|
+
kind: "mutation",
|
|
12012
|
+
auth: "admin"
|
|
12013
|
+
}), method(object({
|
|
11960
12014
|
namespace: string().optional(),
|
|
11961
12015
|
collection: string(),
|
|
11962
12016
|
key: string()
|
|
11963
|
-
}), _void(), {
|
|
12017
|
+
}), _void(), {
|
|
12018
|
+
kind: "mutation",
|
|
12019
|
+
auth: "admin"
|
|
12020
|
+
}), method(object({
|
|
11964
12021
|
namespace: string().optional(),
|
|
11965
12022
|
collection: string(),
|
|
11966
12023
|
filter: MutationFilterSchema
|
|
11967
|
-
}), object({ deleted: number().int() }), {
|
|
12024
|
+
}), object({ deleted: number().int() }), {
|
|
12025
|
+
kind: "mutation",
|
|
12026
|
+
auth: "admin"
|
|
12027
|
+
}), method(object({
|
|
11968
12028
|
namespace: string().optional(),
|
|
11969
12029
|
collection: string(),
|
|
11970
12030
|
filter: MutationFilterSchema,
|
|
11971
12031
|
data: record(string(), unknown())
|
|
11972
|
-
}), object({ updated: number().int() }), {
|
|
12032
|
+
}), object({ updated: number().int() }), {
|
|
12033
|
+
kind: "mutation",
|
|
12034
|
+
auth: "admin"
|
|
12035
|
+
}), method(object({
|
|
11973
12036
|
namespace: string().optional(),
|
|
11974
12037
|
collection: string(),
|
|
11975
12038
|
filter: QueryFilterSchema.optional()
|
|
11976
|
-
}), number()), method(object({
|
|
12039
|
+
}), number(), { auth: "admin" }), method(object({
|
|
11977
12040
|
namespace: string().optional(),
|
|
11978
12041
|
collection: string(),
|
|
11979
12042
|
field: string(),
|
|
@@ -11983,15 +12046,18 @@ method(_void(), EngineInfoSchema), method(object({
|
|
|
11983
12046
|
}), array(object({
|
|
11984
12047
|
bucket: number().int(),
|
|
11985
12048
|
count: number().int()
|
|
11986
|
-
})).readonly()), method(object({
|
|
12049
|
+
})).readonly(), { auth: "admin" }), method(object({
|
|
11987
12050
|
namespace: string().optional(),
|
|
11988
12051
|
collection: string()
|
|
11989
|
-
}), boolean()), method(object({
|
|
12052
|
+
}), boolean(), { auth: "admin" }), method(object({
|
|
11990
12053
|
namespace: string().optional(),
|
|
11991
12054
|
collection: string(),
|
|
11992
12055
|
columns: array(CollectionColumnSchema).readonly(),
|
|
11993
12056
|
indexes: array(CollectionIndexSchema).readonly().optional()
|
|
11994
|
-
}), _void(), {
|
|
12057
|
+
}), _void(), {
|
|
12058
|
+
kind: "mutation",
|
|
12059
|
+
auth: "admin"
|
|
12060
|
+
});
|
|
11995
12061
|
/**
|
|
11996
12062
|
* shm ring usage stats for a `frameSink: 'shm'` decoder session —
|
|
11997
12063
|
* exposed via `decoder.getShmStats` so downstream consumers can
|
|
@@ -12836,6 +12902,27 @@ var LinkedDeviceSchema = object({
|
|
|
12836
12902
|
features: array(string()),
|
|
12837
12903
|
producesTrackedEvents: boolean().optional()
|
|
12838
12904
|
});
|
|
12905
|
+
/** One camera's resolved linked set, tagged with the camera it belongs to.
|
|
12906
|
+
* The batch answer needs the tag; the single-device answer already has it
|
|
12907
|
+
* from the input, which is why `getLinkedDevices` keeps the untagged shape. */
|
|
12908
|
+
var LinkedDevicesForDeviceSchema = object({
|
|
12909
|
+
deviceId: number(),
|
|
12910
|
+
mode: LinkedDevicesModeSchema,
|
|
12911
|
+
devices: array(LinkedDeviceSchema)
|
|
12912
|
+
});
|
|
12913
|
+
/** One device's binding map — the shape `getBindings`, `getBindingsBatch` and
|
|
12914
|
+
* `getAllBindings` all answer in. Declared once: three copies of the same
|
|
12915
|
+
* object literal is exactly how the three drift apart. */
|
|
12916
|
+
var DeviceBindingsForDeviceSchema = object({
|
|
12917
|
+
deviceId: number(),
|
|
12918
|
+
entries: array(object({
|
|
12919
|
+
capName: string(),
|
|
12920
|
+
kind: _enum(["native", "wrapped"]),
|
|
12921
|
+
providerAddonId: string(),
|
|
12922
|
+
providerNodeId: string(),
|
|
12923
|
+
nativeAddonId: string()
|
|
12924
|
+
}))
|
|
12925
|
+
});
|
|
12839
12926
|
var SavedDeviceRowSchema = object({
|
|
12840
12927
|
/** Numeric id reserved at allocateDeviceId time. */
|
|
12841
12928
|
id: number(),
|
|
@@ -13061,11 +13148,25 @@ method(object({
|
|
|
13061
13148
|
projection: _enum(["full", "slim"]).optional(),
|
|
13062
13149
|
/** Return only camera devices. Filtering server-side instead of
|
|
13063
13150
|
* shipping 293 rows to find 12. */
|
|
13064
|
-
isCamera: boolean().optional()
|
|
13151
|
+
isCamera: boolean().optional(),
|
|
13152
|
+
/**
|
|
13153
|
+
* Return only these device ids. For the caller that already KNOWS the
|
|
13154
|
+
* handful it wants and needs a field the id-bearing answer does not
|
|
13155
|
+
* carry — the viewer's linked-devices panel joins `type` and `online`
|
|
13156
|
+
* onto ~8 linked ids and, unfiltered, dragged the fleet across to do
|
|
13157
|
+
* it: 433 KB slim / 958 KB full for 967 devices, on a query that
|
|
13158
|
+
* refetches on the reconcile interval, on a phone.
|
|
13159
|
+
*
|
|
13160
|
+
* Safe to send at a hub that predates it: Zod STRIPS unknown input
|
|
13161
|
+
* keys rather than rejecting them (verified against the live hub
|
|
13162
|
+
* 2026-08-25 — 967 rows came back), so an old hub answers exactly what
|
|
13163
|
+
* it answers today and the caller filters as it already does.
|
|
13164
|
+
*/
|
|
13165
|
+
deviceIds: array(number()).optional()
|
|
13065
13166
|
}), array(DeviceInfoSchema)), method(object({ deviceId: number() }), DeviceInfoSchema.nullable()), method(object({ parentDeviceId: number() }), array(DeviceInfoSchema)), method(object({ deviceId: number() }), object({
|
|
13066
13167
|
mode: LinkedDevicesModeSchema,
|
|
13067
13168
|
devices: array(LinkedDeviceSchema)
|
|
13068
|
-
})), method(object({ deviceId: number() }), array(StreamSourceEntrySchema$1)), method(object({ deviceId: number() }), array(ConfigEntrySchema)), method(object({ deviceId: number() }), ConfigUISchemaOutput), method(object({
|
|
13169
|
+
})), method(object({ deviceIds: array(number()) }), array(LinkedDevicesForDeviceSchema)), method(object({ deviceId: number() }), array(StreamSourceEntrySchema$1)), method(object({ deviceId: number() }), array(ConfigEntrySchema)), method(object({ deviceId: number() }), ConfigUISchemaOutput), method(object({
|
|
13069
13170
|
deviceId: number(),
|
|
13070
13171
|
values: record(string(), unknown())
|
|
13071
13172
|
}), object({ success: literal(true) }), {
|
|
@@ -13092,25 +13193,7 @@ method(object({
|
|
|
13092
13193
|
}), method(object({ deviceId: number() }), array(StreamProbeResultSchema), {
|
|
13093
13194
|
kind: "mutation",
|
|
13094
13195
|
auth: "admin"
|
|
13095
|
-
}), method(object({ deviceId: number() }), object({
|
|
13096
|
-
deviceId: number(),
|
|
13097
|
-
entries: array(object({
|
|
13098
|
-
capName: string(),
|
|
13099
|
-
kind: _enum(["native", "wrapped"]),
|
|
13100
|
-
providerAddonId: string(),
|
|
13101
|
-
providerNodeId: string(),
|
|
13102
|
-
nativeAddonId: string()
|
|
13103
|
-
}))
|
|
13104
|
-
})), method(object({}), array(object({
|
|
13105
|
-
deviceId: number(),
|
|
13106
|
-
entries: array(object({
|
|
13107
|
-
capName: string(),
|
|
13108
|
-
kind: _enum(["native", "wrapped"]),
|
|
13109
|
-
providerAddonId: string(),
|
|
13110
|
-
providerNodeId: string(),
|
|
13111
|
-
nativeAddonId: string()
|
|
13112
|
-
}))
|
|
13113
|
-
}))), method(object({
|
|
13196
|
+
}), method(object({ deviceId: number() }), DeviceBindingsForDeviceSchema), method(object({ deviceIds: array(number()) }), array(DeviceBindingsForDeviceSchema)), method(object({}), array(DeviceBindingsForDeviceSchema)), method(object({
|
|
13114
13197
|
deviceId: number(),
|
|
13115
13198
|
capName: string(),
|
|
13116
13199
|
wrapperAddonId: string(),
|
|
@@ -13281,7 +13364,7 @@ method(object({
|
|
|
13281
13364
|
crop: _instanceof(Uint8Array),
|
|
13282
13365
|
width: number(),
|
|
13283
13366
|
height: number()
|
|
13284
|
-
}), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
|
|
13367
|
+
}), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
|
|
13285
13368
|
/**
|
|
13286
13369
|
* filesystem-browse — per-node capability for browsing the node's local
|
|
13287
13370
|
* filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
|
|
@@ -13574,19 +13657,22 @@ method(LlmGenerateBaseInputSchema.extend({
|
|
|
13574
13657
|
runtime: ManagedRuntimeConfigSchema,
|
|
13575
13658
|
/** The managed profile's timeout, threaded by the hub provider. */
|
|
13576
13659
|
timeoutMs: number().int().positive().optional()
|
|
13577
|
-
}), LlmGenerateResultSchema, {
|
|
13660
|
+
}), LlmGenerateResultSchema, {
|
|
13661
|
+
kind: "mutation",
|
|
13662
|
+
auth: "admin"
|
|
13663
|
+
}), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
|
|
13578
13664
|
kind: "mutation",
|
|
13579
13665
|
auth: "admin"
|
|
13580
13666
|
}), method(object({}), _void(), {
|
|
13581
13667
|
kind: "mutation",
|
|
13582
13668
|
auth: "admin"
|
|
13583
|
-
}), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
|
|
13669
|
+
}), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
|
|
13584
13670
|
kind: "mutation",
|
|
13585
13671
|
auth: "admin"
|
|
13586
13672
|
}), method(object({ file: string() }), _void(), {
|
|
13587
13673
|
kind: "mutation",
|
|
13588
13674
|
auth: "admin"
|
|
13589
|
-
}), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
|
|
13675
|
+
}), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
|
|
13590
13676
|
/**
|
|
13591
13677
|
* `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
|
|
13592
13678
|
* methods concat-fan across providers; single-row methods route to ONE
|
|
@@ -15520,12 +15606,15 @@ var NcOccupancyConditionSchema = object({
|
|
|
15520
15606
|
* there is no second switch that can disagree with the first and every rule
|
|
15521
15607
|
* authored before the decision migrates for free (`audioModeOf`):
|
|
15522
15608
|
*
|
|
15523
|
-
* - **LABEL mode — `labels` present.** The rule fires
|
|
15524
|
-
*
|
|
15525
|
-
* `hitPercent` and `samplingSeconds` are ignored
|
|
15526
|
-
*
|
|
15527
|
-
*
|
|
15528
|
-
*
|
|
15609
|
+
* - **LABEL mode — `labels` present.** The rule fires when `confirmHits`
|
|
15610
|
+
* labelled frames land inside `confirmWindowSec` (default 2 in 5 s).
|
|
15611
|
+
* `hitPercent` and `samplingSeconds` are still ignored — a percentage of
|
|
15612
|
+
* frames is the wrong question for a classifier that labels 1–3 frames
|
|
15613
|
+
* per episode. The count window is the brake that drops a single-frame
|
|
15614
|
+
* false positive; the rule's own `throttle` cooldown is the other. The
|
|
15615
|
+
* per-label confidence floor is the analyzer's (`classificationMinScore`,
|
|
15616
|
+
* per device) — a label only reaches this condition if the classifier was
|
|
15617
|
+
* already confident enough. `confirmHits: 1` restores first-frame fire.
|
|
15529
15618
|
* - **LEVEL mode — `dbThreshold` present, no labels.** The sampling window IS
|
|
15530
15619
|
* the condition: at least `hitPercent`% of the samples over
|
|
15531
15620
|
* `samplingSeconds` must be at or above `dbThreshold` dBFS (see
|
|
@@ -15552,14 +15641,22 @@ var NcOccupancyConditionSchema = object({
|
|
|
15552
15641
|
* an operator who typed `dog` mean the same thing.
|
|
15553
15642
|
*/
|
|
15554
15643
|
var NcAudioConditionSchema = object({
|
|
15555
|
-
/** LABEL MODE: audio macro labels. Present ⇒
|
|
15644
|
+
/** LABEL MODE: audio macro labels. Present ⇒ count-in-window confirm. */
|
|
15556
15645
|
labels: array(string().min(1)).min(1).optional(),
|
|
15557
15646
|
/** LEVEL MODE: floor in dBFS (negative-going, `0` = full scale). */
|
|
15558
15647
|
dbThreshold: number().min(-96).max(0).optional(),
|
|
15559
15648
|
/** LEVEL MODE ONLY: percentage of the window's samples that must be hits (1–100). */
|
|
15560
15649
|
hitPercent: number().int().min(1).max(100).default(60),
|
|
15561
15650
|
/** LEVEL MODE ONLY: length of the sampling window in seconds. */
|
|
15562
|
-
samplingSeconds: number().int().min(1).max(300).default(10)
|
|
15651
|
+
samplingSeconds: number().int().min(1).max(300).default(10),
|
|
15652
|
+
/**
|
|
15653
|
+
* LABEL MODE: how many labelled frames must land inside
|
|
15654
|
+
* {@link NcAudioConditionSchema.shape.confirmWindowSec} before dispatch.
|
|
15655
|
+
* Absent ⇒ 2 (the matcher default). `1` is first-frame fire.
|
|
15656
|
+
*/
|
|
15657
|
+
confirmHits: number().int().min(1).max(20).optional(),
|
|
15658
|
+
/** LABEL MODE: the window those frames must share, in seconds. Absent ⇒ 5. */
|
|
15659
|
+
confirmWindowSec: number().int().min(1).max(60).optional()
|
|
15563
15660
|
});
|
|
15564
15661
|
/**
|
|
15565
15662
|
* Which zone-crossing DIRECTION a rule accepts (`ObjectEvent.zoneCrossing`).
|
|
@@ -17086,7 +17183,7 @@ var OauthIntegrationDescriptorSchema = object({
|
|
|
17086
17183
|
*/
|
|
17087
17184
|
refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
|
|
17088
17185
|
});
|
|
17089
|
-
method(_void(), OauthIntegrationDescriptorSchema);
|
|
17186
|
+
method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
|
|
17090
17187
|
/**
|
|
17091
17188
|
* pipeline-analytics — device-scoped wrapper cap. Refines raw
|
|
17092
17189
|
* per-frame detections emitted by the pipeline runner into tracked
|
|
@@ -17933,6 +18030,46 @@ var RecentTracksPageSchema = object({
|
|
|
17933
18030
|
/** Cursor for the next page, or null when this page is the last. */
|
|
17934
18031
|
nextCursor: string().nullable()
|
|
17935
18032
|
});
|
|
18033
|
+
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
18034
|
+
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
18035
|
+
var AnalyticsGroupRecordSchema = object({
|
|
18036
|
+
id: string(),
|
|
18037
|
+
deviceId: number().int(),
|
|
18038
|
+
openedAt: number().int(),
|
|
18039
|
+
closedAt: number().int(),
|
|
18040
|
+
timestamp: number().int(),
|
|
18041
|
+
memberCount: number().int(),
|
|
18042
|
+
memberTrackIds: array(string()).readonly(),
|
|
18043
|
+
className: string(),
|
|
18044
|
+
classes: array(string()).readonly(),
|
|
18045
|
+
/** Relative event-media path, or null when the group has no picture yet. */
|
|
18046
|
+
mediaUrl: string().nullable(),
|
|
18047
|
+
singleton: boolean()
|
|
18048
|
+
});
|
|
18049
|
+
var AnalyticsGroupMemberSchema = object({
|
|
18050
|
+
trackId: string(),
|
|
18051
|
+
deviceId: number().int(),
|
|
18052
|
+
className: string(),
|
|
18053
|
+
firstSeen: number().int(),
|
|
18054
|
+
lastSeen: number().int(),
|
|
18055
|
+
mediaUrl: string().nullable()
|
|
18056
|
+
});
|
|
18057
|
+
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
18058
|
+
var ListGroupsQueryInput = object({
|
|
18059
|
+
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
18060
|
+
deviceIds: array(number()),
|
|
18061
|
+
/** Window lower bound on `closedAt` (inclusive). */
|
|
18062
|
+
since: number().optional(),
|
|
18063
|
+
/** Window upper bound on `openedAt` (inclusive). */
|
|
18064
|
+
until: number().optional(),
|
|
18065
|
+
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
18066
|
+
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
18067
|
+
cursor: string().optional()
|
|
18068
|
+
});
|
|
18069
|
+
var ListGroupsPageSchema = object({
|
|
18070
|
+
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
18071
|
+
nextCursor: string().nullable()
|
|
18072
|
+
});
|
|
17936
18073
|
var KeyEventQueryInput = object({
|
|
17937
18074
|
deviceId: number(),
|
|
17938
18075
|
/** Window lower bound (track firstSeen ≥ since). */
|
|
@@ -18008,7 +18145,9 @@ var TrackCascadeCountsSchema = object({
|
|
|
18008
18145
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
18009
18146
|
plates: number().int(),
|
|
18010
18147
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
18011
|
-
embeddings: number().int()
|
|
18148
|
+
embeddings: number().int(),
|
|
18149
|
+
/** Group membership + group rows removed with their last member (best-effort). */
|
|
18150
|
+
groups: number().int()
|
|
18012
18151
|
});
|
|
18013
18152
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
18014
18153
|
var DiskReconcileCountsSchema = object({
|
|
@@ -18154,7 +18293,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
18154
18293
|
* stationary registry). Default false: the timeline lists passages,
|
|
18155
18294
|
* not parking records (operator decision, 2026-08-15). */
|
|
18156
18295
|
includeStationary: boolean().optional()
|
|
18157
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
18296
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
|
|
18297
|
+
deviceId: number(),
|
|
18298
|
+
groupId: string().min(1)
|
|
18299
|
+
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
18158
18300
|
kind: "mutation",
|
|
18159
18301
|
auth: "admin"
|
|
18160
18302
|
}), 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({
|
|
@@ -18236,6 +18378,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
18236
18378
|
}), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
18237
18379
|
kind: "mutation",
|
|
18238
18380
|
auth: "admin"
|
|
18381
|
+
}), method(RelocateMediaInputSchema, object({ jobId: string() }), {
|
|
18382
|
+
kind: "mutation",
|
|
18383
|
+
auth: "admin"
|
|
18384
|
+
}), method(object({}), array(RelocateJobSchema).readonly(), {
|
|
18385
|
+
kind: "query",
|
|
18386
|
+
auth: "admin"
|
|
18387
|
+
}), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
18388
|
+
kind: "mutation",
|
|
18389
|
+
auth: "admin"
|
|
18239
18390
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
18240
18391
|
kind: "query",
|
|
18241
18392
|
auth: "admin"
|
|
@@ -18390,6 +18541,11 @@ object({
|
|
|
18390
18541
|
"jpeg"
|
|
18391
18542
|
])
|
|
18392
18543
|
});
|
|
18544
|
+
/**
|
|
18545
|
+
* Process-local frame identity. It is serializable so it can ride an in-process
|
|
18546
|
+
* capability call, but `registryId` deliberately prevents resolution in any
|
|
18547
|
+
* other process or execution group.
|
|
18548
|
+
*/
|
|
18393
18549
|
var FrameRefSchema = object({
|
|
18394
18550
|
registryId: string().min(1),
|
|
18395
18551
|
id: string().min(1),
|
|
@@ -18464,7 +18620,8 @@ var PipelineModelOptionSchema = object({
|
|
|
18464
18620
|
sizeMB: number()
|
|
18465
18621
|
})),
|
|
18466
18622
|
group: ModelVariantGroupSchema.optional(),
|
|
18467
|
-
legacy: boolean().optional()
|
|
18623
|
+
legacy: boolean().optional(),
|
|
18624
|
+
provider: ModelProviderIdSchema.optional()
|
|
18468
18625
|
});
|
|
18469
18626
|
var ConfigFieldBridge = custom();
|
|
18470
18627
|
var PipelineAddonSchemaSchema = object({
|
|
@@ -20594,7 +20751,7 @@ method(object({
|
|
|
20594
20751
|
* linking rather than produce an eternal token.
|
|
20595
20752
|
*/
|
|
20596
20753
|
ttlSec: union([number().int().positive(), literal("never")]).optional()
|
|
20597
|
-
}), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
|
|
20754
|
+
}), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
|
|
20598
20755
|
var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
20599
20756
|
providerId: string().min(1),
|
|
20600
20757
|
displayName: string().min(1),
|
|
@@ -20689,10 +20846,13 @@ var EvictResultSchema = object({
|
|
|
20689
20846
|
/** True when the provider has nothing left it is willing to drop on this location. */
|
|
20690
20847
|
exhausted: boolean()
|
|
20691
20848
|
});
|
|
20692
|
-
method(object({ locationId: string() }), EvictableUsageSchema), method(object({
|
|
20849
|
+
method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
|
|
20693
20850
|
locationId: string(),
|
|
20694
20851
|
targetBytes: number().int().positive()
|
|
20695
|
-
}), EvictResultSchema, {
|
|
20852
|
+
}), EvictResultSchema, {
|
|
20853
|
+
kind: "mutation",
|
|
20854
|
+
auth: "admin"
|
|
20855
|
+
});
|
|
20696
20856
|
method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
|
|
20697
20857
|
kind: "mutation",
|
|
20698
20858
|
auth: "admin"
|
|
@@ -20752,26 +20912,50 @@ var ReadChunkInputSchema = object({
|
|
|
20752
20912
|
length: number()
|
|
20753
20913
|
});
|
|
20754
20914
|
var EndDownloadInputSchema = object({ downloadId: string() });
|
|
20755
|
-
method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
|
|
20915
|
+
method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
|
|
20756
20916
|
location: StorageLocationSchema,
|
|
20757
20917
|
relativePath: string()
|
|
20758
|
-
}), string()), method(object({
|
|
20918
|
+
}), string(), { auth: "admin" }), method(object({
|
|
20759
20919
|
location: StorageLocationSchema,
|
|
20760
20920
|
relativePath: string(),
|
|
20761
20921
|
data: _instanceof(Uint8Array)
|
|
20762
|
-
}), _void(), {
|
|
20922
|
+
}), _void(), {
|
|
20923
|
+
kind: "mutation",
|
|
20924
|
+
auth: "admin"
|
|
20925
|
+
}), method(object({
|
|
20763
20926
|
location: StorageLocationSchema,
|
|
20764
20927
|
relativePath: string()
|
|
20765
|
-
}), _instanceof(Uint8Array)), method(object({
|
|
20928
|
+
}), _instanceof(Uint8Array), { auth: "admin" }), method(object({
|
|
20766
20929
|
location: StorageLocationSchema,
|
|
20767
20930
|
relativePath: string()
|
|
20768
|
-
}), boolean()), method(object({
|
|
20931
|
+
}), boolean(), { auth: "admin" }), method(object({
|
|
20769
20932
|
location: StorageLocationSchema,
|
|
20770
20933
|
prefix: string().optional()
|
|
20771
|
-
}), array(string()).readonly()), method(object({
|
|
20934
|
+
}), array(string()).readonly(), { auth: "admin" }), method(object({
|
|
20772
20935
|
location: StorageLocationSchema,
|
|
20773
20936
|
relativePath: string()
|
|
20774
|
-
}), _void(), {
|
|
20937
|
+
}), _void(), {
|
|
20938
|
+
kind: "mutation",
|
|
20939
|
+
auth: "admin"
|
|
20940
|
+
}), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
|
|
20941
|
+
kind: "mutation",
|
|
20942
|
+
auth: "admin"
|
|
20943
|
+
}), method(WriteChunkInputSchema, _void(), {
|
|
20944
|
+
kind: "mutation",
|
|
20945
|
+
auth: "admin"
|
|
20946
|
+
}), method(FinalizeUploadInputSchema, _void(), {
|
|
20947
|
+
kind: "mutation",
|
|
20948
|
+
auth: "admin"
|
|
20949
|
+
}), method(AbortUploadInputSchema, _void(), {
|
|
20950
|
+
kind: "mutation",
|
|
20951
|
+
auth: "admin"
|
|
20952
|
+
}), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
|
|
20953
|
+
kind: "mutation",
|
|
20954
|
+
auth: "admin"
|
|
20955
|
+
}), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
|
|
20956
|
+
kind: "mutation",
|
|
20957
|
+
auth: "admin"
|
|
20958
|
+
});
|
|
20775
20959
|
/** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
|
|
20776
20960
|
var ProfileSettingsSchemaBridge = unknown().nullable();
|
|
20777
20961
|
var ProfileSettingsBagSchema = record(string(), unknown());
|
|
@@ -21029,7 +21213,8 @@ method(object({
|
|
|
21029
21213
|
access: "create"
|
|
21030
21214
|
}), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
|
|
21031
21215
|
kind: "mutation",
|
|
21032
|
-
access: "view"
|
|
21216
|
+
access: "view",
|
|
21217
|
+
auth: "admin"
|
|
21033
21218
|
}), method(object({
|
|
21034
21219
|
/** Required — the user the assertion belongs to (verified). */
|
|
21035
21220
|
userId: string(),
|
|
@@ -21037,10 +21222,12 @@ method(object({
|
|
|
21037
21222
|
response: record(string(), unknown())
|
|
21038
21223
|
}), object({ verified: boolean() }), {
|
|
21039
21224
|
kind: "mutation",
|
|
21040
|
-
access: "view"
|
|
21225
|
+
access: "view",
|
|
21226
|
+
auth: "admin"
|
|
21041
21227
|
}), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
|
|
21042
21228
|
kind: "mutation",
|
|
21043
|
-
access: "view"
|
|
21229
|
+
access: "view",
|
|
21230
|
+
auth: "admin"
|
|
21044
21231
|
}), method(object({
|
|
21045
21232
|
/** AuthenticationResponseJSON from the browser. */
|
|
21046
21233
|
response: record(string(), unknown()) }), object({
|
|
@@ -21048,7 +21235,8 @@ response: record(string(), unknown()) }), object({
|
|
|
21048
21235
|
userId: string().nullable()
|
|
21049
21236
|
}), {
|
|
21050
21237
|
kind: "mutation",
|
|
21051
|
-
access: "view"
|
|
21238
|
+
access: "view",
|
|
21239
|
+
auth: "admin"
|
|
21052
21240
|
}), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
|
|
21053
21241
|
userId: string(),
|
|
21054
21242
|
credentialId: string()
|
|
@@ -21220,7 +21408,19 @@ var VectorStatsResultSchema = object({
|
|
|
21220
21408
|
/** False when the backend ranks approximately. */
|
|
21221
21409
|
exact: boolean()
|
|
21222
21410
|
});
|
|
21223
|
-
method(VectorDeclareIndexInputSchema, _void(), {
|
|
21411
|
+
method(VectorDeclareIndexInputSchema, _void(), {
|
|
21412
|
+
kind: "mutation",
|
|
21413
|
+
auth: "admin"
|
|
21414
|
+
}), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
|
|
21415
|
+
kind: "mutation",
|
|
21416
|
+
auth: "admin"
|
|
21417
|
+
}), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
|
|
21418
|
+
kind: "mutation",
|
|
21419
|
+
auth: "admin"
|
|
21420
|
+
}), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
|
|
21421
|
+
kind: "mutation",
|
|
21422
|
+
auth: "admin"
|
|
21423
|
+
}), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
|
|
21224
21424
|
var ClipSchema = object({
|
|
21225
21425
|
/** Opaque, provider-namespaced id. The default provider encodes the time
|
|
21226
21426
|
* window so `getClipPlayback` is self-contained (no event re-query). */
|
|
@@ -23681,7 +23881,27 @@ var MediaFileLiteSchema$1 = object({
|
|
|
23681
23881
|
sizeBytes: number(),
|
|
23682
23882
|
timestamp: number()
|
|
23683
23883
|
});
|
|
23684
|
-
method(
|
|
23884
|
+
method(object({
|
|
23885
|
+
/**
|
|
23886
|
+
* Inline {@link IdentitySchema.coverBase64} on every row.
|
|
23887
|
+
*
|
|
23888
|
+
* Default `false`, the same inversion `listRecentFaces` and
|
|
23889
|
+
* `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
|
|
23890
|
+
* why the burden belongs on the caller that WANTS the bytes). Measured
|
|
23891
|
+
* on the live hub the same day: four identities cost 40,979 B with the
|
|
23892
|
+
* covers inline, ~10 KB of base64 per row, on a query this UI mounts
|
|
23893
|
+
* four times and the viewer holds at `staleTime: 30_000`.
|
|
23894
|
+
*
|
|
23895
|
+
* Nothing loses its avatar: `coverMediaKey` is already on every row and
|
|
23896
|
+
* the `event-media` plane serves that key `immutable` with an ETag.
|
|
23897
|
+
*
|
|
23898
|
+
* **This is an INPUT field, so it does not reach the addon until the
|
|
23899
|
+
* next train** — the hub router validates cap inputs against its own
|
|
23900
|
+
* compiled Zod and strips a key it does not know. Until then the
|
|
23901
|
+
* provider sees `undefined`, which resolves to `false`: the cheap shape
|
|
23902
|
+
* is what ships, and the opt-in becomes reachable when the train lands.
|
|
23903
|
+
*/
|
|
23904
|
+
includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
|
|
23685
23905
|
kind: "mutation",
|
|
23686
23906
|
auth: "admin"
|
|
23687
23907
|
}), method(object({
|
|
@@ -26569,7 +26789,14 @@ var PlateInfoSchema = object({
|
|
|
26569
26789
|
plateBbox: BoundingBoxSchema.optional(),
|
|
26570
26790
|
/** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
|
|
26571
26791
|
keyFrameMediaKey: string().optional(),
|
|
26572
|
-
base64: string().optional()
|
|
26792
|
+
base64: string().optional(),
|
|
26793
|
+
/**
|
|
26794
|
+
* Same crop as a data-plane URL, always present when the plate has a stored
|
|
26795
|
+
* crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
|
|
26796
|
+
* and `searchPlates` inline the crop only when their `includeCrops` input is
|
|
26797
|
+
* left at its `true` default.
|
|
26798
|
+
*/
|
|
26799
|
+
cropUrl: string().optional()
|
|
26573
26800
|
});
|
|
26574
26801
|
var MediaFileLiteSchema = object({
|
|
26575
26802
|
key: string(),
|
|
@@ -26587,14 +26814,34 @@ var PlateClusterSchema = object({
|
|
|
26587
26814
|
});
|
|
26588
26815
|
method(object({
|
|
26589
26816
|
deviceId: number().int().optional(),
|
|
26590
|
-
limit: number().int().positive().optional()
|
|
26817
|
+
limit: number().int().positive().optional(),
|
|
26818
|
+
/**
|
|
26819
|
+
* Inline the base64 crop on every row. Default `true` — the existing
|
|
26820
|
+
* behaviour, kept so no caller breaks.
|
|
26821
|
+
*
|
|
26822
|
+
* Set `false` once the caller renders {@link PlateInfo.cropUrl}.
|
|
26823
|
+
* Measured on the live hub at the 500 rows the Plates view asks for:
|
|
26824
|
+
* 879,403 B and 27.7 s with the crops inline, against a few KiB of
|
|
26825
|
+
* metadata without them — and the browser then caches the images.
|
|
26826
|
+
*
|
|
26827
|
+
* This is the plate twin of `faceGallery.listRecentFaces`'s option;
|
|
26828
|
+
* plates were the one gallery list left without it.
|
|
26829
|
+
*
|
|
26830
|
+
* **This is an INPUT field, so it does not reach the addon until the
|
|
26831
|
+
* next train.** The hub router validates cap inputs against its own
|
|
26832
|
+
* compiled Zod and strips a key it does not know. Until the train
|
|
26833
|
+
* ships, sending `false` is harmless and keeps the crops inline.
|
|
26834
|
+
*/
|
|
26835
|
+
includeCrops: boolean().optional()
|
|
26591
26836
|
}).optional(), array(PlateInfoSchema).readonly()), method(object({
|
|
26592
26837
|
deviceId: number().int(),
|
|
26593
26838
|
trackId: string()
|
|
26594
26839
|
}), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
|
|
26595
26840
|
text: string().min(1),
|
|
26596
26841
|
maxDistance: number().int().min(0).optional(),
|
|
26597
|
-
limit: number().int().positive().optional()
|
|
26842
|
+
limit: number().int().positive().optional(),
|
|
26843
|
+
/** See `listPlates.includeCrops`. Default `true`. */
|
|
26844
|
+
includeCrops: boolean().optional()
|
|
26598
26845
|
}), array(PlateInfoSchema).readonly()), method(object({
|
|
26599
26846
|
maxDistance: number().int().min(0).optional(),
|
|
26600
26847
|
minClusterSize: number().int().min(2).optional(),
|
|
@@ -26608,7 +26855,13 @@ method(object({
|
|
|
26608
26855
|
}), method(object({ plateId: string() }), _void(), {
|
|
26609
26856
|
kind: "mutation",
|
|
26610
26857
|
auth: "admin"
|
|
26611
|
-
}), method(
|
|
26858
|
+
}), method(object({
|
|
26859
|
+
/** Inline {@link VehicleSchema.coverBase64} on every row. Default
|
|
26860
|
+
* `false` — the vehicle twin of `faceGallery.listIdentities`'s
|
|
26861
|
+
* option; `coverMediaKey` + the `event-media` plane carry the picture.
|
|
26862
|
+
* INPUT field: stripped by the hub router until the train ships, which
|
|
26863
|
+
* resolves to `false` and is exactly the intended default. */
|
|
26864
|
+
includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
|
|
26612
26865
|
kind: "mutation",
|
|
26613
26866
|
auth: "admin"
|
|
26614
26867
|
}), method(object({
|
|
@@ -32093,6 +32346,12 @@ Object.freeze({
|
|
|
32093
32346
|
addonId: null,
|
|
32094
32347
|
access: "view"
|
|
32095
32348
|
},
|
|
32349
|
+
"deviceManager.getBindingsBatch": {
|
|
32350
|
+
capName: "device-manager",
|
|
32351
|
+
capScope: "system",
|
|
32352
|
+
addonId: null,
|
|
32353
|
+
access: "view"
|
|
32354
|
+
},
|
|
32096
32355
|
"deviceManager.getChildren": {
|
|
32097
32356
|
capName: "device-manager",
|
|
32098
32357
|
capScope: "system",
|
|
@@ -32153,6 +32412,12 @@ Object.freeze({
|
|
|
32153
32412
|
addonId: null,
|
|
32154
32413
|
access: "view"
|
|
32155
32414
|
},
|
|
32415
|
+
"deviceManager.getLinkedDevicesBatch": {
|
|
32416
|
+
capName: "device-manager",
|
|
32417
|
+
capScope: "system",
|
|
32418
|
+
addonId: null,
|
|
32419
|
+
access: "view"
|
|
32420
|
+
},
|
|
32156
32421
|
"deviceManager.getRoleDisplayDefaults": {
|
|
32157
32422
|
capName: "device-manager",
|
|
32158
32423
|
capScope: "system",
|
|
@@ -33857,6 +34122,12 @@ Object.freeze({
|
|
|
33857
34122
|
addonId: null,
|
|
33858
34123
|
access: "create"
|
|
33859
34124
|
},
|
|
34125
|
+
"pipelineAnalytics.cancelRelocateMedia": {
|
|
34126
|
+
capName: "pipeline-analytics",
|
|
34127
|
+
capScope: "device",
|
|
34128
|
+
addonId: null,
|
|
34129
|
+
access: "create"
|
|
34130
|
+
},
|
|
33860
34131
|
"pipelineAnalytics.cancelStorageMigrationMove": {
|
|
33861
34132
|
capName: "pipeline-analytics",
|
|
33862
34133
|
capScope: "device",
|
|
@@ -33923,6 +34194,12 @@ Object.freeze({
|
|
|
33923
34194
|
addonId: null,
|
|
33924
34195
|
access: "view"
|
|
33925
34196
|
},
|
|
34197
|
+
"pipelineAnalytics.getGroup": {
|
|
34198
|
+
capName: "pipeline-analytics",
|
|
34199
|
+
capScope: "device",
|
|
34200
|
+
addonId: null,
|
|
34201
|
+
access: "view"
|
|
34202
|
+
},
|
|
33926
34203
|
"pipelineAnalytics.getKeyEvents": {
|
|
33927
34204
|
capName: "pipeline-analytics",
|
|
33928
34205
|
capScope: "device",
|
|
@@ -34007,6 +34284,12 @@ Object.freeze({
|
|
|
34007
34284
|
addonId: null,
|
|
34008
34285
|
access: "view"
|
|
34009
34286
|
},
|
|
34287
|
+
"pipelineAnalytics.listGroups": {
|
|
34288
|
+
capName: "pipeline-analytics",
|
|
34289
|
+
capScope: "device",
|
|
34290
|
+
addonId: null,
|
|
34291
|
+
access: "view"
|
|
34292
|
+
},
|
|
34010
34293
|
"pipelineAnalytics.listOpsLog": {
|
|
34011
34294
|
capName: "pipeline-analytics",
|
|
34012
34295
|
capScope: "device",
|
|
@@ -34019,6 +34302,12 @@ Object.freeze({
|
|
|
34019
34302
|
addonId: null,
|
|
34020
34303
|
access: "view"
|
|
34021
34304
|
},
|
|
34305
|
+
"pipelineAnalytics.listRelocateMediaJobs": {
|
|
34306
|
+
capName: "pipeline-analytics",
|
|
34307
|
+
capScope: "device",
|
|
34308
|
+
addonId: null,
|
|
34309
|
+
access: "view"
|
|
34310
|
+
},
|
|
34022
34311
|
"pipelineAnalytics.listRetrainAnnotations": {
|
|
34023
34312
|
capName: "pipeline-analytics",
|
|
34024
34313
|
capScope: "device",
|
|
@@ -34097,6 +34386,12 @@ Object.freeze({
|
|
|
34097
34386
|
addonId: null,
|
|
34098
34387
|
access: "create"
|
|
34099
34388
|
},
|
|
34389
|
+
"pipelineAnalytics.relocateMedia": {
|
|
34390
|
+
capName: "pipeline-analytics",
|
|
34391
|
+
capScope: "device",
|
|
34392
|
+
addonId: null,
|
|
34393
|
+
access: "create"
|
|
34394
|
+
},
|
|
34100
34395
|
"pipelineAnalytics.restageRetrainTrack": {
|
|
34101
34396
|
capName: "pipeline-analytics",
|
|
34102
34397
|
capScope: "device",
|
|
@@ -36788,6 +37083,11 @@ Object.freeze({
|
|
|
36788
37083
|
form: "single",
|
|
36789
37084
|
optional: false
|
|
36790
37085
|
}],
|
|
37086
|
+
"deviceManager.getBindingsBatch": [{
|
|
37087
|
+
name: "deviceIds",
|
|
37088
|
+
form: "array",
|
|
37089
|
+
optional: false
|
|
37090
|
+
}],
|
|
36791
37091
|
"deviceManager.getChildren": [{
|
|
36792
37092
|
name: "parentDeviceId",
|
|
36793
37093
|
form: "single",
|
|
@@ -36833,6 +37133,11 @@ Object.freeze({
|
|
|
36833
37133
|
form: "single",
|
|
36834
37134
|
optional: false
|
|
36835
37135
|
}],
|
|
37136
|
+
"deviceManager.getLinkedDevicesBatch": [{
|
|
37137
|
+
name: "deviceIds",
|
|
37138
|
+
form: "array",
|
|
37139
|
+
optional: false
|
|
37140
|
+
}],
|
|
36836
37141
|
"deviceManager.getSettingsSchema": [{
|
|
36837
37142
|
name: "deviceId",
|
|
36838
37143
|
form: "single",
|
|
@@ -36853,6 +37158,11 @@ Object.freeze({
|
|
|
36853
37158
|
form: "single",
|
|
36854
37159
|
optional: false
|
|
36855
37160
|
}],
|
|
37161
|
+
"deviceManager.listAll": [{
|
|
37162
|
+
name: "deviceIds",
|
|
37163
|
+
form: "array",
|
|
37164
|
+
optional: true
|
|
37165
|
+
}],
|
|
36856
37166
|
"deviceManager.loadConfig": [{
|
|
36857
37167
|
name: "deviceId",
|
|
36858
37168
|
form: "single",
|
|
@@ -37426,6 +37736,11 @@ Object.freeze({
|
|
|
37426
37736
|
form: "single",
|
|
37427
37737
|
optional: false
|
|
37428
37738
|
}],
|
|
37739
|
+
"pipelineAnalytics.getGroup": [{
|
|
37740
|
+
name: "deviceId",
|
|
37741
|
+
form: "single",
|
|
37742
|
+
optional: false
|
|
37743
|
+
}],
|
|
37429
37744
|
"pipelineAnalytics.getKeyEvents": [{
|
|
37430
37745
|
name: "deviceId",
|
|
37431
37746
|
form: "single",
|
|
@@ -37481,6 +37796,11 @@ Object.freeze({
|
|
|
37481
37796
|
form: "array",
|
|
37482
37797
|
optional: false
|
|
37483
37798
|
}],
|
|
37799
|
+
"pipelineAnalytics.listGroups": [{
|
|
37800
|
+
name: "deviceIds",
|
|
37801
|
+
form: "array",
|
|
37802
|
+
optional: false
|
|
37803
|
+
}],
|
|
37484
37804
|
"pipelineAnalytics.listOpsLog": [{
|
|
37485
37805
|
name: "deviceId",
|
|
37486
37806
|
form: "single",
|