@camstack/addon-osd-manager 0.1.19 → 0.1.20

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 (18) hide show
  1. package/dist/{MotionZonesSettings-2bARhPh6.mjs → MotionZonesSettings-Dhh1AqWY.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-Cdqm3uIC.mjs → PrivacyMaskSettings-CPABuSH1.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-C58VvxWO.mjs → SceneMonitorEditor-CyVjkJI2.mjs} +3 -3
  4. package/dist/_stub.js +11 -11
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-SPTPw18n.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-5jby0ZM9.mjs} +4 -4
  6. package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DO3S4jGF.mjs +26 -0
  7. package/dist/{hostInit-CaN1IxGo.mjs → hostInit-5GIsHCyh.mjs} +3 -3
  8. package/dist/index.js +284 -24
  9. package/dist/index.mjs +284 -24
  10. package/dist/{player-overlays-CQmBy0Zm.mjs → player-overlays-A11g0xRn.mjs} +1 -1
  11. package/dist/remoteEntry.js +1 -1
  12. package/dist/{responsive-jU_1DnOd.mjs → responsive-B_W10135.mjs} +1 -1
  13. package/dist/{square-BewXHDNm.mjs → square-BqxtsJJ4.mjs} +1 -1
  14. package/dist/{trash-2-h2ZuBBnj.mjs → trash-2-xxP-WwG0.mjs} +1 -1
  15. package/dist/{use-device-snapshot--wXDROMR.mjs → use-device-snapshot-B6sowK2s.mjs} +1 -1
  16. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-BqFfMnBU.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-0ziNXHDT.mjs} +1 -1
  17. package/package.json +1 -1
  18. package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-KlN_tI2R.mjs +0 -26
package/dist/index.js CHANGED
@@ -8095,6 +8095,15 @@ var LabelDefinitionSchema = object({
8095
8095
  description: string().optional(),
8096
8096
  icon: string().optional()
8097
8097
  });
8098
+ var ClassMapDefinitionSchema = object({
8099
+ mapping: record(string(), _enum([
8100
+ "person",
8101
+ "vehicle",
8102
+ "animal",
8103
+ "package"
8104
+ ])),
8105
+ preserveOriginal: boolean()
8106
+ });
8098
8107
  var MODEL_FORMATS = [
8099
8108
  "onnx",
8100
8109
  "coreml",
@@ -8273,7 +8282,13 @@ var ModelCatalogEntrySchema = object({
8273
8282
  * `id` stays the source of truth for resolution/download/persistence; grouping
8274
8283
  * is a presentation overlay resolved back to an `id`.
8275
8284
  */
8276
- group: ModelVariantGroupSchema.optional()
8285
+ group: ModelVariantGroupSchema.optional(),
8286
+ /**
8287
+ * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
8288
+ * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8289
+ * labels already ARE the CamStack macros (Scrypted identity map).
8290
+ */
8291
+ classMap: ClassMapDefinitionSchema.optional()
8277
8292
  });
8278
8293
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8279
8294
  format: literal("openvino"),
@@ -8302,7 +8317,8 @@ var ModelConvertMetadataSchema = object({
8302
8317
  "ocr",
8303
8318
  "segmentation"
8304
8319
  ]),
8305
- faceAlignment: boolean().optional()
8320
+ faceAlignment: boolean().optional(),
8321
+ classMap: ClassMapDefinitionSchema.optional()
8306
8322
  });
8307
8323
  var ConvertResultSchema = object({
8308
8324
  entry: ModelCatalogEntrySchema,
@@ -20025,6 +20041,33 @@ var NativeCropRefSchema = object({
20025
20041
  h: number()
20026
20042
  })
20027
20043
  });
