@camstack/addon-provider-reolink 1.2.48 → 1.2.49

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
@@ -8234,6 +8234,15 @@ var LabelDefinitionSchema = object({
8234
8234
  description: string().optional(),
8235
8235
  icon: string().optional()
8236
8236
  });
8237
+ var ClassMapDefinitionSchema = object({
8238
+ mapping: record(string(), _enum([
8239
+ "person",
8240
+ "vehicle",
8241
+ "animal",
8242
+ "package"
8243
+ ])),
8244
+ preserveOriginal: boolean()
8245
+ });
8237
8246
  var MODEL_FORMATS = [
8238
8247
  "onnx",
8239
8248
  "coreml",
@@ -8412,7 +8421,13 @@ var ModelCatalogEntrySchema = object({
8412
8421
  * `id` stays the source of truth for resolution/download/persistence; grouping
8413
8422
  * is a presentation overlay resolved back to an `id`.
8414
8423
  */
8415
- group: ModelVariantGroupSchema.optional()
8424
+ group: ModelVariantGroupSchema.optional(),
8425
+ /**
8426
+ * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
8427
+ * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8428
+ * labels already ARE the CamStack macros (Scrypted identity map).
8429
+ */
8430
+ classMap: ClassMapDefinitionSchema.optional()
8416
8431
  });
8417
8432
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8418
8433
  format: literal("openvino"),
@@ -8441,7 +8456,8 @@ var ModelConvertMetadataSchema = object({
8441
8456
  "ocr",
8442
8457
  "segmentation"
8443
8458
  ]),
8444
- faceAlignment: boolean().optional()
8459
+ faceAlignment: boolean().optional(),
8460
+ classMap: ClassMapDefinitionSchema.optional()
8445
8461
  });
8446
8462
  var ConvertResultSchema = object({
8447
8463
  entry: ModelCatalogEntrySchema,
@@ -17746,6 +17762,33 @@ var NativeCropRefSchema = object({
17746
17762
  h: number()
17747
17763
  })
17748
17764
  });
