@camstack/addon-terminal 0.1.32 → 0.1.34
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 +435 -112
- package/dist/addon.mjs +435 -112
- package/package.json +1 -1
package/dist/addon.mjs
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
|
}
|
|
@@ -6688,7 +6698,7 @@ function method(input, output, options) {
|
|
|
6688
6698
|
input,
|
|
6689
6699
|
output,
|
|
6690
6700
|
kind: options?.kind ?? "query",
|
|
6691
|
-
auth: options
|
|
6701
|
+
...options?.auth !== void 0 ? { auth: options.auth } : {},
|
|
6692
6702
|
...options?.access !== void 0 ? { access: options.access } : {},
|
|
6693
6703
|
...options?.caller !== void 0 ? { caller: options.caller } : {},
|
|
6694
6704
|
timeoutMs: options?.timeoutMs
|
|
@@ -6712,7 +6722,7 @@ function event(data) {
|
|
|
6712
6722
|
}
|
|
6713
6723
|
var StaticDirOutputSchema$1 = object({ staticDir: string() });
|
|
6714
6724
|
var VersionOutputSchema$1 = object({ version: string() });
|
|
6715
|
-
method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
|
|
6725
|
+
method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
|
|
6716
6726
|
var DeviceType = /* @__PURE__ */ function(DeviceType) {
|
|
6717
6727
|
DeviceType["Camera"] = "camera";
|
|
6718
6728
|
DeviceType["Hub"] = "hub";
|
|
@@ -7033,7 +7043,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
|
|
|
7033
7043
|
}({});
|
|
7034
7044
|
var StaticDirOutputSchema = object({ staticDir: string() });
|
|
7035
7045
|
var VersionOutputSchema = object({ version: string() });
|
|
7036
|
-
method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
|
|
7046
|
+
method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
|
|
7037
7047
|
/**
|
|
7038
7048
|
* device-ops — device-scoped cap that unifies the per-IDevice operations
|
|
7039
7049
|
* previously routed through the `.device-ops` Moleculer bridge service.
|
|
@@ -7667,24 +7677,6 @@ var RecordingRetentionSchema = object({
|
|
|
7667
7677
|
maxSizeGb: number().min(0).optional()
|
|
7668
7678
|
});
|
|
7669
7679
|
/**
|
|
7670
|
-
* Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
|
|
7671
|
-
* sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
|
|
7672
|
-
* previews at. Five graduated steps; absent on a config = `standard` (the
|
|
7673
|
-
* shipped default, matching `sheet-geometry`/`sheet-composer`).
|
|
7674
|
-
*
|
|
7675
|
-
* Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
|
|
7676
|
-
* Each window's index sidecar carries its own tile dims, so a camera whose
|
|
7677
|
-
* preset changed over time renders every historical window at the dims it was
|
|
7678
|
-
* written with.
|
|
7679
|
-
*/
|
|
7680
|
-
var ScrubThumbnailPresetSchema = _enum([
|
|
7681
|
-
"minimal",
|
|
7682
|
-
"low",
|
|
7683
|
-
"standard",
|
|
7684
|
-
"high",
|
|
7685
|
-
"max"
|
|
7686
|
-
]);
|
|
7687
|
-
/**
|
|
7688
7680
|
* The full per-camera recording intent — the wire shape of a RecordingTarget.
|
|
7689
7681
|
*
|
|
7690
7682
|
* `bands` is the ONLY authored recording intent: what to record, when, and on
|
|
@@ -7692,7 +7684,11 @@ var ScrubThumbnailPresetSchema = _enum([
|
|
|
7692
7684
|
* other field is a storage knob (profiles, segment length, retention, scrub).
|
|
7693
7685
|
*
|
|
7694
7686
|
* STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
|
|
7695
|
-
* `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30
|
|
7687
|
+
* `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
|
|
7688
|
+
* and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
|
|
7689
|
+
* deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
|
|
7690
|
+
* (D62: a switch that writes a store nobody reads is worse than no switch).
|
|
7691
|
+
* Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
|
|
7696
7692
|
* A stale caller must fail loudly — silently stripping its legacy intent would
|
|
7697
7693
|
* persist a band-less config, i.e. silently stop recording the camera.
|
|
7698
7694
|
*/
|
|
@@ -7715,14 +7711,7 @@ var RecordingConfigSchema = object({
|
|
|
7715
7711
|
* "off" is the absence of a covering band, never a band value.
|
|
7716
7712
|
*/
|
|
7717
7713
|
bands: array(RecordingBandSchema).default([]),
|
|
7718
|
-
retention: RecordingRetentionSchema.optional()
|
|
7719
|
-
/**
|
|
7720
|
-
* Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
|
|
7721
|
-
* timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
|
|
7722
|
-
* windows only — existing sheets are immutable, and each window's index
|
|
7723
|
-
* carries its own tile dims so mixed-preset history renders correctly.
|
|
7724
|
-
*/
|
|
7725
|
-
scrubThumbnails: ScrubThumbnailPresetSchema.optional()
|
|
7714
|
+
retention: RecordingRetentionSchema.optional()
|
|
7726
7715
|
}).strict();
|
|
7727
7716
|
/**
|
|
7728
7717
|
* Entity-relocation job state (storage entity-routing spec, Phase 4).
|
|
@@ -7798,10 +7787,11 @@ var RelocateFootageInputSchema = object({
|
|
|
7798
7787
|
* `RecordingConfig.enabled` or camera wrapper bindings. */
|
|
7799
7788
|
var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
|
|
7800
7789
|
var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
|
|
7801
|
-
var
|
|
7790
|
+
var RelocateMediaInputSchema = object({
|
|
7802
7791
|
toLocationId: string(),
|
|
7803
7792
|
throttleMbps: number().min(1).max(1e3).optional()
|
|
7804
|
-
})
|
|
7793
|
+
});
|
|
7794
|
+
var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
|
|
7805
7795
|
/** The independently selectable logical storage classes. `recordings`
|
|
7806
7796
|
* encompasses the high and mid segment profiles; `recordingsLow` is low
|
|
7807
7797
|
* segments; `eventMedia` is post-analysis blobs. */
|
|
@@ -8096,7 +8086,26 @@ var LabelDefinitionSchema = object({
|
|
|
8096
8086
|
description: string().optional(),
|
|
8097
8087
|
icon: string().optional()
|
|
8098
8088
|
});
|
|
8099
|
-
|
|
8089
|
+
/**
|
|
8090
|
+
* Wire schema for a per-model CATALOG classMap override
|
|
8091
|
+
* (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
|
|
8092
|
+
* restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
|
|
8093
|
+
* detection pipeline executor actually routes.
|
|
8094
|
+
*
|
|
8095
|
+
* This is deliberately a DIFFERENT, narrower shape than the general-purpose
|
|
8096
|
+
* `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
|
|
8097
|
+
* and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
|
|
8098
|
+
* enum) — the two used to share the name `ClassMapDefinition`/
|
|
8099
|
+
* `ClassMapDefinitionSchema`, which made the schema-type-twin guard
|
|
8100
|
+
* (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
|
|
8101
|
+
* are not: it is two different concepts colliding on a name. Keep this type
|
|
8102
|
+
* under its own name rather than reusing `ClassMapDefinition` — reusing it
|
|
8103
|
+
* would either narrow every `ClassMapDefinition` consumer to the four
|
|
8104
|
+
* detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
|
|
8105
|
+
* schema exists for (see the "rejects a classMap whose target is not a
|
|
8106
|
+
* detection macro" test in `model-catalog-schema.test.ts`).
|
|
8107
|
+
*/
|
|
8108
|
+
var DetectionCatalogClassMapSchema = object({
|
|
8100
8109
|
mapping: record(string(), _enum([
|
|
8101
8110
|
"person",
|
|
8102
8111
|
"vehicle",
|
|
@@ -8188,6 +8197,12 @@ var ModelVariantGroupSchema = object({
|
|
|
8188
8197
|
*/
|
|
8189
8198
|
resolution: number().int().positive().optional()
|
|
8190
8199
|
});
|
|
8200
|
+
var ModelProviderIdSchema = _enum([
|
|
8201
|
+
"camstack",
|
|
8202
|
+
"frigate",
|
|
8203
|
+
"scrypted",
|
|
8204
|
+
"custom"
|
|
8205
|
+
]);
|
|
8191
8206
|
var ModelCatalogEntrySchema = object({
|
|
8192
8207
|
id: string(),
|
|
8193
8208
|
name: string(),
|
|
@@ -8285,11 +8300,17 @@ var ModelCatalogEntrySchema = object({
|
|
|
8285
8300
|
*/
|
|
8286
8301
|
group: ModelVariantGroupSchema.optional(),
|
|
8287
8302
|
/**
|
|
8303
|
+
* Catalog source for the pipeline stepper's provider-first picker. Absent on
|
|
8304
|
+
* built-in CamStack entries (treated as `camstack`) and on registry rows
|
|
8305
|
+
* persisted before this field existed (`inferModelProvider` fills those).
|
|
8306
|
+
*/
|
|
8307
|
+
provider: ModelProviderIdSchema.optional(),
|
|
8308
|
+
/**
|
|
8288
8309
|
* Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
|
|
8289
8310
|
* applies (Frigate / COCO public catalog). Set on a custom model whose raw
|
|
8290
8311
|
* labels already ARE the CamStack macros (Scrypted identity map).
|
|
8291
8312
|
*/
|
|
8292
|
-
classMap:
|
|
8313
|
+
classMap: DetectionCatalogClassMapSchema.optional()
|
|
8293
8314
|
});
|
|
8294
8315
|
var ConvertTargetSchema = discriminatedUnion("format", [object({
|
|
8295
8316
|
format: literal("openvino"),
|
|
@@ -8319,7 +8340,7 @@ var ModelConvertMetadataSchema = object({
|
|
|
8319
8340
|
"segmentation"
|
|
8320
8341
|
]),
|
|
8321
8342
|
faceAlignment: boolean().optional(),
|
|
8322
|
-
classMap:
|
|
8343
|
+
classMap: DetectionCatalogClassMapSchema.optional()
|
|
8323
8344
|
});
|
|
8324
8345
|
var ConvertResultSchema = object({
|
|
8325
8346
|
entry: ModelCatalogEntrySchema,
|
|
@@ -9182,7 +9203,7 @@ var AddonPageDeclarationSchema = object({
|
|
|
9182
9203
|
/** Display label for a CUSTOM `section` id (ignored for well-known ids). */
|
|
9183
9204
|
sectionLabel: string().optional()
|
|
9184
9205
|
});
|
|
9185
|
-
method(_void(), array(AddonPageDeclarationSchema).readonly());
|
|
9206
|
+
method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
|
|
9186
9207
|
var AddonHttpRouteSchema = object({
|
|
9187
9208
|
method: _enum([
|
|
9188
9209
|
"GET",
|
|
@@ -9417,7 +9438,7 @@ var WidgetMetadataSchema = object({
|
|
|
9417
9438
|
defaultColumns: number().int().min(1).max(12).default(6),
|
|
9418
9439
|
defaultRows: number().int().min(1).max(12).default(1)
|
|
9419
9440
|
});
|
|
9420
|
-
method(_void(), array(WidgetMetadataSchema).readonly());
|
|
9441
|
+
method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
|
|
9421
9442
|
/**
|
|
9422
9443
|
* `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
|
|
9423
9444
|
* surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
|
|
@@ -11041,7 +11062,7 @@ var CustomModelDescriptorSchema = object({
|
|
|
11041
11062
|
stepId: string(),
|
|
11042
11063
|
entry: ModelCatalogEntrySchema
|
|
11043
11064
|
});
|
|
11044
|
-
method(_void(), array(CustomModelDescriptorSchema).readonly());
|
|
11065
|
+
method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
|
|
11045
11066
|
/**
|
|
11046
11067
|
* Query filter for settings-store collections.
|
|
11047
11068
|
*/
|
|
@@ -11128,7 +11149,8 @@ method(object({
|
|
|
11128
11149
|
}), _void(), { kind: "mutation" }), method(object({
|
|
11129
11150
|
namespace: string().optional(),
|
|
11130
11151
|
collection: string(),
|
|
11131
|
-
filter: QueryFilterSchema.optional()
|
|
11152
|
+
filter: QueryFilterSchema.optional(),
|
|
11153
|
+
columns: array(string()).readonly().optional()
|
|
11132
11154
|
}), array(SettingsRecordSchema).readonly()), method(object({
|
|
11133
11155
|
namespace: string().optional(),
|
|
11134
11156
|
collection: string(),
|
|
@@ -11191,46 +11213,87 @@ var EngineInfoSchema = object({
|
|
|
11191
11213
|
kind: _enum(["relational", "vector"]),
|
|
11192
11214
|
displayName: string()
|
|
11193
11215
|
});
|
|
11194
|
-
method(_void(), EngineInfoSchema), method(object({
|
|
11216
|
+
method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
|
|
11195
11217
|
namespace: string().optional(),
|
|
11196
11218
|
collection: string(),
|
|
11197
11219
|
key: string()
|
|
11198
|
-
}), unknown()), method(object({
|
|
11220
|
+
}), unknown(), { auth: "admin" }), method(object({
|
|
11199
11221
|
namespace: string().optional(),
|
|
11200
11222
|
collection: string(),
|
|
11201
11223
|
key: string(),
|
|
11202
11224
|
value: unknown()
|
|
11203
|
-
}), _void(), {
|
|
11225
|
+
}), _void(), {
|
|
11226
|
+
kind: "mutation",
|
|
11227
|
+
auth: "admin"
|
|
11228
|
+
}), method(object({
|
|
11204
11229
|
namespace: string().optional(),
|
|
11205
11230
|
collection: string(),
|
|
11206
|
-
filter: QueryFilterSchema.optional()
|
|
11207
|
-
|
|
11231
|
+
filter: QueryFilterSchema.optional(),
|
|
11232
|
+
/**
|
|
11233
|
+
* SQL-level column projection — MUST mirror `settings-store.query`.
|
|
11234
|
+
*
|
|
11235
|
+
* ⚠ An earlier version of this comment blamed Zod stripping, and that
|
|
11236
|
+
* was wrong — corrected 2026-08-26 after the hop map
|
|
11237
|
+
* (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
|
|
11238
|
+
* There is **no Zod parse at all** between the door and the engine: the
|
|
11239
|
+
* dispatcher forwards the payload verbatim and UDS carries it whole. A
|
|
11240
|
+
* field declared here reaches `SqliteSettingsBackend` either way.
|
|
11241
|
+
*
|
|
11242
|
+
* What actually lost `columns` was the THIRD declaration of this shape:
|
|
11243
|
+
* `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
|
|
11244
|
+
* interface the engine destructures from. The field existed on both
|
|
11245
|
+
* schemas and the engine still never read it, because nothing checks a
|
|
11246
|
+
* registered provider against `InferProvider<cap>` —
|
|
11247
|
+
* `ProviderRegistration.provider` is typed `object`.
|
|
11248
|
+
*
|
|
11249
|
+
* It is declared here anyway, and must stay in step with
|
|
11250
|
+
* `settings-store.query`: a caller reading only the cap definitions has
|
|
11251
|
+
* to be able to see that this call carries a projection.
|
|
11252
|
+
* `data-door-schema-parity.spec.ts` keeps the two aligned.
|
|
11253
|
+
*/
|
|
11254
|
+
columns: array(string()).readonly().optional()
|
|
11255
|
+
}), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
|
|
11208
11256
|
namespace: string().optional(),
|
|
11209
11257
|
collection: string(),
|
|
11210
11258
|
record: SettingsRecordSchema
|
|
11211
|
-
}), _void(), {
|
|
11259
|
+
}), _void(), {
|
|
11260
|
+
kind: "mutation",
|
|
11261
|
+
auth: "admin"
|
|
11262
|
+
}), method(object({
|
|
11212
11263
|
namespace: string().optional(),
|
|
11213
11264
|
collection: string(),
|
|
11214
11265
|
id: string(),
|
|
11215
11266
|
data: record(string(), unknown())
|
|
11216
|
-
}), _void(), {
|
|
11267
|
+
}), _void(), {
|
|
11268
|
+
kind: "mutation",
|
|
11269
|
+
auth: "admin"
|
|
11270
|
+
}), method(object({
|
|
11217
11271
|
namespace: string().optional(),
|
|
11218
11272
|
collection: string(),
|
|
11219
11273
|
key: string()
|
|
11220
|
-
}), _void(), {
|
|
11274
|
+
}), _void(), {
|
|
11275
|
+
kind: "mutation",
|
|
11276
|
+
auth: "admin"
|
|
11277
|
+
}), method(object({
|
|
11221
11278
|
namespace: string().optional(),
|
|
11222
11279
|
collection: string(),
|
|
11223
11280
|
filter: MutationFilterSchema
|
|
11224
|
-
}), object({ deleted: number().int() }), {
|
|
11281
|
+
}), object({ deleted: number().int() }), {
|
|
11282
|
+
kind: "mutation",
|
|
11283
|
+
auth: "admin"
|
|
11284
|
+
}), method(object({
|
|
11225
11285
|
namespace: string().optional(),
|
|
11226
11286
|
collection: string(),
|
|
11227
11287
|
filter: MutationFilterSchema,
|
|
11228
11288
|
data: record(string(), unknown())
|
|
11229
|
-
}), object({ updated: number().int() }), {
|
|
11289
|
+
}), object({ updated: number().int() }), {
|
|
11290
|
+
kind: "mutation",
|
|
11291
|
+
auth: "admin"
|
|
11292
|
+
}), method(object({
|
|
11230
11293
|
namespace: string().optional(),
|
|
11231
11294
|
collection: string(),
|
|
11232
11295
|
filter: QueryFilterSchema.optional()
|
|
11233
|
-
}), number()), method(object({
|
|
11296
|
+
}), number(), { auth: "admin" }), method(object({
|
|
11234
11297
|
namespace: string().optional(),
|
|
11235
11298
|
collection: string(),
|
|
11236
11299
|
field: string(),
|
|
@@ -11240,15 +11303,18 @@ method(_void(), EngineInfoSchema), method(object({
|
|
|
11240
11303
|
}), array(object({
|
|
11241
11304
|
bucket: number().int(),
|
|
11242
11305
|
count: number().int()
|
|
11243
|
-
})).readonly()), method(object({
|
|
11306
|
+
})).readonly(), { auth: "admin" }), method(object({
|
|
11244
11307
|
namespace: string().optional(),
|
|
11245
11308
|
collection: string()
|
|
11246
|
-
}), boolean()), method(object({
|
|
11309
|
+
}), boolean(), { auth: "admin" }), method(object({
|
|
11247
11310
|
namespace: string().optional(),
|
|
11248
11311
|
collection: string(),
|
|
11249
11312
|
columns: array(CollectionColumnSchema).readonly(),
|
|
11250
11313
|
indexes: array(CollectionIndexSchema).readonly().optional()
|
|
11251
|
-
}), _void(), {
|
|
11314
|
+
}), _void(), {
|
|
11315
|
+
kind: "mutation",
|
|
11316
|
+
auth: "admin"
|
|
11317
|
+
});
|
|
11252
11318
|
/**
|
|
11253
11319
|
* shm ring usage stats for a `frameSink: 'shm'` decoder session —
|
|
11254
11320
|
* exposed via `decoder.getShmStats` so downstream consumers can
|
|
@@ -12021,6 +12087,27 @@ var LinkedDeviceSchema = object({
|
|
|
12021
12087
|
features: array(string()),
|
|
12022
12088
|
producesTrackedEvents: boolean().optional()
|
|
12023
12089
|
});
|
|
12090
|
+
/** One camera's resolved linked set, tagged with the camera it belongs to.
|
|
12091
|
+
* The batch answer needs the tag; the single-device answer already has it
|
|
12092
|
+
* from the input, which is why `getLinkedDevices` keeps the untagged shape. */
|
|
12093
|
+
var LinkedDevicesForDeviceSchema = object({
|
|
12094
|
+
deviceId: number(),
|
|
12095
|
+
mode: LinkedDevicesModeSchema,
|
|
12096
|
+
devices: array(LinkedDeviceSchema)
|
|
12097
|
+
});
|
|
12098
|
+
/** One device's binding map — the shape `getBindings`, `getBindingsBatch` and
|
|
12099
|
+
* `getAllBindings` all answer in. Declared once: three copies of the same
|
|
12100
|
+
* object literal is exactly how the three drift apart. */
|
|
12101
|
+
var DeviceBindingsForDeviceSchema = object({
|
|
12102
|
+
deviceId: number(),
|
|
12103
|
+
entries: array(object({
|
|
12104
|
+
capName: string(),
|
|
12105
|
+
kind: _enum(["native", "wrapped"]),
|
|
12106
|
+
providerAddonId: string(),
|
|
12107
|
+
providerNodeId: string(),
|
|
12108
|
+
nativeAddonId: string()
|
|
12109
|
+
}))
|
|
12110
|
+
});
|
|
12024
12111
|
var SavedDeviceRowSchema = object({
|
|
12025
12112
|
/** Numeric id reserved at allocateDeviceId time. */
|
|
12026
12113
|
id: number(),
|
|
@@ -12246,11 +12333,25 @@ method(object({
|
|
|
12246
12333
|
projection: _enum(["full", "slim"]).optional(),
|
|
12247
12334
|
/** Return only camera devices. Filtering server-side instead of
|
|
12248
12335
|
* shipping 293 rows to find 12. */
|
|
12249
|
-
isCamera: boolean().optional()
|
|
12336
|
+
isCamera: boolean().optional(),
|
|
12337
|
+
/**
|
|
12338
|
+
* Return only these device ids. For the caller that already KNOWS the
|
|
12339
|
+
* handful it wants and needs a field the id-bearing answer does not
|
|
12340
|
+
* carry — the viewer's linked-devices panel joins `type` and `online`
|
|
12341
|
+
* onto ~8 linked ids and, unfiltered, dragged the fleet across to do
|
|
12342
|
+
* it: 433 KB slim / 958 KB full for 967 devices, on a query that
|
|
12343
|
+
* refetches on the reconcile interval, on a phone.
|
|
12344
|
+
*
|
|
12345
|
+
* Safe to send at a hub that predates it: Zod STRIPS unknown input
|
|
12346
|
+
* keys rather than rejecting them (verified against the live hub
|
|
12347
|
+
* 2026-08-25 — 967 rows came back), so an old hub answers exactly what
|
|
12348
|
+
* it answers today and the caller filters as it already does.
|
|
12349
|
+
*/
|
|
12350
|
+
deviceIds: array(number()).optional()
|
|
12250
12351
|
}), array(DeviceInfoSchema)), method(object({ deviceId: number() }), DeviceInfoSchema.nullable()), method(object({ parentDeviceId: number() }), array(DeviceInfoSchema)), method(object({ deviceId: number() }), object({
|
|
12251
12352
|
mode: LinkedDevicesModeSchema,
|
|
12252
12353
|
devices: array(LinkedDeviceSchema)
|
|
12253
|
-
})), method(object({ deviceId: number() }), array(StreamSourceEntrySchema$1)), method(object({ deviceId: number() }), array(ConfigEntrySchema)), method(object({ deviceId: number() }), ConfigUISchemaOutput), method(object({
|
|
12354
|
+
})), 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({
|
|
12254
12355
|
deviceId: number(),
|
|
12255
12356
|
values: record(string(), unknown())
|
|
12256
12357
|
}), object({ success: literal(true) }), {
|
|
@@ -12277,25 +12378,7 @@ method(object({
|
|
|
12277
12378
|
}), method(object({ deviceId: number() }), array(StreamProbeResultSchema), {
|
|
12278
12379
|
kind: "mutation",
|
|
12279
12380
|
auth: "admin"
|
|
12280
|
-
}), method(object({ deviceId: number() }), object({
|
|
12281
|
-
deviceId: number(),
|
|
12282
|
-
entries: array(object({
|
|
12283
|
-
capName: string(),
|
|
12284
|
-
kind: _enum(["native", "wrapped"]),
|
|
12285
|
-
providerAddonId: string(),
|
|
12286
|
-
providerNodeId: string(),
|
|
12287
|
-
nativeAddonId: string()
|
|
12288
|
-
}))
|
|
12289
|
-
})), method(object({}), array(object({
|
|
12290
|
-
deviceId: number(),
|
|
12291
|
-
entries: array(object({
|
|
12292
|
-
capName: string(),
|
|
12293
|
-
kind: _enum(["native", "wrapped"]),
|
|
12294
|
-
providerAddonId: string(),
|
|
12295
|
-
providerNodeId: string(),
|
|
12296
|
-
nativeAddonId: string()
|
|
12297
|
-
}))
|
|
12298
|
-
}))), method(object({
|
|
12381
|
+
}), method(object({ deviceId: number() }), DeviceBindingsForDeviceSchema), method(object({ deviceIds: array(number()) }), array(DeviceBindingsForDeviceSchema)), method(object({}), array(DeviceBindingsForDeviceSchema)), method(object({
|
|
12299
12382
|
deviceId: number(),
|
|
12300
12383
|
capName: string(),
|
|
12301
12384
|
wrapperAddonId: string(),
|
|
@@ -12466,7 +12549,7 @@ method(object({
|
|
|
12466
12549
|
crop: _instanceof(Uint8Array),
|
|
12467
12550
|
width: number(),
|
|
12468
12551
|
height: number()
|
|
12469
|
-
}), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
|
|
12552
|
+
}), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
|
|
12470
12553
|
/**
|
|
12471
12554
|
* filesystem-browse — per-node capability for browsing the node's local
|
|
12472
12555
|
* filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
|
|
@@ -12759,19 +12842,22 @@ method(LlmGenerateBaseInputSchema.extend({
|
|
|
12759
12842
|
runtime: ManagedRuntimeConfigSchema,
|
|
12760
12843
|
/** The managed profile's timeout, threaded by the hub provider. */
|
|
12761
12844
|
timeoutMs: number().int().positive().optional()
|
|
12762
|
-
}), LlmGenerateResultSchema, {
|
|
12845
|
+
}), LlmGenerateResultSchema, {
|
|
12846
|
+
kind: "mutation",
|
|
12847
|
+
auth: "admin"
|
|
12848
|
+
}), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
|
|
12763
12849
|
kind: "mutation",
|
|
12764
12850
|
auth: "admin"
|
|
12765
12851
|
}), method(object({}), _void(), {
|
|
12766
12852
|
kind: "mutation",
|
|
12767
12853
|
auth: "admin"
|
|
12768
|
-
}), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
|
|
12854
|
+
}), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
|
|
12769
12855
|
kind: "mutation",
|
|
12770
12856
|
auth: "admin"
|
|
12771
12857
|
}), method(object({ file: string() }), _void(), {
|
|
12772
12858
|
kind: "mutation",
|
|
12773
12859
|
auth: "admin"
|
|
12774
|
-
}), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
|
|
12860
|
+
}), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
|
|
12775
12861
|
/**
|
|
12776
12862
|
* `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
|
|
12777
12863
|
* methods concat-fan across providers; single-row methods route to ONE
|
|
@@ -14705,12 +14791,15 @@ var NcOccupancyConditionSchema = object({
|
|
|
14705
14791
|
* there is no second switch that can disagree with the first and every rule
|
|
14706
14792
|
* authored before the decision migrates for free (`audioModeOf`):
|
|
14707
14793
|
*
|
|
14708
|
-
* - **LABEL mode — `labels` present.** The rule fires
|
|
14709
|
-
*
|
|
14710
|
-
* `hitPercent` and `samplingSeconds` are ignored
|
|
14711
|
-
*
|
|
14712
|
-
*
|
|
14713
|
-
*
|
|
14794
|
+
* - **LABEL mode — `labels` present.** The rule fires when `confirmHits`
|
|
14795
|
+
* labelled frames land inside `confirmWindowSec` (default 2 in 5 s).
|
|
14796
|
+
* `hitPercent` and `samplingSeconds` are still ignored — a percentage of
|
|
14797
|
+
* frames is the wrong question for a classifier that labels 1–3 frames
|
|
14798
|
+
* per episode. The count window is the brake that drops a single-frame
|
|
14799
|
+
* false positive; the rule's own `throttle` cooldown is the other. The
|
|
14800
|
+
* per-label confidence floor is the analyzer's (`classificationMinScore`,
|
|
14801
|
+
* per device) — a label only reaches this condition if the classifier was
|
|
14802
|
+
* already confident enough. `confirmHits: 1` restores first-frame fire.
|
|
14714
14803
|
* - **LEVEL mode — `dbThreshold` present, no labels.** The sampling window IS
|
|
14715
14804
|
* the condition: at least `hitPercent`% of the samples over
|
|
14716
14805
|
* `samplingSeconds` must be at or above `dbThreshold` dBFS (see
|
|
@@ -14737,14 +14826,22 @@ var NcOccupancyConditionSchema = object({
|
|
|
14737
14826
|
* an operator who typed `dog` mean the same thing.
|
|
14738
14827
|
*/
|
|
14739
14828
|
var NcAudioConditionSchema = object({
|
|
14740
|
-
/** LABEL MODE: audio macro labels. Present ⇒
|
|
14829
|
+
/** LABEL MODE: audio macro labels. Present ⇒ count-in-window confirm. */
|
|
14741
14830
|
labels: array(string().min(1)).min(1).optional(),
|
|
14742
14831
|
/** LEVEL MODE: floor in dBFS (negative-going, `0` = full scale). */
|
|
14743
14832
|
dbThreshold: number().min(-96).max(0).optional(),
|
|
14744
14833
|
/** LEVEL MODE ONLY: percentage of the window's samples that must be hits (1–100). */
|
|
14745
14834
|
hitPercent: number().int().min(1).max(100).default(60),
|
|
14746
14835
|
/** LEVEL MODE ONLY: length of the sampling window in seconds. */
|
|
14747
|
-
samplingSeconds: number().int().min(1).max(300).default(10)
|
|
14836
|
+
samplingSeconds: number().int().min(1).max(300).default(10),
|
|
14837
|
+
/**
|
|
14838
|
+
* LABEL MODE: how many labelled frames must land inside
|
|
14839
|
+
* {@link NcAudioConditionSchema.shape.confirmWindowSec} before dispatch.
|
|
14840
|
+
* Absent ⇒ 2 (the matcher default). `1` is first-frame fire.
|
|
14841
|
+
*/
|
|
14842
|
+
confirmHits: number().int().min(1).max(20).optional(),
|
|
14843
|
+
/** LABEL MODE: the window those frames must share, in seconds. Absent ⇒ 5. */
|
|
14844
|
+
confirmWindowSec: number().int().min(1).max(60).optional()
|
|
14748
14845
|
});
|
|
14749
14846
|
/**
|
|
14750
14847
|
* Which zone-crossing DIRECTION a rule accepts (`ObjectEvent.zoneCrossing`).
|
|
@@ -16271,7 +16368,7 @@ var OauthIntegrationDescriptorSchema = object({
|
|
|
16271
16368
|
*/
|
|
16272
16369
|
refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
|
|
16273
16370
|
});
|
|
16274
|
-
method(_void(), OauthIntegrationDescriptorSchema);
|
|
16371
|
+
method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
|
|
16275
16372
|
/**
|
|
16276
16373
|
* pipeline-analytics — device-scoped wrapper cap. Refines raw
|
|
16277
16374
|
* per-frame detections emitted by the pipeline runner into tracked
|
|
@@ -17118,6 +17215,46 @@ var RecentTracksPageSchema = object({
|
|
|
17118
17215
|
/** Cursor for the next page, or null when this page is the last. */
|
|
17119
17216
|
nextCursor: string().nullable()
|
|
17120
17217
|
});
|
|
17218
|
+
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
17219
|
+
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
17220
|
+
var AnalyticsGroupRecordSchema = object({
|
|
17221
|
+
id: string(),
|
|
17222
|
+
deviceId: number().int(),
|
|
17223
|
+
openedAt: number().int(),
|
|
17224
|
+
closedAt: number().int(),
|
|
17225
|
+
timestamp: number().int(),
|
|
17226
|
+
memberCount: number().int(),
|
|
17227
|
+
memberTrackIds: array(string()).readonly(),
|
|
17228
|
+
className: string(),
|
|
17229
|
+
classes: array(string()).readonly(),
|
|
17230
|
+
/** Relative event-media path, or null when the group has no picture yet. */
|
|
17231
|
+
mediaUrl: string().nullable(),
|
|
17232
|
+
singleton: boolean()
|
|
17233
|
+
});
|
|
17234
|
+
var AnalyticsGroupMemberSchema = object({
|
|
17235
|
+
trackId: string(),
|
|
17236
|
+
deviceId: number().int(),
|
|
17237
|
+
className: string(),
|
|
17238
|
+
firstSeen: number().int(),
|
|
17239
|
+
lastSeen: number().int(),
|
|
17240
|
+
mediaUrl: string().nullable()
|
|
17241
|
+
});
|
|
17242
|
+
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
17243
|
+
var ListGroupsQueryInput = object({
|
|
17244
|
+
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
17245
|
+
deviceIds: array(number()),
|
|
17246
|
+
/** Window lower bound on `closedAt` (inclusive). */
|
|
17247
|
+
since: number().optional(),
|
|
17248
|
+
/** Window upper bound on `openedAt` (inclusive). */
|
|
17249
|
+
until: number().optional(),
|
|
17250
|
+
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
17251
|
+
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
17252
|
+
cursor: string().optional()
|
|
17253
|
+
});
|
|
17254
|
+
var ListGroupsPageSchema = object({
|
|
17255
|
+
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
17256
|
+
nextCursor: string().nullable()
|
|
17257
|
+
});
|
|
17121
17258
|
var KeyEventQueryInput = object({
|
|
17122
17259
|
deviceId: number(),
|
|
17123
17260
|
/** Window lower bound (track firstSeen ≥ since). */
|
|
@@ -17193,7 +17330,9 @@ var TrackCascadeCountsSchema = object({
|
|
|
17193
17330
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
17194
17331
|
plates: number().int(),
|
|
17195
17332
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
17196
|
-
embeddings: number().int()
|
|
17333
|
+
embeddings: number().int(),
|
|
17334
|
+
/** Group membership + group rows removed with their last member (best-effort). */
|
|
17335
|
+
groups: number().int()
|
|
17197
17336
|
});
|
|
17198
17337
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
17199
17338
|
var DiskReconcileCountsSchema = object({
|
|
@@ -17339,7 +17478,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
17339
17478
|
* stationary registry). Default false: the timeline lists passages,
|
|
17340
17479
|
* not parking records (operator decision, 2026-08-15). */
|
|
17341
17480
|
includeStationary: boolean().optional()
|
|
17342
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
17481
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
|
|
17482
|
+
deviceId: number(),
|
|
17483
|
+
groupId: string().min(1)
|
|
17484
|
+
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
17343
17485
|
kind: "mutation",
|
|
17344
17486
|
auth: "admin"
|
|
17345
17487
|
}), 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({
|
|
@@ -17421,6 +17563,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
17421
17563
|
}), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
17422
17564
|
kind: "mutation",
|
|
17423
17565
|
auth: "admin"
|
|
17566
|
+
}), method(RelocateMediaInputSchema, object({ jobId: string() }), {
|
|
17567
|
+
kind: "mutation",
|
|
17568
|
+
auth: "admin"
|
|
17569
|
+
}), method(object({}), array(RelocateJobSchema).readonly(), {
|
|
17570
|
+
kind: "query",
|
|
17571
|
+
auth: "admin"
|
|
17572
|
+
}), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
17573
|
+
kind: "mutation",
|
|
17574
|
+
auth: "admin"
|
|
17424
17575
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
17425
17576
|
kind: "query",
|
|
17426
17577
|
auth: "admin"
|
|
@@ -17575,6 +17726,11 @@ object({
|
|
|
17575
17726
|
"jpeg"
|
|
17576
17727
|
])
|
|
17577
17728
|
});
|
|
17729
|
+
/**
|
|
17730
|
+
* Process-local frame identity. It is serializable so it can ride an in-process
|
|
17731
|
+
* capability call, but `registryId` deliberately prevents resolution in any
|
|
17732
|
+
* other process or execution group.
|
|
17733
|
+
*/
|
|
17578
17734
|
var FrameRefSchema = object({
|
|
17579
17735
|
registryId: string().min(1),
|
|
17580
17736
|
id: string().min(1),
|
|
@@ -17649,7 +17805,8 @@ var PipelineModelOptionSchema = object({
|
|
|
17649
17805
|
sizeMB: number()
|
|
17650
17806
|
})),
|
|
17651
17807
|
group: ModelVariantGroupSchema.optional(),
|
|
17652
|
-
legacy: boolean().optional()
|
|
17808
|
+
legacy: boolean().optional(),
|
|
17809
|
+
provider: ModelProviderIdSchema.optional()
|
|
17653
17810
|
});
|
|
17654
17811
|
var ConfigFieldBridge = custom();
|
|
17655
17812
|
var PipelineAddonSchemaSchema = object({
|
|
@@ -19883,7 +20040,7 @@ method(object({
|
|
|
19883
20040
|
* linking rather than produce an eternal token.
|
|
19884
20041
|
*/
|
|
19885
20042
|
ttlSec: union([number().int().positive(), literal("never")]).optional()
|
|
19886
|
-
}), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
|
|
20043
|
+
}), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
|
|
19887
20044
|
var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
19888
20045
|
providerId: string().min(1),
|
|
19889
20046
|
displayName: string().min(1),
|
|
@@ -19978,10 +20135,13 @@ var EvictResultSchema = object({
|
|
|
19978
20135
|
/** True when the provider has nothing left it is willing to drop on this location. */
|
|
19979
20136
|
exhausted: boolean()
|
|
19980
20137
|
});
|
|
19981
|
-
method(object({ locationId: string() }), EvictableUsageSchema), method(object({
|
|
20138
|
+
method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
|
|
19982
20139
|
locationId: string(),
|
|
19983
20140
|
targetBytes: number().int().positive()
|
|
19984
|
-
}), EvictResultSchema, {
|
|
20141
|
+
}), EvictResultSchema, {
|
|
20142
|
+
kind: "mutation",
|
|
20143
|
+
auth: "admin"
|
|
20144
|
+
});
|
|
19985
20145
|
method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
|
|
19986
20146
|
kind: "mutation",
|
|
19987
20147
|
auth: "admin"
|
|
@@ -20041,26 +20201,50 @@ var ReadChunkInputSchema = object({
|
|
|
20041
20201
|
length: number()
|
|
20042
20202
|
});
|
|
20043
20203
|
var EndDownloadInputSchema = object({ downloadId: string() });
|
|
20044
|
-
method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
|
|
20204
|
+
method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
|
|
20045
20205
|
location: StorageLocationSchema,
|
|
20046
20206
|
relativePath: string()
|
|
20047
|
-
}), string()), method(object({
|
|
20207
|
+
}), string(), { auth: "admin" }), method(object({
|
|
20048
20208
|
location: StorageLocationSchema,
|
|
20049
20209
|
relativePath: string(),
|
|
20050
20210
|
data: _instanceof(Uint8Array)
|
|
20051
|
-
}), _void(), {
|
|
20211
|
+
}), _void(), {
|
|
20212
|
+
kind: "mutation",
|
|
20213
|
+
auth: "admin"
|
|
20214
|
+
}), method(object({
|
|
20052
20215
|
location: StorageLocationSchema,
|
|
20053
20216
|
relativePath: string()
|
|
20054
|
-
}), _instanceof(Uint8Array)), method(object({
|
|
20217
|
+
}), _instanceof(Uint8Array), { auth: "admin" }), method(object({
|
|
20055
20218
|
location: StorageLocationSchema,
|
|
20056
20219
|
relativePath: string()
|
|
20057
|
-
}), boolean()), method(object({
|
|
20220
|
+
}), boolean(), { auth: "admin" }), method(object({
|
|
20058
20221
|
location: StorageLocationSchema,
|
|
20059
20222
|
prefix: string().optional()
|
|
20060
|
-
}), array(string()).readonly()), method(object({
|
|
20223
|
+
}), array(string()).readonly(), { auth: "admin" }), method(object({
|
|
20061
20224
|
location: StorageLocationSchema,
|
|
20062
20225
|
relativePath: string()
|
|
20063
|
-
}), _void(), {
|
|
20226
|
+
}), _void(), {
|
|
20227
|
+
kind: "mutation",
|
|
20228
|
+
auth: "admin"
|
|
20229
|
+
}), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
|
|
20230
|
+
kind: "mutation",
|
|
20231
|
+
auth: "admin"
|
|
20232
|
+
}), method(WriteChunkInputSchema, _void(), {
|
|
20233
|
+
kind: "mutation",
|
|
20234
|
+
auth: "admin"
|
|
20235
|
+
}), method(FinalizeUploadInputSchema, _void(), {
|
|
20236
|
+
kind: "mutation",
|
|
20237
|
+
auth: "admin"
|
|
20238
|
+
}), method(AbortUploadInputSchema, _void(), {
|
|
20239
|
+
kind: "mutation",
|
|
20240
|
+
auth: "admin"
|
|
20241
|
+
}), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
|
|
20242
|
+
kind: "mutation",
|
|
20243
|
+
auth: "admin"
|
|
20244
|
+
}), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
|
|
20245
|
+
kind: "mutation",
|
|
20246
|
+
auth: "admin"
|
|
20247
|
+
});
|
|
20064
20248
|
/** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
|
|
20065
20249
|
var ProfileSettingsSchemaBridge = unknown().nullable();
|
|
20066
20250
|
var ProfileSettingsBagSchema = record(string(), unknown());
|
|
@@ -20362,7 +20546,8 @@ method(object({
|
|
|
20362
20546
|
access: "create"
|
|
20363
20547
|
}), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
|
|
20364
20548
|
kind: "mutation",
|
|
20365
|
-
access: "view"
|
|
20549
|
+
access: "view",
|
|
20550
|
+
auth: "admin"
|
|
20366
20551
|
}), method(object({
|
|
20367
20552
|
/** Required — the user the assertion belongs to (verified). */
|
|
20368
20553
|
userId: string(),
|
|
@@ -20370,10 +20555,12 @@ method(object({
|
|
|
20370
20555
|
response: record(string(), unknown())
|
|
20371
20556
|
}), object({ verified: boolean() }), {
|
|
20372
20557
|
kind: "mutation",
|
|
20373
|
-
access: "view"
|
|
20558
|
+
access: "view",
|
|
20559
|
+
auth: "admin"
|
|
20374
20560
|
}), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
|
|
20375
20561
|
kind: "mutation",
|
|
20376
|
-
access: "view"
|
|
20562
|
+
access: "view",
|
|
20563
|
+
auth: "admin"
|
|
20377
20564
|
}), method(object({
|
|
20378
20565
|
/** AuthenticationResponseJSON from the browser. */
|
|
20379
20566
|
response: record(string(), unknown()) }), object({
|
|
@@ -20381,7 +20568,8 @@ response: record(string(), unknown()) }), object({
|
|
|
20381
20568
|
userId: string().nullable()
|
|
20382
20569
|
}), {
|
|
20383
20570
|
kind: "mutation",
|
|
20384
|
-
access: "view"
|
|
20571
|
+
access: "view",
|
|
20572
|
+
auth: "admin"
|
|
20385
20573
|
}), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
|
|
20386
20574
|
userId: string(),
|
|
20387
20575
|
credentialId: string()
|
|
@@ -20553,7 +20741,19 @@ var VectorStatsResultSchema = object({
|
|
|
20553
20741
|
/** False when the backend ranks approximately. */
|
|
20554
20742
|
exact: boolean()
|
|
20555
20743
|
});
|
|
20556
|
-
method(VectorDeclareIndexInputSchema, _void(), {
|
|
20744
|
+
method(VectorDeclareIndexInputSchema, _void(), {
|
|
20745
|
+
kind: "mutation",
|
|
20746
|
+
auth: "admin"
|
|
20747
|
+
}), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
|
|
20748
|
+
kind: "mutation",
|
|
20749
|
+
auth: "admin"
|
|
20750
|
+
}), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
|
|
20751
|
+
kind: "mutation",
|
|
20752
|
+
auth: "admin"
|
|
20753
|
+
}), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
|
|
20754
|
+
kind: "mutation",
|
|
20755
|
+
auth: "admin"
|
|
20756
|
+
}), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
|
|
20557
20757
|
var ClipSchema = object({
|
|
20558
20758
|
/** Opaque, provider-namespaced id. The default provider encodes the time
|
|
20559
20759
|
* window so `getClipPlayback` is self-contained (no event re-query). */
|
|
@@ -23006,7 +23206,27 @@ var MediaFileLiteSchema$1 = object({
|
|
|
23006
23206
|
sizeBytes: number(),
|
|
23007
23207
|
timestamp: number()
|
|
23008
23208
|
});
|
|
23009
|
-
method(
|
|
23209
|
+
method(object({
|
|
23210
|
+
/**
|
|
23211
|
+
* Inline {@link IdentitySchema.coverBase64} on every row.
|
|
23212
|
+
*
|
|
23213
|
+
* Default `false`, the same inversion `listRecentFaces` and
|
|
23214
|
+
* `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
|
|
23215
|
+
* why the burden belongs on the caller that WANTS the bytes). Measured
|
|
23216
|
+
* on the live hub the same day: four identities cost 40,979 B with the
|
|
23217
|
+
* covers inline, ~10 KB of base64 per row, on a query this UI mounts
|
|
23218
|
+
* four times and the viewer holds at `staleTime: 30_000`.
|
|
23219
|
+
*
|
|
23220
|
+
* Nothing loses its avatar: `coverMediaKey` is already on every row and
|
|
23221
|
+
* the `event-media` plane serves that key `immutable` with an ETag.
|
|
23222
|
+
*
|
|
23223
|
+
* **This is an INPUT field, so it does not reach the addon until the
|
|
23224
|
+
* next train** — the hub router validates cap inputs against its own
|
|
23225
|
+
* compiled Zod and strips a key it does not know. Until then the
|
|
23226
|
+
* provider sees `undefined`, which resolves to `false`: the cheap shape
|
|
23227
|
+
* is what ships, and the opt-in becomes reachable when the train lands.
|
|
23228
|
+
*/
|
|
23229
|
+
includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
|
|
23010
23230
|
kind: "mutation",
|
|
23011
23231
|
auth: "admin"
|
|
23012
23232
|
}), method(object({
|
|
@@ -25894,7 +26114,14 @@ var PlateInfoSchema = object({
|
|
|
25894
26114
|
plateBbox: BoundingBoxSchema.optional(),
|
|
25895
26115
|
/** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
|
|
25896
26116
|
keyFrameMediaKey: string().optional(),
|
|
25897
|
-
base64: string().optional()
|
|
26117
|
+
base64: string().optional(),
|
|
26118
|
+
/**
|
|
26119
|
+
* Same crop as a data-plane URL, always present when the plate has a stored
|
|
26120
|
+
* crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
|
|
26121
|
+
* and `searchPlates` inline the crop only when their `includeCrops` input is
|
|
26122
|
+
* left at its `true` default.
|
|
26123
|
+
*/
|
|
26124
|
+
cropUrl: string().optional()
|
|
25898
26125
|
});
|
|
25899
26126
|
var MediaFileLiteSchema = object({
|
|
25900
26127
|
key: string(),
|
|
@@ -25912,14 +26139,34 @@ var PlateClusterSchema = object({
|
|
|
25912
26139
|
});
|
|
25913
26140
|
method(object({
|
|
25914
26141
|
deviceId: number().int().optional(),
|
|
25915
|
-
limit: number().int().positive().optional()
|
|
26142
|
+
limit: number().int().positive().optional(),
|
|
26143
|
+
/**
|
|
26144
|
+
* Inline the base64 crop on every row. Default `true` — the existing
|
|
26145
|
+
* behaviour, kept so no caller breaks.
|
|
26146
|
+
*
|
|
26147
|
+
* Set `false` once the caller renders {@link PlateInfo.cropUrl}.
|
|
26148
|
+
* Measured on the live hub at the 500 rows the Plates view asks for:
|
|
26149
|
+
* 879,403 B and 27.7 s with the crops inline, against a few KiB of
|
|
26150
|
+
* metadata without them — and the browser then caches the images.
|
|
26151
|
+
*
|
|
26152
|
+
* This is the plate twin of `faceGallery.listRecentFaces`'s option;
|
|
26153
|
+
* plates were the one gallery list left without it.
|
|
26154
|
+
*
|
|
26155
|
+
* **This is an INPUT field, so it does not reach the addon until the
|
|
26156
|
+
* next train.** The hub router validates cap inputs against its own
|
|
26157
|
+
* compiled Zod and strips a key it does not know. Until the train
|
|
26158
|
+
* ships, sending `false` is harmless and keeps the crops inline.
|
|
26159
|
+
*/
|
|
26160
|
+
includeCrops: boolean().optional()
|
|
25916
26161
|
}).optional(), array(PlateInfoSchema).readonly()), method(object({
|
|
25917
26162
|
deviceId: number().int(),
|
|
25918
26163
|
trackId: string()
|
|
25919
26164
|
}), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
|
|
25920
26165
|
text: string().min(1),
|
|
25921
26166
|
maxDistance: number().int().min(0).optional(),
|
|
25922
|
-
limit: number().int().positive().optional()
|
|
26167
|
+
limit: number().int().positive().optional(),
|
|
26168
|
+
/** See `listPlates.includeCrops`. Default `true`. */
|
|
26169
|
+
includeCrops: boolean().optional()
|
|
25923
26170
|
}), array(PlateInfoSchema).readonly()), method(object({
|
|
25924
26171
|
maxDistance: number().int().min(0).optional(),
|
|
25925
26172
|
minClusterSize: number().int().min(2).optional(),
|
|
@@ -25933,7 +26180,13 @@ method(object({
|
|
|
25933
26180
|
}), method(object({ plateId: string() }), _void(), {
|
|
25934
26181
|
kind: "mutation",
|
|
25935
26182
|
auth: "admin"
|
|
25936
|
-
}), method(
|
|
26183
|
+
}), method(object({
|
|
26184
|
+
/** Inline {@link VehicleSchema.coverBase64} on every row. Default
|
|
26185
|
+
* `false` — the vehicle twin of `faceGallery.listIdentities`'s
|
|
26186
|
+
* option; `coverMediaKey` + the `event-media` plane carry the picture.
|
|
26187
|
+
* INPUT field: stripped by the hub router until the train ships, which
|
|
26188
|
+
* resolves to `false` and is exactly the intended default. */
|
|
26189
|
+
includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
|
|
25937
26190
|
kind: "mutation",
|
|
25938
26191
|
auth: "admin"
|
|
25939
26192
|
}), method(object({
|
|
@@ -31416,6 +31669,12 @@ Object.freeze({
|
|
|
31416
31669
|
addonId: null,
|
|
31417
31670
|
access: "view"
|
|
31418
31671
|
},
|
|
31672
|
+
"deviceManager.getBindingsBatch": {
|
|
31673
|
+
capName: "device-manager",
|
|
31674
|
+
capScope: "system",
|
|
31675
|
+
addonId: null,
|
|
31676
|
+
access: "view"
|
|
31677
|
+
},
|
|
31419
31678
|
"deviceManager.getChildren": {
|
|
31420
31679
|
capName: "device-manager",
|
|
31421
31680
|
capScope: "system",
|
|
@@ -31476,6 +31735,12 @@ Object.freeze({
|
|
|
31476
31735
|
addonId: null,
|
|
31477
31736
|
access: "view"
|
|
31478
31737
|
},
|
|
31738
|
+
"deviceManager.getLinkedDevicesBatch": {
|
|
31739
|
+
capName: "device-manager",
|
|
31740
|
+
capScope: "system",
|
|
31741
|
+
addonId: null,
|
|
31742
|
+
access: "view"
|
|
31743
|
+
},
|
|
31479
31744
|
"deviceManager.getRoleDisplayDefaults": {
|
|
31480
31745
|
capName: "device-manager",
|
|
31481
31746
|
capScope: "system",
|
|
@@ -33180,6 +33445,12 @@ Object.freeze({
|
|
|
33180
33445
|
addonId: null,
|
|
33181
33446
|
access: "create"
|
|
33182
33447
|
},
|
|
33448
|
+
"pipelineAnalytics.cancelRelocateMedia": {
|
|
33449
|
+
capName: "pipeline-analytics",
|
|
33450
|
+
capScope: "device",
|
|
33451
|
+
addonId: null,
|
|
33452
|
+
access: "create"
|
|
33453
|
+
},
|
|
33183
33454
|
"pipelineAnalytics.cancelStorageMigrationMove": {
|
|
33184
33455
|
capName: "pipeline-analytics",
|
|
33185
33456
|
capScope: "device",
|
|
@@ -33246,6 +33517,12 @@ Object.freeze({
|
|
|
33246
33517
|
addonId: null,
|
|
33247
33518
|
access: "view"
|
|
33248
33519
|
},
|
|
33520
|
+
"pipelineAnalytics.getGroup": {
|
|
33521
|
+
capName: "pipeline-analytics",
|
|
33522
|
+
capScope: "device",
|
|
33523
|
+
addonId: null,
|
|
33524
|
+
access: "view"
|
|
33525
|
+
},
|
|
33249
33526
|
"pipelineAnalytics.getKeyEvents": {
|
|
33250
33527
|
capName: "pipeline-analytics",
|
|
33251
33528
|
capScope: "device",
|
|
@@ -33330,6 +33607,12 @@ Object.freeze({
|
|
|
33330
33607
|
addonId: null,
|
|
33331
33608
|
access: "view"
|
|
33332
33609
|
},
|
|
33610
|
+
"pipelineAnalytics.listGroups": {
|
|
33611
|
+
capName: "pipeline-analytics",
|
|
33612
|
+
capScope: "device",
|
|
33613
|
+
addonId: null,
|
|
33614
|
+
access: "view"
|
|
33615
|
+
},
|
|
33333
33616
|
"pipelineAnalytics.listOpsLog": {
|
|
33334
33617
|
capName: "pipeline-analytics",
|
|
33335
33618
|
capScope: "device",
|
|
@@ -33342,6 +33625,12 @@ Object.freeze({
|
|
|
33342
33625
|
addonId: null,
|
|
33343
33626
|
access: "view"
|
|
33344
33627
|
},
|
|
33628
|
+
"pipelineAnalytics.listRelocateMediaJobs": {
|
|
33629
|
+
capName: "pipeline-analytics",
|
|
33630
|
+
capScope: "device",
|
|
33631
|
+
addonId: null,
|
|
33632
|
+
access: "view"
|
|
33633
|
+
},
|
|
33345
33634
|
"pipelineAnalytics.listRetrainAnnotations": {
|
|
33346
33635
|
capName: "pipeline-analytics",
|
|
33347
33636
|
capScope: "device",
|
|
@@ -33420,6 +33709,12 @@ Object.freeze({
|
|
|
33420
33709
|
addonId: null,
|
|
33421
33710
|
access: "create"
|
|
33422
33711
|
},
|
|
33712
|
+
"pipelineAnalytics.relocateMedia": {
|
|
33713
|
+
capName: "pipeline-analytics",
|
|
33714
|
+
capScope: "device",
|
|
33715
|
+
addonId: null,
|
|
33716
|
+
access: "create"
|
|
33717
|
+
},
|
|
33423
33718
|
"pipelineAnalytics.restageRetrainTrack": {
|
|
33424
33719
|
capName: "pipeline-analytics",
|
|
33425
33720
|
capScope: "device",
|
|
@@ -36111,6 +36406,11 @@ Object.freeze({
|
|
|
36111
36406
|
form: "single",
|
|
36112
36407
|
optional: false
|
|
36113
36408
|
}],
|
|
36409
|
+
"deviceManager.getBindingsBatch": [{
|
|
36410
|
+
name: "deviceIds",
|
|
36411
|
+
form: "array",
|
|
36412
|
+
optional: false
|
|
36413
|
+
}],
|
|
36114
36414
|
"deviceManager.getChildren": [{
|
|
36115
36415
|
name: "parentDeviceId",
|
|
36116
36416
|
form: "single",
|
|
@@ -36156,6 +36456,11 @@ Object.freeze({
|
|
|
36156
36456
|
form: "single",
|
|
36157
36457
|
optional: false
|
|
36158
36458
|
}],
|
|
36459
|
+
"deviceManager.getLinkedDevicesBatch": [{
|
|
36460
|
+
name: "deviceIds",
|
|
36461
|
+
form: "array",
|
|
36462
|
+
optional: false
|
|
36463
|
+
}],
|
|
36159
36464
|
"deviceManager.getSettingsSchema": [{
|
|
36160
36465
|
name: "deviceId",
|
|
36161
36466
|
form: "single",
|
|
@@ -36176,6 +36481,11 @@ Object.freeze({
|
|
|
36176
36481
|
form: "single",
|
|
36177
36482
|
optional: false
|
|
36178
36483
|
}],
|
|
36484
|
+
"deviceManager.listAll": [{
|
|
36485
|
+
name: "deviceIds",
|
|
36486
|
+
form: "array",
|
|
36487
|
+
optional: true
|
|
36488
|
+
}],
|
|
36179
36489
|
"deviceManager.loadConfig": [{
|
|
36180
36490
|
name: "deviceId",
|
|
36181
36491
|
form: "single",
|
|
@@ -36749,6 +37059,11 @@ Object.freeze({
|
|
|
36749
37059
|
form: "single",
|
|
36750
37060
|
optional: false
|
|
36751
37061
|
}],
|
|
37062
|
+
"pipelineAnalytics.getGroup": [{
|
|
37063
|
+
name: "deviceId",
|
|
37064
|
+
form: "single",
|
|
37065
|
+
optional: false
|
|
37066
|
+
}],
|
|
36752
37067
|
"pipelineAnalytics.getKeyEvents": [{
|
|
36753
37068
|
name: "deviceId",
|
|
36754
37069
|
form: "single",
|
|
@@ -36804,6 +37119,11 @@ Object.freeze({
|
|
|
36804
37119
|
form: "array",
|
|
36805
37120
|
optional: false
|
|
36806
37121
|
}],
|
|
37122
|
+
"pipelineAnalytics.listGroups": [{
|
|
37123
|
+
name: "deviceIds",
|
|
37124
|
+
form: "array",
|
|
37125
|
+
optional: false
|
|
37126
|
+
}],
|
|
36807
37127
|
"pipelineAnalytics.listOpsLog": [{
|
|
36808
37128
|
name: "deviceId",
|
|
36809
37129
|
form: "single",
|
|
@@ -44258,7 +44578,10 @@ function sanitizeProfileSettings(profileId, raw) {
|
|
|
44258
44578
|
showContainers: true,
|
|
44259
44579
|
showSensors: true
|
|
44260
44580
|
};
|
|
44261
|
-
for (const plugin of GLANCES_PLUGINS)
|
|
44581
|
+
for (const plugin of GLANCES_PLUGINS) {
|
|
44582
|
+
const value = bag[plugin.key];
|
|
44583
|
+
if (typeof value === "boolean") out[plugin.key] = value;
|
|
44584
|
+
}
|
|
44262
44585
|
return out;
|
|
44263
44586
|
}
|
|
44264
44587
|
function profileSettingsToArgs(profileId, settings) {
|