camstack 1.2.37 → 1.2.39

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.
@@ -14522,7 +14522,7 @@ function date4(params) {
14522
14522
  // ../../node_modules/zod/v4/classic/external.js
14523
14523
  config(en_default());
14524
14524
 
14525
- // ../types/dist/sleep-zMxKWD0M.mjs
14525
+ // ../types/dist/sleep-B8EIZt4h.mjs
14526
14526
  var WELL_KNOWN_TABS = [
14527
14527
  {
14528
14528
  id: "overview",
@@ -15926,6 +15926,16 @@ var LabelDefinitionSchema = external_exports.object({
15926
15926
  description: external_exports.string().optional(),
15927
15927
  icon: external_exports.string().optional()
15928
15928
  });
15929
+ var CLASS_MAP_MACRO_TARGETS = [
15930
+ "person",
15931
+ "vehicle",
15932
+ "animal",
15933
+ "package"
15934
+ ];
15935
+ var ClassMapDefinitionSchema = external_exports.object({
15936
+ mapping: external_exports.record(external_exports.string(), external_exports.enum(CLASS_MAP_MACRO_TARGETS)),
15937
+ preserveOriginal: external_exports.boolean()
15938
+ });
15929
15939
  var MODEL_FORMATS = [
15930
15940
  "onnx",
15931
15941
  "coreml",
@@ -16074,7 +16084,13 @@ var ModelCatalogEntrySchema = external_exports.object({
16074
16084
  * `id` stays the source of truth for resolution/download/persistence; grouping
16075
16085
  * is a presentation overlay resolved back to an `id`.
16076
16086
  */
16077
- group: ModelVariantGroupSchema.optional()
16087
+ group: ModelVariantGroupSchema.optional(),
16088
+ /**
16089
+ * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
16090
+ * applies (Frigate / COCO public catalog). Set on a custom model whose raw
16091
+ * labels already ARE the CamStack macros (Scrypted identity map).
16092
+ */
16093
+ classMap: ClassMapDefinitionSchema.optional()
16078
16094
  });
16079
16095
  var ConvertTargetSchema = external_exports.discriminatedUnion("format", [external_exports.object({
16080
16096
  format: external_exports.literal("openvino"),
@@ -16103,7 +16119,8 @@ var ModelConvertMetadataSchema = external_exports.object({
16103
16119
  "ocr",
16104
16120
  "segmentation"
16105
16121
  ]),
16106
- faceAlignment: external_exports.boolean().optional()
16122
+ faceAlignment: external_exports.boolean().optional(),
16123
+ classMap: ClassMapDefinitionSchema.optional()
16107
16124
  });
16108
16125
  var ConvertArtifactSchema = external_exports.object({
16109
16126
  format: external_exports.enum(MODEL_FORMATS),
@@ -25370,6 +25387,33 @@ var NativeCropRefSchema = external_exports.object({
25370
25387
  h: external_exports.number()
25371
25388
  })
25372
25389
  });
25390
+ external_exports.object({
25391
+ crop: external_exports.object({
25392
+ left: external_exports.number(),
25393
+ top: external_exports.number(),
25394
+ width: external_exports.number().positive(),
25395
+ height: external_exports.number().positive()
25396
+ }).optional(),
25397
+ content: external_exports.object({
25398
+ width: external_exports.number().int().positive(),
25399
+ height: external_exports.number().int().positive()
25400
+ }),
25401
+ fit: external_exports.enum(["stretch", "contain"]),
25402
+ format: external_exports.enum([
25403
+ "rgb",
25404
+ "gray",
25405
+ "jpeg"
25406
+ ])
25407
+ });
25408
+ var FrameRefSchema = external_exports.object({
25409
+ registryId: external_exports.string().min(1),
25410
+ id: external_exports.string().min(1),
25411
+ width: external_exports.number().int().positive(),
25412
+ height: external_exports.number().int().positive(),
25413
+ format: external_exports.enum(["rgb", "gray"]),
25414
+ timestamp: external_exports.number(),
25415
+ capturedAt: external_exports.number().optional()
25416
+ });
25373
25417
  var ModelFormatSchema$1 = external_exports.enum([
25374
25418
  "onnx",
25375
25419
  "coreml",
@@ -25669,7 +25713,7 @@ var pipelineExecutorCapability = {
25669
25713
  * legacy call shape used by existing benchmark code; once all
25670
25714
  * callers pass it explicitly we make it required.
25671
25715
  *
25672
- * Exactly one of `frame`, `frameHandle`, `imageBase64`,
25716
+ * Exactly one of `frame`, `frameRef`, `frameHandle`, `imageBase64`,
25673
25717
  * `referenceImage` must be provided:
25674
25718
  * - `frame`: runtime dispatch path (runner → decoded broker frame).
25675
25719
  * Carries the raw buffer, dimensions, and format; the executor
@@ -25691,6 +25735,12 @@ var pipelineExecutorCapability = {
25691
25735
  steps: external_exports.array(PipelineStepInputSchema).min(1),
25692
25736
  frame: FrameInputSchema.optional(),
25693
25737
  /**
25738
+ * Process-local lazy frame. Valid only when caller and provider resolve
25739
+ * in the same execution-group process; split/cross-node callers use
25740
+ * `frame`/`image` inline compatibility instead.
25741
+ */
25742
+ frameRef: FrameRefSchema.optional(),
25743
+ /**
25694
25744
  * CB5 shm passthrough — a `FrameHandle` naming the same ring slot
25695
25745
  * the decoded pixels live in. One more member of the one-of
25696
25746
  * frame/frameHandle/image/imageBase64/referenceImage group.
@@ -25993,7 +26043,10 @@ var NativeCropResultSchema = external_exports.object({
25993
26043
  * Which source served this crop, so a quality-sensitive consumer (the native
25994
26044
  * `keyFrame`) can reject a degraded fallback:
25995
26045
  * - `native` — cut from the decode worker's retained NATIVE surface (the
25996
- * quality path).
26046
+ * quality path). A subject-tile serve is also native-resolution and stays
26047
+ * `native` here: the public enum cannot name `tile` without a breaking cap
26048
+ * change. Runner telemetry distinguishes lease vs tile via `source` on the
26049
+ * internal crop result (`nativeHits` vs `tileHits`).
25997
26050
  * - `ram-fullframe` — the native surface MISSED but the request was full-frame,
25998
26051
  * so the ≤640 RAM `RetainedFrameStore` served it (honest lower-res; legit for
25999
26052
  * the blank-frame guard / 640-snapshot resolve, NOT for the clean keyFrame).
@@ -26496,12 +26549,41 @@ var RunnerLocalLoadSchema = external_exports.object({
26496
26549
  cpuCores: external_exports.number().optional()
26497
26550
  })
26498
26551
  });
26552
+ var FrameLazyCountersSchema = external_exports.object({
26553
+ framesDecoded: external_exports.number(),
26554
+ framesAdmitted: external_exports.number(),
26555
+ framesDroppedPixelFree: external_exports.number(),
26556
+ viewsMaterialized: external_exports.number(),
26557
+ viewsSkipped: external_exports.number(),
26558
+ workerToRunnerBytes: external_exports.number(),
26559
+ runnerToPoolRawBytes: external_exports.number(),
26560
+ runnerToPoolJpegBytes: external_exports.number(),
26561
+ onDemandFullFrameRequests: external_exports.number(),
26562
+ onDemandCropRequests: external_exports.number(),
26563
+ nativeHits: external_exports.number(),
26564
+ nativeMisses: external_exports.number(),
26565
+ tileHits: external_exports.number(),
26566
+ tileMisses: external_exports.number(),
26567
+ fallbackHits: external_exports.number(),
26568
+ fallbackMisses: external_exports.number(),
26569
+ retainedWritesAvoided: external_exports.number(),
26570
+ residentRefs: external_exports.number(),
26571
+ residentBytes: external_exports.number(),
26572
+ releases: external_exports.number(),
26573
+ evictions: external_exports.number(),
26574
+ staleMisses: external_exports.number()
26575
+ });
26576
+ var FrameLazyMetricsSchema = external_exports.object({
26577
+ node: FrameLazyCountersSchema,
26578
+ cameras: external_exports.array(FrameLazyCountersSchema.extend({ deviceId: external_exports.number() }))
26579
+ });
26499
26580
  var RunnerLocalMetricsSchema = external_exports.object({
26500
26581
  nodeId: external_exports.string(),
26501
26582
  activeCameras: external_exports.number(),
26502
26583
  throttledCameras: external_exports.number(),
26503
26584
  avgInferenceTimeMs: external_exports.number(),
26504
- queueDepth: external_exports.number()
26585
+ queueDepth: external_exports.number(),
26586
+ frameLazy: FrameLazyMetricsSchema.optional()
26505
26587
  });
26506
26588
  var pipelineRunnerCapability = {
26507
26589
  name: "pipeline-runner",
@@ -28288,6 +28370,8 @@ var storageProviderCapability = {
28288
28370
  endDownload: method(EndDownloadInputSchema, external_exports.void(), { kind: "mutation" })
28289
28371
  }
28290
28372
  };
28373
+ var ProfileSettingsSchemaBridge = external_exports.unknown().nullable();
28374
+ var ProfileSettingsBagSchema = external_exports.record(external_exports.string(), external_exports.unknown());
28291
28375
  var TerminalSessionInfoSchema = external_exports.object({
28292
28376
  /** Opaque session id minted by the provider on `openSession`. */
28293
28377
  sessionId: external_exports.string(),
@@ -28303,7 +28387,14 @@ var TerminalSessionInfoSchema = external_exports.object({
28303
28387
  var TerminalProfileInfoSchema = external_exports.object({
28304
28388
  profileId: external_exports.string(),
28305
28389
  label: external_exports.string(),
28306
- description: external_exports.string().optional()
28390
+ description: external_exports.string().optional(),
28391
+ /** Spawn defaults the instance form copies on create. */
28392
+ executable: external_exports.string().optional(),
28393
+ args: external_exports.array(external_exports.string()).readonly().optional(),
28394
+ cwd: external_exports.string().optional(),
28395
+ environment: external_exports.array(external_exports.string()).readonly().optional(),
28396
+ /** ConfigUISchema for instance knobs, or null when the profile has none. */
28397
+ settingsSchema: ProfileSettingsSchemaBridge.optional()
28307
28398
  });
28308
28399
  var TerminalInstanceInfoSchema = external_exports.object({
28309
28400
  instanceId: external_exports.string(),
@@ -28312,7 +28403,12 @@ var TerminalInstanceInfoSchema = external_exports.object({
28312
28403
  profileId: external_exports.string(),
28313
28404
  profileLabel: external_exports.string(),
28314
28405
  name: external_exports.string(),
28315
- enabled: external_exports.boolean()
28406
+ enabled: external_exports.boolean(),
28407
+ executable: external_exports.string(),
28408
+ args: external_exports.array(external_exports.string()).readonly(),
28409
+ cwd: external_exports.string(),
28410
+ environment: external_exports.array(external_exports.string()).readonly(),
28411
+ profileSettings: ProfileSettingsBagSchema
28316
28412
  });
28317
28413
  var TerminalLegacyCameraSchema = external_exports.object({
28318
28414
  stableId: external_exports.string(),
@@ -28351,7 +28447,24 @@ var terminalSessionCapability = {
28351
28447
  createInstance: method(external_exports.object({
28352
28448
  targetNodeId: external_exports.string().min(1),
28353
28449
  profileId: external_exports.string().min(1),
28354
- name: external_exports.string().trim().min(1).max(160).optional()
28450
+ name: external_exports.string().trim().min(1).max(160).optional(),
28451
+ executable: external_exports.string().max(1024).optional(),
28452
+ args: external_exports.array(external_exports.string().max(2048)).max(64).optional(),
28453
+ cwd: external_exports.string().max(1024).optional(),
28454
+ environment: external_exports.array(external_exports.string().max(4096)).max(64).optional(),
28455
+ profileSettings: ProfileSettingsBagSchema.optional()
28456
+ }), TerminalInstanceInfoSchema, {
28457
+ kind: "mutation",
28458
+ auth: "admin"
28459
+ }),
28460
+ updateInstance: method(external_exports.object({
28461
+ instanceId: external_exports.string().min(1),
28462
+ name: external_exports.string().trim().min(1).max(160).optional(),
28463
+ executable: external_exports.string().max(1024).optional(),
28464
+ args: external_exports.array(external_exports.string().max(2048)).max(64).optional(),
28465
+ cwd: external_exports.string().max(1024).optional(),
28466
+ environment: external_exports.array(external_exports.string().max(4096)).max(64).optional(),
28467
+ profileSettings: ProfileSettingsBagSchema.optional()
28355
28468
  }), TerminalInstanceInfoSchema, {
28356
28469
  kind: "mutation",
28357
28470
  auth: "admin"
@@ -28386,7 +28499,11 @@ var terminalSessionCapability = {
28386
28499
  openSession: method(external_exports.object({
28387
28500
  profileId: external_exports.string(),
28388
28501
  cols: external_exports.number().int().positive(),
28389
- rows: external_exports.number().int().positive()
28502
+ rows: external_exports.number().int().positive(),
28503
+ executable: external_exports.string().max(1024).optional(),
28504
+ args: external_exports.array(external_exports.string().max(2048)).max(64).optional(),
28505
+ cwd: external_exports.string().max(1024).optional(),
28506
+ environment: external_exports.array(external_exports.string().max(4096)).max(64).optional()
28390
28507
  }), TerminalSessionInfoSchema, {
28391
28508
  kind: "mutation",
28392
28509
  auth: "admin"
@@ -32109,6 +32226,12 @@ var NotificationEndpointSchema = external_exports.object({
32109
32226
  /** What the ranking currently resolves to (null when nothing is reachable). */
32110
32227
  resolved: external_exports.string().nullable()
32111
32228
  });
32229
+ var ViewerEndpointsSchema = external_exports.object({
32230
+ /** The operator's explicit race set, or empty for AUTO. */
32231
+ baseUrls: external_exports.array(external_exports.string()).readonly(),
32232
+ /** What the ranking currently resolves to (may be empty if nothing is up). */
32233
+ resolved: external_exports.array(external_exports.string()).readonly()
32234
+ });
32112
32235
  var AllowedAddressesSchema = external_exports.object({
32113
32236
  /**
32114
32237
  * Allowlist of interface addresses operators have explicitly opted
@@ -32118,6 +32241,20 @@ var AllowedAddressesSchema = external_exports.object({
32118
32241
  */
32119
32242
  addresses: external_exports.array(external_exports.string()).readonly()
32120
32243
  });
32244
+ var TlsStatusSchema = external_exports.object({
32245
+ mode: external_exports.enum([
32246
+ "generated",
32247
+ "uploaded",
32248
+ "disabled"
32249
+ ]),
32250
+ leafFingerprintSha256: external_exports.string().nullable(),
32251
+ caFingerprintSha256: external_exports.string().nullable(),
32252
+ validTo: external_exports.string().nullable(),
32253
+ sans: external_exports.array(external_exports.string()),
32254
+ caCertPem: external_exports.string().nullable(),
32255
+ reissueError: external_exports.string().nullable(),
32256
+ restartRequired: external_exports.boolean()
32257
+ });
32121
32258
  var localNetworkCapability = {
32122
32259
  name: "local-network",
32123
32260
  scope: "system",
@@ -32137,13 +32274,13 @@ var localNetworkCapability = {
32137
32274
  */
32138
32275
  getPreferred: method(external_exports.void(), PreferredSchema),
32139
32276
  /**
32140
- * Ordered candidate base URLs the SDK should try on connect.
32141
- * Includes LAN IPs (one per non-internal interface), the public
32142
- * tunnel hostname (when active), and loopback as a last-resort
32143
- * fallback. Filterable by `includeLoopback` / `ipv4Only`.
32144
- * Honours `getAllowedAddresses()` when set addresses outside
32145
- * the allowlist are dropped (the public tunnel + loopback are
32146
- * always included as escape hatches).
32277
+ * Ordered candidate base URLs (the palette the Network tab shows).
32278
+ * Includes LAN IPv4, stable LAN IPv6, the public tunnel, and mesh when
32279
+ * joined. Loopback is off by default. The SDK races the subset from
32280
+ * `getViewerEndpoints`, not this full list — IPv6 stays here because
32281
+ * WebRTC ICE gathers dual-stack regardless of the HTTP race. Honours
32282
+ * `getAllowedAddresses()` when set addresses outside the allowlist
32283
+ * are dropped (the public tunnel is still included as an escape hatch).
32147
32284
  *
32148
32285
  * **The port is the hub's, not the caller's** (D62 — a function's fact
32149
32286
  * belongs to whoever already owns it). This method used to take a `port`
@@ -32174,10 +32311,11 @@ var localNetworkCapability = {
32174
32311
  */
32175
32312
  port: external_exports.number().int().min(1).max(65535).optional(),
32176
32313
  /** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
32177
- * candidate. Default `true`. */
32314
+ * candidate. Default `false` — loopback is not a client route. */
32178
32315
  includeLoopback: external_exports.boolean().optional(),
32179
- /** Skip IPv6 entries. Some legacy clients can't parse them.
32180
- * Default `false`. */
32316
+ /** Skip IPv6 entries. Default `false` the palette includes stable
32317
+ * LAN IPv6 (ICE/WebRTC uses dual-stack regardless). Pass `true` to
32318
+ * hide them. The viewer HTTP/WS race is `getViewerEndpoints`. */
32181
32319
  ipv4Only: external_exports.boolean().optional(),
32182
32320
  /** Scheme to emit for LAN/loopback URLs. Default `'http'`.
32183
32321
  * Pass `'https'` when the caller is itself loaded over HTTPS
@@ -32206,6 +32344,19 @@ var localNetworkCapability = {
32206
32344
  */
32207
32345
  setNotificationEndpoint: method(external_exports.object({ baseUrl: external_exports.string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }),
32208
32346
  /**
32347
+ * The endpoints the SDK / viewer races for API access. Empty `baseUrls`
32348
+ * means AUTO: every LAN IPv4 address plus the public tunnel, never IPv6,
32349
+ * never mesh, never loopback. `resolved` is that set (or the operator's
32350
+ * explicit subset) as it stands right now.
32351
+ */
32352
+ getViewerEndpoints: method(external_exports.void(), ViewerEndpointsSchema),
32353
+ /**
32354
+ * Replace the viewer race set. Empty `baseUrls` restores AUTO. Stored
32355
+ * verbatim (not indices) so a temporarily-down tunnel is not silently
32356
+ * dropped from the operator's choice.
32357
+ */
32358
+ setViewerEndpoints: method(external_exports.object({ baseUrls: external_exports.array(external_exports.string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }),
32359
+ /**
32209
32360
  * Read the operator's allowlist. Empty = "auto" (no filter). Used
32210
32361
  * by the admin UI's address selector to seed its checkbox state.
32211
32362
  */
@@ -32223,7 +32374,34 @@ var localNetworkCapability = {
32223
32374
  * when the operator wants to wipe their manual edits and start
32224
32375
  * over from the auto-detected best matches.
32225
32376
  */
32226
- resetAllowlistToBestMatch: method(external_exports.void(), AllowedAddressesSchema, { kind: "mutation" })
32377
+ resetAllowlistToBestMatch: method(external_exports.void(), AllowedAddressesSchema, { kind: "mutation" }),
32378
+ /**
32379
+ * Live TLS material for the Network → Local access certificate card.
32380
+ * LAN HTTP / hostname are addon settings (`globalSettingsSchema`), not
32381
+ * a second store — this query is status, not configuration.
32382
+ */
32383
+ getTlsStatus: method(external_exports.void(), TlsStatusSchema),
32384
+ /** Issue a new leaf under the existing local CA. Disabled in uploaded mode. */
32385
+ regenerateCertificate: method(external_exports.object({ reason: external_exports.string().optional() }), TlsStatusSchema, {
32386
+ kind: "mutation",
32387
+ auth: "admin"
32388
+ }),
32389
+ /** Replace the served material with operator-supplied PEMs. */
32390
+ uploadCertificate: method(external_exports.object({
32391
+ certPem: external_exports.string().min(1),
32392
+ keyPem: external_exports.string().min(1),
32393
+ caPem: external_exports.string().optional()
32394
+ }), TlsStatusSchema, {
32395
+ kind: "mutation",
32396
+ auth: "admin"
32397
+ }),
32398
+ /** The local CA PEM, or empty when there is none to download. */
32399
+ downloadCa: method(external_exports.void(), external_exports.object({ pem: external_exports.string() })),
32400
+ /** Drop uploaded material and return to the generated local CA. */
32401
+ revertToGeneratedCertificate: method(external_exports.void(), TlsStatusSchema, {
32402
+ kind: "mutation",
32403
+ auth: "admin"
32404
+ })
32227
32405
  },
32228
32406
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
32229
32407
  mount: { kind: "hub-only" }
@@ -38897,6 +39075,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
38897
39075
  addonId: null,
38898
39076
  access: "create"
38899
39077
  },
39078
+ "localNetwork.downloadCa": {
39079
+ capName: "local-network",
39080
+ capScope: "system",
39081
+ addonId: null,
39082
+ access: "view"
39083
+ },
38900
39084
  "localNetwork.getAllowedAddresses": {
38901
39085
  capName: "local-network",
38902
39086
  capScope: "system",
@@ -38921,18 +39105,42 @@ var METHOD_ACCESS_MAP = Object.freeze({
38921
39105
  addonId: null,
38922
39106
  access: "view"
38923
39107
  },
39108
+ "localNetwork.getTlsStatus": {
39109
+ capName: "local-network",
39110
+ capScope: "system",
39111
+ addonId: null,
39112
+ access: "view"
39113
+ },
39114
+ "localNetwork.getViewerEndpoints": {
39115
+ capName: "local-network",
39116
+ capScope: "system",
39117
+ addonId: null,
39118
+ access: "view"
39119
+ },
38924
39120
  "localNetwork.list": {
38925
39121
  capName: "local-network",
38926
39122
  capScope: "system",
38927
39123
  addonId: null,
38928
39124
  access: "view"
38929
39125
  },
39126
+ "localNetwork.regenerateCertificate": {
39127
+ capName: "local-network",
39128
+ capScope: "system",
39129
+ addonId: null,
39130
+ access: "create"
39131
+ },
38930
39132
  "localNetwork.resetAllowlistToBestMatch": {
38931
39133
  capName: "local-network",
38932
39134
  capScope: "system",
38933
39135
  addonId: null,
38934
39136
  access: "delete"
38935
39137
  },
39138
+ "localNetwork.revertToGeneratedCertificate": {
39139
+ capName: "local-network",
39140
+ capScope: "system",
39141
+ addonId: null,
39142
+ access: "create"
39143
+ },
38936
39144
  "localNetwork.setAllowedAddresses": {
38937
39145
  capName: "local-network",
38938
39146
  capScope: "system",
@@ -38945,6 +39153,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
38945
39153
  addonId: null,
38946
39154
  access: "create"
38947
39155
  },
39156
+ "localNetwork.setViewerEndpoints": {
39157
+ capName: "local-network",
39158
+ capScope: "system",
39159
+ addonId: null,
39160
+ access: "create"
39161
+ },
39162
+ "localNetwork.uploadCertificate": {
39163
+ capName: "local-network",
39164
+ capScope: "system",
39165
+ addonId: null,
39166
+ access: "create"
39167
+ },
38948
39168
  "lockControl.lock": {
38949
39169
  capName: "lock-control",
38950
39170
  capScope: "device",
@@ -41825,6 +42045,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
41825
42045
  addonId: null,
41826
42046
  access: "create"
41827
42047
  },
42048
+ "terminalSession.updateInstance": {
42049
+ capName: "terminal-session",
42050
+ capScope: "system",
42051
+ addonId: null,
42052
+ access: "create"
42053
+ },
41828
42054
  "terminalSession.writeInput": {
41829
42055
  capName: "terminal-session",
41830
42056
  capScope: "system",
@@ -44196,6 +44422,35 @@ var CLUSTER_MODEL_SCOPED_STEPS = [{
44196
44422
  }];
44197
44423
  var DEFAULT_CLUSTER_STEP_MODELS = Object.freeze(Object.fromEntries(CLUSTER_MODEL_SCOPED_STEPS.map((s) => [s.stepId, s.defaultModelId])));
44198
44424
  var ChosenModelIdSchema = external_exports.string().min(1);
44425
+ var CLUSTER_STEP_SETTING_FIELDS = [{
44426
+ stepId: "face-embedding",
44427
+ key: "minLandmarkFaceSize",
44428
+ label: "Min face size for recognition (detection px)",
44429
+ description: "Refuse to embed a face smaller than this IN THE DETECTION FRAME. Applies to every node \u2014 the enrolled gallery is one index, and two admission floors would fill it from two policies. 0 disables the gate.",
44430
+ type: "slider",
44431
+ min: 0,
44432
+ max: 64,
44433
+ step: 2,
44434
+ default: 24
44435
+ }];
44436
+ function clusterStepSettingKey(stepId, fieldKey) {
44437
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
44438
+ }
44439
+ var ClusterSettingNumberSchema = external_exports.number().finite();
44440
+ function readClusterStepSettings(config2) {
44441
+ const out = {};
44442
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
44443
+ const parsed = ClusterSettingNumberSchema.safeParse(config2[clusterStepSettingKey(field.stepId, field.key)]);
44444
+ const value = parsed.success ? parsed.data : field.default;
44445
+ const existing = out[field.stepId] ?? {};
44446
+ out[field.stepId] = {
44447
+ ...existing,
44448
+ [field.key]: value
44449
+ };
44450
+ }
44451
+ return out;
44452
+ }
44453
+ var DEFAULT_CLUSTER_STEP_SETTINGS = readClusterStepSettings({});
44199
44454
  var DetailCropConventionSchema = external_exports.object({
44200
44455
  /**
44201
44456
  * Fraction of the box's own size added on EACH side before cutting.
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runDiscover
4
- } from "./chunk-OR2CMMOE.js";
4
+ } from "./chunk-VGIPYXDI.js";
5
5
  import "./chunk-LMMQX4CK.js";
6
6
 
7
7
  // src/cli.ts
@@ -38,7 +38,7 @@ async function runServe(args) {
38
38
  ...typeof values.data === "string" ? { data: values.data } : {}
39
39
  };
40
40
  Object.assign(process.env, buildServeEnv(opts));
41
- await import("./launcher-6VDFMPM6.js");
41
+ await import("./launcher-ZGFW4X34.js");
42
42
  }
43
43
 
44
44
  // src/commands/agent.ts
@@ -83,7 +83,7 @@ async function runAgent(args) {
83
83
  ...typeof values.port === "string" ? { port: values.port } : {}
84
84
  };
85
85
  Object.assign(process.env, buildAgentEnv(opts));
86
- await import("./launcher-6VDFMPM6.js");
86
+ await import("./launcher-ZGFW4X34.js");
87
87
  }
88
88
 
89
89
  // src/commands/setup.ts
@@ -1130,7 +1130,7 @@ function isUnknown(_value) {
1130
1130
  return true;
1131
1131
  }
1132
1132
  async function resolveServerInteractive(presetNamespace) {
1133
- const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-Y3C7HOBU.js");
1133
+ const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-PWDC46ET.js");
1134
1134
  if (presetNamespace) {
1135
1135
  const spinner4 = clack.spinner();
1136
1136
  spinner4.start(`Discovering hub on LAN (namespace "${presetNamespace}")`);
@@ -5,7 +5,7 @@ import {
5
5
  filterHubNodes,
6
6
  resolveHubFromDiscovered,
7
7
  runDiscover
8
- } from "./chunk-OR2CMMOE.js";
8
+ } from "./chunk-VGIPYXDI.js";
9
9
  import "./chunk-LMMQX4CK.js";
10
10
  export {
11
11
  DEFAULT_HUB_HTTPS_PORT,