17765
+ object({
17766
+ crop: object({
17767
+ left: number(),
17768
+ top: number(),
17769
+ width: number().positive(),
17770
+ height: number().positive()
17771
+ }).optional(),
17772
+ content: object({
17773
+ width: number().int().positive(),
17774
+ height: number().int().positive()
17775
+ }),
17776
+ fit: _enum(["stretch", "contain"]),
17777
+ format: _enum([
17778
+ "rgb",
17779
+ "gray",
17780
+ "jpeg"
17781
+ ])
17782
+ });
17783
+ var FrameRefSchema = object({
17784
+ registryId: string().min(1),
17785
+ id: string().min(1),
17786
+ width: number().int().positive(),
17787
+ height: number().int().positive(),
17788
+ format: _enum(["rgb", "gray"]),
17789
+ timestamp: number(),
17790
+ capturedAt: number().optional()
17791
+ });
17749
17792
  var ModelFormatSchema$1 = _enum([
17750
17793
  "onnx",
17751
17794
  "coreml",
@@ -17990,6 +18033,12 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
17990
18033
  steps: array(PipelineStepInputSchema).min(1),
17991
18034
  frame: FrameInputSchema.optional(),
17992
18035
  /**
18036
+ * Process-local lazy frame. Valid only when caller and provider resolve
18037
+ * in the same execution-group process; split/cross-node callers use
18038
+ * `frame`/`image` inline compatibility instead.
18039
+ */
18040
+ frameRef: FrameRefSchema.optional(),
18041
+ /**
17993
18042
  * CB5 shm passthrough — a `FrameHandle` naming the same ring slot
17994
18043
  * the decoded pixels live in. One more member of the one-of
17995
18044
  * frame/frameHandle/image/imageBase64/referenceImage group.
@@ -18285,7 +18334,10 @@ var NativeCropResultSchema = object({
18285
18334
  * Which source served this crop, so a quality-sensitive consumer (the native
18286
18335
  * `keyFrame`) can reject a degraded fallback:
18287
18336
  * - `native` — cut from the decode worker's retained NATIVE surface (the
18288
- * quality path).
18337
+ * quality path). A subject-tile serve is also native-resolution and stays
18338
+ * `native` here: the public enum cannot name `tile` without a breaking cap
18339
+ * change. Runner telemetry distinguishes lease vs tile via `source` on the
18340
+ * internal crop result (`nativeHits` vs `tileHits`).
18289
18341
  * - `ram-fullframe` — the native surface MISSED but the request was full-frame,
18290
18342
  * so the ≤640 RAM `RetainedFrameStore` served it (honest lower-res; legit for
18291
18343
  * the blank-frame guard / 640-snapshot resolve, NOT for the clean keyFrame).
@@ -18776,12 +18828,41 @@ var RunnerLocalLoadSchema = object({
18776
18828
  * legacy `OrchestratorMetricsSchema` shape so existing dashboards keep
18777
18829
  * working unchanged when they switch to reading from the runner cap.
18778
18830
  */
18831
+ var FrameLazyCountersSchema = object({
18832
+ framesDecoded: number(),
18833
+ framesAdmitted: number(),
18834
+ framesDroppedPixelFree: number(),
18835
+ viewsMaterialized: number(),
18836
+ viewsSkipped: number(),
18837
+ workerToRunnerBytes: number(),
18838
+ runnerToPoolRawBytes: number(),
18839
+ runnerToPoolJpegBytes: number(),
18840
+ onDemandFullFrameRequests: number(),
18841
+ onDemandCropRequests: number(),
18842
+ nativeHits: number(),
18843
+ nativeMisses: number(),
18844
+ tileHits: number(),
18845
+ tileMisses: number(),
18846
+ fallbackHits: number(),
18847
+ fallbackMisses: number(),
18848
+ retainedWritesAvoided: number(),
18849
+ residentRefs: number(),
18850
+ residentBytes: number(),
18851
+ releases: number(),
18852
+ evictions: number(),
18853
+ staleMisses: number()
18854
+ });
18855
+ var FrameLazyMetricsSchema = object({
18856
+ node: FrameLazyCountersSchema,
18857
+ cameras: array(FrameLazyCountersSchema.extend({ deviceId: number() }))
18858
+ });
18779
18859
  var RunnerLocalMetricsSchema = object({
18780
18860
  nodeId: string(),
18781
18861
  activeCameras: number(),
18782
18862
  throttledCameras: number(),
18783
18863
  avgInferenceTimeMs: number(),
18784
- queueDepth: number()
18864
+ queueDepth: number(),
18865
+ frameLazy: FrameLazyMetricsSchema.optional()
18785
18866
  });
18786
18867
  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({
18787
18868
  handle: FrameHandleSchema,
@@ -20185,6 +20266,9 @@ method(_void(), ProviderInfoSchema), method(object({ config: record(string(), un
20185
20266
  location: StorageLocationSchema,
20186
20267
  relativePath: string()
20187
20268
  }), _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" });
20269
+ /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
20270
+ var ProfileSettingsSchemaBridge = unknown().nullable();
20271
+ var ProfileSettingsBagSchema = record(string(), unknown());
20188
20272
  /**
20189
20273
  * A live terminal session hosted by the provider addon. Output and input do
20190
20274
  * NOT flow through the capability — they use the addon data plane
@@ -20214,7 +20298,14 @@ var TerminalSessionInfoSchema = object({
20214
20298
  var TerminalProfileInfoSchema = object({
20215
20299
  profileId: string(),
20216
20300
  label: string(),
20217
- description: string().optional()
20301
+ description: string().optional(),
20302
+ /** Spawn defaults the instance form copies on create. */
20303
+ executable: string().optional(),
20304
+ args: array(string()).readonly().optional(),
20305
+ cwd: string().optional(),
20306
+ environment: array(string()).readonly().optional(),
20307
+ /** ConfigUISchema for instance knobs, or null when the profile has none. */
20308
+ settingsSchema: ProfileSettingsSchemaBridge.optional()
20218
20309
  });
20219
20310
  /**
20220
20311
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -20227,7 +20318,12 @@ var TerminalInstanceInfoSchema = object({
20227
20318
  profileId: string(),
20228
20319
  profileLabel: string(),
20229
20320
  name: string(),
20230
- enabled: boolean()
20321
+ enabled: boolean(),
20322
+ executable: string(),
20323
+ args: array(string()).readonly(),
20324
+ cwd: string(),
20325
+ environment: array(string()).readonly(),
20326
+ profileSettings: ProfileSettingsBagSchema
20231
20327
  });
20232
20328
  var TerminalLegacyCameraSchema = object({
20233
20329
  stableId: string(),
@@ -20257,7 +20353,23 @@ var TerminalOutputBatchSchema = object({
20257
20353
  method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }), method(_void(), array(TerminalInstanceInfoSchema).readonly(), { auth: "admin" }), method(object({
20258
20354
  targetNodeId: string().min(1),
20259
20355
  profileId: string().min(1),
20260
- name: string().trim().min(1).max(160).optional()
20356
+ name: string().trim().min(1).max(160).optional(),
20357
+ executable: string().max(1024).optional(),
20358
+ args: array(string().max(2048)).max(64).optional(),
20359
+ cwd: string().max(1024).optional(),
20360
+ environment: array(string().max(4096)).max(64).optional(),
20361
+ profileSettings: ProfileSettingsBagSchema.optional()
20362
+ }), TerminalInstanceInfoSchema, {
20363
+ kind: "mutation",
20364
+ auth: "admin"
20365
+ }), method(object({
20366
+ instanceId: string().min(1),
20367
+ name: string().trim().min(1).max(160).optional(),
20368
+ executable: string().max(1024).optional(),
20369
+ args: array(string().max(2048)).max(64).optional(),
20370
+ cwd: string().max(1024).optional(),
20371
+ environment: array(string().max(4096)).max(64).optional(),
20372
+ profileSettings: ProfileSettingsBagSchema.optional()
20261
20373
  }), TerminalInstanceInfoSchema, {
20262
20374
  kind: "mutation",
20263
20375
  auth: "admin"
@@ -20279,7 +20391,11 @@ method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }),
20279
20391
  }), method(_void(), array(TerminalSessionInfoSchema).readonly(), { auth: "admin" }), method(object({
20280
20392
  profileId: string(),
20281
20393
  cols: number().int().positive(),
20282
- rows: number().int().positive()
20394
+ rows: number().int().positive(),
20395
+ executable: string().max(1024).optional(),
20396
+ args: array(string().max(2048)).max(64).optional(),
20397
+ cwd: string().max(1024).optional(),
20398
+ environment: array(string().max(4096)).max(64).optional()
20283
20399
  }), TerminalSessionInfoSchema, {
20284
20400
  kind: "mutation",
20285
20401
  auth: "admin"
@@ -24154,10 +24270,10 @@ var lawnMowerControlCapability = {
24154
24270
  *
24155
24271
  * • The SDK (mobile / web client) consumes `getConnectionEndpoints()`
24156
24272
  * to receive an ordered list of candidate base URLs it should race
24157
- * on connect — LAN IPv4 first (lowest latency when on same network),
24158
- * then public hostname (if a tunnel is up), then IPv6. The SDK can
24159
- * race them with short timeouts and stick with the winner for the
24160
- * session.
24273
+ * on connect — LAN IPv4 and stable LAN IPv6 first (lowest latency
24274
+ * when on the same network), then public hostname (if a tunnel is
24275
+ * up). The SDK can race them with short timeouts and stick with the
24276
+ * winner for the session.
24161
24277
  *
24162
24278
  * Why hub-only: agents are not directly addressable by the operator's
24163
24279
  * clients — they reverse-connect to the hub. Exposing their interfaces
@@ -24312,6 +24428,17 @@ var NotificationEndpointSchema = object({
24312
24428
  /** What the ranking currently resolves to (null when nothing is reachable). */
24313
24429
  resolved: string().nullable()
24314
24430
  });
24431
+ /**
24432
+ * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
24433
+ * AUTO (every LAN IPv4 + the public tunnel). `resolved` is what that choice
24434
+ * currently expands to, so the UI can show the effective set either way.
24435
+ */
24436
+ var ViewerEndpointsSchema = object({
24437
+ /** The operator's explicit race set, or empty for AUTO. */
24438
+ baseUrls: array(string()).readonly(),
24439
+ /** What the ranking currently resolves to (may be empty if nothing is up). */
24440
+ resolved: array(string()).readonly()
24441
+ });
24315
24442
  var AllowedAddressesSchema = object({
24316
24443
  /**
24317
24444
  * Allowlist of interface addresses operators have explicitly opted
@@ -24320,6 +24447,20 @@ var AllowedAddressesSchema = object({
24320
24447
  * Network Addresses admin page and persisted by the addon.
24321
24448
  */
24322
24449
  addresses: array(string()).readonly() });
24450
+ var TlsStatusSchema = object({
24451
+ mode: _enum([
24452
+ "generated",
24453
+ "uploaded",
24454
+ "disabled"
24455
+ ]),
24456
+ leafFingerprintSha256: string().nullable(),
24457
+ caFingerprintSha256: string().nullable(),
24458
+ validTo: string().nullable(),
24459
+ sans: array(string()),
24460
+ caCertPem: string().nullable(),
24461
+ reissueError: string().nullable(),
24462
+ restartRequired: boolean()
24463
+ });
24323
24464
  method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
24324
24465
  /**
24325
24466
  * LEGACY HINT — do not send from new code. Kept optional so clients
@@ -24329,17 +24470,31 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
24329
24470
  */
24330
24471
  port: number().int().min(1).max(65535).optional(),
24331
24472
  /** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
24332
- * candidate. Default `true`. */
24473
+ * candidate. Default `false` — loopback is not a client route. */
24333
24474
  includeLoopback: boolean().optional(),
24334
- /** Skip IPv6 entries. Some legacy clients can't parse them.
24335
- * Default `false`. */
24475
+ /** Skip IPv6 entries. Default `false` the palette includes stable
24476
+ * LAN IPv6 (ICE/WebRTC uses dual-stack regardless). Pass `true` to
24477
+ * hide them. The viewer HTTP/WS race is `getViewerEndpoints`. */
24336
24478
  ipv4Only: boolean().optional(),
24337
24479
  /** Scheme to emit for LAN/loopback URLs. Default `'http'`.
24338
24480
  * Pass `'https'` when the caller is itself loaded over HTTPS
24339
24481
  * to avoid mixed-content blocks in the browser. The public
24340
24482
  * tunnel always emits `https://` regardless. */
24341
24483
  scheme: _enum(["http", "https"]).optional()
24342
- }), 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" });
24484
+ }), 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, {
24485
+ kind: "mutation",
24486
+ auth: "admin"
24487
+ }), method(object({
24488
+ certPem: string().min(1),
24489
+ keyPem: string().min(1),
24490
+ caPem: string().optional()
24491
+ }), TlsStatusSchema, {
24492
+ kind: "mutation",
24493
+ auth: "admin"
24494
+ }), method(_void(), object({ pem: string() })), method(_void(), TlsStatusSchema, {
24495
+ kind: "mutation",
24496
+ auth: "admin"
24497
+ });
24343
24498
  var LockControlStatusSchema = object({
24344
24499
  /** Lifecycle state of the lock. `jammed` means the motor reported
24345
24500
  * failure to reach the target — operator intervention required. */
@@ -32818,6 +32973,12 @@ Object.freeze({
32818
32973
  addonId: null,
32819
32974
  access: "create"
32820
32975
  },
32976
+ "localNetwork.downloadCa": {
32977
+ capName: "local-network",
32978
+ capScope: "system",
32979
+ addonId: null,
32980
+ access: "view"
32981
+ },
32821
32982
  "localNetwork.getAllowedAddresses": {
32822
32983
  capName: "local-network",
32823
32984
  capScope: "system",
@@ -32842,18 +33003,42 @@ Object.freeze({
32842
33003
  addonId: null,
32843
33004
  access: "view"
32844
33005
  },
33006
+ "localNetwork.getTlsStatus": {
33007
+ capName: "local-network",
33008
+ capScope: "system",
33009
+ addonId: null,
33010
+ access: "view"
33011
+ },
33012
+ "localNetwork.getViewerEndpoints": {
33013
+ capName: "local-network",
33014
+ capScope: "system",
33015
+ addonId: null,
33016
+ access: "view"
33017
+ },
32845
33018
  "localNetwork.list": {
32846
33019
  capName: "local-network",
32847
33020
  capScope: "system",
32848
33021
  addonId: null,
32849
33022
  access: "view"
32850
33023
  },
33024
+ "localNetwork.regenerateCertificate": {
33025
+ capName: "local-network",
33026
+ capScope: "system",
33027
+ addonId: null,
33028
+ access: "create"
33029
+ },
32851
33030
  "localNetwork.resetAllowlistToBestMatch": {
32852
33031
  capName: "local-network",
32853
33032
  capScope: "system",
32854
33033
  addonId: null,
32855
33034
  access: "delete"
32856
33035
  },
33036
+ "localNetwork.revertToGeneratedCertificate": {
33037
+ capName: "local-network",
33038
+ capScope: "system",
33039
+ addonId: null,
33040
+ access: "create"
33041
+ },
32857
33042
  "localNetwork.setAllowedAddresses": {
32858
33043
  capName: "local-network",
32859
33044
  capScope: "system",
@@ -32866,6 +33051,18 @@ Object.freeze({
32866
33051
  addonId: null,
32867
33052
  access: "create"
32868
33053
  },
33054
+ "localNetwork.setViewerEndpoints": {
33055
+ capName: "local-network",
33056
+ capScope: "system",
33057
+ addonId: null,
33058
+ access: "create"
33059
+ },
33060
+ "localNetwork.uploadCertificate": {
33061
+ capName: "local-network",
33062
+ capScope: "system",
33063
+ addonId: null,
33064
+ access: "create"
33065
+ },
32869
33066
  "lockControl.lock": {
32870
33067
  capName: "lock-control",
32871
33068
  capScope: "device",
@@ -35746,6 +35943,12 @@ Object.freeze({
35746
35943
  addonId: null,
35747
35944
  access: "create"
35748
35945
  },
35946
+ "terminalSession.updateInstance": {
35947
+ capName: "terminal-session",
35948
+ capScope: "system",
35949
+ addonId: null,
35950
+ access: "create"
35951
+ },
35749
35952
  "terminalSession.writeInput": {
35750
35953
  capName: "terminal-session",
35751
35954
  capScope: "system",
@@ -38233,6 +38436,35 @@ Object.freeze(Object.fromEntries([{
38233
38436
  }]
38234
38437
  }].map((s) => [s.stepId, s.defaultModelId])));
38235
38438
  string().min(1);
38439
+ var CLUSTER_STEP_SETTING_FIELDS = [{
38440
+ stepId: "face-embedding",
38441
+ key: "minLandmarkFaceSize",
38442
+ label: "Min face size for recognition (detection px)",
38443
+ 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.",
38444
+ type: "slider",
38445
+ min: 0,
38446
+ max: 64,
38447
+ step: 2,
38448
+ default: 24
38449
+ }];
38450
+ function clusterStepSettingKey(stepId, fieldKey) {
38451
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
38452
+ }
38453
+ var ClusterSettingNumberSchema = number().finite();
38454
+ function readClusterStepSettings(config) {
38455
+ const out = {};
38456
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
38457
+ const parsed = ClusterSettingNumberSchema.safeParse(config[clusterStepSettingKey(field.stepId, field.key)]);
38458
+ const value = parsed.success ? parsed.data : field.default;
38459
+ const existing = out[field.stepId] ?? {};
38460
+ out[field.stepId] = {
38461
+ ...existing,
38462
+ [field.key]: value
38463
+ };
38464
+ }
38465
+ return out;
38466
+ }
38467
+ readClusterStepSettings({});
38236
38468
  object({
38237
38469
  /**
38238
38470
  * Fraction of the box's own size added on EACH side before cutting.
package/dist/addon.mjs CHANGED
@@ -8229,6 +8229,15 @@ var LabelDefinitionSchema = object({
8229
8229
  description: string().optional(),
8230
8230
  icon: string().optional()
8231
8231
  });
8232
+ var ClassMapDefinitionSchema = object({
8233
+ mapping: record(string(), _enum([
8234
+ "person",
8235
+ "vehicle",
8236
+ "animal",
8237
+ "package"
8238
+ ])),
8239
+ preserveOriginal: boolean()
8240
+ });
8232
8241
  var MODEL_FORMATS = [
8233
8242
  "onnx",
8234
8243
  "coreml",
@@ -8407,7 +8416,13 @@ var ModelCatalogEntrySchema = object({
8407
8416
  * `id` stays the source of truth for resolution/download/persistence; grouping
8408
8417
  * is a presentation overlay resolved back to an `id`.
8409
8418
  */
8410
- group: ModelVariantGroupSchema.optional()
8419
+ group: ModelVariantGroupSchema.optional(),
8420
+ /**
8421
+ * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
8422
+ * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8423
+ * labels already ARE the CamStack macros (Scrypted identity map).
8424
+ */
8425
+ classMap: ClassMapDefinitionSchema.optional()
8411
8426
  });
8412
8427
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8413
8428
  format: literal("openvino"),
@@ -8436,7 +8451,8 @@ var ModelConvertMetadataSchema = object({
8436
8451
  "ocr",
8437
8452
  "segmentation"
8438
8453
  ]),
8439
- faceAlignment: boolean().optional()
8454
+ faceAlignment: boolean().optional(),
8455
+ classMap: ClassMapDefinitionSchema.optional()
8440
8456
  });
8441
8457
  var ConvertResultSchema = object({
8442
8458
  entry: ModelCatalogEntrySchema,
@@ -17741,6 +17757,33 @@ var NativeCropRefSchema = object({
17741
17757
  h: number()
17742
17758
  })
17743
17759
  });
17760
+ object({
17761
+ crop: object({
17762
+ left: number(),
17763
+ top: number(),
17764
+ width: number().positive(),
17765
+ height: number().positive()
17766
+ }).optional(),
17767
+ content: object({
17768
+ width: number().int().positive(),
17769
+ height: number().int().positive()
17770
+ }),
17771
+ fit: _enum(["stretch", "contain"]),
17772
+ format: _enum([
17773
+ "rgb",
17774
+ "gray",
17775
+ "jpeg"
17776
+ ])
17777
+ });
17778
+ var FrameRefSchema = object({
17779
+ registryId: string().min(1),
17780
+ id: string().min(1),
17781
+ width: number().int().positive(),
17782
+ height: number().int().positive(),
17783
+ format: _enum(["rgb", "gray"]),
17784
+ timestamp: number(),
17785
+ capturedAt: number().optional()
17786
+ });
17744
17787
  var ModelFormatSchema$1 = _enum([
17745
17788
  "onnx",
17746
17789
  "coreml",
@@ -17985,6 +18028,12 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
17985
18028
  steps: array(PipelineStepInputSchema).min(1),
17986
18029
  frame: FrameInputSchema.optional(),
17987
18030
  /**
18031
+ * Process-local lazy frame. Valid only when caller and provider resolve
18032
+ * in the same execution-group process; split/cross-node callers use
18033
+ * `frame`/`image` inline compatibility instead.
18034
+ */
18035
+ frameRef: FrameRefSchema.optional(),
18036
+ /**
17988
18037
  * CB5 shm passthrough — a `FrameHandle` naming the same ring slot
17989
18038
  * the decoded pixels live in. One more member of the one-of
17990
18039
  * frame/frameHandle/image/imageBase64/referenceImage group.
@@ -18280,7 +18329,10 @@ var NativeCropResultSchema = object({
18280
18329
  * Which source served this crop, so a quality-sensitive consumer (the native
18281
18330
  * `keyFrame`) can reject a degraded fallback:
18282
18331
  * - `native` — cut from the decode worker's retained NATIVE surface (the
18283
- * quality path).
18332
+ * quality path). A subject-tile serve is also native-resolution and stays
18333
+ * `native` here: the public enum cannot name `tile` without a breaking cap
18334
+ * change. Runner telemetry distinguishes lease vs tile via `source` on the
18335
+ * internal crop result (`nativeHits` vs `tileHits`).
18284
18336
  * - `ram-fullframe` — the native surface MISSED but the request was full-frame,
18285
18337
  * so the ≤640 RAM `RetainedFrameStore` served it (honest lower-res; legit for
18286
18338
  * the blank-frame guard / 640-snapshot resolve, NOT for the clean keyFrame).
@@ -18771,12 +18823,41 @@ var RunnerLocalLoadSchema = object({
18771
18823
  * legacy `OrchestratorMetricsSchema` shape so existing dashboards keep
18772
18824
  * working unchanged when they switch to reading from the runner cap.
18773
18825
  */
18826
+ var FrameLazyCountersSchema = object({
18827
+ framesDecoded: number(),
18828
+ framesAdmitted: number(),
18829
+ framesDroppedPixelFree: number(),
18830
+ viewsMaterialized: number(),
18831
+ viewsSkipped: number(),
18832
+ workerToRunnerBytes: number(),
18833
+ runnerToPoolRawBytes: number(),
18834
+ runnerToPoolJpegBytes: number(),
18835
+ onDemandFullFrameRequests: number(),
18836
+ onDemandCropRequests: number(),
18837
+ nativeHits: number(),
18838
+ nativeMisses: number(),
18839
+ tileHits: number(),
18840
+ tileMisses: number(),
18841
+ fallbackHits: number(),
18842
+ fallbackMisses: number(),
18843
+ retainedWritesAvoided: number(),
18844
+ residentRefs: number(),
18845
+ residentBytes: number(),
18846
+ releases: number(),
18847
+ evictions: number(),
18848
+ staleMisses: number()
18849
+ });
18850
+ var FrameLazyMetricsSchema = object({
18851
+ node: FrameLazyCountersSchema,
18852
+ cameras: array(FrameLazyCountersSchema.extend({ deviceId: number() }))
18853
+ });
18774
18854
  var RunnerLocalMetricsSchema = object({
18775
18855
  nodeId: string(),
18776
18856
  activeCameras: number(),
18777
18857
  throttledCameras: number(),
18778
18858
  avgInferenceTimeMs: number(),
18779
- queueDepth: number()
18859
+ queueDepth: number(),
18860
+ frameLazy: FrameLazyMetricsSchema.optional()
18780
18861
  });
18781
18862
  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({
18782
18863
  handle: FrameHandleSchema,
@@ -20180,6 +20261,9 @@ method(_void(), ProviderInfoSchema), method(object({ config: record(string(), un
20180
20261
  location: StorageLocationSchema,
20181
20262
  relativePath: string()
20182
20263
  }), _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" });
20264
+ /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
20265
+ var ProfileSettingsSchemaBridge = unknown().nullable();
20266
+ var ProfileSettingsBagSchema = record(string(), unknown());
20183
20267
  /**
20184
20268
  * A live terminal session hosted by the provider addon. Output and input do
20185
20269
  * NOT flow through the capability — they use the addon data plane
@@ -20209,7 +20293,14 @@ var TerminalSessionInfoSchema = object({
20209
20293
  var TerminalProfileInfoSchema = object({
20210
20294
  profileId: string(),
20211
20295
  label: string(),
20212
- description: string().optional()
20296
+ description: string().optional(),
20297
+ /** Spawn defaults the instance form copies on create. */
20298
+ executable: string().optional(),
20299
+ args: array(string()).readonly().optional(),
20300
+ cwd: string().optional(),
20301
+ environment: array(string()).readonly().optional(),
20302
+ /** ConfigUISchema for instance knobs, or null when the profile has none. */
20303
+ settingsSchema: ProfileSettingsSchemaBridge.optional()
20213
20304
  });
20214
20305
  /**
20215
20306
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -20222,7 +20313,12 @@ var TerminalInstanceInfoSchema = object({
20222
20313
  profileId: string(),
20223
20314
  profileLabel: string(),
20224
20315
  name: string(),
20225
- enabled: boolean()
20316
+ enabled: boolean(),
20317
+ executable: string(),
20318
+ args: array(string()).readonly(),
20319
+ cwd: string(),
20320
+ environment: array(string()).readonly(),
20321
+ profileSettings: ProfileSettingsBagSchema
20226
20322
  });
20227
20323
  var TerminalLegacyCameraSchema = object({
20228
20324
  stableId: string(),
@@ -20252,7 +20348,23 @@ var TerminalOutputBatchSchema = object({
20252
20348
  method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }), method(_void(), array(TerminalInstanceInfoSchema).readonly(), { auth: "admin" }), method(object({
20253
20349
  targetNodeId: string().min(1),
20254
20350
  profileId: string().min(1),
20255
- name: string().trim().min(1).max(160).optional()
20351
+ name: string().trim().min(1).max(160).optional(),
20352
+ executable: string().max(1024).optional(),
20353
+ args: array(string().max(2048)).max(64).optional(),
20354
+ cwd: string().max(1024).optional(),
20355
+ environment: array(string().max(4096)).max(64).optional(),
20356
+ profileSettings: ProfileSettingsBagSchema.optional()
20357
+ }), TerminalInstanceInfoSchema, {
20358
+ kind: "mutation",
20359
+ auth: "admin"
20360
+ }), method(object({
20361
+ instanceId: string().min(1),
20362
+ name: string().trim().min(1).max(160).optional(),
20363
+ executable: string().max(1024).optional(),
20364
+ args: array(string().max(2048)).max(64).optional(),
20365
+ cwd: string().max(1024).optional(),
20366
+ environment: array(string().max(4096)).max(64).optional(),
20367
+ profileSettings: ProfileSettingsBagSchema.optional()
20256
20368
  }), TerminalInstanceInfoSchema, {
20257
20369
  kind: "mutation",
20258
20370
  auth: "admin"
@@ -20274,7 +20386,11 @@ method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }),
20274
20386
  }), method(_void(), array(TerminalSessionInfoSchema).readonly(), { auth: "admin" }), method(object({
20275
20387
  profileId: string(),
20276
20388
  cols: number().int().positive(),
20277
- rows: number().int().positive()
20389
+ rows: number().int().positive(),
20390
+ executable: string().max(1024).optional(),
20391
+ args: array(string().max(2048)).max(64).optional(),
20392
+ cwd: string().max(1024).optional(),
20393
+ environment: array(string().max(4096)).max(64).optional()
20278
20394
  }), TerminalSessionInfoSchema, {
20279
20395
  kind: "mutation",
20280
20396
  auth: "admin"
@@ -24149,10 +24265,10 @@ var lawnMowerControlCapability = {
24149
24265
  *
24150
24266
  * • The SDK (mobile / web client) consumes `getConnectionEndpoints()`
24151
24267
  * to receive an ordered list of candidate base URLs it should race
24152
- * on connect — LAN IPv4 first (lowest latency when on same network),
24153
- * then public hostname (if a tunnel is up), then IPv6. The SDK can
24154
- * race them with short timeouts and stick with the winner for the
24155
- * session.
24268
+ * on connect — LAN IPv4 and stable LAN IPv6 first (lowest latency
24269
+ * when on the same network), then public hostname (if a tunnel is
24270
+ * up). The SDK can race them with short timeouts and stick with the
24271
+ * winner for the session.
24156
24272
  *
24157
24273
  * Why hub-only: agents are not directly addressable by the operator's
24158
24274
  * clients — they reverse-connect to the hub. Exposing their interfaces
@@ -24307,6 +24423,17 @@ var NotificationEndpointSchema = object({
24307
24423
  /** What the ranking currently resolves to (null when nothing is reachable). */
24308
24424
  resolved: string().nullable()
24309
24425
  });
24426
+ /**
24427
+ * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
24428
+ * AUTO (every LAN IPv4 + the public tunnel). `resolved` is what that choice
24429
+ * currently expands to, so the UI can show the effective set either way.
24430
+ */
24431
+ var ViewerEndpointsSchema = object({
24432
+ /** The operator's explicit race set, or empty for AUTO. */
24433
+ baseUrls: array(string()).readonly(),
24434
+ /** What the ranking currently resolves to (may be empty if nothing is up). */
24435
+ resolved: array(string()).readonly()
24436
+ });
24310
24437
  var AllowedAddressesSchema = object({
24311
24438
  /**
24312
24439
  * Allowlist of interface addresses operators have explicitly opted
@@ -24315,6 +24442,20 @@ var AllowedAddressesSchema = object({
24315
24442
  * Network Addresses admin page and persisted by the addon.
24316
24443
  */
24317
24444
  addresses: array(string()).readonly() });
24445
+ var TlsStatusSchema = object({
24446
+ mode: _enum([
24447
+ "generated",
24448
+ "uploaded",
24449
+ "disabled"
24450
+ ]),
24451
+ leafFingerprintSha256: string().nullable(),
24452
+ caFingerprintSha256: string().nullable(),
24453
+ validTo: string().nullable(),
24454
+ sans: array(string()),
24455
+ caCertPem: string().nullable(),
24456
+ reissueError: string().nullable(),
24457
+ restartRequired: boolean()
24458
+ });
24318
24459
  method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
24319
24460
  /**
24320
24461
  * LEGACY HINT — do not send from new code. Kept optional so clients
@@ -24324,17 +24465,31 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
24324
24465
  */
24325
24466
  port: number().int().min(1).max(65535).optional(),
24326
24467
  /** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
24327
- * candidate. Default `true`. */
24468
+ * candidate. Default `false` — loopback is not a client route. */
24328
24469
  includeLoopback: boolean().optional(),
24329
- /** Skip IPv6 entries. Some legacy clients can't parse them.
24330
- * Default `false`. */
24470
+ /** Skip IPv6 entries. Default `false` the palette includes stable
24471
+ * LAN IPv6 (ICE/WebRTC uses dual-stack regardless). Pass `true` to
24472
+ * hide them. The viewer HTTP/WS race is `getViewerEndpoints`. */
24331
24473
  ipv4Only: boolean().optional(),
24332
24474
  /** Scheme to emit for LAN/loopback URLs. Default `'http'`.
24333
24475
  * Pass `'https'` when the caller is itself loaded over HTTPS
24334
24476
  * to avoid mixed-content blocks in the browser. The public
24335
24477
  * tunnel always emits `https://` regardless. */
24336
24478
  scheme: _enum(["http", "https"]).optional()
24337
- }), 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" });
24479
+ }), 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, {
24480
+ kind: "mutation",
24481
+ auth: "admin"
24482
+ }), method(object({
24483
+ certPem: string().min(1),
24484
+ keyPem: string().min(1),
24485
+ caPem: string().optional()
24486
+ }), TlsStatusSchema, {
24487
+ kind: "mutation",
24488
+ auth: "admin"
24489
+ }), method(_void(), object({ pem: string() })), method(_void(), TlsStatusSchema, {
24490
+ kind: "mutation",
24491
+ auth: "admin"
24492
+ });
24338
24493
  var LockControlStatusSchema = object({
24339
24494
  /** Lifecycle state of the lock. `jammed` means the motor reported
24340
24495
  * failure to reach the target — operator intervention required. */
@@ -32813,6 +32968,12 @@ Object.freeze({
32813
32968
  addonId: null,
32814
32969
  access: "create"
32815
32970
  },
32971
+ "localNetwork.downloadCa": {
32972
+ capName: "local-network",
32973
+ capScope: "system",
32974
+ addonId: null,
32975
+ access: "view"
32976
+ },
32816
32977
  "localNetwork.getAllowedAddresses": {
32817
32978
  capName: "local-network",
32818
32979
  capScope: "system",
@@ -32837,18 +32998,42 @@ Object.freeze({
32837
32998
  addonId: null,
32838
32999
  access: "view"
32839
33000
  },
33001
+ "localNetwork.getTlsStatus": {
33002
+ capName: "local-network",
33003
+ capScope: "system",
33004
+ addonId: null,
33005
+ access: "view"
33006
+ },
33007
+ "localNetwork.getViewerEndpoints": {
33008
+ capName: "local-network",
33009
+ capScope: "system",
33010
+ addonId: null,
33011
+ access: "view"
33012
+ },
32840
33013
  "localNetwork.list": {
32841
33014
  capName: "local-network",
32842
33015
  capScope: "system",
32843
33016
  addonId: null,
32844
33017
  access: "view"
32845
33018
  },
33019
+ "localNetwork.regenerateCertificate": {
33020
+ capName: "local-network",
33021
+ capScope: "system",
33022
+ addonId: null,
33023
+ access: "create"
33024
+ },
32846
33025
  "localNetwork.resetAllowlistToBestMatch": {
32847
33026
  capName: "local-network",
32848
33027
  capScope: "system",
32849
33028
  addonId: null,
32850
33029
  access: "delete"
32851
33030
  },
33031
+ "localNetwork.revertToGeneratedCertificate": {
33032
+ capName: "local-network",
33033
+ capScope: "system",
33034
+ addonId: null,
33035
+ access: "create"
33036
+ },
32852
33037
  "localNetwork.setAllowedAddresses": {
32853
33038
  capName: "local-network",
32854
33039
  capScope: "system",
@@ -32861,6 +33046,18 @@ Object.freeze({
32861
33046
  addonId: null,
32862
33047
  access: "create"
32863
33048
  },
33049
+ "localNetwork.setViewerEndpoints": {
33050
+ capName: "local-network",
33051
+ capScope: "system",
33052
+ addonId: null,
33053
+ access: "create"
33054
+ },
33055
+ "localNetwork.uploadCertificate": {
33056
+ capName: "local-network",
33057
+ capScope: "system",
33058
+ addonId: null,
33059
+ access: "create"
33060
+ },
32864
33061
  "lockControl.lock": {
32865
33062
  capName: "lock-control",
32866
33063
  capScope: "device",
@@ -35741,6 +35938,12 @@ Object.freeze({
35741
35938
  addonId: null,
35742
35939
  access: "create"
35743
35940
  },
35941
+ "terminalSession.updateInstance": {
35942
+ capName: "terminal-session",
35943
+ capScope: "system",
35944
+ addonId: null,
35945
+ access: "create"
35946
+ },
35744
35947
  "terminalSession.writeInput": {
35745
35948
  capName: "terminal-session",
35746
35949
  capScope: "system",
@@ -38228,6 +38431,35 @@ Object.freeze(Object.fromEntries([{
38228
38431
  }]
38229
38432
  }].map((s) => [s.stepId, s.defaultModelId])));
38230
38433
  string().min(1);
38434
+ var CLUSTER_STEP_SETTING_FIELDS = [{
38435
+ stepId: "face-embedding",
38436
+ key: "minLandmarkFaceSize",
38437
+ label: "Min face size for recognition (detection px)",
38438
+ 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.",
38439
+ type: "slider",
38440
+ min: 0,
38441
+ max: 64,
38442
+ step: 2,
38443
+ default: 24
38444
+ }];
38445
+ function clusterStepSettingKey(stepId, fieldKey) {
38446
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
38447
+ }
38448
+ var ClusterSettingNumberSchema = number().finite();
38449
+ function readClusterStepSettings(config) {
38450
+ const out = {};
38451
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
38452
+ const parsed = ClusterSettingNumberSchema.safeParse(config[clusterStepSettingKey(field.stepId, field.key)]);
38453
+ const value = parsed.success ? parsed.data : field.default;
38454
+ const existing = out[field.stepId] ?? {};
38455
+ out[field.stepId] = {
38456
+ ...existing,
38457
+ [field.key]: value
38458
+ };
38459
+ }
38460
+ return out;
38461
+ }
38462
+ readClusterStepSettings({});
38231
38463
  object({
38232
38464
  /**
38233
38465
  * 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-reolink",
3
- "version": "1.2.48",
3
+ "version": "1.2.49",
4
4
  "description": "Reolink camera device provider addon for CamStack — native Baichuan protocol",
5
5
  "keywords": [
6
6
  "camstack",