@camstack/addon-provider-petkit 0.2.26 → 0.2.28
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 +432 -50
- package/dist/addon.mjs +432 -50
- package/package.json +1 -1
package/dist/addon.js
CHANGED
|
@@ -6903,6 +6903,13 @@ var BaseAddon = class {
|
|
|
6903
6903
|
_readinessGeneration = typeof crypto !== "undefined" && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).slice(2, 14);
|
|
6904
6904
|
/** Capability names this addon registered at init — used to emit matching `down` events on shutdown. */
|
|
6905
6905
|
_registeredCapNames = [];
|
|
6906
|
+
/**
|
|
6907
|
+
* True only after `readAddonStore` actually answered. Constructor
|
|
6908
|
+
* defaults look like stored config when the store is down — a forked
|
|
6909
|
+
* addon that auto-starts from those defaults (cloudflare-tunnel quick
|
|
6910
|
+
* mode, 2026-08-25) is not "the operator chose this".
|
|
6911
|
+
*/
|
|
6912
|
+
settingsStoreReady = false;
|
|
6906
6913
|
/** Default config values. Provided via constructor. */
|
|
6907
6914
|
defaults;
|
|
6908
6915
|
constructor(defaults) {
|
|
@@ -7303,7 +7310,9 @@ var BaseAddon = class {
|
|
|
7303
7310
|
];
|
|
7304
7311
|
let lastErr;
|
|
7305
7312
|
for (let attempt = 0; attempt <= delaysMs.length; attempt++) try {
|
|
7306
|
-
|
|
7313
|
+
const stored = await settings.readAddonStore() ?? {};
|
|
7314
|
+
this.settingsStoreReady = true;
|
|
7315
|
+
return stored;
|
|
7307
7316
|
} catch (err) {
|
|
7308
7317
|
lastErr = err;
|
|
7309
7318
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -7311,6 +7320,7 @@ var BaseAddon = class {
|
|
|
7311
7320
|
if (attempt === delaysMs.length) break;
|
|
7312
7321
|
await new Promise((r) => setTimeout(r, delaysMs[attempt]));
|
|
7313
7322
|
}
|
|
7323
|
+
this.settingsStoreReady = false;
|
|
7314
7324
|
this._ctx?.logger?.warn?.("readAddonStore: settings-store unavailable after retries — using defaults", { meta: { error: lastErr instanceof Error ? lastErr.message : String(lastErr) } });
|
|
7315
7325
|
return {};
|
|
7316
7326
|
}
|
|
@@ -9122,6 +9132,15 @@ var LabelDefinitionSchema = object({
|
|
|
9122
9132
|
description: string().optional(),
|
|
9123
9133
|
icon: string().optional()
|
|
9124
9134
|
});
|
|
9135
|
+
var ClassMapDefinitionSchema = object({
|
|
9136
|
+
mapping: record(string(), _enum([
|
|
9137
|
+
"person",
|
|
9138
|
+
"vehicle",
|
|
9139
|
+
"animal",
|
|
9140
|
+
"package"
|
|
9141
|
+
])),
|
|
9142
|
+
preserveOriginal: boolean()
|
|
9143
|
+
});
|
|
9125
9144
|
var MODEL_FORMATS = [
|
|
9126
9145
|
"onnx",
|
|
9127
9146
|
"coreml",
|
|
@@ -9205,6 +9224,12 @@ var ModelVariantGroupSchema = object({
|
|
|
9205
9224
|
*/
|
|
9206
9225
|
resolution: number().int().positive().optional()
|
|
9207
9226
|
});
|
|
9227
|
+
var ModelProviderIdSchema = _enum([
|
|
9228
|
+
"camstack",
|
|
9229
|
+
"frigate",
|
|
9230
|
+
"scrypted",
|
|
9231
|
+
"custom"
|
|
9232
|
+
]);
|
|
9208
9233
|
var ModelCatalogEntrySchema = object({
|
|
9209
9234
|
id: string(),
|
|
9210
9235
|
name: string(),
|
|
@@ -9300,7 +9325,19 @@ var ModelCatalogEntrySchema = object({
|
|
|
9300
9325
|
* `id` stays the source of truth for resolution/download/persistence; grouping
|
|
9301
9326
|
* is a presentation overlay resolved back to an `id`.
|
|
9302
9327
|
*/
|
|
9303
|
-
group: ModelVariantGroupSchema.optional()
|
|
9328
|
+
group: ModelVariantGroupSchema.optional(),
|
|
9329
|
+
/**
|
|
9330
|
+
* Catalog source for the pipeline stepper's provider-first picker. Absent on
|
|
9331
|
+
* built-in CamStack entries (treated as `camstack`) and on registry rows
|
|
9332
|
+
* persisted before this field existed (`inferModelProvider` fills those).
|
|
9333
|
+
*/
|
|
9334
|
+
provider: ModelProviderIdSchema.optional(),
|
|
9335
|
+
/**
|
|
9336
|
+
* Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
|
|
9337
|
+
* applies (Frigate / COCO public catalog). Set on a custom model whose raw
|
|
9338
|
+
* labels already ARE the CamStack macros (Scrypted identity map).
|
|
9339
|
+
*/
|
|
9340
|
+
classMap: ClassMapDefinitionSchema.optional()
|
|
9304
9341
|
});
|
|
9305
9342
|
var ConvertTargetSchema = discriminatedUnion("format", [object({
|
|
9306
9343
|
format: literal("openvino"),
|
|
@@ -9329,7 +9366,8 @@ var ModelConvertMetadataSchema = object({
|
|
|
9329
9366
|
"ocr",
|
|
9330
9367
|
"segmentation"
|
|
9331
9368
|
]),
|
|
9332
|
-
faceAlignment: boolean().optional()
|
|
9369
|
+
faceAlignment: boolean().optional(),
|
|
9370
|
+
classMap: ClassMapDefinitionSchema.optional()
|
|
9333
9371
|
});
|
|
9334
9372
|
var ConvertResultSchema = object({
|
|
9335
9373
|
entry: ModelCatalogEntrySchema,
|
|
@@ -13103,6 +13141,27 @@ var LinkedDeviceSchema = object({
|
|
|
13103
13141
|
features: array(string()),
|
|
13104
13142
|
producesTrackedEvents: boolean().optional()
|
|
13105
13143
|
});
|
|
13144
|
+
/** One camera's resolved linked set, tagged with the camera it belongs to.
|
|
13145
|
+
* The batch answer needs the tag; the single-device answer already has it
|
|
13146
|
+
* from the input, which is why `getLinkedDevices` keeps the untagged shape. */
|
|
13147
|
+
var LinkedDevicesForDeviceSchema = object({
|
|
13148
|
+
deviceId: number(),
|
|
13149
|
+
mode: LinkedDevicesModeSchema,
|
|
13150
|
+
devices: array(LinkedDeviceSchema)
|
|
13151
|
+
});
|
|
13152
|
+
/** One device's binding map — the shape `getBindings`, `getBindingsBatch` and
|
|
13153
|
+
* `getAllBindings` all answer in. Declared once: three copies of the same
|
|
13154
|
+
* object literal is exactly how the three drift apart. */
|
|
13155
|
+
var DeviceBindingsForDeviceSchema = object({
|
|
13156
|
+
deviceId: number(),
|
|
13157
|
+
entries: array(object({
|
|
13158
|
+
capName: string(),
|
|
13159
|
+
kind: _enum(["native", "wrapped"]),
|
|
13160
|
+
providerAddonId: string(),
|
|
13161
|
+
providerNodeId: string(),
|
|
13162
|
+
nativeAddonId: string()
|
|
13163
|
+
}))
|
|
13164
|
+
});
|
|
13106
13165
|
var SavedDeviceRowSchema = object({
|
|
13107
13166
|
/** Numeric id reserved at allocateDeviceId time. */
|
|
13108
13167
|
id: number(),
|
|
@@ -13328,11 +13387,25 @@ method(object({
|
|
|
13328
13387
|
projection: _enum(["full", "slim"]).optional(),
|
|
13329
13388
|
/** Return only camera devices. Filtering server-side instead of
|
|
13330
13389
|
* shipping 293 rows to find 12. */
|
|
13331
|
-
isCamera: boolean().optional()
|
|
13390
|
+
isCamera: boolean().optional(),
|
|
13391
|
+
/**
|
|
13392
|
+
* Return only these device ids. For the caller that already KNOWS the
|
|
13393
|
+
* handful it wants and needs a field the id-bearing answer does not
|
|
13394
|
+
* carry — the viewer's linked-devices panel joins `type` and `online`
|
|
13395
|
+
* onto ~8 linked ids and, unfiltered, dragged the fleet across to do
|
|
13396
|
+
* it: 433 KB slim / 958 KB full for 967 devices, on a query that
|
|
13397
|
+
* refetches on the reconcile interval, on a phone.
|
|
13398
|
+
*
|
|
13399
|
+
* Safe to send at a hub that predates it: Zod STRIPS unknown input
|
|
13400
|
+
* keys rather than rejecting them (verified against the live hub
|
|
13401
|
+
* 2026-08-25 — 967 rows came back), so an old hub answers exactly what
|
|
13402
|
+
* it answers today and the caller filters as it already does.
|
|
13403
|
+
*/
|
|
13404
|
+
deviceIds: array(number()).optional()
|
|
13332
13405
|
}), array(DeviceInfoSchema)), method(object({ deviceId: number() }), DeviceInfoSchema.nullable()), method(object({ parentDeviceId: number() }), array(DeviceInfoSchema)), method(object({ deviceId: number() }), object({
|
|
13333
13406
|
mode: LinkedDevicesModeSchema,
|
|
13334
13407
|
devices: array(LinkedDeviceSchema)
|
|
13335
|
-
})), method(object({ deviceId: number() }), array(StreamSourceEntrySchema$1)), method(object({ deviceId: number() }), array(ConfigEntrySchema)), method(object({ deviceId: number() }), ConfigUISchemaOutput), method(object({
|
|
13408
|
+
})), 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({
|
|
13336
13409
|
deviceId: number(),
|
|
13337
13410
|
values: record(string(), unknown())
|
|
13338
13411
|
}), object({ success: literal(true) }), {
|
|
@@ -13359,25 +13432,7 @@ method(object({
|
|
|
13359
13432
|
}), method(object({ deviceId: number() }), array(StreamProbeResultSchema), {
|
|
13360
13433
|
kind: "mutation",
|
|
13361
13434
|
auth: "admin"
|
|
13362
|
-
}), method(object({ deviceId: number() }), object({
|
|
13363
|
-
deviceId: number(),
|
|
13364
|
-
entries: array(object({
|
|
13365
|
-
capName: string(),
|
|
13366
|
-
kind: _enum(["native", "wrapped"]),
|
|
13367
|
-
providerAddonId: string(),
|
|
13368
|
-
providerNodeId: string(),
|
|
13369
|
-
nativeAddonId: string()
|
|
13370
|
-
}))
|
|
13371
|
-
})), method(object({}), array(object({
|
|
13372
|
-
deviceId: number(),
|
|
13373
|
-
entries: array(object({
|
|
13374
|
-
capName: string(),
|
|
13375
|
-
kind: _enum(["native", "wrapped"]),
|
|
13376
|
-
providerAddonId: string(),
|
|
13377
|
-
providerNodeId: string(),
|
|
13378
|
-
nativeAddonId: string()
|
|
13379
|
-
}))
|
|
13380
|
-
}))), method(object({
|
|
13435
|
+
}), method(object({ deviceId: number() }), DeviceBindingsForDeviceSchema), method(object({ deviceIds: array(number()) }), array(DeviceBindingsForDeviceSchema)), method(object({}), array(DeviceBindingsForDeviceSchema)), method(object({
|
|
13381
13436
|
deviceId: number(),
|
|
13382
13437
|
capName: string(),
|
|
13383
13438
|
wrapperAddonId: string(),
|
|
@@ -15787,12 +15842,15 @@ var NcOccupancyConditionSchema = object({
|
|
|
15787
15842
|
* there is no second switch that can disagree with the first and every rule
|
|
15788
15843
|
* authored before the decision migrates for free (`audioModeOf`):
|
|
15789
15844
|
*
|
|
15790
|
-
* - **LABEL mode — `labels` present.** The rule fires
|
|
15791
|
-
*
|
|
15792
|
-
* `hitPercent` and `samplingSeconds` are ignored
|
|
15793
|
-
*
|
|
15794
|
-
*
|
|
15795
|
-
*
|
|
15845
|
+
* - **LABEL mode — `labels` present.** The rule fires when `confirmHits`
|
|
15846
|
+
* labelled frames land inside `confirmWindowSec` (default 2 in 5 s).
|
|
15847
|
+
* `hitPercent` and `samplingSeconds` are still ignored — a percentage of
|
|
15848
|
+
* frames is the wrong question for a classifier that labels 1–3 frames
|
|
15849
|
+
* per episode. The count window is the brake that drops a single-frame
|
|
15850
|
+
* false positive; the rule's own `throttle` cooldown is the other. The
|
|
15851
|
+
* per-label confidence floor is the analyzer's (`classificationMinScore`,
|
|
15852
|
+
* per device) — a label only reaches this condition if the classifier was
|
|
15853
|
+
* already confident enough. `confirmHits: 1` restores first-frame fire.
|
|
15796
15854
|
* - **LEVEL mode — `dbThreshold` present, no labels.** The sampling window IS
|
|
15797
15855
|
* the condition: at least `hitPercent`% of the samples over
|
|
15798
15856
|
* `samplingSeconds` must be at or above `dbThreshold` dBFS (see
|
|
@@ -15819,14 +15877,22 @@ var NcOccupancyConditionSchema = object({
|
|
|
15819
15877
|
* an operator who typed `dog` mean the same thing.
|
|
15820
15878
|
*/
|
|
15821
15879
|
var NcAudioConditionSchema = object({
|
|
15822
|
-
/** LABEL MODE: audio macro labels. Present ⇒
|
|
15880
|
+
/** LABEL MODE: audio macro labels. Present ⇒ count-in-window confirm. */
|
|
15823
15881
|
labels: array(string().min(1)).min(1).optional(),
|
|
15824
15882
|
/** LEVEL MODE: floor in dBFS (negative-going, `0` = full scale). */
|
|
15825
15883
|
dbThreshold: number().min(-96).max(0).optional(),
|
|
15826
15884
|
/** LEVEL MODE ONLY: percentage of the window's samples that must be hits (1–100). */
|
|
15827
15885
|
hitPercent: number().int().min(1).max(100).default(60),
|
|
15828
15886
|
/** LEVEL MODE ONLY: length of the sampling window in seconds. */
|
|
15829
|
-
samplingSeconds: number().int().min(1).max(300).default(10)
|
|
15887
|
+
samplingSeconds: number().int().min(1).max(300).default(10),
|
|
15888
|
+
/**
|
|
15889
|
+
* LABEL MODE: how many labelled frames must land inside
|
|
15890
|
+
* {@link NcAudioConditionSchema.shape.confirmWindowSec} before dispatch.
|
|
15891
|
+
* Absent ⇒ 2 (the matcher default). `1` is first-frame fire.
|
|
15892
|
+
*/
|
|
15893
|
+
confirmHits: number().int().min(1).max(20).optional(),
|
|
15894
|
+
/** LABEL MODE: the window those frames must share, in seconds. Absent ⇒ 5. */
|
|
15895
|
+
confirmWindowSec: number().int().min(1).max(60).optional()
|
|
15830
15896
|
});
|
|
15831
15897
|
/**
|
|
15832
15898
|
* Which zone-crossing DIRECTION a rule accepts (`ObjectEvent.zoneCrossing`).
|
|
@@ -18200,6 +18266,46 @@ var RecentTracksPageSchema = object({
|
|
|
18200
18266
|
/** Cursor for the next page, or null when this page is the last. */
|
|
18201
18267
|
nextCursor: string().nullable()
|
|
18202
18268
|
});
|
|
18269
|
+
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
18270
|
+
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
18271
|
+
var AnalyticsGroupRecordSchema = object({
|
|
18272
|
+
id: string(),
|
|
18273
|
+
deviceId: number().int(),
|
|
18274
|
+
openedAt: number().int(),
|
|
18275
|
+
closedAt: number().int(),
|
|
18276
|
+
timestamp: number().int(),
|
|
18277
|
+
memberCount: number().int(),
|
|
18278
|
+
memberTrackIds: array(string()).readonly(),
|
|
18279
|
+
className: string(),
|
|
18280
|
+
classes: array(string()).readonly(),
|
|
18281
|
+
/** Relative event-media path, or null when the group has no picture yet. */
|
|
18282
|
+
mediaUrl: string().nullable(),
|
|
18283
|
+
singleton: boolean()
|
|
18284
|
+
});
|
|
18285
|
+
var AnalyticsGroupMemberSchema = object({
|
|
18286
|
+
trackId: string(),
|
|
18287
|
+
deviceId: number().int(),
|
|
18288
|
+
className: string(),
|
|
18289
|
+
firstSeen: number().int(),
|
|
18290
|
+
lastSeen: number().int(),
|
|
18291
|
+
mediaUrl: string().nullable()
|
|
18292
|
+
});
|
|
18293
|
+
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
18294
|
+
var ListGroupsQueryInput = object({
|
|
18295
|
+
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
18296
|
+
deviceIds: array(number()),
|
|
18297
|
+
/** Window lower bound on `closedAt` (inclusive). */
|
|
18298
|
+
since: number().optional(),
|
|
18299
|
+
/** Window upper bound on `openedAt` (inclusive). */
|
|
18300
|
+
until: number().optional(),
|
|
18301
|
+
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
18302
|
+
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
18303
|
+
cursor: string().optional()
|
|
18304
|
+
});
|
|
18305
|
+
var ListGroupsPageSchema = object({
|
|
18306
|
+
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
18307
|
+
nextCursor: string().nullable()
|
|
18308
|
+
});
|
|
18203
18309
|
var KeyEventQueryInput = object({
|
|
18204
18310
|
deviceId: number(),
|
|
18205
18311
|
/** Window lower bound (track firstSeen ≥ since). */
|
|
@@ -18275,7 +18381,9 @@ var TrackCascadeCountsSchema = object({
|
|
|
18275
18381
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
18276
18382
|
plates: number().int(),
|
|
18277
18383
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
18278
|
-
embeddings: number().int()
|
|
18384
|
+
embeddings: number().int(),
|
|
18385
|
+
/** Group membership + group rows removed with their last member (best-effort). */
|
|
18386
|
+
groups: number().int()
|
|
18279
18387
|
});
|
|
18280
18388
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
18281
18389
|
var DiskReconcileCountsSchema = object({
|
|
@@ -18421,7 +18529,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
18421
18529
|
* stationary registry). Default false: the timeline lists passages,
|
|
18422
18530
|
* not parking records (operator decision, 2026-08-15). */
|
|
18423
18531
|
includeStationary: boolean().optional()
|
|
18424
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
18532
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
|
|
18533
|
+
deviceId: number(),
|
|
18534
|
+
groupId: string().min(1)
|
|
18535
|
+
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
18425
18536
|
kind: "mutation",
|
|
18426
18537
|
auth: "admin"
|
|
18427
18538
|
}), 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({
|
|
@@ -18639,6 +18750,33 @@ var NativeCropRefSchema = object({
|
|
|
18639
18750
|
h: number()
|
|
18640
18751
|
})
|
|
18641
18752
|
});
|
|
18753
|
+
object({
|
|
18754
|
+
crop: object({
|
|
18755
|
+
left: number(),
|
|
18756
|
+
top: number(),
|
|
18757
|
+
width: number().positive(),
|
|
18758
|
+
height: number().positive()
|
|
18759
|
+
}).optional(),
|
|
18760
|
+
content: object({
|
|
18761
|
+
width: number().int().positive(),
|
|
18762
|
+
height: number().int().positive()
|
|
18763
|
+
}),
|
|
18764
|
+
fit: _enum(["stretch", "contain"]),
|
|
18765
|
+
format: _enum([
|
|
18766
|
+
"rgb",
|
|
18767
|
+
"gray",
|
|
18768
|
+
"jpeg"
|
|
18769
|
+
])
|
|
18770
|
+
});
|
|
18771
|
+
var FrameRefSchema = object({
|
|
18772
|
+
registryId: string().min(1),
|
|
18773
|
+
id: string().min(1),
|
|
18774
|
+
width: number().int().positive(),
|
|
18775
|
+
height: number().int().positive(),
|
|
18776
|
+
format: _enum(["rgb", "gray"]),
|
|
18777
|
+
timestamp: number(),
|
|
18778
|
+
capturedAt: number().optional()
|
|
18779
|
+
});
|
|
18642
18780
|
var ModelFormatSchema$1 = _enum([
|
|
18643
18781
|
"onnx",
|
|
18644
18782
|
"coreml",
|
|
@@ -18704,7 +18842,8 @@ var PipelineModelOptionSchema = object({
|
|
|
18704
18842
|
sizeMB: number()
|
|
18705
18843
|
})),
|
|
18706
18844
|
group: ModelVariantGroupSchema.optional(),
|
|
18707
|
-
legacy: boolean().optional()
|
|
18845
|
+
legacy: boolean().optional(),
|
|
18846
|
+
provider: ModelProviderIdSchema.optional()
|
|
18708
18847
|
});
|
|
18709
18848
|
var ConfigFieldBridge = custom();
|
|
18710
18849
|
var PipelineAddonSchemaSchema = object({
|
|
@@ -18883,6 +19022,12 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
18883
19022
|
steps: array(PipelineStepInputSchema).min(1),
|
|
18884
19023
|
frame: FrameInputSchema.optional(),
|
|
18885
19024
|
/**
|
|
19025
|
+
* Process-local lazy frame. Valid only when caller and provider resolve
|
|
19026
|
+
* in the same execution-group process; split/cross-node callers use
|
|
19027
|
+
* `frame`/`image` inline compatibility instead.
|
|
19028
|
+
*/
|
|
19029
|
+
frameRef: FrameRefSchema.optional(),
|
|
19030
|
+
/**
|
|
18886
19031
|
* CB5 shm passthrough — a `FrameHandle` naming the same ring slot
|
|
18887
19032
|
* the decoded pixels live in. One more member of the one-of
|
|
18888
19033
|
* frame/frameHandle/image/imageBase64/referenceImage group.
|
|
@@ -19178,7 +19323,10 @@ var NativeCropResultSchema = object({
|
|
|
19178
19323
|
* Which source served this crop, so a quality-sensitive consumer (the native
|
|
19179
19324
|
* `keyFrame`) can reject a degraded fallback:
|
|
19180
19325
|
* - `native` — cut from the decode worker's retained NATIVE surface (the
|
|
19181
|
-
* quality path).
|
|
19326
|
+
* quality path). A subject-tile serve is also native-resolution and stays
|
|
19327
|
+
* `native` here: the public enum cannot name `tile` without a breaking cap
|
|
19328
|
+
* change. Runner telemetry distinguishes lease vs tile via `source` on the
|
|
19329
|
+
* internal crop result (`nativeHits` vs `tileHits`).
|
|
19182
19330
|
* - `ram-fullframe` — the native surface MISSED but the request was full-frame,
|
|
19183
19331
|
* so the ≤640 RAM `RetainedFrameStore` served it (honest lower-res; legit for
|
|
19184
19332
|
* the blank-frame guard / 640-snapshot resolve, NOT for the clean keyFrame).
|
|
@@ -19669,12 +19817,41 @@ var RunnerLocalLoadSchema = object({
|
|
|
19669
19817
|
* legacy `OrchestratorMetricsSchema` shape so existing dashboards keep
|
|
19670
19818
|
* working unchanged when they switch to reading from the runner cap.
|
|
19671
19819
|
*/
|
|
19820
|
+
var FrameLazyCountersSchema = object({
|
|
19821
|
+
framesDecoded: number(),
|
|
19822
|
+
framesAdmitted: number(),
|
|
19823
|
+
framesDroppedPixelFree: number(),
|
|
19824
|
+
viewsMaterialized: number(),
|
|
19825
|
+
viewsSkipped: number(),
|
|
19826
|
+
workerToRunnerBytes: number(),
|
|
19827
|
+
runnerToPoolRawBytes: number(),
|
|
19828
|
+
runnerToPoolJpegBytes: number(),
|
|
19829
|
+
onDemandFullFrameRequests: number(),
|
|
19830
|
+
onDemandCropRequests: number(),
|
|
19831
|
+
nativeHits: number(),
|
|
19832
|
+
nativeMisses: number(),
|
|
19833
|
+
tileHits: number(),
|
|
19834
|
+
tileMisses: number(),
|
|
19835
|
+
fallbackHits: number(),
|
|
19836
|
+
fallbackMisses: number(),
|
|
19837
|
+
retainedWritesAvoided: number(),
|
|
19838
|
+
residentRefs: number(),
|
|
19839
|
+
residentBytes: number(),
|
|
19840
|
+
releases: number(),
|
|
19841
|
+
evictions: number(),
|
|
19842
|
+
staleMisses: number()
|
|
19843
|
+
});
|
|
19844
|
+
var FrameLazyMetricsSchema = object({
|
|
19845
|
+
node: FrameLazyCountersSchema,
|
|
19846
|
+
cameras: array(FrameLazyCountersSchema.extend({ deviceId: number() }))
|
|
19847
|
+
});
|
|
19672
19848
|
var RunnerLocalMetricsSchema = object({
|
|
19673
19849
|
nodeId: string(),
|
|
19674
19850
|
activeCameras: number(),
|
|
19675
19851
|
throttledCameras: number(),
|
|
19676
19852
|
avgInferenceTimeMs: number(),
|
|
19677
|
-
queueDepth: number()
|
|
19853
|
+
queueDepth: number(),
|
|
19854
|
+
frameLazy: FrameLazyMetricsSchema.optional()
|
|
19678
19855
|
});
|
|
19679
19856
|
method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mutation" }), method(object({ deviceId: number() }), object({ success: literal(true) }), { kind: "mutation" }), method(ReportMotionInputSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), RunnerLocalLoadSchema), method(_void(), RunnerLocalMetricsSchema), method(object({ deviceId: number() }), CameraMetricsSchema.nullable()), method(_void(), array(CameraMetricsWithDeviceIdSchema).readonly()), method(_void(), array(number()).readonly()), method(object({
|
|
19680
19857
|
handle: FrameHandleSchema,
|
|
@@ -20974,6 +21151,9 @@ method(_void(), ProviderInfoSchema), method(object({ config: record(string(), un
|
|
|
20974
21151
|
location: StorageLocationSchema,
|
|
20975
21152
|
relativePath: string()
|
|
20976
21153
|
}), _void(), { kind: "mutation" }), method(object({ location: StorageLocationSchema }), number().nullable()), method(BeginUploadInputSchema, BeginUploadResultSchema, { kind: "mutation" }), method(WriteChunkInputSchema, _void(), { kind: "mutation" }), method(FinalizeUploadInputSchema, _void(), { kind: "mutation" }), method(AbortUploadInputSchema, _void(), { kind: "mutation" }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, { kind: "mutation" }), method(ReadChunkInputSchema, _instanceof(Uint8Array)), method(EndDownloadInputSchema, _void(), { kind: "mutation" });
|
|
21154
|
+
/** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
|
|
21155
|
+
var ProfileSettingsSchemaBridge = unknown().nullable();
|
|
21156
|
+
var ProfileSettingsBagSchema = record(string(), unknown());
|
|
20977
21157
|
/**
|
|
20978
21158
|
* A live terminal session hosted by the provider addon. Output and input do
|
|
20979
21159
|
* NOT flow through the capability — they use the addon data plane
|
|
@@ -21003,7 +21183,14 @@ var TerminalSessionInfoSchema = object({
|
|
|
21003
21183
|
var TerminalProfileInfoSchema = object({
|
|
21004
21184
|
profileId: string(),
|
|
21005
21185
|
label: string(),
|
|
21006
|
-
description: string().optional()
|
|
21186
|
+
description: string().optional(),
|
|
21187
|
+
/** Spawn defaults the instance form copies on create. */
|
|
21188
|
+
executable: string().optional(),
|
|
21189
|
+
args: array(string()).readonly().optional(),
|
|
21190
|
+
cwd: string().optional(),
|
|
21191
|
+
environment: array(string()).readonly().optional(),
|
|
21192
|
+
/** ConfigUISchema for instance knobs, or null when the profile has none. */
|
|
21193
|
+
settingsSchema: ProfileSettingsSchemaBridge.optional()
|
|
21007
21194
|
});
|
|
21008
21195
|
/**
|
|
21009
21196
|
* A durable operator-created Terminal instance. Profiles are templates; only
|
|
@@ -21016,7 +21203,12 @@ var TerminalInstanceInfoSchema = object({
|
|
|
21016
21203
|
profileId: string(),
|
|
21017
21204
|
profileLabel: string(),
|
|
21018
21205
|
name: string(),
|
|
21019
|
-
enabled: boolean()
|
|
21206
|
+
enabled: boolean(),
|
|
21207
|
+
executable: string(),
|
|
21208
|
+
args: array(string()).readonly(),
|
|
21209
|
+
cwd: string(),
|
|
21210
|
+
environment: array(string()).readonly(),
|
|
21211
|
+
profileSettings: ProfileSettingsBagSchema
|
|
21020
21212
|
});
|
|
21021
21213
|
var TerminalLegacyCameraSchema = object({
|
|
21022
21214
|
stableId: string(),
|
|
@@ -21046,7 +21238,23 @@ var TerminalOutputBatchSchema = object({
|
|
|
21046
21238
|
method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }), method(_void(), array(TerminalInstanceInfoSchema).readonly(), { auth: "admin" }), method(object({
|
|
21047
21239
|
targetNodeId: string().min(1),
|
|
21048
21240
|
profileId: string().min(1),
|
|
21049
|
-
name: string().trim().min(1).max(160).optional()
|
|
21241
|
+
name: string().trim().min(1).max(160).optional(),
|
|
21242
|
+
executable: string().max(1024).optional(),
|
|
21243
|
+
args: array(string().max(2048)).max(64).optional(),
|
|
21244
|
+
cwd: string().max(1024).optional(),
|
|
21245
|
+
environment: array(string().max(4096)).max(64).optional(),
|
|
21246
|
+
profileSettings: ProfileSettingsBagSchema.optional()
|
|
21247
|
+
}), TerminalInstanceInfoSchema, {
|
|
21248
|
+
kind: "mutation",
|
|
21249
|
+
auth: "admin"
|
|
21250
|
+
}), method(object({
|
|
21251
|
+
instanceId: string().min(1),
|
|
21252
|
+
name: string().trim().min(1).max(160).optional(),
|
|
21253
|
+
executable: string().max(1024).optional(),
|
|
21254
|
+
args: array(string().max(2048)).max(64).optional(),
|
|
21255
|
+
cwd: string().max(1024).optional(),
|
|
21256
|
+
environment: array(string().max(4096)).max(64).optional(),
|
|
21257
|
+
profileSettings: ProfileSettingsBagSchema.optional()
|
|
21050
21258
|
}), TerminalInstanceInfoSchema, {
|
|
21051
21259
|
kind: "mutation",
|
|
21052
21260
|
auth: "admin"
|
|
@@ -21068,7 +21276,11 @@ method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }),
|
|
|
21068
21276
|
}), method(_void(), array(TerminalSessionInfoSchema).readonly(), { auth: "admin" }), method(object({
|
|
21069
21277
|
profileId: string(),
|
|
21070
21278
|
cols: number().int().positive(),
|
|
21071
|
-
rows: number().int().positive()
|
|
21279
|
+
rows: number().int().positive(),
|
|
21280
|
+
executable: string().max(1024).optional(),
|
|
21281
|
+
args: array(string().max(2048)).max(64).optional(),
|
|
21282
|
+
cwd: string().max(1024).optional(),
|
|
21283
|
+
environment: array(string().max(4096)).max(64).optional()
|
|
21072
21284
|
}), TerminalSessionInfoSchema, {
|
|
21073
21285
|
kind: "mutation",
|
|
21074
21286
|
auth: "admin"
|
|
@@ -24951,10 +25163,10 @@ var lawnMowerControlCapability = {
|
|
|
24951
25163
|
*
|
|
24952
25164
|
* • The SDK (mobile / web client) consumes `getConnectionEndpoints()`
|
|
24953
25165
|
* to receive an ordered list of candidate base URLs it should race
|
|
24954
|
-
* on connect — LAN IPv4 first (lowest latency
|
|
24955
|
-
* then public hostname (if a tunnel is
|
|
24956
|
-
* race them with short timeouts and stick with the
|
|
24957
|
-
* session.
|
|
25166
|
+
* on connect — LAN IPv4 and stable LAN IPv6 first (lowest latency
|
|
25167
|
+
* when on the same network), then public hostname (if a tunnel is
|
|
25168
|
+
* up). The SDK can race them with short timeouts and stick with the
|
|
25169
|
+
* winner for the session.
|
|
24958
25170
|
*
|
|
24959
25171
|
* Why hub-only: agents are not directly addressable by the operator's
|
|
24960
25172
|
* clients — they reverse-connect to the hub. Exposing their interfaces
|
|
@@ -25109,6 +25321,17 @@ var NotificationEndpointSchema = object({
|
|
|
25109
25321
|
/** What the ranking currently resolves to (null when nothing is reachable). */
|
|
25110
25322
|
resolved: string().nullable()
|
|
25111
25323
|
});
|
|
25324
|
+
/**
|
|
25325
|
+
* The URLs the SDK / viewer should race for API access. `baseUrls` empty =
|
|
25326
|
+
* AUTO (every LAN IPv4 + the public tunnel). `resolved` is what that choice
|
|
25327
|
+
* currently expands to, so the UI can show the effective set either way.
|
|
25328
|
+
*/
|
|
25329
|
+
var ViewerEndpointsSchema = object({
|
|
25330
|
+
/** The operator's explicit race set, or empty for AUTO. */
|
|
25331
|
+
baseUrls: array(string()).readonly(),
|
|
25332
|
+
/** What the ranking currently resolves to (may be empty if nothing is up). */
|
|
25333
|
+
resolved: array(string()).readonly()
|
|
25334
|
+
});
|
|
25112
25335
|
var AllowedAddressesSchema = object({
|
|
25113
25336
|
/**
|
|
25114
25337
|
* Allowlist of interface addresses operators have explicitly opted
|
|
@@ -25117,6 +25340,20 @@ var AllowedAddressesSchema = object({
|
|
|
25117
25340
|
* Network Addresses admin page and persisted by the addon.
|
|
25118
25341
|
*/
|
|
25119
25342
|
addresses: array(string()).readonly() });
|
|
25343
|
+
var TlsStatusSchema = object({
|
|
25344
|
+
mode: _enum([
|
|
25345
|
+
"generated",
|
|
25346
|
+
"uploaded",
|
|
25347
|
+
"disabled"
|
|
25348
|
+
]),
|
|
25349
|
+
leafFingerprintSha256: string().nullable(),
|
|
25350
|
+
caFingerprintSha256: string().nullable(),
|
|
25351
|
+
validTo: string().nullable(),
|
|
25352
|
+
sans: array(string()),
|
|
25353
|
+
caCertPem: string().nullable(),
|
|
25354
|
+
reissueError: string().nullable(),
|
|
25355
|
+
restartRequired: boolean()
|
|
25356
|
+
});
|
|
25120
25357
|
method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
|
|
25121
25358
|
/**
|
|
25122
25359
|
* LEGACY HINT — do not send from new code. Kept optional so clients
|
|
@@ -25126,17 +25363,31 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
|
|
|
25126
25363
|
*/
|
|
25127
25364
|
port: number().int().min(1).max(65535).optional(),
|
|
25128
25365
|
/** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
|
|
25129
|
-
* candidate. Default `
|
|
25366
|
+
* candidate. Default `false` — loopback is not a client route. */
|
|
25130
25367
|
includeLoopback: boolean().optional(),
|
|
25131
|
-
/** Skip IPv6 entries.
|
|
25132
|
-
*
|
|
25368
|
+
/** Skip IPv6 entries. Default `false` — the palette includes stable
|
|
25369
|
+
* LAN IPv6 (ICE/WebRTC uses dual-stack regardless). Pass `true` to
|
|
25370
|
+
* hide them. The viewer HTTP/WS race is `getViewerEndpoints`. */
|
|
25133
25371
|
ipv4Only: boolean().optional(),
|
|
25134
25372
|
/** Scheme to emit for LAN/loopback URLs. Default `'http'`.
|
|
25135
25373
|
* Pass `'https'` when the caller is itself loaded over HTTPS
|
|
25136
25374
|
* to avoid mixed-content blocks in the browser. The public
|
|
25137
25375
|
* tunnel always emits `https://` regardless. */
|
|
25138
25376
|
scheme: _enum(["http", "https"]).optional()
|
|
25139
|
-
}), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" })
|
|
25377
|
+
}), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), ViewerEndpointsSchema), method(object({ baseUrls: array(string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" }), method(_void(), TlsStatusSchema), method(object({ reason: string().optional() }), TlsStatusSchema, {
|
|
25378
|
+
kind: "mutation",
|
|
25379
|
+
auth: "admin"
|
|
25380
|
+
}), method(object({
|
|
25381
|
+
certPem: string().min(1),
|
|
25382
|
+
keyPem: string().min(1),
|
|
25383
|
+
caPem: string().optional()
|
|
25384
|
+
}), TlsStatusSchema, {
|
|
25385
|
+
kind: "mutation",
|
|
25386
|
+
auth: "admin"
|
|
25387
|
+
}), method(_void(), object({ pem: string() })), method(_void(), TlsStatusSchema, {
|
|
25388
|
+
kind: "mutation",
|
|
25389
|
+
auth: "admin"
|
|
25390
|
+
});
|
|
25140
25391
|
var LockControlStatusSchema = object({
|
|
25141
25392
|
/** Lifecycle state of the lock. `jammed` means the motor reported
|
|
25142
25393
|
* failure to reach the target — operator intervention required. */
|
|
@@ -26697,7 +26948,12 @@ var PlateInfoSchema = object({
|
|
|
26697
26948
|
plateBbox: BoundingBoxSchema.optional(),
|
|
26698
26949
|
/** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
|
|
26699
26950
|
keyFrameMediaKey: string().optional(),
|
|
26700
|
-
base64: string().optional()
|
|
26951
|
+
base64: string().optional(),
|
|
26952
|
+
/**
|
|
26953
|
+
* Same crop as a data-plane URL. `getPlateByTrack` returns this and
|
|
26954
|
+
* never inlines JPEG; `listPlates` still inlines for the admin-ui.
|
|
26955
|
+
*/
|
|
26956
|
+
cropUrl: string().optional()
|
|
26701
26957
|
});
|
|
26702
26958
|
var MediaFileLiteSchema = object({
|
|
26703
26959
|
key: string(),
|
|
@@ -32221,6 +32477,12 @@ Object.freeze({
|
|
|
32221
32477
|
addonId: null,
|
|
32222
32478
|
access: "view"
|
|
32223
32479
|
},
|
|
32480
|
+
"deviceManager.getBindingsBatch": {
|
|
32481
|
+
capName: "device-manager",
|
|
32482
|
+
capScope: "system",
|
|
32483
|
+
addonId: null,
|
|
32484
|
+
access: "view"
|
|
32485
|
+
},
|
|
32224
32486
|
"deviceManager.getChildren": {
|
|
32225
32487
|
capName: "device-manager",
|
|
32226
32488
|
capScope: "system",
|
|
@@ -32281,6 +32543,12 @@ Object.freeze({
|
|
|
32281
32543
|
addonId: null,
|
|
32282
32544
|
access: "view"
|
|
32283
32545
|
},
|
|
32546
|
+
"deviceManager.getLinkedDevicesBatch": {
|
|
32547
|
+
capName: "device-manager",
|
|
32548
|
+
capScope: "system",
|
|
32549
|
+
addonId: null,
|
|
32550
|
+
access: "view"
|
|
32551
|
+
},
|
|
32284
32552
|
"deviceManager.getRoleDisplayDefaults": {
|
|
32285
32553
|
capName: "device-manager",
|
|
32286
32554
|
capScope: "system",
|
|
@@ -33163,6 +33431,12 @@ Object.freeze({
|
|
|
33163
33431
|
addonId: null,
|
|
33164
33432
|
access: "create"
|
|
33165
33433
|
},
|
|
33434
|
+
"localNetwork.downloadCa": {
|
|
33435
|
+
capName: "local-network",
|
|
33436
|
+
capScope: "system",
|
|
33437
|
+
addonId: null,
|
|
33438
|
+
access: "view"
|
|
33439
|
+
},
|
|
33166
33440
|
"localNetwork.getAllowedAddresses": {
|
|
33167
33441
|
capName: "local-network",
|
|
33168
33442
|
capScope: "system",
|
|
@@ -33187,18 +33461,42 @@ Object.freeze({
|
|
|
33187
33461
|
addonId: null,
|
|
33188
33462
|
access: "view"
|
|
33189
33463
|
},
|
|
33464
|
+
"localNetwork.getTlsStatus": {
|
|
33465
|
+
capName: "local-network",
|
|
33466
|
+
capScope: "system",
|
|
33467
|
+
addonId: null,
|
|
33468
|
+
access: "view"
|
|
33469
|
+
},
|
|
33470
|
+
"localNetwork.getViewerEndpoints": {
|
|
33471
|
+
capName: "local-network",
|
|
33472
|
+
capScope: "system",
|
|
33473
|
+
addonId: null,
|
|
33474
|
+
access: "view"
|
|
33475
|
+
},
|
|
33190
33476
|
"localNetwork.list": {
|
|
33191
33477
|
capName: "local-network",
|
|
33192
33478
|
capScope: "system",
|
|
33193
33479
|
addonId: null,
|
|
33194
33480
|
access: "view"
|
|
33195
33481
|
},
|
|
33482
|
+
"localNetwork.regenerateCertificate": {
|
|
33483
|
+
capName: "local-network",
|
|
33484
|
+
capScope: "system",
|
|
33485
|
+
addonId: null,
|
|
33486
|
+
access: "create"
|
|
33487
|
+
},
|
|
33196
33488
|
"localNetwork.resetAllowlistToBestMatch": {
|
|
33197
33489
|
capName: "local-network",
|
|
33198
33490
|
capScope: "system",
|
|
33199
33491
|
addonId: null,
|
|
33200
33492
|
access: "delete"
|
|
33201
33493
|
},
|
|
33494
|
+
"localNetwork.revertToGeneratedCertificate": {
|
|
33495
|
+
capName: "local-network",
|
|
33496
|
+
capScope: "system",
|
|
33497
|
+
addonId: null,
|
|
33498
|
+
access: "create"
|
|
33499
|
+
},
|
|
33202
33500
|
"localNetwork.setAllowedAddresses": {
|
|
33203
33501
|
capName: "local-network",
|
|
33204
33502
|
capScope: "system",
|
|
@@ -33211,6 +33509,18 @@ Object.freeze({
|
|
|
33211
33509
|
addonId: null,
|
|
33212
33510
|
access: "create"
|
|
33213
33511
|
},
|
|
33512
|
+
"localNetwork.setViewerEndpoints": {
|
|
33513
|
+
capName: "local-network",
|
|
33514
|
+
capScope: "system",
|
|
33515
|
+
addonId: null,
|
|
33516
|
+
access: "create"
|
|
33517
|
+
},
|
|
33518
|
+
"localNetwork.uploadCertificate": {
|
|
33519
|
+
capName: "local-network",
|
|
33520
|
+
capScope: "system",
|
|
33521
|
+
addonId: null,
|
|
33522
|
+
access: "create"
|
|
33523
|
+
},
|
|
33214
33524
|
"lockControl.lock": {
|
|
33215
33525
|
capName: "lock-control",
|
|
33216
33526
|
capScope: "device",
|
|
@@ -34009,6 +34319,12 @@ Object.freeze({
|
|
|
34009
34319
|
addonId: null,
|
|
34010
34320
|
access: "view"
|
|
34011
34321
|
},
|
|
34322
|
+
"pipelineAnalytics.getGroup": {
|
|
34323
|
+
capName: "pipeline-analytics",
|
|
34324
|
+
capScope: "device",
|
|
34325
|
+
addonId: null,
|
|
34326
|
+
access: "view"
|
|
34327
|
+
},
|
|
34012
34328
|
"pipelineAnalytics.getKeyEvents": {
|
|
34013
34329
|
capName: "pipeline-analytics",
|
|
34014
34330
|
capScope: "device",
|
|
@@ -34093,6 +34409,12 @@ Object.freeze({
|
|
|
34093
34409
|
addonId: null,
|
|
34094
34410
|
access: "view"
|
|
34095
34411
|
},
|
|
34412
|
+
"pipelineAnalytics.listGroups": {
|
|
34413
|
+
capName: "pipeline-analytics",
|
|
34414
|
+
capScope: "device",
|
|
34415
|
+
addonId: null,
|
|
34416
|
+
access: "view"
|
|
34417
|
+
},
|
|
34096
34418
|
"pipelineAnalytics.listOpsLog": {
|
|
34097
34419
|
capName: "pipeline-analytics",
|
|
34098
34420
|
capScope: "device",
|
|
@@ -36091,6 +36413,12 @@ Object.freeze({
|
|
|
36091
36413
|
addonId: null,
|
|
36092
36414
|
access: "create"
|
|
36093
36415
|
},
|
|
36416
|
+
"terminalSession.updateInstance": {
|
|
36417
|
+
capName: "terminal-session",
|
|
36418
|
+
capScope: "system",
|
|
36419
|
+
addonId: null,
|
|
36420
|
+
access: "create"
|
|
36421
|
+
},
|
|
36094
36422
|
"terminalSession.writeInput": {
|
|
36095
36423
|
capName: "terminal-session",
|
|
36096
36424
|
capScope: "system",
|
|
@@ -36868,6 +37196,11 @@ Object.freeze({
|
|
|
36868
37196
|
form: "single",
|
|
36869
37197
|
optional: false
|
|
36870
37198
|
}],
|
|
37199
|
+
"deviceManager.getBindingsBatch": [{
|
|
37200
|
+
name: "deviceIds",
|
|
37201
|
+
form: "array",
|
|
37202
|
+
optional: false
|
|
37203
|
+
}],
|
|
36871
37204
|
"deviceManager.getChildren": [{
|
|
36872
37205
|
name: "parentDeviceId",
|
|
36873
37206
|
form: "single",
|
|
@@ -36913,6 +37246,11 @@ Object.freeze({
|
|
|
36913
37246
|
form: "single",
|
|
36914
37247
|
optional: false
|
|
36915
37248
|
}],
|
|
37249
|
+
"deviceManager.getLinkedDevicesBatch": [{
|
|
37250
|
+
name: "deviceIds",
|
|
37251
|
+
form: "array",
|
|
37252
|
+
optional: false
|
|
37253
|
+
}],
|
|
36916
37254
|
"deviceManager.getSettingsSchema": [{
|
|
36917
37255
|
name: "deviceId",
|
|
36918
37256
|
form: "single",
|
|
@@ -36933,6 +37271,11 @@ Object.freeze({
|
|
|
36933
37271
|
form: "single",
|
|
36934
37272
|
optional: false
|
|
36935
37273
|
}],
|
|
37274
|
+
"deviceManager.listAll": [{
|
|
37275
|
+
name: "deviceIds",
|
|
37276
|
+
form: "array",
|
|
37277
|
+
optional: true
|
|
37278
|
+
}],
|
|
36936
37279
|
"deviceManager.loadConfig": [{
|
|
36937
37280
|
name: "deviceId",
|
|
36938
37281
|
form: "single",
|
|
@@ -37506,6 +37849,11 @@ Object.freeze({
|
|
|
37506
37849
|
form: "single",
|
|
37507
37850
|
optional: false
|
|
37508
37851
|
}],
|
|
37852
|
+
"pipelineAnalytics.getGroup": [{
|
|
37853
|
+
name: "deviceId",
|
|
37854
|
+
form: "single",
|
|
37855
|
+
optional: false
|
|
37856
|
+
}],
|
|
37509
37857
|
"pipelineAnalytics.getKeyEvents": [{
|
|
37510
37858
|
name: "deviceId",
|
|
37511
37859
|
form: "single",
|
|
@@ -37561,6 +37909,11 @@ Object.freeze({
|
|
|
37561
37909
|
form: "array",
|
|
37562
37910
|
optional: false
|
|
37563
37911
|
}],
|
|
37912
|
+
"pipelineAnalytics.listGroups": [{
|
|
37913
|
+
name: "deviceIds",
|
|
37914
|
+
form: "array",
|
|
37915
|
+
optional: false
|
|
37916
|
+
}],
|
|
37564
37917
|
"pipelineAnalytics.listOpsLog": [{
|
|
37565
37918
|
name: "deviceId",
|
|
37566
37919
|
form: "single",
|
|
@@ -38578,6 +38931,35 @@ Object.freeze(Object.fromEntries([{
|
|
|
38578
38931
|
}]
|
|
38579
38932
|
}].map((s) => [s.stepId, s.defaultModelId])));
|
|
38580
38933
|
string().min(1);
|
|
38934
|
+
var CLUSTER_STEP_SETTING_FIELDS = [{
|
|
38935
|
+
stepId: "face-embedding",
|
|
38936
|
+
key: "minLandmarkFaceSize",
|
|
38937
|
+
label: "Min face size for recognition (detection px)",
|
|
38938
|
+
description: "Refuse to embed a face smaller than this IN THE DETECTION FRAME. Applies to every node — the enrolled gallery is one index, and two admission floors would fill it from two policies. 0 disables the gate.",
|
|
38939
|
+
type: "slider",
|
|
38940
|
+
min: 0,
|
|
38941
|
+
max: 64,
|
|
38942
|
+
step: 2,
|
|
38943
|
+
default: 24
|
|
38944
|
+
}];
|
|
38945
|
+
function clusterStepSettingKey(stepId, fieldKey) {
|
|
38946
|
+
return `clusterStepSetting:${stepId}:${fieldKey}`;
|
|
38947
|
+
}
|
|
38948
|
+
var ClusterSettingNumberSchema = number().finite();
|
|
38949
|
+
function readClusterStepSettings(config) {
|
|
38950
|
+
const out = {};
|
|
38951
|
+
for (const field of CLUSTER_STEP_SETTING_FIELDS) {
|
|
38952
|
+
const parsed = ClusterSettingNumberSchema.safeParse(config[clusterStepSettingKey(field.stepId, field.key)]);
|
|
38953
|
+
const value = parsed.success ? parsed.data : field.default;
|
|
38954
|
+
const existing = out[field.stepId] ?? {};
|
|
38955
|
+
out[field.stepId] = {
|
|
38956
|
+
...existing,
|
|
38957
|
+
[field.key]: value
|
|
38958
|
+
};
|
|
38959
|
+
}
|
|
38960
|
+
return out;
|
|
38961
|
+
}
|
|
38962
|
+
readClusterStepSettings({});
|
|
38581
38963
|
object({
|
|
38582
38964
|
/**
|
|
38583
38965
|
* Fraction of the box's own size added on EACH side before cutting.
|