@camstack/types 1.2.315 → 1.2.317

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/index.js CHANGED
@@ -5718,16 +5718,53 @@ var ModelFormatEntrySchema = zod.z.object({
5718
5718
  /** Runtime(s) that can use this format. If omitted, inferred from ModelFormat key */
5719
5719
  runtimes: zod.z.array(zod.z.enum(["python"])).readonly().optional(),
5720
5720
  /**
5721
- * Content revision of the hosted artefact. Set it, or change it, whenever
5722
- * the bytes at `url` are replaced in place (same path, new content). A node
5723
- * records the revision it downloaded next to the file
5721
+ * Content revision of the artefact, for one hosted OFF the CamStack mirror.
5722
+ * A format on the mirror leaves it unset: its revision (the sha256 of its
5723
+ * weight file) comes from the downloader's generated table, kept in step
5724
+ * with the mirror by `scripts/check-hosted-model-revisions.ts` (D744). A
5725
+ * node records the revision it downloaded next to the file
5724
5726
  * (`<file>.revision`); a copy with no record or a different one is stale
5725
- * and is downloaded again, the old copy serving until the new one is
5726
- * complete. Omitted ⇒ a file on disk is current, whatever it holds (D743).
5727
+ * unless its weight file hashes to the revision, and a stale copy is
5728
+ * downloaded again, the old one serving until the new one is complete. No
5729
+ * revision at all ⇒ a file on disk is current, whatever it holds (D743).
5727
5730
  */
5728
5731
  revision: zod.z.string().min(1).optional()
5729
5732
  });
5730
5733
  /**
5734
+ * What a node holds for one (model, format) (D746). `current` is a complete
5735
+ * copy at its catalog revision — exactly what `downloaded: true` means.
5736
+ * `stale` is bytes on disk that are not (yet) proven current under D743/D744:
5737
+ * no or a different revision record, or a missing sibling. `missing` is no
5738
+ * copy. `downloaded` alone folds `stale` into "not downloaded", which hid
5739
+ * reclaimable bytes and a copy about to be replaced.
5740
+ */
5741
+ var ModelOnDiskStateSchema = zod.z.enum([
5742
+ "current",
5743
+ "stale",
5744
+ "missing"
5745
+ ]);
5746
+ /**
5747
+ * The numeric precision of one format's BUILD (D746) — reported only when the
5748
+ * build states it (file-name token, an INT8 variant, an EdgeTPU compile, a
5749
+ * CamStack Core ML export). Absent means "not stated", never "fp32".
5750
+ */
5751
+ var ModelFormatPrecisionSchema = zod.z.enum([
5752
+ "fp32",
5753
+ "fp16",
5754
+ "int8"
5755
+ ]);
5756
+ /**
5757
+ * One format of one model as a node's `pipelineExecutor.getSchema` reports it.
5758
+ * `onDisk` / `precision` are optional for version skew: a runner that predates
5759
+ * them omits them, and a reader falls back to `downloaded`.
5760
+ */
5761
+ var PipelineModelFormatStatusSchema = zod.z.object({
5762
+ downloaded: zod.z.boolean(),
5763
+ sizeMB: zod.z.number(),
5764
+ onDisk: ModelOnDiskStateSchema.optional(),
5765
+ precision: ModelFormatPrecisionSchema.optional()
5766
+ });
5767
+ /**
5731
5768
  * Extra file that must be downloaded alongside the model (e.g., labels JSON, dict.txt).
5732
5769
  * The downloader fetches from `url` and saves to `{modelsDir}/{filename}`.
5733
5770
  */
@@ -26542,7 +26579,7 @@ var FrameRefSchema = zod.z.object({
26542
26579
  timestamp: zod.z.number(),
26543
26580
  capturedAt: zod.z.number().optional()
26544
26581
  });
