@camstack/addon-provider-unifi 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
|
@@ -5800,6 +5800,13 @@ var BaseAddon = class {
|
|
|
5800
5800
|
_readinessGeneration = typeof crypto !== "undefined" && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).slice(2, 14);
|
|
5801
5801
|
/** Capability names this addon registered at init — used to emit matching `down` events on shutdown. */
|
|
5802
5802
|
_registeredCapNames = [];
|
|
5803
|
+
/**
|
|
5804
|
+
* True only after `readAddonStore` actually answered. Constructor
|
|
5805
|
+
* defaults look like stored config when the store is down — a forked
|
|
5806
|
+
* addon that auto-starts from those defaults (cloudflare-tunnel quick
|
|
5807
|
+
* mode, 2026-08-25) is not "the operator chose this".
|
|
5808
|
+
*/
|
|
5809
|
+
settingsStoreReady = false;
|
|
5803
5810
|
/** Default config values. Provided via constructor. */
|
|
5804
5811
|
defaults;
|
|
5805
5812
|
constructor(defaults) {
|
|
@@ -6200,7 +6207,9 @@ var BaseAddon = class {
|
|
|
6200
6207
|
];
|
|
6201
6208
|
let lastErr;
|
|
6202
6209
|
for (let attempt = 0; attempt <= delaysMs.length; attempt++) try {
|
|
6203
|
-
|
|
6210
|
+
const stored = await settings.readAddonStore() ?? {};
|
|
6211
|
+
this.settingsStoreReady = true;
|
|
6212
|
+
return stored;
|
|
6204
6213
|
} catch (err) {
|
|
6205
6214
|
lastErr = err;
|
|
6206
6215
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -6208,6 +6217,7 @@ var BaseAddon = class {
|
|
|
6208
6217
|
if (attempt === delaysMs.length) break;
|
|
6209
6218
|
await new Promise((r) => setTimeout(r, delaysMs[attempt]));
|
|
6210
6219
|
}
|
|
6220
|
+
this.settingsStoreReady = false;
|
|
6211
6221
|
this._ctx?.logger?.warn?.("readAddonStore: settings-store unavailable after retries — using defaults", { meta: { error: lastErr instanceof Error ? lastErr.message : String(lastErr) } });
|
|
6212
6222
|
return {};
|
|
6213
6223
|
}
|
|
@@ -6619,7 +6629,7 @@ function method(input, output, options) {
|
|
|
6619
6629
|
input,
|
|
6620
6630
|
output,
|
|
6621
6631
|
kind: options?.kind ?? "query",
|
|
6622
|
-
auth: options
|
|
6632
|
+
...options?.auth !== void 0 ? { auth: options.auth } : {},
|
|
6623
6633
|
...options?.access !== void 0 ? { access: options.access } : {},
|
|
6624
6634
|
...options?.caller !== void 0 ? { caller: options.caller } : {},
|
|
6625
6635
|
timeoutMs: options?.timeoutMs
|
|
@@ -6643,7 +6653,7 @@ function event(data) {
|
|
|
6643
6653
|
}
|
|
6644
6654
|
var StaticDirOutputSchema$1 = object({ staticDir: string() });
|
|
6645
6655
|
var VersionOutputSchema$1 = object({ version: string() });
|
|
6646
|
-
method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
|
|
6656
|
+
method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
|
|
6647
6657
|
var DeviceType = /* @__PURE__ */ function(DeviceType) {
|
|
6648
6658
|
DeviceType["Camera"] = "camera";
|
|
6649
6659
|
DeviceType["Hub"] = "hub";
|
|
@@ -6964,7 +6974,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
|
|
|
6964
6974
|
}({});
|
|
6965
6975
|
var StaticDirOutputSchema = object({ staticDir: string() });
|
|
6966
6976
|
var VersionOutputSchema = object({ version: string() });
|
|
6967
|
-
method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
|
|
6977
|
+
method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
|
|
6968
6978
|
/**
|
|
6969
6979
|
* device-ops — device-scoped cap that unifies the per-IDevice operations
|
|
6970
6980
|
* previously routed through the `.device-ops` Moleculer bridge service.
|
|
@@ -7590,24 +7600,6 @@ var RecordingRetentionSchema = object({
|
|
|
7590
7600
|
maxSizeGb: number().min(0).optional()
|
|
7591
7601
|
});
|
|
7592
7602
|
/**
|
|
7593
|
-
* Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
|
|
7594
|
-
* sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
|
|
7595
|
-
* previews at. Five graduated steps; absent on a config = `standard` (the
|
|
7596
|
-
* shipped default, matching `sheet-geometry`/`sheet-composer`).
|
|
7597
|
-
*
|
|
7598
|
-
* Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
|
|
7599
|
-
* Each window's index sidecar carries its own tile dims, so a camera whose
|
|
7600
|
-
* preset changed over time renders every historical window at the dims it was
|
|
7601
|
-
* written with.
|
|
7602
|
-
*/
|
|
7603
|
-
var ScrubThumbnailPresetSchema = _enum([
|
|
7604
|
-
"minimal",
|
|
7605
|
-
"low",
|
|
7606
|
-
"standard",
|
|
7607
|
-
"high",
|
|
7608
|
-
"max"
|
|
7609
|
-
]);
|
|
7610
|
-
/**
|
|
7611
7603
|
* The full per-camera recording intent — the wire shape of a RecordingTarget.
|
|
7612
7604
|
*
|
|
7613
7605
|
* `bands` is the ONLY authored recording intent: what to record, when, and on
|
|
@@ -7615,7 +7607,11 @@ var ScrubThumbnailPresetSchema = _enum([
|
|
|
7615
7607
|
* other field is a storage knob (profiles, segment length, retention, scrub).
|
|
7616
7608
|
*
|
|
7617
7609
|
* STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
|
|
7618
|
-
* `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30
|
|
7610
|
+
* `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
|
|
7611
|
+
* and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
|
|
7612
|
+
* deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
|
|
7613
|
+
* (D62: a switch that writes a store nobody reads is worse than no switch).
|
|
7614
|
+
* Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
|
|
7619
7615
|
* A stale caller must fail loudly — silently stripping its legacy intent would
|
|
7620
7616
|
* persist a band-less config, i.e. silently stop recording the camera.
|
|
7621
7617
|
*/
|
|
@@ -7638,14 +7634,7 @@ var RecordingConfigSchema = object({
|
|
|
7638
7634
|
* "off" is the absence of a covering band, never a band value.
|
|
7639
7635
|
*/
|
|
7640
7636
|
bands: array(RecordingBandSchema).default([]),
|
|
7641
|
-
retention: RecordingRetentionSchema.optional()
|
|
7642
|
-
/**
|
|
7643
|
-
* Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
|
|
7644
|
-
* timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
|
|
7645
|
-
* windows only — existing sheets are immutable, and each window's index
|
|
7646
|
-
* carries its own tile dims so mixed-preset history renders correctly.
|
|
7647
|
-
*/
|
|
7648
|
-
scrubThumbnails: ScrubThumbnailPresetSchema.optional()
|
|
7637
|
+
retention: RecordingRetentionSchema.optional()
|
|
7649
7638
|
}).strict();
|
|
7650
7639
|
/**
|
|
7651
7640
|
* Entity-relocation job state (storage entity-routing spec, Phase 4).
|
|
@@ -7721,10 +7710,11 @@ var RelocateFootageInputSchema = object({
|
|
|
7721
7710
|
* `RecordingConfig.enabled` or camera wrapper bindings. */
|
|
7722
7711
|
var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
|
|
7723
7712
|
var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
|
|
7724
|
-
var
|
|
7713
|
+
var RelocateMediaInputSchema = object({
|
|
7725
7714
|
toLocationId: string(),
|
|
7726
7715
|
throttleMbps: number().min(1).max(1e3).optional()
|
|
7727
|
-
})
|
|
7716
|
+
});
|
|
7717
|
+
var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
|
|
7728
7718
|
/** The independently selectable logical storage classes. `recordings`
|
|
7729
7719
|
* encompasses the high and mid segment profiles; `recordingsLow` is low
|
|
7730
7720
|
* segments; `eventMedia` is post-analysis blobs. */
|
|
@@ -8019,7 +8009,26 @@ var LabelDefinitionSchema = object({
|
|
|
8019
8009
|
description: string().optional(),
|
|
8020
8010
|
icon: string().optional()
|
|
8021
8011
|
});
|
|
8022
|
-
|
|
8012
|
+
/**
|
|
8013
|
+
* Wire schema for a per-model CATALOG classMap override
|
|
8014
|
+
* (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
|
|
8015
|
+
* restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
|
|
8016
|
+
* detection pipeline executor actually routes.
|
|
8017
|
+
*
|
|
8018
|
+
* This is deliberately a DIFFERENT, narrower shape than the general-purpose
|
|
8019
|
+
* `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
|
|
8020
|
+
* and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
|
|
8021
|
+
* enum) — the two used to share the name `ClassMapDefinition`/
|
|
8022
|
+
* `ClassMapDefinitionSchema`, which made the schema-type-twin guard
|
|
8023
|
+
* (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
|
|
8024
|
+
* are not: it is two different concepts colliding on a name. Keep this type
|
|
8025
|
+
* under its own name rather than reusing `ClassMapDefinition` — reusing it
|
|
8026
|
+
* would either narrow every `ClassMapDefinition` consumer to the four
|
|
8027
|
+
* detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
|
|
8028
|
+
* schema exists for (see the "rejects a classMap whose target is not a
|
|
8029
|
+
* detection macro" test in `model-catalog-schema.test.ts`).
|
|
8030
|
+
*/
|
|
8031
|
+
var DetectionCatalogClassMapSchema = object({
|
|
8023
8032
|
mapping: record(string(), _enum([
|
|
8024
8033
|
"person",
|
|
8025
8034
|
"vehicle",
|
|
@@ -8111,6 +8120,12 @@ var ModelVariantGroupSchema = object({
|
|
|
8111
8120
|
*/
|
|
8112
8121
|
resolution: number().int().positive().optional()
|
|
8113
8122
|
});
|
|
8123
|
+
var ModelProviderIdSchema = _enum([
|
|
8124
|
+
"camstack",
|
|
8125
|
+
"frigate",
|
|
8126
|
+
"scrypted",
|
|
8127
|
+
"custom"
|
|
8128
|
+
]);
|
|
8114
8129
|
var ModelCatalogEntrySchema = object({
|
|
8115
8130
|
id: string(),
|
|
8116
8131
|
name: string(),
|
|
@@ -8208,11 +8223,17 @@ var ModelCatalogEntrySchema = object({
|
|
|
8208
8223
|
*/
|
|
8209
8224
|
group: ModelVariantGroupSchema.optional(),
|
|
8210
8225
|
/**
|
|
8226
|
+
* Catalog source for the pipeline stepper's provider-first picker. Absent on
|
|
8227
|
+
* built-in CamStack entries (treated as `camstack`) and on registry rows
|
|
8228
|
+
* persisted before this field existed (`inferModelProvider` fills those).
|
|
8229
|
+
*/
|
|
8230
|
+
provider: ModelProviderIdSchema.optional(),
|
|
8231
|
+
/**
|
|
8211
8232
|
* Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
|
|
8212
8233
|
* applies (Frigate / COCO public catalog). Set on a custom model whose raw
|
|
8213
8234
|
* labels already ARE the CamStack macros (Scrypted identity map).
|
|
8214
8235
|
*/
|
|
8215
|
-
classMap:
|
|
8236
|
+
classMap: DetectionCatalogClassMapSchema.optional()
|
|
8216
8237
|
});
|
|
8217
8238
|
var ConvertTargetSchema = discriminatedUnion("format", [object({
|
|
8218
8239
|
format: literal("openvino"),
|
|
@@ -8242,7 +8263,7 @@ var ModelConvertMetadataSchema = object({
|
|
|
8242
8263
|
"segmentation"
|
|
8243
8264
|
]),
|
|
8244
8265
|
faceAlignment: boolean().optional(),
|
|
8245
|
-
classMap:
|
|
8266
|
+
classMap: DetectionCatalogClassMapSchema.optional()
|
|
8246
8267
|
});
|
|
8247
8268
|
var ConvertResultSchema = object({
|
|
8248
8269
|
entry: ModelCatalogEntrySchema,
|
|
@@ -9105,7 +9126,7 @@ var AddonPageDeclarationSchema = object({
|
|
|
9105
9126
|
/** Display label for a CUSTOM `section` id (ignored for well-known ids). */
|
|
9106
9127
|
sectionLabel: string().optional()
|
|
9107
9128
|
});
|
|
9108
|
-
method(_void(), array(AddonPageDeclarationSchema).readonly());
|
|
9129
|
+
method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
|
|
9109
9130
|
var AddonHttpRouteSchema = object({
|
|
9110
9131
|
method: _enum([
|
|
9111
9132
|
"GET",
|
|
@@ -9340,7 +9361,7 @@ var WidgetMetadataSchema = object({
|
|
|
9340
9361
|
defaultColumns: number().int().min(1).max(12).default(6),
|
|
9341
9362
|
defaultRows: number().int().min(1).max(12).default(1)
|
|
9342
9363
|
});
|
|
9343
|
-
method(_void(), array(WidgetMetadataSchema).readonly());
|
|
9364
|
+
method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
|
|
9344
9365
|
/**
|
|
9345
9366
|
* `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
|
|
9346
9367
|
* surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
|
|
@@ -10964,7 +10985,7 @@ var CustomModelDescriptorSchema = object({
|
|
|
10964
10985
|
stepId: string(),
|
|
10965
10986
|
entry: ModelCatalogEntrySchema
|
|
10966
10987
|
});
|
|
10967
|
-
method(_void(), array(CustomModelDescriptorSchema).readonly());
|
|
10988
|
+
method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
|
|
10968
10989
|
/**
|
|
10969
10990
|
* Query filter for settings-store collections.
|
|
10970
10991
|
*/
|
|
@@ -11051,7 +11072,8 @@ method(object({
|
|
|
11051
11072
|
}), _void(), { kind: "mutation" }), method(object({
|
|
11052
11073
|
namespace: string().optional(),
|
|
11053
11074
|
collection: string(),
|
|
11054
|
-
filter: QueryFilterSchema.optional()
|
|
11075
|
+
filter: QueryFilterSchema.optional(),
|
|
11076
|
+
columns: array(string()).readonly().optional()
|
|
11055
11077
|
}), array(SettingsRecordSchema).readonly()), method(object({
|
|
11056
11078
|
namespace: string().optional(),
|
|
11057
11079
|
collection: string(),
|
|
@@ -11114,46 +11136,87 @@ var EngineInfoSchema = object({
|
|
|
11114
11136
|
kind: _enum(["relational", "vector"]),
|
|
11115
11137
|
displayName: string()
|
|
11116
11138
|
});
|
|
11117
|
-
method(_void(), EngineInfoSchema), method(object({
|
|
11139
|
+
method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
|
|
11118
11140
|
namespace: string().optional(),
|
|
11119
11141
|
collection: string(),
|
|
11120
11142
|
key: string()
|
|
11121
|
-
}), unknown()), method(object({
|
|
11143
|
+
}), unknown(), { auth: "admin" }), method(object({
|
|
11122
11144
|
namespace: string().optional(),
|
|
11123
11145
|
collection: string(),
|
|
11124
11146
|
key: string(),
|
|
11125
11147
|
value: unknown()
|
|
11126
|
-
}), _void(), {
|
|
11148
|
+
}), _void(), {
|
|
11149
|
+
kind: "mutation",
|
|
11150
|
+
auth: "admin"
|
|
11151
|
+
}), method(object({
|
|
11127
11152
|
namespace: string().optional(),
|
|
11128
11153
|
collection: string(),
|
|
11129
|
-
filter: QueryFilterSchema.optional()
|
|
11130
|
-
|
|
11154
|
+
filter: QueryFilterSchema.optional(),
|
|
11155
|
+
/**
|
|
11156
|
+
* SQL-level column projection — MUST mirror `settings-store.query`.
|
|
11157
|
+
*
|
|
11158
|
+
* ⚠ An earlier version of this comment blamed Zod stripping, and that
|
|
11159
|
+
* was wrong — corrected 2026-08-26 after the hop map
|
|
11160
|
+
* (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
|
|
11161
|
+
* There is **no Zod parse at all** between the door and the engine: the
|
|
11162
|
+
* dispatcher forwards the payload verbatim and UDS carries it whole. A
|
|
11163
|
+
* field declared here reaches `SqliteSettingsBackend` either way.
|
|
11164
|
+
*
|
|
11165
|
+
* What actually lost `columns` was the THIRD declaration of this shape:
|
|
11166
|
+
* `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
|
|
11167
|
+
* interface the engine destructures from. The field existed on both
|
|
11168
|
+
* schemas and the engine still never read it, because nothing checks a
|
|
11169
|
+
* registered provider against `InferProvider<cap>` —
|
|
11170
|
+
* `ProviderRegistration.provider` is typed `object`.
|
|
11171
|
+
*
|
|
11172
|
+
* It is declared here anyway, and must stay in step with
|
|
11173
|
+
* `settings-store.query`: a caller reading only the cap definitions has
|
|
11174
|
+
* to be able to see that this call carries a projection.
|
|
11175
|
+
* `data-door-schema-parity.spec.ts` keeps the two aligned.
|
|
11176
|
+
*/
|
|
11177
|
+
columns: array(string()).readonly().optional()
|
|
11178
|
+
}), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
|
|
11131
11179
|
namespace: string().optional(),
|
|
11132
11180
|
collection: string(),
|
|
11133
11181
|
record: SettingsRecordSchema
|
|
11134
|
-
}), _void(), {
|
|
11182
|
+
}), _void(), {
|
|
11183
|
+
kind: "mutation",
|
|
11184
|
+
auth: "admin"
|
|
11185
|
+
}), method(object({
|
|
11135
11186
|
namespace: string().optional(),
|
|
11136
11187
|
collection: string(),
|
|
11137
11188
|
id: string(),
|
|
11138
11189
|
data: record(string(), unknown())
|
|
11139
|
-
}), _void(), {
|
|
11190
|
+
}), _void(), {
|
|
11191
|
+
kind: "mutation",
|
|
11192
|
+
auth: "admin"
|
|
11193
|
+
}), method(object({
|
|
11140
11194
|
namespace: string().optional(),
|
|
11141
11195
|
collection: string(),
|
|
11142
11196
|
key: string()
|
|
11143
|
-
}), _void(), {
|
|
11197
|
+
}), _void(), {
|
|
11198
|
+
kind: "mutation",
|
|
11199
|
+
auth: "admin"
|
|
11200
|
+
}), method(object({
|
|
11144
11201
|
namespace: string().optional(),
|
|
11145
11202
|
collection: string(),
|
|
11146
11203
|
filter: MutationFilterSchema
|
|
11147
|
-
}), object({ deleted: number().int() }), {
|
|
11204
|
+
}), object({ deleted: number().int() }), {
|
|
11205
|
+
kind: "mutation",
|
|
11206
|
+
auth: "admin"
|
|
11207
|
+
}), method(object({
|
|
11148
11208
|
namespace: string().optional(),
|
|
11149
11209
|
collection: string(),
|
|
11150
11210
|
filter: MutationFilterSchema,
|
|
11151
11211
|
data: record(string(), unknown())
|
|
11152
|
-
}), object({ updated: number().int() }), {
|
|
11212
|
+
}), object({ updated: number().int() }), {
|
|
11213
|
+
kind: "mutation",
|
|
11214
|
+
auth: "admin"
|
|
11215
|
+
}), method(object({
|
|
11153
11216
|
namespace: string().optional(),
|
|
11154
11217
|
collection: string(),
|
|
11155
11218
|
filter: QueryFilterSchema.optional()
|
|
11156
|
-
}), number()), method(object({
|
|
11219
|
+
}), number(), { auth: "admin" }), method(object({
|
|
11157
11220
|
namespace: string().optional(),
|
|
11158
11221
|
collection: string(),
|
|
11159
11222
|
field: string(),
|
|
@@ -11163,15 +11226,18 @@ method(_void(), EngineInfoSchema), method(object({
|
|
|
11163
11226
|
}), array(object({
|
|
11164
11227
|
bucket: number().int(),
|
|
11165
11228
|
count: number().int()
|
|
11166
|
-
})).readonly()), method(object({
|
|
11229
|
+
})).readonly(), { auth: "admin" }), method(object({
|
|
11167
11230
|
namespace: string().optional(),
|
|
11168
11231
|
collection: string()
|
|
11169
|
-
}), boolean()), method(object({
|
|
11232
|
+
}), boolean(), { auth: "admin" }), method(object({
|
|
11170
11233
|
namespace: string().optional(),
|
|
11171
11234
|
collection: string(),
|
|
11172
11235
|
columns: array(CollectionColumnSchema).readonly(),
|
|
11173
11236
|
indexes: array(CollectionIndexSchema).readonly().optional()
|
|
11174
|
-
}), _void(), {
|
|
11237
|
+
}), _void(), {
|
|
11238
|
+
kind: "mutation",
|
|
11239
|
+
auth: "admin"
|
|
11240
|
+
});
|
|
11175
11241
|
/**
|
|
11176
11242
|
* shm ring usage stats for a `frameSink: 'shm'` decoder session —
|
|
11177
11243
|
* exposed via `decoder.getShmStats` so downstream consumers can
|
|
@@ -11999,6 +12065,27 @@ var LinkedDeviceSchema = object({
|
|
|
11999
12065
|
features: array(string()),
|
|
12000
12066
|
producesTrackedEvents: boolean().optional()
|
|
12001
12067
|
});
|
|
12068
|
+
/** One camera's resolved linked set, tagged with the camera it belongs to.
|
|
12069
|
+
* The batch answer needs the tag; the single-device answer already has it
|
|
12070
|
+
* from the input, which is why `getLinkedDevices` keeps the untagged shape. */
|
|
12071
|
+
var LinkedDevicesForDeviceSchema = object({
|
|
12072
|
+
deviceId: number(),
|
|
12073
|
+
mode: LinkedDevicesModeSchema,
|
|
12074
|
+
devices: array(LinkedDeviceSchema)
|
|
12075
|
+
});
|
|
12076
|
+
/** One device's binding map — the shape `getBindings`, `getBindingsBatch` and
|
|
12077
|
+
* `getAllBindings` all answer in. Declared once: three copies of the same
|
|
12078
|
+
* object literal is exactly how the three drift apart. */
|
|
12079
|
+
var DeviceBindingsForDeviceSchema = object({
|
|
12080
|
+
deviceId: number(),
|
|
12081
|
+
entries: array(object({
|
|
12082
|
+
capName: string(),
|
|
12083
|
+
kind: _enum(["native", "wrapped"]),
|
|
12084
|
+
providerAddonId: string(),
|
|
12085
|
+
providerNodeId: string(),
|
|
12086
|
+
nativeAddonId: string()
|
|
12087
|
+
}))
|
|
12088
|
+
});
|
|
12002
12089
|
var SavedDeviceRowSchema = object({
|
|
12003
12090
|
/** Numeric id reserved at allocateDeviceId time. */
|
|
12004
12091
|
id: number(),
|
|
@@ -12224,11 +12311,25 @@ method(object({
|
|
|
12224
12311
|
projection: _enum(["full", "slim"]).optional(),
|
|
12225
12312
|
/** Return only camera devices. Filtering server-side instead of
|
|
12226
12313
|
* shipping 293 rows to find 12. */
|
|
12227
|
-
isCamera: boolean().optional()
|
|
12314
|
+
isCamera: boolean().optional(),
|
|
12315
|
+
/**
|
|
12316
|
+
* Return only these device ids. For the caller that already KNOWS the
|
|
12317
|
+
* handful it wants and needs a field the id-bearing answer does not
|
|
12318
|
+
* carry — the viewer's linked-devices panel joins `type` and `online`
|
|
12319
|
+
* onto ~8 linked ids and, unfiltered, dragged the fleet across to do
|
|
12320
|
+
* it: 433 KB slim / 958 KB full for 967 devices, on a query that
|
|
12321
|
+
* refetches on the reconcile interval, on a phone.
|
|
12322
|
+
*
|
|
12323
|
+
* Safe to send at a hub that predates it: Zod STRIPS unknown input
|
|
12324
|
+
* keys rather than rejecting them (verified against the live hub
|
|
12325
|
+
* 2026-08-25 — 967 rows came back), so an old hub answers exactly what
|
|
12326
|
+
* it answers today and the caller filters as it already does.
|
|
12327
|
+
*/
|
|
12328
|
+
deviceIds: array(number()).optional()
|
|
12228
12329
|
}), array(DeviceInfoSchema)), method(object({ deviceId: number() }), DeviceInfoSchema.nullable()), method(object({ parentDeviceId: number() }), array(DeviceInfoSchema)), method(object({ deviceId: number() }), object({
|
|
12229
12330
|
mode: LinkedDevicesModeSchema,
|
|
12230
12331
|
devices: array(LinkedDeviceSchema)
|
|
12231
|
-
})), method(object({ deviceId: number() }), array(StreamSourceEntrySchema$1)), method(object({ deviceId: number() }), array(ConfigEntrySchema)), method(object({ deviceId: number() }), ConfigUISchemaOutput), method(object({
|
|
12332
|
+
})), 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({
|
|
12232
12333
|
deviceId: number(),
|
|
12233
12334
|
values: record(string(), unknown())
|
|
12234
12335
|
}), object({ success: literal(true) }), {
|
|
@@ -12255,25 +12356,7 @@ method(object({
|
|
|
12255
12356
|
}), method(object({ deviceId: number() }), array(StreamProbeResultSchema), {
|
|
12256
12357
|
kind: "mutation",
|
|
12257
12358
|
auth: "admin"
|
|
12258
|
-
}), method(object({ deviceId: number() }), object({
|
|
12259
|
-
deviceId: number(),
|
|
12260
|
-
entries: array(object({
|
|
12261
|
-
capName: string(),
|
|
12262
|
-
kind: _enum(["native", "wrapped"]),
|
|
12263
|
-
providerAddonId: string(),
|
|
12264
|
-
providerNodeId: string(),
|
|
12265
|
-
nativeAddonId: string()
|
|
12266
|
-
}))
|
|
12267
|
-
})), method(object({}), array(object({
|
|
12268
|
-
deviceId: number(),
|
|
12269
|
-
entries: array(object({
|
|
12270
|
-
capName: string(),
|
|
12271
|
-
kind: _enum(["native", "wrapped"]),
|
|
12272
|
-
providerAddonId: string(),
|
|
12273
|
-
providerNodeId: string(),
|
|
12274
|
-
nativeAddonId: string()
|
|
12275
|
-
}))
|
|
12276
|
-
}))), method(object({
|
|
12359
|
+
}), method(object({ deviceId: number() }), DeviceBindingsForDeviceSchema), method(object({ deviceIds: array(number()) }), array(DeviceBindingsForDeviceSchema)), method(object({}), array(DeviceBindingsForDeviceSchema)), method(object({
|
|
12277
12360
|
deviceId: number(),
|
|
12278
12361
|
capName: string(),
|
|
12279
12362
|
wrapperAddonId: string(),
|
|
@@ -12444,7 +12527,7 @@ method(object({
|
|
|
12444
12527
|
crop: _instanceof(Uint8Array),
|
|
12445
12528
|
width: number(),
|
|
12446
12529
|
height: number()
|
|
12447
|
-
}), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
|
|
12530
|
+
}), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
|
|
12448
12531
|
/**
|
|
12449
12532
|
* filesystem-browse — per-node capability for browsing the node's local
|
|
12450
12533
|
* filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
|
|
@@ -12737,19 +12820,22 @@ method(LlmGenerateBaseInputSchema.extend({
|
|
|
12737
12820
|
runtime: ManagedRuntimeConfigSchema,
|
|
12738
12821
|
/** The managed profile's timeout, threaded by the hub provider. */
|
|
12739
12822
|
timeoutMs: number().int().positive().optional()
|
|
12740
|
-
}), LlmGenerateResultSchema, {
|
|
12823
|
+
}), LlmGenerateResultSchema, {
|
|
12824
|
+
kind: "mutation",
|
|
12825
|
+
auth: "admin"
|
|
12826
|
+
}), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
|
|
12741
12827
|
kind: "mutation",
|
|
12742
12828
|
auth: "admin"
|
|
12743
12829
|
}), method(object({}), _void(), {
|
|
12744
12830
|
kind: "mutation",
|
|
12745
12831
|
auth: "admin"
|
|
12746
|
-
}), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
|
|
12832
|
+
}), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
|
|
12747
12833
|
kind: "mutation",
|
|
12748
12834
|
auth: "admin"
|
|
12749
12835
|
}), method(object({ file: string() }), _void(), {
|
|
12750
12836
|
kind: "mutation",
|
|
12751
12837
|
auth: "admin"
|
|
12752
|
-
}), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
|
|
12838
|
+
}), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
|
|
12753
12839
|
/**
|
|
12754
12840
|
* `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
|
|
12755
12841
|
* methods concat-fan across providers; single-row methods route to ONE
|
|
@@ -14683,12 +14769,15 @@ var NcOccupancyConditionSchema = object({
|
|
|
14683
14769
|
* there is no second switch that can disagree with the first and every rule
|
|
14684
14770
|
* authored before the decision migrates for free (`audioModeOf`):
|
|
14685
14771
|
*
|
|
14686
|
-
* - **LABEL mode — `labels` present.** The rule fires
|
|
14687
|
-
*
|
|
14688
|
-
* `hitPercent` and `samplingSeconds` are ignored
|
|
14689
|
-
*
|
|
14690
|
-
*
|
|
14691
|
-
*
|
|
14772
|
+
* - **LABEL mode — `labels` present.** The rule fires when `confirmHits`
|
|
14773
|
+
* labelled frames land inside `confirmWindowSec` (default 2 in 5 s).
|
|
14774
|
+
* `hitPercent` and `samplingSeconds` are still ignored — a percentage of
|
|
14775
|
+
* frames is the wrong question for a classifier that labels 1–3 frames
|
|
14776
|
+
* per episode. The count window is the brake that drops a single-frame
|
|
14777
|
+
* false positive; the rule's own `throttle` cooldown is the other. The
|
|
14778
|
+
* per-label confidence floor is the analyzer's (`classificationMinScore`,
|
|
14779
|
+
* per device) — a label only reaches this condition if the classifier was
|
|
14780
|
+
* already confident enough. `confirmHits: 1` restores first-frame fire.
|
|
14692
14781
|
* - **LEVEL mode — `dbThreshold` present, no labels.** The sampling window IS
|
|
14693
14782
|
* the condition: at least `hitPercent`% of the samples over
|
|
14694
14783
|
* `samplingSeconds` must be at or above `dbThreshold` dBFS (see
|
|
@@ -14715,14 +14804,22 @@ var NcOccupancyConditionSchema = object({
|
|
|
14715
14804
|
* an operator who typed `dog` mean the same thing.
|
|
14716
14805
|
*/
|
|
14717
14806
|
var NcAudioConditionSchema = object({
|
|
14718
|
-
/** LABEL MODE: audio macro labels. Present ⇒
|
|
14807
|
+
/** LABEL MODE: audio macro labels. Present ⇒ count-in-window confirm. */
|
|
14719
14808
|
labels: array(string().min(1)).min(1).optional(),
|
|
14720
14809
|
/** LEVEL MODE: floor in dBFS (negative-going, `0` = full scale). */
|
|
14721
14810
|
dbThreshold: number().min(-96).max(0).optional(),
|
|
14722
14811
|
/** LEVEL MODE ONLY: percentage of the window's samples that must be hits (1–100). */
|
|
14723
14812
|
hitPercent: number().int().min(1).max(100).default(60),
|
|
14724
14813
|
/** LEVEL MODE ONLY: length of the sampling window in seconds. */
|
|
14725
|
-
samplingSeconds: number().int().min(1).max(300).default(10)
|
|
14814
|
+
samplingSeconds: number().int().min(1).max(300).default(10),
|
|
14815
|
+
/**
|
|
14816
|
+
* LABEL MODE: how many labelled frames must land inside
|
|
14817
|
+
* {@link NcAudioConditionSchema.shape.confirmWindowSec} before dispatch.
|
|
14818
|
+
* Absent ⇒ 2 (the matcher default). `1` is first-frame fire.
|
|
14819
|
+
*/
|
|
14820
|
+
confirmHits: number().int().min(1).max(20).optional(),
|
|
14821
|
+
/** LABEL MODE: the window those frames must share, in seconds. Absent ⇒ 5. */
|
|
14822
|
+
confirmWindowSec: number().int().min(1).max(60).optional()
|
|
14726
14823
|
});
|
|
14727
14824
|
/**
|
|
14728
14825
|
* Which zone-crossing DIRECTION a rule accepts (`ObjectEvent.zoneCrossing`).
|
|
@@ -16249,7 +16346,7 @@ var OauthIntegrationDescriptorSchema = object({
|
|
|
16249
16346
|
*/
|
|
16250
16347
|
refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
|
|
16251
16348
|
});
|
|
16252
|
-
method(_void(), OauthIntegrationDescriptorSchema);
|
|
16349
|
+
method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
|
|
16253
16350
|
/**
|
|
16254
16351
|
* pipeline-analytics — device-scoped wrapper cap. Refines raw
|
|
16255
16352
|
* per-frame detections emitted by the pipeline runner into tracked
|
|
@@ -17096,6 +17193,46 @@ var RecentTracksPageSchema = object({
|
|
|
17096
17193
|
/** Cursor for the next page, or null when this page is the last. */
|
|
17097
17194
|
nextCursor: string().nullable()
|
|
17098
17195
|
});
|
|
17196
|
+
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
17197
|
+
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
17198
|
+
var AnalyticsGroupRecordSchema = object({
|
|
17199
|
+
id: string(),
|
|
17200
|
+
deviceId: number().int(),
|
|
17201
|
+
openedAt: number().int(),
|
|
17202
|
+
closedAt: number().int(),
|
|
17203
|
+
timestamp: number().int(),
|
|
17204
|
+
memberCount: number().int(),
|
|
17205
|
+
memberTrackIds: array(string()).readonly(),
|
|
17206
|
+
className: string(),
|
|
17207
|
+
classes: array(string()).readonly(),
|
|
17208
|
+
/** Relative event-media path, or null when the group has no picture yet. */
|
|
17209
|
+
mediaUrl: string().nullable(),
|
|
17210
|
+
singleton: boolean()
|
|
17211
|
+
});
|
|
17212
|
+
var AnalyticsGroupMemberSchema = object({
|
|
17213
|
+
trackId: string(),
|
|
17214
|
+
deviceId: number().int(),
|
|
17215
|
+
className: string(),
|
|
17216
|
+
firstSeen: number().int(),
|
|
17217
|
+
lastSeen: number().int(),
|
|
17218
|
+
mediaUrl: string().nullable()
|
|
17219
|
+
});
|
|
17220
|
+
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
17221
|
+
var ListGroupsQueryInput = object({
|
|
17222
|
+
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
17223
|
+
deviceIds: array(number()),
|
|
17224
|
+
/** Window lower bound on `closedAt` (inclusive). */
|
|
17225
|
+
since: number().optional(),
|
|
17226
|
+
/** Window upper bound on `openedAt` (inclusive). */
|
|
17227
|
+
until: number().optional(),
|
|
17228
|
+
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
17229
|
+
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
17230
|
+
cursor: string().optional()
|
|
17231
|
+
});
|
|
17232
|
+
var ListGroupsPageSchema = object({
|
|
17233
|
+
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
17234
|
+
nextCursor: string().nullable()
|
|
17235
|
+
});
|
|
17099
17236
|
var KeyEventQueryInput = object({
|
|
17100
17237
|
deviceId: number(),
|
|
17101
17238
|
/** Window lower bound (track firstSeen ≥ since). */
|
|
@@ -17171,7 +17308,9 @@ var TrackCascadeCountsSchema = object({
|
|
|
17171
17308
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
17172
17309
|
plates: number().int(),
|
|
17173
17310
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
17174
|
-
embeddings: number().int()
|
|
17311
|
+
embeddings: number().int(),
|
|
17312
|
+
/** Group membership + group rows removed with their last member (best-effort). */
|
|
17313
|
+
groups: number().int()
|
|
17175
17314
|
});
|
|
17176
17315
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
17177
17316
|
var DiskReconcileCountsSchema = object({
|
|
@@ -17317,7 +17456,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
17317
17456
|
* stationary registry). Default false: the timeline lists passages,
|
|
17318
17457
|
* not parking records (operator decision, 2026-08-15). */
|
|
17319
17458
|
includeStationary: boolean().optional()
|
|
17320
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
17459
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
|
|
17460
|
+
deviceId: number(),
|
|
17461
|
+
groupId: string().min(1)
|
|
17462
|
+
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
17321
17463
|
kind: "mutation",
|
|
17322
17464
|
auth: "admin"
|
|
17323
17465
|
}), 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({
|
|
@@ -17399,6 +17541,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
17399
17541
|
}), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
17400
17542
|
kind: "mutation",
|
|
17401
17543
|
auth: "admin"
|
|
17544
|
+
}), method(RelocateMediaInputSchema, object({ jobId: string() }), {
|
|
17545
|
+
kind: "mutation",
|
|
17546
|
+
auth: "admin"
|
|
17547
|
+
}), method(object({}), array(RelocateJobSchema).readonly(), {
|
|
17548
|
+
kind: "query",
|
|
17549
|
+
auth: "admin"
|
|
17550
|
+
}), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
17551
|
+
kind: "mutation",
|
|
17552
|
+
auth: "admin"
|
|
17402
17553
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
17403
17554
|
kind: "query",
|
|
17404
17555
|
auth: "admin"
|
|
@@ -17553,6 +17704,11 @@ object({
|
|
|
17553
17704
|
"jpeg"
|
|
17554
17705
|
])
|
|
17555
17706
|
});
|
|
17707
|
+
/**
|
|
17708
|
+
* Process-local frame identity. It is serializable so it can ride an in-process
|
|
17709
|
+
* capability call, but `registryId` deliberately prevents resolution in any
|
|
17710
|
+
* other process or execution group.
|
|
17711
|
+
*/
|
|
17556
17712
|
var FrameRefSchema = object({
|
|
17557
17713
|
registryId: string().min(1),
|
|
17558
17714
|
id: string().min(1),
|
|
@@ -17627,7 +17783,8 @@ var PipelineModelOptionSchema = object({
|
|
|
17627
17783
|
sizeMB: number()
|
|
17628
17784
|
})),
|
|
17629
17785
|
group: ModelVariantGroupSchema.optional(),
|
|
17630
|
-
legacy: boolean().optional()
|
|
17786
|
+
legacy: boolean().optional(),
|
|
17787
|
+
provider: ModelProviderIdSchema.optional()
|
|
17631
17788
|
});
|
|
17632
17789
|
var ConfigFieldBridge = custom();
|
|
17633
17790
|
var PipelineAddonSchemaSchema = object({
|
|
@@ -19757,7 +19914,7 @@ method(object({
|
|
|
19757
19914
|
* linking rather than produce an eternal token.
|
|
19758
19915
|
*/
|
|
19759
19916
|
ttlSec: union([number().int().positive(), literal("never")]).optional()
|
|
19760
|
-
}), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
|
|
19917
|
+
}), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
|
|
19761
19918
|
var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
19762
19919
|
providerId: string().min(1),
|
|
19763
19920
|
displayName: string().min(1),
|
|
@@ -19852,10 +20009,13 @@ var EvictResultSchema = object({
|
|
|
19852
20009
|
/** True when the provider has nothing left it is willing to drop on this location. */
|
|
19853
20010
|
exhausted: boolean()
|
|
19854
20011
|
});
|
|
19855
|
-
method(object({ locationId: string() }), EvictableUsageSchema), method(object({
|
|
20012
|
+
method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
|
|
19856
20013
|
locationId: string(),
|
|
19857
20014
|
targetBytes: number().int().positive()
|
|
19858
|
-
}), EvictResultSchema, {
|
|
20015
|
+
}), EvictResultSchema, {
|
|
20016
|
+
kind: "mutation",
|
|
20017
|
+
auth: "admin"
|
|
20018
|
+
});
|
|
19859
20019
|
method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
|
|
19860
20020
|
kind: "mutation",
|
|
19861
20021
|
auth: "admin"
|
|
@@ -19915,26 +20075,50 @@ var ReadChunkInputSchema = object({
|
|
|
19915
20075
|
length: number()
|
|
19916
20076
|
});
|
|
19917
20077
|
var EndDownloadInputSchema = object({ downloadId: string() });
|
|
19918
|
-
method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
|
|
20078
|
+
method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
|
|
19919
20079
|
location: StorageLocationSchema,
|
|
19920
20080
|
relativePath: string()
|
|
19921
|
-
}), string()), method(object({
|
|
20081
|
+
}), string(), { auth: "admin" }), method(object({
|
|
19922
20082
|
location: StorageLocationSchema,
|
|
19923
20083
|
relativePath: string(),
|
|
19924
20084
|
data: _instanceof(Uint8Array)
|
|
19925
|
-
}), _void(), {
|
|
20085
|
+
}), _void(), {
|
|
20086
|
+
kind: "mutation",
|
|
20087
|
+
auth: "admin"
|
|
20088
|
+
}), method(object({
|
|
19926
20089
|
location: StorageLocationSchema,
|
|
19927
20090
|
relativePath: string()
|
|
19928
|
-
}), _instanceof(Uint8Array)), method(object({
|
|
20091
|
+
}), _instanceof(Uint8Array), { auth: "admin" }), method(object({
|
|
19929
20092
|
location: StorageLocationSchema,
|
|
19930
20093
|
relativePath: string()
|
|
19931
|
-
}), boolean()), method(object({
|
|
20094
|
+
}), boolean(), { auth: "admin" }), method(object({
|
|
19932
20095
|
location: StorageLocationSchema,
|
|
19933
20096
|
prefix: string().optional()
|
|
19934
|
-
}), array(string()).readonly()), method(object({
|
|
20097
|
+
}), array(string()).readonly(), { auth: "admin" }), method(object({
|
|
19935
20098
|
location: StorageLocationSchema,
|
|
19936
20099
|
relativePath: string()
|
|
19937
|
-
}), _void(), {
|
|
20100
|
+
}), _void(), {
|
|
20101
|
+
kind: "mutation",
|
|
20102
|
+
auth: "admin"
|
|
20103
|
+
}), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
|
|
20104
|
+
kind: "mutation",
|
|
20105
|
+
auth: "admin"
|
|
20106
|
+
}), method(WriteChunkInputSchema, _void(), {
|
|
20107
|
+
kind: "mutation",
|
|
20108
|
+
auth: "admin"
|
|
20109
|
+
}), method(FinalizeUploadInputSchema, _void(), {
|
|
20110
|
+
kind: "mutation",
|
|
20111
|
+
auth: "admin"
|
|
20112
|
+
}), method(AbortUploadInputSchema, _void(), {
|
|
20113
|
+
kind: "mutation",
|
|
20114
|
+
auth: "admin"
|
|
20115
|
+
}), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
|
|
20116
|
+
kind: "mutation",
|
|
20117
|
+
auth: "admin"
|
|
20118
|
+
}), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
|
|
20119
|
+
kind: "mutation",
|
|
20120
|
+
auth: "admin"
|
|
20121
|
+
});
|
|
19938
20122
|
/** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
|
|
19939
20123
|
var ProfileSettingsSchemaBridge = unknown().nullable();
|
|
19940
20124
|
var ProfileSettingsBagSchema = record(string(), unknown());
|
|
@@ -20192,7 +20376,8 @@ method(object({
|
|
|
20192
20376
|
access: "create"
|
|
20193
20377
|
}), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
|
|
20194
20378
|
kind: "mutation",
|
|
20195
|
-
access: "view"
|
|
20379
|
+
access: "view",
|
|
20380
|
+
auth: "admin"
|
|
20196
20381
|
}), method(object({
|
|
20197
20382
|
/** Required — the user the assertion belongs to (verified). */
|
|
20198
20383
|
userId: string(),
|
|
@@ -20200,10 +20385,12 @@ method(object({
|
|
|
20200
20385
|
response: record(string(), unknown())
|
|
20201
20386
|
}), object({ verified: boolean() }), {
|
|
20202
20387
|
kind: "mutation",
|
|
20203
|
-
access: "view"
|
|
20388
|
+
access: "view",
|
|
20389
|
+
auth: "admin"
|
|
20204
20390
|
}), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
|
|
20205
20391
|
kind: "mutation",
|
|
20206
|
-
access: "view"
|
|
20392
|
+
access: "view",
|
|
20393
|
+
auth: "admin"
|
|
20207
20394
|
}), method(object({
|
|
20208
20395
|
/** AuthenticationResponseJSON from the browser. */
|
|
20209
20396
|
response: record(string(), unknown()) }), object({
|
|
@@ -20211,7 +20398,8 @@ response: record(string(), unknown()) }), object({
|
|
|
20211
20398
|
userId: string().nullable()
|
|
20212
20399
|
}), {
|
|
20213
20400
|
kind: "mutation",
|
|
20214
|
-
access: "view"
|
|
20401
|
+
access: "view",
|
|
20402
|
+
auth: "admin"
|
|
20215
20403
|
}), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
|
|
20216
20404
|
userId: string(),
|
|
20217
20405
|
credentialId: string()
|
|
@@ -20383,7 +20571,19 @@ var VectorStatsResultSchema = object({
|
|
|
20383
20571
|
/** False when the backend ranks approximately. */
|
|
20384
20572
|
exact: boolean()
|
|
20385
20573
|
});
|
|
20386
|
-
method(VectorDeclareIndexInputSchema, _void(), {
|
|
20574
|
+
method(VectorDeclareIndexInputSchema, _void(), {
|
|
20575
|
+
kind: "mutation",
|
|
20576
|
+
auth: "admin"
|
|
20577
|
+
}), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
|
|
20578
|
+
kind: "mutation",
|
|
20579
|
+
auth: "admin"
|
|
20580
|
+
}), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
|
|
20581
|
+
kind: "mutation",
|
|
20582
|
+
auth: "admin"
|
|
20583
|
+
}), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
|
|
20584
|
+
kind: "mutation",
|
|
20585
|
+
auth: "admin"
|
|
20586
|
+
}), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
|
|
20387
20587
|
var ClipSchema = object({
|
|
20388
20588
|
/** Opaque, provider-namespaced id. The default provider encodes the time
|
|
20389
20589
|
* window so `getClipPlayback` is self-contained (no event re-query). */
|
|
@@ -22853,7 +23053,27 @@ var MediaFileLiteSchema$1 = object({
|
|
|
22853
23053
|
sizeBytes: number(),
|
|
22854
23054
|
timestamp: number()
|
|
22855
23055
|
});
|
|
22856
|
-
method(
|
|
23056
|
+
method(object({
|
|
23057
|
+
/**
|
|
23058
|
+
* Inline {@link IdentitySchema.coverBase64} on every row.
|
|
23059
|
+
*
|
|
23060
|
+
* Default `false`, the same inversion `listRecentFaces` and
|
|
23061
|
+
* `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
|
|
23062
|
+
* why the burden belongs on the caller that WANTS the bytes). Measured
|
|
23063
|
+
* on the live hub the same day: four identities cost 40,979 B with the
|
|
23064
|
+
* covers inline, ~10 KB of base64 per row, on a query this UI mounts
|
|
23065
|
+
* four times and the viewer holds at `staleTime: 30_000`.
|
|
23066
|
+
*
|
|
23067
|
+
* Nothing loses its avatar: `coverMediaKey` is already on every row and
|
|
23068
|
+
* the `event-media` plane serves that key `immutable` with an ETag.
|
|
23069
|
+
*
|
|
23070
|
+
* **This is an INPUT field, so it does not reach the addon until the
|
|
23071
|
+
* next train** — the hub router validates cap inputs against its own
|
|
23072
|
+
* compiled Zod and strips a key it does not know. Until then the
|
|
23073
|
+
* provider sees `undefined`, which resolves to `false`: the cheap shape
|
|
23074
|
+
* is what ships, and the opt-in becomes reachable when the train lands.
|
|
23075
|
+
*/
|
|
23076
|
+
includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
|
|
22857
23077
|
kind: "mutation",
|
|
22858
23078
|
auth: "admin"
|
|
22859
23079
|
}), method(object({
|
|
@@ -25741,7 +25961,14 @@ var PlateInfoSchema = object({
|
|
|
25741
25961
|
plateBbox: BoundingBoxSchema.optional(),
|
|
25742
25962
|
/** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
|
|
25743
25963
|
keyFrameMediaKey: string().optional(),
|
|
25744
|
-
base64: string().optional()
|
|
25964
|
+
base64: string().optional(),
|
|
25965
|
+
/**
|
|
25966
|
+
* Same crop as a data-plane URL, always present when the plate has a stored
|
|
25967
|
+
* crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
|
|
25968
|
+
* and `searchPlates` inline the crop only when their `includeCrops` input is
|
|
25969
|
+
* left at its `true` default.
|
|
25970
|
+
*/
|
|
25971
|
+
cropUrl: string().optional()
|
|
25745
25972
|
});
|
|
25746
25973
|
var MediaFileLiteSchema = object({
|
|
25747
25974
|
key: string(),
|
|
@@ -25759,14 +25986,34 @@ var PlateClusterSchema = object({
|
|
|
25759
25986
|
});
|
|
25760
25987
|
method(object({
|
|
25761
25988
|
deviceId: number().int().optional(),
|
|
25762
|
-
limit: number().int().positive().optional()
|
|
25989
|
+
limit: number().int().positive().optional(),
|
|
25990
|
+
/**
|
|
25991
|
+
* Inline the base64 crop on every row. Default `true` — the existing
|
|
25992
|
+
* behaviour, kept so no caller breaks.
|
|
25993
|
+
*
|
|
25994
|
+
* Set `false` once the caller renders {@link PlateInfo.cropUrl}.
|
|
25995
|
+
* Measured on the live hub at the 500 rows the Plates view asks for:
|
|
25996
|
+
* 879,403 B and 27.7 s with the crops inline, against a few KiB of
|
|
25997
|
+
* metadata without them — and the browser then caches the images.
|
|
25998
|
+
*
|
|
25999
|
+
* This is the plate twin of `faceGallery.listRecentFaces`'s option;
|
|
26000
|
+
* plates were the one gallery list left without it.
|
|
26001
|
+
*
|
|
26002
|
+
* **This is an INPUT field, so it does not reach the addon until the
|
|
26003
|
+
* next train.** The hub router validates cap inputs against its own
|
|
26004
|
+
* compiled Zod and strips a key it does not know. Until the train
|
|
26005
|
+
* ships, sending `false` is harmless and keeps the crops inline.
|
|
26006
|
+
*/
|
|
26007
|
+
includeCrops: boolean().optional()
|
|
25763
26008
|
}).optional(), array(PlateInfoSchema).readonly()), method(object({
|
|
25764
26009
|
deviceId: number().int(),
|
|
25765
26010
|
trackId: string()
|
|
25766
26011
|
}), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
|
|
25767
26012
|
text: string().min(1),
|
|
25768
26013
|
maxDistance: number().int().min(0).optional(),
|
|
25769
|
-
limit: number().int().positive().optional()
|
|
26014
|
+
limit: number().int().positive().optional(),
|
|
26015
|
+
/** See `listPlates.includeCrops`. Default `true`. */
|
|
26016
|
+
includeCrops: boolean().optional()
|
|
25770
26017
|
}), array(PlateInfoSchema).readonly()), method(object({
|
|
25771
26018
|
maxDistance: number().int().min(0).optional(),
|
|
25772
26019
|
minClusterSize: number().int().min(2).optional(),
|
|
@@ -25780,7 +26027,13 @@ method(object({
|
|
|
25780
26027
|
}), method(object({ plateId: string() }), _void(), {
|
|
25781
26028
|
kind: "mutation",
|
|
25782
26029
|
auth: "admin"
|
|
25783
|
-
}), method(
|
|
26030
|
+
}), method(object({
|
|
26031
|
+
/** Inline {@link VehicleSchema.coverBase64} on every row. Default
|
|
26032
|
+
* `false` — the vehicle twin of `faceGallery.listIdentities`'s
|
|
26033
|
+
* option; `coverMediaKey` + the `event-media` plane carry the picture.
|
|
26034
|
+
* INPUT field: stripped by the hub router until the train ships, which
|
|
26035
|
+
* resolves to `false` and is exactly the intended default. */
|
|
26036
|
+
includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
|
|
25784
26037
|
kind: "mutation",
|
|
25785
26038
|
auth: "admin"
|
|
25786
26039
|
}), method(object({
|
|
@@ -31265,6 +31518,12 @@ Object.freeze({
|
|
|
31265
31518
|
addonId: null,
|
|
31266
31519
|
access: "view"
|
|
31267
31520
|
},
|
|
31521
|
+
"deviceManager.getBindingsBatch": {
|
|
31522
|
+
capName: "device-manager",
|
|
31523
|
+
capScope: "system",
|
|
31524
|
+
addonId: null,
|
|
31525
|
+
access: "view"
|
|
31526
|
+
},
|
|
31268
31527
|
"deviceManager.getChildren": {
|
|
31269
31528
|
capName: "device-manager",
|
|
31270
31529
|
capScope: "system",
|
|
@@ -31325,6 +31584,12 @@ Object.freeze({
|
|
|
31325
31584
|
addonId: null,
|
|
31326
31585
|
access: "view"
|
|
31327
31586
|
},
|
|
31587
|
+
"deviceManager.getLinkedDevicesBatch": {
|
|
31588
|
+
capName: "device-manager",
|
|
31589
|
+
capScope: "system",
|
|
31590
|
+
addonId: null,
|
|
31591
|
+
access: "view"
|
|
31592
|
+
},
|
|
31328
31593
|
"deviceManager.getRoleDisplayDefaults": {
|
|
31329
31594
|
capName: "device-manager",
|
|
31330
31595
|
capScope: "system",
|
|
@@ -33029,6 +33294,12 @@ Object.freeze({
|
|
|
33029
33294
|
addonId: null,
|
|
33030
33295
|
access: "create"
|
|
33031
33296
|
},
|
|
33297
|
+
"pipelineAnalytics.cancelRelocateMedia": {
|
|
33298
|
+
capName: "pipeline-analytics",
|
|
33299
|
+
capScope: "device",
|
|
33300
|
+
addonId: null,
|
|
33301
|
+
access: "create"
|
|
33302
|
+
},
|
|
33032
33303
|
"pipelineAnalytics.cancelStorageMigrationMove": {
|
|
33033
33304
|
capName: "pipeline-analytics",
|
|
33034
33305
|
capScope: "device",
|
|
@@ -33095,6 +33366,12 @@ Object.freeze({
|
|
|
33095
33366
|
addonId: null,
|
|
33096
33367
|
access: "view"
|
|
33097
33368
|
},
|
|
33369
|
+
"pipelineAnalytics.getGroup": {
|
|
33370
|
+
capName: "pipeline-analytics",
|
|
33371
|
+
capScope: "device",
|
|
33372
|
+
addonId: null,
|
|
33373
|
+
access: "view"
|
|
33374
|
+
},
|
|
33098
33375
|
"pipelineAnalytics.getKeyEvents": {
|
|
33099
33376
|
capName: "pipeline-analytics",
|
|
33100
33377
|
capScope: "device",
|
|
@@ -33179,6 +33456,12 @@ Object.freeze({
|
|
|
33179
33456
|
addonId: null,
|
|
33180
33457
|
access: "view"
|
|
33181
33458
|
},
|
|
33459
|
+
"pipelineAnalytics.listGroups": {
|
|
33460
|
+
capName: "pipeline-analytics",
|
|
33461
|
+
capScope: "device",
|
|
33462
|
+
addonId: null,
|
|
33463
|
+
access: "view"
|
|
33464
|
+
},
|
|
33182
33465
|
"pipelineAnalytics.listOpsLog": {
|
|
33183
33466
|
capName: "pipeline-analytics",
|
|
33184
33467
|
capScope: "device",
|
|
@@ -33191,6 +33474,12 @@ Object.freeze({
|
|
|
33191
33474
|
addonId: null,
|
|
33192
33475
|
access: "view"
|
|
33193
33476
|
},
|
|
33477
|
+
"pipelineAnalytics.listRelocateMediaJobs": {
|
|
33478
|
+
capName: "pipeline-analytics",
|
|
33479
|
+
capScope: "device",
|
|
33480
|
+
addonId: null,
|
|
33481
|
+
access: "view"
|
|
33482
|
+
},
|
|
33194
33483
|
"pipelineAnalytics.listRetrainAnnotations": {
|
|
33195
33484
|
capName: "pipeline-analytics",
|
|
33196
33485
|
capScope: "device",
|
|
@@ -33269,6 +33558,12 @@ Object.freeze({
|
|
|
33269
33558
|
addonId: null,
|
|
33270
33559
|
access: "create"
|
|
33271
33560
|
},
|
|
33561
|
+
"pipelineAnalytics.relocateMedia": {
|
|
33562
|
+
capName: "pipeline-analytics",
|
|
33563
|
+
capScope: "device",
|
|
33564
|
+
addonId: null,
|
|
33565
|
+
access: "create"
|
|
33566
|
+
},
|
|
33272
33567
|
"pipelineAnalytics.restageRetrainTrack": {
|
|
33273
33568
|
capName: "pipeline-analytics",
|
|
33274
33569
|
capScope: "device",
|
|
@@ -35960,6 +36255,11 @@ Object.freeze({
|
|
|
35960
36255
|
form: "single",
|
|
35961
36256
|
optional: false
|
|
35962
36257
|
}],
|
|
36258
|
+
"deviceManager.getBindingsBatch": [{
|
|
36259
|
+
name: "deviceIds",
|
|
36260
|
+
form: "array",
|
|
36261
|
+
optional: false
|
|
36262
|
+
}],
|
|
35963
36263
|
"deviceManager.getChildren": [{
|
|
35964
36264
|
name: "parentDeviceId",
|
|
35965
36265
|
form: "single",
|
|
@@ -36005,6 +36305,11 @@ Object.freeze({
|
|
|
36005
36305
|
form: "single",
|
|
36006
36306
|
optional: false
|
|
36007
36307
|
}],
|
|
36308
|
+
"deviceManager.getLinkedDevicesBatch": [{
|
|
36309
|
+
name: "deviceIds",
|
|
36310
|
+
form: "array",
|
|
36311
|
+
optional: false
|
|
36312
|
+
}],
|
|
36008
36313
|
"deviceManager.getSettingsSchema": [{
|
|
36009
36314
|
name: "deviceId",
|
|
36010
36315
|
form: "single",
|
|
@@ -36025,6 +36330,11 @@ Object.freeze({
|
|
|
36025
36330
|
form: "single",
|
|
36026
36331
|
optional: false
|
|
36027
36332
|
}],
|
|
36333
|
+
"deviceManager.listAll": [{
|
|
36334
|
+
name: "deviceIds",
|
|
36335
|
+
form: "array",
|
|
36336
|
+
optional: true
|
|
36337
|
+
}],
|
|
36028
36338
|
"deviceManager.loadConfig": [{
|
|
36029
36339
|
name: "deviceId",
|
|
36030
36340
|
form: "single",
|
|
@@ -36598,6 +36908,11 @@ Object.freeze({
|
|
|
36598
36908
|
form: "single",
|
|
36599
36909
|
optional: false
|
|
36600
36910
|
}],
|
|
36911
|
+
"pipelineAnalytics.getGroup": [{
|
|
36912
|
+
name: "deviceId",
|
|
36913
|
+
form: "single",
|
|
36914
|
+
optional: false
|
|
36915
|
+
}],
|
|
36601
36916
|
"pipelineAnalytics.getKeyEvents": [{
|
|
36602
36917
|
name: "deviceId",
|
|
36603
36918
|
form: "single",
|
|
@@ -36653,6 +36968,11 @@ Object.freeze({
|
|
|
36653
36968
|
form: "array",
|
|
36654
36969
|
optional: false
|
|
36655
36970
|
}],
|
|
36971
|
+
"pipelineAnalytics.listGroups": [{
|
|
36972
|
+
name: "deviceIds",
|
|
36973
|
+
form: "array",
|
|
36974
|
+
optional: false
|
|
36975
|
+
}],
|
|
36656
36976
|
"pipelineAnalytics.listOpsLog": [{
|
|
36657
36977
|
name: "deviceId",
|
|
36658
36978
|
form: "single",
|