@camstack/addon-mqtt-broker 1.2.26 → 1.2.27

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.
@@ -8049,6 +8049,15 @@ var LabelDefinitionSchema = object({
8049
8049
  description: string().optional(),
8050
8050
  icon: string().optional()
8051
8051
  });
8052
+ var ClassMapDefinitionSchema = object({
8053
+ mapping: record(string(), _enum([
8054
+ "person",
8055
+ "vehicle",
8056
+ "animal",
8057
+ "package"
8058
+ ])),
8059
+ preserveOriginal: boolean()
8060
+ });
8052
8061
  var MODEL_FORMATS = [
8053
8062
  "onnx",
8054
8063
  "coreml",
@@ -8227,7 +8236,13 @@ var ModelCatalogEntrySchema = object({
8227
8236
  * `id` stays the source of truth for resolution/download/persistence; grouping
8228
8237
  * is a presentation overlay resolved back to an `id`.
8229
8238
  */
8230
- group: ModelVariantGroupSchema.optional()
8239
+ group: ModelVariantGroupSchema.optional(),
8240
+ /**
8241
+ * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
8242
+ * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8243
+ * labels already ARE the CamStack macros (Scrypted identity map).
8244
+ */
8245
+ classMap: ClassMapDefinitionSchema.optional()
8231
8246
  });
8232
8247
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8233
8248
  format: literal("openvino"),
@@ -8256,7 +8271,8 @@ var ModelConvertMetadataSchema = object({
8256
8271
  "ocr",
8257
8272
  "segmentation"
8258
8273
  ]),
8259
- faceAlignment: boolean().optional()
8274
+ faceAlignment: boolean().optional(),
8275
+ classMap: ClassMapDefinitionSchema.optional()
8260
8276
  });
8261
8277
  var ConvertResultSchema = object({
8262
8278
  entry: ModelCatalogEntrySchema,
@@ -17315,6 +17331,33 @@ var NativeCropRefSchema = object({
17315
17331
  h: number()
17316
17332
  })
17317
17333
  });
