@camstack/addon-pipeline 1.2.106 → 1.2.115

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.
Files changed (35) hide show
  1. package/dist/{addon-utils-BEzVJ0xg.js → addon-utils-C0ht2KPO.js} +51 -15
  2. package/dist/{addon-utils-A2S9D7pu.mjs → addon-utils-CgBCF-mE.mjs} +50 -14
  3. package/dist/audio-analyzer/index.js +3 -3
  4. package/dist/audio-analyzer/index.mjs +3 -3
  5. package/dist/detection-pipeline/index.js +198 -38
  6. package/dist/detection-pipeline/index.mjs +197 -37
  7. package/dist/{dist-BSeR_hVv.js → dist-BqIbYW1A.js} +290 -17
  8. package/dist/{dist-lITI1Bn5.mjs → dist-DGQkkWc6.mjs} +273 -18
  9. package/dist/{event-loop-stall-monitor-0VvjTRDP.mjs → event-loop-stall-monitor-D5jK5v4Z.mjs} +223 -2
  10. package/dist/{event-loop-stall-monitor-BNsp9k8r.js → event-loop-stall-monitor-ylMGpz48.js} +234 -1
  11. package/dist/{lazy-sharp-CBohM8D8.js → lazy-sharp-cOsy7l_P.js} +1 -1
  12. package/dist/motion-wasm/index.js +2 -2
  13. package/dist/motion-wasm/index.mjs +1 -1
  14. package/dist/pipeline-runner/index.js +915 -107
  15. package/dist/pipeline-runner/index.mjs +914 -106
  16. package/dist/{process-memory-C33u3tQz.js → process-memory-45juuHpN.js} +1 -1
  17. package/dist/{process-memory-CEKVKfwg.mjs → process-memory-BtT7WfbJ.mjs} +1 -1
  18. package/dist/recorder/index.js +187 -47
  19. package/dist/recorder/index.mjs +187 -47
  20. package/dist/session-decode/decode-worker-child.js +30 -10
  21. package/dist/session-decode/decode-worker-child.mjs +29 -9
  22. package/dist/stream-broker/_stub.js +2 -2
  23. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-w2XLD3uI.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-C_SFFNGT.mjs} +3 -3
  24. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-B1LDFHY9.mjs +26 -0
  25. package/dist/stream-broker/{_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-DsIi4G5Q.mjs → _virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BAMyzCWw.mjs} +1 -1
  26. package/dist/stream-broker/{hostInit-B-h24cDy.mjs → hostInit-CG28NvlV.mjs} +3 -3
  27. package/dist/stream-broker/index.js +279 -198
  28. package/dist/stream-broker/index.mjs +279 -198
  29. package/dist/stream-broker/remoteEntry.js +1 -1
  30. package/dist/{worker-protocol-CiKfal2P.js → worker-protocol-CIrqGbpG.js} +6 -3
  31. package/dist/{worker-protocol-BDiL8TBm.mjs → worker-protocol-DyocTIx_.mjs} +6 -3
  32. package/package.json +1 -1
  33. package/python/inference_pool.py +4 -1
  34. package/python/test_inference_pool_preprocess.py +87 -16
  35. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DvZWLWk1.mjs +0 -26
@@ -9058,6 +9058,15 @@ var LabelDefinitionSchema = object({
9058
9058
  description: string().optional(),
9059
9059
  icon: string().optional()
9060
9060
  });