26545
- var ModelFormatSchema$1 = zod.z.enum([
26582
+ var ModelFormatSchema$2 = zod.z.enum([
26546
26583
  "onnx",
26547
26584
  "coreml",
26548
26585
  "openvino",
@@ -26560,7 +26597,7 @@ var PipelineSlotSchema = zod.z.enum([
26560
26597
  var PipelineEngineChoiceSchema = zod.z.object({
26561
26598
  runtime: zod.z.literal("python"),
26562
26599
  backend: zod.z.string(),
26563
- format: ModelFormatSchema$1,
26600
+ format: ModelFormatSchema$2,
26564
26601
  device: zod.z.string().optional()
26565
26602
  });
26566
26603
  /**
@@ -26618,10 +26655,7 @@ var PipelineTemplateSchema$1 = zod.z.object({
26618
26655
  var PipelineModelOptionSchema = zod.z.object({
26619
26656
  id: zod.z.string(),
26620
26657
  name: zod.z.string(),
26621
- formats: zod.z.record(zod.z.string(), zod.z.object({
26622
- downloaded: zod.z.boolean(),
26623
- sizeMB: zod.z.number()
26624
- })),
26658
+ formats: zod.z.record(zod.z.string(), PipelineModelFormatStatusSchema),
26625
26659
  group: ModelVariantGroupSchema.optional(),
26626
26660
  legacy: zod.z.boolean().optional(),
26627
26661
  provider: ModelProviderIdSchema.optional(),
@@ -26836,6 +26870,32 @@ var pipelineExecutorCapability = {
26836
26870
  auth: "admin"
26837
26871
  }),
26838
26872
  /**
26873
+ * Best settings (D745): the MODEL-BOUND thresholds (`bindsToModel` keys of
26874
+ * the object-detection root, and their binding keys) stored in THIS node's
26875
+ * per-camera detector settings — and, unless `dryRun`, remove them so the
26876
+ * running model's own defaults apply. Every other key of a camera's store
26877
+ * is kept. `nodeId` is the ROUTING key. `deviceIds` absent ⇒ every camera
26878
+ * with a store. A camera whose store could not be read is `refused`, never
26879
+ * reported as clean.
26880
+ */
26881
+ clearModelBoundDeviceOverrides: require_sleep.method(zod.z.object({
26882
+ nodeId: zod.z.string(),
26883
+ deviceIds: zod.z.array(zod.z.number()).readonly().optional(),
26884
+ dryRun: zod.z.boolean()
26885
+ }), zod.z.object({
26886
+ entries: zod.z.array(zod.z.object({
26887
+ deviceId: zod.z.number(),
26888
+ keys: zod.z.array(zod.z.string()).readonly()
26889
+ })).readonly(),
26890
+ refused: zod.z.array(zod.z.object({
26891
+ deviceId: zod.z.number(),
26892
+ reason: zod.z.string()
26893
+ })).readonly()
26894
+ }), {
26895
+ kind: "mutation",
26896
+ auth: "admin"
26897
+ }),
26898
+ /**
26839
26899
  * Which of THIS node's inference devices the executor currently refuses,
26840
26900
  * and why. `nodeId` is the ROUTING key (stripped by the generated router).
26841
26901
  *
@@ -26930,12 +26990,12 @@ var pipelineExecutorCapability = {
26930
26990
  downloadModel: require_sleep.method(zod.z.object({
26931
26991
  addonId: zod.z.string(),
26932
26992
  modelId: zod.z.string(),
26933
- format: ModelFormatSchema$1
26993
+ format: ModelFormatSchema$2
26934
26994
  }), DownloadModelResultSchema, { kind: "mutation" }),
26935
26995
  deleteModel: require_sleep.method(zod.z.object({
26936
26996
  addonId: zod.z.string(),
26937
26997
  modelId: zod.z.string(),
26938
- format: ModelFormatSchema$1
26998
+ format: ModelFormatSchema$2
26939
26999
  }), zod.z.object({ success: zod.z.literal(true) }), { kind: "mutation" }),
26940
27000
  /**
26941
27001
  * Stateless single-frame execution. Callers (runner, benchmark) pass
@@ -27182,6 +27242,206 @@ var pipelineExecutorCapability = {
27182
27242
  }
27183
27243
  };
27184
27244
  //#endregion
27245
+ //#region src/pipeline/best-settings/plan-schemas.ts
27246
+ /**
27247
+ * The wire shapes of the Best settings plan and apply (D745), used by the
27248
+ * `pipeline-orchestrator` cap. The recommender's own types
27249
+ * (`recommend.ts`, `demand.ts`) are the TS face of the same data; these
27250
+ * schemas are what crosses the cap boundary.
27251
+ */
27252
+ var ModelFormatSchema$1 = zod.z.enum(MODEL_FORMATS);
27253
+ var HardwareClassIdSchema = zod.z.enum([
27254
+ "intel-core-ultra",
27255
+ "intel-n-series",
27256
+ "apple-m-base",
27257
+ "apple-m-pro",
27258
+ "unknown"
27259
+ ]);
27260
+ var AcceleratorKindSchema = zod.z.enum([
27261
+ "intel-npu",
27262
+ "intel-igpu",
27263
+ "x86-cpu",
27264
+ "arm-cpu",
27265
+ "apple-ane",
27266
+ "coral"
27267
+ ]);
27268
+ var RecommendationReasonSchema = zod.z.discriminatedUnion("kind", [
27269
+ zod.z.object({
27270
+ kind: zod.z.literal("fits"),
27271
+ utilisation: zod.z.number()
27272
+ }),
27273
+ zod.z.object({
27274
+ kind: zod.z.literal("tie-faster"),
27275
+ over: zod.z.string(),
27276
+ recallDelta: zod.z.number()
27277
+ }),
27278
+ zod.z.object({
27279
+ kind: zod.z.literal("stepped-down"),
27280
+ from: zod.z.string(),
27281
+ to: zod.z.string(),
27282
+ limitedBy: zod.z.string()
27283
+ }),
27284
+ zod.z.object({
27285
+ kind: zod.z.literal("no-fit-lightest"),
27286
+ utilisation: zod.z.number()
27287
+ }),
27288
+ zod.z.object({
27289
+ kind: zod.z.literal("derived-latency"),
27290
+ modelId: zod.z.string()
27291
+ }),
27292
+ zod.z.object({
27293
+ kind: zod.z.literal("estimated-load"),
27294
+ observedForMs: zod.z.number().nullable()
27295
+ }),
27296
+ zod.z.object({ kind: zod.z.literal("cpu-device") }),
27297
+ zod.z.object({ kind: zod.z.literal("coral-untouched") }),
27298
+ zod.z.object({ kind: zod.z.literal("device-disabled") }),
27299
+ zod.z.object({ kind: zod.z.literal("device-unavailable") }),
27300
+ zod.z.object({ kind: zod.z.literal("node-offline") }),
27301
+ zod.z.object({ kind: zod.z.literal("no-hardware-facts") }),
27302
+ zod.z.object({
27303
+ kind: zod.z.literal("no-measured-data"),
27304
+ hardwareClass: HardwareClassIdSchema
27305
+ }),
27306
+ zod.z.object({
27307
+ kind: zod.z.literal("no-family-build"),
27308
+ format: ModelFormatSchema$1
27309
+ })
27310
+ ]);
27311
+ var DeviceDemandSchema = zod.z.object({
27312
+ nodeId: zod.z.string(),
27313
+ deviceKey: zod.z.string(),
27314
+ demandFps: zod.z.number(),
27315
+ maxCameraFps: zod.z.number(),
27316
+ alwaysOnCameras: zod.z.number(),
27317
+ onMotionSessions: zod.z.number(),
27318
+ onMotionSource: zod.z.enum([
27319
+ "observed-24h",
27320
+ "estimate",
27321
+ "none"
27322
+ ]),
27323
+ observedForMs: zod.z.number().nullable()
27324
+ });
27325
+ var DeviceModelChoiceSchema = zod.z.object({
27326
+ modelId: zod.z.string(),
27327
+ p50Ms: zod.z.number(),
27328
+ fps: zod.z.number(),
27329
+ measured: zod.z.boolean(),
27330
+ utilisation: zod.z.number(),
27331
+ personRecall: zod.z.number()
27332
+ });
27333
+ var DeviceRecommendationSchema = zod.z.object({
27334
+ deviceKey: zod.z.string(),
27335
+ accelerator: AcceleratorKindSchema.nullable(),
27336
+ enabled: zod.z.boolean(),
27337
+ available: zod.z.boolean(),
27338
+ demand: DeviceDemandSchema.nullable(),
27339
+ chosen: DeviceModelChoiceSchema.nullable(),
27340
+ reasons: zod.z.array(RecommendationReasonSchema).readonly()
27341
+ });
27342
+ var NodeRecommendationSchema = zod.z.object({
27343
+ nodeId: zod.z.string(),
27344
+ reachable: zod.z.boolean(),
27345
+ hardwareClass: HardwareClassIdSchema.nullable(),
27346
+ cpuModel: zod.z.string().nullable(),
27347
+ skipped: zod.z.boolean(),
27348
+ acceleratorModelId: zod.z.string().nullable(),
27349
+ devices: zod.z.array(DeviceRecommendationSchema).readonly(),
27350
+ reasons: zod.z.array(RecommendationReasonSchema).readonly()
27351
+ });
27352
+ var ModelPinChangeSchema = zod.z.object({
27353
+ stepId: zod.z.string(),
27354
+ before: zod.z.string().nullable(),
27355
+ after: zod.z.string().nullable()
27356
+ });
27357
+ var NodeDeviceChangeSchema = zod.z.object({
27358
+ nodeId: zod.z.string(),
27359
+ deviceKey: zod.z.string(),
27360
+ madeExplicit: zod.z.boolean(),
27361
+ modelPins: zod.z.array(ModelPinChangeSchema).readonly(),
27362
+ thresholds: zod.z.array(zod.z.object({
27363
+ stepId: zod.z.string(),
27364
+ keys: zod.z.array(zod.z.string()).readonly()
27365
+ })).readonly()
27366
+ });
27367
+ var CameraOverrideClearSchema = zod.z.object({
27368
+ deviceId: zod.z.number(),
27369
+ source: zod.z.enum(["step-override", "wholesale"]),
27370
+ nodeId: zod.z.string(),
27371
+ deviceKey: zod.z.string().nullable(),
27372
+ stepId: zod.z.string(),
27373
+ modelIdBefore: zod.z.string().nullable(),
27374
+ keys: zod.z.array(zod.z.string()).readonly()
27375
+ });
27376
+ var DetectorStoreClearSchema = zod.z.object({
27377
+ deviceId: zod.z.number(),
27378
+ keys: zod.z.array(zod.z.string()).readonly()
27379
+ });
27380
+ var BestSettingsWarningSchema = zod.z.discriminatedUnion("kind", [
27381
+ zod.z.object({
27382
+ kind: zod.z.literal("detector-store-cluster-wide"),
27383
+ skippedNodes: zod.z.array(zod.z.string()).readonly()
27384
+ }),
27385
+ zod.z.object({
27386
+ kind: zod.z.literal("detector-store-unreadable"),
27387
+ error: zod.z.string()
27388
+ }),
27389
+ zod.z.object({
27390
+ kind: zod.z.literal("coral-enabled"),
27391
+ nodeId: zod.z.string(),
27392
+ deviceKey: zod.z.string()
27393
+ })
27394
+ ]);
27395
+ var BestSettingsOptionsSchema = zod.z.object({
27396
+ /** Share of each accelerator's throughput kept free (0.3–0.5). */
27397
+ headroom: zod.z.number().min(.3).max(.5).default(.4) });
27398
+ var BestSettingsPlanSchema = zod.z.object({
27399
+ /** Hash of everything the apply will write — the apply refuses a different one. */
27400
+ planHash: zod.z.string(),
27401
+ family: zod.z.literal("yolov9"),
27402
+ headroom: zod.z.number(),
27403
+ generatedAt: zod.z.number(),
27404
+ nodes: zod.z.array(NodeRecommendationSchema).readonly(),
27405
+ nodeChanges: zod.z.array(NodeDeviceChangeSchema).readonly(),
27406
+ cameraClears: zod.z.array(CameraOverrideClearSchema).readonly(),
27407
+ detectorStoreClears: zod.z.array(DetectorStoreClearSchema).readonly(),
27408
+ warnings: zod.z.array(BestSettingsWarningSchema).readonly()
27409
+ });
27410
+ var BestSettingsApplyInputSchema = zod.z.object({
27411
+ planHash: zod.z.string(),
27412
+ headroom: zod.z.number().min(.3).max(.5).default(.4)
27413
+ });
27414
+ var BestSettingsPhaseResultSchema = zod.z.object({
27415
+ phase: zod.z.enum([
27416
+ "download",
27417
+ "camera-overrides",
27418
+ "detector-thresholds",
27419
+ "node-models",
27420
+ "redispatch"
27421
+ ]),
27422
+ ok: zod.z.boolean(),
27423
+ detail: zod.z.string()
27424
+ });
27425
+ var BestSettingsApplyResultSchema = zod.z.discriminatedUnion("kind", [
27426
+ zod.z.object({
27427
+ kind: zod.z.literal("applied"),
27428
+ planHash: zod.z.string(),
27429
+ phases: zod.z.array(BestSettingsPhaseResultSchema).readonly()
27430
+ }),
27431
+ zod.z.object({
27432
+ kind: zod.z.literal("aborted"),
27433
+ phases: zod.z.array(BestSettingsPhaseResultSchema).readonly()
27434
+ }),
27435
+ zod.z.object({
27436
+ kind: zod.z.literal("stale"),
27437
+ plan: BestSettingsPlanSchema
27438
+ }),
27439
+ zod.z.object({
27440
+ kind: zod.z.literal("refused"),
27441
+ reason: zod.z.enum(["apply-in-progress"])
27442
+ })
27443
+ ]);
27444
+ //#endregion
27185
27445
  //#region src/capabilities/schemas/orchestrator-metrics.ts
27186
27446
  /** Shared Zod schemas for the runtime pipeline orchestrator metrics. */
27187
27447
  var OrchestratorMetricsSchema = zod.z.object({
@@ -29619,6 +29879,27 @@ var pipelineOrchestratorCapability = {
29619
29879
  kind: "mutation",
29620
29880
  auth: "admin"
29621
29881
  }),
29882
+ /**
29883
+ * Best settings (D745) — DRY RUN. Recommends ONE detector family (YOLOv9)
29884
+ * for the whole cluster from each node's static hardware class, the
29885
+ * measured latency table and the detection demand, and lists every write
29886
+ * the apply would make: the node model pins set, the enrichment pins and
29887
+ * model-bound thresholds removed (node level and per camera), and the
29888
+ * per-camera detector thresholds cleared. Writes nothing. Step
29889
+ * enablement, device enablement, pins, recording, notifications, zones and
29890
+ * rules are never part of it. `planHash` names exactly this diff.
29891
+ */
29892
+ planBestSettings: require_sleep.method(BestSettingsOptionsSchema, BestSettingsPlanSchema, { auth: "admin" }),
29893
+ /**
29894
+ * Best settings (D745) — APPLY the plan the operator confirmed. Recomputes
29895
+ * the plan and refuses (`stale`, with the fresh plan) when its hash is not
29896
+ * `planHash`, so what is written is exactly the confirmed diff. Offline
29897
+ * nodes are skipped; there is no undo.
29898
+ */
29899
+ applyBestSettings: require_sleep.method(BestSettingsApplyInputSchema, BestSettingsApplyResultSchema, {
29900
+ kind: "mutation",
29901
+ auth: "admin"
29902
+ }),
29622
29903
  /** Read one camera's settings. Null when never touched (inherits agent defaults fully). */
29623
29904
  getCameraSettings: require_sleep.method(zod.z.object({ deviceId: zod.z.number() }), CameraPipelineSettingsSchema.nullable()),
29624
29905
  /** Set or clear the 3-state toggle for one (camera, addonId). Pass `enabled: null` to clear and revert to agent default. */
@@ -55701,6 +55982,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
55701
55982
  addonId: null,
55702
55983
  access: "delete"
55703
55984
  },
55985
+ "pipelineExecutor.clearModelBoundDeviceOverrides": {
55986
+ capName: "pipeline-executor",
55987
+ capScope: "system",
55988
+ addonId: null,
55989
+ access: "delete"
55990
+ },
55704
55991
  "pipelineExecutor.deleteModel": {
55705
55992
  capName: "pipeline-executor",
55706
55993
  capScope: "system",
@@ -55917,6 +56204,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
55917
56204
  addonId: null,
55918
56205
  access: "view"
55919
56206
  },
56207
+ "pipelineOrchestrator.applyBestSettings": {
56208
+ capName: "pipeline-orchestrator",
56209
+ capScope: "system",
56210
+ addonId: null,
56211
+ access: "create"
56212
+ },
55920
56213
  "pipelineOrchestrator.applyDeviceSettingsPatch": {
55921
56214
  capName: "pipeline-orchestrator",
55922
56215
  capScope: "system",
@@ -56091,6 +56384,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
56091
56384
  addonId: null,
56092
56385
  access: "create"
56093
56386
  },
56387
+ "pipelineOrchestrator.planBestSettings": {
56388
+ capName: "pipeline-orchestrator",
56389
+ capScope: "system",
56390
+ addonId: null,
56391
+ access: "view"
56392
+ },
56094
56393
  "pipelineOrchestrator.rebalance": {
56095
56394
  capName: "pipeline-orchestrator",
56096
56395
  capScope: "system",
@@ -64865,6 +65164,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
64865
65164
  form: "single",
64866
65165
  optional: false
64867
65166
  }],
65167
+ "pipelineExecutor.clearModelBoundDeviceOverrides": [{
65168
+ name: "deviceIds",
65169
+ form: "array",
65170
+ optional: true
65171
+ }],
64868
65172
  "pipelineExecutor.runPipeline": [{
64869
65173
  name: "deviceId",
64870
65174
  form: "single",
@@ -65932,6 +66236,7 @@ var SYSTEM_SCOPE_DEVICE_METHODS = [
65932
66236
  "osdManager.previewSlot",
65933
66237
  "osdManager.renderDevice",
65934
66238
  "osdManager.setSlotBinding",
66239
+ "pipelineExecutor.clearModelBoundDeviceOverrides",
65935
66240
  "pipelineExecutor.runPipeline",
65936
66241
  "pipelineExecutor.runPipelineBatch",
65937
66242
  "pipelineOrchestrator.applyDeviceSettingsPatch",
@@ -66916,6 +67221,7 @@ function createSystemProxy(api) {
66916
67221
  getVideoPipelineSteps: (input) => dispatch("pipelineExecutor", "getVideoPipelineSteps", "query", input),
66917
67222
  setVideoPipelineSteps: (input) => dispatch("pipelineExecutor", "setVideoPipelineSteps", "mutation", input),
66918
67223
  clearDeviceOverrides: (input) => dispatch("pipelineExecutor", "clearDeviceOverrides", "mutation", input),
67224
+ clearModelBoundDeviceOverrides: (input) => dispatch("pipelineExecutor", "clearModelBoundDeviceOverrides", "mutation", input),
66919
67225
  getInferenceDeviceHealth: (input) => dispatch("pipelineExecutor", "getInferenceDeviceHealth", "query", input),
66920
67226
  rearmInferenceDevice: (input) => dispatch("pipelineExecutor", "rearmInferenceDevice", "mutation", input),
66921
67227
  getSchema: (input) => dispatch("pipelineExecutor", "getSchema", "query", input),
@@ -66971,6 +67277,8 @@ function createSystemProxy(api) {
66971
67277
  setAgentInferenceDevices: (input) => dispatch("pipelineOrchestrator", "setAgentInferenceDevices", "mutation", input),
66972
67278
  getNodeInferenceDevices: (input) => dispatch("pipelineOrchestrator", "getNodeInferenceDevices", "query", input),
66973
67279
  resetNodePipelineDefaults: (input) => dispatch("pipelineOrchestrator", "resetNodePipelineDefaults", "mutation", input),
67280
+ planBestSettings: (input) => dispatch("pipelineOrchestrator", "planBestSettings", "query", input),
67281
+ applyBestSettings: (input) => dispatch("pipelineOrchestrator", "applyBestSettings", "mutation", input),
66974
67282
  getCameraStatuses: (input) => dispatch("pipelineOrchestrator", "getCameraStatuses", "query", input),
66975
67283
  setCameraSensors: (input) => dispatch("pipelineOrchestrator", "setCameraSensors", "mutation", input),
66976
67284
  reconcileFromDisk: (input) => dispatch("pipelineOrchestrator", "reconcileFromDisk", "mutation", input),
@@ -71843,41 +72151,6 @@ function isRemovedModelId(stepId, modelId) {
71843
72151
  }
71844
72152
  //#endregion
71845
72153
  //#region src/pipeline/model-bound-settings.ts
71846
- /**
71847
- * Model-bound step settings (D738): an operator value that is only meaningful
71848
- * for ONE model, stored together with that model's id.
71849
- *
71850
- * The per-class confidence floors are the case it exists for. A score is a
71851
- * property of one detector's output scale — on this hub the median score of a
71852
- * correct person was 0.78 on `yolov9m-320-int8`, 0.68 on `yolo26s-320-int8`,
71853
- * 0.40 on `yolo26n-320-int8` and 0.89 on `yolo26s` (640) — so a floor tuned on
71854
- * one model is wrong on the next. The DEFAULT of such a field belongs to the
71855
- * model (the catalog entry); an operator OVERRIDE belongs to the model it was
71856
- * made for.
71857
- *
71858
- * The binding is checked at READ time against the model that RUNS, never
71859
- * enforced by a write on the model-change path: a model can change without any
71860
- * operator write at all (an unpinned root follows the elected device's
71861
- * hardware-aware default, D736), and an event-driven reset could be dropped
71862
- * (events are telemetry, D8/D11). So:
71863
- *
71864
- * effective = override when the stored binding names the running model
71865
- * | override when no binding is stored (a legacy / programmatic
71866
- * value — it applies to whatever runs, as before D738)
71867
- * | the running model's default, when it declares one
71868
- * | the field's global default.
71869
- *
71870
- * Storage shape: the value stays a plain number under its own key (every
71871
- * reader of the raw settings bag keeps working), and the binding is a SIBLING
71872
- * key, {@link modelBindingKey}. Both are flat so the shallow per-key merges of
71873
- * the settings layers (node fold, camera override) carry a value and its
71874
- * binding together whenever one layer writes both — which every writer here
71875
- * does.
71876
- *
71877
- * Lives in the bare `@camstack/types` entry, which every addon bundles, so the
71878
- * runner (`addon-pipeline`) and the editors (`ui-library`, `addon-admin-ui`)
71879
- * apply the same rule.
71880
- */
71881
72154
  /** Suffix of the sibling key that names the model a stored value was made for. */
71882
72155
  var MODEL_BINDING_SUFFIX = "ModelId";
71883
72156
  /** `minConfidencePerson` → `minConfidencePersonModelId`. */
@@ -71966,6 +72239,838 @@ function hasModelBoundOverrides(settings, boundKeys, modelId) {
71966
72239
  function clearModelBoundOverrides(settings, boundKeys, modelId) {
71967
72240
  return boundKeys.reduce((acc, key) => resolveModelBoundSetting(acc, key, modelId, void 0, void 0).source === "override" ? clearModelBoundSetting(acc, key) : acc, { ...settings });
71968
72241
  }
72242
+ /**
72243
+ * The keys of every `bindsToModel` field of a step's config schema, groups
72244
+ * flattened (D738). One definition for the runner (which applies the binding)
72245
+ * and the orchestrator's Best settings (which clears those overrides, D745).
72246
+ */
72247
+ function collectModelBoundKeys(fields) {
72248
+ return fields.flatMap((field) => {
72249
+ if (field.type === "group") return collectModelBoundKeys(field.fields);
72250
+ return "key" in field && "bindsToModel" in field && field.bindsToModel === true ? [field.key] : [];
72251
+ });
72252
+ }
72253
+ //#endregion
72254
+ //#region src/pipeline/best-settings/hardware-class.ts
72255
+ var APPLE_CHIP = /^Apple M(\d+)(?:\s+(Pro|Max|Ultra))?\b/i;
72256
+ var INTEL_CORE_ULTRA = /Core\(TM\)\s+Ultra|Core Ultra/i;
72257
+ var INTEL_N_SERIES = /Intel\(R\)\s+N\d{2,3}\b|\bIntel\s+N\d{2,3}\b/i;
72258
+ function parseAppleChip(cpuModel) {
72259
+ const match = APPLE_CHIP.exec(cpuModel.trim());
72260
+ if (match === null) return null;
72261
+ const generation = Number(match[1]);
72262
+ const variantRaw = (match[2] ?? "base").toLowerCase();
72263
+ return {
72264
+ generation,
72265
+ variant: variantRaw === "pro" || variantRaw === "max" || variantRaw === "ultra" ? variantRaw : "base"
72266
+ };
72267
+ }
72268
+ /**
72269
+ * Classify a node. Apple base chips (M1–M4) map to the measured M2 column, the
72270
+ * Pro/Max/Ultra chips to the measured M3 Pro column — the M2 was measured at
72271
+ * 1.0–1.2× the M3 Pro on the Neural Engine, so the generation inside a variant
72272
+ * matters less than the column's own error.
72273
+ */
72274
+ function classifyInferenceHardware(hw) {
72275
+ const cpuModel = hw.cpuModel;
72276
+ const apple = parseAppleChip(cpuModel);
72277
+ if (apple !== null) return {
72278
+ hardwareClass: apple.variant === "base" ? "apple-m-base" : "apple-m-pro",
72279
+ cpuModel,
72280
+ apple
72281
+ };
72282
+ if (INTEL_CORE_ULTRA.test(cpuModel)) return {
72283
+ hardwareClass: "intel-core-ultra",
72284
+ cpuModel
72285
+ };
72286
+ if (INTEL_N_SERIES.test(cpuModel)) return {
72287
+ hardwareClass: "intel-n-series",
72288
+ cpuModel
72289
+ };
72290
+ return {
72291
+ hardwareClass: "unknown",
72292
+ cpuModel
72293
+ };
72294
+ }
72295
+ /**
72296
+ * The accelerator kind of one of a node's device keys (`openvino:npu`,
72297
+ * `openvino:gpu`, `coreml:all`, `edgetpu:usb`, `cpu`, `onnx:cpu`, …). `null`
72298
+ * for a key this table has no column for.
72299
+ */
72300
+ function acceleratorKindOf(deviceKey, hw) {
72301
+ const [backend = "", device = ""] = deviceKey.split(":");
72302
+ if (backend === "edgetpu") return "coral";
72303
+ if (backend === "coreml") return device === "cpu" ? "arm-cpu" : "apple-ane";
72304
+ if (backend === "openvino" && device === "npu") return "intel-npu";
72305
+ if (backend === "openvino" && device === "gpu") return "intel-igpu";
72306
+ if (backend === "cpu" || device === "cpu") return hw.arch === "arm64" ? "arm-cpu" : "x86-cpu";
72307
+ return null;
72308
+ }
72309
+ //#endregion
72310
+ //#region src/pipeline/best-settings/detector-performance.ts
72311
+ var DETECTOR_PERF = {
72312
+ "intel-core-ultra": {
72313
+ "intel-npu": {
72314
+ "yolov9t-320": {
72315
+ p50Ms: 2.9,
72316
+ fps: 383,
72317
+ measured: true
72318
+ },
72319
+ "yolov9t-320-int8": {
72320
+ p50Ms: 3.8,
72321
+ fps: 333,
72322
+ measured: true
72323
+ },
72324
+ "yolov9t-640": {
72325
+ p50Ms: 7.4,
72326
+ fps: 139,
72327
+ measured: true
72328
+ },
72329
+ "yolov9t-640-int8": {
72330
+ p50Ms: 7.5,
72331
+ fps: 144,
72332
+ measured: true
72333
+ },
72334
+ "yolov9s-320": {
72335
+ p50Ms: 4.4,
72336
+ fps: 241,
72337
+ measured: true
72338
+ },
72339
+ "yolov9s-320-int8": {
72340
+ p50Ms: 4.1,
72341
+ fps: 264,
72342
+ measured: true
72343
+ },
72344
+ "yolov9s-640": {
72345
+ p50Ms: 12.7,
72346
+ fps: 82,
72347
+ measured: true
72348
+ },
72349
+ "yolov9s-640-int8": {
72350
+ p50Ms: 10.7,
72351
+ fps: 99,
72352
+ measured: true
72353
+ },
72354
+ "yolov9m-320": {
72355
+ p50Ms: 8.4,
72356
+ fps: 123,
72357
+ measured: true
72358
+ },
72359
+ "yolov9m-320-int8": {
72360
+ p50Ms: 6.5,
72361
+ fps: 165,
72362
+ measured: true
72363
+ },
72364
+ "yolov9m-640": {
72365
+ p50Ms: 29.5,
72366
+ fps: 32,
72367
+ measured: true
72368
+ },
72369
+ "yolov9m-640-int8": {
72370
+ p50Ms: 19.5,
72371
+ fps: 52,
72372
+ measured: true
72373
+ }
72374
+ },
72375
+ "intel-igpu": {
72376
+ "yolov9t-320": {
72377
+ p50Ms: 2.6,
72378
+ fps: 405,
72379
+ measured: true
72380
+ },
72381
+ "yolov9t-320-int8": {
72382
+ p50Ms: 2.8,
72383
+ fps: 324,
72384
+ measured: true
72385
+ },
72386
+ "yolov9t-640": {
72387
+ p50Ms: 6.5,
72388
+ fps: 157,
72389
+ measured: true
72390
+ },
72391
+ "yolov9t-640-int8": {
72392
+ p50Ms: 5.6,
72393
+ fps: 185,
72394
+ measured: true
72395
+ },
72396
+ "yolov9s-320": {
72397
+ p50Ms: 4.6,
72398
+ fps: 200,
72399
+ measured: true
72400
+ },
72401
+ "yolov9s-320-int8": {
72402
+ p50Ms: 4.1,
72403
+ fps: 239,
72404
+ measured: true
72405
+ },
72406
+ "yolov9s-640": {
72407
+ p50Ms: 15.2,
72408
+ fps: 69,
72409
+ measured: true
72410
+ },
72411
+ "yolov9s-640-int8": {
72412
+ p50Ms: 10.5,
72413
+ fps: 99,
72414
+ measured: true
72415
+ },
72416
+ "yolov9m-320": {
72417
+ p50Ms: 11.4,
72418
+ fps: 88,
72419
+ measured: true
72420
+ },
72421
+ "yolov9m-320-int8": {
72422
+ p50Ms: 7,
72423
+ fps: 127,
72424
+ measured: true
72425
+ },
72426
+ "yolov9m-640": {
72427
+ p50Ms: 40,
72428
+ fps: 25,
72429
+ measured: true
72430
+ },
72431
+ "yolov9m-640-int8": {
72432
+ p50Ms: 23.5,
72433
+ fps: 44,
72434
+ measured: true
72435
+ }
72436
+ },
72437
+ "x86-cpu": {
72438
+ "yolov9t-320": {
72439
+ p50Ms: 6.9,
72440
+ fps: 145,
72441
+ measured: true
72442
+ },
72443
+ "yolov9t-320-int8": {
72444
+ p50Ms: 2.7,
72445
+ fps: 405,
72446
+ measured: true
72447
+ },
72448
+ "yolov9t-640": {
72449
+ p50Ms: 23,
72450
+ fps: 44,
72451
+ measured: true
72452
+ },
72453
+ "yolov9t-640-int8": {
72454
+ p50Ms: 8.8,
72455
+ fps: 124,
72456
+ measured: true
72457
+ },
72458
+ "yolov9s-320": {
72459
+ p50Ms: 15.8,
72460
+ fps: 63,
72461
+ measured: true
72462
+ },
72463
+ "yolov9s-320-int8": {
72464
+ p50Ms: 6.5,
72465
+ fps: 180,
72466
+ measured: true
72467
+ },
72468
+ "yolov9s-640": {
72469
+ p50Ms: 58.2,
72470
+ fps: 17,
72471
+ measured: true
72472
+ },
72473
+ "yolov9s-640-int8": {
72474
+ p50Ms: 20.1,
72475
+ fps: 52,
72476
+ measured: true
72477
+ },
72478
+ "yolov9m-320": {
72479
+ p50Ms: 40,
72480
+ fps: 25,
72481
+ measured: true
72482
+ },
72483
+ "yolov9m-320-int8": {
72484
+ p50Ms: 14.2,
72485
+ fps: 74,
72486
+ measured: true
72487
+ },
72488
+ "yolov9m-640": {
72489
+ p50Ms: 155.8,
72490
+ fps: 6,
72491
+ measured: true
72492
+ },
72493
+ "yolov9m-640-int8": {
72494
+ p50Ms: 52.4,
72495
+ fps: 19,
72496
+ measured: true
72497
+ }
72498
+ }
72499
+ },
72500
+ "intel-n-series": {
72501
+ "intel-igpu": {
72502
+ "yolov9t-320": {
72503
+ p50Ms: 15,
72504
+ fps: 48,
72505
+ measured: true
72506
+ },
72507
+ "yolov9t-320-int8": {
72508
+ p50Ms: 14.1,
72509
+ fps: 67,
72510
+ measured: true
72511
+ },
72512
+ "yolov9t-640": {
72513
+ p50Ms: 38.5,
72514
+ fps: 26,
72515
+ measured: true
72516
+ },
72517
+ "yolov9t-640-int8": {
72518
+ p50Ms: 33.1,
72519
+ fps: 33,
72520
+ measured: true
72521
+ },
72522
+ "yolov9s-320": {
72523
+ p50Ms: 41.4,
72524
+ fps: 24,
72525
+ measured: true
72526
+ },
72527
+ "yolov9s-320-int8": {
72528
+ p50Ms: 23.3,
72529
+ fps: 34,
72530
+ measured: true
72531
+ },
72532
+ "yolov9s-640": {
72533
+ p50Ms: 127.4,
72534
+ fps: 8,
72535
+ measured: true
72536
+ },
72537
+ "yolov9s-640-int8": {
72538
+ p50Ms: 92.9,
72539
+ fps: 11,
72540
+ measured: true
72541
+ },
72542
+ "yolov9m-320": {
72543
+ p50Ms: 63.5,
72544
+ fps: 16,
72545
+ measured: true
72546
+ },
72547
+ "yolov9m-320-int8": {
72548
+ p50Ms: 39.4,
72549
+ fps: 26,
72550
+ measured: true
72551
+ },
72552
+ "yolov9m-640": {
72553
+ p50Ms: 215.5,
72554
+ fps: 5,
72555
+ measured: true
72556
+ },
72557
+ "yolov9m-640-int8": {
72558
+ p50Ms: 139.1,
72559
+ fps: 7,
72560
+ measured: true
72561
+ }
72562
+ },
72563
+ "x86-cpu": {
72564
+ "yolov9t-320": {
72565
+ p50Ms: 86.2,
72566
+ fps: 12,
72567
+ measured: true
72568
+ },
72569
+ "yolov9t-320-int8": {
72570
+ p50Ms: 52.7,
72571
+ fps: 20,
72572
+ measured: true
72573
+ },
72574
+ "yolov9t-640": {
72575
+ p50Ms: 322.1,
72576
+ fps: 3,
72577
+ measured: true
72578
+ },
72579
+ "yolov9t-640-int8": {
72580
+ p50Ms: 205.6,
72581
+ fps: 5,
72582
+ measured: true
72583
+ },
72584
+ "yolov9s-320": {
72585
+ p50Ms: 164.4,
72586
+ fps: 6,
72587
+ measured: true
72588
+ },
72589
+ "yolov9s-320-int8": {
72590
+ p50Ms: 86.9,
72591
+ fps: 12,
72592
+ measured: true
72593
+ },
72594
+ "yolov9s-640": {
72595
+ p50Ms: 341.3,
72596
+ fps: 3,
72597
+ measured: true
72598
+ },
72599
+ "yolov9s-640-int8": {
72600
+ p50Ms: 185.3,
72601
+ fps: 5,
72602
+ measured: true
72603
+ },
72604
+ "yolov9m-320": {
72605
+ p50Ms: 166.8,
72606
+ fps: 6,
72607
+ measured: true
72608
+ },
72609
+ "yolov9m-320-int8": {
72610
+ p50Ms: 226.3,
72611
+ fps: 4,
72612
+ measured: true
72613
+ },
72614
+ "yolov9m-640": {
72615
+ p50Ms: 663.5,
72616
+ fps: 2,
72617
+ measured: true
72618
+ },
72619
+ "yolov9m-640-int8": {
72620
+ p50Ms: 324.4,
72621
+ fps: 3,
72622
+ measured: true
72623
+ }
72624
+ }
72625
+ },
72626
+ "apple-m-pro": { "apple-ane": {
72627
+ "yolov9t-320": {
72628
+ p50Ms: 1.1,
72629
+ fps: 952,
72630
+ measured: true
72631
+ },
72632
+ "yolov9t-640": {
72633
+ p50Ms: 3,
72634
+ fps: 333,
72635
+ measured: true
72636
+ },
72637
+ "yolov9s-320": {
72638
+ p50Ms: 1.5,
72639
+ fps: 667,
72640
+ measured: true
72641
+ },
72642
+ "yolov9s-640": {
72643
+ p50Ms: 5.1,
72644
+ fps: 196,
72645
+ measured: true
72646
+ },
72647
+ "yolov9m-320": {
72648
+ p50Ms: 3.2,
72649
+ fps: 312,
72650
+ measured: true
72651
+ },
72652
+ "yolov9m-640": {
72653
+ p50Ms: 10.2,
72654
+ fps: 98,
72655
+ measured: true
72656
+ }
72657
+ } },
72658
+ "apple-m-base": { "apple-ane": {
72659
+ "yolov9t-320": {
72660
+ p50Ms: 1.32,
72661
+ fps: 758,
72662
+ measured: false
72663
+ },
72664
+ "yolov9t-640": {
72665
+ p50Ms: 3.45,
72666
+ fps: 290,
72667
+ measured: true
72668
+ },
72669
+ "yolov9s-320": {
72670
+ p50Ms: 1.8,
72671
+ fps: 556,
72672
+ measured: false
72673
+ },
72674
+ "yolov9s-640": {
72675
+ p50Ms: 5.46,
72676
+ fps: 183,
72677
+ measured: true
72678
+ },
72679
+ "yolov9m-320": {
72680
+ p50Ms: 3.79,
72681
+ fps: 264,
72682
+ measured: true
72683
+ },
72684
+ "yolov9m-640": {
72685
+ p50Ms: 10.34,
72686
+ fps: 97,
72687
+ measured: true
72688
+ }
72689
+ } }
72690
+ };
72691
+ var DETECTOR_ACCURACY = {
72692
+ "yolov9m-320": {
72693
+ personPrecision: .979,
72694
+ personRecall: .649
72695
+ },
72696
+ "yolov9m-320-int8": {
72697
+ personPrecision: .974,
72698
+ personRecall: .684
72699
+ },
72700
+ "yolov9m-640": {
72701
+ personPrecision: .976,
72702
+ personRecall: .854
72703
+ },
72704
+ "yolov9m-640-int8": {
72705
+ personPrecision: .976,
72706
+ personRecall: .847
72707
+ },
72708
+ "yolov9s-320": {
72709
+ personPrecision: .958,
72710
+ personRecall: .479
72711
+ },
72712
+ "yolov9s-320-int8": {
72713
+ personPrecision: .969,
72714
+ personRecall: .438
72715
+ },
72716
+ "yolov9s-640": {
72717
+ personPrecision: .986,
72718
+ personRecall: .753
72719
+ },
72720
+ "yolov9s-640-int8": {
72721
+ personPrecision: .963,
72722
+ personRecall: .823
72723
+ },
72724
+ "yolov9t-320": {
72725
+ personPrecision: .946,
72726
+ personRecall: .368
72727
+ },
72728
+ "yolov9t-320-int8": {
72729
+ personPrecision: .943,
72730
+ personRecall: .347
72731
+ },
72732
+ "yolov9t-640": {
72733
+ personPrecision: .979,
72734
+ personRecall: .646
72735
+ },
72736
+ "yolov9t-640-int8": {
72737
+ personPrecision: .979,
72738
+ personRecall: .646
72739
+ }
72740
+ };
72741
+ //#endregion
72742
+ //#region src/pipeline/best-settings/demand.ts
72743
+ var DEFAULT_DEMAND_OPTIONS = {
72744
+ onMotionConcurrency: .25,
72745
+ onMotionMinConcurrent: 2
72746
+ };
72747
+ /** A full observation window. */
72748
+ var OBSERVATION_WINDOW_MS = 1440 * 60 * 1e3;
72749
+ function deviceId(nodeId, deviceKey) {
72750
+ return `${nodeId}\u0000${deviceKey}`;
72751
+ }
72752
+ function charges(load) {
72753
+ return load.mode !== "disabled" && load.runsPipelineRoot && load.fps > 0;
72754
+ }
72755
+ /** The highest `count` rates, summed. */
72756
+ function topRatesSum(rates, count) {
72757
+ return rates.toSorted((a, b) => b - a).slice(0, Math.max(0, count)).reduce((sum, r) => sum + r, 0);
72758
+ }
72759
+ /** Concurrent on-motion sessions assumed cluster-wide without an observation. */
72760
+ function estimatedConcurrentSessions(cameraCount, options) {
72761
+ if (cameraCount <= 0) return 0;
72762
+ const share = Math.ceil(options.onMotionConcurrency * cameraCount);
72763
+ return Math.min(cameraCount, Math.max(share, Math.min(cameraCount, options.onMotionMinConcurrent)));
72764
+ }
72765
+ /**
72766
+ * Demand on every eligible device of the cluster.
72767
+ */
72768
+ function estimateDeviceDemand(input) {
72769
+ const options = input.options ?? DEFAULT_DEMAND_OPTIONS;
72770
+ const eligibleById = new Map(input.eligible.map((d) => [deviceId(d.nodeId, d.deviceKey), d]));
72771
+ const peakById = new Map(input.peaks.map((p) => [deviceId(p.nodeId, p.deviceKey), p]));
72772
+ const weightByNode = /* @__PURE__ */ new Map();
72773
+ const eligibleCountByNode = /* @__PURE__ */ new Map();
72774
+ for (const d of input.eligible) {
72775
+ weightByNode.set(d.nodeId, (weightByNode.get(d.nodeId) ?? 0) + Math.max(d.weight, 0));
72776
+ eligibleCountByNode.set(d.nodeId, (eligibleCountByNode.get(d.nodeId) ?? 0) + 1);
72777
+ }
72778
+ const pinnedFps = /* @__PURE__ */ new Map();
72779
+ const alwaysOnFps = /* @__PURE__ */ new Map();
72780
+ const alwaysOnCount = /* @__PURE__ */ new Map();
72781
+ const maxFps = /* @__PURE__ */ new Map();
72782
+ const onMotionRates = [];
72783
+ const bump = (map, key, by) => {
72784
+ map.set(key, (map.get(key) ?? 0) + by);
72785
+ };
72786
+ const noteMax = (key, fps) => {
72787
+ maxFps.set(key, Math.max(maxFps.get(key) ?? 0, fps));
72788
+ };
72789
+ for (const cam of input.cameras) {
72790
+ if (!charges(cam)) continue;
72791
+ if (cam.devicePin !== null) {
72792
+ const key = deviceId(cam.devicePin.nodeId, cam.devicePin.deviceKey);
72793
+ if (!eligibleById.has(key)) continue;
72794
+ bump(pinnedFps, key, cam.fps);
72795
+ noteMax(key, cam.fps);
72796
+ continue;
72797
+ }
72798
+ if (cam.mode === "always-on" && cam.standingNodeId !== null) {
72799
+ const nodeWeight = weightByNode.get(cam.standingNodeId) ?? 0;
72800
+ for (const d of input.eligible) {
72801
+ if (d.nodeId !== cam.standingNodeId || nodeWeight <= 0) continue;
72802
+ const key = deviceId(d.nodeId, d.deviceKey);
72803
+ const share = Math.max(d.weight, 0) / nodeWeight;
72804
+ bump(alwaysOnFps, key, cam.fps * share);
72805
+ bump(alwaysOnCount, key, share);
72806
+ noteMax(key, cam.fps);
72807
+ }
72808
+ continue;
72809
+ }
72810
+ onMotionRates.push(cam.fps);
72811
+ }
72812
+ const fastestOnMotion = onMotionRates.reduce((m, r) => Math.max(m, r), 0);
72813
+ const nodeCount = weightByNode.size;
72814
+ const estimatedTotal = estimatedConcurrentSessions(onMotionRates.length, options);
72815
+ return input.eligible.map((d) => {
72816
+ const key = deviceId(d.nodeId, d.deviceKey);
72817
+ const peak = peakById.get(key) ?? (eligibleCountByNode.get(d.nodeId) === 1 ? peakById.get(deviceId(d.nodeId, "")) : void 0);
72818
+ const alwaysOn = alwaysOnCount.get(key) ?? 0;
72819
+ let onMotionSessions = 0;
72820
+ let onMotionSource = "none";
72821
+ if (onMotionRates.length > 0) if (peak !== void 0 && peak.observedForMs >= 864e5) {
72822
+ onMotionSessions = Math.max(0, Math.round(peak.peakSessions - alwaysOn));
72823
+ onMotionSource = "observed-24h";
72824
+ } else {
72825
+ const nodeWeight = weightByNode.get(d.nodeId) ?? 0;
72826
+ const share = nodeCount > 0 && nodeWeight > 0 ? Math.max(d.weight, 0) / nodeWeight / nodeCount : 0;
72827
+ onMotionSessions = Math.ceil(estimatedTotal * share);
72828
+ onMotionSource = "estimate";
72829
+ }
72830
+ const demandFps = (pinnedFps.get(key) ?? 0) + (alwaysOnFps.get(key) ?? 0) + topRatesSum(onMotionRates, onMotionSessions);
72831
+ return {
72832
+ nodeId: d.nodeId,
72833
+ deviceKey: d.deviceKey,
72834
+ demandFps: Math.round(demandFps * 100) / 100,
72835
+ maxCameraFps: Math.max(maxFps.get(key) ?? 0, fastestOnMotion),
72836
+ alwaysOnCameras: Math.round(alwaysOn * 100) / 100,
72837
+ onMotionSessions,
72838
+ onMotionSource,
72839
+ observedForMs: peak?.observedForMs ?? null
72840
+ };
72841
+ }).toSorted((a, b) => a.nodeId === b.nodeId ? a.deviceKey.localeCompare(b.deviceKey) : a.nodeId.localeCompare(b.nodeId));
72842
+ }
72843
+ //#endregion
72844
+ //#region src/pipeline/best-settings/recommend.ts
72845
+ /** The family the cluster runs. */
72846
+ var BEST_SETTINGS_FAMILY = "yolov9";
72847
+ /** Recall within this of the best counts as a tie — the faster one wins. */
72848
+ var RECALL_TIE = .02;
72849
+ /** Default share of an accelerator's throughput kept free. */
72850
+ var DEFAULT_HEADROOM = .4;
72851
+ function round(value, digits = 3) {
72852
+ const f = 10 ** digits;
72853
+ return Math.round(value * f) / f;
72854
+ }
72855
+ function utilisationOf(cell, demand) {
72856
+ return cell.fps > 0 ? round((demand?.demandFps ?? 0) / cell.fps) : Number.POSITIVE_INFINITY;
72857
+ }
72858
+ function fitsOn(cell, demand, headroom) {
72859
+ const budget = cell.fps * (1 - headroom);
72860
+ return budget >= (demand?.demandFps ?? 0) && budget >= (demand?.maxCameraFps ?? 0);
72861
+ }
72862
+ function candidatesFor(contexts, formatsByModel) {
72863
+ return Object.keys(DETECTOR_ACCURACY).filter((id) => id.startsWith(BEST_SETTINGS_FAMILY)).filter((id) => contexts.every((c) => c.column[id] !== void 0 && (formatsByModel[id] ?? []).includes(c.device.format))).map((id) => ({
72864
+ modelId: id,
72865
+ personRecall: DETECTOR_ACCURACY[id]?.personRecall ?? 0
72866
+ })).toSorted((a, b) => b.personRecall - a.personRecall || a.modelId.localeCompare(b.modelId));
72867
+ }
72868
+ function totalLatency(contexts, modelId) {
72869
+ return contexts.reduce((sum, c) => sum + (c.column[modelId]?.p50Ms ?? Number.POSITIVE_INFINITY), 0);
72870
+ }
72871
+ function worstUtilisation(contexts, modelId) {
72872
+ return contexts.reduce((worst, c) => {
72873
+ const cell = c.column[modelId];
72874
+ return Math.max(worst, cell ? utilisationOf(cell, c.demand) : Number.POSITIVE_INFINITY);
72875
+ }, 0);
72876
+ }
72877
+ /** One model for a group of devices that must agree (step 2–4 of the header). */
72878
+ function pickForGroup(contexts, formatsByModel, headroom) {
72879
+ const candidates = candidatesFor(contexts, formatsByModel);
72880
+ if (candidates.length === 0) return null;
72881
+ const fitting = candidates.filter((c) => contexts.every((ctx) => {
72882
+ const cell = ctx.column[c.modelId];
72883
+ return cell !== void 0 && fitsOn(cell, ctx.demand, headroom);
72884
+ }));
72885
+ if (fitting.length === 0) {
72886
+ const lightest = candidates.toSorted((a, b) => worstUtilisation(contexts, a.modelId) - worstUtilisation(contexts, b.modelId))[0];
72887
+ if (lightest === void 0) return null;
72888
+ return {
72889
+ modelId: lightest.modelId,
72890
+ reasons: [{
72891
+ kind: "no-fit-lightest",
72892
+ utilisation: worstUtilisation(contexts, lightest.modelId)
72893
+ }]
72894
+ };
72895
+ }
72896
+ const best = fitting[0];
72897
+ if (best === void 0) return null;
72898
+ const chosen = fitting.filter((c) => best.personRecall - c.personRecall <= .02).toSorted((a, b) => totalLatency(contexts, a.modelId) - totalLatency(contexts, b.modelId) || b.personRecall - a.personRecall)[0] ?? best;
72899
+ const reasons = [];
72900
+ const mostAccurate = candidates[0];
72901
+ if (mostAccurate !== void 0 && mostAccurate.modelId !== best.modelId) {
72902
+ const limitedBy = contexts.find((ctx) => {
72903
+ const cell = ctx.column[mostAccurate.modelId];
72904
+ return cell === void 0 || !fitsOn(cell, ctx.demand, headroom);
72905
+ })?.device.key ?? "";
72906
+ reasons.push({
72907
+ kind: "stepped-down",
72908
+ from: mostAccurate.modelId,
72909
+ to: best.modelId,
72910
+ limitedBy
72911
+ });
72912
+ }
72913
+ if (chosen.modelId !== best.modelId) reasons.push({
72914
+ kind: "tie-faster",
72915
+ over: best.modelId,
72916
+ recallDelta: round(best.personRecall - chosen.personRecall)
72917
+ });
72918
+ return {
72919
+ modelId: chosen.modelId,
72920
+ reasons
72921
+ };
72922
+ }
72923
+ function choiceOn(ctx, modelId) {
72924
+ const cell = ctx.column[modelId];
72925
+ if (cell === void 0) return null;
72926
+ return {
72927
+ modelId,
72928
+ p50Ms: cell.p50Ms,
72929
+ fps: cell.fps,
72930
+ measured: cell.measured,
72931
+ utilisation: utilisationOf(cell, ctx.demand),
72932
+ personRecall: DETECTOR_ACCURACY[modelId]?.personRecall ?? 0
72933
+ };
72934
+ }
72935
+ function deviceReasonsFor(ctx, choice) {
72936
+ const out = [{
72937
+ kind: "fits",
72938
+ utilisation: choice.utilisation
72939
+ }];
72940
+ if (!choice.measured) out.push({
72941
+ kind: "derived-latency",
72942
+ modelId: choice.modelId
72943
+ });
72944
+ if (ctx.demand?.onMotionSource === "estimate") out.push({
72945
+ kind: "estimated-load",
72946
+ observedForMs: ctx.demand.observedForMs
72947
+ });
72948
+ return out;
72949
+ }
72950
+ function skippedNode(node, reason, hardwareClass) {
72951
+ return {
72952
+ nodeId: node.nodeId,
72953
+ reachable: node.reachable,
72954
+ hardwareClass,
72955
+ cpuModel: node.hardware?.cpuModel ?? null,
72956
+ skipped: true,
72957
+ acceleratorModelId: null,
72958
+ devices: node.devices.map((d) => ({
72959
+ deviceKey: d.key,
72960
+ accelerator: node.hardware ? acceleratorKindOf(d.key, node.hardware) : null,
72961
+ enabled: d.enabled,
72962
+ available: d.available,
72963
+ demand: null,
72964
+ chosen: null,
72965
+ reasons: []
72966
+ })),
72967
+ reasons: [reason]
72968
+ };
72969
+ }
72970
+ /** Recommend one node. See the module header. */
72971
+ function recommendNode(input) {
72972
+ const { node } = input;
72973
+ const headroom = input.headroom ?? .4;
72974
+ const perf = input.perf ?? DETECTOR_PERF;
72975
+ if (!node.reachable) return skippedNode(node, { kind: "node-offline" }, null);
72976
+ if (node.hardware === null) return skippedNode(node, { kind: "no-hardware-facts" }, null);
72977
+ const hardware = node.hardware;
72978
+ const { hardwareClass, cpuModel } = classifyInferenceHardware(hardware);
72979
+ const classTable = perf[hardwareClass];
72980
+ if (hardwareClass === "unknown" || classTable === void 0) return skippedNode(node, {
72981
+ kind: "no-measured-data",
72982
+ hardwareClass
72983
+ }, hardwareClass);
72984
+ const demandByKey = new Map(input.demand.filter((d) => d.nodeId === node.nodeId).map((d) => [d.deviceKey, d]));
72985
+ const devices = node.devices.toSorted((a, b) => a.key.localeCompare(b.key));
72986
+ const contexts = /* @__PURE__ */ new Map();
72987
+ const early = /* @__PURE__ */ new Map();
72988
+ for (const device of devices) {
72989
+ const accelerator = acceleratorKindOf(device.key, hardware);
72990
+ if (accelerator === "coral") {
72991
+ early.set(device.key, device.enabled ? [{ kind: "coral-untouched" }] : []);
72992
+ continue;
72993
+ }
72994
+ if (!device.enabled) {
72995
+ early.set(device.key, [{ kind: "device-disabled" }]);
72996
+ continue;
72997
+ }
72998
+ if (!device.available) {
72999
+ early.set(device.key, [{ kind: "device-unavailable" }]);
73000
+ continue;
73001
+ }
73002
+ const column = accelerator === null ? void 0 : classTable[accelerator];
73003
+ if (accelerator === null || column === void 0) {
73004
+ early.set(device.key, [{
73005
+ kind: "no-family-build",
73006
+ format: device.format
73007
+ }]);
73008
+ continue;
73009
+ }
73010
+ contexts.set(device.key, {
73011
+ device,
73012
+ accelerator,
73013
+ column,
73014
+ demand: demandByKey.get(device.key) ?? null
73015
+ });
73016
+ }
73017
+ const isCpu = (a) => a === "x86-cpu" || a === "arm-cpu";
73018
+ const accelerators = [...contexts.values()].filter((c) => !isCpu(c.accelerator));
73019
+ const cpus = [...contexts.values()].filter((c) => isCpu(c.accelerator));
73020
+ const chosenByKey = /* @__PURE__ */ new Map();
73021
+ const reasonsByKey = /* @__PURE__ */ new Map();
73022
+ const nodeReasons = [];
73023
+ let acceleratorModelId = null;
73024
+ const groupPick = accelerators.length > 0 ? pickForGroup(accelerators, node.formatsByModel, headroom) : null;
73025
+ if (groupPick !== null) {
73026
+ acceleratorModelId = groupPick.modelId;
73027
+ nodeReasons.push(...groupPick.reasons);
73028
+ for (const ctx of accelerators) {
73029
+ const choice = choiceOn(ctx, groupPick.modelId);
73030
+ if (choice === null) continue;
73031
+ chosenByKey.set(ctx.device.key, choice);
73032
+ reasonsByKey.set(ctx.device.key, deviceReasonsFor(ctx, choice));
73033
+ }
73034
+ } else for (const ctx of accelerators) reasonsByKey.set(ctx.device.key, [{
73035
+ kind: "no-family-build",
73036
+ format: ctx.device.format
73037
+ }]);
73038
+ for (const ctx of cpus) {
73039
+ const pick = pickForGroup([ctx], node.formatsByModel, headroom);
73040
+ const choice = pick === null ? null : choiceOn(ctx, pick.modelId);
73041
+ if (pick === null || choice === null) {
73042
+ reasonsByKey.set(ctx.device.key, [{
73043
+ kind: "no-family-build",
73044
+ format: ctx.device.format
73045
+ }]);
73046
+ continue;
73047
+ }
73048
+ chosenByKey.set(ctx.device.key, choice);
73049
+ reasonsByKey.set(ctx.device.key, [
73050
+ { kind: "cpu-device" },
73051
+ ...pick.reasons,
73052
+ ...deviceReasonsFor(ctx, choice)
73053
+ ]);
73054
+ }
73055
+ return {
73056
+ nodeId: node.nodeId,
73057
+ reachable: true,
73058
+ hardwareClass,
73059
+ cpuModel,
73060
+ skipped: chosenByKey.size === 0,
73061
+ acceleratorModelId,
73062
+ devices: devices.map((device) => ({
73063
+ deviceKey: device.key,
73064
+ accelerator: acceleratorKindOf(device.key, hardware),
73065
+ enabled: device.enabled,
73066
+ available: device.available,
73067
+ demand: demandByKey.get(device.key) ?? null,
73068
+ chosen: chosenByKey.get(device.key) ?? null,
73069
+ reasons: early.get(device.key) ?? reasonsByKey.get(device.key) ?? []
73070
+ })),
73071
+ reasons: nodeReasons
73072
+ };
73073
+ }
71969
73074
  //#endregion
71970
73075
  //#region src/pipeline/root-face-crop.ts
71971
73076
  /** Side of the square, as a multiple of the face box's longer side. */
@@ -74111,6 +75216,7 @@ exports.AUDIO_PRESETS = require_composition.AUDIO_PRESETS;
74111
75216
  exports.AUDIO_SCALE_EPOCH_ISO = AUDIO_SCALE_EPOCH_ISO;
74112
75217
  exports.AUDIO_SCALE_EPOCH_MS = AUDIO_SCALE_EPOCH_MS;
74113
75218
  exports.AUTOMATIC_HUB_ADDRESS_FLAGS = AUTOMATIC_HUB_ADDRESS_FLAGS;
75219
+ exports.AcceleratorKindSchema = AcceleratorKindSchema;
74114
75220
  exports.AccessoriesStatusSchema = AccessoriesStatusSchema;
74115
75221
  exports.AccessoryKind = AccessoryKind;
74116
75222
  exports.AddBrokerInputSchema = AddBrokerInputSchema;
@@ -74189,6 +75295,7 @@ exports.BASE_DEVICE_CAPS = BASE_DEVICE_CAPS;
74189
75295
  exports.BASE_LIVE_EGRESS_PROFILE = BASE_LIVE_EGRESS_PROFILE;
74190
75296
  exports.BATTERY_DEVICE_PROFILE = BATTERY_DEVICE_PROFILE;
74191
75297
  exports.BATTERY_UNREACHABLE_AFTER_MS = BATTERY_UNREACHABLE_AFTER_MS;
75298
+ exports.BEST_SETTINGS_FAMILY = BEST_SETTINGS_FAMILY;
74192
75299
  exports.BIRTH_DECISION_DEFAULT_LIMIT = BIRTH_DECISION_DEFAULT_LIMIT;
74193
75300
  exports.BOOT_RECOVERY_BACKOFF_MS = require_sleep.BOOT_RECOVERY_BACKOFF_MS;
74194
75301
  exports.BUILTIN_RESULT_KINDS = BUILTIN_RESULT_KINDS;
@@ -74204,6 +75311,12 @@ exports.BaseAddon = require_sleep.BaseAddon;
74204
75311
  exports.BaseDevice = BaseDevice;
74205
75312
  exports.BaseDeviceProvider = BaseDeviceProvider;
74206
75313
  exports.BatteryStatusSchema = BatteryStatusSchema;
75314
+ exports.BestSettingsApplyInputSchema = BestSettingsApplyInputSchema;
75315
+ exports.BestSettingsApplyResultSchema = BestSettingsApplyResultSchema;
75316
+ exports.BestSettingsOptionsSchema = BestSettingsOptionsSchema;
75317
+ exports.BestSettingsPhaseResultSchema = BestSettingsPhaseResultSchema;
75318
+ exports.BestSettingsPlanSchema = BestSettingsPlanSchema;
75319
+ exports.BestSettingsWarningSchema = BestSettingsWarningSchema;
74207
75320
  exports.BinaryStatusSchema = BinaryStatusSchema;
74208
75321
  exports.BirthDecisionQueryInputSchema = BirthDecisionQueryInputSchema;
74209
75322
  exports.BirthDecisionRecordSchema = BirthDecisionRecordSchema;
@@ -74306,6 +75419,7 @@ exports.CameraMetricsSchema = CameraMetricsSchema;
74306
75419
  exports.CameraMetricsWithDeviceIdSchema = CameraMetricsWithDeviceIdSchema;
74307
75420
  exports.CameraMotionStatusSchema = CameraMotionStatusSchema;
74308
75421
  exports.CameraOccupancySnapshotForDeviceSchema = CameraOccupancySnapshotForDeviceSchema;
75422
+ exports.CameraOverrideClearSchema = CameraOverrideClearSchema;
74309
75423
  exports.CameraOwnMotionSchema = CameraOwnMotionSchema;
74310
75424
  exports.CameraRawLevelSchema = CameraRawLevelSchema;
74311
75425
  exports.CameraRecordingModeSchema = CameraRecordingModeSchema;
@@ -74463,11 +75577,13 @@ exports.DEFAULT_CLUSTER_STEP_MODELS = DEFAULT_CLUSTER_STEP_MODELS;
74463
75577
  exports.DEFAULT_CLUSTER_STEP_SETTINGS = DEFAULT_CLUSTER_STEP_SETTINGS;
74464
75578
  exports.DEFAULT_CORE_BLOCK_ENTRY = DEFAULT_CORE_BLOCK_ENTRY;
74465
75579
  exports.DEFAULT_DECODER_HWACCEL_CONFIG = DEFAULT_DECODER_HWACCEL_CONFIG;
75580
+ exports.DEFAULT_DEMAND_OPTIONS = DEFAULT_DEMAND_OPTIONS;
74466
75581
  exports.DEFAULT_DETAIL_CROP_CONVENTION = DEFAULT_DETAIL_CROP_CONVENTION;
74467
75582
  exports.DEFAULT_EVENTS_BAND_BUFFER_SEC = DEFAULT_EVENTS_BAND_BUFFER_SEC;
74468
75583
  exports.DEFAULT_EVENT_COLOR = DEFAULT_EVENT_COLOR;
74469
75584
  exports.DEFAULT_FEATURES = DEFAULT_FEATURES;
74470
75585
  exports.DEFAULT_FIRST_SIGHTING_FRESHNESS_MS = require_composition.DEFAULT_FIRST_SIGHTING_FRESHNESS_MS;
75586
+ exports.DEFAULT_HEADROOM = DEFAULT_HEADROOM;
74471
75587
  exports.DEFAULT_MIN_LANDMARK_FACE_SIZE_PX = DEFAULT_MIN_LANDMARK_FACE_SIZE_PX;
74472
75588
  exports.DEFAULT_NATIVE_LEASE_SETTINGS = DEFAULT_NATIVE_LEASE_SETTINGS;
74473
75589
  exports.DEFAULT_OVERLAY_LAYERS = DEFAULT_OVERLAY_LAYERS;
@@ -74484,6 +75600,8 @@ exports.DETAIL_CROP_SECTION_ID = DETAIL_CROP_SECTION_ID;
74484
75600
  exports.DETAIL_CROP_SQUARE_KEY = DETAIL_CROP_SQUARE_KEY;
74485
75601
  exports.DETECTION_MACRO_CLASSES = DETECTION_MACRO_CLASSES;
74486
75602
  exports.DETECTION_PIPELINE_CAP_NAME = DETECTION_PIPELINE_CAP_NAME;
75603
+ exports.DETECTOR_ACCURACY = DETECTOR_ACCURACY;
75604
+ exports.DETECTOR_PERF = DETECTOR_PERF;
74487
75605
  exports.DEVICE_BACKEND_TO_FORMAT = DEVICE_BACKEND_TO_FORMAT;
74488
75606
  exports.DEVICE_CAP_NAMES = DEVICE_CAP_NAMES;
74489
75607
  exports.DEVICE_CHILDREN_BATCH_MAX = require_sleep.DEVICE_CHILDREN_BATCH_MAX;
@@ -74521,16 +75639,20 @@ exports.DetailCropConventionSchema = DetailCropConventionSchema;
74521
75639
  exports.DetectionCatalogClassMapSchema = DetectionCatalogClassMapSchema;
74522
75640
  exports.DetectionSourceSchema = DetectionSourceSchema;
74523
75641
  exports.DetectionSourcesSchema = DetectionSourcesSchema;
75642
+ exports.DetectorStoreClearSchema = DetectorStoreClearSchema;
74524
75643
  exports.DeviceAdminLinkSchema = DeviceAdminLinkSchema;
74525
75644
  exports.DeviceCodeSeveritySchema = DeviceCodeSeveritySchema;
74526
75645
  exports.DeviceConfig = DeviceConfig;
75646
+ exports.DeviceDemandSchema = DeviceDemandSchema;
74527
75647
  exports.DeviceDiscoveryStatusSchema = DeviceDiscoveryStatusSchema;
74528
75648
  exports.DeviceExportExposeInputSchema = ExposeInputSchema;
74529
75649
  exports.DeviceExportStatusSchema = DeviceExportStatusSchema;
74530
75650
  exports.DeviceExportUnexposeInputSchema = UnexposeInputSchema;
74531
75651
  exports.DeviceFeature = require_err_msg.DeviceFeature;
74532
75652
  exports.DeviceInfoSchema = DeviceInfoSchema;
75653
+ exports.DeviceModelChoiceSchema = DeviceModelChoiceSchema;
74533
75654
  exports.DeviceNetworkStatsSchema = DeviceNetworkStatsSchema;
75655
+ exports.DeviceRecommendationSchema = DeviceRecommendationSchema;
74534
75656
  exports.DeviceRestoreRetryScheduler = DeviceRestoreRetryScheduler;
74535
75657
  exports.DeviceRole = require_err_msg.DeviceRole;
74536
75658
  exports.DeviceRuntimeState = DeviceRuntimeState;
@@ -74683,6 +75805,7 @@ exports.HOURS_PER_DAY = HOURS_PER_DAY;
74683
75805
  exports.HUB_ADDRESS_ROLES = HUB_ADDRESS_ROLES;
74684
75806
  exports.HUB_VIEWER_MOUNT = HUB_VIEWER_MOUNT;
74685
75807
  exports.HWACCEL_OPTIONS = HWACCEL_OPTIONS;
75808
+ exports.HardwareClassIdSchema = HardwareClassIdSchema;
74686
75809
  exports.HealthStatusSchema = HealthStatusSchema;
74687
75810
  exports.HfModelResolutionSchema = HfModelResolutionSchema;
74688
75811
  exports.HistoryPointSchema = HistoryPointSchema;
@@ -74865,8 +75988,11 @@ exports.ModelDistributeInputSchema = ModelDistributeInputSchema;
74865
75988
  exports.ModelDistributeResultSchema = ModelDistributeResultSchema;
74866
75989
  exports.ModelExtraFileSchema = ModelExtraFileSchema;
74867
75990
  exports.ModelFormatEntrySchema = ModelFormatEntrySchema;
75991
+ exports.ModelFormatPrecisionSchema = ModelFormatPrecisionSchema;
74868
75992
  exports.ModelFormatsSchema = ModelFormatsSchema;
74869
75993
  exports.ModelLicenseSchema = ModelLicenseSchema;
75994
+ exports.ModelOnDiskStateSchema = ModelOnDiskStateSchema;
75995
+ exports.ModelPinChangeSchema = ModelPinChangeSchema;
74870
75996
  exports.ModelProviderIdSchema = ModelProviderIdSchema;
74871
75997
  exports.ModelSubstitutionSchema = ModelSubstitutionSchema;
74872
75998
  exports.ModelVariantGroupSchema = ModelVariantGroupSchema;
@@ -75103,14 +76229,17 @@ exports.NetworkAccessStatusSchema = NetworkAccessStatusSchema;
75103
76229
  exports.NetworkAddressSchema = NetworkAddressSchema;
75104
76230
  exports.NetworkEndpointSchema = NetworkEndpointSchema;
75105
76231
  exports.NetworkLinkStatusSchema = NetworkLinkStatusSchema;
76232
+ exports.NodeDeviceChangeSchema = NodeDeviceChangeSchema;
75106
76233
  exports.NodeDirectoryEntrySchema = NodeDirectoryEntrySchema;
75107
76234
  exports.NodeDirectorySchema = NodeDirectorySchema;
76235
+ exports.NodeRecommendationSchema = NodeRecommendationSchema;
75108
76236
  exports.NotificationActionIconSchema = NotificationActionIconSchema;
75109
76237
  exports.NotificationActionSchema = NotificationActionSchema;
75110
76238
  exports.NotificationFormatSchema = NotificationFormatSchema;
75111
76239
  exports.NotificationSchema = NotificationSchema;
75112
76240
  exports.NotifierStatusSchema = NotifierStatusSchema;
75113
76241
  exports.NumericSensorStatusSchema = NumericSensorStatusSchema;
76242
+ exports.OBSERVATION_WINDOW_MS = OBSERVATION_WINDOW_MS;
75114
76243
  exports.OPERATOR_WRITTEN_STALE_MS = OPERATOR_WRITTEN_STALE_MS;
75115
76244
  exports.OPS_LOG_DEFAULT_LIMIT = OPS_LOG_DEFAULT_LIMIT;
75116
76245
  exports.OPS_LOG_RING_DEFAULT_MAX = OPS_LOG_RING_DEFAULT_MAX;
@@ -75184,6 +76313,7 @@ exports.PickedCamStreamSchema = PickedCamStreamSchema;
75184
76313
  exports.PipelineAssignmentSchema = PipelineAssignmentSchema;
75185
76314
  exports.PipelineDefaultStepSchema = PipelineDefaultStepSchema;
75186
76315
  exports.PipelineEngineChoiceSchema = PipelineEngineChoiceSchema;
76316
+ exports.PipelineModelFormatStatusSchema = PipelineModelFormatStatusSchema;
75187
76317
  exports.PipelineRunResultBridge = PipelineRunResultBridge;
75188
76318
  exports.PipelineStepInputSchema = PipelineStepInputSchema;
75189
76319
  exports.PipelineValidationIssueSchema = PipelineValidationIssueSchema;
@@ -75223,6 +76353,7 @@ exports.RATE_CONTROL_TIGHT = RATE_CONTROL_TIGHT;
75223
76353
  exports.REACHABILITY_FAILURES_TO_OFFLINE = REACHABILITY_FAILURES_TO_OFFLINE;
75224
76354
  exports.REACHABILITY_POLL_INTERVAL_MS = REACHABILITY_POLL_INTERVAL_MS;
75225
76355
  exports.REACHABILITY_PROBE_TIMEOUT_MS = REACHABILITY_PROBE_TIMEOUT_MS;
76356
+ exports.RECALL_TIE = RECALL_TIE;
75226
76357
  exports.RECOGNITION_TYPES = RECOGNITION_TYPES;
75227
76358
  exports.RECORDING_AUDIO_TRIGGER_OFFERED_DBFS = RECORDING_AUDIO_TRIGGER_OFFERED_DBFS;
75228
76359
  exports.RECORDING_EXPORT_MAX_READ_BYTES = RECORDING_EXPORT_MAX_READ_BYTES;
@@ -75255,6 +76386,7 @@ exports.ReadinessTimeoutError = require_sleep.ReadinessTimeoutError;
75255
76386
  exports.RebuildObjectEmbeddingsRefusalSchema = RebuildObjectEmbeddingsRefusalSchema;
75256
76387
  exports.RecentTracksPageSchema = RecentTracksPageSchema;
75257
76388
  exports.RecentTracksQueryInput = RecentTracksQueryInput;
76389
+ exports.RecommendationReasonSchema = RecommendationReasonSchema;
75258
76390
  exports.RecordTriggerSchema = RecordTriggerSchema;
75259
76391
  exports.RecordWindowSchema = RecordWindowSchema;
75260
76392
  exports.RecordingAvailabilityForDeviceSchema = RecordingAvailabilityForDeviceSchema;
@@ -75610,6 +76742,7 @@ exports.ZoneRulesArraySchema = ZoneRulesArraySchema;
75610
76742
  exports.ZoneSchema = ZoneSchema;
75611
76743
  exports.ZoneScopeBreakdownSchema = ZoneScopeBreakdownSchema;
75612
76744
  exports.__resetLogChannelRegistryForTests = __resetLogChannelRegistryForTests;
76745
+ exports.acceleratorKindOf = acceleratorKindOf;
75613
76746
  exports.accessoriesCapability = accessoriesCapability;
75614
76747
  exports.accessoryStableId = accessoryStableId;
75615
76748
  exports.actionsForBoundCaps = actionsForBoundCaps;
@@ -75701,6 +76834,7 @@ exports.carbonMonoxideCapability = carbonMonoxideCapability;
75701
76834
  exports.cellsToRects = cellsToRects;
75702
76835
  exports.checkRoleAddress = checkRoleAddress;
75703
76836
  exports.classifyBearerPrincipal = classifyBearerPrincipal;
76837
+ exports.classifyInferenceHardware = classifyInferenceHardware;
75704
76838
  exports.classifyStream = classifyStream;
75705
76839
  exports.classifyStreams = classifyStreams;
75706
76840
  exports.clearModelBoundOverrides = clearModelBoundOverrides;
@@ -75717,6 +76851,7 @@ exports.clusterStepSettingKey = clusterStepSettingKey;
75717
76851
  exports.codecIsAccepted = codecIsAccepted;
75718
76852
  exports.collectHydratedFieldEntries = require_sleep.collectHydratedFieldEntries;
75719
76853
  exports.collectHydratedFieldValues = require_sleep.collectHydratedFieldValues;
76854
+ exports.collectModelBoundKeys = collectModelBoundKeys;
75720
76855
  exports.collectSecretConfigKeys = collectSecretConfigKeys;
75721
76856
  exports.colorCapability = colorCapability;
75722
76857
  exports.colorForKind = colorForKind;
@@ -75848,6 +76983,8 @@ exports.enumerateInferenceDevices = enumerateInferenceDevices;
75848
76983
  exports.enumerateItemArrayFields = enumerateItemArrayFields;
75849
76984
  exports.enumerateSchemaFields = enumerateSchemaFields;
75850
76985
  exports.errMsg = require_err_msg.errMsg;
76986
+ exports.estimateDeviceDemand = estimateDeviceDemand;
76987
+ exports.estimatedConcurrentSessions = estimatedConcurrentSessions;
75851
76988
  exports.evaluateAst = require_composition.evaluateAst;
75852
76989
  exports.evaluateCompositionField = evaluateCompositionField;
75853
76990
  exports.evaluateCount = require_composition.evaluateCount;
@@ -76130,6 +77267,7 @@ exports.readTimelapseGeneratedAt = readTimelapseGeneratedAt;
76130
77267
  exports.readUseRootModel = readUseRootModel;
76131
77268
  exports.readinessKey = require_sleep.readinessKey;
76132
77269
  exports.rebootCapability = rebootCapability;
77270
+ exports.recommendNode = recommendNode;
76133
77271
  exports.reconcileBlockDevices = reconcileBlockDevices;
76134
77272
  exports.recordingArchiveCapability = recordingArchiveCapability;
76135
77273
  exports.recordingCapability = recordingCapability;