17334
+ object({
17335
+ crop: object({
17336
+ left: number(),
17337
+ top: number(),
17338
+ width: number().positive(),
17339
+ height: number().positive()
17340
+ }).optional(),
17341
+ content: object({
17342
+ width: number().int().positive(),
17343
+ height: number().int().positive()
17344
+ }),
17345
+ fit: _enum(["stretch", "contain"]),
17346
+ format: _enum([
17347
+ "rgb",
17348
+ "gray",
17349
+ "jpeg"
17350
+ ])
17351
+ });
17352
+ var FrameRefSchema = object({
17353
+ registryId: string().min(1),
17354
+ id: string().min(1),
17355
+ width: number().int().positive(),
17356
+ height: number().int().positive(),
17357
+ format: _enum(["rgb", "gray"]),
17358
+ timestamp: number(),
17359
+ capturedAt: number().optional()
17360
+ });
17318
17361
  var ModelFormatSchema$1 = _enum([
17319
17362
  "onnx",
17320
17363
  "coreml",
@@ -17559,6 +17602,12 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
17559
17602
  steps: array(PipelineStepInputSchema).min(1),
17560
17603
  frame: FrameInputSchema.optional(),
17561
17604
  /**
17605
+ * Process-local lazy frame. Valid only when caller and provider resolve
17606
+ * in the same execution-group process; split/cross-node callers use
17607
+ * `frame`/`image` inline compatibility instead.
17608
+ */
17609
+ frameRef: FrameRefSchema.optional(),
17610
+ /**
17562
17611
  * CB5 shm passthrough — a `FrameHandle` naming the same ring slot
17563
17612
  * the decoded pixels live in. One more member of the one-of
17564
17613
  * frame/frameHandle/image/imageBase64/referenceImage group.
@@ -17814,7 +17863,10 @@ var NativeCropResultSchema = object({
17814
17863
  * Which source served this crop, so a quality-sensitive consumer (the native
17815
17864
  * `keyFrame`) can reject a degraded fallback:
17816
17865
  * - `native` — cut from the decode worker's retained NATIVE surface (the
17817
- * quality path).
17866
+ * quality path). A subject-tile serve is also native-resolution and stays
17867
+ * `native` here: the public enum cannot name `tile` without a breaking cap
17868
+ * change. Runner telemetry distinguishes lease vs tile via `source` on the
17869
+ * internal crop result (`nativeHits` vs `tileHits`).
17818
17870
  * - `ram-fullframe` — the native surface MISSED but the request was full-frame,
17819
17871
  * so the ≤640 RAM `RetainedFrameStore` served it (honest lower-res; legit for
17820
17872
  * the blank-frame guard / 640-snapshot resolve, NOT for the clean keyFrame).
@@ -18305,12 +18357,41 @@ var RunnerLocalLoadSchema = object({
18305
18357
  * legacy `OrchestratorMetricsSchema` shape so existing dashboards keep
18306
18358
  * working unchanged when they switch to reading from the runner cap.
18307
18359
  */
18360
+ var FrameLazyCountersSchema = object({
18361
+ framesDecoded: number(),
18362
+ framesAdmitted: number(),
18363
+ framesDroppedPixelFree: number(),
18364
+ viewsMaterialized: number(),
18365
+ viewsSkipped: number(),
18366
+ workerToRunnerBytes: number(),
18367
+ runnerToPoolRawBytes: number(),
18368
+ runnerToPoolJpegBytes: number(),
18369
+ onDemandFullFrameRequests: number(),
18370
+ onDemandCropRequests: number(),
18371
+ nativeHits: number(),
18372
+ nativeMisses: number(),
18373
+ tileHits: number(),
18374
+ tileMisses: number(),
18375
+ fallbackHits: number(),
18376
+ fallbackMisses: number(),
18377
+ retainedWritesAvoided: number(),
18378
+ residentRefs: number(),
18379
+ residentBytes: number(),
18380
+ releases: number(),
18381
+ evictions: number(),
18382
+ staleMisses: number()
18383
+ });
18384
+ var FrameLazyMetricsSchema = object({
18385
+ node: FrameLazyCountersSchema,
18386
+ cameras: array(FrameLazyCountersSchema.extend({ deviceId: number() }))
18387
+ });
18308
18388
  var RunnerLocalMetricsSchema = object({
18309
18389
  nodeId: string(),
18310
18390
  activeCameras: number(),
18311
18391
  throttledCameras: number(),
18312
18392
  avgInferenceTimeMs: number(),
18313
- queueDepth: number()
18393
+ queueDepth: number(),
18394
+ frameLazy: FrameLazyMetricsSchema.optional()
18314
18395
  });
18315
18396
  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({
18316
18397
  handle: FrameHandleSchema,
@@ -19610,6 +19691,9 @@ method(_void(), ProviderInfoSchema), method(object({ config: record(string(), un
19610
19691
  location: StorageLocationSchema,
19611
19692
  relativePath: string()
19612
19693
  }), _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" });
19694
+ /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
19695
+ var ProfileSettingsSchemaBridge = unknown().nullable();
19696
+ var ProfileSettingsBagSchema = record(string(), unknown());
19613
19697
  /**
19614
19698
  * A live terminal session hosted by the provider addon. Output and input do
19615
19699
  * NOT flow through the capability — they use the addon data plane
@@ -19639,7 +19723,14 @@ var TerminalSessionInfoSchema = object({
19639
19723
  var TerminalProfileInfoSchema = object({
19640
19724
  profileId: string(),
19641
19725
  label: string(),
19642
- description: string().optional()
19726
+ description: string().optional(),
19727
+ /** Spawn defaults the instance form copies on create. */
19728
+ executable: string().optional(),
19729
+ args: array(string()).readonly().optional(),
19730
+ cwd: string().optional(),
19731
+ environment: array(string()).readonly().optional(),
19732
+ /** ConfigUISchema for instance knobs, or null when the profile has none. */
19733
+ settingsSchema: ProfileSettingsSchemaBridge.optional()
19643
19734
  });
19644
19735
  /**
19645
19736
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -19652,7 +19743,12 @@ var TerminalInstanceInfoSchema = object({
19652
19743
  profileId: string(),
19653
19744
  profileLabel: string(),
19654
19745
  name: string(),
19655
- enabled: boolean()
19746
+ enabled: boolean(),
19747
+ executable: string(),
19748
+ args: array(string()).readonly(),
19749
+ cwd: string(),
19750
+ environment: array(string()).readonly(),
19751
+ profileSettings: ProfileSettingsBagSchema
19656
19752
  });
19657
19753
  var TerminalLegacyCameraSchema = object({
19658
19754
  stableId: string(),
@@ -19682,7 +19778,23 @@ var TerminalOutputBatchSchema = object({
19682
19778
  method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }), method(_void(), array(TerminalInstanceInfoSchema).readonly(), { auth: "admin" }), method(object({
19683
19779
  targetNodeId: string().min(1),
19684
19780
  profileId: string().min(1),
19685
- name: string().trim().min(1).max(160).optional()
19781
+ name: string().trim().min(1).max(160).optional(),
19782
+ executable: string().max(1024).optional(),
19783
+ args: array(string().max(2048)).max(64).optional(),
19784
+ cwd: string().max(1024).optional(),
19785
+ environment: array(string().max(4096)).max(64).optional(),
19786
+ profileSettings: ProfileSettingsBagSchema.optional()
19787
+ }), TerminalInstanceInfoSchema, {
19788
+ kind: "mutation",
19789
+ auth: "admin"
19790
+ }), method(object({
19791
+ instanceId: string().min(1),
19792
+ name: string().trim().min(1).max(160).optional(),
19793
+ executable: string().max(1024).optional(),
19794
+ args: array(string().max(2048)).max(64).optional(),
19795
+ cwd: string().max(1024).optional(),
19796
+ environment: array(string().max(4096)).max(64).optional(),
19797
+ profileSettings: ProfileSettingsBagSchema.optional()
19686
19798
  }), TerminalInstanceInfoSchema, {
19687
19799
  kind: "mutation",
19688
19800
  auth: "admin"
@@ -19704,7 +19816,11 @@ method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }),
19704
19816
  }), method(_void(), array(TerminalSessionInfoSchema).readonly(), { auth: "admin" }), method(object({
19705
19817
  profileId: string(),
19706
19818
  cols: number().int().positive(),
19707
- rows: number().int().positive()
19819
+ rows: number().int().positive(),
19820
+ executable: string().max(1024).optional(),
19821
+ args: array(string().max(2048)).max(64).optional(),
19822
+ cwd: string().max(1024).optional(),
19823
+ environment: array(string().max(4096)).max(64).optional()
19708
19824
  }), TerminalSessionInfoSchema, {
19709
19825
  kind: "mutation",
19710
19826
  auth: "admin"
@@ -22486,10 +22602,10 @@ DeviceType.LawnMower, method(object({ deviceId: number().int().nonnegative() }),
22486
22602
  *
22487
22603
  * • The SDK (mobile / web client) consumes `getConnectionEndpoints()`
22488
22604
  * to receive an ordered list of candidate base URLs it should race
22489
- * on connect — LAN IPv4 first (lowest latency when on same network),
22490
- * then public hostname (if a tunnel is up), then IPv6. The SDK can
22491
- * race them with short timeouts and stick with the winner for the
22492
- * session.
22605
+ * on connect — LAN IPv4 and stable LAN IPv6 first (lowest latency
22606
+ * when on the same network), then public hostname (if a tunnel is
22607
+ * up). The SDK can race them with short timeouts and stick with the
22608
+ * winner for the session.
22493
22609
  *
22494
22610
  * Why hub-only: agents are not directly addressable by the operator's
22495
22611
  * clients — they reverse-connect to the hub. Exposing their interfaces
@@ -22644,6 +22760,17 @@ var NotificationEndpointSchema = object({
22644
22760
  /** What the ranking currently resolves to (null when nothing is reachable). */
22645
22761
  resolved: string().nullable()
22646
22762
  });
22763
+ /**
22764
+ * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
22765
+ * AUTO (every LAN IPv4 + the public tunnel). `resolved` is what that choice
22766
+ * currently expands to, so the UI can show the effective set either way.
22767
+ */
22768
+ var ViewerEndpointsSchema = object({
22769
+ /** The operator's explicit race set, or empty for AUTO. */
22770
+ baseUrls: array(string()).readonly(),
22771
+ /** What the ranking currently resolves to (may be empty if nothing is up). */
22772
+ resolved: array(string()).readonly()
22773
+ });
22647
22774
  var AllowedAddressesSchema = object({
22648
22775
  /**
22649
22776
  * Allowlist of interface addresses operators have explicitly opted
@@ -22652,6 +22779,20 @@ var AllowedAddressesSchema = object({
22652
22779
  * Network Addresses admin page and persisted by the addon.
22653
22780
  */
22654
22781
  addresses: array(string()).readonly() });
22782
+ var TlsStatusSchema = object({
22783
+ mode: _enum([
22784
+ "generated",
22785
+ "uploaded",
22786
+ "disabled"
22787
+ ]),
22788
+ leafFingerprintSha256: string().nullable(),
22789
+ caFingerprintSha256: string().nullable(),
22790
+ validTo: string().nullable(),
22791
+ sans: array(string()),
22792
+ caCertPem: string().nullable(),
22793
+ reissueError: string().nullable(),
22794
+ restartRequired: boolean()
22795
+ });
22655
22796
  method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
22656
22797
  /**
22657
22798
  * LEGACY HINT — do not send from new code. Kept optional so clients
@@ -22661,17 +22802,31 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
22661
22802
  */
22662
22803
  port: number().int().min(1).max(65535).optional(),
22663
22804
  /** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
22664
- * candidate. Default `true`. */
22805
+ * candidate. Default `false` — loopback is not a client route. */
22665
22806
  includeLoopback: boolean().optional(),
22666
- /** Skip IPv6 entries. Some legacy clients can't parse them.
22667
- * Default `false`. */
22807
+ /** Skip IPv6 entries. Default `false` the palette includes stable
22808
+ * LAN IPv6 (ICE/WebRTC uses dual-stack regardless). Pass `true` to
22809
+ * hide them. The viewer HTTP/WS race is `getViewerEndpoints`. */
22668
22810
  ipv4Only: boolean().optional(),
22669
22811
  /** Scheme to emit for LAN/loopback URLs. Default `'http'`.
22670
22812
  * Pass `'https'` when the caller is itself loaded over HTTPS
22671
22813
  * to avoid mixed-content blocks in the browser. The public
22672
22814
  * tunnel always emits `https://` regardless. */
22673
22815
  scheme: _enum(["http", "https"]).optional()
22674
- }), 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" });
22816
+ }), 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, {
22817
+ kind: "mutation",
22818
+ auth: "admin"
22819
+ }), method(object({
22820
+ certPem: string().min(1),
22821
+ keyPem: string().min(1),
22822
+ caPem: string().optional()
22823
+ }), TlsStatusSchema, {
22824
+ kind: "mutation",
22825
+ auth: "admin"
22826
+ }), method(_void(), object({ pem: string() })), method(_void(), TlsStatusSchema, {
22827
+ kind: "mutation",
22828
+ auth: "admin"
22829
+ });
22675
22830
  object({
22676
22831
  /** Lifecycle state of the lock. `jammed` means the motor reported
22677
22832
  * failure to reach the target — operator intervention required. */
@@ -28434,6 +28589,12 @@ Object.freeze({
28434
28589
  addonId: null,
28435
28590
  access: "create"
28436
28591
  },
28592
+ "localNetwork.downloadCa": {
28593
+ capName: "local-network",
28594
+ capScope: "system",
28595
+ addonId: null,
28596
+ access: "view"
28597
+ },
28437
28598
  "localNetwork.getAllowedAddresses": {
28438
28599
  capName: "local-network",
28439
28600
  capScope: "system",
@@ -28458,18 +28619,42 @@ Object.freeze({
28458
28619
  addonId: null,
28459
28620
  access: "view"
28460
28621
  },
28622
+ "localNetwork.getTlsStatus": {
28623
+ capName: "local-network",
28624
+ capScope: "system",
28625
+ addonId: null,
28626
+ access: "view"
28627
+ },
28628
+ "localNetwork.getViewerEndpoints": {
28629
+ capName: "local-network",
28630
+ capScope: "system",
28631
+ addonId: null,
28632
+ access: "view"
28633
+ },
28461
28634
  "localNetwork.list": {
28462
28635
  capName: "local-network",
28463
28636
  capScope: "system",
28464
28637
  addonId: null,
28465
28638
  access: "view"
28466
28639
  },
28640
+ "localNetwork.regenerateCertificate": {
28641
+ capName: "local-network",
28642
+ capScope: "system",
28643
+ addonId: null,
28644
+ access: "create"
28645
+ },
28467
28646
  "localNetwork.resetAllowlistToBestMatch": {
28468
28647
  capName: "local-network",
28469
28648
  capScope: "system",
28470
28649
  addonId: null,
28471
28650
  access: "delete"
28472
28651
  },
28652
+ "localNetwork.revertToGeneratedCertificate": {
28653
+ capName: "local-network",
28654
+ capScope: "system",
28655
+ addonId: null,
28656
+ access: "create"
28657
+ },
28473
28658
  "localNetwork.setAllowedAddresses": {
28474
28659
  capName: "local-network",
28475
28660
  capScope: "system",
@@ -28482,6 +28667,18 @@ Object.freeze({
28482
28667
  addonId: null,
28483
28668
  access: "create"
28484
28669
  },
28670
+ "localNetwork.setViewerEndpoints": {
28671
+ capName: "local-network",
28672
+ capScope: "system",
28673
+ addonId: null,
28674
+ access: "create"
28675
+ },
28676
+ "localNetwork.uploadCertificate": {
28677
+ capName: "local-network",
28678
+ capScope: "system",
28679
+ addonId: null,
28680
+ access: "create"
28681
+ },
28485
28682
  "lockControl.lock": {
28486
28683
  capName: "lock-control",
28487
28684
  capScope: "device",
@@ -31362,6 +31559,12 @@ Object.freeze({
31362
31559
  addonId: null,
31363
31560
  access: "create"
31364
31561
  },
31562
+ "terminalSession.updateInstance": {
31563
+ capName: "terminal-session",
31564
+ capScope: "system",
31565
+ addonId: null,
31566
+ access: "create"
31567
+ },
31365
31568
  "terminalSession.writeInput": {
31366
31569
  capName: "terminal-session",
31367
31570
  capScope: "system",
@@ -33849,6 +34052,35 @@ Object.freeze(Object.fromEntries([{
33849
34052
  }]
33850
34053
  }].map((s) => [s.stepId, s.defaultModelId])));
33851
34054
  string().min(1);
34055
+ var CLUSTER_STEP_SETTING_FIELDS = [{
34056
+ stepId: "face-embedding",
34057
+ key: "minLandmarkFaceSize",
34058
+ label: "Min face size for recognition (detection px)",
34059
+ 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.",
34060
+ type: "slider",
34061
+ min: 0,
34062
+ max: 64,
34063
+ step: 2,
34064
+ default: 24
34065
+ }];
34066
+ function clusterStepSettingKey(stepId, fieldKey) {
34067
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
34068
+ }
34069
+ var ClusterSettingNumberSchema = number().finite();
34070
+ function readClusterStepSettings(config) {
34071
+ const out = {};
34072
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
34073
+ const parsed = ClusterSettingNumberSchema.safeParse(config[clusterStepSettingKey(field.stepId, field.key)]);
34074
+ const value = parsed.success ? parsed.data : field.default;
34075
+ const existing = out[field.stepId] ?? {};
34076
+ out[field.stepId] = {
34077
+ ...existing,
34078
+ [field.key]: value
34079
+ };
34080
+ }
34081
+ return out;
34082
+ }
34083
+ readClusterStepSettings({});
33852
34084
  object({
33853
34085
  /**
33854
34086
  * Fraction of the box's own size added on EACH side before cutting.
@@ -8044,6 +8044,15 @@ var LabelDefinitionSchema = object({
8044
8044
  description: string().optional(),
8045
8045
  icon: string().optional()
8046
8046
  });
8047
+ var ClassMapDefinitionSchema = object({
8048
+ mapping: record(string(), _enum([
8049
+ "person",
8050
+ "vehicle",
8051
+ "animal",
8052
+ "package"
8053
+ ])),
8054
+ preserveOriginal: boolean()
8055
+ });
8047
8056
  var MODEL_FORMATS = [
8048
8057
  "onnx",
8049
8058
  "coreml",
@@ -8222,7 +8231,13 @@ var ModelCatalogEntrySchema = object({
8222
8231
  * `id` stays the source of truth for resolution/download/persistence; grouping
8223
8232
  * is a presentation overlay resolved back to an `id`.
8224
8233
  */
8225
- group: ModelVariantGroupSchema.optional()
8234
+ group: ModelVariantGroupSchema.optional(),
8235
+ /**
8236
+ * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
8237
+ * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8238
+ * labels already ARE the CamStack macros (Scrypted identity map).
8239
+ */
8240
+ classMap: ClassMapDefinitionSchema.optional()
8226
8241
  });
8227
8242
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8228
8243
  format: literal("openvino"),
@@ -8251,7 +8266,8 @@ var ModelConvertMetadataSchema = object({
8251
8266
  "ocr",
8252
8267
  "segmentation"
8253
8268
  ]),
8254
- faceAlignment: boolean().optional()
8269
+ faceAlignment: boolean().optional(),
8270
+ classMap: ClassMapDefinitionSchema.optional()
8255
8271
  });
8256
8272
  var ConvertResultSchema = object({
8257
8273
  entry: ModelCatalogEntrySchema,
@@ -17310,6 +17326,33 @@ var NativeCropRefSchema = object({
17310
17326
  h: number()
17311
17327
  })
17312
17328
  });
17329
+ object({
17330
+ crop: object({
17331
+ left: number(),
17332
+ top: number(),
17333
+ width: number().positive(),
17334
+ height: number().positive()
17335
+ }).optional(),
17336
+ content: object({
17337
+ width: number().int().positive(),
17338
+ height: number().int().positive()
17339
+ }),
17340
+ fit: _enum(["stretch", "contain"]),
17341
+ format: _enum([
17342
+ "rgb",
17343
+ "gray",
17344
+ "jpeg"
17345
+ ])
17346
+ });
17347
+ var FrameRefSchema = object({
17348
+ registryId: string().min(1),
17349
+ id: string().min(1),
17350
+ width: number().int().positive(),
17351
+ height: number().int().positive(),
17352
+ format: _enum(["rgb", "gray"]),
17353
+ timestamp: number(),
17354
+ capturedAt: number().optional()
17355
+ });
17313
17356
  var ModelFormatSchema$1 = _enum([
17314
17357
  "onnx",
17315
17358
  "coreml",
@@ -17554,6 +17597,12 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
17554
17597
  steps: array(PipelineStepInputSchema).min(1),
17555
17598
  frame: FrameInputSchema.optional(),
17556
17599
  /**
17600
+ * Process-local lazy frame. Valid only when caller and provider resolve
17601
+ * in the same execution-group process; split/cross-node callers use
17602
+ * `frame`/`image` inline compatibility instead.
17603
+ */
17604
+ frameRef: FrameRefSchema.optional(),
17605
+ /**
17557
17606
  * CB5 shm passthrough — a `FrameHandle` naming the same ring slot
17558
17607
  * the decoded pixels live in. One more member of the one-of
17559
17608
  * frame/frameHandle/image/imageBase64/referenceImage group.
@@ -17809,7 +17858,10 @@ var NativeCropResultSchema = object({
17809
17858
  * Which source served this crop, so a quality-sensitive consumer (the native
17810
17859
  * `keyFrame`) can reject a degraded fallback:
17811
17860
  * - `native` — cut from the decode worker's retained NATIVE surface (the
17812
- * quality path).
17861
+ * quality path). A subject-tile serve is also native-resolution and stays
17862
+ * `native` here: the public enum cannot name `tile` without a breaking cap
17863
+ * change. Runner telemetry distinguishes lease vs tile via `source` on the
17864
+ * internal crop result (`nativeHits` vs `tileHits`).
17813
17865
  * - `ram-fullframe` — the native surface MISSED but the request was full-frame,
17814
17866
  * so the ≤640 RAM `RetainedFrameStore` served it (honest lower-res; legit for
17815
17867
  * the blank-frame guard / 640-snapshot resolve, NOT for the clean keyFrame).
@@ -18300,12 +18352,41 @@ var RunnerLocalLoadSchema = object({
18300
18352
  * legacy `OrchestratorMetricsSchema` shape so existing dashboards keep
18301
18353
  * working unchanged when they switch to reading from the runner cap.
18302
18354
  */
18355
+ var FrameLazyCountersSchema = object({
18356
+ framesDecoded: number(),
18357
+ framesAdmitted: number(),
18358
+ framesDroppedPixelFree: number(),
18359
+ viewsMaterialized: number(),
18360
+ viewsSkipped: number(),
18361
+ workerToRunnerBytes: number(),
18362
+ runnerToPoolRawBytes: number(),
18363
+ runnerToPoolJpegBytes: number(),
18364
+ onDemandFullFrameRequests: number(),
18365
+ onDemandCropRequests: number(),
18366
+ nativeHits: number(),
18367
+ nativeMisses: number(),
18368
+ tileHits: number(),
18369
+ tileMisses: number(),
18370
+ fallbackHits: number(),
18371
+ fallbackMisses: number(),
18372
+ retainedWritesAvoided: number(),
18373
+ residentRefs: number(),
18374
+ residentBytes: number(),
18375
+ releases: number(),
18376
+ evictions: number(),
18377
+ staleMisses: number()
18378
+ });
18379
+ var FrameLazyMetricsSchema = object({
18380
+ node: FrameLazyCountersSchema,
18381
+ cameras: array(FrameLazyCountersSchema.extend({ deviceId: number() }))
18382
+ });
18303
18383
  var RunnerLocalMetricsSchema = object({
18304
18384
  nodeId: string(),
18305
18385
  activeCameras: number(),
18306
18386
  throttledCameras: number(),
18307
18387
  avgInferenceTimeMs: number(),
18308
- queueDepth: number()
18388
+ queueDepth: number(),
18389
+ frameLazy: FrameLazyMetricsSchema.optional()
18309
18390
  });
18310
18391
  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({
18311
18392
  handle: FrameHandleSchema,
@@ -19605,6 +19686,9 @@ method(_void(), ProviderInfoSchema), method(object({ config: record(string(), un
19605
19686
  location: StorageLocationSchema,
19606
19687
  relativePath: string()
19607
19688
  }), _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" });
19689
+ /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
19690
+ var ProfileSettingsSchemaBridge = unknown().nullable();
19691
+ var ProfileSettingsBagSchema = record(string(), unknown());
19608
19692
  /**
19609
19693
  * A live terminal session hosted by the provider addon. Output and input do
19610
19694
  * NOT flow through the capability — they use the addon data plane
@@ -19634,7 +19718,14 @@ var TerminalSessionInfoSchema = object({
19634
19718
  var TerminalProfileInfoSchema = object({
19635
19719
  profileId: string(),
19636
19720
  label: string(),
19637
- description: string().optional()
19721
+ description: string().optional(),
19722
+ /** Spawn defaults the instance form copies on create. */
19723
+ executable: string().optional(),
19724
+ args: array(string()).readonly().optional(),
19725
+ cwd: string().optional(),
19726
+ environment: array(string()).readonly().optional(),
19727
+ /** ConfigUISchema for instance knobs, or null when the profile has none. */
19728
+ settingsSchema: ProfileSettingsSchemaBridge.optional()
19638
19729
  });
19639
19730
  /**
19640
19731
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -19647,7 +19738,12 @@ var TerminalInstanceInfoSchema = object({
19647
19738
  profileId: string(),
19648
19739
  profileLabel: string(),
19649
19740
  name: string(),
19650
- enabled: boolean()
19741
+ enabled: boolean(),
19742
+ executable: string(),
19743
+ args: array(string()).readonly(),
19744
+ cwd: string(),
19745
+ environment: array(string()).readonly(),
19746
+ profileSettings: ProfileSettingsBagSchema
19651
19747
  });
19652
19748
  var TerminalLegacyCameraSchema = object({
19653
19749
  stableId: string(),
@@ -19677,7 +19773,23 @@ var TerminalOutputBatchSchema = object({
19677
19773
  method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }), method(_void(), array(TerminalInstanceInfoSchema).readonly(), { auth: "admin" }), method(object({
19678
19774
  targetNodeId: string().min(1),
19679
19775
  profileId: string().min(1),
19680
- name: string().trim().min(1).max(160).optional()
19776
+ name: string().trim().min(1).max(160).optional(),
19777
+ executable: string().max(1024).optional(),
19778
+ args: array(string().max(2048)).max(64).optional(),
19779
+ cwd: string().max(1024).optional(),
19780
+ environment: array(string().max(4096)).max(64).optional(),
19781
+ profileSettings: ProfileSettingsBagSchema.optional()
19782
+ }), TerminalInstanceInfoSchema, {
19783
+ kind: "mutation",
19784
+ auth: "admin"
19785
+ }), method(object({
19786
+ instanceId: string().min(1),
19787
+ name: string().trim().min(1).max(160).optional(),
19788
+ executable: string().max(1024).optional(),
19789
+ args: array(string().max(2048)).max(64).optional(),
19790
+ cwd: string().max(1024).optional(),
19791
+ environment: array(string().max(4096)).max(64).optional(),
19792
+ profileSettings: ProfileSettingsBagSchema.optional()
19681
19793
  }), TerminalInstanceInfoSchema, {
19682
19794
  kind: "mutation",
19683
19795
  auth: "admin"
@@ -19699,7 +19811,11 @@ method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }),
19699
19811
  }), method(_void(), array(TerminalSessionInfoSchema).readonly(), { auth: "admin" }), method(object({
19700
19812
  profileId: string(),
19701
19813
  cols: number().int().positive(),
19702
- rows: number().int().positive()
19814
+ rows: number().int().positive(),
19815
+ executable: string().max(1024).optional(),
19816
+ args: array(string().max(2048)).max(64).optional(),
19817
+ cwd: string().max(1024).optional(),
19818
+ environment: array(string().max(4096)).max(64).optional()
19703
19819
  }), TerminalSessionInfoSchema, {
19704
19820
  kind: "mutation",
19705
19821
  auth: "admin"
@@ -22481,10 +22597,10 @@ DeviceType.LawnMower, method(object({ deviceId: number().int().nonnegative() }),
22481
22597
  *
22482
22598
  * • The SDK (mobile / web client) consumes `getConnectionEndpoints()`
22483
22599
  * to receive an ordered list of candidate base URLs it should race
22484
- * on connect — LAN IPv4 first (lowest latency when on same network),
22485
- * then public hostname (if a tunnel is up), then IPv6. The SDK can
22486
- * race them with short timeouts and stick with the winner for the
22487
- * session.
22600
+ * on connect — LAN IPv4 and stable LAN IPv6 first (lowest latency
22601
+ * when on the same network), then public hostname (if a tunnel is
22602
+ * up). The SDK can race them with short timeouts and stick with the
22603
+ * winner for the session.
22488
22604
  *
22489
22605
  * Why hub-only: agents are not directly addressable by the operator's
22490
22606
  * clients — they reverse-connect to the hub. Exposing their interfaces
@@ -22639,6 +22755,17 @@ var NotificationEndpointSchema = object({
22639
22755
  /** What the ranking currently resolves to (null when nothing is reachable). */
22640
22756
  resolved: string().nullable()
22641
22757
  });
22758
+ /**
22759
+ * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
22760
+ * AUTO (every LAN IPv4 + the public tunnel). `resolved` is what that choice
22761
+ * currently expands to, so the UI can show the effective set either way.
22762
+ */
22763
+ var ViewerEndpointsSchema = object({
22764
+ /** The operator's explicit race set, or empty for AUTO. */
22765
+ baseUrls: array(string()).readonly(),
22766
+ /** What the ranking currently resolves to (may be empty if nothing is up). */
22767
+ resolved: array(string()).readonly()
22768
+ });
22642
22769
  var AllowedAddressesSchema = object({
22643
22770
  /**
22644
22771
  * Allowlist of interface addresses operators have explicitly opted
@@ -22647,6 +22774,20 @@ var AllowedAddressesSchema = object({
22647
22774
  * Network Addresses admin page and persisted by the addon.
22648
22775
  */
22649
22776
  addresses: array(string()).readonly() });
22777
+ var TlsStatusSchema = object({
22778
+ mode: _enum([
22779
+ "generated",
22780
+ "uploaded",
22781
+ "disabled"
22782
+ ]),
22783
+ leafFingerprintSha256: string().nullable(),
22784
+ caFingerprintSha256: string().nullable(),
22785
+ validTo: string().nullable(),
22786
+ sans: array(string()),
22787
+ caCertPem: string().nullable(),
22788
+ reissueError: string().nullable(),
22789
+ restartRequired: boolean()
22790
+ });
22650
22791
  method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
22651
22792
  /**
22652
22793
  * LEGACY HINT — do not send from new code. Kept optional so clients
@@ -22656,17 +22797,31 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
22656
22797
  */
22657
22798
  port: number().int().min(1).max(65535).optional(),
22658
22799
  /** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
22659
- * candidate. Default `true`. */
22800
+ * candidate. Default `false` — loopback is not a client route. */
22660
22801
  includeLoopback: boolean().optional(),
22661
- /** Skip IPv6 entries. Some legacy clients can't parse them.
22662
- * Default `false`. */
22802
+ /** Skip IPv6 entries. Default `false` the palette includes stable
22803
+ * LAN IPv6 (ICE/WebRTC uses dual-stack regardless). Pass `true` to
22804
+ * hide them. The viewer HTTP/WS race is `getViewerEndpoints`. */
22663
22805
  ipv4Only: boolean().optional(),
22664
22806
  /** Scheme to emit for LAN/loopback URLs. Default `'http'`.
22665
22807
  * Pass `'https'` when the caller is itself loaded over HTTPS
22666
22808
  * to avoid mixed-content blocks in the browser. The public
22667
22809
  * tunnel always emits `https://` regardless. */
22668
22810
  scheme: _enum(["http", "https"]).optional()
22669
- }), 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" });
22811
+ }), 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, {
22812
+ kind: "mutation",
22813
+ auth: "admin"
22814
+ }), method(object({
22815
+ certPem: string().min(1),
22816
+ keyPem: string().min(1),
22817
+ caPem: string().optional()
22818
+ }), TlsStatusSchema, {
22819
+ kind: "mutation",
22820
+ auth: "admin"
22821
+ }), method(_void(), object({ pem: string() })), method(_void(), TlsStatusSchema, {
22822
+ kind: "mutation",
22823
+ auth: "admin"
22824
+ });
22670
22825
  object({
22671
22826
  /** Lifecycle state of the lock. `jammed` means the motor reported
22672
22827
  * failure to reach the target — operator intervention required. */
@@ -28429,6 +28584,12 @@ Object.freeze({
28429
28584
  addonId: null,
28430
28585
  access: "create"
28431
28586
  },
28587
+ "localNetwork.downloadCa": {
28588
+ capName: "local-network",
28589
+ capScope: "system",
28590
+ addonId: null,
28591
+ access: "view"
28592
+ },
28432
28593
  "localNetwork.getAllowedAddresses": {
28433
28594
  capName: "local-network",
28434
28595
  capScope: "system",
@@ -28453,18 +28614,42 @@ Object.freeze({
28453
28614
  addonId: null,
28454
28615
  access: "view"
28455
28616
  },
28617
+ "localNetwork.getTlsStatus": {
28618
+ capName: "local-network",
28619
+ capScope: "system",
28620
+ addonId: null,
28621
+ access: "view"
28622
+ },
28623
+ "localNetwork.getViewerEndpoints": {
28624
+ capName: "local-network",
28625
+ capScope: "system",
28626
+ addonId: null,
28627
+ access: "view"
28628
+ },
28456
28629
  "localNetwork.list": {
28457
28630
  capName: "local-network",
28458
28631
  capScope: "system",
28459
28632
  addonId: null,
28460
28633
  access: "view"
28461
28634
  },
28635
+ "localNetwork.regenerateCertificate": {
28636
+ capName: "local-network",
28637
+ capScope: "system",
28638
+ addonId: null,
28639
+ access: "create"
28640
+ },
28462
28641
  "localNetwork.resetAllowlistToBestMatch": {
28463
28642
  capName: "local-network",
28464
28643
  capScope: "system",
28465
28644
  addonId: null,
28466
28645
  access: "delete"
28467
28646
  },
28647
+ "localNetwork.revertToGeneratedCertificate": {
28648
+ capName: "local-network",
28649
+ capScope: "system",
28650
+ addonId: null,
28651
+ access: "create"
28652
+ },
28468
28653
  "localNetwork.setAllowedAddresses": {
28469
28654
  capName: "local-network",
28470
28655
  capScope: "system",
@@ -28477,6 +28662,18 @@ Object.freeze({
28477
28662
  addonId: null,
28478
28663
  access: "create"
28479
28664
  },
28665
+ "localNetwork.setViewerEndpoints": {
28666
+ capName: "local-network",
28667
+ capScope: "system",
28668
+ addonId: null,
28669
+ access: "create"
28670
+ },
28671
+ "localNetwork.uploadCertificate": {
28672
+ capName: "local-network",
28673
+ capScope: "system",
28674
+ addonId: null,
28675
+ access: "create"
28676
+ },
28480
28677
  "lockControl.lock": {
28481
28678
  capName: "lock-control",
28482
28679
  capScope: "device",
@@ -31357,6 +31554,12 @@ Object.freeze({
31357
31554
  addonId: null,
31358
31555
  access: "create"
31359
31556
  },
31557
+ "terminalSession.updateInstance": {
31558
+ capName: "terminal-session",
31559
+ capScope: "system",
31560
+ addonId: null,
31561
+ access: "create"
31562
+ },
31360
31563
  "terminalSession.writeInput": {
31361
31564
  capName: "terminal-session",
31362
31565
  capScope: "system",
@@ -33844,6 +34047,35 @@ Object.freeze(Object.fromEntries([{
33844
34047
  }]
33845
34048
  }].map((s) => [s.stepId, s.defaultModelId])));
33846
34049
  string().min(1);
34050
+ var CLUSTER_STEP_SETTING_FIELDS = [{
34051
+ stepId: "face-embedding",
34052
+ key: "minLandmarkFaceSize",
34053
+ label: "Min face size for recognition (detection px)",
34054
+ 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.",
34055
+ type: "slider",
34056
+ min: 0,
34057
+ max: 64,
34058
+ step: 2,
34059
+ default: 24
34060
+ }];
34061
+ function clusterStepSettingKey(stepId, fieldKey) {
34062
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
34063
+ }
34064
+ var ClusterSettingNumberSchema = number().finite();
34065
+ function readClusterStepSettings(config) {
34066
+ const out = {};
34067
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
34068
+ const parsed = ClusterSettingNumberSchema.safeParse(config[clusterStepSettingKey(field.stepId, field.key)]);
34069
+ const value = parsed.success ? parsed.data : field.default;
34070
+ const existing = out[field.stepId] ?? {};
34071
+ out[field.stepId] = {
34072
+ ...existing,
34073
+ [field.key]: value
34074
+ };
34075
+ }
34076
+ return out;
34077
+ }
34078
+ readClusterStepSettings({});
33847
34079
  object({
33848
34080
  /**
33849
34081
  * 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-mqtt-broker",
3
- "version": "1.2.26",
3
+ "version": "1.2.27",
4
4
  "description": "MQTT broker registry addon for CamStack — manages external broker entries + an optional embedded aedes broker. Consumers spin up their own `mqtt.js` clients via the `mqtt-broker` cap.",
5
5
  "keywords": [
6
6
  "camstack",