20044
+ object({
20045
+ crop: object({
20046
+ left: number(),
20047
+ top: number(),
20048
+ width: number().positive(),
20049
+ height: number().positive()
20050
+ }).optional(),
20051
+ content: object({
20052
+ width: number().int().positive(),
20053
+ height: number().int().positive()
20054
+ }),
20055
+ fit: _enum(["stretch", "contain"]),
20056
+ format: _enum([
20057
+ "rgb",
20058
+ "gray",
20059
+ "jpeg"
20060
+ ])
20061
+ });
20062
+ var FrameRefSchema = object({
20063
+ registryId: string().min(1),
20064
+ id: string().min(1),
20065
+ width: number().int().positive(),
20066
+ height: number().int().positive(),
20067
+ format: _enum(["rgb", "gray"]),
20068
+ timestamp: number(),
20069
+ capturedAt: number().optional()
20070
+ });
20028
20071
  var ModelFormatSchema$1 = _enum([
20029
20072
  "onnx",
20030
20073
  "coreml",
@@ -20345,7 +20388,7 @@ var pipelineExecutorCapability = {
20345
20388
  * legacy call shape used by existing benchmark code; once all
20346
20389
  * callers pass it explicitly we make it required.
20347
20390
  *
20348
- * Exactly one of `frame`, `frameHandle`, `imageBase64`,
20391
+ * Exactly one of `frame`, `frameRef`, `frameHandle`, `imageBase64`,
20349
20392
  * `referenceImage` must be provided:
20350
20393
  * - `frame`: runtime dispatch path (runner → decoded broker frame).
20351
20394
  * Carries the raw buffer, dimensions, and format; the executor
@@ -20367,6 +20410,12 @@ var pipelineExecutorCapability = {
20367
20410
  steps: array(PipelineStepInputSchema).min(1),
20368
20411
  frame: FrameInputSchema.optional(),
20369
20412
  /**
20413
+ * Process-local lazy frame. Valid only when caller and provider resolve
20414
+ * in the same execution-group process; split/cross-node callers use
20415
+ * `frame`/`image` inline compatibility instead.
20416
+ */
20417
+ frameRef: FrameRefSchema.optional(),
20418
+ /**
20370
20419
  * CB5 shm passthrough — a `FrameHandle` naming the same ring slot
20371
20420
  * the decoded pixels live in. One more member of the one-of
20372
20421
  * frame/frameHandle/image/imageBase64/referenceImage group.
@@ -20716,7 +20765,10 @@ var NativeCropResultSchema = object({
20716
20765
  * Which source served this crop, so a quality-sensitive consumer (the native
20717
20766
  * `keyFrame`) can reject a degraded fallback:
20718
20767
  * - `native` — cut from the decode worker's retained NATIVE surface (the
20719
- * quality path).
20768
+ * quality path). A subject-tile serve is also native-resolution and stays
20769
+ * `native` here: the public enum cannot name `tile` without a breaking cap
20770
+ * change. Runner telemetry distinguishes lease vs tile via `source` on the
20771
+ * internal crop result (`nativeHits` vs `tileHits`).
20720
20772
  * - `ram-fullframe` — the native surface MISSED but the request was full-frame,
20721
20773
  * so the ≤640 RAM `RetainedFrameStore` served it (honest lower-res; legit for
20722
20774
  * the blank-frame guard / 640-snapshot resolve, NOT for the clean keyFrame).
@@ -21207,12 +21259,41 @@ var RunnerLocalLoadSchema = object({
21207
21259
  * legacy `OrchestratorMetricsSchema` shape so existing dashboards keep
21208
21260
  * working unchanged when they switch to reading from the runner cap.
21209
21261
  */
21262
+ var FrameLazyCountersSchema = object({
21263
+ framesDecoded: number(),
21264
+ framesAdmitted: number(),
21265
+ framesDroppedPixelFree: number(),
21266
+ viewsMaterialized: number(),
21267
+ viewsSkipped: number(),
21268
+ workerToRunnerBytes: number(),
21269
+ runnerToPoolRawBytes: number(),
21270
+ runnerToPoolJpegBytes: number(),
21271
+ onDemandFullFrameRequests: number(),
21272
+ onDemandCropRequests: number(),
21273
+ nativeHits: number(),
21274
+ nativeMisses: number(),
21275
+ tileHits: number(),
21276
+ tileMisses: number(),
21277
+ fallbackHits: number(),
21278
+ fallbackMisses: number(),
21279
+ retainedWritesAvoided: number(),
21280
+ residentRefs: number(),
21281
+ residentBytes: number(),
21282
+ releases: number(),
21283
+ evictions: number(),
21284
+ staleMisses: number()
21285
+ });
21286
+ var FrameLazyMetricsSchema = object({
21287
+ node: FrameLazyCountersSchema,
21288
+ cameras: array(FrameLazyCountersSchema.extend({ deviceId: number() }))
21289
+ });
21210
21290
  var RunnerLocalMetricsSchema = object({
21211
21291
  nodeId: string(),
21212
21292
  activeCameras: number(),
21213
21293
  throttledCameras: number(),
21214
21294
  avgInferenceTimeMs: number(),
21215
- queueDepth: number()
21295
+ queueDepth: number(),
21296
+ frameLazy: FrameLazyMetricsSchema.optional()
21216
21297
  });
21217
21298
  /**
21218
21299
  * Pipeline Runner capability — runtime detection workhorse.
@@ -23244,6 +23325,9 @@ var storageProviderCapability = {
23244
23325
  endDownload: method(EndDownloadInputSchema, _void(), { kind: "mutation" })
23245
23326
  }
23246
23327
  };
23328
+ /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
23329
+ var ProfileSettingsSchemaBridge = unknown().nullable();
23330
+ var ProfileSettingsBagSchema = record(string(), unknown());
23247
23331
  /**
23248
23332
  * A live terminal session hosted by the provider addon. Output and input do
23249
23333
  * NOT flow through the capability — they use the addon data plane
@@ -23273,7 +23357,14 @@ var TerminalSessionInfoSchema = object({
23273
23357
  var TerminalProfileInfoSchema = object({
23274
23358
  profileId: string(),
23275
23359
  label: string(),
23276
- description: string().optional()
23360
+ description: string().optional(),
23361
+ /** Spawn defaults the instance form copies on create. */
23362
+ executable: string().optional(),
23363
+ args: array(string()).readonly().optional(),
23364
+ cwd: string().optional(),
23365
+ environment: array(string()).readonly().optional(),
23366
+ /** ConfigUISchema for instance knobs, or null when the profile has none. */
23367
+ settingsSchema: ProfileSettingsSchemaBridge.optional()
23277
23368
  });
23278
23369
  /**
23279
23370
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -23286,7 +23377,12 @@ var TerminalInstanceInfoSchema = object({
23286
23377
  profileId: string(),
23287
23378
  profileLabel: string(),
23288
23379
  name: string(),
23289
- enabled: boolean()
23380
+ enabled: boolean(),
23381
+ executable: string(),
23382
+ args: array(string()).readonly(),
23383
+ cwd: string(),
23384
+ environment: array(string()).readonly(),
23385
+ profileSettings: ProfileSettingsBagSchema
23290
23386
  });
23291
23387
  var TerminalLegacyCameraSchema = object({
23292
23388
  stableId: string(),
@@ -23332,7 +23428,24 @@ var terminalSessionCapability = {
23332
23428
  createInstance: method(object({
23333
23429
  targetNodeId: string().min(1),
23334
23430
  profileId: string().min(1),
23335
- name: string().trim().min(1).max(160).optional()
23431
+ name: string().trim().min(1).max(160).optional(),
23432
+ executable: string().max(1024).optional(),
23433
+ args: array(string().max(2048)).max(64).optional(),
23434
+ cwd: string().max(1024).optional(),
23435
+ environment: array(string().max(4096)).max(64).optional(),
23436
+ profileSettings: ProfileSettingsBagSchema.optional()
23437
+ }), TerminalInstanceInfoSchema, {
23438
+ kind: "mutation",
23439
+ auth: "admin"
23440
+ }),
23441
+ updateInstance: method(object({
23442
+ instanceId: string().min(1),
23443
+ name: string().trim().min(1).max(160).optional(),
23444
+ executable: string().max(1024).optional(),
23445
+ args: array(string().max(2048)).max(64).optional(),
23446
+ cwd: string().max(1024).optional(),
23447
+ environment: array(string().max(4096)).max(64).optional(),
23448
+ profileSettings: ProfileSettingsBagSchema.optional()
23336
23449
  }), TerminalInstanceInfoSchema, {
23337
23450
  kind: "mutation",
23338
23451
  auth: "admin"
@@ -23367,7 +23480,11 @@ var terminalSessionCapability = {
23367
23480
  openSession: method(object({
23368
23481
  profileId: string(),
23369
23482
  cols: number().int().positive(),
23370
- rows: number().int().positive()
23483
+ rows: number().int().positive(),
23484
+ executable: string().max(1024).optional(),
23485
+ args: array(string().max(2048)).max(64).optional(),
23486
+ cwd: string().max(1024).optional(),
23487
+ environment: array(string().max(4096)).max(64).optional()
23371
23488
  }), TerminalSessionInfoSchema, {
23372
23489
  kind: "mutation",
23373
23490
  auth: "admin"
@@ -27745,10 +27862,10 @@ var lawnMowerControlCapability = {
27745
27862
  *
27746
27863
  * • The SDK (mobile / web client) consumes `getConnectionEndpoints()`
27747
27864
  * to receive an ordered list of candidate base URLs it should race
27748
- * on connect — LAN IPv4 first (lowest latency when on same network),
27749
- * then public hostname (if a tunnel is up), then IPv6. The SDK can
27750
- * race them with short timeouts and stick with the winner for the
27751
- * session.
27865
+ * on connect — LAN IPv4 and stable LAN IPv6 first (lowest latency
27866
+ * when on the same network), then public hostname (if a tunnel is
27867
+ * up). The SDK can race them with short timeouts and stick with the
27868
+ * winner for the session.
27752
27869
  *
27753
27870
  * Why hub-only: agents are not directly addressable by the operator's
27754
27871
  * clients — they reverse-connect to the hub. Exposing their interfaces
@@ -27903,6 +28020,17 @@ var NotificationEndpointSchema = object({
27903
28020
  /** What the ranking currently resolves to (null when nothing is reachable). */
27904
28021
  resolved: string().nullable()
27905
28022
  });
