@camstack/addon-provider-dreame 0.2.26 → 0.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.
Files changed (3) hide show
  1. package/dist/addon.js +248 -16
  2. package/dist/addon.mjs +248 -16
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -58525,6 +58525,15 @@ var LabelDefinitionSchema = object({
58525
58525
  description: string().optional(),
58526
58526
  icon: string().optional()
58527
58527
  });
58528
+ var ClassMapDefinitionSchema = object({
58529
+ mapping: record(string(), _enum([
58530
+ "person",
58531
+ "vehicle",
58532
+ "animal",
58533
+ "package"
58534
+ ])),
58535
+ preserveOriginal: boolean()
58536
+ });
58528
58537
  var MODEL_FORMATS = [
58529
58538
  "onnx",
58530
58539
  "coreml",
@@ -58703,7 +58712,13 @@ var ModelCatalogEntrySchema = object({
58703
58712
  * `id` stays the source of truth for resolution/download/persistence; grouping
58704
58713
  * is a presentation overlay resolved back to an `id`.
58705
58714
  */
58706
- group: ModelVariantGroupSchema.optional()
58715
+ group: ModelVariantGroupSchema.optional(),
58716
+ /**
58717
+ * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
58718
+ * applies (Frigate / COCO public catalog). Set on a custom model whose raw
58719
+ * labels already ARE the CamStack macros (Scrypted identity map).
58720
+ */
58721
+ classMap: ClassMapDefinitionSchema.optional()
58707
58722
  });
58708
58723
  var ConvertTargetSchema = discriminatedUnion("format", [object({
58709
58724
  format: literal("openvino"),
@@ -58732,7 +58747,8 @@ var ModelConvertMetadataSchema = object({
58732
58747
  "ocr",
58733
58748
  "segmentation"
58734
58749
  ]),
58735
- faceAlignment: boolean().optional()
58750
+ faceAlignment: boolean().optional(),
58751
+ classMap: ClassMapDefinitionSchema.optional()
58736
58752
  });
58737
58753
  var ConvertResultSchema = object({
58738
58754
  entry: ModelCatalogEntrySchema,
@@ -68042,6 +68058,33 @@ var NativeCropRefSchema = object({
68042
68058
  h: number()
68043
68059
  })
68044
68060
  });
68061
+ object({
68062
+ crop: object({
68063
+ left: number(),
68064
+ top: number(),
68065
+ width: number().positive(),
68066
+ height: number().positive()
68067
+ }).optional(),
68068
+ content: object({
68069
+ width: number().int().positive(),
68070
+ height: number().int().positive()
68071
+ }),
68072
+ fit: _enum(["stretch", "contain"]),
68073
+ format: _enum([
68074
+ "rgb",
68075
+ "gray",
68076
+ "jpeg"
68077
+ ])
68078
+ });
68079
+ var FrameRefSchema = object({
68080
+ registryId: string().min(1),
68081
+ id: string().min(1),
68082
+ width: number().int().positive(),
68083
+ height: number().int().positive(),
68084
+ format: _enum(["rgb", "gray"]),
68085
+ timestamp: number(),
68086
+ capturedAt: number().optional()
68087
+ });
68045
68088
  var ModelFormatSchema$1 = _enum([
68046
68089
  "onnx",
68047
68090
  "coreml",
@@ -68286,6 +68329,12 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
68286
68329
  steps: array(PipelineStepInputSchema).min(1),
68287
68330
  frame: FrameInputSchema.optional(),
68288
68331
  /**
68332
+ * Process-local lazy frame. Valid only when caller and provider resolve
68333
+ * in the same execution-group process; split/cross-node callers use
68334
+ * `frame`/`image` inline compatibility instead.
68335
+ */
68336
+ frameRef: FrameRefSchema.optional(),
68337
+ /**
68289
68338
  * CB5 shm passthrough — a `FrameHandle` naming the same ring slot
68290
68339
  * the decoded pixels live in. One more member of the one-of
68291
68340
  * frame/frameHandle/image/imageBase64/referenceImage group.
@@ -68581,7 +68630,10 @@ var NativeCropResultSchema = object({
68581
68630
  * Which source served this crop, so a quality-sensitive consumer (the native
68582
68631
  * `keyFrame`) can reject a degraded fallback:
68583
68632
  * - `native` — cut from the decode worker's retained NATIVE surface (the
68584
- * quality path).
68633
+ * quality path). A subject-tile serve is also native-resolution and stays
68634
+ * `native` here: the public enum cannot name `tile` without a breaking cap
68635
+ * change. Runner telemetry distinguishes lease vs tile via `source` on the
68636
+ * internal crop result (`nativeHits` vs `tileHits`).
68585
68637
  * - `ram-fullframe` — the native surface MISSED but the request was full-frame,
68586
68638
  * so the ≤640 RAM `RetainedFrameStore` served it (honest lower-res; legit for
68587
68639
  * the blank-frame guard / 640-snapshot resolve, NOT for the clean keyFrame).
@@ -69072,12 +69124,41 @@ var RunnerLocalLoadSchema = object({
69072
69124
  * legacy `OrchestratorMetricsSchema` shape so existing dashboards keep
69073
69125
  * working unchanged when they switch to reading from the runner cap.
69074
69126
  */
69127
+ var FrameLazyCountersSchema = object({
69128
+ framesDecoded: number(),
69129
+ framesAdmitted: number(),
69130
+ framesDroppedPixelFree: number(),
69131
+ viewsMaterialized: number(),
69132
+ viewsSkipped: number(),
69133
+ workerToRunnerBytes: number(),
69134
+ runnerToPoolRawBytes: number(),
69135
+ runnerToPoolJpegBytes: number(),
69136
+ onDemandFullFrameRequests: number(),
69137
+ onDemandCropRequests: number(),
69138
+ nativeHits: number(),
69139
+ nativeMisses: number(),
69140
+ tileHits: number(),
69141
+ tileMisses: number(),
69142
+ fallbackHits: number(),
69143
+ fallbackMisses: number(),
69144
+ retainedWritesAvoided: number(),
69145
+ residentRefs: number(),
69146
+ residentBytes: number(),
69147
+ releases: number(),
69148
+ evictions: number(),
69149
+ staleMisses: number()
69150
+ });
69151
+ var FrameLazyMetricsSchema = object({
69152
+ node: FrameLazyCountersSchema,
69153
+ cameras: array(FrameLazyCountersSchema.extend({ deviceId: number() }))
69154
+ });
69075
69155
  var RunnerLocalMetricsSchema = object({
69076
69156
  nodeId: string(),
69077
69157
  activeCameras: number(),
69078
69158
  throttledCameras: number(),
69079
69159
  avgInferenceTimeMs: number(),
69080
- queueDepth: number()
69160
+ queueDepth: number(),
69161
+ frameLazy: FrameLazyMetricsSchema.optional()
69081
69162
  });
69082
69163
  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({
69083
69164
  handle: FrameHandleSchema,
@@ -70377,6 +70458,9 @@ method(_void(), ProviderInfoSchema), method(object({ config: record(string(), un
70377
70458
  location: StorageLocationSchema,
70378
70459
  relativePath: string()
70379
70460
  }), _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" });
70461
+ /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
70462
+ var ProfileSettingsSchemaBridge = unknown().nullable();
70463
+ var ProfileSettingsBagSchema = record(string(), unknown());
70380
70464
  /**
70381
70465
  * A live terminal session hosted by the provider addon. Output and input do
70382
70466
  * NOT flow through the capability — they use the addon data plane
@@ -70406,7 +70490,14 @@ var TerminalSessionInfoSchema = object({
70406
70490
  var TerminalProfileInfoSchema = object({
70407
70491
  profileId: string(),
70408
70492
  label: string(),
70409
- description: string().optional()
70493
+ description: string().optional(),
70494
+ /** Spawn defaults the instance form copies on create. */
70495
+ executable: string().optional(),
70496
+ args: array(string()).readonly().optional(),
70497
+ cwd: string().optional(),
70498
+ environment: array(string()).readonly().optional(),
70499
+ /** ConfigUISchema for instance knobs, or null when the profile has none. */
70500
+ settingsSchema: ProfileSettingsSchemaBridge.optional()
70410
70501
  });
70411
70502
  /**
70412
70503
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -70419,7 +70510,12 @@ var TerminalInstanceInfoSchema = object({
70419
70510
  profileId: string(),
70420
70511
  profileLabel: string(),
70421
70512
  name: string(),
70422
- enabled: boolean()
70513
+ enabled: boolean(),
70514
+ executable: string(),
70515
+ args: array(string()).readonly(),
70516
+ cwd: string(),
70517
+ environment: array(string()).readonly(),
70518
+ profileSettings: ProfileSettingsBagSchema
70423
70519
  });
70424
70520
  var TerminalLegacyCameraSchema = object({
70425
70521
  stableId: string(),
@@ -70449,7 +70545,23 @@ var TerminalOutputBatchSchema = object({
70449
70545
  method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }), method(_void(), array(TerminalInstanceInfoSchema).readonly(), { auth: "admin" }), method(object({
70450
70546
  targetNodeId: string().min(1),
70451
70547
  profileId: string().min(1),
70452
- name: string().trim().min(1).max(160).optional()
70548
+ name: string().trim().min(1).max(160).optional(),
70549
+ executable: string().max(1024).optional(),
70550
+ args: array(string().max(2048)).max(64).optional(),
70551
+ cwd: string().max(1024).optional(),
70552
+ environment: array(string().max(4096)).max(64).optional(),
70553
+ profileSettings: ProfileSettingsBagSchema.optional()
70554
+ }), TerminalInstanceInfoSchema, {
70555
+ kind: "mutation",
70556
+ auth: "admin"
70557
+ }), method(object({
70558
+ instanceId: string().min(1),
70559
+ name: string().trim().min(1).max(160).optional(),
70560
+ executable: string().max(1024).optional(),
70561
+ args: array(string().max(2048)).max(64).optional(),
70562
+ cwd: string().max(1024).optional(),
70563
+ environment: array(string().max(4096)).max(64).optional(),
70564
+ profileSettings: ProfileSettingsBagSchema.optional()
70453
70565
  }), TerminalInstanceInfoSchema, {
70454
70566
  kind: "mutation",
70455
70567
  auth: "admin"
@@ -70471,7 +70583,11 @@ method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }),
70471
70583
  }), method(_void(), array(TerminalSessionInfoSchema).readonly(), { auth: "admin" }), method(object({
70472
70584
  profileId: string(),
70473
70585
  cols: number().int().positive(),
70474
- rows: number().int().positive()
70586
+ rows: number().int().positive(),
70587
+ executable: string().max(1024).optional(),
70588
+ args: array(string().max(2048)).max(64).optional(),
70589
+ cwd: string().max(1024).optional(),
70590
+ environment: array(string().max(4096)).max(64).optional()
70475
70591
  }), TerminalSessionInfoSchema, {
70476
70592
  kind: "mutation",
70477
70593
  auth: "admin"
@@ -74371,10 +74487,10 @@ var lawnMowerControlCapability = {
74371
74487
  *
74372
74488
  * • The SDK (mobile / web client) consumes `getConnectionEndpoints()`
74373
74489
  * to receive an ordered list of candidate base URLs it should race
74374
- * on connect — LAN IPv4 first (lowest latency when on same network),
74375
- * then public hostname (if a tunnel is up), then IPv6. The SDK can
74376
- * race them with short timeouts and stick with the winner for the
74377
- * session.
74490
+ * on connect — LAN IPv4 and stable LAN IPv6 first (lowest latency
74491
+ * when on the same network), then public hostname (if a tunnel is
74492
+ * up). The SDK can race them with short timeouts and stick with the
74493
+ * winner for the session.
74378
74494
  *
74379
74495
  * Why hub-only: agents are not directly addressable by the operator's
74380
74496
  * clients — they reverse-connect to the hub. Exposing their interfaces
@@ -74529,6 +74645,17 @@ var NotificationEndpointSchema = object({
74529
74645
  /** What the ranking currently resolves to (null when nothing is reachable). */
74530
74646
  resolved: string().nullable()
74531
74647
  });
74648
+ /**
74649
+ * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
74650
+ * AUTO (every LAN IPv4 + the public tunnel). `resolved` is what that choice
74651
+ * currently expands to, so the UI can show the effective set either way.
74652
+ */
74653
+ var ViewerEndpointsSchema = object({
74654
+ /** The operator's explicit race set, or empty for AUTO. */
74655
+ baseUrls: array(string()).readonly(),
74656
+ /** What the ranking currently resolves to (may be empty if nothing is up). */
74657
+ resolved: array(string()).readonly()
74658
+ });
74532
74659
  var AllowedAddressesSchema = object({
74533
74660
  /**
74534
74661
  * Allowlist of interface addresses operators have explicitly opted
@@ -74537,6 +74664,20 @@ var AllowedAddressesSchema = object({
74537
74664
  * Network Addresses admin page and persisted by the addon.
74538
74665
  */
74539
74666
  addresses: array(string()).readonly() });
74667
+ var TlsStatusSchema = object({
74668
+ mode: _enum([
74669
+ "generated",
74670
+ "uploaded",
74671
+ "disabled"
74672
+ ]),
74673
+ leafFingerprintSha256: string().nullable(),
74674
+ caFingerprintSha256: string().nullable(),
74675
+ validTo: string().nullable(),
74676
+ sans: array(string()),
74677
+ caCertPem: string().nullable(),
74678
+ reissueError: string().nullable(),
74679
+ restartRequired: boolean()
74680
+ });
74540
74681
  method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
74541
74682
  /**
74542
74683
  * LEGACY HINT — do not send from new code. Kept optional so clients
@@ -74546,17 +74687,31 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
74546
74687
  */
74547
74688
  port: number().int().min(1).max(65535).optional(),
74548
74689
  /** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
74549
- * candidate. Default `true`. */
74690
+ * candidate. Default `false` — loopback is not a client route. */
74550
74691
  includeLoopback: boolean().optional(),
74551
- /** Skip IPv6 entries. Some legacy clients can't parse them.
74552
- * Default `false`. */
74692
+ /** Skip IPv6 entries. Default `false` the palette includes stable
74693
+ * LAN IPv6 (ICE/WebRTC uses dual-stack regardless). Pass `true` to
74694
+ * hide them. The viewer HTTP/WS race is `getViewerEndpoints`. */
74553
74695
  ipv4Only: boolean().optional(),
74554
74696
  /** Scheme to emit for LAN/loopback URLs. Default `'http'`.
74555
74697
  * Pass `'https'` when the caller is itself loaded over HTTPS
74556
74698
  * to avoid mixed-content blocks in the browser. The public
74557
74699
  * tunnel always emits `https://` regardless. */
74558
74700
  scheme: _enum(["http", "https"]).optional()
74559
- }), 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" });
74701
+ }), 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, {
74702
+ kind: "mutation",
74703
+ auth: "admin"
74704
+ }), method(object({
74705
+ certPem: string().min(1),
74706
+ keyPem: string().min(1),
74707
+ caPem: string().optional()
74708
+ }), TlsStatusSchema, {
74709
+ kind: "mutation",
74710
+ auth: "admin"
74711
+ }), method(_void(), object({ pem: string() })), method(_void(), TlsStatusSchema, {
74712
+ kind: "mutation",
74713
+ auth: "admin"
74714
+ });
74560
74715
  var LockControlStatusSchema = object({
74561
74716
  /** Lifecycle state of the lock. `jammed` means the motor reported
74562
74717
  * failure to reach the target — operator intervention required. */
@@ -82583,6 +82738,12 @@ Object.freeze({
82583
82738
  addonId: null,
82584
82739
  access: "create"
82585
82740
  },
82741
+ "localNetwork.downloadCa": {
82742
+ capName: "local-network",
82743
+ capScope: "system",
82744
+ addonId: null,
82745
+ access: "view"
82746
+ },
82586
82747
  "localNetwork.getAllowedAddresses": {
82587
82748
  capName: "local-network",
82588
82749
  capScope: "system",
@@ -82607,18 +82768,42 @@ Object.freeze({
82607
82768
  addonId: null,
82608
82769
  access: "view"
82609
82770
  },
82771
+ "localNetwork.getTlsStatus": {
82772
+ capName: "local-network",
82773
+ capScope: "system",
82774
+ addonId: null,
82775
+ access: "view"
82776
+ },
82777
+ "localNetwork.getViewerEndpoints": {
82778
+ capName: "local-network",
82779
+ capScope: "system",
82780
+ addonId: null,
82781
+ access: "view"
82782
+ },
82610
82783
  "localNetwork.list": {
82611
82784
  capName: "local-network",
82612
82785
  capScope: "system",
82613
82786
  addonId: null,
82614
82787
  access: "view"
82615
82788
  },
82789
+ "localNetwork.regenerateCertificate": {
82790
+ capName: "local-network",
82791
+ capScope: "system",
82792
+ addonId: null,
82793
+ access: "create"
82794
+ },
82616
82795
  "localNetwork.resetAllowlistToBestMatch": {
82617
82796
  capName: "local-network",
82618
82797
  capScope: "system",
82619
82798
  addonId: null,
82620
82799
  access: "delete"
82621
82800
  },
82801
+ "localNetwork.revertToGeneratedCertificate": {
82802
+ capName: "local-network",
82803
+ capScope: "system",
82804
+ addonId: null,
82805
+ access: "create"
82806
+ },
82622
82807
  "localNetwork.setAllowedAddresses": {
82623
82808
  capName: "local-network",
82624
82809
  capScope: "system",
@@ -82631,6 +82816,18 @@ Object.freeze({
82631
82816
  addonId: null,
82632
82817
  access: "create"
82633
82818
  },
82819
+ "localNetwork.setViewerEndpoints": {
82820
+ capName: "local-network",
82821
+ capScope: "system",
82822
+ addonId: null,
82823
+ access: "create"
82824
+ },
82825
+ "localNetwork.uploadCertificate": {
82826
+ capName: "local-network",
82827
+ capScope: "system",
82828
+ addonId: null,
82829
+ access: "create"
82830
+ },
82634
82831
  "lockControl.lock": {
82635
82832
  capName: "lock-control",
82636
82833
  capScope: "device",
@@ -85511,6 +85708,12 @@ Object.freeze({
85511
85708
  addonId: null,
85512
85709
  access: "create"
85513
85710
  },
85711
+ "terminalSession.updateInstance": {
85712
+ capName: "terminal-session",
85713
+ capScope: "system",
85714
+ addonId: null,
85715
+ access: "create"
85716
+ },
85514
85717
  "terminalSession.writeInput": {
85515
85718
  capName: "terminal-session",
85516
85719
  capScope: "system",
@@ -87998,6 +88201,35 @@ Object.freeze(Object.fromEntries([{
87998
88201
  }]
87999
88202
  }].map((s) => [s.stepId, s.defaultModelId])));
88000
88203
  string().min(1);
88204
+ var CLUSTER_STEP_SETTING_FIELDS = [{
88205
+ stepId: "face-embedding",
88206
+ key: "minLandmarkFaceSize",
88207
+ label: "Min face size for recognition (detection px)",
88208
+ 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.",
88209
+ type: "slider",
88210
+ min: 0,
88211
+ max: 64,
88212
+ step: 2,
88213
+ default: 24
88214
+ }];
88215
+ function clusterStepSettingKey(stepId, fieldKey) {
88216
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
88217
+ }
88218
+ var ClusterSettingNumberSchema = number().finite();
88219
+ function readClusterStepSettings(config) {
88220
+ const out = {};
88221
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
88222
+ const parsed = ClusterSettingNumberSchema.safeParse(config[clusterStepSettingKey(field.stepId, field.key)]);
88223
+ const value = parsed.success ? parsed.data : field.default;
88224
+ const existing = out[field.stepId] ?? {};
88225
+ out[field.stepId] = {
88226
+ ...existing,
88227
+ [field.key]: value
88228
+ };
88229
+ }
88230
+ return out;
88231
+ }
88232
+ readClusterStepSettings({});
88001
88233
  object({
88002
88234
  /**
88003
88235
  * Fraction of the box's own size added on EACH side before cutting.
package/dist/addon.mjs CHANGED
@@ -58525,6 +58525,15 @@ var LabelDefinitionSchema = object({
58525
58525
  description: string().optional(),
58526
58526
  icon: string().optional()
58527
58527
  });
58528
+ var ClassMapDefinitionSchema = object({
58529
+ mapping: record(string(), _enum([
58530
+ "person",
58531
+ "vehicle",
58532
+ "animal",
58533
+ "package"
58534
+ ])),
58535
+ preserveOriginal: boolean()
58536
+ });
58528
58537
  var MODEL_FORMATS = [
58529
58538
  "onnx",
58530
58539
  "coreml",
@@ -58703,7 +58712,13 @@ var ModelCatalogEntrySchema = object({
58703
58712
  * `id` stays the source of truth for resolution/download/persistence; grouping
58704
58713
  * is a presentation overlay resolved back to an `id`.
58705
58714
  */
58706
- group: ModelVariantGroupSchema.optional()
58715
+ group: ModelVariantGroupSchema.optional(),
58716
+ /**
58717
+ * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
58718
+ * applies (Frigate / COCO public catalog). Set on a custom model whose raw
58719
+ * labels already ARE the CamStack macros (Scrypted identity map).
58720
+ */
58721
+ classMap: ClassMapDefinitionSchema.optional()
58707
58722
  });
58708
58723
  var ConvertTargetSchema = discriminatedUnion("format", [object({
58709
58724
  format: literal("openvino"),
@@ -58732,7 +58747,8 @@ var ModelConvertMetadataSchema = object({
58732
58747
  "ocr",
58733
58748
  "segmentation"
58734
58749
  ]),
58735
- faceAlignment: boolean().optional()
58750
+ faceAlignment: boolean().optional(),
58751
+ classMap: ClassMapDefinitionSchema.optional()
58736
58752
  });
58737
58753
  var ConvertResultSchema = object({
58738
58754
  entry: ModelCatalogEntrySchema,
@@ -68042,6 +68058,33 @@ var NativeCropRefSchema = object({
68042
68058
  h: number()
68043
68059
  })
68044
68060
  });
68061
+ object({
68062
+ crop: object({
68063
+ left: number(),
68064
+ top: number(),
68065
+ width: number().positive(),
68066
+ height: number().positive()
68067
+ }).optional(),
68068
+ content: object({
68069
+ width: number().int().positive(),
68070
+ height: number().int().positive()
68071
+ }),
68072
+ fit: _enum(["stretch", "contain"]),
68073
+ format: _enum([
68074
+ "rgb",
68075
+ "gray",
68076
+ "jpeg"
68077
+ ])
68078
+ });
68079
+ var FrameRefSchema = object({
68080
+ registryId: string().min(1),
68081
+ id: string().min(1),
68082
+ width: number().int().positive(),
68083
+ height: number().int().positive(),
68084
+ format: _enum(["rgb", "gray"]),
68085
+ timestamp: number(),
68086
+ capturedAt: number().optional()
68087
+ });
68045
68088
  var ModelFormatSchema$1 = _enum([
68046
68089
  "onnx",
68047
68090
  "coreml",
@@ -68286,6 +68329,12 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
68286
68329
  steps: array(PipelineStepInputSchema).min(1),
68287
68330
  frame: FrameInputSchema.optional(),
68288
68331
  /**
68332
+ * Process-local lazy frame. Valid only when caller and provider resolve
68333
+ * in the same execution-group process; split/cross-node callers use
68334
+ * `frame`/`image` inline compatibility instead.
68335
+ */
68336
+ frameRef: FrameRefSchema.optional(),
68337
+ /**
68289
68338
  * CB5 shm passthrough — a `FrameHandle` naming the same ring slot
68290
68339
  * the decoded pixels live in. One more member of the one-of
68291
68340
  * frame/frameHandle/image/imageBase64/referenceImage group.
@@ -68581,7 +68630,10 @@ var NativeCropResultSchema = object({
68581
68630
  * Which source served this crop, so a quality-sensitive consumer (the native
68582
68631
  * `keyFrame`) can reject a degraded fallback:
68583
68632
  * - `native` — cut from the decode worker's retained NATIVE surface (the
68584
- * quality path).
68633
+ * quality path). A subject-tile serve is also native-resolution and stays
68634
+ * `native` here: the public enum cannot name `tile` without a breaking cap
68635
+ * change. Runner telemetry distinguishes lease vs tile via `source` on the
68636
+ * internal crop result (`nativeHits` vs `tileHits`).
68585
68637
  * - `ram-fullframe` — the native surface MISSED but the request was full-frame,
68586
68638
  * so the ≤640 RAM `RetainedFrameStore` served it (honest lower-res; legit for
68587
68639
  * the blank-frame guard / 640-snapshot resolve, NOT for the clean keyFrame).
@@ -69072,12 +69124,41 @@ var RunnerLocalLoadSchema = object({
69072
69124
  * legacy `OrchestratorMetricsSchema` shape so existing dashboards keep
69073
69125
  * working unchanged when they switch to reading from the runner cap.
69074
69126
  */
69127
+ var FrameLazyCountersSchema = object({
69128
+ framesDecoded: number(),
69129
+ framesAdmitted: number(),
69130
+ framesDroppedPixelFree: number(),
69131
+ viewsMaterialized: number(),
69132
+ viewsSkipped: number(),
69133
+ workerToRunnerBytes: number(),
69134
+ runnerToPoolRawBytes: number(),
69135
+ runnerToPoolJpegBytes: number(),
69136
+ onDemandFullFrameRequests: number(),
69137
+ onDemandCropRequests: number(),
69138
+ nativeHits: number(),
69139
+ nativeMisses: number(),
69140
+ tileHits: number(),
69141
+ tileMisses: number(),
69142
+ fallbackHits: number(),
69143
+ fallbackMisses: number(),
69144
+ retainedWritesAvoided: number(),
69145
+ residentRefs: number(),
69146
+ residentBytes: number(),
69147
+ releases: number(),
69148
+ evictions: number(),
69149
+ staleMisses: number()
69150
+ });
69151
+ var FrameLazyMetricsSchema = object({
69152
+ node: FrameLazyCountersSchema,
69153
+ cameras: array(FrameLazyCountersSchema.extend({ deviceId: number() }))
69154
+ });
69075
69155
  var RunnerLocalMetricsSchema = object({
69076
69156
  nodeId: string(),
69077
69157
  activeCameras: number(),
69078
69158
  throttledCameras: number(),
69079
69159
  avgInferenceTimeMs: number(),
69080
- queueDepth: number()
69160
+ queueDepth: number(),
69161
+ frameLazy: FrameLazyMetricsSchema.optional()
69081
69162
  });
69082
69163
  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({
69083
69164
  handle: FrameHandleSchema,
@@ -70377,6 +70458,9 @@ method(_void(), ProviderInfoSchema), method(object({ config: record(string(), un
70377
70458
  location: StorageLocationSchema,
70378
70459
  relativePath: string()
70379
70460
  }), _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" });
70461
+ /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
70462
+ var ProfileSettingsSchemaBridge = unknown().nullable();
70463
+ var ProfileSettingsBagSchema = record(string(), unknown());
70380
70464
  /**
70381
70465
  * A live terminal session hosted by the provider addon. Output and input do
70382
70466
  * NOT flow through the capability — they use the addon data plane
@@ -70406,7 +70490,14 @@ var TerminalSessionInfoSchema = object({
70406
70490
  var TerminalProfileInfoSchema = object({
70407
70491
  profileId: string(),
70408
70492
  label: string(),
70409
- description: string().optional()
70493
+ description: string().optional(),
70494
+ /** Spawn defaults the instance form copies on create. */
70495
+ executable: string().optional(),
70496
+ args: array(string()).readonly().optional(),
70497
+ cwd: string().optional(),
70498
+ environment: array(string()).readonly().optional(),
70499
+ /** ConfigUISchema for instance knobs, or null when the profile has none. */
70500
+ settingsSchema: ProfileSettingsSchemaBridge.optional()
70410
70501
  });
70411
70502
  /**
70412
70503
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -70419,7 +70510,12 @@ var TerminalInstanceInfoSchema = object({
70419
70510
  profileId: string(),
70420
70511
  profileLabel: string(),
70421
70512
  name: string(),
70422
- enabled: boolean()
70513
+ enabled: boolean(),
70514
+ executable: string(),
70515
+ args: array(string()).readonly(),
70516
+ cwd: string(),
70517
+ environment: array(string()).readonly(),
70518
+ profileSettings: ProfileSettingsBagSchema
70423
70519
  });
70424
70520
  var TerminalLegacyCameraSchema = object({
70425
70521
  stableId: string(),
@@ -70449,7 +70545,23 @@ var TerminalOutputBatchSchema = object({
70449
70545
  method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }), method(_void(), array(TerminalInstanceInfoSchema).readonly(), { auth: "admin" }), method(object({
70450
70546
  targetNodeId: string().min(1),
70451
70547
  profileId: string().min(1),
70452
- name: string().trim().min(1).max(160).optional()
70548
+ name: string().trim().min(1).max(160).optional(),
70549
+ executable: string().max(1024).optional(),
70550
+ args: array(string().max(2048)).max(64).optional(),
70551
+ cwd: string().max(1024).optional(),
70552
+ environment: array(string().max(4096)).max(64).optional(),
70553
+ profileSettings: ProfileSettingsBagSchema.optional()
70554
+ }), TerminalInstanceInfoSchema, {
70555
+ kind: "mutation",
70556
+ auth: "admin"
70557
+ }), method(object({
70558
+ instanceId: string().min(1),
70559
+ name: string().trim().min(1).max(160).optional(),
70560
+ executable: string().max(1024).optional(),
70561
+ args: array(string().max(2048)).max(64).optional(),
70562
+ cwd: string().max(1024).optional(),
70563
+ environment: array(string().max(4096)).max(64).optional(),
70564
+ profileSettings: ProfileSettingsBagSchema.optional()
70453
70565
  }), TerminalInstanceInfoSchema, {
70454
70566
  kind: "mutation",
70455
70567
  auth: "admin"
@@ -70471,7 +70583,11 @@ method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }),
70471
70583
  }), method(_void(), array(TerminalSessionInfoSchema).readonly(), { auth: "admin" }), method(object({
70472
70584
  profileId: string(),
70473
70585
  cols: number().int().positive(),
70474
- rows: number().int().positive()
70586
+ rows: number().int().positive(),
70587
+ executable: string().max(1024).optional(),
70588
+ args: array(string().max(2048)).max(64).optional(),
70589
+ cwd: string().max(1024).optional(),
70590
+ environment: array(string().max(4096)).max(64).optional()
70475
70591
  }), TerminalSessionInfoSchema, {
70476
70592
  kind: "mutation",
70477
70593
  auth: "admin"
@@ -74371,10 +74487,10 @@ var lawnMowerControlCapability = {
74371
74487
  *
74372
74488
  * • The SDK (mobile / web client) consumes `getConnectionEndpoints()`
74373
74489
  * to receive an ordered list of candidate base URLs it should race
74374
- * on connect — LAN IPv4 first (lowest latency when on same network),
74375
- * then public hostname (if a tunnel is up), then IPv6. The SDK can
74376
- * race them with short timeouts and stick with the winner for the
74377
- * session.
74490
+ * on connect — LAN IPv4 and stable LAN IPv6 first (lowest latency
74491
+ * when on the same network), then public hostname (if a tunnel is
74492
+ * up). The SDK can race them with short timeouts and stick with the
74493
+ * winner for the session.
74378
74494
  *
74379
74495
  * Why hub-only: agents are not directly addressable by the operator's
74380
74496
  * clients — they reverse-connect to the hub. Exposing their interfaces
@@ -74529,6 +74645,17 @@ var NotificationEndpointSchema = object({
74529
74645
  /** What the ranking currently resolves to (null when nothing is reachable). */
74530
74646
  resolved: string().nullable()
74531
74647
  });
74648
+ /**
74649
+ * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
74650
+ * AUTO (every LAN IPv4 + the public tunnel). `resolved` is what that choice
74651
+ * currently expands to, so the UI can show the effective set either way.
74652
+ */
74653
+ var ViewerEndpointsSchema = object({
74654
+ /** The operator's explicit race set, or empty for AUTO. */
74655
+ baseUrls: array(string()).readonly(),
74656
+ /** What the ranking currently resolves to (may be empty if nothing is up). */
74657
+ resolved: array(string()).readonly()
74658
+ });
74532
74659
  var AllowedAddressesSchema = object({
74533
74660
  /**
74534
74661
  * Allowlist of interface addresses operators have explicitly opted
@@ -74537,6 +74664,20 @@ var AllowedAddressesSchema = object({
74537
74664
  * Network Addresses admin page and persisted by the addon.
74538
74665
  */
74539
74666
  addresses: array(string()).readonly() });
74667
+ var TlsStatusSchema = object({
74668
+ mode: _enum([
74669
+ "generated",
74670
+ "uploaded",
74671
+ "disabled"
74672
+ ]),
74673
+ leafFingerprintSha256: string().nullable(),
74674
+ caFingerprintSha256: string().nullable(),
74675
+ validTo: string().nullable(),
74676
+ sans: array(string()),
74677
+ caCertPem: string().nullable(),
74678
+ reissueError: string().nullable(),
74679
+ restartRequired: boolean()
74680
+ });
74540
74681
  method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
74541
74682
  /**
74542
74683
  * LEGACY HINT — do not send from new code. Kept optional so clients
@@ -74546,17 +74687,31 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
74546
74687
  */
74547
74688
  port: number().int().min(1).max(65535).optional(),
74548
74689
  /** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
74549
- * candidate. Default `true`. */
74690
+ * candidate. Default `false` — loopback is not a client route. */
74550
74691
  includeLoopback: boolean().optional(),
74551
- /** Skip IPv6 entries. Some legacy clients can't parse them.
74552
- * Default `false`. */
74692
+ /** Skip IPv6 entries. Default `false` the palette includes stable
74693
+ * LAN IPv6 (ICE/WebRTC uses dual-stack regardless). Pass `true` to
74694
+ * hide them. The viewer HTTP/WS race is `getViewerEndpoints`. */
74553
74695
  ipv4Only: boolean().optional(),
74554
74696
  /** Scheme to emit for LAN/loopback URLs. Default `'http'`.
74555
74697
  * Pass `'https'` when the caller is itself loaded over HTTPS
74556
74698
  * to avoid mixed-content blocks in the browser. The public
74557
74699
  * tunnel always emits `https://` regardless. */
74558
74700
  scheme: _enum(["http", "https"]).optional()
74559
- }), 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" });
74701
+ }), 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, {
74702
+ kind: "mutation",
74703
+ auth: "admin"
74704
+ }), method(object({
74705
+ certPem: string().min(1),
74706
+ keyPem: string().min(1),
74707
+ caPem: string().optional()
74708
+ }), TlsStatusSchema, {
74709
+ kind: "mutation",
74710
+ auth: "admin"
74711
+ }), method(_void(), object({ pem: string() })), method(_void(), TlsStatusSchema, {
74712
+ kind: "mutation",
74713
+ auth: "admin"
74714
+ });
74560
74715
  var LockControlStatusSchema = object({
74561
74716
  /** Lifecycle state of the lock. `jammed` means the motor reported
74562
74717
  * failure to reach the target — operator intervention required. */
@@ -82583,6 +82738,12 @@ Object.freeze({
82583
82738
  addonId: null,
82584
82739
  access: "create"
82585
82740
  },
82741
+ "localNetwork.downloadCa": {
82742
+ capName: "local-network",
82743
+ capScope: "system",
82744
+ addonId: null,
82745
+ access: "view"
82746
+ },
82586
82747
  "localNetwork.getAllowedAddresses": {
82587
82748
  capName: "local-network",
82588
82749
  capScope: "system",
@@ -82607,18 +82768,42 @@ Object.freeze({
82607
82768
  addonId: null,
82608
82769
  access: "view"
82609
82770
  },
82771
+ "localNetwork.getTlsStatus": {
82772
+ capName: "local-network",
82773
+ capScope: "system",
82774
+ addonId: null,
82775
+ access: "view"
82776
+ },
82777
+ "localNetwork.getViewerEndpoints": {
82778
+ capName: "local-network",
82779
+ capScope: "system",
82780
+ addonId: null,
82781
+ access: "view"
82782
+ },
82610
82783
  "localNetwork.list": {
82611
82784
  capName: "local-network",
82612
82785
  capScope: "system",
82613
82786
  addonId: null,
82614
82787
  access: "view"
82615
82788
  },
82789
+ "localNetwork.regenerateCertificate": {
82790
+ capName: "local-network",
82791
+ capScope: "system",
82792
+ addonId: null,
82793
+ access: "create"
82794
+ },
82616
82795
  "localNetwork.resetAllowlistToBestMatch": {
82617
82796
  capName: "local-network",
82618
82797
  capScope: "system",
82619
82798
  addonId: null,
82620
82799
  access: "delete"
82621
82800
  },
82801
+ "localNetwork.revertToGeneratedCertificate": {
82802
+ capName: "local-network",
82803
+ capScope: "system",
82804
+ addonId: null,
82805
+ access: "create"
82806
+ },
82622
82807
  "localNetwork.setAllowedAddresses": {
82623
82808
  capName: "local-network",
82624
82809
  capScope: "system",
@@ -82631,6 +82816,18 @@ Object.freeze({
82631
82816
  addonId: null,
82632
82817
  access: "create"
82633
82818
  },
82819
+ "localNetwork.setViewerEndpoints": {
82820
+ capName: "local-network",
82821
+ capScope: "system",
82822
+ addonId: null,
82823
+ access: "create"
82824
+ },
82825
+ "localNetwork.uploadCertificate": {
82826
+ capName: "local-network",
82827
+ capScope: "system",
82828
+ addonId: null,
82829
+ access: "create"
82830
+ },
82634
82831
  "lockControl.lock": {
82635
82832
  capName: "lock-control",
82636
82833
  capScope: "device",
@@ -85511,6 +85708,12 @@ Object.freeze({
85511
85708
  addonId: null,
85512
85709
  access: "create"
85513
85710
  },
85711
+ "terminalSession.updateInstance": {
85712
+ capName: "terminal-session",
85713
+ capScope: "system",
85714
+ addonId: null,
85715
+ access: "create"
85716
+ },
85514
85717
  "terminalSession.writeInput": {
85515
85718
  capName: "terminal-session",
85516
85719
  capScope: "system",
@@ -87998,6 +88201,35 @@ Object.freeze(Object.fromEntries([{
87998
88201
  }]
87999
88202
  }].map((s) => [s.stepId, s.defaultModelId])));
88000
88203
  string().min(1);
88204
+ var CLUSTER_STEP_SETTING_FIELDS = [{
88205
+ stepId: "face-embedding",
88206
+ key: "minLandmarkFaceSize",
88207
+ label: "Min face size for recognition (detection px)",
88208
+ 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.",
88209
+ type: "slider",
88210
+ min: 0,
88211
+ max: 64,
88212
+ step: 2,
88213
+ default: 24
88214
+ }];
88215
+ function clusterStepSettingKey(stepId, fieldKey) {
88216
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
88217
+ }
88218
+ var ClusterSettingNumberSchema = number().finite();
88219
+ function readClusterStepSettings(config) {
88220
+ const out = {};
88221
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
88222
+ const parsed = ClusterSettingNumberSchema.safeParse(config[clusterStepSettingKey(field.stepId, field.key)]);
88223
+ const value = parsed.success ? parsed.data : field.default;
88224
+ const existing = out[field.stepId] ?? {};
88225
+ out[field.stepId] = {
88226
+ ...existing,
88227
+ [field.key]: value
88228
+ };
88229
+ }
88230
+ return out;
88231
+ }
88232
+ readClusterStepSettings({});
88001
88233
  object({
88002
88234
  /**
88003
88235
  * 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-provider-dreame",
3
- "version": "0.2.26",
3
+ "version": "0.2.27",
4
4
  "description": "Dreame robot-vacuum / lawn-mower device-provider addon for CamStack — wraps the @apocaliss92/nodedreame Dreamehome cloud client",
5
5
  "keywords": [
6
6
  "camstack",