@camstack/types 1.2.316 → 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
@@ -5731,6 +5731,40 @@ var ModelFormatEntrySchema = zod.z.object({
5731
5731
  revision: zod.z.string().min(1).optional()
5732
5732
  });
5733
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
+ /**
5734
5768
  * Extra file that must be downloaded alongside the model (e.g., labels JSON, dict.txt).
5735
5769
  * The downloader fetches from `url` and saves to `{modelsDir}/{filename}`.
5736
5770
  */
@@ -26545,7 +26579,7 @@ var FrameRefSchema = zod.z.object({
26545
26579
  timestamp: zod.z.number(),
26546
26580
  capturedAt: zod.z.number().optional()
26547
26581
  });
26548
- var ModelFormatSchema$1 = zod.z.enum([
26582
+ var ModelFormatSchema$2 = zod.z.enum([
26549
26583
  "onnx",
26550
26584
  "coreml",
26551
26585
  "openvino",
@@ -26563,7 +26597,7 @@ var PipelineSlotSchema = zod.z.enum([
26563
26597
  var PipelineEngineChoiceSchema = zod.z.object({
26564
26598
  runtime: zod.z.literal("python"),
26565
26599
  backend: zod.z.string(),
26566
- format: ModelFormatSchema$1,
26600
+ format: ModelFormatSchema$2,
26567
26601
  device: zod.z.string().optional()
26568
26602
  });
26569
26603
  /**
@@ -26621,10 +26655,7 @@ var PipelineTemplateSchema$1 = zod.z.object({
26621
26655
  var PipelineModelOptionSchema = zod.z.object({
26622
26656
  id: zod.z.string(),
26623
26657
  name: zod.z.string(),
26624
- formats: zod.z.record(zod.z.string(), zod.z.object({
26625
- downloaded: zod.z.boolean(),
26626
- sizeMB: zod.z.number()
26627
- })),
26658
+ formats: zod.z.record(zod.z.string(), PipelineModelFormatStatusSchema),
26628
26659
  group: ModelVariantGroupSchema.optional(),
26629
26660
  legacy: zod.z.boolean().optional(),
26630
26661
  provider: ModelProviderIdSchema.optional(),
@@ -26839,6 +26870,32 @@ var pipelineExecutorCapability = {
26839
26870
  auth: "admin"
26840
26871
  }),
26841
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
+ /**
26842
26899
  * Which of THIS node's inference devices the executor currently refuses,
26843
26900
  * and why. `nodeId` is the ROUTING key (stripped by the generated router).
26844
26901
  *
@@ -26933,12 +26990,12 @@ var pipelineExecutorCapability = {
26933
26990
  downloadModel: require_sleep.method(zod.z.object({
26934
26991
  addonId: zod.z.string(),
26935
26992
  modelId: zod.z.string(),
26936
- format: ModelFormatSchema$1
26993
+ format: ModelFormatSchema$2
26937
26994
  }), DownloadModelResultSchema, { kind: "mutation" }),
26938
26995
  deleteModel: require_sleep.method(zod.z.object({
26939
26996
  addonId: zod.z.string(),
26940
26997
  modelId: zod.z.string(),
26941
- format: ModelFormatSchema$1
26998
+ format: ModelFormatSchema$2
26942
26999
  }), zod.z.object({ success: zod.z.literal(true) }), { kind: "mutation" }),
26943
27000
  /**
26944
27001
  * Stateless single-frame execution. Callers (runner, benchmark) pass
@@ -27185,6 +27242,206 @@ var pipelineExecutorCapability = {
27185
27242
  }
27186
27243
  };
27187
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
27188
27445
  //#region src/capabilities/schemas/orchestrator-metrics.ts
27189
27446
  /** Shared Zod schemas for the runtime pipeline orchestrator metrics. */
27190
27447
  var OrchestratorMetricsSchema = zod.z.object({
@@ -29622,6 +29879,27 @@ var pipelineOrchestratorCapability = {
29622
29879
  kind: "mutation",
29623
29880
  auth: "admin"
29624
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
+ }),
29625
29903
  /** Read one camera's settings. Null when never touched (inherits agent defaults fully). */
29626
29904
  getCameraSettings: require_sleep.method(zod.z.object({ deviceId: zod.z.number() }), CameraPipelineSettingsSchema.nullable()),
29627
29905
  /** Set or clear the 3-state toggle for one (camera, addonId). Pass `enabled: null` to clear and revert to agent default. */
@@ -55704,6 +55982,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
55704
55982
  addonId: null,
55705
55983
  access: "delete"
55706
55984
  },
55985
+ "pipelineExecutor.clearModelBoundDeviceOverrides": {
55986
+ capName: "pipeline-executor",
55987
+ capScope: "system",
55988
+ addonId: null,
55989
+ access: "delete"
55990
+ },
55707
55991
  "pipelineExecutor.deleteModel": {
55708
55992
  capName: "pipeline-executor",
55709
55993
  capScope: "system",
@@ -55920,6 +56204,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
55920
56204
  addonId: null,
55921
56205
  access: "view"
55922
56206
  },
56207
+ "pipelineOrchestrator.applyBestSettings": {
56208
+ capName: "pipeline-orchestrator",
56209
+ capScope: "system",
56210
+ addonId: null,
56211
+ access: "create"
56212
+ },
55923
56213
  "pipelineOrchestrator.applyDeviceSettingsPatch": {
55924
56214
  capName: "pipeline-orchestrator",
55925
56215
  capScope: "system",
@@ -56094,6 +56384,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
56094
56384
  addonId: null,
56095
56385
  access: "create"
56096
56386
  },
56387
+ "pipelineOrchestrator.planBestSettings": {
56388
+ capName: "pipeline-orchestrator",
56389
+ capScope: "system",
56390
+ addonId: null,
56391
+ access: "view"
56392
+ },
56097
56393
  "pipelineOrchestrator.rebalance": {
56098
56394
  capName: "pipeline-orchestrator",
56099
56395
  capScope: "system",
@@ -64868,6 +65164,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
64868
65164
  form: "single",
64869
65165
  optional: false
64870
65166
  }],
65167
+ "pipelineExecutor.clearModelBoundDeviceOverrides": [{
65168
+ name: "deviceIds",
65169
+ form: "array",
65170
+ optional: true
65171
+ }],
64871
65172
  "pipelineExecutor.runPipeline": [{
64872
65173
  name: "deviceId",
64873
65174
  form: "single",
@@ -65935,6 +66236,7 @@ var SYSTEM_SCOPE_DEVICE_METHODS = [
65935
66236
  "osdManager.previewSlot",
65936
66237
  "osdManager.renderDevice",
65937
66238
  "osdManager.setSlotBinding",
66239
+ "pipelineExecutor.clearModelBoundDeviceOverrides",
65938
66240
  "pipelineExecutor.runPipeline",
65939
66241
  "pipelineExecutor.runPipelineBatch",
65940
66242
  "pipelineOrchestrator.applyDeviceSettingsPatch",
@@ -66919,6 +67221,7 @@ function createSystemProxy(api) {
66919
67221
  getVideoPipelineSteps: (input) => dispatch("pipelineExecutor", "getVideoPipelineSteps", "query", input),
66920
67222
  setVideoPipelineSteps: (input) => dispatch("pipelineExecutor", "setVideoPipelineSteps", "mutation", input),
66921
67223
  clearDeviceOverrides: (input) => dispatch("pipelineExecutor", "clearDeviceOverrides", "mutation", input),
67224
+ clearModelBoundDeviceOverrides: (input) => dispatch("pipelineExecutor", "clearModelBoundDeviceOverrides", "mutation", input),
66922
67225
  getInferenceDeviceHealth: (input) => dispatch("pipelineExecutor", "getInferenceDeviceHealth", "query", input),
66923
67226
  rearmInferenceDevice: (input) => dispatch("pipelineExecutor", "rearmInferenceDevice", "mutation", input),
66924
67227
  getSchema: (input) => dispatch("pipelineExecutor", "getSchema", "query", input),
@@ -66974,6 +67277,8 @@ function createSystemProxy(api) {
66974
67277
  setAgentInferenceDevices: (input) => dispatch("pipelineOrchestrator", "setAgentInferenceDevices", "mutation", input),
66975
67278
  getNodeInferenceDevices: (input) => dispatch("pipelineOrchestrator", "getNodeInferenceDevices", "query", input),
66976
67279
  resetNodePipelineDefaults: (input) => dispatch("pipelineOrchestrator", "resetNodePipelineDefaults", "mutation", input),
67280
+ planBestSettings: (input) => dispatch("pipelineOrchestrator", "planBestSettings", "query", input),
67281
+ applyBestSettings: (input) => dispatch("pipelineOrchestrator", "applyBestSettings", "mutation", input),
66977
67282
  getCameraStatuses: (input) => dispatch("pipelineOrchestrator", "getCameraStatuses", "query", input),
66978
67283
  setCameraSensors: (input) => dispatch("pipelineOrchestrator", "setCameraSensors", "mutation", input),
66979
67284
  reconcileFromDisk: (input) => dispatch("pipelineOrchestrator", "reconcileFromDisk", "mutation", input),
@@ -71846,41 +72151,6 @@ function isRemovedModelId(stepId, modelId) {
71846
72151
  }
71847
72152
  //#endregion
71848
72153
  //#region src/pipeline/model-bound-settings.ts
71849
- /**
71850
- * Model-bound step settings (D738): an operator value that is only meaningful
71851
- * for ONE model, stored together with that model's id.
71852
- *
71853
- * The per-class confidence floors are the case it exists for. A score is a
71854
- * property of one detector's output scale — on this hub the median score of a
71855
- * correct person was 0.78 on `yolov9m-320-int8`, 0.68 on `yolo26s-320-int8`,
71856
- * 0.40 on `yolo26n-320-int8` and 0.89 on `yolo26s` (640) — so a floor tuned on
71857
- * one model is wrong on the next. The DEFAULT of such a field belongs to the
71858
- * model (the catalog entry); an operator OVERRIDE belongs to the model it was
71859
- * made for.
71860
- *
71861
- * The binding is checked at READ time against the model that RUNS, never
71862
- * enforced by a write on the model-change path: a model can change without any
71863
- * operator write at all (an unpinned root follows the elected device's
71864
- * hardware-aware default, D736), and an event-driven reset could be dropped
71865
- * (events are telemetry, D8/D11). So:
71866
- *
71867
- * effective = override when the stored binding names the running model
71868
- * | override when no binding is stored (a legacy / programmatic
71869
- * value — it applies to whatever runs, as before D738)
71870
- * | the running model's default, when it declares one
71871
- * | the field's global default.
71872
- *
71873
- * Storage shape: the value stays a plain number under its own key (every
71874
- * reader of the raw settings bag keeps working), and the binding is a SIBLING
71875
- * key, {@link modelBindingKey}. Both are flat so the shallow per-key merges of
71876
- * the settings layers (node fold, camera override) carry a value and its
71877
- * binding together whenever one layer writes both — which every writer here
71878
- * does.
71879
- *
71880
- * Lives in the bare `@camstack/types` entry, which every addon bundles, so the
71881
- * runner (`addon-pipeline`) and the editors (`ui-library`, `addon-admin-ui`)
71882
- * apply the same rule.
71883
- */
71884
72154
  /** Suffix of the sibling key that names the model a stored value was made for. */
71885
72155
  var MODEL_BINDING_SUFFIX = "ModelId";
71886
72156
  /** `minConfidencePerson` → `minConfidencePersonModelId`. */
@@ -71969,6 +72239,838 @@ function hasModelBoundOverrides(settings, boundKeys, modelId) {
71969
72239
  function clearModelBoundOverrides(settings, boundKeys, modelId) {
71970
72240
  return boundKeys.reduce((acc, key) => resolveModelBoundSetting(acc, key, modelId, void 0, void 0).source === "override" ? clearModelBoundSetting(acc, key) : acc, { ...settings });
71971
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
+ }
71972
73074
  //#endregion
71973
73075
  //#region src/pipeline/root-face-crop.ts
71974
73076
  /** Side of the square, as a multiple of the face box's longer side. */
@@ -74114,6 +75216,7 @@ exports.AUDIO_PRESETS = require_composition.AUDIO_PRESETS;
74114
75216
  exports.AUDIO_SCALE_EPOCH_ISO = AUDIO_SCALE_EPOCH_ISO;
74115
75217
  exports.AUDIO_SCALE_EPOCH_MS = AUDIO_SCALE_EPOCH_MS;
74116
75218
  exports.AUTOMATIC_HUB_ADDRESS_FLAGS = AUTOMATIC_HUB_ADDRESS_FLAGS;
75219
+ exports.AcceleratorKindSchema = AcceleratorKindSchema;
74117
75220
  exports.AccessoriesStatusSchema = AccessoriesStatusSchema;
74118
75221
  exports.AccessoryKind = AccessoryKind;
74119
75222
  exports.AddBrokerInputSchema = AddBrokerInputSchema;
@@ -74192,6 +75295,7 @@ exports.BASE_DEVICE_CAPS = BASE_DEVICE_CAPS;
74192
75295
  exports.BASE_LIVE_EGRESS_PROFILE = BASE_LIVE_EGRESS_PROFILE;
74193
75296
  exports.BATTERY_DEVICE_PROFILE = BATTERY_DEVICE_PROFILE;
74194
75297
  exports.BATTERY_UNREACHABLE_AFTER_MS = BATTERY_UNREACHABLE_AFTER_MS;
75298
+ exports.BEST_SETTINGS_FAMILY = BEST_SETTINGS_FAMILY;
74195
75299
  exports.BIRTH_DECISION_DEFAULT_LIMIT = BIRTH_DECISION_DEFAULT_LIMIT;
74196
75300
  exports.BOOT_RECOVERY_BACKOFF_MS = require_sleep.BOOT_RECOVERY_BACKOFF_MS;
74197
75301
  exports.BUILTIN_RESULT_KINDS = BUILTIN_RESULT_KINDS;
@@ -74207,6 +75311,12 @@ exports.BaseAddon = require_sleep.BaseAddon;
74207
75311
  exports.BaseDevice = BaseDevice;
74208
75312
  exports.BaseDeviceProvider = BaseDeviceProvider;
74209
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;
74210
75320
  exports.BinaryStatusSchema = BinaryStatusSchema;
74211
75321
  exports.BirthDecisionQueryInputSchema = BirthDecisionQueryInputSchema;
74212
75322
  exports.BirthDecisionRecordSchema = BirthDecisionRecordSchema;
@@ -74309,6 +75419,7 @@ exports.CameraMetricsSchema = CameraMetricsSchema;
74309
75419
  exports.CameraMetricsWithDeviceIdSchema = CameraMetricsWithDeviceIdSchema;
74310
75420
  exports.CameraMotionStatusSchema = CameraMotionStatusSchema;
74311
75421
  exports.CameraOccupancySnapshotForDeviceSchema = CameraOccupancySnapshotForDeviceSchema;
75422
+ exports.CameraOverrideClearSchema = CameraOverrideClearSchema;
74312
75423
  exports.CameraOwnMotionSchema = CameraOwnMotionSchema;
74313
75424
  exports.CameraRawLevelSchema = CameraRawLevelSchema;
74314
75425
  exports.CameraRecordingModeSchema = CameraRecordingModeSchema;
@@ -74466,11 +75577,13 @@ exports.DEFAULT_CLUSTER_STEP_MODELS = DEFAULT_CLUSTER_STEP_MODELS;
74466
75577
  exports.DEFAULT_CLUSTER_STEP_SETTINGS = DEFAULT_CLUSTER_STEP_SETTINGS;
74467
75578
  exports.DEFAULT_CORE_BLOCK_ENTRY = DEFAULT_CORE_BLOCK_ENTRY;
74468
75579
  exports.DEFAULT_DECODER_HWACCEL_CONFIG = DEFAULT_DECODER_HWACCEL_CONFIG;
75580
+ exports.DEFAULT_DEMAND_OPTIONS = DEFAULT_DEMAND_OPTIONS;
74469
75581
  exports.DEFAULT_DETAIL_CROP_CONVENTION = DEFAULT_DETAIL_CROP_CONVENTION;
74470
75582
  exports.DEFAULT_EVENTS_BAND_BUFFER_SEC = DEFAULT_EVENTS_BAND_BUFFER_SEC;
74471
75583
  exports.DEFAULT_EVENT_COLOR = DEFAULT_EVENT_COLOR;
74472
75584
  exports.DEFAULT_FEATURES = DEFAULT_FEATURES;
74473
75585
  exports.DEFAULT_FIRST_SIGHTING_FRESHNESS_MS = require_composition.DEFAULT_FIRST_SIGHTING_FRESHNESS_MS;
75586
+ exports.DEFAULT_HEADROOM = DEFAULT_HEADROOM;
74474
75587
  exports.DEFAULT_MIN_LANDMARK_FACE_SIZE_PX = DEFAULT_MIN_LANDMARK_FACE_SIZE_PX;
74475
75588
  exports.DEFAULT_NATIVE_LEASE_SETTINGS = DEFAULT_NATIVE_LEASE_SETTINGS;
74476
75589
  exports.DEFAULT_OVERLAY_LAYERS = DEFAULT_OVERLAY_LAYERS;
@@ -74487,6 +75600,8 @@ exports.DETAIL_CROP_SECTION_ID = DETAIL_CROP_SECTION_ID;
74487
75600
  exports.DETAIL_CROP_SQUARE_KEY = DETAIL_CROP_SQUARE_KEY;
74488
75601
  exports.DETECTION_MACRO_CLASSES = DETECTION_MACRO_CLASSES;
74489
75602
  exports.DETECTION_PIPELINE_CAP_NAME = DETECTION_PIPELINE_CAP_NAME;
75603
+ exports.DETECTOR_ACCURACY = DETECTOR_ACCURACY;
75604
+ exports.DETECTOR_PERF = DETECTOR_PERF;
74490
75605
  exports.DEVICE_BACKEND_TO_FORMAT = DEVICE_BACKEND_TO_FORMAT;
74491
75606
  exports.DEVICE_CAP_NAMES = DEVICE_CAP_NAMES;
74492
75607
  exports.DEVICE_CHILDREN_BATCH_MAX = require_sleep.DEVICE_CHILDREN_BATCH_MAX;
@@ -74524,16 +75639,20 @@ exports.DetailCropConventionSchema = DetailCropConventionSchema;
74524
75639
  exports.DetectionCatalogClassMapSchema = DetectionCatalogClassMapSchema;
74525
75640
  exports.DetectionSourceSchema = DetectionSourceSchema;
74526
75641
  exports.DetectionSourcesSchema = DetectionSourcesSchema;
75642
+ exports.DetectorStoreClearSchema = DetectorStoreClearSchema;
74527
75643
  exports.DeviceAdminLinkSchema = DeviceAdminLinkSchema;
74528
75644
  exports.DeviceCodeSeveritySchema = DeviceCodeSeveritySchema;
74529
75645
  exports.DeviceConfig = DeviceConfig;
75646
+ exports.DeviceDemandSchema = DeviceDemandSchema;
74530
75647
  exports.DeviceDiscoveryStatusSchema = DeviceDiscoveryStatusSchema;
74531
75648
  exports.DeviceExportExposeInputSchema = ExposeInputSchema;
74532
75649
  exports.DeviceExportStatusSchema = DeviceExportStatusSchema;
74533
75650
  exports.DeviceExportUnexposeInputSchema = UnexposeInputSchema;
74534
75651
  exports.DeviceFeature = require_err_msg.DeviceFeature;
74535
75652
  exports.DeviceInfoSchema = DeviceInfoSchema;
75653
+ exports.DeviceModelChoiceSchema = DeviceModelChoiceSchema;
74536
75654
  exports.DeviceNetworkStatsSchema = DeviceNetworkStatsSchema;
75655
+ exports.DeviceRecommendationSchema = DeviceRecommendationSchema;
74537
75656
  exports.DeviceRestoreRetryScheduler = DeviceRestoreRetryScheduler;
74538
75657
  exports.DeviceRole = require_err_msg.DeviceRole;
74539
75658
  exports.DeviceRuntimeState = DeviceRuntimeState;
@@ -74686,6 +75805,7 @@ exports.HOURS_PER_DAY = HOURS_PER_DAY;
74686
75805
  exports.HUB_ADDRESS_ROLES = HUB_ADDRESS_ROLES;
74687
75806
  exports.HUB_VIEWER_MOUNT = HUB_VIEWER_MOUNT;
74688
75807
  exports.HWACCEL_OPTIONS = HWACCEL_OPTIONS;
75808
+ exports.HardwareClassIdSchema = HardwareClassIdSchema;
74689
75809
  exports.HealthStatusSchema = HealthStatusSchema;
74690
75810
  exports.HfModelResolutionSchema = HfModelResolutionSchema;
74691
75811
  exports.HistoryPointSchema = HistoryPointSchema;
@@ -74868,8 +75988,11 @@ exports.ModelDistributeInputSchema = ModelDistributeInputSchema;
74868
75988
  exports.ModelDistributeResultSchema = ModelDistributeResultSchema;
74869
75989
  exports.ModelExtraFileSchema = ModelExtraFileSchema;
74870
75990
  exports.ModelFormatEntrySchema = ModelFormatEntrySchema;
75991
+ exports.ModelFormatPrecisionSchema = ModelFormatPrecisionSchema;
74871
75992
  exports.ModelFormatsSchema = ModelFormatsSchema;
74872
75993
  exports.ModelLicenseSchema = ModelLicenseSchema;
75994
+ exports.ModelOnDiskStateSchema = ModelOnDiskStateSchema;
75995
+ exports.ModelPinChangeSchema = ModelPinChangeSchema;
74873
75996
  exports.ModelProviderIdSchema = ModelProviderIdSchema;
74874
75997
  exports.ModelSubstitutionSchema = ModelSubstitutionSchema;
74875
75998
  exports.ModelVariantGroupSchema = ModelVariantGroupSchema;
@@ -75106,14 +76229,17 @@ exports.NetworkAccessStatusSchema = NetworkAccessStatusSchema;
75106
76229
  exports.NetworkAddressSchema = NetworkAddressSchema;
75107
76230
  exports.NetworkEndpointSchema = NetworkEndpointSchema;
75108
76231
  exports.NetworkLinkStatusSchema = NetworkLinkStatusSchema;
76232
+ exports.NodeDeviceChangeSchema = NodeDeviceChangeSchema;
75109
76233
  exports.NodeDirectoryEntrySchema = NodeDirectoryEntrySchema;
75110
76234
  exports.NodeDirectorySchema = NodeDirectorySchema;
76235
+ exports.NodeRecommendationSchema = NodeRecommendationSchema;
75111
76236
  exports.NotificationActionIconSchema = NotificationActionIconSchema;
75112
76237
  exports.NotificationActionSchema = NotificationActionSchema;
75113
76238
  exports.NotificationFormatSchema = NotificationFormatSchema;
75114
76239
  exports.NotificationSchema = NotificationSchema;
75115
76240
  exports.NotifierStatusSchema = NotifierStatusSchema;
75116
76241
  exports.NumericSensorStatusSchema = NumericSensorStatusSchema;
76242
+ exports.OBSERVATION_WINDOW_MS = OBSERVATION_WINDOW_MS;
75117
76243
  exports.OPERATOR_WRITTEN_STALE_MS = OPERATOR_WRITTEN_STALE_MS;
75118
76244
  exports.OPS_LOG_DEFAULT_LIMIT = OPS_LOG_DEFAULT_LIMIT;
75119
76245
  exports.OPS_LOG_RING_DEFAULT_MAX = OPS_LOG_RING_DEFAULT_MAX;
@@ -75187,6 +76313,7 @@ exports.PickedCamStreamSchema = PickedCamStreamSchema;
75187
76313
  exports.PipelineAssignmentSchema = PipelineAssignmentSchema;
75188
76314
  exports.PipelineDefaultStepSchema = PipelineDefaultStepSchema;
75189
76315
  exports.PipelineEngineChoiceSchema = PipelineEngineChoiceSchema;
76316
+ exports.PipelineModelFormatStatusSchema = PipelineModelFormatStatusSchema;
75190
76317
  exports.PipelineRunResultBridge = PipelineRunResultBridge;
75191
76318
  exports.PipelineStepInputSchema = PipelineStepInputSchema;
75192
76319
  exports.PipelineValidationIssueSchema = PipelineValidationIssueSchema;
@@ -75226,6 +76353,7 @@ exports.RATE_CONTROL_TIGHT = RATE_CONTROL_TIGHT;
75226
76353
  exports.REACHABILITY_FAILURES_TO_OFFLINE = REACHABILITY_FAILURES_TO_OFFLINE;
75227
76354
  exports.REACHABILITY_POLL_INTERVAL_MS = REACHABILITY_POLL_INTERVAL_MS;
75228
76355
  exports.REACHABILITY_PROBE_TIMEOUT_MS = REACHABILITY_PROBE_TIMEOUT_MS;
76356
+ exports.RECALL_TIE = RECALL_TIE;
75229
76357
  exports.RECOGNITION_TYPES = RECOGNITION_TYPES;
75230
76358
  exports.RECORDING_AUDIO_TRIGGER_OFFERED_DBFS = RECORDING_AUDIO_TRIGGER_OFFERED_DBFS;
75231
76359
  exports.RECORDING_EXPORT_MAX_READ_BYTES = RECORDING_EXPORT_MAX_READ_BYTES;
@@ -75258,6 +76386,7 @@ exports.ReadinessTimeoutError = require_sleep.ReadinessTimeoutError;
75258
76386
  exports.RebuildObjectEmbeddingsRefusalSchema = RebuildObjectEmbeddingsRefusalSchema;
75259
76387
  exports.RecentTracksPageSchema = RecentTracksPageSchema;
75260
76388
  exports.RecentTracksQueryInput = RecentTracksQueryInput;
76389
+ exports.RecommendationReasonSchema = RecommendationReasonSchema;
75261
76390
  exports.RecordTriggerSchema = RecordTriggerSchema;
75262
76391
  exports.RecordWindowSchema = RecordWindowSchema;
75263
76392
  exports.RecordingAvailabilityForDeviceSchema = RecordingAvailabilityForDeviceSchema;
@@ -75613,6 +76742,7 @@ exports.ZoneRulesArraySchema = ZoneRulesArraySchema;
75613
76742
  exports.ZoneSchema = ZoneSchema;
75614
76743
  exports.ZoneScopeBreakdownSchema = ZoneScopeBreakdownSchema;
75615
76744
  exports.__resetLogChannelRegistryForTests = __resetLogChannelRegistryForTests;
76745
+ exports.acceleratorKindOf = acceleratorKindOf;
75616
76746
  exports.accessoriesCapability = accessoriesCapability;
75617
76747
  exports.accessoryStableId = accessoryStableId;
75618
76748
  exports.actionsForBoundCaps = actionsForBoundCaps;
@@ -75704,6 +76834,7 @@ exports.carbonMonoxideCapability = carbonMonoxideCapability;
75704
76834
  exports.cellsToRects = cellsToRects;
75705
76835
  exports.checkRoleAddress = checkRoleAddress;
75706
76836
  exports.classifyBearerPrincipal = classifyBearerPrincipal;
76837
+ exports.classifyInferenceHardware = classifyInferenceHardware;
75707
76838
  exports.classifyStream = classifyStream;
75708
76839
  exports.classifyStreams = classifyStreams;
75709
76840
  exports.clearModelBoundOverrides = clearModelBoundOverrides;
@@ -75720,6 +76851,7 @@ exports.clusterStepSettingKey = clusterStepSettingKey;
75720
76851
  exports.codecIsAccepted = codecIsAccepted;
75721
76852
  exports.collectHydratedFieldEntries = require_sleep.collectHydratedFieldEntries;
75722
76853
  exports.collectHydratedFieldValues = require_sleep.collectHydratedFieldValues;
76854
+ exports.collectModelBoundKeys = collectModelBoundKeys;
75723
76855
  exports.collectSecretConfigKeys = collectSecretConfigKeys;
75724
76856
  exports.colorCapability = colorCapability;
75725
76857
  exports.colorForKind = colorForKind;
@@ -75851,6 +76983,8 @@ exports.enumerateInferenceDevices = enumerateInferenceDevices;
75851
76983
  exports.enumerateItemArrayFields = enumerateItemArrayFields;
75852
76984
  exports.enumerateSchemaFields = enumerateSchemaFields;
75853
76985
  exports.errMsg = require_err_msg.errMsg;
76986
+ exports.estimateDeviceDemand = estimateDeviceDemand;
76987
+ exports.estimatedConcurrentSessions = estimatedConcurrentSessions;
75854
76988
  exports.evaluateAst = require_composition.evaluateAst;
75855
76989
  exports.evaluateCompositionField = evaluateCompositionField;
75856
76990
  exports.evaluateCount = require_composition.evaluateCount;
@@ -76133,6 +77267,7 @@ exports.readTimelapseGeneratedAt = readTimelapseGeneratedAt;
76133
77267
  exports.readUseRootModel = readUseRootModel;
76134
77268
  exports.readinessKey = require_sleep.readinessKey;
76135
77269
  exports.rebootCapability = rebootCapability;
77270
+ exports.recommendNode = recommendNode;
76136
77271
  exports.reconcileBlockDevices = reconcileBlockDevices;
76137
77272
  exports.recordingArchiveCapability = recordingArchiveCapability;
76138
77273
  exports.recordingCapability = recordingCapability;