28023
+ /**
28024
+ * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
28025
+ * AUTO (every LAN IPv4 + the public tunnel). `resolved` is what that choice
28026
+ * currently expands to, so the UI can show the effective set either way.
28027
+ */
28028
+ var ViewerEndpointsSchema = object({
28029
+ /** The operator's explicit race set, or empty for AUTO. */
28030
+ baseUrls: array(string()).readonly(),
28031
+ /** What the ranking currently resolves to (may be empty if nothing is up). */
28032
+ resolved: array(string()).readonly()
28033
+ });
27906
28034
  var AllowedAddressesSchema = object({
27907
28035
  /**
27908
28036
  * Allowlist of interface addresses operators have explicitly opted
@@ -27911,6 +28039,20 @@ var AllowedAddressesSchema = object({
27911
28039
  * Network Addresses admin page and persisted by the addon.
27912
28040
  */
27913
28041
  addresses: array(string()).readonly() });
28042
+ var TlsStatusSchema = object({
28043
+ mode: _enum([
28044
+ "generated",
28045
+ "uploaded",
28046
+ "disabled"
28047
+ ]),
28048
+ leafFingerprintSha256: string().nullable(),
28049
+ caFingerprintSha256: string().nullable(),
28050
+ validTo: string().nullable(),
28051
+ sans: array(string()),
28052
+ caCertPem: string().nullable(),
28053
+ reissueError: string().nullable(),
28054
+ restartRequired: boolean()
28055
+ });
27914
28056
  var localNetworkCapability = {
27915
28057
  name: "local-network",
27916
28058
  scope: "system",
@@ -27930,13 +28072,13 @@ var localNetworkCapability = {
27930
28072
  */
27931
28073
  getPreferred: method(_void(), PreferredSchema),
27932
28074
  /**
27933
- * Ordered candidate base URLs the SDK should try on connect.
27934
- * Includes LAN IPs (one per non-internal interface), the public
27935
- * tunnel hostname (when active), and loopback as a last-resort
27936
- * fallback. Filterable by `includeLoopback` / `ipv4Only`.
27937
- * Honours `getAllowedAddresses()` when set addresses outside
27938
- * the allowlist are dropped (the public tunnel + loopback are
27939
- * always included as escape hatches).
28075
+ * Ordered candidate base URLs (the palette the Network tab shows).
28076
+ * Includes LAN IPv4, stable LAN IPv6, the public tunnel, and mesh when
28077
+ * joined. Loopback is off by default. The SDK races the subset from
28078
+ * `getViewerEndpoints`, not this full list — IPv6 stays here because
28079
+ * WebRTC ICE gathers dual-stack regardless of the HTTP race. Honours
28080
+ * `getAllowedAddresses()` when set addresses outside the allowlist
28081
+ * are dropped (the public tunnel is still included as an escape hatch).
27940
28082
  *
27941
28083
  * **The port is the hub's, not the caller's** (D62 — a function's fact
27942
28084
  * belongs to whoever already owns it). This method used to take a `port`
@@ -27967,10 +28109,11 @@ var localNetworkCapability = {
27967
28109
  */
27968
28110
  port: number().int().min(1).max(65535).optional(),
27969
28111
  /** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
27970
- * candidate. Default `true`. */
28112
+ * candidate. Default `false` — loopback is not a client route. */
27971
28113
  includeLoopback: boolean().optional(),
27972
- /** Skip IPv6 entries. Some legacy clients can't parse them.
27973
- * Default `false`. */
28114
+ /** Skip IPv6 entries. Default `false` the palette includes stable
28115
+ * LAN IPv6 (ICE/WebRTC uses dual-stack regardless). Pass `true` to
28116
+ * hide them. The viewer HTTP/WS race is `getViewerEndpoints`. */
27974
28117
  ipv4Only: boolean().optional(),
27975
28118
  /** Scheme to emit for LAN/loopback URLs. Default `'http'`.
27976
28119
  * Pass `'https'` when the caller is itself loaded over HTTPS
@@ -27999,6 +28142,19 @@ var localNetworkCapability = {
27999
28142
  */
28000
28143
  setNotificationEndpoint: method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }),
