@camstack/addon-smtp-nodemailer 1.2.25 → 1.2.26

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.
@@ -8041,6 +8041,15 @@ var LabelDefinitionSchema = object({
8041
8041
  description: string().optional(),
8042
8042
  icon: string().optional()
8043
8043
  });
8044
+ var ClassMapDefinitionSchema = object({
8045
+ mapping: record(string(), _enum([
8046
+ "person",
8047
+ "vehicle",
8048
+ "animal",
8049
+ "package"
8050
+ ])),
8051
+ preserveOriginal: boolean()
8052
+ });
8044
8053
  var MODEL_FORMATS = [
8045
8054
  "onnx",
8046
8055
  "coreml",
@@ -8219,7 +8228,13 @@ var ModelCatalogEntrySchema = object({
8219
8228
  * `id` stays the source of truth for resolution/download/persistence; grouping
8220
8229
  * is a presentation overlay resolved back to an `id`.
8221
8230
  */
8222
- group: ModelVariantGroupSchema.optional()
8231
+ group: ModelVariantGroupSchema.optional(),
8232
+ /**
8233
+ * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
8234
+ * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8235
+ * labels already ARE the CamStack macros (Scrypted identity map).
8236
+ */
8237
+ classMap: ClassMapDefinitionSchema.optional()
8223
8238
  });
8224
8239
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8225
8240
  format: literal("openvino"),
@@ -8248,7 +8263,8 @@ var ModelConvertMetadataSchema = object({
8248
8263
  "ocr",
8249
8264
  "segmentation"
8250
8265
  ]),
8251
- faceAlignment: boolean().optional()
8266
+ faceAlignment: boolean().optional(),
8267
+ classMap: ClassMapDefinitionSchema.optional()
8252
8268
  });
8253
8269
  var ConvertResultSchema = object({
8254
8270
  entry: ModelCatalogEntrySchema,
@@ -17239,6 +17255,33 @@ var NativeCropRefSchema = object({
17239
17255
  h: number()
17240
17256
  })
17241
17257
  });
