@camstack/addon-osd-manager 0.1.179 → 0.1.181
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/{MotionZonesSettings-B5aXZahp.mjs → MotionZonesSettings-r-5gadcs.mjs} +2 -2
- package/dist/{PrivacyMaskSettings-CCZyGdiM.mjs → PrivacyMaskSettings-DPJp4rMl.mjs} +4 -4
- package/dist/{SceneMonitorEditor-CzAhKl5N.mjs → SceneMonitorEditor-H5pQrHy7.mjs} +3 -3
- package/dist/_stub.js +4298 -4298
- package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-COWlbxsR.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-C2I-8Qsr.mjs} +3 -3
- package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-CYSzhahm.mjs +26 -0
- package/dist/addon-osd-manager.css +1 -1
- package/dist/{hostInit-Bcrn7TOt.mjs → hostInit-CaDP2Kts.mjs} +2 -2
- package/dist/index.js +468 -28
- package/dist/index.mjs +468 -28
- package/dist/{player-overlays-UBW4zDFH.mjs → player-overlays-CWcXFKuD.mjs} +1 -1
- package/dist/remoteEntry.js +1 -1
- package/dist/{responsive-DXhNKsuH.mjs → responsive-BpY0yafY.mjs} +1 -1
- package/dist/{scene-monitor-copy-C2sIrKPI.mjs → scene-monitor-copy-413cUke-.mjs} +1 -1
- package/dist/{square-BA6S8jxe.mjs → square-CtY8II3Z.mjs} +1 -1
- package/dist/{trash-2-ou0dJwcr.mjs → trash-2-m46kRm2C.mjs} +1 -1
- package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-BnoZzYog.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-7EsNkWO1.mjs} +1 -1
- package/package.json +1 -1
- package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-t6WKuxCf.mjs +0 -26
package/dist/index.js
CHANGED
|
@@ -10614,7 +10614,53 @@ var ModelFormatEntrySchema = object({
|
|
|
10614
10614
|
/** Multi-file payload (directory members or sibling files). */
|
|
10615
10615
|
files: array(string()).readonly().optional(),
|
|
10616
10616
|
/** Runtime(s) that can use this format. If omitted, inferred from ModelFormat key */
|
|
10617
|
-
runtimes: array(_enum(["python"])).readonly().optional()
|
|
10617
|
+
runtimes: array(_enum(["python"])).readonly().optional(),
|
|
10618
|
+
/**
|
|
10619
|
+
* Content revision of the artefact, for one hosted OFF the CamStack mirror.
|
|
10620
|
+
* A format on the mirror leaves it unset: its revision (the sha256 of its
|
|
10621
|
+
* weight file) comes from the downloader's generated table, kept in step
|
|
10622
|
+
* with the mirror by `scripts/check-hosted-model-revisions.ts` (D744). A
|
|
10623
|
+
* node records the revision it downloaded next to the file
|
|
10624
|
+
* (`<file>.revision`); a copy with no record or a different one is stale
|
|
10625
|
+
* unless its weight file hashes to the revision, and a stale copy is
|
|
10626
|
+
* downloaded again, the old one serving until the new one is complete. No
|
|
10627
|
+
* revision at all ⇒ a file on disk is current, whatever it holds (D743).
|
|
10628
|
+
*/
|
|
10629
|
+
revision: string().min(1).optional()
|
|
10630
|
+
});
|
|
10631
|
+
/**
|
|
10632
|
+
* What a node holds for one (model, format) (D746). `current` is a complete
|
|
10633
|
+
* copy at its catalog revision — exactly what `downloaded: true` means.
|
|
10634
|
+
* `stale` is bytes on disk that are not (yet) proven current under D743/D744:
|
|
10635
|
+
* no or a different revision record, or a missing sibling. `missing` is no
|
|
10636
|
+
* copy. `downloaded` alone folds `stale` into "not downloaded", which hid
|
|
10637
|
+
* reclaimable bytes and a copy about to be replaced.
|
|
10638
|
+
*/
|
|
10639
|
+
var ModelOnDiskStateSchema = _enum([
|
|
10640
|
+
"current",
|
|
10641
|
+
"stale",
|
|
10642
|
+
"missing"
|
|
10643
|
+
]);
|
|
10644
|
+
/**
|
|
10645
|
+
* The numeric precision of one format's BUILD (D746) — reported only when the
|
|
10646
|
+
* build states it (file-name token, an INT8 variant, an EdgeTPU compile, a
|
|
10647
|
+
* CamStack Core ML export). Absent means "not stated", never "fp32".
|
|
10648
|
+
*/
|
|
10649
|
+
var ModelFormatPrecisionSchema = _enum([
|
|
10650
|
+
"fp32",
|
|
10651
|
+
"fp16",
|
|
10652
|
+
"int8"
|
|
10653
|
+
]);
|
|
10654
|
+
/**
|
|
10655
|
+
* One format of one model as a node's `pipelineExecutor.getSchema` reports it.
|
|
10656
|
+
* `onDisk` / `precision` are optional for version skew: a runner that predates
|
|
10657
|
+
* them omits them, and a reader falls back to `downloaded`.
|
|
10658
|
+
*/
|
|
10659
|
+
var PipelineModelFormatStatusSchema = object({
|
|
10660
|
+
downloaded: boolean(),
|
|
10661
|
+
sizeMB: number(),
|
|
10662
|
+
onDisk: ModelOnDiskStateSchema.optional(),
|
|
10663
|
+
precision: ModelFormatPrecisionSchema.optional()
|
|
10618
10664
|
});
|
|
10619
10665
|
/**
|
|
10620
10666
|
* Extra file that must be downloaded alongside the model (e.g., labels JSON, dict.txt).
|
|
@@ -27377,7 +27423,7 @@ var FrameRefSchema = object({
|
|
|
27377
27423
|
timestamp: number(),
|
|
27378
27424
|
capturedAt: number().optional()
|
|
27379
27425
|
});
|
|
27380
|
-
var ModelFormatSchema$
|
|
27426
|
+
var ModelFormatSchema$2 = _enum([
|
|
27381
27427
|
"onnx",
|
|
27382
27428
|
"coreml",
|
|
27383
27429
|
"openvino",
|
|
@@ -27395,7 +27441,7 @@ var PipelineSlotSchema = _enum([
|
|
|
27395
27441
|
var PipelineEngineChoiceSchema = object({
|
|
27396
27442
|
runtime: literal("python"),
|
|
27397
27443
|
backend: string(),
|
|
27398
|
-
format: ModelFormatSchema$
|
|
27444
|
+
format: ModelFormatSchema$2,
|
|
27399
27445
|
device: string().optional()
|
|
27400
27446
|
});
|
|
27401
27447
|
/**
|
|
@@ -27452,10 +27498,7 @@ var PipelineTemplateSchema$1 = object({
|
|
|
27452
27498
|
var PipelineModelOptionSchema = object({
|
|
27453
27499
|
id: string(),
|
|
27454
27500
|
name: string(),
|
|
27455
|
-
formats: record(string(),
|
|
27456
|
-
downloaded: boolean(),
|
|
27457
|
-
sizeMB: number()
|
|
27458
|
-
})),
|
|
27501
|
+
formats: record(string(), PipelineModelFormatStatusSchema),
|
|
27459
27502
|
group: ModelVariantGroupSchema.optional(),
|
|
27460
27503
|
legacy: boolean().optional(),
|
|
27461
27504
|
provider: ModelProviderIdSchema.optional(),
|
|
@@ -27670,6 +27713,32 @@ var pipelineExecutorCapability = {
|
|
|
27670
27713
|
auth: "admin"
|
|
27671
27714
|
}),
|
|
27672
27715
|
/**
|
|
27716
|
+
* Best settings (D745): the MODEL-BOUND thresholds (`bindsToModel` keys of
|
|
27717
|
+
* the object-detection root, and their binding keys) stored in THIS node's
|
|
27718
|
+
* per-camera detector settings — and, unless `dryRun`, remove them so the
|
|
27719
|
+
* running model's own defaults apply. Every other key of a camera's store
|
|
27720
|
+
* is kept. `nodeId` is the ROUTING key. `deviceIds` absent ⇒ every camera
|
|
27721
|
+
* with a store. A camera whose store could not be read is `refused`, never
|
|
27722
|
+
* reported as clean.
|
|
27723
|
+
*/
|
|
27724
|
+
clearModelBoundDeviceOverrides: method(object({
|
|
27725
|
+
nodeId: string(),
|
|
27726
|
+
deviceIds: array(number()).readonly().optional(),
|
|
27727
|
+
dryRun: boolean()
|
|
27728
|
+
}), object({
|
|
27729
|
+
entries: array(object({
|
|
27730
|
+
deviceId: number(),
|
|
27731
|
+
keys: array(string()).readonly()
|
|
27732
|
+
})).readonly(),
|
|
27733
|
+
refused: array(object({
|
|
27734
|
+
deviceId: number(),
|
|
27735
|
+
reason: string()
|
|
27736
|
+
})).readonly()
|
|
27737
|
+
}), {
|
|
27738
|
+
kind: "mutation",
|
|
27739
|
+
auth: "admin"
|
|
27740
|
+
}),
|
|
27741
|
+
/**
|
|
27673
27742
|
* Which of THIS node's inference devices the executor currently refuses,
|
|
27674
27743
|
* and why. `nodeId` is the ROUTING key (stripped by the generated router).
|
|
27675
27744
|
*
|
|
@@ -27764,12 +27833,12 @@ var pipelineExecutorCapability = {
|
|
|
27764
27833
|
downloadModel: method(object({
|
|
27765
27834
|
addonId: string(),
|
|
27766
27835
|
modelId: string(),
|
|
27767
|
-
format: ModelFormatSchema$
|
|
27836
|
+
format: ModelFormatSchema$2
|
|
27768
27837
|
}), DownloadModelResultSchema, { kind: "mutation" }),
|
|
27769
27838
|
deleteModel: method(object({
|
|
27770
27839
|
addonId: string(),
|
|
27771
27840
|
modelId: string(),
|
|
27772
|
-
format: ModelFormatSchema$
|
|
27841
|
+
format: ModelFormatSchema$2
|
|
27773
27842
|
}), object({ success: literal(true) }), { kind: "mutation" }),
|
|
27774
27843
|
/**
|
|
27775
27844
|
* Stateless single-frame execution. Callers (runner, benchmark) pass
|
|
@@ -28015,6 +28084,307 @@ var pipelineExecutorCapability = {
|
|
|
28015
28084
|
getDetectionConfigSchema: method(_void(), ConfigUISchemaNullableBridge)
|
|
28016
28085
|
}
|
|
28017
28086
|
};
|
|
28087
|
+
/**
|
|
28088
|
+
* Wire shapes of the Load balancing surface (D748): the session placement
|
|
28089
|
+
* policy, the atomic share write, the observed placement statistics, the
|
|
28090
|
+
* hardware share suggestion and the stale device pins.
|
|
28091
|
+
*/
|
|
28092
|
+
/**
|
|
28093
|
+
* How a new detection session picks its node and device.
|
|
28094
|
+
* - `least-loaded` — the historical rule: lowest `attached / weight`, a
|
|
28095
|
+
* constant node order at a tie (D37). An idle node always ties at 0, so a
|
|
28096
|
+
* weight only bites once a node already holds a session.
|
|
28097
|
+
* - `share` — the share of PARALLEL sessions is held to the weights, and a
|
|
28098
|
+
* full or drowning node yields to a free one (D748).
|
|
28099
|
+
*/
|
|
28100
|
+
var SessionPlacementPolicySchema = _enum(["least-loaded", "share"]);
|
|
28101
|
+
var LoadBalancingSharesInputSchema = object({
|
|
28102
|
+
/** nodeId → share (> 0). A node left out keeps its weight. */
|
|
28103
|
+
nodes: record(string(), number().positive()).default({}),
|
|
28104
|
+
/** nodeId → deviceKey → share (> 0). A device left out keeps its weight. */
|
|
28105
|
+
devices: record(string(), record(string(), number().positive())).default({})
|
|
28106
|
+
});
|
|
28107
|
+
var PlacementStatsInputSchema = object({
|
|
28108
|
+
/** Window the observed shares are averaged over (default 1 h, max 24 h). */
|
|
28109
|
+
windowMs: number().int().min(6e4).max(1440 * 60 * 1e3).default(3600 * 1e3) });
|
|
28110
|
+
var PlacementDeviceStatsSchema = object({
|
|
28111
|
+
deviceKey: string(),
|
|
28112
|
+
/** Sessions running on this device now. */
|
|
28113
|
+
sessionsNow: number(),
|
|
28114
|
+
/** Sessions started on this device inside the window. */
|
|
28115
|
+
sessionsStarted: number(),
|
|
28116
|
+
/** Time-weighted share of the node's parallel sessions over the window (0–1); null = no session ran. */
|
|
28117
|
+
observedShare: number().nullable()
|
|
28118
|
+
});
|
|
28119
|
+
var PlacementNodeStatsSchema = object({
|
|
28120
|
+
nodeId: string(),
|
|
28121
|
+
sessionsNow: number(),
|
|
28122
|
+
sessionsStarted: number(),
|
|
28123
|
+
/** Time-weighted share of the cluster's parallel sessions over the window (0–1); null = none ran. */
|
|
28124
|
+
observedShare: number().nullable(),
|
|
28125
|
+
/** Most sessions this node ran at once inside the window. */
|
|
28126
|
+
peakSessions: number(),
|
|
28127
|
+
/** Sessions a share election handed elsewhere because this node was full or drowning. */
|
|
28128
|
+
yieldsAway: number(),
|
|
28129
|
+
devices: array(PlacementDeviceStatsSchema).readonly()
|
|
28130
|
+
});
|
|
28131
|
+
/** A camera's device pin that the session path cannot honour. */
|
|
28132
|
+
var StaleDevicePinSchema = object({
|
|
28133
|
+
deviceId: number(),
|
|
28134
|
+
deviceKey: string(),
|
|
28135
|
+
/** `disabled` — the key exists on some node but is not enabled anywhere; `absent` — no node has it. */
|
|
28136
|
+
reason: _enum(["disabled", "absent"])
|
|
28137
|
+
});
|
|
28138
|
+
var PlacementStatsSchema = object({
|
|
28139
|
+
policy: SessionPlacementPolicySchema,
|
|
28140
|
+
windowMs: number(),
|
|
28141
|
+
/** How much of the window was actually observed (the hub keeps it in memory). */
|
|
28142
|
+
observedForMs: number(),
|
|
28143
|
+
sessionsNow: number(),
|
|
28144
|
+
/** Most parallel sessions across the cluster inside the window. */
|
|
28145
|
+
clusterPeakSessions: number(),
|
|
28146
|
+
nodes: array(PlacementNodeStatsSchema).readonly(),
|
|
28147
|
+
stalePins: array(StaleDevicePinSchema).readonly()
|
|
28148
|
+
});
|
|
28149
|
+
var SuggestSharesInputSchema = object({ headroom: number().min(.3).max(.5).default(.4) });
|
|
28150
|
+
var SuggestedDeviceShareSchema = object({
|
|
28151
|
+
deviceKey: string(),
|
|
28152
|
+
/** Share of the node (0–100, rounded). */
|
|
28153
|
+
share: number(),
|
|
28154
|
+
modelId: string().nullable(),
|
|
28155
|
+
/** Inferences per second at that model, from the measured table. */
|
|
28156
|
+
fps: number().nullable(),
|
|
28157
|
+
measured: boolean(),
|
|
28158
|
+
/** Advisory session cap: ⌊fps × (1 − headroom) / camera fps⌋. Never enforced. */
|
|
28159
|
+
suggestedMaxSessions: number().nullable()
|
|
28160
|
+
});
|
|
28161
|
+
var SuggestedNodeShareSchema = object({
|
|
28162
|
+
nodeId: string(),
|
|
28163
|
+
/** Share of the cluster (0–100, rounded); null = node skipped (offline, unknown hardware). */
|
|
28164
|
+
share: number().nullable(),
|
|
28165
|
+
/** Parallel sessions the node sustains at the suggested models with the headroom kept free. */
|
|
28166
|
+
capacitySessions: number(),
|
|
28167
|
+
devices: array(SuggestedDeviceShareSchema).readonly(),
|
|
28168
|
+
skippedReason: string().nullable()
|
|
28169
|
+
});
|
|
28170
|
+
var SuggestSharesResultSchema = object({
|
|
28171
|
+
headroom: number(),
|
|
28172
|
+
/** Camera detection rate the capacity is counted in (the fastest camera's fps). */
|
|
28173
|
+
cameraFps: number(),
|
|
28174
|
+
/** How many share → model → capacity rounds ran before the shares stopped moving (≤ 3). */
|
|
28175
|
+
iterations: number(),
|
|
28176
|
+
nodes: array(SuggestedNodeShareSchema).readonly()
|
|
28177
|
+
});
|
|
28178
|
+
/**
|
|
28179
|
+
* The wire shapes of the Best settings plan and apply (D745), used by the
|
|
28180
|
+
* `pipeline-orchestrator` cap. The recommender's own types
|
|
28181
|
+
* (`recommend.ts`, `demand.ts`) are the TS face of the same data; these
|
|
28182
|
+
* schemas are what crosses the cap boundary.
|
|
28183
|
+
*/
|
|
28184
|
+
var ModelFormatSchema$1 = _enum(MODEL_FORMATS);
|
|
28185
|
+
var HardwareClassIdSchema = _enum([
|
|
28186
|
+
"intel-core-ultra",
|
|
28187
|
+
"intel-n-series",
|
|
28188
|
+
"apple-m-base",
|
|
28189
|
+
"apple-m-pro",
|
|
28190
|
+
"unknown"
|
|
28191
|
+
]);
|
|
28192
|
+
var AcceleratorKindSchema = _enum([
|
|
28193
|
+
"intel-npu",
|
|
28194
|
+
"intel-igpu",
|
|
28195
|
+
"x86-cpu",
|
|
28196
|
+
"arm-cpu",
|
|
28197
|
+
"apple-ane",
|
|
28198
|
+
"coral"
|
|
28199
|
+
]);
|
|
28200
|
+
var RecommendationReasonSchema = discriminatedUnion("kind", [
|
|
28201
|
+
object({
|
|
28202
|
+
kind: literal("fits"),
|
|
28203
|
+
utilisation: number()
|
|
28204
|
+
}),
|
|
28205
|
+
object({
|
|
28206
|
+
kind: literal("tie-faster"),
|
|
28207
|
+
over: string(),
|
|
28208
|
+
recallDelta: number()
|
|
28209
|
+
}),
|
|
28210
|
+
object({
|
|
28211
|
+
kind: literal("stepped-down"),
|
|
28212
|
+
from: string(),
|
|
28213
|
+
to: string(),
|
|
28214
|
+
limitedBy: string()
|
|
28215
|
+
}),
|
|
28216
|
+
object({
|
|
28217
|
+
kind: literal("no-fit-lightest"),
|
|
28218
|
+
utilisation: number()
|
|
28219
|
+
}),
|
|
28220
|
+
object({
|
|
28221
|
+
kind: literal("derived-latency"),
|
|
28222
|
+
modelId: string()
|
|
28223
|
+
}),
|
|
28224
|
+
object({
|
|
28225
|
+
kind: literal("estimated-load"),
|
|
28226
|
+
observedForMs: number().nullable()
|
|
28227
|
+
}),
|
|
28228
|
+
object({ kind: literal("cpu-device") }),
|
|
28229
|
+
object({ kind: literal("coral-untouched") }),
|
|
28230
|
+
object({ kind: literal("device-disabled") }),
|
|
28231
|
+
object({ kind: literal("device-unavailable") }),
|
|
28232
|
+
object({ kind: literal("node-offline") }),
|
|
28233
|
+
object({ kind: literal("no-hardware-facts") }),
|
|
28234
|
+
object({
|
|
28235
|
+
kind: literal("no-measured-data"),
|
|
28236
|
+
hardwareClass: HardwareClassIdSchema
|
|
28237
|
+
}),
|
|
28238
|
+
object({
|
|
28239
|
+
kind: literal("no-family-build"),
|
|
28240
|
+
format: ModelFormatSchema$1
|
|
28241
|
+
})
|
|
28242
|
+
]);
|
|
28243
|
+
var DeviceDemandSchema = object({
|
|
28244
|
+
nodeId: string(),
|
|
28245
|
+
deviceKey: string(),
|
|
28246
|
+
demandFps: number(),
|
|
28247
|
+
maxCameraFps: number(),
|
|
28248
|
+
alwaysOnCameras: number(),
|
|
28249
|
+
onMotionSessions: number(),
|
|
28250
|
+
onMotionSource: _enum([
|
|
28251
|
+
"observed-24h",
|
|
28252
|
+
"estimate",
|
|
28253
|
+
"none"
|
|
28254
|
+
]),
|
|
28255
|
+
observedForMs: number().nullable(),
|
|
28256
|
+
/** How on-motion sessions were charged: per-device observation, or split by share (D748). */
|
|
28257
|
+
placement: SessionPlacementPolicySchema
|
|
28258
|
+
});
|
|
28259
|
+
var DeviceModelChoiceSchema = object({
|
|
28260
|
+
modelId: string(),
|
|
28261
|
+
p50Ms: number(),
|
|
28262
|
+
fps: number(),
|
|
28263
|
+
measured: boolean(),
|
|
28264
|
+
utilisation: number(),
|
|
28265
|
+
personRecall: number()
|
|
28266
|
+
});
|
|
28267
|
+
var DeviceRecommendationSchema = object({
|
|
28268
|
+
deviceKey: string(),
|
|
28269
|
+
accelerator: AcceleratorKindSchema.nullable(),
|
|
28270
|
+
enabled: boolean(),
|
|
28271
|
+
available: boolean(),
|
|
28272
|
+
demand: DeviceDemandSchema.nullable(),
|
|
28273
|
+
chosen: DeviceModelChoiceSchema.nullable(),
|
|
28274
|
+
reasons: array(RecommendationReasonSchema).readonly()
|
|
28275
|
+
});
|
|
28276
|
+
var NodeRecommendationSchema = object({
|
|
28277
|
+
nodeId: string(),
|
|
28278
|
+
reachable: boolean(),
|
|
28279
|
+
hardwareClass: HardwareClassIdSchema.nullable(),
|
|
28280
|
+
cpuModel: string().nullable(),
|
|
28281
|
+
skipped: boolean(),
|
|
28282
|
+
acceleratorModelId: string().nullable(),
|
|
28283
|
+
devices: array(DeviceRecommendationSchema).readonly(),
|
|
28284
|
+
reasons: array(RecommendationReasonSchema).readonly()
|
|
28285
|
+
});
|
|
28286
|
+
var ModelPinChangeSchema = object({
|
|
28287
|
+
stepId: string(),
|
|
28288
|
+
before: string().nullable(),
|
|
28289
|
+
after: string().nullable()
|
|
28290
|
+
});
|
|
28291
|
+
var NodeDeviceChangeSchema = object({
|
|
28292
|
+
nodeId: string(),
|
|
28293
|
+
deviceKey: string(),
|
|
28294
|
+
madeExplicit: boolean(),
|
|
28295
|
+
modelPins: array(ModelPinChangeSchema).readonly(),
|
|
28296
|
+
thresholds: array(object({
|
|
28297
|
+
stepId: string(),
|
|
28298
|
+
keys: array(string()).readonly()
|
|
28299
|
+
})).readonly()
|
|
28300
|
+
});
|
|
28301
|
+
var CameraOverrideClearSchema = object({
|
|
28302
|
+
deviceId: number(),
|
|
28303
|
+
source: _enum(["step-override", "wholesale"]),
|
|
28304
|
+
nodeId: string(),
|
|
28305
|
+
deviceKey: string().nullable(),
|
|
28306
|
+
stepId: string(),
|
|
28307
|
+
modelIdBefore: string().nullable(),
|
|
28308
|
+
keys: array(string()).readonly()
|
|
28309
|
+
});
|
|
28310
|
+
var DetectorStoreClearSchema = object({
|
|
28311
|
+
deviceId: number(),
|
|
28312
|
+
keys: array(string()).readonly()
|
|
28313
|
+
});
|
|
28314
|
+
var BestSettingsWarningSchema = discriminatedUnion("kind", [
|
|
28315
|
+
object({
|
|
28316
|
+
kind: literal("detector-store-cluster-wide"),
|
|
28317
|
+
skippedNodes: array(string()).readonly()
|
|
28318
|
+
}),
|
|
28319
|
+
object({
|
|
28320
|
+
kind: literal("detector-store-unreadable"),
|
|
28321
|
+
error: string()
|
|
28322
|
+
}),
|
|
28323
|
+
object({
|
|
28324
|
+
kind: literal("coral-enabled"),
|
|
28325
|
+
nodeId: string(),
|
|
28326
|
+
deviceKey: string()
|
|
28327
|
+
})
|
|
28328
|
+
]);
|
|
28329
|
+
var BestSettingsOptionsSchema = object({
|
|
28330
|
+
/** Share of each accelerator's throughput kept free (0.3–0.5). */
|
|
28331
|
+
headroom: number().min(.3).max(.5).default(.4),
|
|
28332
|
+
/**
|
|
28333
|
+
* What-if shares (D748): plan as if these node/device shares were stored
|
|
28334
|
+
* and the policy were `share`. Absent = the stored shares under the stored
|
|
28335
|
+
* policy. A what-if plan is for display; apply always re-plans from what
|
|
28336
|
+
* is stored.
|
|
28337
|
+
*/
|
|
28338
|
+
shares: LoadBalancingSharesInputSchema.optional()
|
|
28339
|
+
});
|
|
28340
|
+
var BestSettingsPlanSchema = object({
|
|
28341
|
+
/** Hash of everything the apply will write — the apply refuses a different one. */
|
|
28342
|
+
planHash: string(),
|
|
28343
|
+
family: literal("yolov9"),
|
|
28344
|
+
headroom: number(),
|
|
28345
|
+
/** Planned under what-if shares (D748): for display — apply refuses it as stale. */
|
|
28346
|
+
whatIf: boolean(),
|
|
28347
|
+
generatedAt: number(),
|
|
28348
|
+
nodes: array(NodeRecommendationSchema).readonly(),
|
|
28349
|
+
nodeChanges: array(NodeDeviceChangeSchema).readonly(),
|
|
28350
|
+
cameraClears: array(CameraOverrideClearSchema).readonly(),
|
|
28351
|
+
detectorStoreClears: array(DetectorStoreClearSchema).readonly(),
|
|
28352
|
+
warnings: array(BestSettingsWarningSchema).readonly()
|
|
28353
|
+
});
|
|
28354
|
+
var BestSettingsApplyInputSchema = object({
|
|
28355
|
+
planHash: string(),
|
|
28356
|
+
headroom: number().min(.3).max(.5).default(.4)
|
|
28357
|
+
});
|
|
28358
|
+
var BestSettingsPhaseResultSchema = object({
|
|
28359
|
+
phase: _enum([
|
|
28360
|
+
"download",
|
|
28361
|
+
"camera-overrides",
|
|
28362
|
+
"detector-thresholds",
|
|
28363
|
+
"node-models",
|
|
28364
|
+
"redispatch"
|
|
28365
|
+
]),
|
|
28366
|
+
ok: boolean(),
|
|
28367
|
+
detail: string()
|
|
28368
|
+
});
|
|
28369
|
+
var BestSettingsApplyResultSchema = discriminatedUnion("kind", [
|
|
28370
|
+
object({
|
|
28371
|
+
kind: literal("applied"),
|
|
28372
|
+
planHash: string(),
|
|
28373
|
+
phases: array(BestSettingsPhaseResultSchema).readonly()
|
|
28374
|
+
}),
|
|
28375
|
+
object({
|
|
28376
|
+
kind: literal("aborted"),
|
|
28377
|
+
phases: array(BestSettingsPhaseResultSchema).readonly()
|
|
28378
|
+
}),
|
|
28379
|
+
object({
|
|
28380
|
+
kind: literal("stale"),
|
|
28381
|
+
plan: BestSettingsPlanSchema
|
|
28382
|
+
}),
|
|
28383
|
+
object({
|
|
28384
|
+
kind: literal("refused"),
|
|
28385
|
+
reason: _enum(["apply-in-progress"])
|
|
28386
|
+
})
|
|
28387
|
+
]);
|
|
28018
28388
|
object({
|
|
28019
28389
|
activeCameras: number(),
|
|
28020
28390
|
throttledCameras: number(),
|
|
@@ -29427,7 +29797,6 @@ var CameraStepOverridePatchSchema = object({
|
|
|
29427
29797
|
settings: record(string(), unknown()).readonly().optional()
|
|
29428
29798
|
});
|
|
29429
29799
|
var CameraPipelineSettingsSchema = object({
|
|
29430
|
-
pinnedAgentNodeId: string().optional(),
|
|
29431
29800
|
stepToggles: record(string(), boolean()).optional(),
|
|
29432
29801
|
stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
|
|
29433
29802
|
pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
|
|
@@ -30075,18 +30444,6 @@ var pipelineOrchestratorCapability = {
|
|
|
30075
30444
|
auth: "admin"
|
|
30076
30445
|
}),
|
|
30077
30446
|
/**
|
|
30078
|
-
* Set a node's detection WEIGHT (relative share for the quota balancer).
|
|
30079
|
-
* `null` clears it (back to the implicit weight 1). Unpinned cameras
|
|
30080
|
-
* distribute proportionally to weight; `maxCameras` still clamps on top.
|
|
30081
|
-
*/
|
|
30082
|
-
setAgentDetectWeight: method(object({
|
|
30083
|
-
agentNodeId: string(),
|
|
30084
|
-
detectWeight: number().positive().nullable()
|
|
30085
|
-
}), object({ success: literal(true) }), {
|
|
30086
|
-
kind: "mutation",
|
|
30087
|
-
auth: "admin"
|
|
30088
|
-
}),
|
|
30089
|
-
/**
|
|
30090
30447
|
* Set one node's placement CAPABILITIES — the per-node record that
|
|
30091
30448
|
* replaced the four flat orchestrator lists (`enabledNodes`,
|
|
30092
30449
|
* `enabledDecoderNodes`, `enabledAudioNodes`, `remoteSourcingNodes`).
|
|
@@ -30205,6 +30562,54 @@ var pipelineOrchestratorCapability = {
|
|
|
30205
30562
|
kind: "mutation",
|
|
30206
30563
|
auth: "admin"
|
|
30207
30564
|
}),
|
|
30565
|
+
/**
|
|
30566
|
+
* Best settings (D745) — DRY RUN. Recommends ONE detector family (YOLOv9)
|
|
30567
|
+
* for the whole cluster from each node's static hardware class, the
|
|
30568
|
+
* measured latency table and the detection demand, and lists every write
|
|
30569
|
+
* the apply would make: the node model pins set, the enrichment pins and
|
|
30570
|
+
* model-bound thresholds removed (node level and per camera), and the
|
|
30571
|
+
* per-camera detector thresholds cleared. Writes nothing. Step
|
|
30572
|
+
* enablement, device enablement, pins, recording, notifications, zones and
|
|
30573
|
+
* rules are never part of it. `planHash` names exactly this diff.
|
|
30574
|
+
*/
|
|
30575
|
+
planBestSettings: method(BestSettingsOptionsSchema, BestSettingsPlanSchema, { auth: "admin" }),
|
|
30576
|
+
/**
|
|
30577
|
+
* Best settings (D745) — APPLY the plan the operator confirmed. Recomputes
|
|
30578
|
+
* the plan and refuses (`stale`, with the fresh plan) when its hash is not
|
|
30579
|
+
* `planHash`, so what is written is exactly the confirmed diff. Offline
|
|
30580
|
+
* nodes are skipped; there is no undo.
|
|
30581
|
+
*/
|
|
30582
|
+
applyBestSettings: method(BestSettingsApplyInputSchema, BestSettingsApplyResultSchema, {
|
|
30583
|
+
kind: "mutation",
|
|
30584
|
+
auth: "admin"
|
|
30585
|
+
}),
|
|
30586
|
+
/**
|
|
30587
|
+
* Load balancing (D748) — write node shares (`detectWeight`) and per-node
|
|
30588
|
+
* device shares (inference-device `weight`) in ONE atomic read-modify-write
|
|
30589
|
+
* of the agent settings — the only writer of node shares (the per-node
|
|
30590
|
+
* `setAgentDetectWeight` it replaced raced its siblings, one RMW each).
|
|
30591
|
+
* A node or device left out keeps its weight. Never changes the
|
|
30592
|
+
* `sessionPlacement` policy.
|
|
30593
|
+
*/
|
|
30594
|
+
setLoadBalancingShares: method(LoadBalancingSharesInputSchema, object({ success: literal(true) }), {
|
|
30595
|
+
kind: "mutation",
|
|
30596
|
+
auth: "admin"
|
|
30597
|
+
}),
|
|
30598
|
+
/**
|
|
30599
|
+
* Load balancing (D748) — what placement actually did: per node and
|
|
30600
|
+
* device, sessions now, sessions started and the time-weighted share of
|
|
30601
|
+
* PARALLEL sessions over `windowMs`; the cluster's parallel peak; yields
|
|
30602
|
+
* a share election made; and every device pin the session path cannot
|
|
30603
|
+
* honour. In memory on the hub — a restart starts a new window.
|
|
30604
|
+
*/
|
|
30605
|
+
getPlacementStats: method(PlacementStatsInputSchema, PlacementStatsSchema, { auth: "admin" }),
|
|
30606
|
+
/**
|
|
30607
|
+
* Load balancing (D748) — shares proportional to each node's measured
|
|
30608
|
+
* capacity at the models Best settings would pick, iterated (≤ 3 rounds)
|
|
30609
|
+
* until the shares stop moving; per device, an ADVISORY session cap.
|
|
30610
|
+
* Writes nothing.
|
|
30611
|
+
*/
|
|
30612
|
+
suggestShares: method(SuggestSharesInputSchema, SuggestSharesResultSchema, { auth: "admin" }),
|
|
30208
30613
|
/** Read one camera's settings. Null when never touched (inherits agent defaults fully). */
|
|
30209
30614
|
getCameraSettings: method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()),
|
|
30210
30615
|
/** Set or clear the 3-state toggle for one (camera, addonId). Pass `enabled: null` to clear and revert to agent default. */
|
|
@@ -51058,6 +51463,12 @@ Object.freeze({
|
|
|
51058
51463
|
addonId: null,
|
|
51059
51464
|
access: "delete"
|
|
51060
51465
|
},
|
|
51466
|
+
"pipelineExecutor.clearModelBoundDeviceOverrides": {
|
|
51467
|
+
capName: "pipeline-executor",
|
|
51468
|
+
capScope: "system",
|
|
51469
|
+
addonId: null,
|
|
51470
|
+
access: "delete"
|
|
51471
|
+
},
|
|
51061
51472
|
"pipelineExecutor.deleteModel": {
|
|
51062
51473
|
capName: "pipeline-executor",
|
|
51063
51474
|
capScope: "system",
|
|
@@ -51274,6 +51685,12 @@ Object.freeze({
|
|
|
51274
51685
|
addonId: null,
|
|
51275
51686
|
access: "view"
|
|
51276
51687
|
},
|
|
51688
|
+
"pipelineOrchestrator.applyBestSettings": {
|
|
51689
|
+
capName: "pipeline-orchestrator",
|
|
51690
|
+
capScope: "system",
|
|
51691
|
+
addonId: null,
|
|
51692
|
+
access: "create"
|
|
51693
|
+
},
|
|
51277
51694
|
"pipelineOrchestrator.applyDeviceSettingsPatch": {
|
|
51278
51695
|
capName: "pipeline-orchestrator",
|
|
51279
51696
|
capScope: "system",
|
|
@@ -51424,6 +51841,12 @@ Object.freeze({
|
|
|
51424
51841
|
addonId: null,
|
|
51425
51842
|
access: "view"
|
|
51426
51843
|
},
|
|
51844
|
+
"pipelineOrchestrator.getPlacementStats": {
|
|
51845
|
+
capName: "pipeline-orchestrator",
|
|
51846
|
+
capScope: "system",
|
|
51847
|
+
addonId: null,
|
|
51848
|
+
access: "view"
|
|
51849
|
+
},
|
|
51427
51850
|
"pipelineOrchestrator.getReconcileFromDiskStatus": {
|
|
51428
51851
|
capName: "pipeline-orchestrator",
|
|
51429
51852
|
capScope: "system",
|
|
@@ -51448,6 +51871,12 @@ Object.freeze({
|
|
|
51448
51871
|
addonId: null,
|
|
51449
51872
|
access: "create"
|
|
51450
51873
|
},
|
|
51874
|
+
"pipelineOrchestrator.planBestSettings": {
|
|
51875
|
+
capName: "pipeline-orchestrator",
|
|
51876
|
+
capScope: "system",
|
|
51877
|
+
addonId: null,
|
|
51878
|
+
access: "view"
|
|
51879
|
+
},
|
|
51451
51880
|
"pipelineOrchestrator.rebalance": {
|
|
51452
51881
|
capName: "pipeline-orchestrator",
|
|
51453
51882
|
capScope: "system",
|
|
@@ -51508,12 +51937,6 @@ Object.freeze({
|
|
|
51508
51937
|
addonId: null,
|
|
51509
51938
|
access: "create"
|
|
51510
51939
|
},
|
|
51511
|
-
"pipelineOrchestrator.setAgentDetectWeight": {
|
|
51512
|
-
capName: "pipeline-orchestrator",
|
|
51513
|
-
capScope: "system",
|
|
51514
|
-
addonId: null,
|
|
51515
|
-
access: "create"
|
|
51516
|
-
},
|
|
51517
51940
|
"pipelineOrchestrator.setAgentInferenceDevices": {
|
|
51518
51941
|
capName: "pipeline-orchestrator",
|
|
51519
51942
|
capScope: "system",
|
|
@@ -51568,12 +51991,24 @@ Object.freeze({
|
|
|
51568
51991
|
addonId: null,
|
|
51569
51992
|
access: "create"
|
|
51570
51993
|
},
|
|
51994
|
+
"pipelineOrchestrator.setLoadBalancingShares": {
|
|
51995
|
+
capName: "pipeline-orchestrator",
|
|
51996
|
+
capScope: "system",
|
|
51997
|
+
addonId: null,
|
|
51998
|
+
access: "create"
|
|
51999
|
+
},
|
|
51571
52000
|
"pipelineOrchestrator.setPipelineDevicePin": {
|
|
51572
52001
|
capName: "pipeline-orchestrator",
|
|
51573
52002
|
capScope: "system",
|
|
51574
52003
|
addonId: null,
|
|
51575
52004
|
access: "create"
|
|
51576
52005
|
},
|
|
52006
|
+
"pipelineOrchestrator.suggestShares": {
|
|
52007
|
+
capName: "pipeline-orchestrator",
|
|
52008
|
+
capScope: "system",
|
|
52009
|
+
addonId: null,
|
|
52010
|
+
access: "view"
|
|
52011
|
+
},
|
|
51577
52012
|
"pipelineOrchestrator.unassignAudio": {
|
|
51578
52013
|
capName: "pipeline-orchestrator",
|
|
51579
52014
|
capScope: "system",
|
|
@@ -57046,6 +57481,11 @@ Object.freeze({
|
|
|
57046
57481
|
form: "single",
|
|
57047
57482
|
optional: false
|
|
57048
57483
|
}],
|
|
57484
|
+
"pipelineExecutor.clearModelBoundDeviceOverrides": [{
|
|
57485
|
+
name: "deviceIds",
|
|
57486
|
+
form: "array",
|
|
57487
|
+
optional: true
|
|
57488
|
+
}],
|
|
57049
57489
|
"pipelineExecutor.runPipeline": [{
|
|
57050
57490
|
name: "deviceId",
|
|
57051
57491
|
form: "single",
|