@camstack/addon-tailscale 1.2.27 → 1.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/client/tailscale.addon.js +1 -1
- package/dist/client/tailscale.addon.mjs +1 -1
- package/dist/{dist-CovkuhH2.mjs → dist-BBIgF6Kz.mjs} +431 -111
- package/dist/{dist-BrkbC1tE.js → dist-D7-pccbD.js} +431 -111
- package/dist/ingress/tailscale-ingress.addon.js +1 -1
- package/dist/ingress/tailscale-ingress.addon.mjs +1 -1
- package/package.json +1 -1
|
@@ -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
|
|
@@ -6639,7 +6649,7 @@ function systemMethod(input, output, options) {
|
|
|
6639
6649
|
}
|
|
6640
6650
|
var StaticDirOutputSchema$1 = object({ staticDir: string() });
|
|
6641
6651
|
var VersionOutputSchema$1 = object({ version: string() });
|
|
6642
|
-
method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
|
|
6652
|
+
method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
|
|
6643
6653
|
var DeviceType = /* @__PURE__ */ function(DeviceType) {
|
|
6644
6654
|
DeviceType["Camera"] = "camera";
|
|
6645
6655
|
DeviceType["Hub"] = "hub";
|
|
@@ -6960,7 +6970,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
|
|
|
6960
6970
|
}({});
|
|
6961
6971
|
var StaticDirOutputSchema = object({ staticDir: string() });
|
|
6962
6972
|
var VersionOutputSchema = object({ version: string() });
|
|
6963
|
-
method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
|
|
6973
|
+
method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
|
|
6964
6974
|
/**
|
|
6965
6975
|
* device-ops — device-scoped cap that unifies the per-IDevice operations
|
|
6966
6976
|
* previously routed through the `.device-ops` Moleculer bridge service.
|
|
@@ -7608,24 +7618,6 @@ var RecordingRetentionSchema = object({
|
|
|
7608
7618
|
maxSizeGb: number().min(0).optional()
|
|
7609
7619
|
});
|
|
7610
7620
|
/**
|
|
7611
|
-
* Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
|
|
7612
|
-
* sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
|
|
7613
|
-
* previews at. Five graduated steps; absent on a config = `standard` (the
|
|
7614
|
-
* shipped default, matching `sheet-geometry`/`sheet-composer`).
|
|
7615
|
-
*
|
|
7616
|
-
* Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
|
|
7617
|
-
* Each window's index sidecar carries its own tile dims, so a camera whose
|
|
7618
|
-
* preset changed over time renders every historical window at the dims it was
|
|
7619
|
-
* written with.
|
|
7620
|
-
*/
|
|
7621
|
-
var ScrubThumbnailPresetSchema = _enum([
|
|
7622
|
-
"minimal",
|
|
7623
|
-
"low",
|
|
7624
|
-
"standard",
|
|
7625
|
-
"high",
|
|
7626
|
-
"max"
|
|
7627
|
-
]);
|
|
7628
|
-
/**
|
|
7629
7621
|
* The full per-camera recording intent — the wire shape of a RecordingTarget.
|
|
7630
7622
|
*
|
|
7631
7623
|
* `bands` is the ONLY authored recording intent: what to record, when, and on
|
|
@@ -7633,7 +7625,11 @@ var ScrubThumbnailPresetSchema = _enum([
|
|
|
7633
7625
|
* other field is a storage knob (profiles, segment length, retention, scrub).
|
|
7634
7626
|
*
|
|
7635
7627
|
* STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
|
|
7636
|
-
* `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30
|
|
7628
|
+
* `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
|
|
7629
|
+
* and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
|
|
7630
|
+
* deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
|
|
7631
|
+
* (D62: a switch that writes a store nobody reads is worse than no switch).
|
|
7632
|
+
* Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
|
|
7637
7633
|
* A stale caller must fail loudly — silently stripping its legacy intent would
|
|
7638
7634
|
* persist a band-less config, i.e. silently stop recording the camera.
|
|
7639
7635
|
*/
|
|
@@ -7656,14 +7652,7 @@ var RecordingConfigSchema = object({
|
|
|
7656
7652
|
* "off" is the absence of a covering band, never a band value.
|
|
7657
7653
|
*/
|
|
7658
7654
|
bands: array(RecordingBandSchema).default([]),
|
|
7659
|
-
retention: RecordingRetentionSchema.optional()
|
|
7660
|
-
/**
|
|
7661
|
-
* Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
|
|
7662
|
-
* timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
|
|
7663
|
-
* windows only — existing sheets are immutable, and each window's index
|
|
7664
|
-
* carries its own tile dims so mixed-preset history renders correctly.
|
|
7665
|
-
*/
|
|
7666
|
-
scrubThumbnails: ScrubThumbnailPresetSchema.optional()
|
|
7655
|
+
retention: RecordingRetentionSchema.optional()
|
|
7667
7656
|
}).strict();
|
|
7668
7657
|
/**
|
|
7669
7658
|
* Entity-relocation job state (storage entity-routing spec, Phase 4).
|
|
@@ -7739,10 +7728,11 @@ var RelocateFootageInputSchema = object({
|
|
|
7739
7728
|
* `RecordingConfig.enabled` or camera wrapper bindings. */
|
|
7740
7729
|
var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
|
|
7741
7730
|
var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
|
|
7742
|
-
var
|
|
7731
|
+
var RelocateMediaInputSchema = object({
|
|
7743
7732
|
toLocationId: string(),
|
|
7744
7733
|
throttleMbps: number().min(1).max(1e3).optional()
|
|
7745
|
-
})
|
|
7734
|
+
});
|
|
7735
|
+
var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
|
|
7746
7736
|
/** The independently selectable logical storage classes. `recordings`
|
|
7747
7737
|
* encompasses the high and mid segment profiles; `recordingsLow` is low
|
|
7748
7738
|
* segments; `eventMedia` is post-analysis blobs. */
|
|
@@ -8037,7 +8027,26 @@ var LabelDefinitionSchema = object({
|
|
|
8037
8027
|
description: string().optional(),
|
|
8038
8028
|
icon: string().optional()
|
|
8039
8029
|
});
|
|
8040
|
-
|
|
8030
|
+
/**
|
|
8031
|
+
* Wire schema for a per-model CATALOG classMap override
|
|
8032
|
+
* (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
|
|
8033
|
+
* restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
|
|
8034
|
+
* detection pipeline executor actually routes.
|
|
8035
|
+
*
|
|
8036
|
+
* This is deliberately a DIFFERENT, narrower shape than the general-purpose
|
|
8037
|
+
* `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
|
|
8038
|
+
* and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
|
|
8039
|
+
* enum) — the two used to share the name `ClassMapDefinition`/
|
|
8040
|
+
* `ClassMapDefinitionSchema`, which made the schema-type-twin guard
|
|
8041
|
+
* (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
|
|
8042
|
+
* are not: it is two different concepts colliding on a name. Keep this type
|
|
8043
|
+
* under its own name rather than reusing `ClassMapDefinition` — reusing it
|
|
8044
|
+
* would either narrow every `ClassMapDefinition` consumer to the four
|
|
8045
|
+
* detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
|
|
8046
|
+
* schema exists for (see the "rejects a classMap whose target is not a
|
|
8047
|
+
* detection macro" test in `model-catalog-schema.test.ts`).
|
|
8048
|
+
*/
|
|
8049
|
+
var DetectionCatalogClassMapSchema = object({
|
|
8041
8050
|
mapping: record(string(), _enum([
|
|
8042
8051
|
"person",
|
|
8043
8052
|
"vehicle",
|
|
@@ -8129,6 +8138,12 @@ var ModelVariantGroupSchema = object({
|
|
|
8129
8138
|
*/
|
|
8130
8139
|
resolution: number().int().positive().optional()
|
|
8131
8140
|
});
|
|
8141
|
+
var ModelProviderIdSchema = _enum([
|
|
8142
|
+
"camstack",
|
|
8143
|
+
"frigate",
|
|
8144
|
+
"scrypted",
|
|
8145
|
+
"custom"
|
|
8146
|
+
]);
|
|
8132
8147
|
var ModelCatalogEntrySchema = object({
|
|
8133
8148
|
id: string(),
|
|
8134
8149
|
name: string(),
|
|
@@ -8226,11 +8241,17 @@ var ModelCatalogEntrySchema = object({
|
|
|
8226
8241
|
*/
|
|
8227
8242
|
group: ModelVariantGroupSchema.optional(),
|
|
8228
8243
|
/**
|
|
8244
|
+
* Catalog source for the pipeline stepper's provider-first picker. Absent on
|
|
8245
|
+
* built-in CamStack entries (treated as `camstack`) and on registry rows
|
|
8246
|
+
* persisted before this field existed (`inferModelProvider` fills those).
|
|
8247
|
+
*/
|
|
8248
|
+
provider: ModelProviderIdSchema.optional(),
|
|
8249
|
+
/**
|
|
8229
8250
|
* Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
|
|
8230
8251
|
* applies (Frigate / COCO public catalog). Set on a custom model whose raw
|
|
8231
8252
|
* labels already ARE the CamStack macros (Scrypted identity map).
|
|
8232
8253
|
*/
|
|
8233
|
-
classMap:
|
|
8254
|
+
classMap: DetectionCatalogClassMapSchema.optional()
|
|
8234
8255
|
});
|
|
8235
8256
|
var ConvertTargetSchema = discriminatedUnion("format", [object({
|
|
8236
8257
|
format: literal("openvino"),
|
|
@@ -8260,7 +8281,7 @@ var ModelConvertMetadataSchema = object({
|
|
|
8260
8281
|
"segmentation"
|
|
8261
8282
|
]),
|
|
8262
8283
|
faceAlignment: boolean().optional(),
|
|
8263
|
-
classMap:
|
|
8284
|
+
classMap: DetectionCatalogClassMapSchema.optional()
|
|
8264
8285
|
});
|
|
8265
8286
|
var ConvertResultSchema = object({
|
|
8266
8287
|
entry: ModelCatalogEntrySchema,
|
|
@@ -9123,7 +9144,7 @@ var AddonPageDeclarationSchema = object({
|
|
|
9123
9144
|
/** Display label for a CUSTOM `section` id (ignored for well-known ids). */
|
|
9124
9145
|
sectionLabel: string().optional()
|
|
9125
9146
|
});
|
|
9126
|
-
method(_void(), array(AddonPageDeclarationSchema).readonly());
|
|
9147
|
+
method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
|
|
9127
9148
|
var AddonHttpRouteSchema = object({
|
|
9128
9149
|
method: _enum([
|
|
9129
9150
|
"GET",
|
|
@@ -9358,7 +9379,7 @@ var WidgetMetadataSchema = object({
|
|
|
9358
9379
|
defaultColumns: number().int().min(1).max(12).default(6),
|
|
9359
9380
|
defaultRows: number().int().min(1).max(12).default(1)
|
|
9360
9381
|
});
|
|
9361
|
-
method(_void(), array(WidgetMetadataSchema).readonly());
|
|
9382
|
+
method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
|
|
9362
9383
|
/**
|
|
9363
9384
|
* `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
|
|
9364
9385
|
* surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
|
|
@@ -10880,7 +10901,7 @@ var CustomModelDescriptorSchema = object({
|
|
|
10880
10901
|
stepId: string(),
|
|
10881
10902
|
entry: ModelCatalogEntrySchema
|
|
10882
10903
|
});
|
|
10883
|
-
method(_void(), array(CustomModelDescriptorSchema).readonly());
|
|
10904
|
+
method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
|
|
10884
10905
|
/**
|
|
10885
10906
|
* Query filter for settings-store collections.
|
|
10886
10907
|
*/
|
|
@@ -10967,7 +10988,8 @@ method(object({
|
|
|
10967
10988
|
}), _void(), { kind: "mutation" }), method(object({
|
|
10968
10989
|
namespace: string().optional(),
|
|
10969
10990
|
collection: string(),
|
|
10970
|
-
filter: QueryFilterSchema.optional()
|
|
10991
|
+
filter: QueryFilterSchema.optional(),
|
|
10992
|
+
columns: array(string()).readonly().optional()
|
|
10971
10993
|
}), array(SettingsRecordSchema).readonly()), method(object({
|
|
10972
10994
|
namespace: string().optional(),
|
|
10973
10995
|
collection: string(),
|
|
@@ -11030,46 +11052,87 @@ var EngineInfoSchema = object({
|
|
|
11030
11052
|
kind: _enum(["relational", "vector"]),
|
|
11031
11053
|
displayName: string()
|
|
11032
11054
|
});
|
|
11033
|
-
method(_void(), EngineInfoSchema), method(object({
|
|
11055
|
+
method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
|
|
11034
11056
|
namespace: string().optional(),
|
|
11035
11057
|
collection: string(),
|
|
11036
11058
|
key: string()
|
|
11037
|
-
}), unknown()), method(object({
|
|
11059
|
+
}), unknown(), { auth: "admin" }), method(object({
|
|
11038
11060
|
namespace: string().optional(),
|
|
11039
11061
|
collection: string(),
|
|
11040
11062
|
key: string(),
|
|
11041
11063
|
value: unknown()
|
|
11042
|
-
}), _void(), {
|
|
11064
|
+
}), _void(), {
|
|
11065
|
+
kind: "mutation",
|
|
11066
|
+
auth: "admin"
|
|
11067
|
+
}), method(object({
|
|
11043
11068
|
namespace: string().optional(),
|
|
11044
11069
|
collection: string(),
|
|
11045
|
-
filter: QueryFilterSchema.optional()
|
|
11046
|
-
|
|
11070
|
+
filter: QueryFilterSchema.optional(),
|
|
11071
|
+
/**
|
|
11072
|
+
* SQL-level column projection — MUST mirror `settings-store.query`.
|
|
11073
|
+
*
|
|
11074
|
+
* ⚠ An earlier version of this comment blamed Zod stripping, and that
|
|
11075
|
+
* was wrong — corrected 2026-08-26 after the hop map
|
|
11076
|
+
* (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
|
|
11077
|
+
* There is **no Zod parse at all** between the door and the engine: the
|
|
11078
|
+
* dispatcher forwards the payload verbatim and UDS carries it whole. A
|
|
11079
|
+
* field declared here reaches `SqliteSettingsBackend` either way.
|
|
11080
|
+
*
|
|
11081
|
+
* What actually lost `columns` was the THIRD declaration of this shape:
|
|
11082
|
+
* `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
|
|
11083
|
+
* interface the engine destructures from. The field existed on both
|
|
11084
|
+
* schemas and the engine still never read it, because nothing checks a
|
|
11085
|
+
* registered provider against `InferProvider<cap>` —
|
|
11086
|
+
* `ProviderRegistration.provider` is typed `object`.
|
|
11087
|
+
*
|
|
11088
|
+
* It is declared here anyway, and must stay in step with
|
|
11089
|
+
* `settings-store.query`: a caller reading only the cap definitions has
|
|
11090
|
+
* to be able to see that this call carries a projection.
|
|
11091
|
+
* `data-door-schema-parity.spec.ts` keeps the two aligned.
|
|
11092
|
+
*/
|
|
11093
|
+
columns: array(string()).readonly().optional()
|
|
11094
|
+
}), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
|
|
11047
11095
|
namespace: string().optional(),
|
|
11048
11096
|
collection: string(),
|
|
11049
11097
|
record: SettingsRecordSchema
|
|
11050
|
-
}), _void(), {
|
|
11098
|
+
}), _void(), {
|
|
11099
|
+
kind: "mutation",
|
|
11100
|
+
auth: "admin"
|
|
11101
|
+
}), method(object({
|
|
11051
11102
|
namespace: string().optional(),
|
|
11052
11103
|
collection: string(),
|
|
11053
11104
|
id: string(),
|
|
11054
11105
|
data: record(string(), unknown())
|
|
11055
|
-
}), _void(), {
|
|
11106
|
+
}), _void(), {
|
|
11107
|
+
kind: "mutation",
|
|
11108
|
+
auth: "admin"
|
|
11109
|
+
}), method(object({
|
|
11056
11110
|
namespace: string().optional(),
|
|
11057
11111
|
collection: string(),
|
|
11058
11112
|
key: string()
|
|
11059
|
-
}), _void(), {
|
|
11113
|
+
}), _void(), {
|
|
11114
|
+
kind: "mutation",
|
|
11115
|
+
auth: "admin"
|
|
11116
|
+
}), method(object({
|
|
11060
11117
|
namespace: string().optional(),
|
|
11061
11118
|
collection: string(),
|
|
11062
11119
|
filter: MutationFilterSchema
|
|
11063
|
-
}), object({ deleted: number().int() }), {
|
|
11120
|
+
}), object({ deleted: number().int() }), {
|
|
11121
|
+
kind: "mutation",
|
|
11122
|
+
auth: "admin"
|
|
11123
|
+
}), method(object({
|
|
11064
11124
|
namespace: string().optional(),
|
|
11065
11125
|
collection: string(),
|
|
11066
11126
|
filter: MutationFilterSchema,
|
|
11067
11127
|
data: record(string(), unknown())
|
|
11068
|
-
}), object({ updated: number().int() }), {
|
|
11128
|
+
}), object({ updated: number().int() }), {
|
|
11129
|
+
kind: "mutation",
|
|
11130
|
+
auth: "admin"
|
|
11131
|
+
}), method(object({
|
|
11069
11132
|
namespace: string().optional(),
|
|
11070
11133
|
collection: string(),
|
|
11071
11134
|
filter: QueryFilterSchema.optional()
|
|
11072
|
-
}), number()), method(object({
|
|
11135
|
+
}), number(), { auth: "admin" }), method(object({
|
|
11073
11136
|
namespace: string().optional(),
|
|
11074
11137
|
collection: string(),
|
|
11075
11138
|
field: string(),
|
|
@@ -11079,15 +11142,18 @@ method(_void(), EngineInfoSchema), method(object({
|
|
|
11079
11142
|
}), array(object({
|
|
11080
11143
|
bucket: number().int(),
|
|
11081
11144
|
count: number().int()
|
|
11082
|
-
})).readonly()), method(object({
|
|
11145
|
+
})).readonly(), { auth: "admin" }), method(object({
|
|
11083
11146
|
namespace: string().optional(),
|
|
11084
11147
|
collection: string()
|
|
11085
|
-
}), boolean()), method(object({
|
|
11148
|
+
}), boolean(), { auth: "admin" }), method(object({
|
|
11086
11149
|
namespace: string().optional(),
|
|
11087
11150
|
collection: string(),
|
|
11088
11151
|
columns: array(CollectionColumnSchema).readonly(),
|
|
11089
11152
|
indexes: array(CollectionIndexSchema).readonly().optional()
|
|
11090
|
-
}), _void(), {
|
|
11153
|
+
}), _void(), {
|
|
11154
|
+
kind: "mutation",
|
|
11155
|
+
auth: "admin"
|
|
11156
|
+
});
|
|
11091
11157
|
/**
|
|
11092
11158
|
* shm ring usage stats for a `frameSink: 'shm'` decoder session —
|
|
11093
11159
|
* exposed via `decoder.getShmStats` so downstream consumers can
|
|
@@ -11753,6 +11819,27 @@ var LinkedDeviceSchema = object({
|
|
|
11753
11819
|
features: array(string()),
|
|
11754
11820
|
producesTrackedEvents: boolean().optional()
|
|
11755
11821
|
});
|
|
11822
|
+
/** One camera's resolved linked set, tagged with the camera it belongs to.
|
|
11823
|
+
* The batch answer needs the tag; the single-device answer already has it
|
|
11824
|
+
* from the input, which is why `getLinkedDevices` keeps the untagged shape. */
|
|
11825
|
+
var LinkedDevicesForDeviceSchema = object({
|
|
11826
|
+
deviceId: number(),
|
|
11827
|
+
mode: LinkedDevicesModeSchema,
|
|
11828
|
+
devices: array(LinkedDeviceSchema)
|
|
11829
|
+
});
|
|
11830
|
+
/** One device's binding map — the shape `getBindings`, `getBindingsBatch` and
|
|
11831
|
+
* `getAllBindings` all answer in. Declared once: three copies of the same
|
|
11832
|
+
* object literal is exactly how the three drift apart. */
|
|
11833
|
+
var DeviceBindingsForDeviceSchema = object({
|
|
11834
|
+
deviceId: number(),
|
|
11835
|
+
entries: array(object({
|
|
11836
|
+
capName: string(),
|
|
11837
|
+
kind: _enum(["native", "wrapped"]),
|
|
11838
|
+
providerAddonId: string(),
|
|
11839
|
+
providerNodeId: string(),
|
|
11840
|
+
nativeAddonId: string()
|
|
11841
|
+
}))
|
|
11842
|
+
});
|
|
11756
11843
|
var SavedDeviceRowSchema = object({
|
|
11757
11844
|
/** Numeric id reserved at allocateDeviceId time. */
|
|
11758
11845
|
id: number(),
|
|
@@ -11978,11 +12065,25 @@ method(object({
|
|
|
11978
12065
|
projection: _enum(["full", "slim"]).optional(),
|
|
11979
12066
|
/** Return only camera devices. Filtering server-side instead of
|
|
11980
12067
|
* shipping 293 rows to find 12. */
|
|
11981
|
-
isCamera: boolean().optional()
|
|
12068
|
+
isCamera: boolean().optional(),
|
|
12069
|
+
/**
|
|
12070
|
+
* Return only these device ids. For the caller that already KNOWS the
|
|
12071
|
+
* handful it wants and needs a field the id-bearing answer does not
|
|
12072
|
+
* carry — the viewer's linked-devices panel joins `type` and `online`
|
|
12073
|
+
* onto ~8 linked ids and, unfiltered, dragged the fleet across to do
|
|
12074
|
+
* it: 433 KB slim / 958 KB full for 967 devices, on a query that
|
|
12075
|
+
* refetches on the reconcile interval, on a phone.
|
|
12076
|
+
*
|
|
12077
|
+
* Safe to send at a hub that predates it: Zod STRIPS unknown input
|
|
12078
|
+
* keys rather than rejecting them (verified against the live hub
|
|
12079
|
+
* 2026-08-25 — 967 rows came back), so an old hub answers exactly what
|
|
12080
|
+
* it answers today and the caller filters as it already does.
|
|
12081
|
+
*/
|
|
12082
|
+
deviceIds: array(number()).optional()
|
|
11982
12083
|
}), array(DeviceInfoSchema)), method(object({ deviceId: number() }), DeviceInfoSchema.nullable()), method(object({ parentDeviceId: number() }), array(DeviceInfoSchema)), method(object({ deviceId: number() }), object({
|
|
11983
12084
|
mode: LinkedDevicesModeSchema,
|
|
11984
12085
|
devices: array(LinkedDeviceSchema)
|
|
11985
|
-
})), method(object({ deviceId: number() }), array(StreamSourceEntrySchema$1)), method(object({ deviceId: number() }), array(ConfigEntrySchema)), method(object({ deviceId: number() }), ConfigUISchemaOutput), method(object({
|
|
12086
|
+
})), 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({
|
|
11986
12087
|
deviceId: number(),
|
|
11987
12088
|
values: record(string(), unknown())
|
|
11988
12089
|
}), object({ success: literal(true) }), {
|
|
@@ -12009,25 +12110,7 @@ method(object({
|
|
|
12009
12110
|
}), method(object({ deviceId: number() }), array(StreamProbeResultSchema), {
|
|
12010
12111
|
kind: "mutation",
|
|
12011
12112
|
auth: "admin"
|
|
12012
|
-
}), method(object({ deviceId: number() }), object({
|
|
12013
|
-
deviceId: number(),
|
|
12014
|
-
entries: array(object({
|
|
12015
|
-
capName: string(),
|
|
12016
|
-
kind: _enum(["native", "wrapped"]),
|
|
12017
|
-
providerAddonId: string(),
|
|
12018
|
-
providerNodeId: string(),
|
|
12019
|
-
nativeAddonId: string()
|
|
12020
|
-
}))
|
|
12021
|
-
})), method(object({}), array(object({
|
|
12022
|
-
deviceId: number(),
|
|
12023
|
-
entries: array(object({
|
|
12024
|
-
capName: string(),
|
|
12025
|
-
kind: _enum(["native", "wrapped"]),
|
|
12026
|
-
providerAddonId: string(),
|
|
12027
|
-
providerNodeId: string(),
|
|
12028
|
-
nativeAddonId: string()
|
|
12029
|
-
}))
|
|
12030
|
-
}))), method(object({
|
|
12113
|
+
}), method(object({ deviceId: number() }), DeviceBindingsForDeviceSchema), method(object({ deviceIds: array(number()) }), array(DeviceBindingsForDeviceSchema)), method(object({}), array(DeviceBindingsForDeviceSchema)), method(object({
|
|
12031
12114
|
deviceId: number(),
|
|
12032
12115
|
capName: string(),
|
|
12033
12116
|
wrapperAddonId: string(),
|
|
@@ -12198,7 +12281,7 @@ method(object({
|
|
|
12198
12281
|
crop: _instanceof(Uint8Array),
|
|
12199
12282
|
width: number(),
|
|
12200
12283
|
height: number()
|
|
12201
|
-
}), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
|
|
12284
|
+
}), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
|
|
12202
12285
|
/**
|
|
12203
12286
|
* filesystem-browse — per-node capability for browsing the node's local
|
|
12204
12287
|
* filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
|
|
@@ -12491,19 +12574,22 @@ method(LlmGenerateBaseInputSchema.extend({
|
|
|
12491
12574
|
runtime: ManagedRuntimeConfigSchema,
|
|
12492
12575
|
/** The managed profile's timeout, threaded by the hub provider. */
|
|
12493
12576
|
timeoutMs: number().int().positive().optional()
|
|
12494
|
-
}), LlmGenerateResultSchema, {
|
|
12577
|
+
}), LlmGenerateResultSchema, {
|
|
12578
|
+
kind: "mutation",
|
|
12579
|
+
auth: "admin"
|
|
12580
|
+
}), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
|
|
12495
12581
|
kind: "mutation",
|
|
12496
12582
|
auth: "admin"
|
|
12497
12583
|
}), method(object({}), _void(), {
|
|
12498
12584
|
kind: "mutation",
|
|
12499
12585
|
auth: "admin"
|
|
12500
|
-
}), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
|
|
12586
|
+
}), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
|
|
12501
12587
|
kind: "mutation",
|
|
12502
12588
|
auth: "admin"
|
|
12503
12589
|
}), method(object({ file: string() }), _void(), {
|
|
12504
12590
|
kind: "mutation",
|
|
12505
12591
|
auth: "admin"
|
|
12506
|
-
}), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
|
|
12592
|
+
}), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
|
|
12507
12593
|
/**
|
|
12508
12594
|
* `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
|
|
12509
12595
|
* methods concat-fan across providers; single-row methods route to ONE
|
|
@@ -14416,12 +14502,15 @@ var NcOccupancyConditionSchema = object({
|
|
|
14416
14502
|
* there is no second switch that can disagree with the first and every rule
|
|
14417
14503
|
* authored before the decision migrates for free (`audioModeOf`):
|
|
14418
14504
|
*
|
|
14419
|
-
* - **LABEL mode — `labels` present.** The rule fires
|
|
14420
|
-
*
|
|
14421
|
-
* `hitPercent` and `samplingSeconds` are ignored
|
|
14422
|
-
*
|
|
14423
|
-
*
|
|
14424
|
-
*
|
|
14505
|
+
* - **LABEL mode — `labels` present.** The rule fires when `confirmHits`
|
|
14506
|
+
* labelled frames land inside `confirmWindowSec` (default 2 in 5 s).
|
|
14507
|
+
* `hitPercent` and `samplingSeconds` are still ignored — a percentage of
|
|
14508
|
+
* frames is the wrong question for a classifier that labels 1–3 frames
|
|
14509
|
+
* per episode. The count window is the brake that drops a single-frame
|
|
14510
|
+
* false positive; the rule's own `throttle` cooldown is the other. The
|
|
14511
|
+
* per-label confidence floor is the analyzer's (`classificationMinScore`,
|
|
14512
|
+
* per device) — a label only reaches this condition if the classifier was
|
|
14513
|
+
* already confident enough. `confirmHits: 1` restores first-frame fire.
|
|
14425
14514
|
* - **LEVEL mode — `dbThreshold` present, no labels.** The sampling window IS
|
|
14426
14515
|
* the condition: at least `hitPercent`% of the samples over
|
|
14427
14516
|
* `samplingSeconds` must be at or above `dbThreshold` dBFS (see
|
|
@@ -14448,14 +14537,22 @@ var NcOccupancyConditionSchema = object({
|
|
|
14448
14537
|
* an operator who typed `dog` mean the same thing.
|
|
14449
14538
|
*/
|
|
14450
14539
|
var NcAudioConditionSchema = object({
|
|
14451
|
-
/** LABEL MODE: audio macro labels. Present ⇒
|
|
14540
|
+
/** LABEL MODE: audio macro labels. Present ⇒ count-in-window confirm. */
|
|
14452
14541
|
labels: array(string().min(1)).min(1).optional(),
|
|
14453
14542
|
/** LEVEL MODE: floor in dBFS (negative-going, `0` = full scale). */
|
|
14454
14543
|
dbThreshold: number().min(-96).max(0).optional(),
|
|
14455
14544
|
/** LEVEL MODE ONLY: percentage of the window's samples that must be hits (1–100). */
|
|
14456
14545
|
hitPercent: number().int().min(1).max(100).default(60),
|
|
14457
14546
|
/** LEVEL MODE ONLY: length of the sampling window in seconds. */
|
|
14458
|
-
samplingSeconds: number().int().min(1).max(300).default(10)
|
|
14547
|
+
samplingSeconds: number().int().min(1).max(300).default(10),
|
|
14548
|
+
/**
|
|
14549
|
+
* LABEL MODE: how many labelled frames must land inside
|
|
14550
|
+
* {@link NcAudioConditionSchema.shape.confirmWindowSec} before dispatch.
|
|
14551
|
+
* Absent ⇒ 2 (the matcher default). `1` is first-frame fire.
|
|
14552
|
+
*/
|
|
14553
|
+
confirmHits: number().int().min(1).max(20).optional(),
|
|
14554
|
+
/** LABEL MODE: the window those frames must share, in seconds. Absent ⇒ 5. */
|
|
14555
|
+
confirmWindowSec: number().int().min(1).max(60).optional()
|
|
14459
14556
|
});
|
|
14460
14557
|
/**
|
|
14461
14558
|
* Which zone-crossing DIRECTION a rule accepts (`ObjectEvent.zoneCrossing`).
|
|
@@ -15982,7 +16079,7 @@ var OauthIntegrationDescriptorSchema = object({
|
|
|
15982
16079
|
*/
|
|
15983
16080
|
refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
|
|
15984
16081
|
});
|
|
15985
|
-
method(_void(), OauthIntegrationDescriptorSchema);
|
|
16082
|
+
method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
|
|
15986
16083
|
/**
|
|
15987
16084
|
* pipeline-analytics — device-scoped wrapper cap. Refines raw
|
|
15988
16085
|
* per-frame detections emitted by the pipeline runner into tracked
|
|
@@ -16829,6 +16926,46 @@ var RecentTracksPageSchema = object({
|
|
|
16829
16926
|
/** Cursor for the next page, or null when this page is the last. */
|
|
16830
16927
|
nextCursor: string().nullable()
|
|
16831
16928
|
});
|
|
16929
|
+
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
16930
|
+
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
16931
|
+
var AnalyticsGroupRecordSchema = object({
|
|
16932
|
+
id: string(),
|
|
16933
|
+
deviceId: number().int(),
|
|
16934
|
+
openedAt: number().int(),
|
|
16935
|
+
closedAt: number().int(),
|
|
16936
|
+
timestamp: number().int(),
|
|
16937
|
+
memberCount: number().int(),
|
|
16938
|
+
memberTrackIds: array(string()).readonly(),
|
|
16939
|
+
className: string(),
|
|
16940
|
+
classes: array(string()).readonly(),
|
|
16941
|
+
/** Relative event-media path, or null when the group has no picture yet. */
|
|
16942
|
+
mediaUrl: string().nullable(),
|
|
16943
|
+
singleton: boolean()
|
|
16944
|
+
});
|
|
16945
|
+
var AnalyticsGroupMemberSchema = object({
|
|
16946
|
+
trackId: string(),
|
|
16947
|
+
deviceId: number().int(),
|
|
16948
|
+
className: string(),
|
|
16949
|
+
firstSeen: number().int(),
|
|
16950
|
+
lastSeen: number().int(),
|
|
16951
|
+
mediaUrl: string().nullable()
|
|
16952
|
+
});
|
|
16953
|
+
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
16954
|
+
var ListGroupsQueryInput = object({
|
|
16955
|
+
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
16956
|
+
deviceIds: array(number()),
|
|
16957
|
+
/** Window lower bound on `closedAt` (inclusive). */
|
|
16958
|
+
since: number().optional(),
|
|
16959
|
+
/** Window upper bound on `openedAt` (inclusive). */
|
|
16960
|
+
until: number().optional(),
|
|
16961
|
+
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
16962
|
+
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
16963
|
+
cursor: string().optional()
|
|
16964
|
+
});
|
|
16965
|
+
var ListGroupsPageSchema = object({
|
|
16966
|
+
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
16967
|
+
nextCursor: string().nullable()
|
|
16968
|
+
});
|
|
16832
16969
|
var KeyEventQueryInput = object({
|
|
16833
16970
|
deviceId: number(),
|
|
16834
16971
|
/** Window lower bound (track firstSeen ≥ since). */
|
|
@@ -16904,7 +17041,9 @@ var TrackCascadeCountsSchema = object({
|
|
|
16904
17041
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
16905
17042
|
plates: number().int(),
|
|
16906
17043
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
16907
|
-
embeddings: number().int()
|
|
17044
|
+
embeddings: number().int(),
|
|
17045
|
+
/** Group membership + group rows removed with their last member (best-effort). */
|
|
17046
|
+
groups: number().int()
|
|
16908
17047
|
});
|
|
16909
17048
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
16910
17049
|
var DiskReconcileCountsSchema = object({
|
|
@@ -17050,7 +17189,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
17050
17189
|
* stationary registry). Default false: the timeline lists passages,
|
|
17051
17190
|
* not parking records (operator decision, 2026-08-15). */
|
|
17052
17191
|
includeStationary: boolean().optional()
|
|
17053
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
17192
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
|
|
17193
|
+
deviceId: number(),
|
|
17194
|
+
groupId: string().min(1)
|
|
17195
|
+
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
17054
17196
|
kind: "mutation",
|
|
17055
17197
|
auth: "admin"
|
|
17056
17198
|
}), 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({
|
|
@@ -17132,6 +17274,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
17132
17274
|
}), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
17133
17275
|
kind: "mutation",
|
|
17134
17276
|
auth: "admin"
|
|
17277
|
+
}), method(RelocateMediaInputSchema, object({ jobId: string() }), {
|
|
17278
|
+
kind: "mutation",
|
|
17279
|
+
auth: "admin"
|
|
17280
|
+
}), method(object({}), array(RelocateJobSchema).readonly(), {
|
|
17281
|
+
kind: "query",
|
|
17282
|
+
auth: "admin"
|
|
17283
|
+
}), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
|
|
17284
|
+
kind: "mutation",
|
|
17285
|
+
auth: "admin"
|
|
17135
17286
|
}), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
|
|
17136
17287
|
kind: "query",
|
|
17137
17288
|
auth: "admin"
|
|
@@ -17286,6 +17437,11 @@ object({
|
|
|
17286
17437
|
"jpeg"
|
|
17287
17438
|
])
|
|
17288
17439
|
});
|
|
17440
|
+
/**
|
|
17441
|
+
* Process-local frame identity. It is serializable so it can ride an in-process
|
|
17442
|
+
* capability call, but `registryId` deliberately prevents resolution in any
|
|
17443
|
+
* other process or execution group.
|
|
17444
|
+
*/
|
|
17289
17445
|
var FrameRefSchema = object({
|
|
17290
17446
|
registryId: string().min(1),
|
|
17291
17447
|
id: string().min(1),
|
|
@@ -17360,7 +17516,8 @@ var PipelineModelOptionSchema = object({
|
|
|
17360
17516
|
sizeMB: number()
|
|
17361
17517
|
})),
|
|
17362
17518
|
group: ModelVariantGroupSchema.optional(),
|
|
17363
|
-
legacy: boolean().optional()
|
|
17519
|
+
legacy: boolean().optional(),
|
|
17520
|
+
provider: ModelProviderIdSchema.optional()
|
|
17364
17521
|
});
|
|
17365
17522
|
var ConfigFieldBridge = custom();
|
|
17366
17523
|
var PipelineAddonSchemaSchema = object({
|
|
@@ -19450,7 +19607,7 @@ method(object({
|
|
|
19450
19607
|
* linking rather than produce an eternal token.
|
|
19451
19608
|
*/
|
|
19452
19609
|
ttlSec: union([number().int().positive(), literal("never")]).optional()
|
|
19453
|
-
}), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
|
|
19610
|
+
}), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
|
|
19454
19611
|
var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
19455
19612
|
providerId: string().min(1),
|
|
19456
19613
|
displayName: string().min(1),
|
|
@@ -19545,10 +19702,13 @@ var EvictResultSchema = object({
|
|
|
19545
19702
|
/** True when the provider has nothing left it is willing to drop on this location. */
|
|
19546
19703
|
exhausted: boolean()
|
|
19547
19704
|
});
|
|
19548
|
-
method(object({ locationId: string() }), EvictableUsageSchema), method(object({
|
|
19705
|
+
method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
|
|
19549
19706
|
locationId: string(),
|
|
19550
19707
|
targetBytes: number().int().positive()
|
|
19551
|
-
}), EvictResultSchema, {
|
|
19708
|
+
}), EvictResultSchema, {
|
|
19709
|
+
kind: "mutation",
|
|
19710
|
+
auth: "admin"
|
|
19711
|
+
});
|
|
19552
19712
|
method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
|
|
19553
19713
|
kind: "mutation",
|
|
19554
19714
|
auth: "admin"
|
|
@@ -19608,26 +19768,50 @@ var ReadChunkInputSchema = object({
|
|
|
19608
19768
|
length: number()
|
|
19609
19769
|
});
|
|
19610
19770
|
var EndDownloadInputSchema = object({ downloadId: string() });
|
|
19611
|
-
method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
|
|
19771
|
+
method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
|
|
19612
19772
|
location: StorageLocationSchema,
|
|
19613
19773
|
relativePath: string()
|
|
19614
|
-
}), string()), method(object({
|
|
19774
|
+
}), string(), { auth: "admin" }), method(object({
|
|
19615
19775
|
location: StorageLocationSchema,
|
|
19616
19776
|
relativePath: string(),
|
|
19617
19777
|
data: _instanceof(Uint8Array)
|
|
19618
|
-
}), _void(), {
|
|
19778
|
+
}), _void(), {
|
|
19779
|
+
kind: "mutation",
|
|
19780
|
+
auth: "admin"
|
|
19781
|
+
}), method(object({
|
|
19619
19782
|
location: StorageLocationSchema,
|
|
19620
19783
|
relativePath: string()
|
|
19621
|
-
}), _instanceof(Uint8Array)), method(object({
|
|
19784
|
+
}), _instanceof(Uint8Array), { auth: "admin" }), method(object({
|
|
19622
19785
|
location: StorageLocationSchema,
|
|
19623
19786
|
relativePath: string()
|
|
19624
|
-
}), boolean()), method(object({
|
|
19787
|
+
}), boolean(), { auth: "admin" }), method(object({
|
|
19625
19788
|
location: StorageLocationSchema,
|
|
19626
19789
|
prefix: string().optional()
|
|
19627
|
-
}), array(string()).readonly()), method(object({
|
|
19790
|
+
}), array(string()).readonly(), { auth: "admin" }), method(object({
|
|
19628
19791
|
location: StorageLocationSchema,
|
|
19629
19792
|
relativePath: string()
|
|
19630
|
-
}), _void(), {
|
|
19793
|
+
}), _void(), {
|
|
19794
|
+
kind: "mutation",
|
|
19795
|
+
auth: "admin"
|
|
19796
|
+
}), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
|
|
19797
|
+
kind: "mutation",
|
|
19798
|
+
auth: "admin"
|
|
19799
|
+
}), method(WriteChunkInputSchema, _void(), {
|
|
19800
|
+
kind: "mutation",
|
|
19801
|
+
auth: "admin"
|
|
19802
|
+
}), method(FinalizeUploadInputSchema, _void(), {
|
|
19803
|
+
kind: "mutation",
|
|
19804
|
+
auth: "admin"
|
|
19805
|
+
}), method(AbortUploadInputSchema, _void(), {
|
|
19806
|
+
kind: "mutation",
|
|
19807
|
+
auth: "admin"
|
|
19808
|
+
}), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
|
|
19809
|
+
kind: "mutation",
|
|
19810
|
+
auth: "admin"
|
|
19811
|
+
}), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
|
|
19812
|
+
kind: "mutation",
|
|
19813
|
+
auth: "admin"
|
|
19814
|
+
});
|
|
19631
19815
|
/** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
|
|
19632
19816
|
var ProfileSettingsSchemaBridge = unknown().nullable();
|
|
19633
19817
|
var ProfileSettingsBagSchema = record(string(), unknown());
|
|
@@ -19885,7 +20069,8 @@ method(object({
|
|
|
19885
20069
|
access: "create"
|
|
19886
20070
|
}), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
|
|
19887
20071
|
kind: "mutation",
|
|
19888
|
-
access: "view"
|
|
20072
|
+
access: "view",
|
|
20073
|
+
auth: "admin"
|
|
19889
20074
|
}), method(object({
|
|
19890
20075
|
/** Required — the user the assertion belongs to (verified). */
|
|
19891
20076
|
userId: string(),
|
|
@@ -19893,10 +20078,12 @@ method(object({
|
|
|
19893
20078
|
response: record(string(), unknown())
|
|
19894
20079
|
}), object({ verified: boolean() }), {
|
|
19895
20080
|
kind: "mutation",
|
|
19896
|
-
access: "view"
|
|
20081
|
+
access: "view",
|
|
20082
|
+
auth: "admin"
|
|
19897
20083
|
}), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
|
|
19898
20084
|
kind: "mutation",
|
|
19899
|
-
access: "view"
|
|
20085
|
+
access: "view",
|
|
20086
|
+
auth: "admin"
|
|
19900
20087
|
}), method(object({
|
|
19901
20088
|
/** AuthenticationResponseJSON from the browser. */
|
|
19902
20089
|
response: record(string(), unknown()) }), object({
|
|
@@ -19904,7 +20091,8 @@ response: record(string(), unknown()) }), object({
|
|
|
19904
20091
|
userId: string().nullable()
|
|
19905
20092
|
}), {
|
|
19906
20093
|
kind: "mutation",
|
|
19907
|
-
access: "view"
|
|
20094
|
+
access: "view",
|
|
20095
|
+
auth: "admin"
|
|
19908
20096
|
}), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
|
|
19909
20097
|
userId: string(),
|
|
19910
20098
|
credentialId: string()
|
|
@@ -20076,7 +20264,19 @@ var VectorStatsResultSchema = object({
|
|
|
20076
20264
|
/** False when the backend ranks approximately. */
|
|
20077
20265
|
exact: boolean()
|
|
20078
20266
|
});
|
|
20079
|
-
method(VectorDeclareIndexInputSchema, _void(), {
|
|
20267
|
+
method(VectorDeclareIndexInputSchema, _void(), {
|
|
20268
|
+
kind: "mutation",
|
|
20269
|
+
auth: "admin"
|
|
20270
|
+
}), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
|
|
20271
|
+
kind: "mutation",
|
|
20272
|
+
auth: "admin"
|
|
20273
|
+
}), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
|
|
20274
|
+
kind: "mutation",
|
|
20275
|
+
auth: "admin"
|
|
20276
|
+
}), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
|
|
20277
|
+
kind: "mutation",
|
|
20278
|
+
auth: "admin"
|
|
20279
|
+
}), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
|
|
20080
20280
|
var ClipSchema = object({
|
|
20081
20281
|
/** Opaque, provider-namespaced id. The default provider encodes the time
|
|
20082
20282
|
* window so `getClipPlayback` is self-contained (no event re-query). */
|
|
@@ -21799,7 +21999,27 @@ var MediaFileLiteSchema$1 = object({
|
|
|
21799
21999
|
sizeBytes: number(),
|
|
21800
22000
|
timestamp: number()
|
|
21801
22001
|
});
|
|
21802
|
-
method(
|
|
22002
|
+
method(object({
|
|
22003
|
+
/**
|
|
22004
|
+
* Inline {@link IdentitySchema.coverBase64} on every row.
|
|
22005
|
+
*
|
|
22006
|
+
* Default `false`, the same inversion `listRecentFaces` and
|
|
22007
|
+
* `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
|
|
22008
|
+
* why the burden belongs on the caller that WANTS the bytes). Measured
|
|
22009
|
+
* on the live hub the same day: four identities cost 40,979 B with the
|
|
22010
|
+
* covers inline, ~10 KB of base64 per row, on a query this UI mounts
|
|
22011
|
+
* four times and the viewer holds at `staleTime: 30_000`.
|
|
22012
|
+
*
|
|
22013
|
+
* Nothing loses its avatar: `coverMediaKey` is already on every row and
|
|
22014
|
+
* the `event-media` plane serves that key `immutable` with an ETag.
|
|
22015
|
+
*
|
|
22016
|
+
* **This is an INPUT field, so it does not reach the addon until the
|
|
22017
|
+
* next train** — the hub router validates cap inputs against its own
|
|
22018
|
+
* compiled Zod and strips a key it does not know. Until then the
|
|
22019
|
+
* provider sees `undefined`, which resolves to `false`: the cheap shape
|
|
22020
|
+
* is what ships, and the opt-in becomes reachable when the train lands.
|
|
22021
|
+
*/
|
|
22022
|
+
includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
|
|
21803
22023
|
kind: "mutation",
|
|
21804
22024
|
auth: "admin"
|
|
21805
22025
|
}), method(object({
|
|
@@ -24005,7 +24225,14 @@ var PlateInfoSchema = object({
|
|
|
24005
24225
|
plateBbox: BoundingBoxSchema.optional(),
|
|
24006
24226
|
/** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
|
|
24007
24227
|
keyFrameMediaKey: string().optional(),
|
|
24008
|
-
base64: string().optional()
|
|
24228
|
+
base64: string().optional(),
|
|
24229
|
+
/**
|
|
24230
|
+
* Same crop as a data-plane URL, always present when the plate has a stored
|
|
24231
|
+
* crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
|
|
24232
|
+
* and `searchPlates` inline the crop only when their `includeCrops` input is
|
|
24233
|
+
* left at its `true` default.
|
|
24234
|
+
*/
|
|
24235
|
+
cropUrl: string().optional()
|
|
24009
24236
|
});
|
|
24010
24237
|
var MediaFileLiteSchema = object({
|
|
24011
24238
|
key: string(),
|
|
@@ -24023,14 +24250,34 @@ var PlateClusterSchema = object({
|
|
|
24023
24250
|
});
|
|
24024
24251
|
method(object({
|
|
24025
24252
|
deviceId: number().int().optional(),
|
|
24026
|
-
limit: number().int().positive().optional()
|
|
24253
|
+
limit: number().int().positive().optional(),
|
|
24254
|
+
/**
|
|
24255
|
+
* Inline the base64 crop on every row. Default `true` — the existing
|
|
24256
|
+
* behaviour, kept so no caller breaks.
|
|
24257
|
+
*
|
|
24258
|
+
* Set `false` once the caller renders {@link PlateInfo.cropUrl}.
|
|
24259
|
+
* Measured on the live hub at the 500 rows the Plates view asks for:
|
|
24260
|
+
* 879,403 B and 27.7 s with the crops inline, against a few KiB of
|
|
24261
|
+
* metadata without them — and the browser then caches the images.
|
|
24262
|
+
*
|
|
24263
|
+
* This is the plate twin of `faceGallery.listRecentFaces`'s option;
|
|
24264
|
+
* plates were the one gallery list left without it.
|
|
24265
|
+
*
|
|
24266
|
+
* **This is an INPUT field, so it does not reach the addon until the
|
|
24267
|
+
* next train.** The hub router validates cap inputs against its own
|
|
24268
|
+
* compiled Zod and strips a key it does not know. Until the train
|
|
24269
|
+
* ships, sending `false` is harmless and keeps the crops inline.
|
|
24270
|
+
*/
|
|
24271
|
+
includeCrops: boolean().optional()
|
|
24027
24272
|
}).optional(), array(PlateInfoSchema).readonly()), method(object({
|
|
24028
24273
|
deviceId: number().int(),
|
|
24029
24274
|
trackId: string()
|
|
24030
24275
|
}), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
|
|
24031
24276
|
text: string().min(1),
|
|
24032
24277
|
maxDistance: number().int().min(0).optional(),
|
|
24033
|
-
limit: number().int().positive().optional()
|
|
24278
|
+
limit: number().int().positive().optional(),
|
|
24279
|
+
/** See `listPlates.includeCrops`. Default `true`. */
|
|
24280
|
+
includeCrops: boolean().optional()
|
|
24034
24281
|
}), array(PlateInfoSchema).readonly()), method(object({
|
|
24035
24282
|
maxDistance: number().int().min(0).optional(),
|
|
24036
24283
|
minClusterSize: number().int().min(2).optional(),
|
|
@@ -24044,7 +24291,13 @@ method(object({
|
|
|
24044
24291
|
}), method(object({ plateId: string() }), _void(), {
|
|
24045
24292
|
kind: "mutation",
|
|
24046
24293
|
auth: "admin"
|
|
24047
|
-
}), method(
|
|
24294
|
+
}), method(object({
|
|
24295
|
+
/** Inline {@link VehicleSchema.coverBase64} on every row. Default
|
|
24296
|
+
* `false` — the vehicle twin of `faceGallery.listIdentities`'s
|
|
24297
|
+
* option; `coverMediaKey` + the `event-media` plane carry the picture.
|
|
24298
|
+
* INPUT field: stripped by the hub router until the train ships, which
|
|
24299
|
+
* resolves to `false` and is exactly the intended default. */
|
|
24300
|
+
includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
|
|
24048
24301
|
kind: "mutation",
|
|
24049
24302
|
auth: "admin"
|
|
24050
24303
|
}), method(object({
|
|
@@ -27645,6 +27898,12 @@ Object.freeze({
|
|
|
27645
27898
|
addonId: null,
|
|
27646
27899
|
access: "view"
|
|
27647
27900
|
},
|
|
27901
|
+
"deviceManager.getBindingsBatch": {
|
|
27902
|
+
capName: "device-manager",
|
|
27903
|
+
capScope: "system",
|
|
27904
|
+
addonId: null,
|
|
27905
|
+
access: "view"
|
|
27906
|
+
},
|
|
27648
27907
|
"deviceManager.getChildren": {
|
|
27649
27908
|
capName: "device-manager",
|
|
27650
27909
|
capScope: "system",
|
|
@@ -27705,6 +27964,12 @@ Object.freeze({
|
|
|
27705
27964
|
addonId: null,
|
|
27706
27965
|
access: "view"
|
|
27707
27966
|
},
|
|
27967
|
+
"deviceManager.getLinkedDevicesBatch": {
|
|
27968
|
+
capName: "device-manager",
|
|
27969
|
+
capScope: "system",
|
|
27970
|
+
addonId: null,
|
|
27971
|
+
access: "view"
|
|
27972
|
+
},
|
|
27708
27973
|
"deviceManager.getRoleDisplayDefaults": {
|
|
27709
27974
|
capName: "device-manager",
|
|
27710
27975
|
capScope: "system",
|
|
@@ -29409,6 +29674,12 @@ Object.freeze({
|
|
|
29409
29674
|
addonId: null,
|
|
29410
29675
|
access: "create"
|
|
29411
29676
|
},
|
|
29677
|
+
"pipelineAnalytics.cancelRelocateMedia": {
|
|
29678
|
+
capName: "pipeline-analytics",
|
|
29679
|
+
capScope: "device",
|
|
29680
|
+
addonId: null,
|
|
29681
|
+
access: "create"
|
|
29682
|
+
},
|
|
29412
29683
|
"pipelineAnalytics.cancelStorageMigrationMove": {
|
|
29413
29684
|
capName: "pipeline-analytics",
|
|
29414
29685
|
capScope: "device",
|
|
@@ -29475,6 +29746,12 @@ Object.freeze({
|
|
|
29475
29746
|
addonId: null,
|
|
29476
29747
|
access: "view"
|
|
29477
29748
|
},
|
|
29749
|
+
"pipelineAnalytics.getGroup": {
|
|
29750
|
+
capName: "pipeline-analytics",
|
|
29751
|
+
capScope: "device",
|
|
29752
|
+
addonId: null,
|
|
29753
|
+
access: "view"
|
|
29754
|
+
},
|
|
29478
29755
|
"pipelineAnalytics.getKeyEvents": {
|
|
29479
29756
|
capName: "pipeline-analytics",
|
|
29480
29757
|
capScope: "device",
|
|
@@ -29559,6 +29836,12 @@ Object.freeze({
|
|
|
29559
29836
|
addonId: null,
|
|
29560
29837
|
access: "view"
|
|
29561
29838
|
},
|
|
29839
|
+
"pipelineAnalytics.listGroups": {
|
|
29840
|
+
capName: "pipeline-analytics",
|
|
29841
|
+
capScope: "device",
|
|
29842
|
+
addonId: null,
|
|
29843
|
+
access: "view"
|
|
29844
|
+
},
|
|
29562
29845
|
"pipelineAnalytics.listOpsLog": {
|
|
29563
29846
|
capName: "pipeline-analytics",
|
|
29564
29847
|
capScope: "device",
|
|
@@ -29571,6 +29854,12 @@ Object.freeze({
|
|
|
29571
29854
|
addonId: null,
|
|
29572
29855
|
access: "view"
|
|
29573
29856
|
},
|
|
29857
|
+
"pipelineAnalytics.listRelocateMediaJobs": {
|
|
29858
|
+
capName: "pipeline-analytics",
|
|
29859
|
+
capScope: "device",
|
|
29860
|
+
addonId: null,
|
|
29861
|
+
access: "view"
|
|
29862
|
+
},
|
|
29574
29863
|
"pipelineAnalytics.listRetrainAnnotations": {
|
|
29575
29864
|
capName: "pipeline-analytics",
|
|
29576
29865
|
capScope: "device",
|
|
@@ -29649,6 +29938,12 @@ Object.freeze({
|
|
|
29649
29938
|
addonId: null,
|
|
29650
29939
|
access: "create"
|
|
29651
29940
|
},
|
|
29941
|
+
"pipelineAnalytics.relocateMedia": {
|
|
29942
|
+
capName: "pipeline-analytics",
|
|
29943
|
+
capScope: "device",
|
|
29944
|
+
addonId: null,
|
|
29945
|
+
access: "create"
|
|
29946
|
+
},
|
|
29652
29947
|
"pipelineAnalytics.restageRetrainTrack": {
|
|
29653
29948
|
capName: "pipeline-analytics",
|
|
29654
29949
|
capScope: "device",
|
|
@@ -32340,6 +32635,11 @@ Object.freeze({
|
|
|
32340
32635
|
form: "single",
|
|
32341
32636
|
optional: false
|
|
32342
32637
|
}],
|
|
32638
|
+
"deviceManager.getBindingsBatch": [{
|
|
32639
|
+
name: "deviceIds",
|
|
32640
|
+
form: "array",
|
|
32641
|
+
optional: false
|
|
32642
|
+
}],
|
|
32343
32643
|
"deviceManager.getChildren": [{
|
|
32344
32644
|
name: "parentDeviceId",
|
|
32345
32645
|
form: "single",
|
|
@@ -32385,6 +32685,11 @@ Object.freeze({
|
|
|
32385
32685
|
form: "single",
|
|
32386
32686
|
optional: false
|
|
32387
32687
|
}],
|
|
32688
|
+
"deviceManager.getLinkedDevicesBatch": [{
|
|
32689
|
+
name: "deviceIds",
|
|
32690
|
+
form: "array",
|
|
32691
|
+
optional: false
|
|
32692
|
+
}],
|
|
32388
32693
|
"deviceManager.getSettingsSchema": [{
|
|
32389
32694
|
name: "deviceId",
|
|
32390
32695
|
form: "single",
|
|
@@ -32405,6 +32710,11 @@ Object.freeze({
|
|
|
32405
32710
|
form: "single",
|
|
32406
32711
|
optional: false
|
|
32407
32712
|
}],
|
|
32713
|
+
"deviceManager.listAll": [{
|
|
32714
|
+
name: "deviceIds",
|
|
32715
|
+
form: "array",
|
|
32716
|
+
optional: true
|
|
32717
|
+
}],
|
|
32408
32718
|
"deviceManager.loadConfig": [{
|
|
32409
32719
|
name: "deviceId",
|
|
32410
32720
|
form: "single",
|
|
@@ -32978,6 +33288,11 @@ Object.freeze({
|
|
|
32978
33288
|
form: "single",
|
|
32979
33289
|
optional: false
|
|
32980
33290
|
}],
|
|
33291
|
+
"pipelineAnalytics.getGroup": [{
|
|
33292
|
+
name: "deviceId",
|
|
33293
|
+
form: "single",
|
|
33294
|
+
optional: false
|
|
33295
|
+
}],
|
|
32981
33296
|
"pipelineAnalytics.getKeyEvents": [{
|
|
32982
33297
|
name: "deviceId",
|
|
32983
33298
|
form: "single",
|
|
@@ -33033,6 +33348,11 @@ Object.freeze({
|
|
|
33033
33348
|
form: "array",
|
|
33034
33349
|
optional: false
|
|
33035
33350
|
}],
|
|
33351
|
+
"pipelineAnalytics.listGroups": [{
|
|
33352
|
+
name: "deviceIds",
|
|
33353
|
+
form: "array",
|
|
33354
|
+
optional: false
|
|
33355
|
+
}],
|
|
33036
33356
|
"pipelineAnalytics.listOpsLog": [{
|
|
33037
33357
|
name: "deviceId",
|
|
33038
33358
|
form: "single",
|