@camstack/addon-provider-homematic 1.2.28 → 1.2.30
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.js
CHANGED
|
@@ -5810,6 +5810,13 @@ var BaseAddon = class {
|
|
|
5810
5810
|
_readinessGeneration = typeof crypto !== "undefined" && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).slice(2, 14);
|
|
5811
5811
|
/** Capability names this addon registered at init — used to emit matching `down` events on shutdown. */
|
|
5812
5812
|
_registeredCapNames = [];
|
|
5813
|
+
/**
|
|
5814
|
+
* True only after `readAddonStore` actually answered. Constructor
|
|
5815
|
+
* defaults look like stored config when the store is down — a forked
|
|
5816
|
+
* addon that auto-starts from those defaults (cloudflare-tunnel quick
|
|
5817
|
+
* mode, 2026-08-25) is not "the operator chose this".
|
|
5818
|
+
*/
|
|
5819
|
+
settingsStoreReady = false;
|
|
5813
5820
|
/** Default config values. Provided via constructor. */
|
|
5814
5821
|
defaults;
|
|
5815
5822
|
constructor(defaults) {
|
|
@@ -6210,7 +6217,9 @@ var BaseAddon = class {
|
|
|
6210
6217
|
];
|
|
6211
6218
|
let lastErr;
|
|
6212
6219
|
for (let attempt = 0; attempt <= delaysMs.length; attempt++) try {
|
|
6213
|
-
|
|
6220
|
+
const stored = await settings.readAddonStore() ?? {};
|
|
6221
|
+
this.settingsStoreReady = true;
|
|
6222
|
+
return stored;
|
|
6214
6223
|
} catch (err) {
|
|
6215
6224
|
lastErr = err;
|
|
6216
6225
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -6218,6 +6227,7 @@ var BaseAddon = class {
|
|
|
6218
6227
|
if (attempt === delaysMs.length) break;
|
|
6219
6228
|
await new Promise((r) => setTimeout(r, delaysMs[attempt]));
|
|
6220
6229
|
}
|
|
6230
|
+
this.settingsStoreReady = false;
|
|
6221
6231
|
this._ctx?.logger?.warn?.("readAddonStore: settings-store unavailable after retries — using defaults", { meta: { error: lastErr instanceof Error ? lastErr.message : String(lastErr) } });
|
|
6222
6232
|
return {};
|
|
6223
6233
|
}
|
|
@@ -6629,7 +6639,7 @@ function method(input, output, options) {
|
|
|
6629
6639
|
input,
|
|
6630
6640
|
output,
|
|
6631
6641
|
kind: options?.kind ?? "query",
|
|
6632
|
-
auth: options
|
|
6642
|
+
...options?.auth !== void 0 ? { auth: options.auth } : {},
|
|
6633
6643
|
...options?.access !== void 0 ? { access: options.access } : {},
|
|
6634
6644
|
...options?.caller !== void 0 ? { caller: options.caller } : {},
|
|
6635
6645
|
timeoutMs: options?.timeoutMs
|
|
@@ -6653,7 +6663,7 @@ function event(data) {
|
|
|
6653
6663
|
}
|
|
6654
6664
|
var StaticDirOutputSchema$1 = object({ staticDir: string() });
|
|
6655
6665
|
var VersionOutputSchema$1 = object({ version: string() });
|
|
6656
|
-
method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
|
|
6666
|
+
method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
|
|
6657
6667
|
var DeviceType = /* @__PURE__ */ function(DeviceType) {
|
|
6658
6668
|
DeviceType["Camera"] = "camera";
|
|
6659
6669
|
DeviceType["Hub"] = "hub";
|
|
@@ -6974,7 +6984,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
|
|
|
6974
6984
|
}({});
|
|
6975
6985
|
var StaticDirOutputSchema = object({ staticDir: string() });
|
|
6976
6986
|
var VersionOutputSchema = object({ version: string() });
|
|
6977
|
-
method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
|
|
6987
|
+
method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
|
|
6978
6988
|
/**
|
|
6979
6989
|
* device-ops — device-scoped cap that unifies the per-IDevice operations
|
|
6980
6990
|
* previously routed through the `.device-ops` Moleculer bridge service.
|
|
@@ -7600,24 +7610,6 @@ var RecordingRetentionSchema = object({
|
|
|
7600
7610
|
maxSizeGb: number().min(0).optional()
|
|
7601
7611
|
});
|
|
7602
7612
|
/**
|
|
7603
|
-
* Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
|
|
7604
|
-
* sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
|
|
7605
|
-
* previews at. Five graduated steps; absent on a config = `standard` (the
|
|
7606
|
-
* shipped default, matching `sheet-geometry`/`sheet-composer`).
|
|
7607
|
-
*
|
|
7608
|
-
* Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
|
|
7609
|
-
* Each window's index sidecar carries its own tile dims, so a camera whose
|
|
7610
|
-
* preset changed over time renders every historical window at the dims it was
|
|
7611
|
-
* written with.
|
|
7612
|
-
*/
|
|
7613
|
-
var ScrubThumbnailPresetSchema = _enum([
|
|
7614
|
-
"minimal",
|
|
7615
|
-
"low",
|
|
7616
|
-
"standard",
|
|
7617
|
-
"high",
|
|
7618
|
-
"max"
|
|
7619
|
-
]);
|
|
7620
|
-
/**
|
|
7621
7613
|
* The full per-camera recording intent — the wire shape of a RecordingTarget.
|
|
7622
7614
|
*
|
|
7623
7615
|
* `bands` is the ONLY authored recording intent: what to record, when, and on
|
|
@@ -7625,7 +7617,11 @@ var ScrubThumbnailPresetSchema = _enum([
|
|
|
7625
7617
|
* other field is a storage knob (profiles, segment length, retention, scrub).
|
|
7626
7618
|
*
|
|
7627
7619
|
* STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
|
|
7628
|
-
* `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30
|
|
7620
|
+
* `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
|
|
7621
|
+
* and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
|
|
7622
|
+
* deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
|
|
7623
|
+
* (D62: a switch that writes a store nobody reads is worse than no switch).
|
|
7624
|
+
* Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
|
|
7629
7625
|
* A stale caller must fail loudly — silently stripping its legacy intent would
|
|
7630
7626
|
* persist a band-less config, i.e. silently stop recording the camera.
|
|
7631
7627
|
*/
|
|
@@ -7648,14 +7644,7 @@ var RecordingConfigSchema = object({
|
|
|
7648
7644
|
* "off" is the absence of a covering band, never a band value.
|
|
7649
7645
|
*/
|
|
7650
7646
|
bands: array(RecordingBandSchema).default([]),
|
|
7651
|
-
retention: RecordingRetentionSchema.optional()
|
|
7652
|
-
/**
|
|
7653
|
-
* Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
|
|
7654
|
-
* timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
|
|
7655
|
-
* windows only — existing sheets are immutable, and each window's index
|
|
7656
|
-
* carries its own tile dims so mixed-preset history renders correctly.
|
|
7657
|
-
*/
|
|
7658
|
-
scrubThumbnails: ScrubThumbnailPresetSchema.optional()
|
|
7647
|
+
retention: RecordingRetentionSchema.optional()
|
|
7659
7648
|
}).strict();
|
|
7660
7649
|
/**
|
|
7661
7650
|
* Entity-relocation job state (storage entity-routing spec, Phase 4).
|
|
@@ -7731,10 +7720,11 @@ var RelocateFootageInputSchema = object({
|
|
|
7731
7720
|
* `RecordingConfig.enabled` or camera wrapper bindings. */
|
|
7732
7721
|
var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
|
|
7733
7722
|
var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
|
|
7734
|
-
var
|
|
7723
|
+
var RelocateMediaInputSchema = object({
|
|
7735
7724
|
toLocationId: string(),
|
|
7736
7725
|
throttleMbps: number().min(1).max(1e3).optional()
|
|
7737
|
-
})
|
|
7726
|
+
});
|
|
7727
|
+
var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
|
|
7738
7728
|
/** The independently selectable logical storage classes. `recordings`
|
|
7739
7729
|
* encompasses the high and mid segment profiles; `recordingsLow` is low
|
|
7740
7730
|
* segments; `eventMedia` is post-analysis blobs. */
|
|
@@ -8029,7 +8019,26 @@ var LabelDefinitionSchema = object({
|
|
|
8029
8019
|
description: string().optional(),
|
|
8030
8020
|
icon: string().optional()
|
|
8031
8021
|
});
|
|
8032
|
-
|
|
8022
|
+
/**
|
|
8023
|
+
* Wire schema for a per-model CATALOG classMap override
|
|
8024
|
+
* (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
|
|
8025
|
+
* restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
|
|
8026
|
+
* detection pipeline executor actually routes.
|
|
8027
|
+
*
|
|
8028
|
+
* This is deliberately a DIFFERENT, narrower shape than the general-purpose
|
|
8029
|
+
* `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
|
|
8030
|
+
* and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
|
|
8031
|
+
* enum) — the two used to share the name `ClassMapDefinition`/
|
|
8032
|
+
* `ClassMapDefinitionSchema`, which made the schema-type-twin guard
|
|
8033
|
+
* (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
|
|
8034
|
+
* are not: it is two different concepts colliding on a name. Keep this type
|
|
8035
|
+
* under its own name rather than reusing `ClassMapDefinition` — reusing it
|
|
8036
|
+
* would either narrow every `ClassMapDefinition` consumer to the four
|
|
8037
|
+
* detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
|
|
8038
|
+
* schema exists for (see the "rejects a classMap whose target is not a
|
|
8039
|
+
* detection macro" test in `model-catalog-schema.test.ts`).
|
|
8040
|
+
*/
|
|
8041
|
+
var DetectionCatalogClassMapSchema = object({
|
|
8033
8042
|
mapping: record(string(), _enum([
|
|
8034
8043
|
"person",
|
|
8035
8044
|
"vehicle",
|
|
@@ -8121,6 +8130,12 @@ var ModelVariantGroupSchema = object({
|
|
|
8121
8130
|
*/
|
|
8122
8131
|
resolution: number().int().positive().optional()
|
|
8123
8132
|
});
|
|
8133
|
+
var ModelProviderIdSchema = _enum([
|
|
8134
|
+
"camstack",
|
|
8135
|
+
"frigate",
|
|
8136
|
+
"scrypted",
|
|
8137
|
+
"custom"
|
|
8138
|
+
]);
|
|
8124
8139
|
var ModelCatalogEntrySchema = object({
|
|
8125
8140
|
id: string(),
|
|
8126
8141
|
name: string(),
|
|
@@ -8218,11 +8233,17 @@ var ModelCatalogEntrySchema = object({
|
|
|
8218
8233
|
*/
|
|
8219
8234
|
group: ModelVariantGroupSchema.optional(),
|
|
8220
8235
|
/**
|
|
8236
|
+
* Catalog source for the pipeline stepper's provider-first picker. Absent on
|
|
8237
|
+
* built-in CamStack entries (treated as `camstack`) and on registry rows
|
|
8238
|
+
* persisted before this field existed (`inferModelProvider` fills those).
|
|
8239
|
+
*/
|
|
8240
|
+
provider: ModelProviderIdSchema.optional(),
|
|
8241
|
+
/**
|
|
8221
8242
|
* Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
|
|
8222
8243
|
* applies (Frigate / COCO public catalog). Set on a custom model whose raw
|
|
8223
8244
|
* labels already ARE the CamStack macros (Scrypted identity map).
|
|
8224
8245
|
*/
|
|
8225
|
-
classMap:
|
|
8246
|
+
classMap: DetectionCatalogClassMapSchema.optional()
|
|
8226
8247
|
});
|
|
8227
8248
|
var ConvertTargetSchema = discriminatedUnion("format", [object({
|
|
8228
8249
|
format: literal("openvino"),
|
|
@@ -8252,7 +8273,7 @@ var ModelConvertMetadataSchema = object({
|
|
|
8252
8273
|
"segmentation"
|
|
8253
8274
|
]),
|
|
8254
8275
|
faceAlignment: boolean().optional(),
|
|
8255
|
-
classMap:
|
|
8276
|
+
classMap: DetectionCatalogClassMapSchema.optional()
|
|
8256
8277
|
});
|
|
8257
8278
|
var ConvertResultSchema = object({
|
|
8258
8279
|
entry: ModelCatalogEntrySchema,
|
|
@@ -9115,7 +9136,7 @@ var AddonPageDeclarationSchema = object({
|
|
|
9115
9136
|
/** Display label for a CUSTOM `section` id (ignored for well-known ids). */
|
|
9116
9137
|
sectionLabel: string().optional()
|
|
9117
9138
|
});
|
|
9118
|
-
method(_void(), array(AddonPageDeclarationSchema).readonly());
|
|
9139
|
+
method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
|
|
9119
9140
|
var AddonHttpRouteSchema = object({
|
|
9120
9141
|
method: _enum([
|
|
9121
9142
|
"GET",
|
|
@@ -9350,7 +9371,7 @@ var WidgetMetadataSchema = object({
|
|
|
9350
9371
|
defaultColumns: number().int().min(1).max(12).default(6),
|
|
9351
9372
|
defaultRows: number().int().min(1).max(12).default(1)
|
|
9352
9373
|
});
|
|
9353
|
-
method(_void(), array(WidgetMetadataSchema).readonly());
|
|
9374
|
+
method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
|
|
9354
9375
|
/**
|
|
9355
9376
|
* `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
|
|
9356
9377
|
* surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
|
|
@@ -11023,7 +11044,7 @@ var CustomModelDescriptorSchema = object({
|
|
|
11023
11044
|
stepId: string(),
|
|
11024
11045
|
entry: ModelCatalogEntrySchema
|
|
11025
11046
|
});
|
|
11026
|
-
method(_void(), array(CustomModelDescriptorSchema).readonly());
|
|
11047
|
+
method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
|
|
11027
11048
|
/**
|
|
11028
11049
|
* Query filter for settings-store collections.
|
|
11029
11050
|
*/
|
|
@@ -11110,7 +11131,8 @@ method(object({
|
|
|
11110
11131
|
}), _void(), { kind: "mutation" }), method(object({
|
|
11111
11132
|
namespace: string().optional(),
|
|
11112
11133
|
collection: string(),
|
|
11113
|
-
filter: QueryFilterSchema.optional()
|
|
11134
|
+
filter: QueryFilterSchema.optional(),
|
|
11135
|
+
columns: array(string()).readonly().optional()
|
|
11114
11136
|
}), array(SettingsRecordSchema).readonly()), method(object({
|
|
11115
11137
|
namespace: string().optional(),
|
|
11116
11138
|
collection: string(),
|
|
@@ -11173,46 +11195,87 @@ var EngineInfoSchema = object({
|
|
|
11173
11195
|
kind: _enum(["relational", "vector"]),
|
|
11174
11196
|
displayName: string()
|
|
11175
11197
|
});
|
|
11176
|
-
method(_void(), EngineInfoSchema), method(object({
|
|
11198
|
+
method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
|
|
11177
11199
|
namespace: string().optional(),
|
|
11178
11200
|
collection: string(),
|
|
11179
11201
|
key: string()
|
|
11180
|
-
}), unknown()), method(object({
|
|
11202
|
+
}), unknown(), { auth: "admin" }), method(object({
|
|
11181
11203
|
namespace: string().optional(),
|
|
11182
11204
|
collection: string(),
|
|
11183
11205
|
key: string(),
|
|
11184
11206
|
value: unknown()
|
|
11185
|
-
}), _void(), {
|
|
11207
|
+
}), _void(), {
|
|
11208
|
+
kind: "mutation",
|
|
11209
|
+
auth: "admin"
|
|
11210
|
+
}), method(object({
|
|
11186
11211
|
namespace: string().optional(),
|
|
11187
11212
|
collection: string(),
|
|
11188
|
-
filter: QueryFilterSchema.optional()
|
|
11189
|
-
|
|
11213
|
+
filter: QueryFilterSchema.optional(),
|
|
11214
|
+
/**
|
|
11215
|
+
* SQL-level column projection — MUST mirror `settings-store.query`.
|
|
11216
|
+
*
|
|
11217
|
+
* ⚠ An earlier version of this comment blamed Zod stripping, and that
|
|
11218
|
+
* was wrong — corrected 2026-08-26 after the hop map
|
|
11219
|
+
* (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
|
|
11220
|
+
* There is **no Zod parse at all** between the door and the engine: the
|
|
11221
|
+
* dispatcher forwards the payload verbatim and UDS carries it whole. A
|
|
11222
|
+
* field declared here reaches `SqliteSettingsBackend` either way.
|
|
11223
|
+
*
|
|
11224
|
+
* What actually lost `columns` was the THIRD declaration of this shape:
|
|
11225
|
+
* `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
|
|
11226
|
+
* interface the engine destructures from. The field existed on both
|
|
11227
|
+
* schemas and the engine still never read it, because nothing checks a
|
|
11228
|
+
* registered provider against `InferProvider<cap>` —
|
|
11229
|
+
* `ProviderRegistration.provider` is typed `object`.
|
|
11230
|
+
*
|
|
11231
|
+
* It is declared here anyway, and must stay in step with
|
|
11232
|
+
* `settings-store.query`: a caller reading only the cap definitions has
|
|
11233
|
+
* to be able to see that this call carries a projection.
|
|
11234
|
+
* `data-door-schema-parity.spec.ts` keeps the two aligned.
|
|
11235
|
+
*/
|
|
11236
|
+
columns: array(string()).readonly().optional()
|
|
11237
|
+
}), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
|
|
11190
11238
|
namespace: string().optional(),
|
|
11191
11239
|
collection: string(),
|
|
11192
11240
|
record: SettingsRecordSchema
|
|
11193
|
-
}), _void(), {
|
|
11241
|
+
}), _void(), {
|
|
11242
|
+
kind: "mutation",
|
|
11243
|
+
auth: "admin"
|
|
11244
|
+
}), method(object({
|
|
11194
11245
|
namespace: string().optional(),
|
|
11195
11246
|
collection: string(),
|
|
11196
11247
|
id: string(),
|
|
11197
11248
|
data: record(string(), unknown())
|
|
11198
|
-
}), _void(), {
|
|
11249
|
+
}), _void(), {
|
|
11250
|
+
kind: "mutation",
|
|
11251
|
+
auth: "admin"
|
|
11252
|
+
}), method(object({
|
|
11199
11253
|
namespace: string().optional(),
|
|
11200
11254
|
collection: string(),
|
|
11201
11255
|
key: string()
|
|
11202
|
-
}), _void(), {
|
|
11256
|
+
}), _void(), {
|
|
11257
|
+
kind: "mutation",
|
|
11258
|
+
auth: "admin"
|
|
11259
|
+
}), method(object({
|
|
11203
11260
|
namespace: string().optional(),
|
|
11204
11261
|
collection: string(),
|
|
11205
11262
|
filter: MutationFilterSchema
|
|
11206
|
-
}), object({ deleted: number().int() }), {
|
|
11263
|
+
}), object({ deleted: number().int() }), {
|
|
11264
|
+
kind: "mutation",
|
|
11265
|
+
auth: "admin"
|
|
11266
|
+
}), method(object({
|
|
11207
11267
|
namespace: string().optional(),
|
|
11208
11268
|
collection: string(),
|
|
11209
11269
|
filter: MutationFilterSchema,
|
|
11210
11270
|
data: record(string(), unknown())
|
|
11211
|
-
}), object({ updated: number().int() }), {
|
|
11271
|
+
}), object({ updated: number().int() }), {
|
|
11272
|
+
kind: "mutation",
|
|
11273
|
+
auth: "admin"
|
|
11274
|
+
}), method(object({
|
|
11212
11275
|
namespace: string().optional(),
|
|
11213
11276
|
collection: string(),
|
|
11214
11277
|
filter: QueryFilterSchema.optional()
|
|
11215
|
-
}), number()), method(object({
|
|
11278
|
+
}), number(), { auth: "admin" }), method(object({
|
|
11216
11279
|
namespace: string().optional(),
|
|
11217
11280
|
collection: string(),
|
|
11218
11281
|
field: string(),
|
|
@@ -11222,15 +11285,18 @@ method(_void(), EngineInfoSchema), method(object({
|
|
|
11222
11285
|
}), array(object({
|
|
11223
11286
|
bucket: number().int(),
|
|
11224
11287
|
count: number().int()
|
|
11225
|
-
})).readonly()), method(object({
|
|
11288
|
+
})).readonly(), { auth: "admin" }), method(object({
|
|
11226
11289
|
namespace: string().optional(),
|
|
11227
11290
|
collection: string()
|
|
11228
|
-
}), boolean()), method(object({
|
|
11291
|
+
}), boolean(), { auth: "admin" }), method(object({
|
|
11229
11292
|
namespace: string().optional(),
|
|
11230
11293
|
collection: string(),
|
|
11231
11294
|
columns: array(CollectionColumnSchema).readonly(),
|
|
11232
11295
|
indexes: array(CollectionIndexSchema).readonly().optional()
|
|
11233
|
-
}), _void(), {
|
|
11296
|
+
}), _void(), {
|
|
11297
|
+
kind: "mutation",
|
|
11298
|
+
auth: "admin"
|
|
11299
|
+
});
|
|
11234
11300
|
/**
|
|
11235
11301
|
* shm ring usage stats for a `frameSink: 'shm'` decoder session —
|
|
11236
11302
|
* exposed via `decoder.getShmStats` so downstream consumers can
|
|
@@ -12075,6 +12141,27 @@ var LinkedDeviceSchema = object({
|
|
|
12075
12141
|
features: array(string()),
|
|
12076
12142
|
producesTrackedEvents: boolean().optional()
|
|
12077
12143
|
});
|
|
12144
|
+
/** One camera's resolved linked set, tagged with the camera it belongs to.
|
|
12145
|
+
* The batch answer needs the tag; the single-device answer already has it
|
|
12146
|
+
* from the input, which is why `getLinkedDevices` keeps the untagged shape. */
|
|
12147
|
+
var LinkedDevicesForDeviceSchema = object({
|
|
12148
|
+
deviceId: number(),
|
|
12149
|
+
mode: LinkedDevicesModeSchema,
|
|
12150
|
+
devices: array(LinkedDeviceSchema)
|
|
12151
|
+
});
|
|
12152
|
+
/** One device's binding map — the shape `getBindings`, `getBindingsBatch` and
|
|
12153
|
+
* `getAllBindings` all answer in. Declared once: three copies of the same
|
|
12154
|
+
* object literal is exactly how the three drift apart. */
|
|
12155
|
+
var DeviceBindingsForDeviceSchema = object({
|
|
12156
|
+
deviceId: number(),
|
|
12157
|
+
entries: array(object({
|
|
12158
|
+
capName: string(),
|
|
12159
|
+
kind: _enum(["native", "wrapped"]),
|
|
12160
|
+
providerAddonId: string(),
|
|
12161
|
+
providerNodeId: string(),
|
|
12162
|
+
nativeAddonId: string()
|
|
12163
|
+
}))
|
|
12164
|
+
});
|
|
12078
12165
|
var SavedDeviceRowSchema = object({
|
|
12079
12166
|
/** Numeric id reserved at allocateDeviceId time. */
|
|
12080
12167
|
id: number(),
|
|
@@ -12300,11 +12387,25 @@ method(object({
|
|
|
12300
12387
|
projection: _enum(["full", "slim"]).optional(),
|
|
12301
12388
|
/** Return only camera devices. Filtering server-side instead of
|
|
12302
12389
|
* shipping 293 rows to find 12. */
|
|
12303
|
-
isCamera: boolean().optional()
|
|
12390
|
+
isCamera: boolean().optional(),
|
|
12391
|
+
/**
|
|
12392
|
+
* Return only these device ids. For the caller that already KNOWS the
|
|
12393
|
+
* handful it wants and needs a field the id-bearing answer does not
|
|
12394
|
+
* carry — the viewer's linked-devices panel joins `type` and `online`
|
|
12395
|
+
* onto ~8 linked ids and, unfiltered, dragged the fleet across to do
|
|
12396
|
+
* it: 433 KB slim / 958 KB full for 967 devices, on a query that
|
|
12397
|
+
* refetches on the reconcile interval, on a phone.
|
|
12398
|
+
*
|
|
12399
|
+
* Safe to send at a hub that predates it: Zod STRIPS unknown input
|
|
12400
|
+
* keys rather than rejecting them (verified against the live hub
|
|
12401
|
+
* 2026-08-25 — 967 rows came back), so an old hub answers exactly what
|
|
12402
|
+
* it answers today and the caller filters as it already does.
|
|
12403
|
+
*/
|
|
12404
|
+
deviceIds: array(number()).optional()
|
|
12304
12405
|
}), array(DeviceInfoSchema)), method(object({ deviceId: number() }), DeviceInfoSchema.nullable()), method(object({ parentDeviceId: number() }), array(DeviceInfoSchema)), method(object({ deviceId: number() }), object({
|
|
12305
12406
|
mode: LinkedDevicesModeSchema,
|
|
12306
12407
|
devices: array(LinkedDeviceSchema)
|
|
12307
|
-
})), method(object({ deviceId: number() }), array(StreamSourceEntrySchema$1)), method(object({ deviceId: number() }), array(ConfigEntrySchema)), method(object({ deviceId: number() }), ConfigUISchemaOutput), method(object({
|
|
12408
|
+
})), 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({
|
|
12308
12409
|
deviceId: number(),
|
|
12309
12410
|
values: record(string(), unknown())
|
|
12310
12411
|
}), object({ success: literal(true) }), {
|
|
@@ -12331,25 +12432,7 @@ method(object({
|
|
|
12331
12432
|
}), method(object({ deviceId: number() }), array(StreamProbeResultSchema), {
|
|
12332
12433
|
kind: "mutation",
|
|
12333
12434
|
auth: "admin"
|
|
12334
|
-
}), method(object({ deviceId: number() }), object({
|
|
12335
|
-
deviceId: number(),
|
|
12336
|
-
entries: array(object({
|
|
12337
|
-
capName: string(),
|
|
12338
|
-
kind: _enum(["native", "wrapped"]),
|
|
12339
|
-
providerAddonId: string(),
|
|
12340
|
-
providerNodeId: string(),
|
|
12341
|
-
nativeAddonId: string()
|
|
12342
|
-
}))
|
|
12343
|
-
})), method(object({}), array(object({
|
|
12344
|
-
deviceId: number(),
|
|
12345
|
-
entries: array(object({
|
|
12346
|
-
capName: string(),
|
|
12347
|
-
kind: _enum(["native", "wrapped"]),
|
|
12348
|
-
providerAddonId: string(),
|
|
12349
|
-
providerNodeId: string(),
|
|
12350
|
-
nativeAddonId: string()
|
|
12351
|
-
}))
|
|
12352
|
-
}))), method(object({
|
|
12435
|
+
}), method(object({ deviceId: number() }), DeviceBindingsForDeviceSchema), method(object({ deviceIds: array(number()) }), array(DeviceBindingsForDeviceSchema)), method(object({}), array(DeviceBindingsForDeviceSchema)), method(object({
|
|
12353
12436
|
deviceId: number(),
|
|
12354
12437
|
capName: string(),
|
|
12355
12438
|
wrapperAddonId: string(),
|
|
@@ -12520,7 +12603,7 @@ method(object({
|
|
|
12520
12603
|
crop: _instanceof(Uint8Array),
|
|
12521
12604
|
width: number(),
|
|
12522
12605
|
height: number()
|
|
12523
|
-
}), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
|
|
12606
|
+
}), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
|
|
12524
12607
|
/**
|
|
12525
12608
|
* filesystem-browse — per-node capability for browsing the node's local
|
|
12526
12609
|
* filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
|
|
@@ -12813,19 +12896,22 @@ method(LlmGenerateBaseInputSchema.extend({
|
|
|
12813
12896
|
runtime: ManagedRuntimeConfigSchema,
|
|
12814
12897
|
/** The managed profile's timeout, threaded by the hub provider. */
|
|
12815
12898
|
timeoutMs: number().int().positive().optional()
|
|
12816
|
-
}), LlmGenerateResultSchema, {
|
|
12899
|
+
}), LlmGenerateResultSchema, {
|
|
12900
|
+
kind: "mutation",
|
|
12901
|
+
auth: "admin"
|
|
12902
|
+
}), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
|
|
12817
12903
|
kind: "mutation",
|
|
12818
12904
|
auth: "admin"
|
|
12819
12905
|
}), method(object({}), _void(), {
|
|
12820
12906
|
kind: "mutation",
|
|
12821
12907
|
auth: "admin"
|
|
12822
|
-
}), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
|
|
12908
|
+
}), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
|
|
12823
12909
|
kind: "mutation",
|
|
12824
12910
|
auth: "admin"
|
|
12825
12911
|
}), method(object({ file: string() }), _void(), {
|
|
12826
12912
|
kind: "mutation",
|
|
12827
12913
|
auth: "admin"
|
|
12828
|
-
}), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
|
|
12914
|
+
}), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
|
|
12829
12915
|
/**
|
|
12830
12916
|
* `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
|
|
12831
12917
|
* methods concat-fan across providers; single-row methods route to ONE
|
|
@@ -14759,12 +14845,15 @@ var NcOccupancyConditionSchema = object({
|
|
|
14759
14845
|
* there is no second switch that can disagree with the first and every rule
|
|
14760
14846
|
* authored before the decision migrates for free (`audioModeOf`):
|
|
14761
14847
|
*
|
|
14762
|
-
* - **LABEL mode — `labels` present.** The rule fires
|
|
14763
|
-
*
|
|
14764
|
-
* `hitPercent` and `samplingSeconds` are ignored
|
|
14765
|
-
*
|
|
14766
|
-
*
|
|
14767
|
-
*
|
|
14848
|
+
* - **LABEL mode — `labels` present.** The rule fires when `confirmHits`
|
|
14849
|
+
* labelled frames land inside `confirmWindowSec` (default 2 in 5 s).
|
|
14850
|
+
* `hitPercent` and `samplingSeconds` are still ignored — a percentage of
|
|
14851
|
+
* frames is the wrong question for a classifier that labels 1–3 frames
|
|
14852
|
+
* per episode. The count window is the brake that drops a single-frame
|
|
14853
|
+
* false positive; the rule's own `throttle` cooldown is the other. The
|
|
14854
|
+
* per-label confidence floor is the analyzer's (`classificationMinScore`,
|
|
14855
|
+
* per device) — a label only reaches this condition if the classifier was
|
|
14856
|
+
* already confident enough. `confirmHits: 1` restores first-frame fire.
|
|
14768
14857
|
* - **LEVEL mode — `dbThreshold` present, no labels.** The sampling window IS
|
|
14769
14858
|
* the condition: at least `hitPercent`% of the samples over
|
|
14770
14859
|
* `samplingSeconds` must be at or above `dbThreshold` dBFS (see
|
|
@@ -14791,14 +14880,22 @@ var NcOccupancyConditionSchema = object({
|
|
|
14791
14880
|
* an operator who typed `dog` mean the same thing.
|
|
14792
14881
|
*/
|
|
14793
14882
|
var NcAudioConditionSchema = object({
|
|
14794
|
-
/** LABEL MODE: audio macro labels. Present ⇒
|
|
14883
|
+
/** LABEL MODE: audio macro labels. Present ⇒ count-in-window confirm. */
|
|
14795
14884
|
labels: array(string().min(1)).min(1).optional(),
|
|
14796
14885
|
/** LEVEL MODE: floor in dBFS (negative-going, `0` = full scale). */
|
|
14797
14886
|
dbThreshold: number().min(-96).max(0).optional(),
|
|
14798
14887
|
/** LEVEL MODE ONLY: percentage of the window's samples that must be hits (1–100). */
|
|
14799
14888
|
hitPercent: number().int().min(1).max(100).default(60),
|
|
14800
14889
|
/** LEVEL MODE ONLY: length of the sampling window in seconds. */
|
|
14801
|
-
samplingSeconds: number().int().min(1).max(300).default(10)
|
|
14890
|
+
samplingSeconds: number().int().min(1).max(300).default(10),
|
|
14891
|
+
/**
|
|
14892
|
+
* LABEL MODE: how many labelled frames must land inside
|
|
14893
|
+
* {@link NcAudioConditionSchema.shape.confirmWindowSec} before dispatch.
|
|
14894
|
+
* Absent ⇒ 2 (the matcher default). `1` is first-frame fire.
|
|
14895
|
+
*/
|
|
14896
|
+
confirmHits: number().int().min(1).max(20).optional(),
|
|
14897
|
+
/** LABEL MODE: the window those frames must share, in seconds. Absent ⇒ 5. */
|
|
14898
|
+
confirmWindowSec: number().int().min(1).max(60).optional()
|
|
14802
14899
|
});
|
|
14803
14900
|
/**
|
|
14804
14901
|
* Which zone-crossing DIRECTION a rule accepts (`ObjectEvent.zoneCrossing`).
|
|
@@ -16325,7 +16422,7 @@ var OauthIntegrationDescriptorSchema = object({
|
|
|
16325
16422
|
*/
|
|
16326
16423
|
refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
|
|
16327
16424
|
});
|
|
16328
|
-
method(_void(), OauthIntegrationDescriptorSchema);
|
|
16425
|
+
method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
|
|
16329
16426
|
/**
|
|
16330
16427
|
* pipeline-analytics — device-scoped wrapper cap. Refines raw
|
|
16331
16428
|
* per-frame detections emitted by the pipeline runner into tracked
|
|
@@ -17172,6 +17269,46 @@ var RecentTracksPageSchema = object({
|
|
|
17172
17269
|
/** Cursor for the next page, or null when this page is the last. */
|
|
17173
17270
|
nextCursor: string().nullable()
|
|
17174
17271
|
});
|
|
17272
|
+
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
17273
|
+
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
17274
|
+
var AnalyticsGroupRecordSchema = object({
|
|
17275
|
+
id: string(),
|
|
17276
|
+
deviceId: number().int(),
|
|
17277
|
+
openedAt: number().int(),
|
|
17278
|
+
closedAt: number().int(),
|
|
17279
|
+
timestamp: number().int(),
|
|
17280
|
+
memberCount: number().int(),
|
|
17281
|
+
memberTrackIds: array(string()).readonly(),
|
|
17282
|
+
className: string(),
|
|
17283
|
+
classes: array(string()).readonly(),
|
|
17284
|
+
/** Relative event-media path, or null when the group has no picture yet. */
|
|
17285
|
+
mediaUrl: string().nullable(),
|
|
17286
|
+
singleton: boolean()
|
|
17287
|
+
});
|
|
17288
|
+
var AnalyticsGroupMemberSchema = object({
|
|
17289
|
+
trackId: string(),
|
|
17290
|
+
deviceId: number().int(),
|
|
17291
|
+
className: string(),
|
|
17292
|
+
firstSeen: number().int(),
|
|
17293
|
+
lastSeen: number().int(),
|
|
17294
|
+
mediaUrl: string().nullable()
|
|
17295
|
+
});
|
|
17296
|
+
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
17297
|
+
var ListGroupsQueryInput = object({
|
|
17298
|
+
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
17299
|
+
deviceIds: array(number()),
|
|
17300
|
+
/** Window lower bound on `closedAt` (inclusive). */
|
|
17301
|
+
since: number().optional(),
|
|
17302
|
+
/** Window upper bound on `openedAt` (inclusive). */
|
|
17303
|
+
until: number().optional(),
|
|
17304
|
+
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
17305
|
+
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
17306
|
+
cursor: string().optional()
|
|
17307
|
+
});
|
|
17308
|
+
var ListGroupsPageSchema = object({
|
|
17309
|
+
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
17310
|
+
nextCursor: string().nullable()
|
|
17311
|
+
});
|
|
17175
17312
|
var KeyEventQueryInput = object({
|
|
17176
17313
|
deviceId: number(),
|
|
17177
17314
|
/** Window lower bound (track firstSeen ≥ since). */
|
|
@@ -17247,7 +17384,9 @@ var TrackCascadeCountsSchema = object({
|
|
|
17247
17384
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
17248
17385
|
plates: number().int(),
|
|
17249
17386
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
17250
|
-
embeddings: number().int()
|
|
17387
|
+
embeddings: number().int(),
|
|
17388
|
+
/** Group membership + group rows removed with their last member (best-effort). */
|
|
17389
|
+
groups: number().int()
|
|
17251
17390
|
});
|
|
17252
17391
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
17253
17392
|
var DiskReconcileCountsSchema = object({
|
|
@@ -17393,7 +17532,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
17393
17532
|
* stationary registry). Default false: the timeline lists passages,
|
|
17394
17533
|
* not parking records (operator decision, 2026-08-15). */
|
|
17395
17534
|
includeStationary: boolean().optional()
|
|
17396
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
17535
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
|
|
17536
|
+
deviceId: number(),
|
|
17537
|
+
groupId: string().min(1)
|
|
17538
|
+
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
17397
17539
|
kind: "mutation",
|
|
17398
17540
|
auth: "admin"
|
|
17399
17541
|
}), 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({
|
|
@@ -17475,6 +17617,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
17475
17617
|
}), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
17476
17618
|
kind: "mutation",
|
|
17477
17619
|
auth: "admin"
|
|
17620
|
+
}), method(RelocateMediaInputSchema, object({ jobId: string() }), {
|
|
17621
|
+
kind: "mutation",
|
|
17622
|
+
auth: "admin"
|
|
17623
|
+
}), method(object({}), array(RelocateJobSchema).readonly(), {
|
|
17624
|
+
kind: "query",
|
|
17625
|
+
auth: "admin"
|
|
17626
|
+
}), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
17627
|
+
kind: "mutation",
|
|
17628
|
+
auth: "admin"
|
|
17478
17629
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
17479
17630
|
kind: "query",
|
|
17480
17631
|
auth: "admin"
|
|
@@ -17629,6 +17780,11 @@ object({
|
|
|
17629
17780
|
"jpeg"
|
|
17630
17781
|
])
|
|
17631
17782
|
});
|
|
17783
|
+
/**
|
|
17784
|
+
* Process-local frame identity. It is serializable so it can ride an in-process
|
|
17785
|
+
* capability call, but `registryId` deliberately prevents resolution in any
|
|
17786
|
+
* other process or execution group.
|
|
17787
|
+
*/
|
|
17632
17788
|
var FrameRefSchema = object({
|
|
17633
17789
|
registryId: string().min(1),
|
|
17634
17790
|
id: string().min(1),
|
|
@@ -17703,7 +17859,8 @@ var PipelineModelOptionSchema = object({
|
|
|
17703
17859
|
sizeMB: number()
|
|
17704
17860
|
})),
|
|
17705
17861
|
group: ModelVariantGroupSchema.optional(),
|
|
17706
|
-
legacy: boolean().optional()
|
|
17862
|
+
legacy: boolean().optional(),
|
|
17863
|
+
provider: ModelProviderIdSchema.optional()
|
|
17707
17864
|
});
|
|
17708
17865
|
var ConfigFieldBridge = custom();
|
|
17709
17866
|
var PipelineAddonSchemaSchema = object({
|
|
@@ -19833,7 +19990,7 @@ method(object({
|
|
|
19833
19990
|
* linking rather than produce an eternal token.
|
|
19834
19991
|
*/
|
|
19835
19992
|
ttlSec: union([number().int().positive(), literal("never")]).optional()
|
|
19836
|
-
}), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
|
|
19993
|
+
}), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
|
|
19837
19994
|
var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
19838
19995
|
providerId: string().min(1),
|
|
19839
19996
|
displayName: string().min(1),
|
|
@@ -19928,10 +20085,13 @@ var EvictResultSchema = object({
|
|
|
19928
20085
|
/** True when the provider has nothing left it is willing to drop on this location. */
|
|
19929
20086
|
exhausted: boolean()
|
|
19930
20087
|
});
|
|
19931
|
-
method(object({ locationId: string() }), EvictableUsageSchema), method(object({
|
|
20088
|
+
method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
|
|
19932
20089
|
locationId: string(),
|
|
19933
20090
|
targetBytes: number().int().positive()
|
|
19934
|
-
}), EvictResultSchema, {
|
|
20091
|
+
}), EvictResultSchema, {
|
|
20092
|
+
kind: "mutation",
|
|
20093
|
+
auth: "admin"
|
|
20094
|
+
});
|
|
19935
20095
|
method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
|
|
19936
20096
|
kind: "mutation",
|
|
19937
20097
|
auth: "admin"
|
|
@@ -19991,26 +20151,50 @@ var ReadChunkInputSchema = object({
|
|
|
19991
20151
|
length: number()
|
|
19992
20152
|
});
|
|
19993
20153
|
var EndDownloadInputSchema = object({ downloadId: string() });
|
|
19994
|
-
method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
|
|
20154
|
+
method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
|
|
19995
20155
|
location: StorageLocationSchema,
|
|
19996
20156
|
relativePath: string()
|
|
19997
|
-
}), string()), method(object({
|
|
20157
|
+
}), string(), { auth: "admin" }), method(object({
|
|
19998
20158
|
location: StorageLocationSchema,
|
|
19999
20159
|
relativePath: string(),
|
|
20000
20160
|
data: _instanceof(Uint8Array)
|
|
20001
|
-
}), _void(), {
|
|
20161
|
+
}), _void(), {
|
|
20162
|
+
kind: "mutation",
|
|
20163
|
+
auth: "admin"
|
|
20164
|
+
}), method(object({
|
|
20002
20165
|
location: StorageLocationSchema,
|
|
20003
20166
|
relativePath: string()
|
|
20004
|
-
}), _instanceof(Uint8Array)), method(object({
|
|
20167
|
+
}), _instanceof(Uint8Array), { auth: "admin" }), method(object({
|
|
20005
20168
|
location: StorageLocationSchema,
|
|
20006
20169
|
relativePath: string()
|
|
20007
|
-
}), boolean()), method(object({
|
|
20170
|
+
}), boolean(), { auth: "admin" }), method(object({
|
|
20008
20171
|
location: StorageLocationSchema,
|
|
20009
20172
|
prefix: string().optional()
|
|
20010
|
-
}), array(string()).readonly()), method(object({
|
|
20173
|
+
}), array(string()).readonly(), { auth: "admin" }), method(object({
|
|
20011
20174
|
location: StorageLocationSchema,
|
|
20012
20175
|
relativePath: string()
|
|
20013
|
-
}), _void(), {
|
|
20176
|
+
}), _void(), {
|
|
20177
|
+
kind: "mutation",
|
|
20178
|
+
auth: "admin"
|
|
20179
|
+
}), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
|
|
20180
|
+
kind: "mutation",
|
|
20181
|
+
auth: "admin"
|
|
20182
|
+
}), method(WriteChunkInputSchema, _void(), {
|
|
20183
|
+
kind: "mutation",
|
|
20184
|
+
auth: "admin"
|
|
20185
|
+
}), method(FinalizeUploadInputSchema, _void(), {
|
|
20186
|
+
kind: "mutation",
|
|
20187
|
+
auth: "admin"
|
|
20188
|
+
}), method(AbortUploadInputSchema, _void(), {
|
|
20189
|
+
kind: "mutation",
|
|
20190
|
+
auth: "admin"
|
|
20191
|
+
}), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
|
|
20192
|
+
kind: "mutation",
|
|
20193
|
+
auth: "admin"
|
|
20194
|
+
}), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
|
|
20195
|
+
kind: "mutation",
|
|
20196
|
+
auth: "admin"
|
|
20197
|
+
});
|
|
20014
20198
|
/** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
|
|
20015
20199
|
var ProfileSettingsSchemaBridge = unknown().nullable();
|
|
20016
20200
|
var ProfileSettingsBagSchema = record(string(), unknown());
|
|
@@ -20268,7 +20452,8 @@ method(object({
|
|
|
20268
20452
|
access: "create"
|
|
20269
20453
|
}), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
|
|
20270
20454
|
kind: "mutation",
|
|
20271
|
-
access: "view"
|
|
20455
|
+
access: "view",
|
|
20456
|
+
auth: "admin"
|
|
20272
20457
|
}), method(object({
|
|
20273
20458
|
/** Required — the user the assertion belongs to (verified). */
|
|
20274
20459
|
userId: string(),
|
|
@@ -20276,10 +20461,12 @@ method(object({
|
|
|
20276
20461
|
response: record(string(), unknown())
|
|
20277
20462
|
}), object({ verified: boolean() }), {
|
|
20278
20463
|
kind: "mutation",
|
|
20279
|
-
access: "view"
|
|
20464
|
+
access: "view",
|
|
20465
|
+
auth: "admin"
|
|
20280
20466
|
}), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
|
|
20281
20467
|
kind: "mutation",
|
|
20282
|
-
access: "view"
|
|
20468
|
+
access: "view",
|
|
20469
|
+
auth: "admin"
|
|
20283
20470
|
}), method(object({
|
|
20284
20471
|
/** AuthenticationResponseJSON from the browser. */
|
|
20285
20472
|
response: record(string(), unknown()) }), object({
|
|
@@ -20287,7 +20474,8 @@ response: record(string(), unknown()) }), object({
|
|
|
20287
20474
|
userId: string().nullable()
|
|
20288
20475
|
}), {
|
|
20289
20476
|
kind: "mutation",
|
|
20290
|
-
access: "view"
|
|
20477
|
+
access: "view",
|
|
20478
|
+
auth: "admin"
|
|
20291
20479
|
}), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
|
|
20292
20480
|
userId: string(),
|
|
20293
20481
|
credentialId: string()
|
|
@@ -20459,7 +20647,19 @@ var VectorStatsResultSchema = object({
|
|
|
20459
20647
|
/** False when the backend ranks approximately. */
|
|
20460
20648
|
exact: boolean()
|
|
20461
20649
|
});
|
|
20462
|
-
method(VectorDeclareIndexInputSchema, _void(), {
|
|
20650
|
+
method(VectorDeclareIndexInputSchema, _void(), {
|
|
20651
|
+
kind: "mutation",
|
|
20652
|
+
auth: "admin"
|
|
20653
|
+
}), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
|
|
20654
|
+
kind: "mutation",
|
|
20655
|
+
auth: "admin"
|
|
20656
|
+
}), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
|
|
20657
|
+
kind: "mutation",
|
|
20658
|
+
auth: "admin"
|
|
20659
|
+
}), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
|
|
20660
|
+
kind: "mutation",
|
|
20661
|
+
auth: "admin"
|
|
20662
|
+
}), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
|
|
20463
20663
|
var ClipSchema = object({
|
|
20464
20664
|
/** Opaque, provider-namespaced id. The default provider encodes the time
|
|
20465
20665
|
* window so `getClipPlayback` is self-contained (no event re-query). */
|
|
@@ -22912,7 +23112,27 @@ var MediaFileLiteSchema$1 = object({
|
|
|
22912
23112
|
sizeBytes: number(),
|
|
22913
23113
|
timestamp: number()
|
|
22914
23114
|
});
|
|
22915
|
-
method(
|
|
23115
|
+
method(object({
|
|
23116
|
+
/**
|
|
23117
|
+
* Inline {@link IdentitySchema.coverBase64} on every row.
|
|
23118
|
+
*
|
|
23119
|
+
* Default `false`, the same inversion `listRecentFaces` and
|
|
23120
|
+
* `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
|
|
23121
|
+
* why the burden belongs on the caller that WANTS the bytes). Measured
|
|
23122
|
+
* on the live hub the same day: four identities cost 40,979 B with the
|
|
23123
|
+
* covers inline, ~10 KB of base64 per row, on a query this UI mounts
|
|
23124
|
+
* four times and the viewer holds at `staleTime: 30_000`.
|
|
23125
|
+
*
|
|
23126
|
+
* Nothing loses its avatar: `coverMediaKey` is already on every row and
|
|
23127
|
+
* the `event-media` plane serves that key `immutable` with an ETag.
|
|
23128
|
+
*
|
|
23129
|
+
* **This is an INPUT field, so it does not reach the addon until the
|
|
23130
|
+
* next train** — the hub router validates cap inputs against its own
|
|
23131
|
+
* compiled Zod and strips a key it does not know. Until then the
|
|
23132
|
+
* provider sees `undefined`, which resolves to `false`: the cheap shape
|
|
23133
|
+
* is what ships, and the opt-in becomes reachable when the train lands.
|
|
23134
|
+
*/
|
|
23135
|
+
includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
|
|
22916
23136
|
kind: "mutation",
|
|
22917
23137
|
auth: "admin"
|
|
22918
23138
|
}), method(object({
|
|
@@ -25800,7 +26020,14 @@ var PlateInfoSchema = object({
|
|
|
25800
26020
|
plateBbox: BoundingBoxSchema.optional(),
|
|
25801
26021
|
/** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
|
|
25802
26022
|
keyFrameMediaKey: string().optional(),
|
|
25803
|
-
base64: string().optional()
|
|
26023
|
+
base64: string().optional(),
|
|
26024
|
+
/**
|
|
26025
|
+
* Same crop as a data-plane URL, always present when the plate has a stored
|
|
26026
|
+
* crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
|
|
26027
|
+
* and `searchPlates` inline the crop only when their `includeCrops` input is
|
|
26028
|
+
* left at its `true` default.
|
|
26029
|
+
*/
|
|
26030
|
+
cropUrl: string().optional()
|
|
25804
26031
|
});
|
|
25805
26032
|
var MediaFileLiteSchema = object({
|
|
25806
26033
|
key: string(),
|
|
@@ -25818,14 +26045,34 @@ var PlateClusterSchema = object({
|
|
|
25818
26045
|
});
|
|
25819
26046
|
method(object({
|
|
25820
26047
|
deviceId: number().int().optional(),
|
|
25821
|
-
limit: number().int().positive().optional()
|
|
26048
|
+
limit: number().int().positive().optional(),
|
|
26049
|
+
/**
|
|
26050
|
+
* Inline the base64 crop on every row. Default `true` — the existing
|
|
26051
|
+
* behaviour, kept so no caller breaks.
|
|
26052
|
+
*
|
|
26053
|
+
* Set `false` once the caller renders {@link PlateInfo.cropUrl}.
|
|
26054
|
+
* Measured on the live hub at the 500 rows the Plates view asks for:
|
|
26055
|
+
* 879,403 B and 27.7 s with the crops inline, against a few KiB of
|
|
26056
|
+
* metadata without them — and the browser then caches the images.
|
|
26057
|
+
*
|
|
26058
|
+
* This is the plate twin of `faceGallery.listRecentFaces`'s option;
|
|
26059
|
+
* plates were the one gallery list left without it.
|
|
26060
|
+
*
|
|
26061
|
+
* **This is an INPUT field, so it does not reach the addon until the
|
|
26062
|
+
* next train.** The hub router validates cap inputs against its own
|
|
26063
|
+
* compiled Zod and strips a key it does not know. Until the train
|
|
26064
|
+
* ships, sending `false` is harmless and keeps the crops inline.
|
|
26065
|
+
*/
|
|
26066
|
+
includeCrops: boolean().optional()
|
|
25822
26067
|
}).optional(), array(PlateInfoSchema).readonly()), method(object({
|
|
25823
26068
|
deviceId: number().int(),
|
|
25824
26069
|
trackId: string()
|
|
25825
26070
|
}), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
|
|
25826
26071
|
text: string().min(1),
|
|
25827
26072
|
maxDistance: number().int().min(0).optional(),
|
|
25828
|
-
limit: number().int().positive().optional()
|
|
26073
|
+
limit: number().int().positive().optional(),
|
|
26074
|
+
/** See `listPlates.includeCrops`. Default `true`. */
|
|
26075
|
+
includeCrops: boolean().optional()
|
|
25829
26076
|
}), array(PlateInfoSchema).readonly()), method(object({
|
|
25830
26077
|
maxDistance: number().int().min(0).optional(),
|
|
25831
26078
|
minClusterSize: number().int().min(2).optional(),
|
|
@@ -25839,7 +26086,13 @@ method(object({
|
|
|
25839
26086
|
}), method(object({ plateId: string() }), _void(), {
|
|
25840
26087
|
kind: "mutation",
|
|
25841
26088
|
auth: "admin"
|
|
25842
|
-
}), method(
|
|
26089
|
+
}), method(object({
|
|
26090
|
+
/** Inline {@link VehicleSchema.coverBase64} on every row. Default
|
|
26091
|
+
* `false` — the vehicle twin of `faceGallery.listIdentities`'s
|
|
26092
|
+
* option; `coverMediaKey` + the `event-media` plane carry the picture.
|
|
26093
|
+
* INPUT field: stripped by the hub router until the train ships, which
|
|
26094
|
+
* resolves to `false` and is exactly the intended default. */
|
|
26095
|
+
includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
|
|
25843
26096
|
kind: "mutation",
|
|
25844
26097
|
auth: "admin"
|
|
25845
26098
|
}), method(object({
|
|
@@ -31324,6 +31577,12 @@ Object.freeze({
|
|
|
31324
31577
|
addonId: null,
|
|
31325
31578
|
access: "view"
|
|
31326
31579
|
},
|
|
31580
|
+
"deviceManager.getBindingsBatch": {
|
|
31581
|
+
capName: "device-manager",
|
|
31582
|
+
capScope: "system",
|
|
31583
|
+
addonId: null,
|
|
31584
|
+
access: "view"
|
|
31585
|
+
},
|
|
31327
31586
|
"deviceManager.getChildren": {
|
|
31328
31587
|
capName: "device-manager",
|
|
31329
31588
|
capScope: "system",
|
|
@@ -31384,6 +31643,12 @@ Object.freeze({
|
|
|
31384
31643
|
addonId: null,
|
|
31385
31644
|
access: "view"
|
|
31386
31645
|
},
|
|
31646
|
+
"deviceManager.getLinkedDevicesBatch": {
|
|
31647
|
+
capName: "device-manager",
|
|
31648
|
+
capScope: "system",
|
|
31649
|
+
addonId: null,
|
|
31650
|
+
access: "view"
|
|
31651
|
+
},
|
|
31387
31652
|
"deviceManager.getRoleDisplayDefaults": {
|
|
31388
31653
|
capName: "device-manager",
|
|
31389
31654
|
capScope: "system",
|
|
@@ -33088,6 +33353,12 @@ Object.freeze({
|
|
|
33088
33353
|
addonId: null,
|
|
33089
33354
|
access: "create"
|
|
33090
33355
|
},
|
|
33356
|
+
"pipelineAnalytics.cancelRelocateMedia": {
|
|
33357
|
+
capName: "pipeline-analytics",
|
|
33358
|
+
capScope: "device",
|
|
33359
|
+
addonId: null,
|
|
33360
|
+
access: "create"
|
|
33361
|
+
},
|
|
33091
33362
|
"pipelineAnalytics.cancelStorageMigrationMove": {
|
|
33092
33363
|
capName: "pipeline-analytics",
|
|
33093
33364
|
capScope: "device",
|
|
@@ -33154,6 +33425,12 @@ Object.freeze({
|
|
|
33154
33425
|
addonId: null,
|
|
33155
33426
|
access: "view"
|
|
33156
33427
|
},
|
|
33428
|
+
"pipelineAnalytics.getGroup": {
|
|
33429
|
+
capName: "pipeline-analytics",
|
|
33430
|
+
capScope: "device",
|
|
33431
|
+
addonId: null,
|
|
33432
|
+
access: "view"
|
|
33433
|
+
},
|
|
33157
33434
|
"pipelineAnalytics.getKeyEvents": {
|
|
33158
33435
|
capName: "pipeline-analytics",
|
|
33159
33436
|
capScope: "device",
|
|
@@ -33238,6 +33515,12 @@ Object.freeze({
|
|
|
33238
33515
|
addonId: null,
|
|
33239
33516
|
access: "view"
|
|
33240
33517
|
},
|
|
33518
|
+
"pipelineAnalytics.listGroups": {
|
|
33519
|
+
capName: "pipeline-analytics",
|
|
33520
|
+
capScope: "device",
|
|
33521
|
+
addonId: null,
|
|
33522
|
+
access: "view"
|
|
33523
|
+
},
|
|
33241
33524
|
"pipelineAnalytics.listOpsLog": {
|
|
33242
33525
|
capName: "pipeline-analytics",
|
|
33243
33526
|
capScope: "device",
|
|
@@ -33250,6 +33533,12 @@ Object.freeze({
|
|
|
33250
33533
|
addonId: null,
|
|
33251
33534
|
access: "view"
|
|
33252
33535
|
},
|
|
33536
|
+
"pipelineAnalytics.listRelocateMediaJobs": {
|
|
33537
|
+
capName: "pipeline-analytics",
|
|
33538
|
+
capScope: "device",
|
|
33539
|
+
addonId: null,
|
|
33540
|
+
access: "view"
|
|
33541
|
+
},
|
|
33253
33542
|
"pipelineAnalytics.listRetrainAnnotations": {
|
|
33254
33543
|
capName: "pipeline-analytics",
|
|
33255
33544
|
capScope: "device",
|
|
@@ -33328,6 +33617,12 @@ Object.freeze({
|
|
|
33328
33617
|
addonId: null,
|
|
33329
33618
|
access: "create"
|
|
33330
33619
|
},
|
|
33620
|
+
"pipelineAnalytics.relocateMedia": {
|
|
33621
|
+
capName: "pipeline-analytics",
|
|
33622
|
+
capScope: "device",
|
|
33623
|
+
addonId: null,
|
|
33624
|
+
access: "create"
|
|
33625
|
+
},
|
|
33331
33626
|
"pipelineAnalytics.restageRetrainTrack": {
|
|
33332
33627
|
capName: "pipeline-analytics",
|
|
33333
33628
|
capScope: "device",
|
|
@@ -36019,6 +36314,11 @@ Object.freeze({
|
|
|
36019
36314
|
form: "single",
|
|
36020
36315
|
optional: false
|
|
36021
36316
|
}],
|
|
36317
|
+
"deviceManager.getBindingsBatch": [{
|
|
36318
|
+
name: "deviceIds",
|
|
36319
|
+
form: "array",
|
|
36320
|
+
optional: false
|
|
36321
|
+
}],
|
|
36022
36322
|
"deviceManager.getChildren": [{
|
|
36023
36323
|
name: "parentDeviceId",
|
|
36024
36324
|
form: "single",
|
|
@@ -36064,6 +36364,11 @@ Object.freeze({
|
|
|
36064
36364
|
form: "single",
|
|
36065
36365
|
optional: false
|
|
36066
36366
|
}],
|
|
36367
|
+
"deviceManager.getLinkedDevicesBatch": [{
|
|
36368
|
+
name: "deviceIds",
|
|
36369
|
+
form: "array",
|
|
36370
|
+
optional: false
|
|
36371
|
+
}],
|
|
36067
36372
|
"deviceManager.getSettingsSchema": [{
|
|
36068
36373
|
name: "deviceId",
|
|
36069
36374
|
form: "single",
|
|
@@ -36084,6 +36389,11 @@ Object.freeze({
|
|
|
36084
36389
|
form: "single",
|
|
36085
36390
|
optional: false
|
|
36086
36391
|
}],
|
|
36392
|
+
"deviceManager.listAll": [{
|
|
36393
|
+
name: "deviceIds",
|
|
36394
|
+
form: "array",
|
|
36395
|
+
optional: true
|
|
36396
|
+
}],
|
|
36087
36397
|
"deviceManager.loadConfig": [{
|
|
36088
36398
|
name: "deviceId",
|
|
36089
36399
|
form: "single",
|
|
@@ -36657,6 +36967,11 @@ Object.freeze({
|
|
|
36657
36967
|
form: "single",
|
|
36658
36968
|
optional: false
|
|
36659
36969
|
}],
|
|
36970
|
+
"pipelineAnalytics.getGroup": [{
|
|
36971
|
+
name: "deviceId",
|
|
36972
|
+
form: "single",
|
|
36973
|
+
optional: false
|
|
36974
|
+
}],
|
|
36660
36975
|
"pipelineAnalytics.getKeyEvents": [{
|
|
36661
36976
|
name: "deviceId",
|
|
36662
36977
|
form: "single",
|
|
@@ -36712,6 +37027,11 @@ Object.freeze({
|
|
|
36712
37027
|
form: "array",
|
|
36713
37028
|
optional: false
|
|
36714
37029
|
}],
|
|
37030
|
+
"pipelineAnalytics.listGroups": [{
|
|
37031
|
+
name: "deviceIds",
|
|
37032
|
+
form: "array",
|
|
37033
|
+
optional: false
|
|
37034
|
+
}],
|
|
36715
37035
|
"pipelineAnalytics.listOpsLog": [{
|
|
36716
37036
|
name: "deviceId",
|
|
36717
37037
|
form: "single",
|