17258
+ object({
17259
+ crop: object({
17260
+ left: number(),
17261
+ top: number(),
17262
+ width: number().positive(),
17263
+ height: number().positive()
17264
+ }).optional(),
17265
+ content: object({
17266
+ width: number().int().positive(),
17267
+ height: number().int().positive()
17268
+ }),
17269
+ fit: _enum(["stretch", "contain"]),
17270
+ format: _enum([
17271
+ "rgb",
17272
+ "gray",
17273
+ "jpeg"
17274
+ ])
17275
+ });
17276
+ var FrameRefSchema = object({
17277
+ registryId: string().min(1),
17278
+ id: string().min(1),
17279
+ width: number().int().positive(),
17280
+ height: number().int().positive(),
17281
+ format: _enum(["rgb", "gray"]),
17282
+ timestamp: number(),
17283
+ capturedAt: number().optional()
17284
+ });
17242
17285
  var ModelFormatSchema$1 = _enum([
17243
17286
  "onnx",
17244
17287
  "coreml",
@@ -17483,6 +17526,12 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
17483
17526
  steps: array(PipelineStepInputSchema).min(1),
17484
17527
  frame: FrameInputSchema.optional(),
17485
17528
  /**
17529
+ * Process-local lazy frame. Valid only when caller and provider resolve
17530
+ * in the same execution-group process; split/cross-node callers use
17531
+ * `frame`/`image` inline compatibility instead.
17532
+ */
17533
+ frameRef: FrameRefSchema.optional(),
17534
+ /**
17486
17535
  * CB5 shm passthrough — a `FrameHandle` naming the same ring slot
17487
17536
  * the decoded pixels live in. One more member of the one-of
17488
17537
  * frame/frameHandle/image/imageBase64/referenceImage group.
@@ -17738,7 +17787,10 @@ var NativeCropResultSchema = object({
17738
17787
  * Which source served this crop, so a quality-sensitive consumer (the native
17739
17788
  * `keyFrame`) can reject a degraded fallback:
17740
17789
  * - `native` — cut from the decode worker's retained NATIVE surface (the
17741
- * quality path).
17790
+ * quality path). A subject-tile serve is also native-resolution and stays
17791
+ * `native` here: the public enum cannot name `tile` without a breaking cap
17792
+ * change. Runner telemetry distinguishes lease vs tile via `source` on the
17793
+ * internal crop result (`nativeHits` vs `tileHits`).
17742
17794
  * - `ram-fullframe` — the native surface MISSED but the request was full-frame,
17743
17795
  * so the ≤640 RAM `RetainedFrameStore` served it (honest lower-res; legit for
17744
17796
  * the blank-frame guard / 640-snapshot resolve, NOT for the clean keyFrame).
@@ -18229,12 +18281,41 @@ var RunnerLocalLoadSchema = object({
18229
18281
  * legacy `OrchestratorMetricsSchema` shape so existing dashboards keep
18230
18282
  * working unchanged when they switch to reading from the runner cap.
18231
18283
  */
18284
+ var FrameLazyCountersSchema = object({
18285
+ framesDecoded: number(),
18286
+ framesAdmitted: number(),
18287
+ framesDroppedPixelFree: number(),
18288
+ viewsMaterialized: number(),
18289
+ viewsSkipped: number(),
18290
+ workerToRunnerBytes: number(),
18291
+ runnerToPoolRawBytes: number(),
18292
+ runnerToPoolJpegBytes: number(),
18293
+ onDemandFullFrameRequests: number(),
18294
+ onDemandCropRequests: number(),
18295
+ nativeHits: number(),
18296
+ nativeMisses: number(),
18297
+ tileHits: number(),
18298
+ tileMisses: number(),
18299
+ fallbackHits: number(),
18300
+ fallbackMisses: number(),
18301
+ retainedWritesAvoided: number(),
18302
+ residentRefs: number(),
18303
+ residentBytes: number(),
18304
+ releases: number(),
18305
+ evictions: number(),
18306
+ staleMisses: number()
18307
+ });
18308
+ var FrameLazyMetricsSchema = object({
18309
+ node: FrameLazyCountersSchema,
18310
+ cameras: array(FrameLazyCountersSchema.extend({ deviceId: number() }))
18311
+ });
18232
18312
  var RunnerLocalMetricsSchema = object({
18233
18313
  nodeId: string(),
18234
18314
  activeCameras: number(),
18235
18315
  throttledCameras: number(),
18236
18316
  avgInferenceTimeMs: number(),
18237
- queueDepth: number()
18317
+ queueDepth: number(),
18318
+ frameLazy: FrameLazyMetricsSchema.optional()
18238
18319
  });
18239
18320
  method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mutation" }), method(object({ deviceId: number() }), object({ success: literal(true) }), { kind: "mutation" }), method(ReportMotionInputSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), RunnerLocalLoadSchema), method(_void(), RunnerLocalMetricsSchema), method(object({ deviceId: number() }), CameraMetricsSchema.nullable()), method(_void(), array(CameraMetricsWithDeviceIdSchema).readonly()), method(_void(), array(number()).readonly()), method(object({
18240
18321
  handle: FrameHandleSchema,
@@ -19547,6 +19628,9 @@ method(_void(), ProviderInfoSchema), method(object({ config: record(string(), un
19547
19628
  location: StorageLocationSchema,
19548
19629
  relativePath: string()
19549
19630
  }), _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" });
19631
+ /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
19632
+ var ProfileSettingsSchemaBridge = unknown().nullable();
19633
+ var ProfileSettingsBagSchema = record(string(), unknown());
19550
19634
  /**
19551
19635
  * A live terminal session hosted by the provider addon. Output and input do
19552
19636
  * NOT flow through the capability — they use the addon data plane
@@ -19576,7 +19660,14 @@ var TerminalSessionInfoSchema = object({
19576
19660
  var TerminalProfileInfoSchema = object({
19577
19661
  profileId: string(),
19578
19662
  label: string(),
19579
- description: string().optional()
19663
+ description: string().optional(),
19664
+ /** Spawn defaults the instance form copies on create. */
19665
+ executable: string().optional(),
19666
+ args: array(string()).readonly().optional(),
19667
+ cwd: string().optional(),
19668
+ environment: array(string()).readonly().optional(),
19669
+ /** ConfigUISchema for instance knobs, or null when the profile has none. */
19670
+ settingsSchema: ProfileSettingsSchemaBridge.optional()
19580
19671
  });
19581
19672
  /**
19582
19673
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -19589,7 +19680,12 @@ var TerminalInstanceInfoSchema = object({
19589
19680
  profileId: string(),
19590
19681
  profileLabel: string(),
19591
19682
  name: string(),
19592
- enabled: boolean()
19683
+ enabled: boolean(),
19684
+ executable: string(),
19685
+ args: array(string()).readonly(),
19686
+ cwd: string(),
19687
+ environment: array(string()).readonly(),
19688
+ profileSettings: ProfileSettingsBagSchema
19593
19689
  });
19594
19690
  var TerminalLegacyCameraSchema = object({
19595
19691
  stableId: string(),
@@ -19619,7 +19715,23 @@ var TerminalOutputBatchSchema = object({
19619
19715
  method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }), method(_void(), array(TerminalInstanceInfoSchema).readonly(), { auth: "admin" }), method(object({
19620
19716
  targetNodeId: string().min(1),
19621
19717
  profileId: string().min(1),
19622
- name: string().trim().min(1).max(160).optional()
19718
+ name: string().trim().min(1).max(160).optional(),
19719
+ executable: string().max(1024).optional(),
19720
+ args: array(string().max(2048)).max(64).optional(),
19721
+ cwd: string().max(1024).optional(),
19722
+ environment: array(string().max(4096)).max(64).optional(),
19723
+ profileSettings: ProfileSettingsBagSchema.optional()
19724
+ }), TerminalInstanceInfoSchema, {
19725
+ kind: "mutation",
19726
+ auth: "admin"
19727
+ }), method(object({
19728
+ instanceId: string().min(1),
19729
+ name: string().trim().min(1).max(160).optional(),
19730
+ executable: string().max(1024).optional(),
19731
+ args: array(string().max(2048)).max(64).optional(),
19732
+ cwd: string().max(1024).optional(),
19733
+ environment: array(string().max(4096)).max(64).optional(),
19734
+ profileSettings: ProfileSettingsBagSchema.optional()
19623
19735
  }), TerminalInstanceInfoSchema, {
19624
19736
  kind: "mutation",
19625
19737
  auth: "admin"
@@ -19641,7 +19753,11 @@ method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }),
19641
19753
  }), method(_void(), array(TerminalSessionInfoSchema).readonly(), { auth: "admin" }), method(object({
19642
19754
  profileId: string(),
19643
19755
  cols: number().int().positive(),
19644
- rows: number().int().positive()
19756
+ rows: number().int().positive(),
19757
+ executable: string().max(1024).optional(),
19758
+ args: array(string().max(2048)).max(64).optional(),
19759
+ cwd: string().max(1024).optional(),
19760
+ environment: array(string().max(4096)).max(64).optional()
19645
19761
  }), TerminalSessionInfoSchema, {
19646
19762
  kind: "mutation",
19647
19763
  auth: "admin"
@@ -22423,10 +22539,10 @@ DeviceType.LawnMower, method(object({ deviceId: number().int().nonnegative() }),
22423
22539
  *
22424
22540
  * • The SDK (mobile / web client) consumes `getConnectionEndpoints()`
22425
22541
  * to receive an ordered list of candidate base URLs it should race
22426
- * on connect — LAN IPv4 first (lowest latency when on same network),
22427
- * then public hostname (if a tunnel is up), then IPv6. The SDK can
22428
- * race them with short timeouts and stick with the winner for the
22429
- * session.
22542
+ * on connect — LAN IPv4 and stable LAN IPv6 first (lowest latency
22543
+ * when on the same network), then public hostname (if a tunnel is
22544
+ * up). The SDK can race them with short timeouts and stick with the
22545
+ * winner for the session.
22430
22546
  *
22431
22547
  * Why hub-only: agents are not directly addressable by the operator's
22432
22548
  * clients — they reverse-connect to the hub. Exposing their interfaces
@@ -22581,6 +22697,17 @@ var NotificationEndpointSchema = object({
22581
22697
  /** What the ranking currently resolves to (null when nothing is reachable). */
22582
22698
  resolved: string().nullable()
22583
22699
  });