28001
28144
  /**
28145
+ * The endpoints the SDK / viewer races for API access. Empty `baseUrls`
28146
+ * means AUTO: every LAN IPv4 address plus the public tunnel, never IPv6,
28147
+ * never mesh, never loopback. `resolved` is that set (or the operator's
28148
+ * explicit subset) as it stands right now.
28149
+ */
28150
+ getViewerEndpoints: method(_void(), ViewerEndpointsSchema),
28151
+ /**
28152
+ * Replace the viewer race set. Empty `baseUrls` restores AUTO. Stored
28153
+ * verbatim (not indices) so a temporarily-down tunnel is not silently
28154
+ * dropped from the operator's choice.
28155
+ */
28156
+ setViewerEndpoints: method(object({ baseUrls: array(string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }),
28157
+ /**
28002
28158
  * Read the operator's allowlist. Empty = "auto" (no filter). Used
28003
28159
  * by the admin UI's address selector to seed its checkbox state.
28004
28160
  */
@@ -28016,7 +28172,34 @@ var localNetworkCapability = {
28016
28172
  * when the operator wants to wipe their manual edits and start
28017
28173
  * over from the auto-detected best matches.
28018
28174
  */
28019
- resetAllowlistToBestMatch: method(_void(), AllowedAddressesSchema, { kind: "mutation" })
28175
+ resetAllowlistToBestMatch: method(_void(), AllowedAddressesSchema, { kind: "mutation" }),
28176
+ /**
28177
+ * Live TLS material for the Network → Local access certificate card.
28178
+ * LAN HTTP / hostname are addon settings (`globalSettingsSchema`), not
28179
+ * a second store — this query is status, not configuration.
28180
+ */
28181
+ getTlsStatus: method(_void(), TlsStatusSchema),
28182
+ /** Issue a new leaf under the existing local CA. Disabled in uploaded mode. */
28183
+ regenerateCertificate: method(object({ reason: string().optional() }), TlsStatusSchema, {
28184
+ kind: "mutation",
28185
+ auth: "admin"
28186
+ }),
28187
+ /** Replace the served material with operator-supplied PEMs. */
28188
+ uploadCertificate: method(object({
28189
+ certPem: string().min(1),
28190
+ keyPem: string().min(1),
28191
+ caPem: string().optional()
28192
+ }), TlsStatusSchema, {
28193
+ kind: "mutation",
28194
+ auth: "admin"
28195
+ }),
28196
+ /** The local CA PEM, or empty when there is none to download. */
28197
+ downloadCa: method(_void(), object({ pem: string() })),
28198
+ /** Drop uploaded material and return to the generated local CA. */
28199
+ revertToGeneratedCertificate: method(_void(), TlsStatusSchema, {
28200
+ kind: "mutation",
28201
+ auth: "admin"
28202
+ })
28020
28203
  },
28021
28204
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
28022
28205
  mount: { kind: "hub-only" }
@@ -35760,6 +35943,12 @@ Object.freeze({
35760
35943
  addonId: null,
35761
35944
  access: "create"
35762
35945
  },
35946
+ "localNetwork.downloadCa": {
35947
+ capName: "local-network",
35948
+ capScope: "system",
35949
+ addonId: null,
35950
+ access: "view"
35951
+ },
35763
35952
  "localNetwork.getAllowedAddresses": {
35764
35953
  capName: "local-network",
35765
35954
  capScope: "system",
@@ -35784,18 +35973,42 @@ Object.freeze({
35784
35973
  addonId: null,
35785
35974
  access: "view"
35786
35975
  },
35976
+ "localNetwork.getTlsStatus": {
35977
+ capName: "local-network",
35978
+ capScope: "system",
35979
+ addonId: null,
35980
+ access: "view"
35981
+ },
35982
+ "localNetwork.getViewerEndpoints": {
35983
+ capName: "local-network",
35984
+ capScope: "system",
35985
+ addonId: null,
35986
+ access: "view"
35987
+ },
35787
35988
  "localNetwork.list": {
35788
35989
  capName: "local-network",
35789
35990
  capScope: "system",
35790
35991
  addonId: null,
35791
35992
  access: "view"
35792
35993
  },
35994
+ "localNetwork.regenerateCertificate": {
35995
+ capName: "local-network",
35996
+ capScope: "system",
35997
+ addonId: null,
35998
+ access: "create"
35999
+ },
35793
36000
  "localNetwork.resetAllowlistToBestMatch": {
35794
36001
  capName: "local-network",
35795
36002
  capScope: "system",
35796
36003
  addonId: null,
35797
36004
  access: "delete"
35798
36005
  },
36006
+ "localNetwork.revertToGeneratedCertificate": {
36007
+ capName: "local-network",
36008
+ capScope: "system",
36009
+ addonId: null,
36010
+ access: "create"
36011
+ },
35799
36012
  "localNetwork.setAllowedAddresses": {
35800
36013
  capName: "local-network",
35801
36014
  capScope: "system",
@@ -35808,6 +36021,18 @@ Object.freeze({
35808
36021
  addonId: null,
35809
36022
  access: "create"
35810
36023
  },
36024
+ "localNetwork.setViewerEndpoints": {
36025
+ capName: "local-network",
36026
+ capScope: "system",
36027
+ addonId: null,
36028
+ access: "create"
36029
+ },
36030
+ "localNetwork.uploadCertificate": {
36031
+ capName: "local-network",
36032
+ capScope: "system",
36033
+ addonId: null,
36034
+ access: "create"
36035
+ },
35811
36036
  "lockControl.lock": {
35812
36037
  capName: "lock-control",
35813
36038
  capScope: "device",
@@ -38688,6 +38913,12 @@ Object.freeze({
38688
38913
  addonId: null,
38689
38914
  access: "create"
38690
38915
  },
38916
+ "terminalSession.updateInstance": {
38917
+ capName: "terminal-session",
38918
+ capScope: "system",
38919
+ addonId: null,
38920
+ access: "create"
38921
+ },
38691
38922
  "terminalSession.writeInput": {
38692
38923
  capName: "terminal-session",
38693
38924
  capScope: "system",
@@ -41235,6 +41466,35 @@ Object.freeze(Object.fromEntries([{
41235
41466
  }]
41236
41467
  }].map((s) => [s.stepId, s.defaultModelId])));
41237
41468
  string().min(1);
41469
+ var CLUSTER_STEP_SETTING_FIELDS = [{
41470
+ stepId: "face-embedding",
41471
+ key: "minLandmarkFaceSize",
41472
+ label: "Min face size for recognition (detection px)",
41473
+ 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.",
41474
+ type: "slider",
41475
+ min: 0,
41476
+ max: 64,
41477
+ step: 2,
41478
+ default: 24
41479
+ }];
41480
+ function clusterStepSettingKey(stepId, fieldKey) {
41481
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
41482
+ }
41483
+ var ClusterSettingNumberSchema = number().finite();
41484
+ function readClusterStepSettings(config) {
41485
+ const out = {};
41486
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
41487
+ const parsed = ClusterSettingNumberSchema.safeParse(config[clusterStepSettingKey(field.stepId, field.key)]);
41488
+ const value = parsed.success ? parsed.data : field.default;
41489
+ const existing = out[field.stepId] ?? {};
41490
+ out[field.stepId] = {
41491
+ ...existing,
41492
+ [field.key]: value
41493
+ };
41494
+ }
41495
+ return out;
41496
+ }
41497
+ readClusterStepSettings({});
41238
41498
  object({
41239
41499
  /**
41240
41500
  * Fraction of the box's own size added on EACH side before cutting.