9061
+ var ClassMapDefinitionSchema = object({
9062
+ mapping: record(string(), _enum([
9063
+ "person",
9064
+ "vehicle",
9065
+ "animal",
9066
+ "package"
9067
+ ])),
9068
+ preserveOriginal: boolean()
9069
+ });
9061
9070
  var MODEL_FORMATS = [
9062
9071
  "onnx",
9063
9072
  "coreml",
@@ -9236,7 +9245,13 @@ var ModelCatalogEntrySchema = object({
9236
9245
  * `id` stays the source of truth for resolution/download/persistence; grouping
9237
9246
  * is a presentation overlay resolved back to an `id`.
9238
9247
  */
9239
- group: ModelVariantGroupSchema.optional()
9248
+ group: ModelVariantGroupSchema.optional(),
9249
+ /**
9250
+ * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
9251
+ * applies (Frigate / COCO public catalog). Set on a custom model whose raw
9252
+ * labels already ARE the CamStack macros (Scrypted identity map).
9253
+ */
9254
+ classMap: ClassMapDefinitionSchema.optional()
9240
9255
  });
9241
9256
  var ConvertTargetSchema = discriminatedUnion("format", [object({
9242
9257
  format: literal("openvino"),
@@ -9265,7 +9280,8 @@ var ModelConvertMetadataSchema = object({
9265
9280
  "ocr",
9266
9281
  "segmentation"
9267
9282
  ]),
9268
- faceAlignment: boolean().optional()
9283
+ faceAlignment: boolean().optional(),
9284
+ classMap: ClassMapDefinitionSchema.optional()
9269
9285
  });
9270
9286
  var ConvertResultSchema = object({
9271
9287
  entry: ModelCatalogEntrySchema,
@@ -19049,6 +19065,33 @@ var NativeCropRefSchema = object({
19049
19065
  h: number()
19050
19066
  })
19051
19067
  });
19068
+ object({
19069
+ crop: object({
19070
+ left: number(),
19071
+ top: number(),
19072
+ width: number().positive(),
19073
+ height: number().positive()
19074
+ }).optional(),
19075
+ content: object({
19076
+ width: number().int().positive(),
19077
+ height: number().int().positive()
19078
+ }),
19079
+ fit: _enum(["stretch", "contain"]),
19080
+ format: _enum([
19081
+ "rgb",
19082
+ "gray",
19083
+ "jpeg"
19084
+ ])
19085
+ });
19086
+ var FrameRefSchema = object({
19087
+ registryId: string().min(1),
19088
+ id: string().min(1),
19089
+ width: number().int().positive(),
19090
+ height: number().int().positive(),
19091
+ format: _enum(["rgb", "gray"]),
19092
+ timestamp: number(),
19093
+ capturedAt: number().optional()
19094
+ });
19052
19095
  var ModelFormatSchema$1 = _enum([
19053
19096
  "onnx",
19054
19097
  "coreml",
@@ -19369,7 +19412,7 @@ var pipelineExecutorCapability = {
19369
19412
  * legacy call shape used by existing benchmark code; once all
19370
19413
  * callers pass it explicitly we make it required.
19371
19414
  *
19372
- * Exactly one of `frame`, `frameHandle`, `imageBase64`,
19415
+ * Exactly one of `frame`, `frameRef`, `frameHandle`, `imageBase64`,
19373
19416
  * `referenceImage` must be provided:
19374
19417
  * - `frame`: runtime dispatch path (runner → decoded broker frame).
19375
19418
  * Carries the raw buffer, dimensions, and format; the executor
@@ -19391,6 +19434,12 @@ var pipelineExecutorCapability = {
19391
19434
  steps: array(PipelineStepInputSchema).min(1),
19392
19435
  frame: FrameInputSchema.optional(),
19393
19436
  /**
19437
+ * Process-local lazy frame. Valid only when caller and provider resolve
19438
+ * in the same execution-group process; split/cross-node callers use
19439
+ * `frame`/`image` inline compatibility instead.
19440
+ */
19441
+ frameRef: FrameRefSchema.optional(),
19442
+ /**
19394
19443
  * CB5 shm passthrough — a `FrameHandle` naming the same ring slot
19395
19444
  * the decoded pixels live in. One more member of the one-of
19396
19445
  * frame/frameHandle/image/imageBase64/referenceImage group.
@@ -19700,7 +19749,10 @@ var NativeCropResultSchema = object({
19700
19749
  * Which source served this crop, so a quality-sensitive consumer (the native
19701
19750
  * `keyFrame`) can reject a degraded fallback:
19702
19751
  * - `native` — cut from the decode worker's retained NATIVE surface (the
19703
- * quality path).
19752
+ * quality path). A subject-tile serve is also native-resolution and stays
19753
+ * `native` here: the public enum cannot name `tile` without a breaking cap
19754
+ * change. Runner telemetry distinguishes lease vs tile via `source` on the
19755
+ * internal crop result (`nativeHits` vs `tileHits`).
19704
19756
  * - `ram-fullframe` — the native surface MISSED but the request was full-frame,
19705
19757
  * so the ≤640 RAM `RetainedFrameStore` served it (honest lower-res; legit for
19706
19758
  * the blank-frame guard / 640-snapshot resolve, NOT for the clean keyFrame).
@@ -20191,12 +20243,41 @@ var RunnerLocalLoadSchema = object({
20191
20243
  * legacy `OrchestratorMetricsSchema` shape so existing dashboards keep
20192
20244
  * working unchanged when they switch to reading from the runner cap.
20193
20245
  */
20246
+ var FrameLazyCountersSchema = object({
20247
+ framesDecoded: number(),
20248
+ framesAdmitted: number(),
20249
+ framesDroppedPixelFree: number(),
20250
+ viewsMaterialized: number(),
20251
+ viewsSkipped: number(),
20252
+ workerToRunnerBytes: number(),
20253
+ runnerToPoolRawBytes: number(),
20254
+ runnerToPoolJpegBytes: number(),
20255
+ onDemandFullFrameRequests: number(),
20256
+ onDemandCropRequests: number(),
20257
+ nativeHits: number(),
20258
+ nativeMisses: number(),
20259
+ tileHits: number(),
20260
+ tileMisses: number(),
20261
+ fallbackHits: number(),
20262
+ fallbackMisses: number(),
20263
+ retainedWritesAvoided: number(),
20264
+ residentRefs: number(),
20265
+ residentBytes: number(),
20266
+ releases: number(),
20267
+ evictions: number(),
20268
+ staleMisses: number()
20269
+ });
20270
+ var FrameLazyMetricsSchema = object({
20271
+ node: FrameLazyCountersSchema,
20272
+ cameras: array(FrameLazyCountersSchema.extend({ deviceId: number() }))
20273
+ });
20194
20274
  var RunnerLocalMetricsSchema = object({
20195
20275
  nodeId: string(),
20196
20276
  activeCameras: number(),
20197
20277
  throttledCameras: number(),
20198
20278
  avgInferenceTimeMs: number(),
20199
- queueDepth: number()
20279
+ queueDepth: number(),
20280
+ frameLazy: FrameLazyMetricsSchema.optional()
20200
20281
  });
20201
20282
  /**
20202
20283
  * Pipeline Runner capability — runtime detection workhorse.
@@ -21653,6 +21734,9 @@ method(_void(), ProviderInfoSchema), method(object({ config: record(string(), un
21653
21734
  location: StorageLocationSchema,
21654
21735
  relativePath: string()
21655
21736
  }), _void(), { kind: "mutation" }), method(object({ location: StorageLocationSchema }), number().nullable()), method(BeginUploadInputSchema, BeginUploadResultSchema, { kind: "mutation" }), method(WriteChunkInputSchema, _void(), { kind: "mutation" }), method(FinalizeUploadInputSchema, _void(), { kind: "mutation" }), method(AbortUploadInputSchema, _void(), { kind: "mutation" }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, { kind: "mutation" }), method(ReadChunkInputSchema, _instanceof(Uint8Array)), method(EndDownloadInputSchema, _void(), { kind: "mutation" });
21737
+ /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
21738
+ var ProfileSettingsSchemaBridge = unknown().nullable();
21739
+ var ProfileSettingsBagSchema = record(string(), unknown());
21656
21740
  /**
21657
21741
  * A live terminal session hosted by the provider addon. Output and input do
21658
21742
  * NOT flow through the capability — they use the addon data plane
@@ -21682,7 +21766,14 @@ var TerminalSessionInfoSchema = object({
21682
21766
  var TerminalProfileInfoSchema = object({
21683
21767
  profileId: string(),
21684
21768
  label: string(),
21685
- description: string().optional()
21769
+ description: string().optional(),
21770
+ /** Spawn defaults the instance form copies on create. */
21771
+ executable: string().optional(),
21772
+ args: array(string()).readonly().optional(),
21773
+ cwd: string().optional(),
21774
+ environment: array(string()).readonly().optional(),
21775
+ /** ConfigUISchema for instance knobs, or null when the profile has none. */
21776
+ settingsSchema: ProfileSettingsSchemaBridge.optional()
21686
21777
  });
21687
21778
  /**
21688
21779
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -21695,7 +21786,12 @@ var TerminalInstanceInfoSchema = object({
21695
21786
  profileId: string(),
21696
21787
  profileLabel: string(),
21697
21788
  name: string(),
21698
- enabled: boolean()
21789
+ enabled: boolean(),
21790
+ executable: string(),
21791
+ args: array(string()).readonly(),
21792
+ cwd: string(),
21793
+ environment: array(string()).readonly(),
21794
+ profileSettings: ProfileSettingsBagSchema
21699
21795
  });
21700
21796
  var TerminalLegacyCameraSchema = object({
21701
21797
  stableId: string(),
@@ -21725,7 +21821,23 @@ var TerminalOutputBatchSchema = object({
21725
21821
  method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }), method(_void(), array(TerminalInstanceInfoSchema).readonly(), { auth: "admin" }), method(object({
21726
21822
  targetNodeId: string().min(1),
21727
21823
  profileId: string().min(1),
21728
- name: string().trim().min(1).max(160).optional()
21824
+ name: string().trim().min(1).max(160).optional(),
21825
+ executable: string().max(1024).optional(),
21826
+ args: array(string().max(2048)).max(64).optional(),
21827
+ cwd: string().max(1024).optional(),
21828
+ environment: array(string().max(4096)).max(64).optional(),
21829
+ profileSettings: ProfileSettingsBagSchema.optional()
21830
+ }), TerminalInstanceInfoSchema, {
21831
+ kind: "mutation",
21832
+ auth: "admin"
21833
+ }), method(object({
21834
+ instanceId: string().min(1),
21835
+ name: string().trim().min(1).max(160).optional(),
21836
+ executable: string().max(1024).optional(),
21837
+ args: array(string().max(2048)).max(64).optional(),
21838
+ cwd: string().max(1024).optional(),
21839
+ environment: array(string().max(4096)).max(64).optional(),
21840
+ profileSettings: ProfileSettingsBagSchema.optional()
21729
21841
  }), TerminalInstanceInfoSchema, {
21730
21842
  kind: "mutation",
21731
21843
  auth: "admin"
@@ -21747,7 +21859,11 @@ method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }),
21747
21859
  }), method(_void(), array(TerminalSessionInfoSchema).readonly(), { auth: "admin" }), method(object({
21748
21860
  profileId: string(),
21749
21861
  cols: number().int().positive(),
21750
- rows: number().int().positive()
21862
+ rows: number().int().positive(),
21863
+ executable: string().max(1024).optional(),
21864
+ args: array(string().max(2048)).max(64).optional(),
21865
+ cwd: string().max(1024).optional(),
21866
+ environment: array(string().max(4096)).max(64).optional()
21751
21867
  }), TerminalSessionInfoSchema, {
21752
21868
  kind: "mutation",
21753
21869
  auth: "admin"
@@ -24676,10 +24792,10 @@ DeviceType.LawnMower, method(object({ deviceId: number().int().nonnegative() }),
24676
24792
  *
24677
24793
  * • The SDK (mobile / web client) consumes `getConnectionEndpoints()`
24678
24794
  * to receive an ordered list of candidate base URLs it should race
24679
- * on connect — LAN IPv4 first (lowest latency when on same network),
24680
- * then public hostname (if a tunnel is up), then IPv6. The SDK can
24681
- * race them with short timeouts and stick with the winner for the
24682
- * session.
24795
+ * on connect — LAN IPv4 and stable LAN IPv6 first (lowest latency
24796
+ * when on the same network), then public hostname (if a tunnel is
24797
+ * up). The SDK can race them with short timeouts and stick with the
24798
+ * winner for the session.
24683
24799
  *
24684
24800
  * Why hub-only: agents are not directly addressable by the operator's
24685
24801
  * clients — they reverse-connect to the hub. Exposing their interfaces
@@ -24834,6 +24950,17 @@ var NotificationEndpointSchema = object({
24834
24950
  /** What the ranking currently resolves to (null when nothing is reachable). */
24835
24951
  resolved: string().nullable()
24836
24952
  });
24953
+ /**
24954
+ * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
24955
+ * AUTO (every LAN IPv4 + the public tunnel). `resolved` is what that choice
24956
+ * currently expands to, so the UI can show the effective set either way.
24957
+ */
24958
+ var ViewerEndpointsSchema = object({
24959
+ /** The operator's explicit race set, or empty for AUTO. */
24960
+ baseUrls: array(string()).readonly(),
24961
+ /** What the ranking currently resolves to (may be empty if nothing is up). */
24962
+ resolved: array(string()).readonly()
24963
+ });
24837
24964
  var AllowedAddressesSchema = object({
24838
24965
  /**
24839
24966
  * Allowlist of interface addresses operators have explicitly opted
@@ -24842,6 +24969,20 @@ var AllowedAddressesSchema = object({
24842
24969
  * Network Addresses admin page and persisted by the addon.
24843
24970
  */
24844
24971
  addresses: array(string()).readonly() });
24972
+ var TlsStatusSchema = object({
24973
+ mode: _enum([
24974
+ "generated",
24975
+ "uploaded",
24976
+ "disabled"
24977
+ ]),
24978
+ leafFingerprintSha256: string().nullable(),
24979
+ caFingerprintSha256: string().nullable(),
24980
+ validTo: string().nullable(),
24981
+ sans: array(string()),
24982
+ caCertPem: string().nullable(),
24983
+ reissueError: string().nullable(),
24984
+ restartRequired: boolean()
24985
+ });
24845
24986
  method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
24846
24987
  /**
24847
24988
  * LEGACY HINT — do not send from new code. Kept optional so clients
@@ -24851,17 +24992,31 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
24851
24992
  */
24852
24993
  port: number().int().min(1).max(65535).optional(),
24853
24994
  /** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
24854
- * candidate. Default `true`. */
24995
+ * candidate. Default `false` — loopback is not a client route. */
24855
24996
  includeLoopback: boolean().optional(),
24856
- /** Skip IPv6 entries. Some legacy clients can't parse them.
24857
- * Default `false`. */
24997
+ /** Skip IPv6 entries. Default `false` the palette includes stable
24998
+ * LAN IPv6 (ICE/WebRTC uses dual-stack regardless). Pass `true` to
24999
+ * hide them. The viewer HTTP/WS race is `getViewerEndpoints`. */
24858
25000
  ipv4Only: boolean().optional(),
24859
25001
  /** Scheme to emit for LAN/loopback URLs. Default `'http'`.
24860
25002
  * Pass `'https'` when the caller is itself loaded over HTTPS
24861
25003
  * to avoid mixed-content blocks in the browser. The public
24862
25004
  * tunnel always emits `https://` regardless. */
24863
25005
  scheme: _enum(["http", "https"]).optional()
24864
- }), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" });
25006
+ }), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), ViewerEndpointsSchema), method(object({ baseUrls: array(string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" }), method(_void(), TlsStatusSchema), method(object({ reason: string().optional() }), TlsStatusSchema, {
25007
+ kind: "mutation",
25008
+ auth: "admin"
25009
+ }), method(object({
25010
+ certPem: string().min(1),
25011
+ keyPem: string().min(1),
25012
+ caPem: string().optional()
25013
+ }), TlsStatusSchema, {
25014
+ kind: "mutation",
25015
+ auth: "admin"
25016
+ }), method(_void(), object({ pem: string() })), method(_void(), TlsStatusSchema, {
25017
+ kind: "mutation",
25018
+ auth: "admin"
25019
+ });
24865
25020
  object({
24866
25021
  /** Lifecycle state of the lock. `jammed` means the motor reported
24867
25022
  * failure to reach the target — operator intervention required. */
@@ -30796,6 +30951,12 @@ Object.freeze({
30796
30951
  addonId: null,
30797
30952
  access: "create"
30798
30953
  },
30954
+ "localNetwork.downloadCa": {
30955
+ capName: "local-network",
30956
+ capScope: "system",
30957
+ addonId: null,
30958
+ access: "view"
30959
+ },
30799
30960
  "localNetwork.getAllowedAddresses": {
30800
30961
  capName: "local-network",
30801
30962
  capScope: "system",
@@ -30820,18 +30981,42 @@ Object.freeze({
30820
30981
  addonId: null,
30821
30982
  access: "view"
30822
30983
  },
30984
+ "localNetwork.getTlsStatus": {
30985
+ capName: "local-network",
30986
+ capScope: "system",
30987
+ addonId: null,
30988
+ access: "view"
30989
+ },
30990
+ "localNetwork.getViewerEndpoints": {
30991
+ capName: "local-network",
30992
+ capScope: "system",
30993
+ addonId: null,
30994
+ access: "view"
30995
+ },
30823
30996
  "localNetwork.list": {
30824
30997
  capName: "local-network",
30825
30998
  capScope: "system",
30826
30999
  addonId: null,
30827
31000
  access: "view"
30828
31001
  },
31002
+ "localNetwork.regenerateCertificate": {
31003
+ capName: "local-network",
31004
+ capScope: "system",
31005
+ addonId: null,
31006
+ access: "create"
31007
+ },
30829
31008
  "localNetwork.resetAllowlistToBestMatch": {
30830
31009
  capName: "local-network",
30831
31010
  capScope: "system",
30832
31011
  addonId: null,
30833
31012
  access: "delete"
30834
31013
  },
31014
+ "localNetwork.revertToGeneratedCertificate": {
31015
+ capName: "local-network",
31016
+ capScope: "system",
31017
+ addonId: null,
31018
+ access: "create"
31019
+ },
30835
31020
  "localNetwork.setAllowedAddresses": {
30836
31021
  capName: "local-network",
30837
31022
  capScope: "system",
@@ -30844,6 +31029,18 @@ Object.freeze({
30844
31029
  addonId: null,
30845
31030
  access: "create"
30846
31031
  },
31032
+ "localNetwork.setViewerEndpoints": {
31033
+ capName: "local-network",
31034
+ capScope: "system",
31035
+ addonId: null,
31036
+ access: "create"
31037
+ },
31038
+ "localNetwork.uploadCertificate": {
31039
+ capName: "local-network",
31040
+ capScope: "system",
31041
+ addonId: null,
31042
+ access: "create"
31043
+ },
30847
31044
  "lockControl.lock": {
30848
31045
  capName: "lock-control",
30849
31046
  capScope: "device",
@@ -33724,6 +33921,12 @@ Object.freeze({
33724
33921
  addonId: null,
33725
33922
  access: "create"
33726
33923
  },
33924
+ "terminalSession.updateInstance": {
33925
+ capName: "terminal-session",
33926
+ capScope: "system",
33927
+ addonId: null,
33928
+ access: "create"
33929
+ },
33727
33930
  "terminalSession.writeInput": {
33728
33931
  capName: "terminal-session",
33729
33932
  capScope: "system",
@@ -36375,6 +36578,58 @@ function resolveClusterStepModelId(stepId, models) {
36375
36578
  const chosen = models[stepId];
36376
36579
  return chosen !== void 0 && chosen !== "" ? chosen : step.defaultModelId;
36377
36580
  }
36581
+ var CLUSTER_STEP_SETTING_FIELDS = [{
36582
+ stepId: "face-embedding",
36583
+ key: "minLandmarkFaceSize",
36584
+ label: "Min face size for recognition (detection px)",
36585
+ description: "Refuse to embed a face smaller than this IN THE DETECTION FRAME. Applies to every node — the enrolled gallery is one index, and two admission floors would fill it from two policies. 0 disables the gate.",
36586
+ type: "slider",
36587
+ min: 0,
36588
+ max: 64,
36589
+ step: 2,
36590
+ default: 24
36591
+ }];
36592
+ function clusterStepSettingKey(stepId, fieldKey) {
36593
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
36594
+ }
36595
+ var ClusterSettingNumberSchema = number().finite();
36596
+ function readClusterStepSettings(config) {
36597
+ const out = {};
36598
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
36599
+ const parsed = ClusterSettingNumberSchema.safeParse(config[clusterStepSettingKey(field.stepId, field.key)]);
36600
+ const value = parsed.success ? parsed.data : field.default;
36601
+ const existing = out[field.stepId] ?? {};
36602
+ out[field.stepId] = {
36603
+ ...existing,
36604
+ [field.key]: value
36605
+ };
36606
+ }
36607
+ return out;
36608
+ }
36609
+ var DEFAULT_CLUSTER_STEP_SETTINGS = readClusterStepSettings({});
36610
+ function pickClusterStepSettings(view) {
36611
+ if (view === null) return DEFAULT_CLUSTER_STEP_SETTINGS;
36612
+ const flat = {};
36613
+ const wanted = new Set(CLUSTER_STEP_SETTING_FIELDS.map((field) => clusterStepSettingKey(field.stepId, field.key)));
36614
+ for (const section of view.sections) for (const entry of section.fields) {
36615
+ if (!isHydratedField$2(entry) || typeof entry.key !== "string") continue;
36616
+ if (wanted.has(entry.key)) flat[entry.key] = entry.value;
36617
+ }
36618
+ return readClusterStepSettings(flat);
36619
+ }
36620
+ /**
36621
+ * Cluster knobs win over leftover per-device values. The cluster row is the
36622
+ * authority; a device-local copy is a leftover of the old per-node editor.
36623
+ */
36624
+ function overlayClusterStepSettings(stepId, deviceSettings, cluster) {
36625
+ const overlay = cluster[stepId];
36626
+ if (overlay === void 0 || Object.keys(overlay).length === 0) return deviceSettings === void 0 ? void 0 : { ...deviceSettings };
36627
+ if (deviceSettings === void 0) return { ...overlay };
36628
+ return {
36629
+ ...deviceSettings,
36630
+ ...overlay
36631
+ };
36632
+ }
36378
36633
  var DETAIL_CROP_PADDING_KEY = "detailCropPaddingRatio";
36379
36634
  var DETAIL_CROP_SQUARE_KEY = "detailCropSquare";
36380
36635
  /**
@@ -37434,4 +37689,4 @@ function enumerateInferenceDevices(hw) {
37434
37689
  return out;
37435
37690
  }
37436
37691
  //#endregion
37437
- export { pipelineExecutorCapability as $, audioKindId as A, selectAssignedProfileSlots as At, detectionPipelineCapability as B, record as Bt, RECORDING_EXPORT_MAX_READ_BYTES as C, hydrateSchema as Ct, addonWidgetsSourceCapability as D, nodePin as Dt, YAMNET_TO_MACRO as E, makeSourceBrokerId as Et, defaultDeviceFor as F, discriminatedUnion as Ft, hfModelUrl as G, egressTransportFromRequest as H, union as Ht, defineCustomActions as I, lazy as It, motionDetectionCapability as J, mapAudioLabelToMacro as K, deriveBatteryPresence as L, literal as Lt, cameraStreamsCapability as M, _enum as Mt, createHwAccelCache as N, array as Nt, audioAnalysisCapability as O, parseJsonUnknown as Ot, customAction as P, boolean as Pt, pickNativeLeaseOverride as Q, deriveDetailCropRect as R, number as Rt, RATE_CONTROL_TIGHT as S, createEvent as St, RingBuffer as T, makeProfileBrokerId as Tt, enumerateInferenceDevices as U, EventCategory as Ut, egressTranscodeSharingKey as V, string as Vt, evaluateZoneRules as W, pickClusterStepModels as X, parseProcStatus as Y, pickDetailCropConvention as Z, NativeLeaseAdmissionSchema as _, isSoftwareDecode as _t, COCO_80_LABELS as a, resolvePoolMemoryPolicy as at, PoolMemoryWatchdog as b, DeviceFeature as bt, DEFAULT_CLUSTER_STEP_MODELS as c, storageEvictableCapability as ct, DEFAULT_NATIVE_LEASE_SETTINGS as d, webrtcSessionCapability as dt, pipelineRunnerCapability as et, DEVICE_BACKEND_TO_FORMAT as f, errMsg as ft, HF_BASE_URL as g, invocationFromEncodeProfile as gt, ExportRecordSchema as h, buildFfmpegArgs as ht, BatteryStatusSchema as i, resolveEgressDecodeHwAccel as it, batteryCapability as j, sleep as jt, audioAnalyzerCapability as k, parseProfileBrokerId as kt, DEFAULT_DETAIL_CROP_CONVENTION as l, streamBrokerCapability as lt, EncodeProfileSchema as m, Fmp4BoxSplitter as mt, AUDIO_BACKEND_CHOICES as n, recordingExportCapability as nt, COCO_TO_MACRO as o, resolveRecordingProfiles as ot, EVENT_PAD_MS as p, AUDIO_PRESETS as pt, maskUrlCredentials as q, AUDIO_MACRO_LABELS as r, resolveClusterStepModelId as rt, DEFAULT_AUDIO_ANALYZER_CONFIG as s, runtimeDevices as st, APPLE_SA_TO_MACRO as t, recordingCapability as tt, DEFAULT_EVENTS_BAND_BUFFER_SEC as u, supportedRuntimes as ut, NativeLeaseSettingsSchema as v, BaseAddon as vt, RecordingConfigSchema as w, isEvent as wt, RATE_CONTROL_RELAXED as x, DeviceType as xt, OpsLogEntrySchema as y, CAM_PROFILE_ORDER as yt, deriveRecordingMode as z, object as zt };
37692
+ export { pickClusterStepSettings as $, audioAnalyzerCapability as A, nodePin as At, deriveRecordingMode as B, literal as Bt, RATE_CONTROL_TIGHT as C, DeviceFeature as Ct, YAMNET_TO_MACRO as D, isEvent as Dt, RingBuffer as E, hydrateSchema as Et, customAction as F, _enum as Ft, evaluateZoneRules as G, union as Gt, egressTranscodeSharingKey as H, object as Ht, defaultDeviceFor as I, array as It, maskUrlCredentials as J, hfModelUrl as K, EventCategory as Kt, defineCustomActions as L, boolean as Lt, batteryCapability as M, parseProfileBrokerId as Mt, cameraStreamsCapability as N, selectAssignedProfileSlots as Nt, addonWidgetsSourceCapability as O, makeProfileBrokerId as Ot, createHwAccelCache as P, sleep as Pt, pickClusterStepModels as Q, deriveBatteryPresence as R, discriminatedUnion as Rt, RATE_CONTROL_RELAXED as S, CAM_PROFILE_ORDER as St, RecordingConfigSchema as T, createEvent as Tt, egressTransportFromRequest as U, record as Ut, detectionPipelineCapability as V, number as Vt, enumerateInferenceDevices as W, string as Wt, overlayClusterStepSettings as X, motionDetectionCapability as Y, parseProcStatus as Z, HF_BASE_URL as _, Fmp4BoxSplitter as _t, COCO_80_LABELS as a, recordingExportCapability as at, OpsLogEntrySchema as b, isSoftwareDecode as bt, DEFAULT_CLUSTER_STEP_MODELS as c, resolvePoolMemoryPolicy as ct, DEFAULT_EVENTS_BAND_BUFFER_SEC as d, storageEvictableCapability as dt, pickDetailCropConvention as et, DEFAULT_NATIVE_LEASE_SETTINGS as f, streamBrokerCapability as ft, ExportRecordSchema as g, AUDIO_PRESETS as gt, EncodeProfileSchema as h, errMsg as ht, BatteryStatusSchema as i, recordingCapability as it, audioKindId as j, parseJsonUnknown as jt, audioAnalysisCapability as k, makeSourceBrokerId as kt, DEFAULT_CLUSTER_STEP_SETTINGS as l, resolveRecordingProfiles as lt, EVENT_PAD_MS as m, webrtcSessionCapability as mt, AUDIO_BACKEND_CHOICES as n, pipelineExecutorCapability as nt, COCO_TO_MACRO as o, resolveClusterStepModelId as ot, DEVICE_BACKEND_TO_FORMAT as p, supportedRuntimes as pt, mapAudioLabelToMacro as q, AUDIO_MACRO_LABELS as r, pipelineRunnerCapability as rt, DEFAULT_AUDIO_ANALYZER_CONFIG as s, resolveEgressDecodeHwAccel as st, APPLE_SA_TO_MACRO as t, pickNativeLeaseOverride as tt, DEFAULT_DETAIL_CROP_CONVENTION as u, runtimeDevices as ut, NativeLeaseAdmissionSchema as v, buildFfmpegArgs as vt, RECORDING_EXPORT_MAX_READ_BYTES as w, DeviceType as wt, PoolMemoryWatchdog as x, BaseAddon as xt, NativeLeaseSettingsSchema as y, invocationFromEncodeProfile as yt, deriveDetailCropRect as z, lazy as zt };