22700
+ /**
22701
+ * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
22702
+ * AUTO (every LAN IPv4 + the public tunnel). `resolved` is what that choice
22703
+ * currently expands to, so the UI can show the effective set either way.
22704
+ */
22705
+ var ViewerEndpointsSchema = object({
22706
+ /** The operator's explicit race set, or empty for AUTO. */
22707
+ baseUrls: array(string()).readonly(),
22708
+ /** What the ranking currently resolves to (may be empty if nothing is up). */
22709
+ resolved: array(string()).readonly()
22710
+ });
22584
22711
  var AllowedAddressesSchema = object({
22585
22712
  /**
22586
22713
  * Allowlist of interface addresses operators have explicitly opted
@@ -22589,6 +22716,20 @@ var AllowedAddressesSchema = object({
22589
22716
  * Network Addresses admin page and persisted by the addon.
22590
22717
  */
22591
22718
  addresses: array(string()).readonly() });
22719
+ var TlsStatusSchema = object({
22720
+ mode: _enum([
22721
+ "generated",
22722
+ "uploaded",
22723
+ "disabled"
22724
+ ]),
22725
+ leafFingerprintSha256: string().nullable(),
22726
+ caFingerprintSha256: string().nullable(),
22727
+ validTo: string().nullable(),
22728
+ sans: array(string()),
22729
+ caCertPem: string().nullable(),
22730
+ reissueError: string().nullable(),
22731
+ restartRequired: boolean()
22732
+ });
22592
22733
  method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
22593
22734
  /**
22594
22735
  * LEGACY HINT — do not send from new code. Kept optional so clients
@@ -22598,17 +22739,31 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
22598
22739
  */
22599
22740
  port: number().int().min(1).max(65535).optional(),
22600
22741
  /** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
22601
- * candidate. Default `true`. */
22742
+ * candidate. Default `false` — loopback is not a client route. */
22602
22743
  includeLoopback: boolean().optional(),
22603
- /** Skip IPv6 entries. Some legacy clients can't parse them.
22604
- * Default `false`. */
22744
+ /** Skip IPv6 entries. Default `false` the palette includes stable
22745
+ * LAN IPv6 (ICE/WebRTC uses dual-stack regardless). Pass `true` to
22746
+ * hide them. The viewer HTTP/WS race is `getViewerEndpoints`. */
22605
22747
  ipv4Only: boolean().optional(),
22606
22748
  /** Scheme to emit for LAN/loopback URLs. Default `'http'`.
22607
22749
  * Pass `'https'` when the caller is itself loaded over HTTPS
22608
22750
  * to avoid mixed-content blocks in the browser. The public
22609
22751
  * tunnel always emits `https://` regardless. */
22610
22752
  scheme: _enum(["http", "https"]).optional()
