@camstack/addon-pipeline 1.2.621 → 1.2.623
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/audio-analyzer/index.js +3 -3
- package/dist/audio-analyzer/index.mjs +3 -3
- package/dist/{custom-model-catalog-Il8UY4D4.js → custom-model-catalog-BTBdgN2p.js} +29 -16
- package/dist/{custom-model-catalog-0_SnSXzN.mjs → custom-model-catalog-D5zTw1LU.mjs} +29 -10
- package/dist/detection-pipeline/index.js +67 -416
- package/dist/detection-pipeline/index.mjs +91 -440
- package/dist/{dist-ClkumZgv.js → dist-BVo3wa7s.js} +711 -302
- package/dist/{dist-DHqkQhTQ.mjs → dist-opSx6v5i.mjs} +651 -296
- package/dist/{model-catalogs-BagalaYp.js → model-catalogs-CQytR2AN.js} +1 -1
- package/dist/{model-catalogs-Z1GZAhSb.mjs → model-catalogs-rIvLUVlw.mjs} +1 -1
- package/dist/motion-wasm/index.js +1 -1
- package/dist/motion-wasm/index.mjs +1 -1
- package/dist/{node-CkJLxlWI.mjs → node-CGIYuJMN.mjs} +1 -1
- package/dist/{node-0O_61WVW.js → node-DqLsuN_A.js} +1 -1
- package/dist/pipeline-runner/index.js +115 -460
- package/dist/pipeline-runner/index.mjs +108 -453
- package/dist/{process-memory-Dj3UgL1e.mjs → process-memory-Bd-TuWfM.mjs} +1 -1
- package/dist/{process-memory-DdIOhjYB.js → process-memory-DyxG-0mG.js} +1 -1
- package/dist/recorder/index.js +2 -2
- package/dist/recorder/index.mjs +2 -2
- package/dist/{segment-demux-js-BePzacki.js → segment-demux-js-B4bfTQpK.js} +1 -1
- package/dist/{segment-demux-js-Bv0t0-tQ.mjs → segment-demux-js-CdVRzwSd.mjs} +1 -1
- package/dist/session-decode/decode-worker-main.js +12 -21
- package/dist/session-decode/decode-worker-main.mjs +12 -21
- package/dist/stream-broker/_stub.js +2 -2
- package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-dNk74ahz.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-DF3FGCR8.mjs} +2 -2
- package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-oUZNn2Kr.mjs +26 -0
- package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-Bb-ETNGC.mjs +26 -0
- package/dist/stream-broker/demux-worker-child.js +1 -1
- package/dist/stream-broker/demux-worker-child.mjs +1 -1
- package/dist/stream-broker/{hostInit-CH5g78CJ.mjs → hostInit-BiyFzSqq.mjs} +2 -2
- package/dist/stream-broker/index.js +3 -3
- package/dist/stream-broker/index.mjs +3 -3
- package/dist/stream-broker/remoteEntry.js +1 -1
- package/dist/{worker-protocol-D_NzPcnh.mjs → worker-protocol-DngGEAT2.js} +102 -2
- package/dist/{worker-protocol-C-G8qmye.js → worker-protocol-_avq7y8O.mjs} +67 -25
- package/package.json +1 -1
- package/python/accelerator_facts.py +275 -0
- package/python/coreml_load_probe.py +105 -15
- package/python/inference_pool.py +19 -2
- package/python/openvino_compile_probe.py +72 -18
- package/python/postprocessors/ssd.py +12 -4
- package/python/postprocessors/test_ssd.py +64 -0
- package/python/test_accelerator_facts.py +105 -0
- package/python/test_coreml_load_probe.py +83 -0
- package/python/test_openvino_compile_probe.py +114 -0
- package/python/webgpu_isolated.py +19 -0
- package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-2KkGoQ55.mjs +0 -26
- package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-Dx-WrMx0.mjs +0 -26
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
//#region ../types/dist/event-category-
|
|
2
|
+
//#region ../types/dist/event-category-fDPduoeC.mjs
|
|
3
3
|
var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
4
4
|
EventCategory["SystemBoot"] = "system.boot";
|
|
5
5
|
EventCategory["SystemAddonsReady"] = "system.addons-ready";
|
|
@@ -326,9 +326,8 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
|
326
326
|
EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
|
|
327
327
|
/**
|
|
328
328
|
* Per-camera pipeline config was mutated by the orchestrator
|
|
329
|
-
* (
|
|
330
|
-
* `setCameraStepToggle` / `
|
|
331
|
-
* pipeline-scoped `applyDeviceSettingsPatch`). Orchestrator
|
|
329
|
+
* (a settings change via `setAgentInferenceDevices` /
|
|
330
|
+
* `setCameraStepToggle` / `setCameraStepSettings`). Orchestrator
|
|
332
331
|
* subscribes to its own emission to hot-reload the assigned runner
|
|
333
332
|
* via `attachCamera` so the next frame executes against the new
|
|
334
333
|
* engine/steps without waiting for a rebalance or the next
|
|
@@ -4725,10 +4724,10 @@ var ZodType = /*@__PURE__*/ $constructor("ZodType", (inst, def) => {
|
|
|
4725
4724
|
return array(this);
|
|
4726
4725
|
},
|
|
4727
4726
|
or(arg) {
|
|
4728
|
-
return union([this, arg]);
|
|
4727
|
+
return union$1([this, arg]);
|
|
4729
4728
|
},
|
|
4730
4729
|
and(arg) {
|
|
4731
|
-
return intersection(this, arg);
|
|
4730
|
+
return intersection$1(this, arg);
|
|
4732
4731
|
},
|
|
4733
4732
|
transform(tx) {
|
|
4734
4733
|
return pipe(this, transform(tx));
|
|
@@ -5199,7 +5198,7 @@ var ZodUnion = /*@__PURE__*/ $constructor("ZodUnion", (inst, def) => {
|
|
|
5199
5198
|
inst._zod.processJSONSchema = (ctx, json, params) => unionProcessor(inst, ctx, json, params);
|
|
5200
5199
|
inst.options = def.options;
|
|
5201
5200
|
});
|
|
5202
|
-
function union(options, params) {
|
|
5201
|
+
function union$1(options, params) {
|
|
5203
5202
|
return new ZodUnion({
|
|
5204
5203
|
type: "union",
|
|
5205
5204
|
options,
|
|
@@ -5223,7 +5222,7 @@ var ZodIntersection = /*@__PURE__*/ $constructor("ZodIntersection", (inst, def)
|
|
|
5223
5222
|
ZodType.init(inst, def);
|
|
5224
5223
|
inst._zod.processJSONSchema = (ctx, json, params) => intersectionProcessor(inst, ctx, json, params);
|
|
5225
5224
|
});
|
|
5226
|
-
function intersection(left, right) {
|
|
5225
|
+
function intersection$1(left, right) {
|
|
5227
5226
|
return new ZodIntersection({
|
|
5228
5227
|
type: "intersection",
|
|
5229
5228
|
left,
|
|
@@ -5564,7 +5563,7 @@ var ZodIssueCode = {
|
|
|
5564
5563
|
var ZodFirstPartyTypeKind;
|
|
5565
5564
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5566
5565
|
//#endregion
|
|
5567
|
-
//#region ../types/dist/sleep-
|
|
5566
|
+
//#region ../types/dist/sleep-CHIEEJkY.mjs
|
|
5568
5567
|
/**
|
|
5569
5568
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5570
5569
|
* window to float samples (D455).
|
|
@@ -8181,7 +8180,7 @@ var RecordIndexSchema = object({
|
|
|
8181
8180
|
fields: array(RecordFieldPathSchema).min(1).max(4),
|
|
8182
8181
|
unique: boolean().optional()
|
|
8183
8182
|
}).strict();
|
|
8184
|
-
var RecordRetentionSchema = union([
|
|
8183
|
+
var RecordRetentionSchema = union$1([
|
|
8185
8184
|
object({
|
|
8186
8185
|
ttlMs: number().int().positive(),
|
|
8187
8186
|
from: _enum(["at", "write"])
|
|
@@ -8334,7 +8333,7 @@ var CAM_PROFILE_ORDER = [
|
|
|
8334
8333
|
* the operator picked. Today's one user is the audio analyser, whose rule is
|
|
8335
8334
|
* "the lowest AVAILABLE native rung" (D537).
|
|
8336
8335
|
*/
|
|
8337
|
-
var AudioStreamPickSchema = union([CamProfileSchema, literal("auto")]);
|
|
8336
|
+
var AudioStreamPickSchema = union$1([CamProfileSchema, literal("auto")]);
|
|
8338
8337
|
var CamStreamKindSchema = _enum([
|
|
8339
8338
|
"pull-rtsp",
|
|
8340
8339
|
"pull-rtmp",
|
|
@@ -8766,7 +8765,7 @@ var ContributionSectionSchema = object({
|
|
|
8766
8765
|
description: string().optional(),
|
|
8767
8766
|
style: _enum(["card", "accordion"]).optional(),
|
|
8768
8767
|
defaultCollapsed: boolean().optional(),
|
|
8769
|
-
columns: union([
|
|
8768
|
+
columns: union$1([
|
|
8770
8769
|
literal(1),
|
|
8771
8770
|
literal(2),
|
|
8772
8771
|
literal(3),
|
|
@@ -8930,7 +8929,7 @@ var HF_REPO = "camstack/camstack-models";
|
|
|
8930
8929
|
`${HF_REPO}`;
|
|
8931
8930
|
object({
|
|
8932
8931
|
code: string().regex(/^[a-z][a-z0-9-]*(\.[a-z0-9-]+)+$/),
|
|
8933
|
-
params: record(string(), union([string(), number()])).optional()
|
|
8932
|
+
params: record(string(), union$1([string(), number()])).optional()
|
|
8934
8933
|
});
|
|
8935
8934
|
var CamstackError = class extends Error {
|
|
8936
8935
|
i18nCode;
|
|
@@ -11033,7 +11032,7 @@ var CompositionFieldReadSchema = object({
|
|
|
11033
11032
|
var CompositionFromSourceSchema = CompositionFieldReadSchema.extend({ kind: literal("from") });
|
|
11034
11033
|
var CompositionBindingSchema = discriminatedUnion("kind", [CompositionFromSourceSchema, object({
|
|
11035
11034
|
kind: literal("literal"),
|
|
11036
|
-
value: union([
|
|
11035
|
+
value: union$1([
|
|
11037
11036
|
string(),
|
|
11038
11037
|
number(),
|
|
11039
11038
|
boolean(),
|
|
@@ -11228,7 +11227,7 @@ var EncodeProfileSchema = object({
|
|
|
11228
11227
|
*/
|
|
11229
11228
|
singleSlicePerFrame: boolean().optional()
|
|
11230
11229
|
}),
|
|
11231
|
-
audio: union([literal("passthrough"), object({
|
|
11230
|
+
audio: union$1([literal("passthrough"), object({
|
|
11232
11231
|
codec: _enum([
|
|
11233
11232
|
"opus",
|
|
11234
11233
|
"aac",
|
|
@@ -11238,7 +11237,7 @@ var EncodeProfileSchema = object({
|
|
|
11238
11237
|
]),
|
|
11239
11238
|
bitrateKbps: number().int().positive().optional(),
|
|
11240
11239
|
sampleRateHz: number().int().positive().optional(),
|
|
11241
|
-
channels: union([literal(1), literal(2)]).optional()
|
|
11240
|
+
channels: union$1([literal(1), literal(2)]).optional()
|
|
11242
11241
|
})]),
|
|
11243
11242
|
/**
|
|
11244
11243
|
* ffmpeg input-side args, inserted between the fixed global flags
|
|
@@ -12326,13 +12325,22 @@ var BirthDecisionRecordSchema = object({
|
|
|
12326
12325
|
decidedByBirthEvidence: boolean(),
|
|
12327
12326
|
/** Best class-compatible crop score, or `null` when nothing compatible was
|
|
12328
12327
|
* found — deliberately not 0, which would be a measurement that never was.
|
|
12329
|
-
* Includes a box the detector's own per-class floor refused (
|
|
12330
|
-
*
|
|
12331
|
-
* score the crop really held. */
|
|
12328
|
+
* Includes a box the detector's own per-class floor refused (D922): since
|
|
12329
|
+
* D925 the gate's bar, not that floor, decides whether it confirms. */
|
|
12332
12330
|
bestScore: number().nullable(),
|
|
12333
12331
|
/** The bar this candidate actually faced (the phantom-cell hook may raise it). */
|
|
12334
12332
|
appliedMinConfidence: number().nullable(),
|
|
12335
12333
|
/**
|
|
12334
|
+
* The detector the gate re-judged the birth WITH (D925): the session's own
|
|
12335
|
+
* root model, inference-device pool and node — never a node default. `null`
|
|
12336
|
+
* when the frame named no session detector or no gate ran, and on rows
|
|
12337
|
+
* written before D925. A `session-device-unavailable` row names the session
|
|
12338
|
+
* detector that could not be reached.
|
|
12339
|
+
*/
|
|
12340
|
+
detectorModelId: string().nullable().default(null),
|
|
12341
|
+
detectorDeviceKey: string().nullable().default(null),
|
|
12342
|
+
detectorNodeId: string().nullable().default(null),
|
|
12343
|
+
/**
|
|
12336
12344
|
* The track's own `firstSeen` — the candidate's first frame, which is where
|
|
12337
12345
|
* the timeline starts. `null` for a suppressed birth, which has no track.
|
|
12338
12346
|
*/
|
|
@@ -13974,7 +13982,7 @@ var StorageDrainProgressSchema = object({
|
|
|
13974
13982
|
*
|
|
13975
13983
|
* The orchestrator's `resolveRef(ref)` handles both cases.
|
|
13976
13984
|
*/
|
|
13977
|
-
var StorageLocationRefSchema = union([StorageLocationTypeSchema, string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/)]);
|
|
13985
|
+
var StorageLocationRefSchema = union$1([StorageLocationTypeSchema, string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/)]);
|
|
13978
13986
|
/**
|
|
13979
13987
|
* `StorageLocationDeclaration` — a single storage-location entry declared by
|
|
13980
13988
|
* an addon in its `package.json` under `camstack.storageLocations`.
|
|
@@ -15330,7 +15338,7 @@ var ViewerFeatureIdSchema = _enum([
|
|
|
15330
15338
|
"scenes"
|
|
15331
15339
|
]);
|
|
15332
15340
|
/** Which devices a viewer reaches: `allow` minus `block`. */
|
|
15333
|
-
var ViewerDeviceAllowSchema = union([literal("*"), array(number().int().nonnegative())]);
|
|
15341
|
+
var ViewerDeviceAllowSchema = union$1([literal("*"), array(number().int().nonnegative())]);
|
|
15334
15342
|
/**
|
|
15335
15343
|
* The viewer grant, stored as ONE row of a user's `scopes`. A principal that
|
|
15336
15344
|
* holds it is decided by the viewer rules ALONE — any other row it carries is
|
|
@@ -15394,8 +15402,8 @@ var MethodAccessSchema = _enum([
|
|
|
15394
15402
|
* `access` is REQUIRED with min 1 element. `admin` bypass is the
|
|
15395
15403
|
* "give me everything" escape; there is no wildcard scope.
|
|
15396
15404
|
*/
|
|
15397
|
-
var AllowedProviderSchema = union([literal("*"), array(string())]);
|
|
15398
|
-
var AllowedDevicesSchema = record(string(), union([literal("*"), array(string())]));
|
|
15405
|
+
var AllowedProviderSchema = union$1([literal("*"), array(string())]);
|
|
15406
|
+
var AllowedDevicesSchema = record(string(), union$1([literal("*"), array(string())]));
|
|
15399
15407
|
var CapScopeSchema = _enum(["device", "system"]);
|
|
15400
15408
|
/**
|
|
15401
15409
|
* DeviceSelector (scope model v3 — 2026-08-12).
|
|
@@ -15501,7 +15509,7 @@ var TokenScopeSchema = preprocess(migrateLegacyTokenScope, discriminatedUnion("t
|
|
|
15501
15509
|
* own rules alone. Kept apart from {@link TokenScope} so every surface that
|
|
15502
15510
|
* edits capability rows (the scope picker, token minting) keeps its shape.
|
|
15503
15511
|
*/
|
|
15504
|
-
var UserScopeSchema = union([ViewerTokenScopeSchema, TokenScopeSchema]);
|
|
15512
|
+
var UserScopeSchema = union$1([ViewerTokenScopeSchema, TokenScopeSchema]);
|
|
15505
15513
|
object({
|
|
15506
15514
|
id: string(),
|
|
15507
15515
|
username: string(),
|
|
@@ -15550,7 +15558,7 @@ var AddonRoutesScopeSchema = object({
|
|
|
15550
15558
|
access: array(MethodAccessSchema).min(1)
|
|
15551
15559
|
});
|
|
15552
15560
|
var PreferencesSelfScopeSchema = object({ type: literal("preferences-self") });
|
|
15553
|
-
var CredentialScopeSchema = union([
|
|
15561
|
+
var CredentialScopeSchema = union$1([
|
|
15554
15562
|
literal("*"),
|
|
15555
15563
|
ShareViewScopeSchema,
|
|
15556
15564
|
AddonRoutesScopeSchema,
|
|
@@ -15784,7 +15792,7 @@ object({
|
|
|
15784
15792
|
/** The app executes it itself, silently (D858). */
|
|
15785
15793
|
app: AppLoginPathSchema.nullable()
|
|
15786
15794
|
});
|
|
15787
|
-
var ExpressionBindingSourceSchema = union([
|
|
15795
|
+
var ExpressionBindingSourceSchema = union$1([
|
|
15788
15796
|
object({
|
|
15789
15797
|
kind: literal("field").optional(),
|
|
15790
15798
|
sourceKey: string(),
|
|
@@ -15793,7 +15801,7 @@ var ExpressionBindingSourceSchema = union([
|
|
|
15793
15801
|
}),
|
|
15794
15802
|
object({
|
|
15795
15803
|
kind: literal("literal"),
|
|
15796
|
-
value: union([
|
|
15804
|
+
value: union$1([
|
|
15797
15805
|
string(),
|
|
15798
15806
|
number(),
|
|
15799
15807
|
boolean(),
|
|
@@ -15836,11 +15844,11 @@ var AutomationConditionLeafSchema = object({
|
|
|
15836
15844
|
cap: string().min(1),
|
|
15837
15845
|
fieldPath: string().min(1),
|
|
15838
15846
|
operator: AutomationConditionOperatorSchema,
|
|
15839
|
-
value: union([
|
|
15847
|
+
value: union$1([
|
|
15840
15848
|
string(),
|
|
15841
15849
|
number(),
|
|
15842
15850
|
boolean(),
|
|
15843
|
-
array(union([string(), number()]))
|
|
15851
|
+
array(union$1([string(), number()]))
|
|
15844
15852
|
])
|
|
15845
15853
|
});
|
|
15846
15854
|
/**
|
|
@@ -15895,7 +15903,7 @@ var AutomationTriggerSchema = discriminatedUnion("kind", [
|
|
|
15895
15903
|
cap: string().min(1),
|
|
15896
15904
|
fieldPath: string().min(1),
|
|
15897
15905
|
/** Fire when the field takes this value. Omit to fire on any change. */
|
|
15898
|
-
becomes: union([
|
|
15906
|
+
becomes: union$1([
|
|
15899
15907
|
string(),
|
|
15900
15908
|
number(),
|
|
15901
15909
|
boolean()
|
|
@@ -15949,7 +15957,7 @@ var AutomationActionSchema = discriminatedUnion("kind", [
|
|
|
15949
15957
|
* or `{ $var }` for the device that triggered the run. An array is
|
|
15950
15958
|
* fan-out at codegen — each id gets the same cap.method call.
|
|
15951
15959
|
*/
|
|
15952
|
-
deviceId: union([
|
|
15960
|
+
deviceId: union$1([
|
|
15953
15961
|
number().int(),
|
|
15954
15962
|
array(number().int()).min(1),
|
|
15955
15963
|
object({ $var: string().min(1) })
|
|
@@ -16117,7 +16125,7 @@ var ConfigSectionWithValuesSchema = object({
|
|
|
16117
16125
|
descriptionKey: string().optional(),
|
|
16118
16126
|
style: _enum(["card", "accordion"]).optional(),
|
|
16119
16127
|
defaultCollapsed: boolean().optional(),
|
|
16120
|
-
columns: union([
|
|
16128
|
+
columns: union$1([
|
|
16121
16129
|
literal(1),
|
|
16122
16130
|
literal(2),
|
|
16123
16131
|
literal(3),
|
|
@@ -16935,7 +16943,7 @@ var CollectionColumnSchema = object({
|
|
|
16935
16943
|
* collection surface simply cannot express their existing tables — which is
|
|
16936
16944
|
* why they were still on the uncapped `table*` API.
|
|
16937
16945
|
*/
|
|
16938
|
-
defaultValue: union([
|
|
16946
|
+
defaultValue: union$1([
|
|
16939
16947
|
string(),
|
|
16940
16948
|
number(),
|
|
16941
16949
|
boolean()
|
|
@@ -16997,7 +17005,7 @@ method(object({
|
|
|
16997
17005
|
}), object({
|
|
16998
17006
|
/** The id the row HAS: assigned by SQLite on an insert, or the existing
|
|
16999
17007
|
* row's own id on an update. */
|
|
17000
|
-
id: union([string(), number()]) }), {
|
|
17008
|
+
id: union$1([string(), number()]) }), {
|
|
17001
17009
|
kind: "mutation",
|
|
17002
17010
|
auth: "admin"
|
|
17003
17011
|
}), method(object({
|
|
@@ -17021,7 +17029,7 @@ id: union([string(), number()]) }), {
|
|
|
17021
17029
|
* for an absent one, or the ROWID SQLite assigned on an `INTEGER`
|
|
17022
17030
|
* primary key — which is the only place an auto key is knowable.
|
|
17023
17031
|
*/
|
|
17024
|
-
id: union([string(), number()]) }), {
|
|
17032
|
+
id: union$1([string(), number()]) }), {
|
|
17025
17033
|
kind: "mutation",
|
|
17026
17034
|
auth: "admin"
|
|
17027
17035
|
}), method(object({
|
|
@@ -19136,7 +19144,7 @@ var CompositionFieldStateSchema = object({
|
|
|
19136
19144
|
item: CompositionFieldItemSchema.optional(),
|
|
19137
19145
|
state: CompositionFieldStateKindSchema,
|
|
19138
19146
|
/** `null` whenever `state === 'unavailable'`; never a plausible stand-in (D393). */
|
|
19139
|
-
value: union([
|
|
19147
|
+
value: union$1([
|
|
19140
19148
|
string(),
|
|
19141
19149
|
number(),
|
|
19142
19150
|
boolean(),
|
|
@@ -19298,7 +19306,7 @@ var RawSecretMigrationReportSchema = object({
|
|
|
19298
19306
|
});
|
|
19299
19307
|
/** Where a block runs. The operator chooses — a block driving a device on an
|
|
19300
19308
|
* agent is the reason placement is not fixed to the hub. */
|
|
19301
|
-
var CoreBlockPlacementSchema = union([literal("hub"), string().min(1)]);
|
|
19309
|
+
var CoreBlockPlacementSchema = union$1([literal("hub"), string().min(1)]);
|
|
19302
19310
|
/** What a block's process is doing. Mirrors the addon runner's own lifecycle so
|
|
19303
19311
|
* a failing block reads the same way a failing addon does. `degraded` is a
|
|
19304
19312
|
* composition on an existing device with a field handed back to the native
|
|
@@ -19695,7 +19703,7 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
|
|
|
19695
19703
|
* for an absent one, or the ROWID SQLite assigned on an `INTEGER`
|
|
19696
19704
|
* primary key — which is the only place an auto key is knowable.
|
|
19697
19705
|
*/
|
|
19698
|
-
id: union([string(), number()]) }), {
|
|
19706
|
+
id: union$1([string(), number()]) }), {
|
|
19699
19707
|
kind: "mutation",
|
|
19700
19708
|
auth: "admin"
|
|
19701
19709
|
}), method(object({
|
|
@@ -19703,7 +19711,7 @@ id: union([string(), number()]) }), {
|
|
|
19703
19711
|
collection: string(),
|
|
19704
19712
|
conflict: array(string()).readonly(),
|
|
19705
19713
|
record: BulkRecordSchema
|
|
19706
|
-
}), object({ id: union([string(), number()]) }), {
|
|
19714
|
+
}), object({ id: union$1([string(), number()]) }), {
|
|
19707
19715
|
kind: "mutation",
|
|
19708
19716
|
auth: "admin"
|
|
19709
19717
|
}), method(object({
|
|
@@ -19830,20 +19838,20 @@ var RecordViewSchema = object({
|
|
|
19830
19838
|
data: RecordBodySchema
|
|
19831
19839
|
});
|
|
19832
19840
|
/** Declared index fields only. Anything else does not compile, by design. */
|
|
19833
|
-
var RecordWhereSchema = record(RecordFieldPathSchema, union([
|
|
19841
|
+
var RecordWhereSchema = record(RecordFieldPathSchema, union$1([
|
|
19834
19842
|
string(),
|
|
19835
19843
|
number(),
|
|
19836
19844
|
boolean(),
|
|
19837
|
-
object({ in: array(union([
|
|
19845
|
+
object({ in: array(union$1([
|
|
19838
19846
|
string(),
|
|
19839
19847
|
number(),
|
|
19840
19848
|
boolean()
|
|
19841
19849
|
])).min(1).max(RECORD_BATCH_MAX) }),
|
|
19842
19850
|
object({
|
|
19843
|
-
gt: union([string(), number()]).optional(),
|
|
19844
|
-
gte: union([string(), number()]).optional(),
|
|
19845
|
-
lt: union([string(), number()]).optional(),
|
|
19846
|
-
lte: union([string(), number()]).optional()
|
|
19851
|
+
gt: union$1([string(), number()]).optional(),
|
|
19852
|
+
gte: union$1([string(), number()]).optional(),
|
|
19853
|
+
lt: union$1([string(), number()]).optional(),
|
|
19854
|
+
lte: union$1([string(), number()]).optional()
|
|
19847
19855
|
}).refine((r) => Object.keys(r).length > 0, { message: "name at least one bound" })
|
|
19848
19856
|
]));
|
|
19849
19857
|
var KindShape = { kind: RecordKindNameSchema };
|
|
@@ -19994,7 +20002,7 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
|
|
|
19994
20002
|
groupBy: RecordFieldPathSchema.optional(),
|
|
19995
20003
|
where: RecordWhereSchema.optional()
|
|
19996
20004
|
}), object({ rows: array(object({
|
|
19997
|
-
group: union([
|
|
20005
|
+
group: union$1([
|
|
19998
20006
|
string(),
|
|
19999
20007
|
number(),
|
|
20000
20008
|
_null()
|
|
@@ -20340,7 +20348,7 @@ var QueryWindowShape = {
|
|
|
20340
20348
|
scope: string().optional(),
|
|
20341
20349
|
from: number(),
|
|
20342
20350
|
to: number(),
|
|
20343
|
-
resolution: union([DeviceHistoryResolutionSchema, literal("auto")]).default("auto"),
|
|
20351
|
+
resolution: union$1([DeviceHistoryResolutionSchema, literal("auto")]).default("auto"),
|
|
20344
20352
|
maxPoints: number().int().positive().max(5e3).default(1e3)
|
|
20345
20353
|
};
|
|
20346
20354
|
var QueryResultSchema = object({
|
|
@@ -20349,7 +20357,7 @@ var QueryResultSchema = object({
|
|
|
20349
20357
|
truncated: boolean()
|
|
20350
20358
|
});
|
|
20351
20359
|
/** One read of a batch: a device's key or a node's key (exactly one subject). */
|
|
20352
|
-
var QueryManyItemSchema = union([object({
|
|
20360
|
+
var QueryManyItemSchema = union$1([object({
|
|
20353
20361
|
deviceId: number().int(),
|
|
20354
20362
|
key: string(),
|
|
20355
20363
|
scope: string().optional()
|
|
@@ -43301,7 +43309,7 @@ var LlmListModelsResultSchema = discriminatedUnion("ok", [object({
|
|
|
43301
43309
|
code: LlmListModelsErrorCodeSchema,
|
|
43302
43310
|
message: string()
|
|
43303
43311
|
})]);
|
|
43304
|
-
var LlmDefaultSelectorSchema = union([object({ consumer: string() }), object({ purpose: _enum(["text", "vision"]) })]);
|
|
43312
|
+
var LlmDefaultSelectorSchema = union$1([object({ consumer: string() }), object({ purpose: _enum(["text", "vision"]) })]);
|
|
43305
43313
|
var LlmDefaultSchema = object({
|
|
43306
43314
|
selector: LlmDefaultSelectorSchema,
|
|
43307
43315
|
profileId: string()
|
|
@@ -43639,7 +43647,7 @@ var LogReadQuerySchema = object({
|
|
|
43639
43647
|
*/
|
|
43640
43648
|
fromNodeId: string().min(1).max(200).optional(),
|
|
43641
43649
|
/** Any other tag, exact match (AND). */
|
|
43642
|
-
tags: record(string(), union([string(), number()])).optional(),
|
|
43650
|
+
tags: record(string(), union$1([string(), number()])).optional(),
|
|
43643
43651
|
/** Severity FLOOR: this level and above. */
|
|
43644
43652
|
level: LogLevelSchema.optional(),
|
|
43645
43653
|
/** Case-insensitive substring over message, scope, tag values and meta values. */
|
|
@@ -43666,7 +43674,7 @@ var LogReadResultSchema = object({
|
|
|
43666
43674
|
level: LogLevelSchema,
|
|
43667
43675
|
scope: string().optional(),
|
|
43668
43676
|
message: string(),
|
|
43669
|
-
tags: record(string(), union([string(), number()])).optional(),
|
|
43677
|
+
tags: record(string(), union$1([string(), number()])).optional(),
|
|
43670
43678
|
meta: record(string(), unknown()).optional()
|
|
43671
43679
|
})),
|
|
43672
43680
|
/** Pass as `before` for the next older page; null when nothing older exists. */
|
|
@@ -48157,7 +48165,7 @@ var OauthIntegrationDescriptorSchema = object({
|
|
|
48157
48165
|
* The value is baked into the authorization code at `/authorize` and travels
|
|
48158
48166
|
* on the tokens, so editing this field changes FUTURE links only.
|
|
48159
48167
|
*/
|
|
48160
|
-
refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
|
|
48168
|
+
refreshTokenTtlSec: union$1([number().int().positive(), literal("never")]).optional()
|
|
48161
48169
|
});
|
|
48162
48170
|
method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
|
|
48163
48171
|
/**
|
|
@@ -48193,7 +48201,7 @@ var OidcConnectionUpdateInputSchema = object({
|
|
|
48193
48201
|
icon: string().optional(),
|
|
48194
48202
|
issuerUrl: string().optional(),
|
|
48195
48203
|
clientId: string().optional(),
|
|
48196
|
-
clientSecret: union([string(), object({ $secretClear: literal(true) })]).optional(),
|
|
48204
|
+
clientSecret: union$1([string(), object({ $secretClear: literal(true) })]).optional(),
|
|
48197
48205
|
redirectUri: string().optional(),
|
|
48198
48206
|
scopes: string().optional(),
|
|
48199
48207
|
usernameClaim: _enum([
|
|
@@ -48360,6 +48368,18 @@ Object.freeze({
|
|
|
48360
48368
|
reason: "camera sensor mappings not loaded"
|
|
48361
48369
|
});
|
|
48362
48370
|
/**
|
|
48371
|
+
* What the vision model must answer before a package event is emitted
|
|
48372
|
+
* when a packages rule has "Confirm with the LLM" on.
|
|
48373
|
+
*
|
|
48374
|
+
* `package` is the verdict. `confidence` is 0..1. `reason` is the model's
|
|
48375
|
+
* one-line explanation, stored on the event so a drop is not silent.
|
|
48376
|
+
*/
|
|
48377
|
+
var PackageLlmVerdictSchema = object({
|
|
48378
|
+
package: boolean(),
|
|
48379
|
+
confidence: number().min(0).max(1),
|
|
48380
|
+
reason: string().min(1)
|
|
48381
|
+
});
|
|
48382
|
+
/**
|
|
48363
48383
|
* A model choice has a SCOPE, and a scope change has a workflow.
|
|
48364
48384
|
*
|
|
48365
48385
|
* ## The two scopes
|
|
@@ -48836,7 +48856,7 @@ var TrackFlagsSchema = object({
|
|
|
48836
48856
|
* `trained` without a re-fetch. */
|
|
48837
48857
|
retrainStatus: RetrainStatusSchema
|
|
48838
48858
|
});
|
|
48839
|
-
union([literal(1), literal(2)]);
|
|
48859
|
+
union$1([literal(1), literal(2)]);
|
|
48840
48860
|
/**
|
|
48841
48861
|
* WHO decided a label, and when. Carried per tier so a value can be traced to
|
|
48842
48862
|
* the step and model that produced it — which is what makes the write rule
|
|
@@ -49343,6 +49363,21 @@ var ObjectEventSchema = object({
|
|
|
49343
49363
|
* pick-up written before D684 — UNKNOWN, never 0 and never `timestamp`.
|
|
49344
49364
|
*/
|
|
49345
49365
|
observedAt: number().optional(),
|
|
49366
|
+
/**
|
|
49367
|
+
* The delivery was emitted without a vision-model yes (D931).
|
|
49368
|
+
*
|
|
49369
|
+
* Set only when the packages rule asked for an LLM confirm and the model
|
|
49370
|
+
* was unreachable, timed out, or answered something that did not parse.
|
|
49371
|
+
* A notification reads it so it can say "possible" instead of a definite
|
|
49372
|
+
* delivery. Absent on every other row, and on a confirm that said yes.
|
|
49373
|
+
*/
|
|
49374
|
+
packagePossible: boolean().optional(),
|
|
49375
|
+
/**
|
|
49376
|
+
* The vision model's verdict, when a packages rule asked for one and the
|
|
49377
|
+
* model answered the schema (D931). A "no" never becomes a row — the
|
|
49378
|
+
* detector drops it and logs the reason. Present on a yes.
|
|
49379
|
+
*/
|
|
49380
|
+
packageLlmVerdict: PackageLlmVerdictSchema.optional(),
|
|
49346
49381
|
/** The parent track's key-event importance [0,1], propagated to every object
|
|
49347
49382
|
* event of the track (so an event row can be sorted by importance without a
|
|
49348
49383
|
* track join). Absent on legacy rows / before the track was scored. */
|
|
@@ -51140,7 +51175,6 @@ var PipelineAddonSchemaSchema = object({
|
|
|
51140
51175
|
defaultModelId: string(),
|
|
51141
51176
|
defaultModelIdByFormat: record(string(), string()).optional(),
|
|
51142
51177
|
enabledByDefault: boolean().optional(),
|
|
51143
|
-
backfillIntoExistingOverrides: boolean().optional(),
|
|
51144
51178
|
defaultConfidence: number(),
|
|
51145
51179
|
group: string().optional(),
|
|
51146
51180
|
configSchema: array(ConfigFieldBridge).readonly().optional()
|
|
@@ -51267,7 +51301,6 @@ var AudioTestResultSchema = object({
|
|
|
51267
51301
|
error: string().optional(),
|
|
51268
51302
|
frame: custom().optional()
|
|
51269
51303
|
});
|
|
51270
|
-
var PipelineConfigBridge = custom();
|
|
51271
51304
|
var ConfigUISchemaBridge = custom();
|
|
51272
51305
|
var ConfigUISchemaNullableBridge = custom();
|
|
51273
51306
|
var InferenceCapabilitiesBridge = custom();
|
|
@@ -51292,7 +51325,6 @@ var pipelineExecutorCapability = {
|
|
|
51292
51325
|
methods: {
|
|
51293
51326
|
getAvailableEngines: method(_void(), array(PipelineEngineChoiceSchema)),
|
|
51294
51327
|
getSelectedEngine: method(_void(), PipelineEngineChoiceSchema),
|
|
51295
|
-
getDefaultSteps: method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)),
|
|
51296
51328
|
/**
|
|
51297
51329
|
* Per-node detection-engine provisioning snapshot. Returns the live
|
|
51298
51330
|
* state of the lazy runtime-provisioning machine on `nodeId`
|
|
@@ -51314,54 +51346,6 @@ var pipelineExecutorCapability = {
|
|
|
51314
51346
|
auth: "admin"
|
|
51315
51347
|
}),
|
|
51316
51348
|
/**
|
|
51317
|
-
* Clear THIS node's executor-side PER-DEVICE settings stores (the
|
|
51318
|
-
* per-camera step overrides the object-detection root reads via
|
|
51319
|
-
* `applyDeviceOverridesToTree`). `nodeId` is the ROUTING key — the
|
|
51320
|
-
* generated cap-router strips it (default `nodeIdMode: 'routing'`) and
|
|
51321
|
-
* dispatches to that node, so the provider method runs ON the target
|
|
51322
|
-
* node and receives no `nodeId`.
|
|
51323
|
-
*
|
|
51324
|
-
* This is the slimmed executor leg of the orchestrator's
|
|
51325
|
-
* `resetNodePipelineDefaults` flow (which owns the real reset: node
|
|
51326
|
-
* addonDefaults pins + per-camera orchestrator overrides). The legacy
|
|
51327
|
-
* `resetToDefault` — which reset a persisted global step-tree seed
|
|
51328
|
-
* nothing in the live per-camera path read — was removed together with
|
|
51329
|
-
* that seed.
|
|
51330
|
-
*/
|
|
51331
|
-
clearDeviceOverrides: method(object({ nodeId: string() }), object({
|
|
51332
|
-
success: literal(true),
|
|
51333
|
-
clearedDevices: number()
|
|
51334
|
-
}), {
|
|
51335
|
-
kind: "mutation",
|
|
51336
|
-
auth: "admin"
|
|
51337
|
-
}),
|
|
51338
|
-
/**
|
|
51339
|
-
* Auto tune (D745): the MODEL-BOUND thresholds (`bindsToModel` keys of
|
|
51340
|
-
* the object-detection root, and their binding keys) stored in THIS node's
|
|
51341
|
-
* per-camera detector settings — and, unless `dryRun`, remove them so the
|
|
51342
|
-
* running model's own defaults apply. Every other key of a camera's store
|
|
51343
|
-
* is kept. `nodeId` is the ROUTING key. `deviceIds` absent ⇒ every camera
|
|
51344
|
-
* with a store. A camera whose store could not be read is `refused`, never
|
|
51345
|
-
* reported as clean.
|
|
51346
|
-
*/
|
|
51347
|
-
clearModelBoundDeviceOverrides: method(object({
|
|
51348
|
-
nodeId: string(),
|
|
51349
|
-
deviceIds: array(number()).readonly().optional(),
|
|
51350
|
-
dryRun: boolean()
|
|
51351
|
-
}), object({
|
|
51352
|
-
entries: array(object({
|
|
51353
|
-
deviceId: number(),
|
|
51354
|
-
keys: array(string()).readonly()
|
|
51355
|
-
})).readonly(),
|
|
51356
|
-
refused: array(object({
|
|
51357
|
-
deviceId: number(),
|
|
51358
|
-
reason: string()
|
|
51359
|
-
})).readonly()
|
|
51360
|
-
}), {
|
|
51361
|
-
kind: "mutation",
|
|
51362
|
-
auth: "admin"
|
|
51363
|
-
}),
|
|
51364
|
-
/**
|
|
51365
51349
|
* Which of THIS node's inference devices the executor currently refuses,
|
|
51366
51350
|
* and why. `nodeId` is the ROUTING key (stripped by the generated router).
|
|
51367
51351
|
*
|
|
@@ -51416,8 +51400,6 @@ var pipelineExecutorCapability = {
|
|
|
51416
51400
|
auth: "admin"
|
|
51417
51401
|
}),
|
|
51418
51402
|
getSchema: method(_void(), PipelineSchemaSchema),
|
|
51419
|
-
getGlobalSteps: method(_void(), array(PipelineDefaultStepSchema).readonly().nullable()),
|
|
51420
|
-
getGlobalPipelineConfig: method(_void(), PipelineConfigBridge),
|
|
51421
51403
|
getOrchestratorConfigSchema: method(_void(), ConfigUISchemaBridge),
|
|
51422
51404
|
/**
|
|
51423
51405
|
* Gate B (pre-init config-correctness gate). PURE COMPUTE against this
|
|
@@ -51776,11 +51758,18 @@ var KeptReasonSchema = _enum(["custom-pin"]);
|
|
|
51776
51758
|
* Where a choice's latency came from (D791): this node's own benchmark
|
|
51777
51759
|
* result, or the hardware-class table. Measured on the node beats the table.
|
|
51778
51760
|
*/
|
|
51779
|
-
var LatencySourceSchema = discriminatedUnion("kind", [
|
|
51780
|
-
kind: literal("
|
|
51781
|
-
|
|
51782
|
-
|
|
51783
|
-
|
|
51761
|
+
var LatencySourceSchema = discriminatedUnion("kind", [
|
|
51762
|
+
object({ kind: literal("table") }),
|
|
51763
|
+
object({
|
|
51764
|
+
kind: literal("node-benchmark"),
|
|
51765
|
+
resultId: string(),
|
|
51766
|
+
measuredAtMs: number()
|
|
51767
|
+
}),
|
|
51768
|
+
object({
|
|
51769
|
+
kind: literal("estimated"),
|
|
51770
|
+
estimatedFrom: HardwareClassIdSchema
|
|
51771
|
+
})
|
|
51772
|
+
]);
|
|
51784
51773
|
var DeviceModelChoiceSchema = object({
|
|
51785
51774
|
modelId: string(),
|
|
51786
51775
|
p50Ms: number(),
|
|
@@ -51788,6 +51777,11 @@ var DeviceModelChoiceSchema = object({
|
|
|
51788
51777
|
measured: boolean(),
|
|
51789
51778
|
/** Absent on a plan from before D791 — read as the table. */
|
|
51790
51779
|
source: LatencySourceSchema.optional(),
|
|
51780
|
+
/**
|
|
51781
|
+
* The measured class this latency was scaled from (D930). Absent when the
|
|
51782
|
+
* cell is the table or a node benchmark.
|
|
51783
|
+
*/
|
|
51784
|
+
estimatedFrom: HardwareClassIdSchema.optional(),
|
|
51791
51785
|
/** Parallel sessions at the camera rate with the headroom kept free: ⌊fps × (1 − headroom) / camera fps⌋. */
|
|
51792
51786
|
capacitySessions: number(),
|
|
51793
51787
|
personRecall: number()
|
|
@@ -51827,40 +51821,20 @@ var NodeDeviceChangeSchema = object({
|
|
|
51827
51821
|
keys: array(string()).readonly()
|
|
51828
51822
|
})).readonly()
|
|
51829
51823
|
});
|
|
51830
|
-
|
|
51831
|
-
|
|
51832
|
-
|
|
51824
|
+
/**
|
|
51825
|
+
* Every model and model-bound threshold lives on the accelerator that runs it
|
|
51826
|
+
* (D927), so the plan writes node / device entries only — there is no camera
|
|
51827
|
+
* layer for it to clear.
|
|
51828
|
+
*/
|
|
51829
|
+
var AutoTuneWarningSchema = discriminatedUnion("kind", [object({
|
|
51830
|
+
kind: literal("custom-pin-kept"),
|
|
51833
51831
|
nodeId: string(),
|
|
51834
|
-
deviceKey: string()
|
|
51835
|
-
|
|
51836
|
-
|
|
51837
|
-
|
|
51838
|
-
|
|
51839
|
-
|
|
51840
|
-
deviceId: number(),
|
|
51841
|
-
keys: array(string()).readonly()
|
|
51842
|
-
});
|
|
51843
|
-
var AutoTuneWarningSchema = discriminatedUnion("kind", [
|
|
51844
|
-
object({
|
|
51845
|
-
kind: literal("detector-store-cluster-wide"),
|
|
51846
|
-
skippedNodes: array(string()).readonly()
|
|
51847
|
-
}),
|
|
51848
|
-
object({
|
|
51849
|
-
kind: literal("detector-store-unreadable"),
|
|
51850
|
-
error: string()
|
|
51851
|
-
}),
|
|
51852
|
-
object({
|
|
51853
|
-
kind: literal("custom-pin-kept"),
|
|
51854
|
-
nodeId: string(),
|
|
51855
|
-
deviceKey: string().nullable(),
|
|
51856
|
-
deviceId: number().nullable(),
|
|
51857
|
-
modelId: string()
|
|
51858
|
-
}),
|
|
51859
|
-
object({
|
|
51860
|
-
kind: literal("custom-registry-unreadable"),
|
|
51861
|
-
error: string()
|
|
51862
|
-
})
|
|
51863
|
-
]);
|
|
51832
|
+
deviceKey: string(),
|
|
51833
|
+
modelId: string()
|
|
51834
|
+
}), object({
|
|
51835
|
+
kind: literal("custom-registry-unreadable"),
|
|
51836
|
+
error: string()
|
|
51837
|
+
})]);
|
|
51864
51838
|
var AutoTuneOptionsSchema = object({
|
|
51865
51839
|
/** Share of each accelerator's throughput kept free (0.3–0.5). */
|
|
51866
51840
|
headroom: number().min(.3).max(.5).default(.4),
|
|
@@ -51882,8 +51856,6 @@ var AutoTunePlanSchema = object({
|
|
|
51882
51856
|
generatedAt: number(),
|
|
51883
51857
|
nodes: array(NodeRecommendationSchema).readonly(),
|
|
51884
51858
|
nodeChanges: array(NodeDeviceChangeSchema).readonly(),
|
|
51885
|
-
cameraClears: array(CameraOverrideClearSchema).readonly(),
|
|
51886
|
-
detectorStoreClears: array(DetectorStoreClearSchema).readonly(),
|
|
51887
51859
|
warnings: array(AutoTuneWarningSchema).readonly()
|
|
51888
51860
|
});
|
|
51889
51861
|
var AutoTuneApplyInputSchema = object({
|
|
@@ -51894,8 +51866,6 @@ var AutoTuneApplyInputSchema = object({
|
|
|
51894
51866
|
var AutoTunePhaseResultSchema = object({
|
|
51895
51867
|
phase: _enum([
|
|
51896
51868
|
"download",
|
|
51897
|
-
"camera-overrides",
|
|
51898
|
-
"detector-thresholds",
|
|
51899
51869
|
"node-models",
|
|
51900
51870
|
"redispatch"
|
|
51901
51871
|
]),
|
|
@@ -52713,7 +52683,7 @@ var DetailResultSchema = object({
|
|
|
52713
52683
|
* stops enriching rather than guessing, which is why addon-pipeline is
|
|
52714
52684
|
* deployed BEFORE addon-post-analysis.
|
|
52715
52685
|
*/
|
|
52716
|
-
labelTier: union([literal(1), literal(2)]).optional(),
|
|
52686
|
+
labelTier: union$1([literal(1), literal(2)]).optional(),
|
|
52717
52687
|
/** Model that produced `label` — carried into the tier's attribution. */
|
|
52718
52688
|
labelModelId: string().optional(),
|
|
52719
52689
|
alignedCropJpeg: string().optional(),
|
|
@@ -53812,6 +53782,12 @@ var AgentPipelineSettingsSchema = object({
|
|
|
53812
53782
|
/** Hub-persisted UI colour (`--color-node-*` theme tokens). */
|
|
53813
53783
|
color: NodeColorIdSchema.optional(),
|
|
53814
53784
|
/**
|
|
53785
|
+
* NODE-wide step settings (D927): `stepId → { key → value }`, applied on
|
|
53786
|
+
* every accelerator of the node under the device's own settings. Never a
|
|
53787
|
+
* model or a model-bound threshold. Written by `setNodeStepSettings`.
|
|
53788
|
+
*/
|
|
53789
|
+
stepSettings: record(string(), record(string(), unknown()).readonly()).optional(),
|
|
53790
|
+
/**
|
|
53815
53791
|
* Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
|
|
53816
53792
|
* weight, steps}. Absent / all-disabled ⇒ the node's single default
|
|
53817
53793
|
* accelerator (safe default); two+ enabled ⇒ the dispatcher balances
|
|
@@ -53827,17 +53803,6 @@ var AgentPipelineSettingsSchema = object({
|
|
|
53827
53803
|
steps: record(string(), DeviceStepConfigSchema).optional()
|
|
53828
53804
|
})).optional()
|
|
53829
53805
|
});
|
|
53830
|
-
var CameraPipelineForAgentSchema = object({
|
|
53831
|
-
steps: array(PipelineStepInputSchema).readonly(),
|
|
53832
|
-
audio: object({
|
|
53833
|
-
modelId: string(),
|
|
53834
|
-
enabled: boolean()
|
|
53835
|
-
}).nullable()
|
|
53836
|
-
});
|
|
53837
|
-
var CameraStepOverridePatchSchema = object({
|
|
53838
|
-
modelId: string().optional(),
|
|
53839
|
-
settings: record(string(), unknown()).readonly().optional()
|
|
53840
|
-
});
|
|
53841
53806
|
var CameraStepSettingsSchema = record(string(), record(string(), unknown()).readonly());
|
|
53842
53807
|
/** The three root-detector choices a camera has (D507: at most one root). */
|
|
53843
53808
|
var CameraDetectionSourceSchema = _enum([
|
|
@@ -53847,9 +53812,7 @@ var CameraDetectionSourceSchema = _enum([
|
|
|
53847
53812
|
]);
|
|
53848
53813
|
var CameraPipelineSettingsSchema = object({
|
|
53849
53814
|
stepToggles: record(string(), boolean()).optional(),
|
|
53850
|
-
stepSettings: CameraStepSettingsSchema.optional()
|
|
53851
|
-
stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
|
|
53852
|
-
pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
|
|
53815
|
+
stepSettings: CameraStepSettingsSchema.optional()
|
|
53853
53816
|
});
|
|
53854
53817
|
/**
|
|
53855
53818
|
* Pipeline placement record persisted by `addon-pipeline-orchestrator` via
|
|
@@ -54395,6 +54358,13 @@ method(object({
|
|
|
54395
54358
|
}), object({ success: literal(true) }), {
|
|
54396
54359
|
kind: "mutation",
|
|
54397
54360
|
auth: "admin"
|
|
54361
|
+
}), method(object({
|
|
54362
|
+
agentNodeId: string(),
|
|
54363
|
+
addonId: string(),
|
|
54364
|
+
settings: record(string(), unknown()).nullable()
|
|
54365
|
+
}), object({ success: literal(true) }), {
|
|
54366
|
+
kind: "mutation",
|
|
54367
|
+
auth: "admin"
|
|
54398
54368
|
}), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({
|
|
54399
54369
|
agentNodeId: string(),
|
|
54400
54370
|
deviceKey: string()
|
|
@@ -54404,9 +54374,7 @@ method(object({
|
|
|
54404
54374
|
}), method(object({ agentNodeId: string() }), object({
|
|
54405
54375
|
success: literal(true),
|
|
54406
54376
|
/** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
|
|
54407
|
-
effectiveModelId: string().nullable()
|
|
54408
|
-
/** Number of cameras whose node-scoped overrides were cleared. */
|
|
54409
|
-
clearedCameraOverrides: number()
|
|
54377
|
+
effectiveModelId: string().nullable()
|
|
54410
54378
|
}), {
|
|
54411
54379
|
kind: "mutation",
|
|
54412
54380
|
auth: "admin"
|
|
@@ -54461,15 +54429,6 @@ method(object({
|
|
|
54461
54429
|
}), object({ success: literal(true) }), {
|
|
54462
54430
|
kind: "mutation",
|
|
54463
54431
|
auth: "admin"
|
|
54464
|
-
}), method(object({ deviceId: number() }), record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).nullable()), method(object({
|
|
54465
|
-
deviceId: number(),
|
|
54466
|
-
agentNodeId: string(),
|
|
54467
|
-
deviceKey: string(),
|
|
54468
|
-
addonId: string(),
|
|
54469
|
-
patch: CameraStepOverridePatchSchema.nullable()
|
|
54470
|
-
}), object({ success: literal(true) }), {
|
|
54471
|
-
kind: "mutation",
|
|
54472
|
-
auth: "admin"
|
|
54473
54432
|
}), method(object({
|
|
54474
54433
|
deviceId: number(),
|
|
54475
54434
|
addonId: string(),
|
|
@@ -54477,13 +54436,6 @@ method(object({
|
|
|
54477
54436
|
}), object({ success: literal(true) }), {
|
|
54478
54437
|
kind: "mutation",
|
|
54479
54438
|
auth: "admin"
|
|
54480
|
-
}), method(object({
|
|
54481
|
-
deviceId: number(),
|
|
54482
|
-
agentNodeId: string(),
|
|
54483
|
-
pipeline: CameraPipelineForAgentSchema.nullable()
|
|
54484
|
-
}), object({ success: literal(true) }), {
|
|
54485
|
-
kind: "mutation",
|
|
54486
|
-
auth: "admin"
|
|
54487
54439
|
}), method(object({
|
|
54488
54440
|
deviceId: number(),
|
|
54489
54441
|
agentNodeId: string().optional()
|
|
@@ -54931,7 +54883,7 @@ method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), S
|
|
|
54931
54883
|
*/
|
|
54932
54884
|
var EmailAddressSchema = email();
|
|
54933
54885
|
var SendEmailInputSchema = object({
|
|
54934
|
-
to: union([EmailAddressSchema, array(EmailAddressSchema).min(1)]),
|
|
54886
|
+
to: union$1([EmailAddressSchema, array(EmailAddressSchema).min(1)]),
|
|
54935
54887
|
cc: array(EmailAddressSchema).optional(),
|
|
54936
54888
|
bcc: array(EmailAddressSchema).optional(),
|
|
54937
54889
|
/** RFC 5322 `From` field. Most relays will reject if the domain
|
|
@@ -55152,7 +55104,7 @@ var SsoBridgeClaimsSchema = object({
|
|
|
55152
55104
|
* editing a descriptor must not retroactively extend or shorten a link the
|
|
55153
55105
|
* operator already consented to.
|
|
55154
55106
|
*/
|
|
55155
|
-
refreshTtl: union([number().int().positive(), literal("never")]).optional(),
|
|
55107
|
+
refreshTtl: union$1([number().int().positive(), literal("never")]).optional(),
|
|
55156
55108
|
/**
|
|
55157
55109
|
* Opaque handle of a hub-side LINK intent (D782). Set by an OIDC callback
|
|
55158
55110
|
* that was started from a signed-in user's "Link" button: the finish then
|
|
@@ -55199,7 +55151,7 @@ method(object({
|
|
|
55199
55151
|
* went through the numeric path would fail at mint time and break
|
|
55200
55152
|
* linking rather than produce an eternal token.
|
|
55201
55153
|
*/
|
|
55202
|
-
ttlSec: union([number().int().positive(), literal("never")]).optional()
|
|
55154
|
+
ttlSec: union$1([number().int().positive(), literal("never")]).optional()
|
|
55203
55155
|
}), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
|
|
55204
55156
|
var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
|
|
55205
55157
|
providerId: string().min(1),
|
|
@@ -55767,7 +55719,7 @@ method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }),
|
|
|
55767
55719
|
*/
|
|
55768
55720
|
var TurnServerSchema = object({
|
|
55769
55721
|
/** Single URL or list of URLs (e.g. "turn:turn.example.com:3478?transport=udp"). */
|
|
55770
|
-
urls: union([string(), array(string())]),
|
|
55722
|
+
urls: union$1([string(), array(string())]),
|
|
55771
55723
|
username: string().optional(),
|
|
55772
55724
|
credential: string().optional()
|
|
55773
55725
|
});
|
|
@@ -55965,7 +55917,7 @@ var VectorMetricSchema = _enum([
|
|
|
55965
55917
|
* Callers keep their rich records in their own store and put only the filterable
|
|
55966
55918
|
* columns here (deviceId, timestamp, className, modelId, …).
|
|
55967
55919
|
*/
|
|
55968
|
-
var VectorMetadataSchema = record(string(), union([
|
|
55920
|
+
var VectorMetadataSchema = record(string(), union$1([
|
|
55969
55921
|
string(),
|
|
55970
55922
|
number(),
|
|
55971
55923
|
boolean()
|
|
@@ -55978,7 +55930,7 @@ var VectorMetadataSchema = record(string(), union([
|
|
|
55978
55930
|
* caller will treat as matches.
|
|
55979
55931
|
*/
|
|
55980
55932
|
var VectorFilterSchema = object({
|
|
55981
|
-
equals: record(string(), union([
|
|
55933
|
+
equals: record(string(), union$1([
|
|
55982
55934
|
string(),
|
|
55983
55935
|
number(),
|
|
55984
55936
|
boolean()
|
|
@@ -59142,7 +59094,7 @@ object({
|
|
|
59142
59094
|
/** Current value. Numeric kind → number; select/text/datetime → string.
|
|
59143
59095
|
* Datetime values are ISO 8601 strings (full timestamp, date-only,
|
|
59144
59096
|
* or time-only — HA accepts all three forms). */
|
|
59145
|
-
value: union([number(), string()]),
|
|
59097
|
+
value: union$1([number(), string()]),
|
|
59146
59098
|
/** Acceptable values when `kind === 'select'`. Empty for other kinds. */
|
|
59147
59099
|
options: array(string()),
|
|
59148
59100
|
/** Ms epoch when the slice was last updated. */
|
|
@@ -59456,7 +59408,7 @@ object({
|
|
|
59456
59408
|
});
|
|
59457
59409
|
var DeviceIdSchema = number().int().nonnegative();
|
|
59458
59410
|
/** A value a program option or setting can take. */
|
|
59459
|
-
var DishwasherValueSchema = union([
|
|
59411
|
+
var DishwasherValueSchema = union$1([
|
|
59460
59412
|
boolean(),
|
|
59461
59413
|
string(),
|
|
59462
59414
|
number()
|
|
@@ -62769,6 +62721,30 @@ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly(
|
|
|
62769
62721
|
kind: "mutation",
|
|
62770
62722
|
auth: "admin"
|
|
62771
62723
|
});
|
|
62724
|
+
var CORE_ULTRA_265K_IGPU_CLOCK_MHZ = 2e3;
|
|
62725
|
+
var positiveOrNull = number().nullable().transform((value) => value !== null && Number.isFinite(value) && value > 0 ? value : null);
|
|
62726
|
+
var textOrNull = string().nullable().transform((value) => value !== null && value.trim() !== "" ? value : null);
|
|
62727
|
+
var PrecisionGopsSchema = object({
|
|
62728
|
+
int8: positiveOrNull,
|
|
62729
|
+
fp16: positiveOrNull
|
|
62730
|
+
});
|
|
62731
|
+
/** What one accelerator device reported. Every failed query is null. */
|
|
62732
|
+
var AcceleratorComputeSchema = object({
|
|
62733
|
+
deviceKey: string(),
|
|
62734
|
+
fullDeviceName: textOrNull,
|
|
62735
|
+
executionUnits: positiveOrNull,
|
|
62736
|
+
clockMHz: positiveOrNull,
|
|
62737
|
+
gops: PrecisionGopsSchema.nullable(),
|
|
62738
|
+
architecture: textOrNull,
|
|
62739
|
+
npuName: textOrNull,
|
|
62740
|
+
tops: positiveOrNull,
|
|
62741
|
+
vendor: textOrNull,
|
|
62742
|
+
webgpuArchitecture: textOrNull,
|
|
62743
|
+
webgpuDevice: textOrNull,
|
|
62744
|
+
computeUnits: positiveOrNull
|
|
62745
|
+
});
|
|
62746
|
+
object({ accelerators: array(AcceleratorComputeSchema).nullable() });
|
|
62747
|
+
64 * CORE_ULTRA_265K_IGPU_CLOCK_MHZ;
|
|
62772
62748
|
var ModelFormatSchema = _enum(MODEL_FORMATS);
|
|
62773
62749
|
var HwAccelBackendInputSchema = _enum([
|
|
62774
62750
|
"videotoolbox",
|
|
@@ -62882,7 +62858,12 @@ var HardwareInfoSchema = object({
|
|
|
62882
62858
|
availableRAM_MB: number(),
|
|
62883
62859
|
gpu: GpuInfoSchema.nullable(),
|
|
62884
62860
|
npu: NpuInfoSchema.nullable(),
|
|
62885
|
-
coral: CoralInfoSchema.nullable().optional()
|
|
62861
|
+
coral: CoralInfoSchema.nullable().optional(),
|
|
62862
|
+
/**
|
|
62863
|
+
* Per-accelerator compute (D930). Omitted by a node that has not probed it.
|
|
62864
|
+
* `null` fields inside an entry are a failed query, never a zero.
|
|
62865
|
+
*/
|
|
62866
|
+
accelerators: array(AcceleratorComputeSchema).readonly().optional()
|
|
62886
62867
|
});
|
|
62887
62868
|
var PlatformScoreSchema = object({
|
|
62888
62869
|
runtime: literal("python"),
|
|
@@ -65778,7 +65759,20 @@ var ZoneRuleSchema = object({
|
|
|
65778
65759
|
* Defaults to `true` so operators creating a rule via the UI
|
|
65779
65760
|
* see it active immediately.
|
|
65780
65761
|
*/
|
|
65781
|
-
enabled: boolean().default(true)
|
|
65762
|
+
enabled: boolean().default(true),
|
|
65763
|
+
/**
|
|
65764
|
+
* Package stage only. When true, a package candidate may open from a
|
|
65765
|
+
* scene difference in this rule's zone after a person leaves. The
|
|
65766
|
+
* package model, when it boxes something overlapping, is extra evidence
|
|
65767
|
+
* and is not the gate. Absent or false keeps today's model path.
|
|
65768
|
+
*/
|
|
65769
|
+
detectBySceneDifference: boolean().optional(),
|
|
65770
|
+
/**
|
|
65771
|
+
* Package stage only. When true, a promoted package is shown to the
|
|
65772
|
+
* `llm` cap before the delivery event is emitted. Absent or false emits
|
|
65773
|
+
* as today. Usable with or without `detectBySceneDifference`.
|
|
65774
|
+
*/
|
|
65775
|
+
confirmWithLlm: boolean().optional()
|
|
65782
65776
|
});
|
|
65783
65777
|
array(ZoneRuleSchema).readonly();
|
|
65784
65778
|
object({
|
|
@@ -66590,8 +66584,8 @@ var UserSummarySchema = object({
|
|
|
66590
66584
|
id: string(),
|
|
66591
66585
|
username: string(),
|
|
66592
66586
|
isAdmin: boolean().default(false),
|
|
66593
|
-
allowedProviders: union([array(string()), literal("*")]),
|
|
66594
|
-
allowedDevices: record(string(), union([array(string()), literal("*")])),
|
|
66587
|
+
allowedProviders: union$1([array(string()), literal("*")]),
|
|
66588
|
+
allowedDevices: record(string(), union$1([array(string()), literal("*")])),
|
|
66595
66589
|
/** Capability rows, or ONE viewer row (D921) — see `UserScopeSchema`. */
|
|
66596
66590
|
scopes: array(UserScopeSchema).default([]),
|
|
66597
66591
|
/**
|
|
@@ -66608,15 +66602,15 @@ var CreateUserInputSchema = object({
|
|
|
66608
66602
|
username: string(),
|
|
66609
66603
|
password: string().min(6),
|
|
66610
66604
|
isAdmin: boolean().default(false),
|
|
66611
|
-
allowedProviders: union([array(string()), literal("*")]).optional(),
|
|
66612
|
-
allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
|
|
66605
|
+
allowedProviders: union$1([array(string()), literal("*")]).optional(),
|
|
66606
|
+
allowedDevices: record(string(), union$1([array(string()), literal("*")])).optional(),
|
|
66613
66607
|
scopes: array(UserScopeSchema).optional()
|
|
66614
66608
|
});
|
|
66615
66609
|
var UpdateUserInputSchema = object({
|
|
66616
66610
|
id: string(),
|
|
66617
66611
|
isAdmin: boolean().optional(),
|
|
66618
|
-
allowedProviders: union([array(string()), literal("*")]).optional(),
|
|
66619
|
-
allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
|
|
66612
|
+
allowedProviders: union$1([array(string()), literal("*")]).optional(),
|
|
66613
|
+
allowedDevices: record(string(), union$1([array(string()), literal("*")])).optional(),
|
|
66620
66614
|
scopes: array(UserScopeSchema).optional()
|
|
66621
66615
|
});
|
|
66622
66616
|
var OauthSessionSummarySchema = object({
|
|
@@ -66735,7 +66729,7 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
|
|
|
66735
66729
|
* From `OauthIntegrationDescriptor.refreshTokenTtlSec`. Baked into the
|
|
66736
66730
|
* code so the link carries its own lifetime; omit for the 30-day
|
|
66737
66731
|
* default. */
|
|
66738
|
-
refreshTtlSec: union([number().int().positive(), literal("never")]).optional()
|
|
66732
|
+
refreshTtlSec: union$1([number().int().positive(), literal("never")]).optional()
|
|
66739
66733
|
}), object({ code: string() }), {
|
|
66740
66734
|
kind: "mutation",
|
|
66741
66735
|
access: "create"
|
|
@@ -67225,7 +67219,7 @@ var TrainingProviderUpdateEntryInputSchema = object({
|
|
|
67225
67219
|
entryId: string().min(1),
|
|
67226
67220
|
name: string().min(1),
|
|
67227
67221
|
tokenId: string().optional(),
|
|
67228
|
-
tokenSecret: union([string(), object({ $secretClear: literal(true) })]).optional(),
|
|
67222
|
+
tokenSecret: union$1([string(), object({ $secretClear: literal(true) })]).optional(),
|
|
67229
67223
|
environment: string().optional(),
|
|
67230
67224
|
gpuType: string().optional(),
|
|
67231
67225
|
region: string().optional(),
|
|
@@ -67388,7 +67382,7 @@ method(object({}), array(TrainingProviderDescriptorSchema).readonly(), { auth: "
|
|
|
67388
67382
|
* - **Jobs.** A persisted state machine, a reconcile loop against the
|
|
67389
67383
|
* provider, a cost guard, a daily orphan sweep and the retention rules.
|
|
67390
67384
|
* - **The return flow.** Verified artefacts → Model Studio
|
|
67391
|
-
* (`custom-model-registry.importModelBundle`) → canary on
|
|
67385
|
+
* (`custom-model-registry.importModelBundle`) → canary on accelerators →
|
|
67392
67386
|
* rollback. Nothing is ever registered automatically.
|
|
67393
67387
|
*
|
|
67394
67388
|
* Plan/start takes a live {@link TrainingCorpusSelection} (collections +
|
|
@@ -67525,20 +67519,24 @@ var TrainingProgressPointSchema = object({
|
|
|
67525
67519
|
map50: number().nullable(),
|
|
67526
67520
|
map50_95: number().nullable()
|
|
67527
67521
|
});
|
|
67522
|
+
/** One accelerator: a `(node, inference device)` that runs the root detector. */
|
|
67523
|
+
var TrainingAcceleratorRefSchema = object({
|
|
67524
|
+
nodeId: string(),
|
|
67525
|
+
deviceKey: string()
|
|
67526
|
+
});
|
|
67527
|
+
/**
|
|
67528
|
+
* A canary pins the registered model on chosen ACCELERATORS — a model is
|
|
67529
|
+
* chosen by the accelerator that runs it (D927); every camera balanced onto
|
|
67530
|
+
* one runs it. `previous` is the root-detector pin each one had (`null` = it
|
|
67531
|
+
* ran its default), exactly, so rollback restores it.
|
|
67532
|
+
*/
|
|
67528
67533
|
var TrainingCanarySchema = object({
|
|
67529
|
-
|
|
67534
|
+
accelerators: array(TrainingAcceleratorRefSchema).readonly(),
|
|
67530
67535
|
since: number(),
|
|
67531
|
-
|
|
67532
|
-
previous: array(object({
|
|
67533
|
-
deviceId: number().int(),
|
|
67534
|
-
nodeId: string(),
|
|
67535
|
-
deviceKey: string(),
|
|
67536
|
-
patch: object({
|
|
67537
|
-
modelId: string().optional(),
|
|
67538
|
-
settings: record(string(), unknown()).readonly().optional()
|
|
67539
|
-
}).nullable()
|
|
67540
|
-
})).readonly()
|
|
67536
|
+
previous: array(TrainingAcceleratorRefSchema.extend({ modelId: string().nullable() })).readonly()
|
|
67541
67537
|
});
|
|
67538
|
+
/** An accelerator a canary may pin: it runs the root detector, on this model now. */
|
|
67539
|
+
var TrainingCanaryTargetSchema = TrainingAcceleratorRefSchema.extend({ pinnedModelId: string().nullable() });
|
|
67542
67540
|
var TrainingJobSchema = object({
|
|
67543
67541
|
id: string(),
|
|
67544
67542
|
idempotencyKey: string(),
|
|
@@ -67650,11 +67648,11 @@ method(object({}), array(TrainingBaseModelSchema).readonly(), { auth: "admin" })
|
|
|
67650
67648
|
kind: "mutation",
|
|
67651
67649
|
auth: "admin",
|
|
67652
67650
|
timeoutMs: 12e4
|
|
67653
|
-
}), method(IdInput, TrainingResultSchema.nullable(), { auth: "admin" }), method(IdInput.extend({
|
|
67651
|
+
}), method(IdInput, TrainingResultSchema.nullable(), { auth: "admin" }), method(_void(), array(TrainingCanaryTargetSchema).readonly(), { auth: "admin" }), method(IdInput.extend({ canaryAccelerators: array(TrainingAcceleratorRefSchema).readonly() }), TrainingJobSchema, {
|
|
67654
67652
|
kind: "mutation",
|
|
67655
67653
|
auth: "admin",
|
|
67656
67654
|
timeoutMs: 30 * 6e4
|
|
67657
|
-
}), method(IdInput.extend({
|
|
67655
|
+
}), method(IdInput.extend({ accelerators: array(TrainingAcceleratorRefSchema).min(1).readonly() }), TrainingJobSchema, {
|
|
67658
67656
|
kind: "mutation",
|
|
67659
67657
|
auth: "admin",
|
|
67660
67658
|
timeoutMs: 12e4
|
|
@@ -73643,20 +73641,6 @@ Object.freeze({
|
|
|
73643
73641
|
access: "create",
|
|
73644
73642
|
role: "admin"
|
|
73645
73643
|
},
|
|
73646
|
-
"pipelineExecutor.clearDeviceOverrides": {
|
|
73647
|
-
capName: "pipeline-executor",
|
|
73648
|
-
capScope: "system",
|
|
73649
|
-
addonId: null,
|
|
73650
|
-
access: "delete",
|
|
73651
|
-
role: "admin"
|
|
73652
|
-
},
|
|
73653
|
-
"pipelineExecutor.clearModelBoundDeviceOverrides": {
|
|
73654
|
-
capName: "pipeline-executor",
|
|
73655
|
-
capScope: "system",
|
|
73656
|
-
addonId: null,
|
|
73657
|
-
access: "delete",
|
|
73658
|
-
role: "admin"
|
|
73659
|
-
},
|
|
73660
73644
|
"pipelineExecutor.deleteModel": {
|
|
73661
73645
|
capName: "pipeline-executor",
|
|
73662
73646
|
capScope: "system",
|
|
@@ -73699,13 +73683,6 @@ Object.freeze({
|
|
|
73699
73683
|
access: "view",
|
|
73700
73684
|
role: "admin"
|
|
73701
73685
|
},
|
|
73702
|
-
"pipelineExecutor.getDefaultSteps": {
|
|
73703
|
-
capName: "pipeline-executor",
|
|
73704
|
-
capScope: "system",
|
|
73705
|
-
addonId: null,
|
|
73706
|
-
access: "view",
|
|
73707
|
-
role: "admin"
|
|
73708
|
-
},
|
|
73709
73686
|
"pipelineExecutor.getDetectionConfigSchema": {
|
|
73710
73687
|
capName: "pipeline-executor",
|
|
73711
73688
|
capScope: "system",
|
|
@@ -73727,20 +73704,6 @@ Object.freeze({
|
|
|
73727
73704
|
access: "view",
|
|
73728
73705
|
role: "admin"
|
|
73729
73706
|
},
|
|
73730
|
-
"pipelineExecutor.getGlobalPipelineConfig": {
|
|
73731
|
-
capName: "pipeline-executor",
|
|
73732
|
-
capScope: "system",
|
|
73733
|
-
addonId: null,
|
|
73734
|
-
access: "view",
|
|
73735
|
-
role: "admin"
|
|
73736
|
-
},
|
|
73737
|
-
"pipelineExecutor.getGlobalSteps": {
|
|
73738
|
-
capName: "pipeline-executor",
|
|
73739
|
-
capScope: "system",
|
|
73740
|
-
addonId: null,
|
|
73741
|
-
access: "view",
|
|
73742
|
-
role: "admin"
|
|
73743
|
-
},
|
|
73744
73707
|
"pipelineExecutor.getInferenceDeviceHealth": {
|
|
73745
73708
|
capName: "pipeline-executor",
|
|
73746
73709
|
capScope: "system",
|
|
@@ -74000,13 +73963,6 @@ Object.freeze({
|
|
|
74000
73963
|
access: "view",
|
|
74001
73964
|
role: "admin"
|
|
74002
73965
|
},
|
|
74003
|
-
"pipelineOrchestrator.getCameraStepOverrides": {
|
|
74004
|
-
capName: "pipeline-orchestrator",
|
|
74005
|
-
capScope: "system",
|
|
74006
|
-
addonId: null,
|
|
74007
|
-
access: "view",
|
|
74008
|
-
role: "admin"
|
|
74009
|
-
},
|
|
74010
73966
|
"pipelineOrchestrator.getCameraSwitches": {
|
|
74011
73967
|
capName: "pipeline-orchestrator",
|
|
74012
73968
|
capScope: "system",
|
|
@@ -74245,13 +74201,6 @@ Object.freeze({
|
|
|
74245
74201
|
access: "create",
|
|
74246
74202
|
role: "admin"
|
|
74247
74203
|
},
|
|
74248
|
-
"pipelineOrchestrator.setCameraPipelineForAgent": {
|
|
74249
|
-
capName: "pipeline-orchestrator",
|
|
74250
|
-
capScope: "system",
|
|
74251
|
-
addonId: null,
|
|
74252
|
-
access: "create",
|
|
74253
|
-
role: "admin"
|
|
74254
|
-
},
|
|
74255
74204
|
"pipelineOrchestrator.setCameraSensors": {
|
|
74256
74205
|
capName: "pipeline-orchestrator",
|
|
74257
74206
|
capScope: "system",
|
|
@@ -74259,42 +74208,42 @@ Object.freeze({
|
|
|
74259
74208
|
access: "create",
|
|
74260
74209
|
role: "admin"
|
|
74261
74210
|
},
|
|
74262
|
-
"pipelineOrchestrator.
|
|
74211
|
+
"pipelineOrchestrator.setCameraStepSettings": {
|
|
74263
74212
|
capName: "pipeline-orchestrator",
|
|
74264
74213
|
capScope: "system",
|
|
74265
74214
|
addonId: null,
|
|
74266
74215
|
access: "create",
|
|
74267
74216
|
role: "admin"
|
|
74268
74217
|
},
|
|
74269
|
-
"pipelineOrchestrator.
|
|
74218
|
+
"pipelineOrchestrator.setCameraStepToggle": {
|
|
74270
74219
|
capName: "pipeline-orchestrator",
|
|
74271
74220
|
capScope: "system",
|
|
74272
74221
|
addonId: null,
|
|
74273
74222
|
access: "create",
|
|
74274
74223
|
role: "admin"
|
|
74275
74224
|
},
|
|
74276
|
-
"pipelineOrchestrator.
|
|
74225
|
+
"pipelineOrchestrator.setCameraSwitch": {
|
|
74277
74226
|
capName: "pipeline-orchestrator",
|
|
74278
74227
|
capScope: "system",
|
|
74279
74228
|
addonId: null,
|
|
74280
74229
|
access: "create",
|
|
74281
74230
|
role: "admin"
|
|
74282
74231
|
},
|
|
74283
|
-
"pipelineOrchestrator.
|
|
74232
|
+
"pipelineOrchestrator.setCapabilityBinding": {
|
|
74284
74233
|
capName: "pipeline-orchestrator",
|
|
74285
74234
|
capScope: "system",
|
|
74286
74235
|
addonId: null,
|
|
74287
74236
|
access: "create",
|
|
74288
74237
|
role: "admin"
|
|
74289
74238
|
},
|
|
74290
|
-
"pipelineOrchestrator.
|
|
74239
|
+
"pipelineOrchestrator.setLoadBalancingShares": {
|
|
74291
74240
|
capName: "pipeline-orchestrator",
|
|
74292
74241
|
capScope: "system",
|
|
74293
74242
|
addonId: null,
|
|
74294
74243
|
access: "create",
|
|
74295
74244
|
role: "admin"
|
|
74296
74245
|
},
|
|
74297
|
-
"pipelineOrchestrator.
|
|
74246
|
+
"pipelineOrchestrator.setNodeStepSettings": {
|
|
74298
74247
|
capName: "pipeline-orchestrator",
|
|
74299
74248
|
capScope: "system",
|
|
74300
74249
|
addonId: null,
|
|
@@ -76653,6 +76602,13 @@ Object.freeze({
|
|
|
76653
76602
|
access: "view",
|
|
76654
76603
|
role: "admin"
|
|
76655
76604
|
},
|
|
76605
|
+
"training.listCanaryTargets": {
|
|
76606
|
+
capName: "training",
|
|
76607
|
+
capScope: "system",
|
|
76608
|
+
addonId: null,
|
|
76609
|
+
access: "view",
|
|
76610
|
+
role: "admin"
|
|
76611
|
+
},
|
|
76656
76612
|
"training.listJobs": {
|
|
76657
76613
|
capName: "training",
|
|
76658
76614
|
capScope: "system",
|
|
@@ -83039,11 +82995,6 @@ Object.freeze({
|
|
|
83039
82995
|
form: "single",
|
|
83040
82996
|
optional: false
|
|
83041
82997
|
}],
|
|
83042
|
-
"pipelineExecutor.clearModelBoundDeviceOverrides": [{
|
|
83043
|
-
name: "deviceIds",
|
|
83044
|
-
form: "array",
|
|
83045
|
-
optional: true
|
|
83046
|
-
}],
|
|
83047
82998
|
"pipelineExecutor.runPipeline": [{
|
|
83048
82999
|
name: "deviceId",
|
|
83049
83000
|
form: "single",
|
|
@@ -83099,11 +83050,6 @@ Object.freeze({
|
|
|
83099
83050
|
form: "array",
|
|
83100
83051
|
optional: true
|
|
83101
83052
|
}],
|
|
83102
|
-
"pipelineOrchestrator.getCameraStepOverrides": [{
|
|
83103
|
-
name: "deviceId",
|
|
83104
|
-
form: "single",
|
|
83105
|
-
optional: false
|
|
83106
|
-
}],
|
|
83107
83053
|
"pipelineOrchestrator.getCameraSwitches": [{
|
|
83108
83054
|
name: "deviceId",
|
|
83109
83055
|
form: "single",
|
|
@@ -83144,21 +83090,11 @@ Object.freeze({
|
|
|
83144
83090
|
form: "single",
|
|
83145
83091
|
optional: false
|
|
83146
83092
|
}],
|
|
83147
|
-
"pipelineOrchestrator.setCameraPipelineForAgent": [{
|
|
83148
|
-
name: "deviceId",
|
|
83149
|
-
form: "single",
|
|
83150
|
-
optional: false
|
|
83151
|
-
}],
|
|
83152
83093
|
"pipelineOrchestrator.setCameraSensors": [{
|
|
83153
83094
|
name: "deviceId",
|
|
83154
83095
|
form: "single",
|
|
83155
83096
|
optional: false
|
|
83156
83097
|
}],
|
|
83157
|
-
"pipelineOrchestrator.setCameraStepOverride": [{
|
|
83158
|
-
name: "deviceId",
|
|
83159
|
-
form: "single",
|
|
83160
|
-
optional: false
|
|
83161
|
-
}],
|
|
83162
83098
|
"pipelineOrchestrator.setCameraStepSettings": [{
|
|
83163
83099
|
name: "deviceId",
|
|
83164
83100
|
form: "single",
|
|
@@ -83836,11 +83772,6 @@ Object.freeze({
|
|
|
83836
83772
|
form: "single",
|
|
83837
83773
|
optional: false
|
|
83838
83774
|
}],
|
|
83839
|
-
"training.canaryResult": [{
|
|
83840
|
-
name: "deviceIds",
|
|
83841
|
-
form: "array",
|
|
83842
|
-
optional: false
|
|
83843
|
-
}],
|
|
83844
83775
|
"update.getStatus": [{
|
|
83845
83776
|
name: "deviceId",
|
|
83846
83777
|
form: "single",
|
|
@@ -85373,6 +85304,430 @@ function buildBenchStepTree(schema, rootModelId, enabledStepIds) {
|
|
|
85373
85304
|
]
|
|
85374
85305
|
}];
|
|
85375
85306
|
}
|
|
85307
|
+
/** The object-detection step id — the first-level detector both recipes run. */
|
|
85308
|
+
var OBJECT_DETECTION_STEP_ID = "object-detection";
|
|
85309
|
+
/** Motion regions older than this describe a different frame. */
|
|
85310
|
+
var RECOVERY_MOTION_MAX_AGE_MS = 2e3;
|
|
85311
|
+
/** Area of a normalised rectangle, never negative. Shared with the D396 recipe. */
|
|
85312
|
+
function normalizedArea(r) {
|
|
85313
|
+
return Math.max(0, r.w) * Math.max(0, r.h);
|
|
85314
|
+
}
|
|
85315
|
+
var area = normalizedArea;
|
|
85316
|
+
function intersection(a, b) {
|
|
85317
|
+
return Math.max(0, Math.min(a.x + a.w, b.x + b.w) - Math.max(a.x, b.x)) * Math.max(0, Math.min(a.y + a.h, b.y + b.h) - Math.max(a.y, b.y));
|
|
85318
|
+
}
|
|
85319
|
+
/**
|
|
85320
|
+
* Share of `region` not covered by any detection box. The sum of pairwise
|
|
85321
|
+
* intersections over-counts where detections overlap each other, which only
|
|
85322
|
+
* makes the pass MORE conservative; clipped at 1.
|
|
85323
|
+
*/
|
|
85324
|
+
function uncoveredFraction(region, detections) {
|
|
85325
|
+
const regionArea = area(region);
|
|
85326
|
+
if (regionArea <= 0) return 0;
|
|
85327
|
+
let covered = 0;
|
|
85328
|
+
for (const detection of detections) covered += intersection(region, detection);
|
|
85329
|
+
return 1 - Math.min(1, covered / regionArea);
|
|
85330
|
+
}
|
|
85331
|
+
/**
|
|
85332
|
+
* THE square-placement rule of this pass — one owner, shared by both recipes.
|
|
85333
|
+
*
|
|
85334
|
+
* A crop is a square of `side` native pixels centred where it can be and slid
|
|
85335
|
+
* inside the frame where it cannot. Both region rules place their squares
|
|
85336
|
+
* through this function so a crop means the same rectangle whichever rule
|
|
85337
|
+
* chose the region.
|
|
85338
|
+
*/
|
|
85339
|
+
function squareAround(centreX, centreY, side, native) {
|
|
85340
|
+
return {
|
|
85341
|
+
left: Math.round(Math.max(0, Math.min(native.width - side, centreX - side / 2))),
|
|
85342
|
+
top: Math.round(Math.max(0, Math.min(native.height - side, centreY - side / 2))),
|
|
85343
|
+
side
|
|
85344
|
+
};
|
|
85345
|
+
}
|
|
85346
|
+
function contains(crop, x, y) {
|
|
85347
|
+
return x >= crop.left && x <= crop.left + crop.side && y >= crop.top && y <= crop.top + crop.side;
|
|
85348
|
+
}
|
|
85349
|
+
/**
|
|
85350
|
+
* Squares for one region: one when it fits the largest side, otherwise up to
|
|
85351
|
+
* two tiles along its longer axis (a person-sized blob with something small
|
|
85352
|
+
* at either end). The padded region decides the side, never the frame.
|
|
85353
|
+
*/
|
|
85354
|
+
function cropsForRegion(region, native) {
|
|
85355
|
+
const widthPx = region.w * native.width;
|
|
85356
|
+
const heightPx = region.h * native.height;
|
|
85357
|
+
const longest = Math.max(widthPx, heightPx);
|
|
85358
|
+
const padded = longest * 1.5;
|
|
85359
|
+
const side = Math.round(Math.min(Math.max(padded, 640), 800));
|
|
85360
|
+
const centreX = (region.x + region.w / 2) * native.width;
|
|
85361
|
+
const centreY = (region.y + region.h / 2) * native.height;
|
|
85362
|
+
if (padded <= 800) return [squareAround(centreX, centreY, side, native)];
|
|
85363
|
+
const alongX = widthPx >= heightPx;
|
|
85364
|
+
const quarter = longest / 4;
|
|
85365
|
+
return [squareAround(alongX ? centreX - quarter : centreX, alongX ? centreY : centreY - quarter, side, native), squareAround(alongX ? centreX + quarter : centreX, alongX ? centreY : centreY + quarter, side, native)];
|
|
85366
|
+
}
|
|
85367
|
+
/**
|
|
85368
|
+
* The ONE place the two region gates are decided. `planRecoveryCrops` filters
|
|
85369
|
+
* on it and {@link countRecoverySkips} counts it, so the report can never
|
|
85370
|
+
* describe a gate the planner does not actually apply.
|
|
85371
|
+
*/
|
|
85372
|
+
function classifyRegion(region, uncovered) {
|
|
85373
|
+
if (area(region) > .25) return "too-large";
|
|
85374
|
+
if (uncovered < .35) return "covered";
|
|
85375
|
+
return "eligible";
|
|
85376
|
+
}
|
|
85377
|
+
/**
|
|
85378
|
+
* WHY A FRAME PLANNED NO CROP, AS A NUMBER (D378).
|
|
85379
|
+
*
|
|
85380
|
+
* The pass report counts the passes that RAN, so "the second pass stops running
|
|
85381
|
+
* when a person is beside the dog" — a plausible reading of
|
|
85382
|
+
* {@link RECOVERY_MAX_REGION_FRAME_FRACTION} and
|
|
85383
|
+
* {@link RECOVERY_MIN_UNCOVERED_FRACTION}, and a live hypothesis on camera 615
|
|
85384
|
+
* — could not be confirmed or killed from the logs at all. This classifies the
|
|
85385
|
+
* regions a frame offered, against the same predicate the planner filters on.
|
|
85386
|
+
*/
|
|
85387
|
+
function countRecoverySkips(input) {
|
|
85388
|
+
let tooLarge = 0;
|
|
85389
|
+
let covered = 0;
|
|
85390
|
+
let eligible = 0;
|
|
85391
|
+
for (const region of input.regions) switch (classifyRegion(region, uncoveredFraction(region, input.detections))) {
|
|
85392
|
+
case "too-large":
|
|
85393
|
+
tooLarge += 1;
|
|
85394
|
+
break;
|
|
85395
|
+
case "covered":
|
|
85396
|
+
covered += 1;
|
|
85397
|
+
break;
|
|
85398
|
+
case "eligible":
|
|
85399
|
+
eligible += 1;
|
|
85400
|
+
break;
|
|
85401
|
+
}
|
|
85402
|
+
return {
|
|
85403
|
+
tooLarge,
|
|
85404
|
+
covered,
|
|
85405
|
+
eligible
|
|
85406
|
+
};
|
|
85407
|
+
}
|
|
85408
|
+
function planRecoveryCrops(input) {
|
|
85409
|
+
const { native } = input;
|
|
85410
|
+
if (Math.min(native.width, native.height) < 640) return [];
|
|
85411
|
+
const ranked = input.regions.map((region) => ({
|
|
85412
|
+
region,
|
|
85413
|
+
uncovered: uncoveredFraction(region, input.detections)
|
|
85414
|
+
})).filter(({ region, uncovered }) => classifyRegion(region, uncovered) === "eligible").toSorted((a, b) => area(b.region) * b.uncovered - area(a.region) * a.uncovered);
|
|
85415
|
+
const planned = [];
|
|
85416
|
+
for (const { region } of ranked) for (const crop of cropsForRegion(region, native)) {
|
|
85417
|
+
if (planned.length >= 2) return planned;
|
|
85418
|
+
const centreX = crop.left + crop.side / 2;
|
|
85419
|
+
const centreY = crop.top + crop.side / 2;
|
|
85420
|
+
if (planned.some((existing) => contains(existing, centreX, centreY))) continue;
|
|
85421
|
+
planned.push(crop);
|
|
85422
|
+
}
|
|
85423
|
+
return planned;
|
|
85424
|
+
}
|
|
85425
|
+
/**
|
|
85426
|
+
* Boxes the executor produced on the crop VIEW → the result's own space.
|
|
85427
|
+
*
|
|
85428
|
+
* Three spaces meet here: the view the model saw (`view`, ≤640 px), the native
|
|
85429
|
+
* square it was cut from (`crop`, native px) and the space the full-frame
|
|
85430
|
+
* result reports in (`result`, native px on the `frameRef` path, the inline
|
|
85431
|
+
* ≤640 view otherwise). A box touching the view edge was clipped by the crop
|
|
85432
|
+
* and is dropped: half a person is not a person, and the tracker would take
|
|
85433
|
+
* the half as the whole.
|
|
85434
|
+
*/
|
|
85435
|
+
function remapCropDetections(detections, crop, view, result, native) {
|
|
85436
|
+
const viewToNative = crop.side / Math.max(1, view.width);
|
|
85437
|
+
const nativeToResultX = result.width / Math.max(1, native.width);
|
|
85438
|
+
const nativeToResultY = result.height / Math.max(1, native.height);
|
|
85439
|
+
const out = [];
|
|
85440
|
+
for (const detection of detections) {
|
|
85441
|
+
const { x, y, width, height } = detection.bbox;
|
|
85442
|
+
if (x <= 2 || y <= 2 || x + width >= view.width - 2 || y + height >= view.height - 2) continue;
|
|
85443
|
+
out.push({
|
|
85444
|
+
...detection,
|
|
85445
|
+
nativeRecovery: {
|
|
85446
|
+
score: detection.score,
|
|
85447
|
+
cropSidePx: crop.side,
|
|
85448
|
+
viewPx: view.width
|
|
85449
|
+
},
|
|
85450
|
+
bbox: {
|
|
85451
|
+
x: (crop.left + x * viewToNative) * nativeToResultX,
|
|
85452
|
+
y: (crop.top + y * viewToNative) * nativeToResultY,
|
|
85453
|
+
width: width * viewToNative * nativeToResultX,
|
|
85454
|
+
height: height * viewToNative * nativeToResultY
|
|
85455
|
+
}
|
|
85456
|
+
});
|
|
85457
|
+
}
|
|
85458
|
+
return out;
|
|
85459
|
+
}
|
|
85460
|
+
function boxIntersection(a, b) {
|
|
85461
|
+
return Math.max(0, Math.min(a.x + a.width, b.x + b.width) - Math.max(a.x, b.x)) * Math.max(0, Math.min(a.y + a.height, b.y + b.height) - Math.max(a.y, b.y));
|
|
85462
|
+
}
|
|
85463
|
+
function sameSubject(recovered, existing) {
|
|
85464
|
+
const inter = boxIntersection(recovered, existing);
|
|
85465
|
+
if (inter <= 0) return false;
|
|
85466
|
+
const areaR = recovered.width * recovered.height;
|
|
85467
|
+
const union = areaR + existing.width * existing.height - inter;
|
|
85468
|
+
if (union > 0 && inter / union >= .5) return true;
|
|
85469
|
+
return areaR > 0 && inter / areaR >= .7;
|
|
85470
|
+
}
|
|
85471
|
+
/**
|
|
85472
|
+
* Class-aware NMS of the recovered boxes against the full-frame ones. Every
|
|
85473
|
+
* full-frame box is kept as it is — the second pass only ADDS. A recovered box
|
|
85474
|
+
* is added when no full-frame box of the same macro class is the same subject
|
|
85475
|
+
* (`RECOVERY_FUSE_IOU`) or contains it (`RECOVERY_FUSE_CONTAINMENT`). Ids are
|
|
85476
|
+
* re-minted so a crop's `d0` cannot collide with the frame's.
|
|
85477
|
+
*/
|
|
85478
|
+
function fuseRecoveredDetections(full, recovered) {
|
|
85479
|
+
const accepted = [];
|
|
85480
|
+
for (const [index, candidate] of recovered.entries()) {
|
|
85481
|
+
if ([...full, ...accepted].some((existing) => existing.macroClass === candidate.macroClass && sameSubject(candidate.bbox, existing.bbox))) continue;
|
|
85482
|
+
accepted.push({
|
|
85483
|
+
...candidate,
|
|
85484
|
+
id: `recovered-${index}-${candidate.id}`
|
|
85485
|
+
});
|
|
85486
|
+
}
|
|
85487
|
+
return [...full, ...accepted];
|
|
85488
|
+
}
|
|
85489
|
+
/**
|
|
85490
|
+
* The step the second pass runs: the enabled first-level object detector of
|
|
85491
|
+
* the camera's own tree, with its own model and no children. Same model as
|
|
85492
|
+
* the full pass so a recovered box is comparable to a full-frame one.
|
|
85493
|
+
*/
|
|
85494
|
+
function selectRecoveryStep(steps) {
|
|
85495
|
+
const detector = steps.find((step) => step.addonId === "object-detection" && step.enabled !== false);
|
|
85496
|
+
if (!detector) return null;
|
|
85497
|
+
return {
|
|
85498
|
+
addonId: detector.addonId,
|
|
85499
|
+
...detector.modelId !== void 0 ? { modelId: detector.modelId } : {},
|
|
85500
|
+
enabled: true
|
|
85501
|
+
};
|
|
85502
|
+
}
|
|
85503
|
+
/**
|
|
85504
|
+
* Read the opt-in. Anything that is not the boolean `true` is the shipped
|
|
85505
|
+
* rule: a stored string or a number is a mis-write (this repo has shipped a
|
|
85506
|
+
* setting written into the wrong sqlite table before), and a mis-write must
|
|
85507
|
+
* not silently change what a camera detects on.
|
|
85508
|
+
*/
|
|
85509
|
+
function readRecoveryRecipe(settings) {
|
|
85510
|
+
return settings?.["motionCropDispatch"] === true ? "motion-crop" : "uncovered-region";
|
|
85511
|
+
}
|
|
85512
|
+
/**
|
|
85513
|
+
* The recipe this camera's resolved step tree selects.
|
|
85514
|
+
*
|
|
85515
|
+
* Reads the ENABLED first-level detector's own settings, which is where
|
|
85516
|
+
* `pipelineOrchestrator.setCameraStepSettings` writes a per-camera value. A
|
|
85517
|
+
* tree with no enabled detector runs no second pass at all, so the answer
|
|
85518
|
+
* there is the shipped rule and it is never used.
|
|
85519
|
+
*/
|
|
85520
|
+
function readRecoveryRecipeForSteps(steps) {
|
|
85521
|
+
return readRecoveryRecipe(steps.find((step) => step.addonId === "object-detection" && step.enabled !== false)?.settings);
|
|
85522
|
+
}
|
|
85523
|
+
/**
|
|
85524
|
+
* A motion box is grown ×1.5 about its centre before anything else.
|
|
85525
|
+
*
|
|
85526
|
+
* The motion step's box is the CHANGED pixels, which on a moving animal is the
|
|
85527
|
+
* leading edge plus its shadow, not the animal. The detector needs the subject
|
|
85528
|
+
* and the context it was trained on.
|
|
85529
|
+
*/
|
|
85530
|
+
var MOTION_CROP_MOTION_PAD = 1.5;
|
|
85531
|
+
/**
|
|
85532
|
+
* An intersecting tracked box is grown ×1.25 — less, because it is already a
|
|
85533
|
+
* subject rectangle rather than a change mask.
|
|
85534
|
+
*/
|
|
85535
|
+
var MOTION_CROP_TRACKED_PAD = 1.25;
|
|
85536
|
+
/**
|
|
85537
|
+
* The floor a `person` or `vehicle` box must clear when it came out of a CROP
|
|
85538
|
+
* rather than out of the full frame.
|
|
85539
|
+
*
|
|
85540
|
+
* Collected, not assumed: 3 085 quiet frames produced 27 motion-positive
|
|
85541
|
+
* frames and 28 crop invocations. The full-frame arm produced 0 boxes above
|
|
85542
|
+
* any gate; the crop arm produced 3, of which two are genuine false positives,
|
|
85543
|
+
* and both are night-IR corners upscaled into a 320 model — `vehicle 0.749`
|
|
85544
|
+
* and `person 0.701`. Zero false `animal` at any gate, which is why `animal`
|
|
85545
|
+
* is deliberately absent from this table: the class the pass exists to recover
|
|
85546
|
+
* is the class that never produced a false positive, and gating it would cost
|
|
85547
|
+
* the whole measured gain.
|
|
85548
|
+
*
|
|
85549
|
+
* This is a CROP-ONLY floor, applied on top of the per-macro floors the
|
|
85550
|
+
* executor already enforced. A full-frame `person` at 0.70 is untouched — the
|
|
85551
|
+
* full-frame arm is the one arm with ground truth behind its floor
|
|
85552
|
+
* (`minConfidencePerson` 0.65, raised on 2026-07-30 from a measured
|
|
85553
|
+
* distribution).
|
|
85554
|
+
*
|
|
85555
|
+
* The cost of this floor is stated rather than assumed away: it can also
|
|
85556
|
+
* remove a real distant person or vehicle recovered from a crop at 0.70–0.80.
|
|
85557
|
+
* Nothing in the quiet-footage sample measures that, so the floor is a
|
|
85558
|
+
* constant here rather than a slider, and the runner reports every drop it
|
|
85559
|
+
* makes per camera.
|
|
85560
|
+
*/
|
|
85561
|
+
var CROP_CLASS_FLOORS = Object.freeze({
|
|
85562
|
+
person: .8,
|
|
85563
|
+
vehicle: .8
|
|
85564
|
+
});
|
|
85565
|
+
/**
|
|
85566
|
+
* Apply the crop-only class floors, REPORTING every drop.
|
|
85567
|
+
*
|
|
85568
|
+
* A class with no entry in {@link CROP_CLASS_FLOORS} is kept: a floor this
|
|
85569
|
+
* table cannot express is not a floor of zero, and silently dropping a class
|
|
85570
|
+
* nobody measured is the exact shape of silent drop this repo has paid for
|
|
85571
|
+
* three separate times.
|
|
85572
|
+
*/
|
|
85573
|
+
function applyCropClassFloors(detections) {
|
|
85574
|
+
const kept = [];
|
|
85575
|
+
const dropped = [];
|
|
85576
|
+
for (const detection of detections) {
|
|
85577
|
+
const floor = CROP_CLASS_FLOORS[detection.macroClass];
|
|
85578
|
+
if (floor !== void 0 && detection.score < floor) {
|
|
85579
|
+
dropped.push({
|
|
85580
|
+
macroClass: detection.macroClass,
|
|
85581
|
+
score: detection.score,
|
|
85582
|
+
floor
|
|
85583
|
+
});
|
|
85584
|
+
continue;
|
|
85585
|
+
}
|
|
85586
|
+
kept.push(detection);
|
|
85587
|
+
}
|
|
85588
|
+
return {
|
|
85589
|
+
kept,
|
|
85590
|
+
dropped
|
|
85591
|
+
};
|
|
85592
|
+
}
|
|
85593
|
+
function scaleAbout(rect, factor) {
|
|
85594
|
+
const w = rect.w * factor;
|
|
85595
|
+
const h = rect.h * factor;
|
|
85596
|
+
return {
|
|
85597
|
+
x: rect.x + rect.w / 2 - w / 2,
|
|
85598
|
+
y: rect.y + rect.h / 2 - h / 2,
|
|
85599
|
+
w,
|
|
85600
|
+
h
|
|
85601
|
+
};
|
|
85602
|
+
}
|
|
85603
|
+
function overlaps(a, b) {
|
|
85604
|
+
return Math.min(a.x + a.w, b.x + b.w) > Math.max(a.x, b.x) && Math.min(a.y + a.h, b.y + b.h) > Math.max(a.y, b.y);
|
|
85605
|
+
}
|
|
85606
|
+
function union(a, b) {
|
|
85607
|
+
const x = Math.min(a.x, b.x);
|
|
85608
|
+
const y = Math.min(a.y, b.y);
|
|
85609
|
+
return {
|
|
85610
|
+
x,
|
|
85611
|
+
y,
|
|
85612
|
+
w: Math.max(a.x + a.w, b.x + b.w) - x,
|
|
85613
|
+
h: Math.max(a.y + a.h, b.y + b.h) - y
|
|
85614
|
+
};
|
|
85615
|
+
}
|
|
85616
|
+
function clampToFrame(rect) {
|
|
85617
|
+
const x = Math.max(0, rect.x);
|
|
85618
|
+
const y = Math.max(0, rect.y);
|
|
85619
|
+
return {
|
|
85620
|
+
x,
|
|
85621
|
+
y,
|
|
85622
|
+
w: Math.min(1, rect.x + rect.w) - x,
|
|
85623
|
+
h: Math.min(1, rect.y + rect.h) - y
|
|
85624
|
+
};
|
|
85625
|
+
}
|
|
85626
|
+
/**
|
|
85627
|
+
* Merge transitively every seed whose padded box overlaps another, and answer
|
|
85628
|
+
* the union rectangles.
|
|
85629
|
+
*
|
|
85630
|
+
* Transitive on purpose: a person, the dog beside them and the dog's shadow
|
|
85631
|
+
* are three components of one subject, and cutting three crops for them spends
|
|
85632
|
+
* two inferences on pixels the first one already showed the detector.
|
|
85633
|
+
*/
|
|
85634
|
+
function mergeSeeds(seeds) {
|
|
85635
|
+
const merged = [];
|
|
85636
|
+
for (const seed of seeds) {
|
|
85637
|
+
let current = seed;
|
|
85638
|
+
let changed = true;
|
|
85639
|
+
while (changed) {
|
|
85640
|
+
changed = false;
|
|
85641
|
+
for (let i = merged.length - 1; i >= 0; i -= 1) {
|
|
85642
|
+
const other = merged[i];
|
|
85643
|
+
if (other === void 0 || !overlaps(current, other)) continue;
|
|
85644
|
+
current = union(current, other);
|
|
85645
|
+
merged.splice(i, 1);
|
|
85646
|
+
changed = true;
|
|
85647
|
+
}
|
|
85648
|
+
}
|
|
85649
|
+
merged.push(current);
|
|
85650
|
+
}
|
|
85651
|
+
return merged;
|
|
85652
|
+
}
|
|
85653
|
+
/**
|
|
85654
|
+
* The regions the measured recipe judges this frame on.
|
|
85655
|
+
*
|
|
85656
|
+
* Motion boxes padded {@link MOTION_CROP_MOTION_PAD}; every full-frame box
|
|
85657
|
+
* that intersects a RAW motion box padded {@link MOTION_CROP_TRACKED_PAD} and
|
|
85658
|
+
* added as a seed of its own; everything that overlaps merged; the result
|
|
85659
|
+
* clamped to the frame, ordered largest first and capped at
|
|
85660
|
+
* {@link MOTION_CROP_MAX_REGIONS}.
|
|
85661
|
+
*
|
|
85662
|
+
* There is deliberately no coverage gate and no size gate here. Those belong
|
|
85663
|
+
* to the shipped rule, and they are what makes it a rule about a subject
|
|
85664
|
+
* BESIDE a detected one; the measurement says the pass is worth running on the
|
|
85665
|
+
* detected subject's own region too.
|
|
85666
|
+
*/
|
|
85667
|
+
function planMotionCropRegions(input) {
|
|
85668
|
+
if (input.regions.length === 0) return [];
|
|
85669
|
+
const seeds = input.regions.map((r) => scaleAbout(r, MOTION_CROP_MOTION_PAD));
|
|
85670
|
+
for (const detection of input.detections) {
|
|
85671
|
+
if (!input.regions.some((region) => overlaps(detection, region))) continue;
|
|
85672
|
+
seeds.push(scaleAbout(detection, MOTION_CROP_TRACKED_PAD));
|
|
85673
|
+
}
|
|
85674
|
+
return mergeSeeds(seeds).map(clampToFrame).filter((r) => r.w > 0 && r.h > 0).toSorted((a, b) => normalizedArea(b) - normalizedArea(a)).slice(0, 3);
|
|
85675
|
+
}
|
|
85676
|
+
/**
|
|
85677
|
+
* The square the detector is fed for one measured region.
|
|
85678
|
+
*
|
|
85679
|
+
* "Grow to the detector's input aspect ratio without ever shrinking" is a
|
|
85680
|
+
* SQUARE here, and that is a fact about the production detector rather than a
|
|
85681
|
+
* simplification: `yolov9m-320-int8` takes 320×320, as does every hardware
|
|
85682
|
+
* default in the catalog.
|
|
85683
|
+
*
|
|
85684
|
+
* The side is the region's longer side, floored at
|
|
85685
|
+
* {@link RECOVERY_CROP_MIN_SIDE_PX} — the growth is what magnifies the subject
|
|
85686
|
+
* — and ceilinged at {@link RECOVERY_CROP_MAX_SIDE_PX}. The ceiling is NOT a
|
|
85687
|
+
* simplification either: at 1024 px the same 320 model scored the reference
|
|
85688
|
+
* dog 0.52–0.76, and at 1280 px lost it entirely
|
|
85689
|
+
* (`docs/benchmarks/pipeline-frame-model-eval.md`, case `miss-dog-615`). A
|
|
85690
|
+
* region longer than the ceiling is TILED along its longer axis, never zoomed
|
|
85691
|
+
* out.
|
|
85692
|
+
*/
|
|
85693
|
+
function motionCropsForRegion(region, native) {
|
|
85694
|
+
const widthPx = region.w * native.width;
|
|
85695
|
+
const heightPx = region.h * native.height;
|
|
85696
|
+
const longest = Math.max(widthPx, heightPx);
|
|
85697
|
+
const side = Math.round(Math.min(Math.max(longest, 640), 800));
|
|
85698
|
+
const centreX = (region.x + region.w / 2) * native.width;
|
|
85699
|
+
const centreY = (region.y + region.h / 2) * native.height;
|
|
85700
|
+
if (longest <= 800) return [squareAround(centreX, centreY, side, native)];
|
|
85701
|
+
const alongX = widthPx >= heightPx;
|
|
85702
|
+
const quarter = longest / 4;
|
|
85703
|
+
return [squareAround(alongX ? centreX - quarter : centreX, alongX ? centreY : centreY - quarter, side, native), squareAround(alongX ? centreX + quarter : centreX, alongX ? centreY : centreY + quarter, side, native)];
|
|
85704
|
+
}
|
|
85705
|
+
/** `true` when `inner` lies entirely inside `outer`. */
|
|
85706
|
+
function cropContains(outer, inner) {
|
|
85707
|
+
return inner.left >= outer.left && inner.top >= outer.top && inner.left + inner.side <= outer.left + outer.side && inner.top + inner.side <= outer.top + outer.side;
|
|
85708
|
+
}
|
|
85709
|
+
/**
|
|
85710
|
+
* The crops the measured recipe runs on this frame.
|
|
85711
|
+
*
|
|
85712
|
+
* Dedupe is by CONTAINMENT only. Two squares that merely overlap both run: the
|
|
85713
|
+
* pixels the second adds are pixels no other crop shows the detector, and the
|
|
85714
|
+
* fusion step downstream already refuses a duplicate BOX. Dropping a crop
|
|
85715
|
+
* because it overlapped would drop the subject sitting at its edge, which is
|
|
85716
|
+
* the whole population this pass exists for.
|
|
85717
|
+
*
|
|
85718
|
+
* A frame that cannot hold the smallest crop yields nothing: it is already
|
|
85719
|
+
* seen at scale.
|
|
85720
|
+
*/
|
|
85721
|
+
function planMotionCrops(input) {
|
|
85722
|
+
const { native } = input;
|
|
85723
|
+
if (Math.min(native.width, native.height) < 640) return [];
|
|
85724
|
+
const planned = [];
|
|
85725
|
+
for (const region of planMotionCropRegions(input)) for (const crop of motionCropsForRegion(region, native)) {
|
|
85726
|
+
if (planned.some((existing) => cropContains(existing, crop))) continue;
|
|
85727
|
+
planned.push(crop);
|
|
85728
|
+
}
|
|
85729
|
+
return planned;
|
|
85730
|
+
}
|
|
85376
85731
|
/** Side of the square, as a multiple of the face box's longer side. */
|
|
85377
85732
|
var ROOT_FACE_REFINE_SCALE = 1.6;
|
|
85378
85733
|
/**
|
|
@@ -86664,4 +87019,4 @@ function armRemovalReconcile(opts) {
|
|
|
86664
87019
|
return () => clearInterval(timer);
|
|
86665
87020
|
}
|
|
86666
87021
|
//#endregion
|
|
86667
|
-
export {
|
|
87022
|
+
export { applyModelBoundSettings as $, defineCustomActions as $n, parseProcStatus as $t, NativeLeaseAdmissionSchema as A, stripRetiredBandPreBufferSec as An, evictionPolicyForMode as At, RECORDING_SOURCE_CAMSTACK as B, isSoftwareDecode as Bn, isFirstLevelMacroClass as Bt, EVENT_PAD_MS as C, runtimeDevices as Cn, record as Cr, dominantClipLabels as Ct, G711_SCALE_CORRECTION_DB as D, storageEvictableCapability as Dn, enumerateInferenceDevices as Dt, FailureCounters as E, stepModelRunsOnFormat as En, EventCategory as Er, egressTransportFromRequest as Et, PIPELINE_RAMP as F, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as Fn, fuseRecoveredDetections as Ft, RecordingSignalStatusSchema as G, BaseAddon as Gn, mapAudioLabelToMacro as Gt, RECOVERY_MOTION_MAX_AGE_MS as H, DeviceType as Hn, linkedStepOf as Ht, PoolMemoryWatchdog as I, Fmp4BoxSplitter as In, gbToBytes as It, VISIT_MERGE_GAP_MS as J, HF_REPO as Jn, memoizePinnedFfmpeg as Jt, RingBuffer as K, CAM_PROFILE_ORDER as Kn, mayReadLocation as Kt, RATE_CONTROL_RELAXED as L, buildFfmpegArgs as Ln, gifDeriveSpeed as Lt, NodeBenchRunnerInputSchema as M, videoclipsCapability as Mn, exportSubjectOf as Mt, OBJECT_DETECTION_STEP_ID as N, webrtcSessionCapability as Nn, failureContributionCapability as Nt, LABEL_SUPPLY_MACRO as O, storageOccupancyCapability as On, evaluateZoneRules as Ot, OpsLogEntrySchema as P, AUDIO_PRESETS as Pn, ffmpegRate as Pt, applyCropClassFloors as Q, customAction as Qn, overlayClusterStepSettings as Qt, RATE_CONTROL_TIGHT as R, evaluateSensorEdge as Rn, gifFromMp4Args as Rt, EVENT_OWNER_TYPES as S, rootSuppliesOf as Sn, preprocess as Sr, deviceRemovalHookCapability as St, ExportRecordSchema as T, startMoverUnderClearance as Tn, union$1 as Tr, egressTranscodeSharingKey as Tt, ROOT_SUPPLIABLE_STEP_IDS as U, errMsg as Un, loadContributionCapability as Ut, RECORDING_SOURCE_CAMSTACK_ADDON as V, DeviceFeature as Vn, linkedLabelStepId as Vt, RecordingConfigSchema as W, BOOT_RECOVERY_BACKOFF_MS as Wn, logChannelsCapability as Wt, addonWidgetsSourceCapability as X, audioChunkBytesPerSample as Xn, modeMayWrite as Xt, YAMNET_TO_MACRO as Y, MODEL_FORMATS as Yn, migrateLegacyDeviceSignalConfig as Yt, allowedSuppliedEffect as Z, createEvent as Zn, motionDetectionCapability as Zt, DEFAULT_DETAIL_CROP_CONVENTION as _, resolveLocationMode as _n, discriminatedUnion as _r, deriveBatteryPresence as _t, BackgroundRunRegistry as a, planMotionCrops as an, isSecretMarker as ar, buildBenchStepTree as at, DEVICE_BACKEND_TO_FORMAT as b, resolveRecordingProfiles as bn, number as br, deriveRootFaceRefineRect as bt, CLIP_STILL_REASON_CODE_HEADER as c, readRecoveryRecipeForSteps as cn, maskUrlCredentials as cr, clipExportFailure as ct, CLUSTER_MODEL_SCOPED_STEPS as d, recordingExportCapability as dn, selectAssignedProfileSlots as dr, containingParentIndex as dt, pickClusterStepSettings as en, defineRecordKinds as er, armRemovalReconcile as et, COCO_80_LABELS as f, recordingSignalCapability as fn, sleep as fr, countRecoverySkips as ft, DEFAULT_CLUSTER_STEP_SETTINGS as g, resolveEgressDecodeHwAccel as gn, boolean as gr, defaultDeviceFor as gt, DEFAULT_AUDIO_ANALYZER_CONFIG as h, resolveCreateExportSubject as hn, array as hr, declareLogChannel as ht, AUDIO_MACRO_LABELS as i, pipelineRunnerCapability as in, isEvent as ir, batteryCapability as it, NativeLeaseSettingsSchema as j, supportedRuntimes as jn, evictionPolicyOfLocation as jt, LABEL_SUPPLY_VOCABULARIES as k, streamBrokerCapability as kn, eventOverlapsClipWindow as kt, CLIP_STILL_REASON_HEADER as l, recordingArchiveCapability as ln, nodePin as lr, clipExportFailureOf as lt, CROP_SUPPLY_SOURCES as m, resolveClusterStepModelId as mn, _enum as mr, createLogChannelsProvider as mt, APPLE_SA_TO_MACRO as n, pickNativeLeaseOverride as nn, hfModelUrl as nr, audioAnalyzerCapability as nt, BatteryStatusSchema as o, planRecoveryCrops as on, makeProfileBrokerId as or, cameraOwnsMotionViaSensor as ot, COCO_TO_MACRO as p, remapCropDetections as pn, userError as pr, createHwAccelCache as pt, VIDEOCLIPS_MAX_OFFER_BYTES as q, CamProfileSchema as qn, mayWriteToLocation as qt, AUDIO_BACKEND_CHOICES as r, pipelineExecutorCapability as rn, hydrateSchema as rr, audioKindId as rt, CLIP_BROKER_PACED_RATES as s, rankStreams as sn, makeSourceBrokerId as sr, cameraStreamsCapability as st, APPEARANCE_BLOCKS as t, pickDetailCropConvention as tn, expandAudioChunkToF32le as tr, audioAnalysisCapability as tt, CLIP_STREAM_TRANSPORT_HEADER as u, recordingCapability as un, parseProfileBrokerId as ur, collectModelBoundKeys as ut, DEFAULT_EVENTS_BAND_BUFFER_SEC as v, resolveModelBoundSetting as vn, lazy as vr, deriveDetailCropRect as vt, EncodeProfileSchema as w, selectRecoveryStep as wn, string as wr, edgetpuDelegateDevice as wt, DEVICE_RAMP as x, resolveRootSupply as xn, object as xr, detectionPipelineCapability as xt, DEFAULT_NATIVE_LEASE_SETTINGS as y, resolvePoolMemoryPolicy as yn, literal as yr, deriveRecordingMode as yt, RECORDING_EXPORT_MAX_READ_BYTES as z, invocationFromEncodeProfile as zn, inferModelProvider as zt };
|