22611
- }), 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" });
22753
+ }), 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, {
22754
+ kind: "mutation",
22755
+ auth: "admin"
22756
+ }), method(object({
22757
+ certPem: string().min(1),
22758
+ keyPem: string().min(1),
22759
+ caPem: string().optional()
22760
+ }), TlsStatusSchema, {
22761
+ kind: "mutation",
22762
+ auth: "admin"
22763
+ }), method(_void(), object({ pem: string() })), method(_void(), TlsStatusSchema, {
22764
+ kind: "mutation",
22765
+ auth: "admin"
22766
+ });
22612
22767
  object({
22613
22768
  /** Lifecycle state of the lock. `jammed` means the motor reported
22614
22769
  * failure to reach the target — operator intervention required. */
@@ -28371,6 +28526,12 @@ Object.freeze({
28371
28526
  addonId: null,
28372
28527
  access: "create"
28373
28528
  },
28529
+ "localNetwork.downloadCa": {
28530
+ capName: "local-network",
28531
+ capScope: "system",
28532
+ addonId: null,
28533
+ access: "view"
28534
+ },
28374
28535
  "localNetwork.getAllowedAddresses": {
28375
28536
  capName: "local-network",
28376
28537
  capScope: "system",
@@ -28395,18 +28556,42 @@ Object.freeze({
28395
28556
  addonId: null,
28396
28557
  access: "view"
28397
28558
  },
28559
+ "localNetwork.getTlsStatus": {
28560
+ capName: "local-network",
28561
+ capScope: "system",
28562
+ addonId: null,
28563
+ access: "view"
28564
+ },
28565
+ "localNetwork.getViewerEndpoints": {
28566
+ capName: "local-network",
28567
+ capScope: "system",
28568
+ addonId: null,
28569
+ access: "view"
28570
+ },
28398
28571
  "localNetwork.list": {
28399
28572
  capName: "local-network",
28400
28573
  capScope: "system",
28401
28574
  addonId: null,
28402
28575
  access: "view"
28403
28576
  },
28577
+ "localNetwork.regenerateCertificate": {
28578
+ capName: "local-network",
28579
+ capScope: "system",
28580
+ addonId: null,
28581
+ access: "create"
28582
+ },
28404
28583
  "localNetwork.resetAllowlistToBestMatch": {
28405
28584
  capName: "local-network",
28406
28585
  capScope: "system",
28407
28586
  addonId: null,
28408
28587
  access: "delete"
28409
28588
  },
28589
+ "localNetwork.revertToGeneratedCertificate": {
28590
+ capName: "local-network",
28591
+ capScope: "system",
28592
+ addonId: null,
28593
+ access: "create"
28594
+ },
28410
28595
  "localNetwork.setAllowedAddresses": {
28411
28596
  capName: "local-network",
28412
28597
  capScope: "system",
@@ -28419,6 +28604,18 @@ Object.freeze({
28419
28604
  addonId: null,
28420
28605
  access: "create"
28421
28606
  },
28607
+ "localNetwork.setViewerEndpoints": {
28608
+ capName: "local-network",
28609
+ capScope: "system",
28610
+ addonId: null,
28611
+ access: "create"
28612
+ },
28613
+ "localNetwork.uploadCertificate": {
28614
+ capName: "local-network",
28615
+ capScope: "system",
28616
+ addonId: null,
28617
+ access: "create"
28618
+ },
28422
28619
  "lockControl.lock": {
28423
28620
  capName: "lock-control",
28424
28621
  capScope: "device",
@@ -31299,6 +31496,12 @@ Object.freeze({
31299
31496
  addonId: null,
31300
31497
  access: "create"
31301
31498
  },
31499
+ "terminalSession.updateInstance": {
31500
+ capName: "terminal-session",
31501
+ capScope: "system",
31502
+ addonId: null,
31503
+ access: "create"
31504
+ },
31302
31505
  "terminalSession.writeInput": {
31303
31506
  capName: "terminal-session",
31304
31507
  capScope: "system",
@@ -33786,6 +33989,35 @@ Object.freeze(Object.fromEntries([{
33786
33989
  }]
33787
33990
  }].map((s) => [s.stepId, s.defaultModelId])));
33788
33991
  string().min(1);
33992
+ var CLUSTER_STEP_SETTING_FIELDS = [{
33993
+ stepId: "face-embedding",
33994
+ key: "minLandmarkFaceSize",
33995
+ label: "Min face size for recognition (detection px)",
33996
+ 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.",
33997
+ type: "slider",
33998
+ min: 0,
33999
+ max: 64,
34000
+ step: 2,
34001
+ default: 24
34002
+ }];
34003
+ function clusterStepSettingKey(stepId, fieldKey) {
34004
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
34005
+ }
34006
+ var ClusterSettingNumberSchema = number().finite();
34007
+ function readClusterStepSettings(config) {
34008
+ const out = {};
34009
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
34010
+ const parsed = ClusterSettingNumberSchema.safeParse(config[clusterStepSettingKey(field.stepId, field.key)]);
34011
+ const value = parsed.success ? parsed.data : field.default;
34012
+ const existing = out[field.stepId] ?? {};
34013
+ out[field.stepId] = {
34014
+ ...existing,
34015
+ [field.key]: value
34016
+ };
34017
+ }
34018
+ return out;
34019
+ }
34020
+ readClusterStepSettings({});
33789
34021
  object({
33790
34022
  /**
33791
34023
  * Fraction of the box's own size added on EACH side before cutting.
@@ -8039,6 +8039,15 @@ var LabelDefinitionSchema = object({
8039
8039
  description: string().optional(),
8040
8040
  icon: string().optional()
8041
8041
  });
8042
+ var ClassMapDefinitionSchema = object({
8043
+ mapping: record(string(), _enum([
8044
+ "person",
8045
+ "vehicle",
8046
+ "animal",
8047
+ "package"
8048
+ ])),
8049
+ preserveOriginal: boolean()
8050
+ });
8042
8051
  var MODEL_FORMATS = [
8043
8052
  "onnx",
8044
8053
  "coreml",
@@ -8217,7 +8226,13 @@ var ModelCatalogEntrySchema = object({
8217
8226
  * `id` stays the source of truth for resolution/download/persistence; grouping
8218
8227
  * is a presentation overlay resolved back to an `id`.
8219
8228
  */
8220
- group: ModelVariantGroupSchema.optional()
8229
+ group: ModelVariantGroupSchema.optional(),
8230
+ /**
8231
+ * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
8232
+ * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8233
+ * labels already ARE the CamStack macros (Scrypted identity map).
8234
+ */
8235
+ classMap: ClassMapDefinitionSchema.optional()
8221
8236
  });
8222
8237
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8223
8238
  format: literal("openvino"),
@@ -8246,7 +8261,8 @@ var ModelConvertMetadataSchema = object({
8246
8261
  "ocr",
8247
8262
  "segmentation"
8248
8263
  ]),
8249
- faceAlignment: boolean().optional()
8264
+ faceAlignment: boolean().optional(),
8265
+ classMap: ClassMapDefinitionSchema.optional()
8250
8266
  });
8251
8267
  var ConvertResultSchema = object({
8252
8268
  entry: ModelCatalogEntrySchema,
@@ -17237,6 +17253,33 @@ var NativeCropRefSchema = object({
17237
17253
  h: number()
17238
17254
  })
17239
17255
  });
17256
+ object({
17257
+ crop: object({
17258
+ left: number(),
17259
+ top: number(),
17260
+ width: number().positive(),
17261
+ height: number().positive()
17262
+ }).optional(),
17263
+ content: object({
17264
+ width: number().int().positive(),
17265
+ height: number().int().positive()
17266
+ }),
17267
+ fit: _enum(["stretch", "contain"]),
17268
+ format: _enum([
17269
+ "rgb",
17270
+ "gray",
17271
+ "jpeg"
17272
+ ])
17273
+ });
17274
+ var FrameRefSchema = object({
17275
+ registryId: string().min(1),
17276
+ id: string().min(1),
17277
+ width: number().int().positive(),
17278
+ height: number().int().positive(),
17279
+ format: _enum(["rgb", "gray"]),
17280
+ timestamp: number(),
17281
+ capturedAt: number().optional()
17282
+ });
17240
17283
  var ModelFormatSchema$1 = _enum([
17241
17284
  "onnx",
17242
17285
  "coreml",
@@ -17481,6 +17524,12 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
17481
17524
  steps: array(PipelineStepInputSchema).min(1),
17482
17525
  frame: FrameInputSchema.optional(),
17483
17526
  /**
17527
+ * Process-local lazy frame. Valid only when caller and provider resolve
17528
+ * in the same execution-group process; split/cross-node callers use
17529
+ * `frame`/`image` inline compatibility instead.
17530
+ */
17531
+ frameRef: FrameRefSchema.optional(),
17532
+ /**
17484
17533
  * CB5 shm passthrough — a `FrameHandle` naming the same ring slot
17485
17534
  * the decoded pixels live in. One more member of the one-of
17486
17535
  * frame/frameHandle/image/imageBase64/referenceImage group.
@@ -17736,7 +17785,10 @@ var NativeCropResultSchema = object({
17736
17785
  * Which source served this crop, so a quality-sensitive consumer (the native
17737
17786
  * `keyFrame`) can reject a degraded fallback:
17738
17787
  * - `native` — cut from the decode worker's retained NATIVE surface (the
17739
- * quality path).
17788
+ * quality path). A subject-tile serve is also native-resolution and stays
17789
+ * `native` here: the public enum cannot name `tile` without a breaking cap
17790
+ * change. Runner telemetry distinguishes lease vs tile via `source` on the
17791
+ * internal crop result (`nativeHits` vs `tileHits`).
17740
17792
  * - `ram-fullframe` — the native surface MISSED but the request was full-frame,
17741
17793
  * so the ≤640 RAM `RetainedFrameStore` served it (honest lower-res; legit for
17742
17794
  * the blank-frame guard / 640-snapshot resolve, NOT for the clean keyFrame).
@@ -18227,12 +18279,41 @@ var RunnerLocalLoadSchema = object({
18227
18279
  * legacy `OrchestratorMetricsSchema` shape so existing dashboards keep
18228
18280
  * working unchanged when they switch to reading from the runner cap.
18229
18281
  */
18282
+ var FrameLazyCountersSchema = object({
18283
+ framesDecoded: number(),
18284
+ framesAdmitted: number(),
18285
+ framesDroppedPixelFree: number(),
18286
+ viewsMaterialized: number(),
18287
+ viewsSkipped: number(),
18288
+ workerToRunnerBytes: number(),
18289
+ runnerToPoolRawBytes: number(),
18290
+ runnerToPoolJpegBytes: number(),
18291
+ onDemandFullFrameRequests: number(),
18292
+ onDemandCropRequests: number(),
18293
+ nativeHits: number(),
18294
+ nativeMisses: number(),
18295
+ tileHits: number(),
18296
+ tileMisses: number(),
18297
+ fallbackHits: number(),
18298
+ fallbackMisses: number(),
18299
+ retainedWritesAvoided: number(),
18300
+ residentRefs: number(),
18301
+ residentBytes: number(),
18302
+ releases: number(),
18303
+ evictions: number(),
18304
+ staleMisses: number()
18305
+ });
18306
+ var FrameLazyMetricsSchema = object({
18307
+ node: FrameLazyCountersSchema,
18308
+ cameras: array(FrameLazyCountersSchema.extend({ deviceId: number() }))
18309
+ });
18230
18310
  var RunnerLocalMetricsSchema = object({
18231
18311
  nodeId: string(),
18232
18312
  activeCameras: number(),
18233
18313
  throttledCameras: number(),
18234
18314
  avgInferenceTimeMs: number(),
18235
- queueDepth: number()
18315
+ queueDepth: number(),
18316
+ frameLazy: FrameLazyMetricsSchema.optional()
18236
18317
  });
18237
18318
  method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mutation" }), method(object({ deviceId: number() }), object({ success: literal(true) }), { kind: "mutation" }), method(ReportMotionInputSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), RunnerLocalLoadSchema), method(_void(), RunnerLocalMetricsSchema), method(object({ deviceId: number() }), CameraMetricsSchema.nullable()), method(_void(), array(CameraMetricsWithDeviceIdSchema).readonly()), method(_void(), array(number()).readonly()), method(object({
18238
18319
  handle: FrameHandleSchema,
@@ -19545,6 +19626,9 @@ method(_void(), ProviderInfoSchema), method(object({ config: record(string(), un
19545
19626
  location: StorageLocationSchema,
19546
19627
  relativePath: string()
19547
19628
  }), _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" });
19629
+ /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
19630
+ var ProfileSettingsSchemaBridge = unknown().nullable();
19631
+ var ProfileSettingsBagSchema = record(string(), unknown());
19548
19632
  /**
19549
19633
  * A live terminal session hosted by the provider addon. Output and input do
19550
19634
  * NOT flow through the capability — they use the addon data plane
@@ -19574,7 +19658,14 @@ var TerminalSessionInfoSchema = object({
19574
19658
  var TerminalProfileInfoSchema = object({
19575
19659
  profileId: string(),
19576
19660
  label: string(),
19577
- description: string().optional()
19661
+ description: string().optional(),
19662
+ /** Spawn defaults the instance form copies on create. */
19663
+ executable: string().optional(),
19664
+ args: array(string()).readonly().optional(),
19665
+ cwd: string().optional(),
19666
+ environment: array(string()).readonly().optional(),
19667
+ /** ConfigUISchema for instance knobs, or null when the profile has none. */
19668
+ settingsSchema: ProfileSettingsSchemaBridge.optional()
19578
19669
  });
19579
19670
  /**
19580
19671
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -19587,7 +19678,12 @@ var TerminalInstanceInfoSchema = object({
19587
19678
  profileId: string(),
19588
19679
  profileLabel: string(),
19589
19680
  name: string(),
19590
- enabled: boolean()
19681
+ enabled: boolean(),
19682
+ executable: string(),
19683
+ args: array(string()).readonly(),
19684
+ cwd: string(),
19685
+ environment: array(string()).readonly(),
19686
+ profileSettings: ProfileSettingsBagSchema
19591
19687
  });
19592
19688
  var TerminalLegacyCameraSchema = object({
19593
19689
  stableId: string(),
@@ -19617,7 +19713,23 @@ var TerminalOutputBatchSchema = object({
19617
19713
  method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }), method(_void(), array(TerminalInstanceInfoSchema).readonly(), { auth: "admin" }), method(object({
19618
19714
  targetNodeId: string().min(1),
19619
19715
  profileId: string().min(1),
19620
- name: string().trim().min(1).max(160).optional()
19716
+ name: string().trim().min(1).max(160).optional(),
19717
+ executable: string().max(1024).optional(),
19718
+ args: array(string().max(2048)).max(64).optional(),
19719
+ cwd: string().max(1024).optional(),
19720
+ environment: array(string().max(4096)).max(64).optional(),
19721
+ profileSettings: ProfileSettingsBagSchema.optional()
19722
+ }), TerminalInstanceInfoSchema, {
19723
+ kind: "mutation",
19724
+ auth: "admin"
19725
+ }), method(object({
19726
+ instanceId: string().min(1),
19727
+ name: string().trim().min(1).max(160).optional(),
19728
+ executable: string().max(1024).optional(),
19729
+ args: array(string().max(2048)).max(64).optional(),
19730
+ cwd: string().max(1024).optional(),
19731
+ environment: array(string().max(4096)).max(64).optional(),
19732
+ profileSettings: ProfileSettingsBagSchema.optional()
19621
19733
  }), TerminalInstanceInfoSchema, {
19622
19734
  kind: "mutation",
19623
19735
  auth: "admin"
@@ -19639,7 +19751,11 @@ method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }),
19639
19751
  }), method(_void(), array(TerminalSessionInfoSchema).readonly(), { auth: "admin" }), method(object({
19640
19752
  profileId: string(),
19641
19753
  cols: number().int().positive(),
19642
- rows: number().int().positive()
19754
+ rows: number().int().positive(),
19755
+ executable: string().max(1024).optional(),
19756
+ args: array(string().max(2048)).max(64).optional(),
19757
+ cwd: string().max(1024).optional(),
19758
+ environment: array(string().max(4096)).max(64).optional()
19643
19759
  }), TerminalSessionInfoSchema, {
19644
19760
  kind: "mutation",
19645
19761
  auth: "admin"
@@ -22421,10 +22537,10 @@ DeviceType.LawnMower, method(object({ deviceId: number().int().nonnegative() }),
22421
22537
  *
22422
22538
  * • The SDK (mobile / web client) consumes `getConnectionEndpoints()`
22423
22539
  * to receive an ordered list of candidate base URLs it should race
22424
- * on connect — LAN IPv4 first (lowest latency when on same network),
22425
- * then public hostname (if a tunnel is up), then IPv6. The SDK can
22426
- * race them with short timeouts and stick with the winner for the
22427
- * session.
22540
+ * on connect — LAN IPv4 and stable LAN IPv6 first (lowest latency
22541
+ * when on the same network), then public hostname (if a tunnel is
22542
+ * up). The SDK can race them with short timeouts and stick with the
22543
+ * winner for the session.
22428
22544
  *
22429
22545
  * Why hub-only: agents are not directly addressable by the operator's
22430
22546
  * clients — they reverse-connect to the hub. Exposing their interfaces
@@ -22579,6 +22695,17 @@ var NotificationEndpointSchema = object({
22579
22695
  /** What the ranking currently resolves to (null when nothing is reachable). */
22580
22696
  resolved: string().nullable()
22581
22697
  });
22698
+ /**
22699
+ * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
22700
+ * AUTO (every LAN IPv4 + the public tunnel). `resolved` is what that choice
22701
+ * currently expands to, so the UI can show the effective set either way.
22702
+ */
22703
+ var ViewerEndpointsSchema = object({
22704
+ /** The operator's explicit race set, or empty for AUTO. */
22705
+ baseUrls: array(string()).readonly(),
22706
+ /** What the ranking currently resolves to (may be empty if nothing is up). */
22707
+ resolved: array(string()).readonly()
22708
+ });
22582
22709
  var AllowedAddressesSchema = object({
22583
22710
  /**
22584
22711
  * Allowlist of interface addresses operators have explicitly opted
@@ -22587,6 +22714,20 @@ var AllowedAddressesSchema = object({
22587
22714
  * Network Addresses admin page and persisted by the addon.
22588
22715
  */
22589
22716
  addresses: array(string()).readonly() });
22717
+ var TlsStatusSchema = object({
22718
+ mode: _enum([
22719
+ "generated",
22720
+ "uploaded",
22721
+ "disabled"
22722
+ ]),
22723
+ leafFingerprintSha256: string().nullable(),
22724
+ caFingerprintSha256: string().nullable(),
22725
+ validTo: string().nullable(),
22726
+ sans: array(string()),
22727
+ caCertPem: string().nullable(),
22728
+ reissueError: string().nullable(),
22729
+ restartRequired: boolean()
22730
+ });
22590
22731
  method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
22591
22732
  /**
22592
22733
  * LEGACY HINT — do not send from new code. Kept optional so clients
@@ -22596,17 +22737,31 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
22596
22737
  */
22597
22738
  port: number().int().min(1).max(65535).optional(),
22598
22739
  /** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
22599
- * candidate. Default `true`. */
22740
+ * candidate. Default `false` — loopback is not a client route. */
22600
22741
  includeLoopback: boolean().optional(),
22601
- /** Skip IPv6 entries. Some legacy clients can't parse them.
22602
- * Default `false`. */
22742
+ /** Skip IPv6 entries. Default `false` the palette includes stable
22743
+ * LAN IPv6 (ICE/WebRTC uses dual-stack regardless). Pass `true` to
22744
+ * hide them. The viewer HTTP/WS race is `getViewerEndpoints`. */
22603
22745
  ipv4Only: boolean().optional(),
22604
22746
  /** Scheme to emit for LAN/loopback URLs. Default `'http'`.
22605
22747
  * Pass `'https'` when the caller is itself loaded over HTTPS
22606
22748
  * to avoid mixed-content blocks in the browser. The public
22607
22749
  * tunnel always emits `https://` regardless. */
22608
22750
  scheme: _enum(["http", "https"]).optional()
22609
- }), 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" });
22751
+ }), 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, {
22752
+ kind: "mutation",
22753
+ auth: "admin"
22754
+ }), method(object({
22755
+ certPem: string().min(1),
22756
+ keyPem: string().min(1),
22757
+ caPem: string().optional()
22758
+ }), TlsStatusSchema, {
22759
+ kind: "mutation",
22760
+ auth: "admin"
22761
+ }), method(_void(), object({ pem: string() })), method(_void(), TlsStatusSchema, {
22762
+ kind: "mutation",
22763
+ auth: "admin"
22764
+ });
22610
22765
  object({
22611
22766
  /** Lifecycle state of the lock. `jammed` means the motor reported
22612
22767
  * failure to reach the target — operator intervention required. */
@@ -28369,6 +28524,12 @@ Object.freeze({
28369
28524
  addonId: null,
28370
28525
  access: "create"
28371
28526
  },
28527
+ "localNetwork.downloadCa": {
28528
+ capName: "local-network",
28529
+ capScope: "system",
28530
+ addonId: null,
28531
+ access: "view"
28532
+ },
28372
28533
  "localNetwork.getAllowedAddresses": {
28373
28534
  capName: "local-network",
28374
28535
  capScope: "system",
@@ -28393,18 +28554,42 @@ Object.freeze({
28393
28554
  addonId: null,
28394
28555
  access: "view"
28395
28556
  },
28557
+ "localNetwork.getTlsStatus": {
28558
+ capName: "local-network",
28559
+ capScope: "system",
28560
+ addonId: null,
28561
+ access: "view"
28562
+ },
28563
+ "localNetwork.getViewerEndpoints": {
28564
+ capName: "local-network",
28565
+ capScope: "system",
28566
+ addonId: null,
28567
+ access: "view"
28568
+ },
28396
28569
  "localNetwork.list": {
28397
28570
  capName: "local-network",
28398
28571
  capScope: "system",
28399
28572
  addonId: null,
28400
28573
  access: "view"
28401
28574
  },
28575
+ "localNetwork.regenerateCertificate": {
28576
+ capName: "local-network",
28577
+ capScope: "system",
28578
+ addonId: null,
28579
+ access: "create"
28580
+ },
28402
28581
  "localNetwork.resetAllowlistToBestMatch": {
28403
28582
  capName: "local-network",
28404
28583
  capScope: "system",
28405
28584
  addonId: null,
28406
28585
  access: "delete"
28407
28586
  },
28587
+ "localNetwork.revertToGeneratedCertificate": {
28588
+ capName: "local-network",
28589
+ capScope: "system",
28590
+ addonId: null,
28591
+ access: "create"
28592
+ },
28408
28593
  "localNetwork.setAllowedAddresses": {
28409
28594
  capName: "local-network",
28410
28595
  capScope: "system",
@@ -28417,6 +28602,18 @@ Object.freeze({
28417
28602
  addonId: null,
28418
28603
  access: "create"
28419
28604
  },
28605
+ "localNetwork.setViewerEndpoints": {
28606
+ capName: "local-network",
28607
+ capScope: "system",
28608
+ addonId: null,
28609
+ access: "create"
28610
+ },
28611
+ "localNetwork.uploadCertificate": {
28612
+ capName: "local-network",
28613
+ capScope: "system",
28614
+ addonId: null,
28615
+ access: "create"
28616
+ },
28420
28617
  "lockControl.lock": {
28421
28618
  capName: "lock-control",
28422
28619
  capScope: "device",
@@ -31297,6 +31494,12 @@ Object.freeze({
31297
31494
  addonId: null,
31298
31495
  access: "create"
31299
31496
  },
31497
+ "terminalSession.updateInstance": {
31498
+ capName: "terminal-session",
31499
+ capScope: "system",
31500
+ addonId: null,
31501
+ access: "create"
31502
+ },
31300
31503
  "terminalSession.writeInput": {
31301
31504
  capName: "terminal-session",
31302
31505
  capScope: "system",
@@ -33784,6 +33987,35 @@ Object.freeze(Object.fromEntries([{
33784
33987
  }]
33785
33988
  }].map((s) => [s.stepId, s.defaultModelId])));
33786
33989
  string().min(1);
33990
+ var CLUSTER_STEP_SETTING_FIELDS = [{
33991
+ stepId: "face-embedding",
33992
+ key: "minLandmarkFaceSize",
33993
+ label: "Min face size for recognition (detection px)",
33994
+ 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.",
33995
+ type: "slider",
33996
+ min: 0,
33997
+ max: 64,
33998
+ step: 2,
33999
+ default: 24
34000
+ }];
34001
+ function clusterStepSettingKey(stepId, fieldKey) {
34002
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
34003
+ }
34004
+ var ClusterSettingNumberSchema = number().finite();
34005
+ function readClusterStepSettings(config) {
34006
+ const out = {};
34007
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
34008
+ const parsed = ClusterSettingNumberSchema.safeParse(config[clusterStepSettingKey(field.stepId, field.key)]);
34009
+ const value = parsed.success ? parsed.data : field.default;
34010
+ const existing = out[field.stepId] ?? {};
34011
+ out[field.stepId] = {
34012
+ ...existing,
34013
+ [field.key]: value
34014
+ };
34015
+ }
34016
+ return out;
34017
+ }
34018
+ readClusterStepSettings({});
33787
34019
  object({
33788
34020
  /**
33789
34021
  * Fraction of the box's own size added on EACH side before cutting.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-smtp-nodemailer",
3
- "version": "1.2.25",
3
+ "version": "1.2.26",
4
4
  "description": "SMTP email provider addon for CamStack — wraps `nodemailer` and registers a `smtp-provider` cap collection entry. Used by magic-link login + notifier addons.",
5
5
  "keywords": [
6
6
  "camstack",