@camstack/addon-export-alexa 1.2.32 → 1.2.33

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.
@@ -8242,6 +8242,15 @@ var LabelDefinitionSchema = object({
8242
8242
  description: string().optional(),
8243
8243
  icon: string().optional()
8244
8244
  });
8245
+ var ClassMapDefinitionSchema = object({
8246
+ mapping: record(string(), _enum([
8247
+ "person",
8248
+ "vehicle",
8249
+ "animal",
8250
+ "package"
8251
+ ])),
8252
+ preserveOriginal: boolean()
8253
+ });
8245
8254
  var MODEL_FORMATS = [
8246
8255
  "onnx",
8247
8256
  "coreml",
@@ -8420,7 +8429,13 @@ var ModelCatalogEntrySchema = object({
8420
8429
  * `id` stays the source of truth for resolution/download/persistence; grouping
8421
8430
  * is a presentation overlay resolved back to an `id`.
8422
8431
  */
8423
- group: ModelVariantGroupSchema.optional()
8432
+ group: ModelVariantGroupSchema.optional(),
8433
+ /**
8434
+ * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
8435
+ * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8436
+ * labels already ARE the CamStack macros (Scrypted identity map).
8437
+ */
8438
+ classMap: ClassMapDefinitionSchema.optional()
8424
8439
  });
8425
8440
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8426
8441
  format: literal("openvino"),
@@ -8449,7 +8464,8 @@ var ModelConvertMetadataSchema = object({
8449
8464
  "ocr",
8450
8465
  "segmentation"
8451
8466
  ]),
8452
- faceAlignment: boolean().optional()
8467
+ faceAlignment: boolean().optional(),
8468
+ classMap: ClassMapDefinitionSchema.optional()
8453
8469
  });
8454
8470
  var ConvertResultSchema = object({
8455
8471
  entry: ModelCatalogEntrySchema,
@@ -17519,6 +17535,33 @@ var NativeCropRefSchema = object({
17519
17535
  h: number()
17520
17536
  })
17521
17537
  });
17538
+ object({
17539
+ crop: object({
17540
+ left: number(),
17541
+ top: number(),
17542
+ width: number().positive(),
17543
+ height: number().positive()
17544
+ }).optional(),
17545
+ content: object({
17546
+ width: number().int().positive(),
17547
+ height: number().int().positive()
17548
+ }),
17549
+ fit: _enum(["stretch", "contain"]),
17550
+ format: _enum([
17551
+ "rgb",
17552
+ "gray",
17553
+ "jpeg"
17554
+ ])
17555
+ });
17556
+ var FrameRefSchema = object({
17557
+ registryId: string().min(1),
17558
+ id: string().min(1),
17559
+ width: number().int().positive(),
17560
+ height: number().int().positive(),
17561
+ format: _enum(["rgb", "gray"]),
17562
+ timestamp: number(),
17563
+ capturedAt: number().optional()
17564
+ });
17522
17565
  var ModelFormatSchema$1 = _enum([
17523
17566
  "onnx",
17524
17567
  "coreml",
@@ -17763,6 +17806,12 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
17763
17806
  steps: array(PipelineStepInputSchema).min(1),
17764
17807
  frame: FrameInputSchema.optional(),
17765
17808
  /**
17809
+ * Process-local lazy frame. Valid only when caller and provider resolve
17810
+ * in the same execution-group process; split/cross-node callers use
17811
+ * `frame`/`image` inline compatibility instead.
17812
+ */
17813
+ frameRef: FrameRefSchema.optional(),
17814
+ /**
17766
17815
  * CB5 shm passthrough — a `FrameHandle` naming the same ring slot
17767
17816
  * the decoded pixels live in. One more member of the one-of
17768
17817
  * frame/frameHandle/image/imageBase64/referenceImage group.
@@ -18018,7 +18067,10 @@ var NativeCropResultSchema = object({
18018
18067
  * Which source served this crop, so a quality-sensitive consumer (the native
18019
18068
  * `keyFrame`) can reject a degraded fallback:
18020
18069
  * - `native` — cut from the decode worker's retained NATIVE surface (the
18021
- * quality path).
18070
+ * quality path). A subject-tile serve is also native-resolution and stays
18071
+ * `native` here: the public enum cannot name `tile` without a breaking cap
18072
+ * change. Runner telemetry distinguishes lease vs tile via `source` on the
18073
+ * internal crop result (`nativeHits` vs `tileHits`).
18022
18074
  * - `ram-fullframe` — the native surface MISSED but the request was full-frame,
18023
18075
  * so the ≤640 RAM `RetainedFrameStore` served it (honest lower-res; legit for
18024
18076
  * the blank-frame guard / 640-snapshot resolve, NOT for the clean keyFrame).
@@ -18509,12 +18561,41 @@ var RunnerLocalLoadSchema = object({
18509
18561
  * legacy `OrchestratorMetricsSchema` shape so existing dashboards keep
18510
18562
  * working unchanged when they switch to reading from the runner cap.
18511
18563
  */
18564
+ var FrameLazyCountersSchema = object({
18565
+ framesDecoded: number(),
18566
+ framesAdmitted: number(),
18567
+ framesDroppedPixelFree: number(),
18568
+ viewsMaterialized: number(),
18569
+ viewsSkipped: number(),
18570
+ workerToRunnerBytes: number(),
18571
+ runnerToPoolRawBytes: number(),
18572
+ runnerToPoolJpegBytes: number(),
18573
+ onDemandFullFrameRequests: number(),
18574
+ onDemandCropRequests: number(),
18575
+ nativeHits: number(),
18576
+ nativeMisses: number(),
18577
+ tileHits: number(),
18578
+ tileMisses: number(),
18579
+ fallbackHits: number(),
18580
+ fallbackMisses: number(),
18581
+ retainedWritesAvoided: number(),
18582
+ residentRefs: number(),
18583
+ residentBytes: number(),
18584
+ releases: number(),
18585
+ evictions: number(),
18586
+ staleMisses: number()
18587
+ });
18588
+ var FrameLazyMetricsSchema = object({
18589
+ node: FrameLazyCountersSchema,
18590
+ cameras: array(FrameLazyCountersSchema.extend({ deviceId: number() }))
18591
+ });
18512
18592
  var RunnerLocalMetricsSchema = object({
18513
18593
  nodeId: string(),
18514
18594
  activeCameras: number(),
18515
18595
  throttledCameras: number(),
18516
18596
  avgInferenceTimeMs: number(),
18517
- queueDepth: number()
18597
+ queueDepth: number(),
18598
+ frameLazy: FrameLazyMetricsSchema.optional()
18518
18599
  });
18519
18600
  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({
18520
18601
  handle: FrameHandleSchema,
@@ -19814,6 +19895,9 @@ method(_void(), ProviderInfoSchema), method(object({ config: record(string(), un
19814
19895
  location: StorageLocationSchema,
19815
19896
  relativePath: string()
19816
19897
  }), _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" });
19898
+ /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
19899
+ var ProfileSettingsSchemaBridge = unknown().nullable();
19900
+ var ProfileSettingsBagSchema = record(string(), unknown());
19817
19901
  /**
19818
19902
  * A live terminal session hosted by the provider addon. Output and input do
19819
19903
  * NOT flow through the capability — they use the addon data plane
@@ -19843,7 +19927,14 @@ var TerminalSessionInfoSchema = object({
19843
19927
  var TerminalProfileInfoSchema = object({
19844
19928
  profileId: string(),
19845
19929
  label: string(),
19846
- description: string().optional()
19930
+ description: string().optional(),
19931
+ /** Spawn defaults the instance form copies on create. */
19932
+ executable: string().optional(),
19933
+ args: array(string()).readonly().optional(),
19934
+ cwd: string().optional(),
19935
+ environment: array(string()).readonly().optional(),
19936
+ /** ConfigUISchema for instance knobs, or null when the profile has none. */
19937
+ settingsSchema: ProfileSettingsSchemaBridge.optional()
19847
19938
  });
19848
19939
  /**
19849
19940
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -19856,7 +19947,12 @@ var TerminalInstanceInfoSchema = object({
19856
19947
  profileId: string(),
19857
19948
  profileLabel: string(),
19858
19949
  name: string(),
19859
- enabled: boolean()
19950
+ enabled: boolean(),
19951
+ executable: string(),
19952
+ args: array(string()).readonly(),
19953
+ cwd: string(),
19954
+ environment: array(string()).readonly(),
19955
+ profileSettings: ProfileSettingsBagSchema
19860
19956
  });
19861
19957
  var TerminalLegacyCameraSchema = object({
19862
19958
  stableId: string(),
@@ -19886,7 +19982,23 @@ var TerminalOutputBatchSchema = object({
19886
19982
  method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }), method(_void(), array(TerminalInstanceInfoSchema).readonly(), { auth: "admin" }), method(object({
19887
19983
  targetNodeId: string().min(1),
19888
19984
  profileId: string().min(1),
19889
- name: string().trim().min(1).max(160).optional()
19985
+ name: string().trim().min(1).max(160).optional(),
19986
+ executable: string().max(1024).optional(),
19987
+ args: array(string().max(2048)).max(64).optional(),
19988
+ cwd: string().max(1024).optional(),
19989
+ environment: array(string().max(4096)).max(64).optional(),
19990
+ profileSettings: ProfileSettingsBagSchema.optional()
19991
+ }), TerminalInstanceInfoSchema, {
19992
+ kind: "mutation",
19993
+ auth: "admin"
19994
+ }), method(object({
19995
+ instanceId: string().min(1),
19996
+ name: string().trim().min(1).max(160).optional(),
19997
+ executable: string().max(1024).optional(),
19998
+ args: array(string().max(2048)).max(64).optional(),
19999
+ cwd: string().max(1024).optional(),
20000
+ environment: array(string().max(4096)).max(64).optional(),
20001
+ profileSettings: ProfileSettingsBagSchema.optional()
19890
20002
  }), TerminalInstanceInfoSchema, {
19891
20003
  kind: "mutation",
19892
20004
  auth: "admin"
@@ -19908,7 +20020,11 @@ method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }),
19908
20020
  }), method(_void(), array(TerminalSessionInfoSchema).readonly(), { auth: "admin" }), method(object({
19909
20021
  profileId: string(),
19910
20022
  cols: number().int().positive(),
19911
- rows: number().int().positive()
20023
+ rows: number().int().positive(),
20024
+ executable: string().max(1024).optional(),
20025
+ args: array(string().max(2048)).max(64).optional(),
20026
+ cwd: string().max(1024).optional(),
20027
+ environment: array(string().max(4096)).max(64).optional()
19912
20028
  }), TerminalSessionInfoSchema, {
19913
20029
  kind: "mutation",
19914
20030
  auth: "admin"
@@ -22690,10 +22806,10 @@ DeviceType.LawnMower, method(object({ deviceId: number().int().nonnegative() }),
22690
22806
  *
22691
22807
  * • The SDK (mobile / web client) consumes `getConnectionEndpoints()`
22692
22808
  * to receive an ordered list of candidate base URLs it should race
22693
- * on connect — LAN IPv4 first (lowest latency when on same network),
22694
- * then public hostname (if a tunnel is up), then IPv6. The SDK can
22695
- * race them with short timeouts and stick with the winner for the
22696
- * session.
22809
+ * on connect — LAN IPv4 and stable LAN IPv6 first (lowest latency
22810
+ * when on the same network), then public hostname (if a tunnel is
22811
+ * up). The SDK can race them with short timeouts and stick with the
22812
+ * winner for the session.
22697
22813
  *
22698
22814
  * Why hub-only: agents are not directly addressable by the operator's
22699
22815
  * clients — they reverse-connect to the hub. Exposing their interfaces
@@ -22848,6 +22964,17 @@ var NotificationEndpointSchema = object({
22848
22964
  /** What the ranking currently resolves to (null when nothing is reachable). */
22849
22965
  resolved: string().nullable()
22850
22966
  });
22967
+ /**
22968
+ * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
22969
+ * AUTO (every LAN IPv4 + the public tunnel). `resolved` is what that choice
22970
+ * currently expands to, so the UI can show the effective set either way.
22971
+ */
22972
+ var ViewerEndpointsSchema = object({
22973
+ /** The operator's explicit race set, or empty for AUTO. */
22974
+ baseUrls: array(string()).readonly(),
22975
+ /** What the ranking currently resolves to (may be empty if nothing is up). */
22976
+ resolved: array(string()).readonly()
22977
+ });
22851
22978
  var AllowedAddressesSchema = object({
22852
22979
  /**
22853
22980
  * Allowlist of interface addresses operators have explicitly opted
@@ -22856,6 +22983,20 @@ var AllowedAddressesSchema = object({
22856
22983
  * Network Addresses admin page and persisted by the addon.
22857
22984
  */
22858
22985
  addresses: array(string()).readonly() });
22986
+ var TlsStatusSchema = object({
22987
+ mode: _enum([
22988
+ "generated",
22989
+ "uploaded",
22990
+ "disabled"
22991
+ ]),
22992
+ leafFingerprintSha256: string().nullable(),
22993
+ caFingerprintSha256: string().nullable(),
22994
+ validTo: string().nullable(),
22995
+ sans: array(string()),
22996
+ caCertPem: string().nullable(),
22997
+ reissueError: string().nullable(),
22998
+ restartRequired: boolean()
22999
+ });
22859
23000
  method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
22860
23001
  /**
22861
23002
  * LEGACY HINT — do not send from new code. Kept optional so clients
@@ -22865,17 +23006,31 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
22865
23006
  */
22866
23007
  port: number().int().min(1).max(65535).optional(),
22867
23008
  /** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
22868
- * candidate. Default `true`. */
23009
+ * candidate. Default `false` — loopback is not a client route. */
22869
23010
  includeLoopback: boolean().optional(),
22870
- /** Skip IPv6 entries. Some legacy clients can't parse them.
22871
- * Default `false`. */
23011
+ /** Skip IPv6 entries. Default `false` the palette includes stable
23012
+ * LAN IPv6 (ICE/WebRTC uses dual-stack regardless). Pass `true` to
23013
+ * hide them. The viewer HTTP/WS race is `getViewerEndpoints`. */
22872
23014
  ipv4Only: boolean().optional(),
22873
23015
  /** Scheme to emit for LAN/loopback URLs. Default `'http'`.
22874
23016
  * Pass `'https'` when the caller is itself loaded over HTTPS
22875
23017
  * to avoid mixed-content blocks in the browser. The public
22876
23018
  * tunnel always emits `https://` regardless. */
22877
23019
  scheme: _enum(["http", "https"]).optional()
22878
- }), 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" });
23020
+ }), 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, {
23021
+ kind: "mutation",
23022
+ auth: "admin"
23023
+ }), method(object({
23024
+ certPem: string().min(1),
23025
+ keyPem: string().min(1),
23026
+ caPem: string().optional()
23027
+ }), TlsStatusSchema, {
23028
+ kind: "mutation",
23029
+ auth: "admin"
23030
+ }), method(_void(), object({ pem: string() })), method(_void(), TlsStatusSchema, {
23031
+ kind: "mutation",
23032
+ auth: "admin"
23033
+ });
22879
23034
  object({
22880
23035
  /** Lifecycle state of the lock. `jammed` means the motor reported
22881
23036
  * failure to reach the target — operator intervention required. */
@@ -28638,6 +28793,12 @@ Object.freeze({
28638
28793
  addonId: null,
28639
28794
  access: "create"
28640
28795
  },
28796
+ "localNetwork.downloadCa": {
28797
+ capName: "local-network",
28798
+ capScope: "system",
28799
+ addonId: null,
28800
+ access: "view"
28801
+ },
28641
28802
  "localNetwork.getAllowedAddresses": {
28642
28803
  capName: "local-network",
28643
28804
  capScope: "system",
@@ -28662,18 +28823,42 @@ Object.freeze({
28662
28823
  addonId: null,
28663
28824
  access: "view"
28664
28825
  },
28826
+ "localNetwork.getTlsStatus": {
28827
+ capName: "local-network",
28828
+ capScope: "system",
28829
+ addonId: null,
28830
+ access: "view"
28831
+ },
28832
+ "localNetwork.getViewerEndpoints": {
28833
+ capName: "local-network",
28834
+ capScope: "system",
28835
+ addonId: null,
28836
+ access: "view"
28837
+ },
28665
28838
  "localNetwork.list": {
28666
28839
  capName: "local-network",
28667
28840
  capScope: "system",
28668
28841
  addonId: null,
28669
28842
  access: "view"
28670
28843
  },
28844
+ "localNetwork.regenerateCertificate": {
28845
+ capName: "local-network",
28846
+ capScope: "system",
28847
+ addonId: null,
28848
+ access: "create"
28849
+ },
28671
28850
  "localNetwork.resetAllowlistToBestMatch": {
28672
28851
  capName: "local-network",
28673
28852
  capScope: "system",
28674
28853
  addonId: null,
28675
28854
  access: "delete"
28676
28855
  },
28856
+ "localNetwork.revertToGeneratedCertificate": {
28857
+ capName: "local-network",
28858
+ capScope: "system",
28859
+ addonId: null,
28860
+ access: "create"
28861
+ },
28677
28862
  "localNetwork.setAllowedAddresses": {
28678
28863
  capName: "local-network",
28679
28864
  capScope: "system",
@@ -28686,6 +28871,18 @@ Object.freeze({
28686
28871
  addonId: null,
28687
28872
  access: "create"
28688
28873
  },
28874
+ "localNetwork.setViewerEndpoints": {
28875
+ capName: "local-network",
28876
+ capScope: "system",
28877
+ addonId: null,
28878
+ access: "create"
28879
+ },
28880
+ "localNetwork.uploadCertificate": {
28881
+ capName: "local-network",
28882
+ capScope: "system",
28883
+ addonId: null,
28884
+ access: "create"
28885
+ },
28689
28886
  "lockControl.lock": {
28690
28887
  capName: "lock-control",
28691
28888
  capScope: "device",
@@ -31566,6 +31763,12 @@ Object.freeze({
31566
31763
  addonId: null,
31567
31764
  access: "create"
31568
31765
  },
31766
+ "terminalSession.updateInstance": {
31767
+ capName: "terminal-session",
31768
+ capScope: "system",
31769
+ addonId: null,
31770
+ access: "create"
31771
+ },
31569
31772
  "terminalSession.writeInput": {
31570
31773
  capName: "terminal-session",
31571
31774
  capScope: "system",
@@ -34053,6 +34256,35 @@ Object.freeze(Object.fromEntries([{
34053
34256
  }]
34054
34257
  }].map((s) => [s.stepId, s.defaultModelId])));
34055
34258
  string().min(1);
34259
+ var CLUSTER_STEP_SETTING_FIELDS = [{
34260
+ stepId: "face-embedding",
34261
+ key: "minLandmarkFaceSize",
34262
+ label: "Min face size for recognition (detection px)",
34263
+ 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.",
34264
+ type: "slider",
34265
+ min: 0,
34266
+ max: 64,
34267
+ step: 2,
34268
+ default: 24
34269
+ }];
34270
+ function clusterStepSettingKey(stepId, fieldKey) {
34271
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
34272
+ }
34273
+ var ClusterSettingNumberSchema = number().finite();
34274
+ function readClusterStepSettings(config) {
34275
+ const out = {};
34276
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
34277
+ const parsed = ClusterSettingNumberSchema.safeParse(config[clusterStepSettingKey(field.stepId, field.key)]);
34278
+ const value = parsed.success ? parsed.data : field.default;
34279
+ const existing = out[field.stepId] ?? {};
34280
+ out[field.stepId] = {
34281
+ ...existing,
34282
+ [field.key]: value
34283
+ };
34284
+ }
34285
+ return out;
34286
+ }
34287
+ readClusterStepSettings({});
34056
34288
  object({
34057
34289
  /**
34058
34290
  * Fraction of the box's own size added on EACH side before cutting.
@@ -8215,6 +8215,15 @@ var LabelDefinitionSchema = object({
8215
8215
  description: string().optional(),
8216
8216
  icon: string().optional()
8217
8217
  });
8218
+ var ClassMapDefinitionSchema = object({
8219
+ mapping: record(string(), _enum([
8220
+ "person",
8221
+ "vehicle",
8222
+ "animal",
8223
+ "package"
8224
+ ])),
8225
+ preserveOriginal: boolean()
8226
+ });
8218
8227
  var MODEL_FORMATS = [
8219
8228
  "onnx",
8220
8229
  "coreml",
@@ -8393,7 +8402,13 @@ var ModelCatalogEntrySchema = object({
8393
8402
  * `id` stays the source of truth for resolution/download/persistence; grouping
8394
8403
  * is a presentation overlay resolved back to an `id`.
8395
8404
  */
8396
- group: ModelVariantGroupSchema.optional()
8405
+ group: ModelVariantGroupSchema.optional(),
8406
+ /**
8407
+ * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
8408
+ * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8409
+ * labels already ARE the CamStack macros (Scrypted identity map).
8410
+ */
8411
+ classMap: ClassMapDefinitionSchema.optional()
8397
8412
  });
8398
8413
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8399
8414
  format: literal("openvino"),
@@ -8422,7 +8437,8 @@ var ModelConvertMetadataSchema = object({
8422
8437
  "ocr",
8423
8438
  "segmentation"
8424
8439
  ]),
8425
- faceAlignment: boolean().optional()
8440
+ faceAlignment: boolean().optional(),
8441
+ classMap: ClassMapDefinitionSchema.optional()
8426
8442
  });
8427
8443
  var ConvertResultSchema = object({
8428
8444
  entry: ModelCatalogEntrySchema,
@@ -17492,6 +17508,33 @@ var NativeCropRefSchema = object({
17492
17508
  h: number()
17493
17509
  })
17494
17510
  });
17511
+ object({
17512
+ crop: object({
17513
+ left: number(),
17514
+ top: number(),
17515
+ width: number().positive(),
17516
+ height: number().positive()
17517
+ }).optional(),
17518
+ content: object({
17519
+ width: number().int().positive(),
17520
+ height: number().int().positive()
17521
+ }),
17522
+ fit: _enum(["stretch", "contain"]),
17523
+ format: _enum([
17524
+ "rgb",
17525
+ "gray",
17526
+ "jpeg"
17527
+ ])
17528
+ });
17529
+ var FrameRefSchema = object({
17530
+ registryId: string().min(1),
17531
+ id: string().min(1),
17532
+ width: number().int().positive(),
17533
+ height: number().int().positive(),
17534
+ format: _enum(["rgb", "gray"]),
17535
+ timestamp: number(),
17536
+ capturedAt: number().optional()
17537
+ });
17495
17538
  var ModelFormatSchema$1 = _enum([
17496
17539
  "onnx",
17497
17540
  "coreml",
@@ -17736,6 +17779,12 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
17736
17779
  steps: array(PipelineStepInputSchema).min(1),
17737
17780
  frame: FrameInputSchema.optional(),
17738
17781
  /**
17782
+ * Process-local lazy frame. Valid only when caller and provider resolve
17783
+ * in the same execution-group process; split/cross-node callers use
17784
+ * `frame`/`image` inline compatibility instead.
17785
+ */
17786
+ frameRef: FrameRefSchema.optional(),
17787
+ /**
17739
17788
  * CB5 shm passthrough — a `FrameHandle` naming the same ring slot
17740
17789
  * the decoded pixels live in. One more member of the one-of
17741
17790
  * frame/frameHandle/image/imageBase64/referenceImage group.
@@ -17991,7 +18040,10 @@ var NativeCropResultSchema = object({
17991
18040
  * Which source served this crop, so a quality-sensitive consumer (the native
17992
18041
  * `keyFrame`) can reject a degraded fallback:
17993
18042
  * - `native` — cut from the decode worker's retained NATIVE surface (the
17994
- * quality path).
18043
+ * quality path). A subject-tile serve is also native-resolution and stays
18044
+ * `native` here: the public enum cannot name `tile` without a breaking cap
18045
+ * change. Runner telemetry distinguishes lease vs tile via `source` on the
18046
+ * internal crop result (`nativeHits` vs `tileHits`).
17995
18047
  * - `ram-fullframe` — the native surface MISSED but the request was full-frame,
17996
18048
  * so the ≤640 RAM `RetainedFrameStore` served it (honest lower-res; legit for
17997
18049
  * the blank-frame guard / 640-snapshot resolve, NOT for the clean keyFrame).
@@ -18482,12 +18534,41 @@ var RunnerLocalLoadSchema = object({
18482
18534
  * legacy `OrchestratorMetricsSchema` shape so existing dashboards keep
18483
18535
  * working unchanged when they switch to reading from the runner cap.
18484
18536
  */
18537
+ var FrameLazyCountersSchema = object({
18538
+ framesDecoded: number(),
18539
+ framesAdmitted: number(),
18540
+ framesDroppedPixelFree: number(),
18541
+ viewsMaterialized: number(),
18542
+ viewsSkipped: number(),
18543
+ workerToRunnerBytes: number(),
18544
+ runnerToPoolRawBytes: number(),
18545
+ runnerToPoolJpegBytes: number(),
18546
+ onDemandFullFrameRequests: number(),
18547
+ onDemandCropRequests: number(),
18548
+ nativeHits: number(),
18549
+ nativeMisses: number(),
18550
+ tileHits: number(),
18551
+ tileMisses: number(),
18552
+ fallbackHits: number(),
18553
+ fallbackMisses: number(),
18554
+ retainedWritesAvoided: number(),
18555
+ residentRefs: number(),
18556
+ residentBytes: number(),
18557
+ releases: number(),
18558
+ evictions: number(),
18559
+ staleMisses: number()
18560
+ });
18561
+ var FrameLazyMetricsSchema = object({
18562
+ node: FrameLazyCountersSchema,
18563
+ cameras: array(FrameLazyCountersSchema.extend({ deviceId: number() }))
18564
+ });
18485
18565
  var RunnerLocalMetricsSchema = object({
18486
18566
  nodeId: string(),
18487
18567
  activeCameras: number(),
18488
18568
  throttledCameras: number(),
18489
18569
  avgInferenceTimeMs: number(),
18490
- queueDepth: number()
18570
+ queueDepth: number(),
18571
+ frameLazy: FrameLazyMetricsSchema.optional()
18491
18572
  });
18492
18573
  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({
18493
18574
  handle: FrameHandleSchema,
@@ -19787,6 +19868,9 @@ method(_void(), ProviderInfoSchema), method(object({ config: record(string(), un
19787
19868
  location: StorageLocationSchema,
19788
19869
  relativePath: string()
19789
19870
  }), _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" });
19871
+ /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
19872
+ var ProfileSettingsSchemaBridge = unknown().nullable();
19873
+ var ProfileSettingsBagSchema = record(string(), unknown());
19790
19874
  /**
19791
19875
  * A live terminal session hosted by the provider addon. Output and input do
19792
19876
  * NOT flow through the capability — they use the addon data plane
@@ -19816,7 +19900,14 @@ var TerminalSessionInfoSchema = object({
19816
19900
  var TerminalProfileInfoSchema = object({
19817
19901
  profileId: string(),
19818
19902
  label: string(),
19819
- description: string().optional()
19903
+ description: string().optional(),
19904
+ /** Spawn defaults the instance form copies on create. */
19905
+ executable: string().optional(),
19906
+ args: array(string()).readonly().optional(),
19907
+ cwd: string().optional(),
19908
+ environment: array(string()).readonly().optional(),
19909
+ /** ConfigUISchema for instance knobs, or null when the profile has none. */
19910
+ settingsSchema: ProfileSettingsSchemaBridge.optional()
19820
19911
  });
19821
19912
  /**
19822
19913
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -19829,7 +19920,12 @@ var TerminalInstanceInfoSchema = object({
19829
19920
  profileId: string(),
19830
19921
  profileLabel: string(),
19831
19922
  name: string(),
19832
- enabled: boolean()
19923
+ enabled: boolean(),
19924
+ executable: string(),
19925
+ args: array(string()).readonly(),
19926
+ cwd: string(),
19927
+ environment: array(string()).readonly(),
19928
+ profileSettings: ProfileSettingsBagSchema
19833
19929
  });
19834
19930
  var TerminalLegacyCameraSchema = object({
19835
19931
  stableId: string(),
@@ -19859,7 +19955,23 @@ var TerminalOutputBatchSchema = object({
19859
19955
  method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }), method(_void(), array(TerminalInstanceInfoSchema).readonly(), { auth: "admin" }), method(object({
19860
19956
  targetNodeId: string().min(1),
19861
19957
  profileId: string().min(1),
19862
- name: string().trim().min(1).max(160).optional()
19958
+ name: string().trim().min(1).max(160).optional(),
19959
+ executable: string().max(1024).optional(),
19960
+ args: array(string().max(2048)).max(64).optional(),
19961
+ cwd: string().max(1024).optional(),
19962
+ environment: array(string().max(4096)).max(64).optional(),
19963
+ profileSettings: ProfileSettingsBagSchema.optional()
19964
+ }), TerminalInstanceInfoSchema, {
19965
+ kind: "mutation",
19966
+ auth: "admin"
19967
+ }), method(object({
19968
+ instanceId: string().min(1),
19969
+ name: string().trim().min(1).max(160).optional(),
19970
+ executable: string().max(1024).optional(),
19971
+ args: array(string().max(2048)).max(64).optional(),
19972
+ cwd: string().max(1024).optional(),
19973
+ environment: array(string().max(4096)).max(64).optional(),
19974
+ profileSettings: ProfileSettingsBagSchema.optional()
19863
19975
  }), TerminalInstanceInfoSchema, {
19864
19976
  kind: "mutation",
19865
19977
  auth: "admin"
@@ -19881,7 +19993,11 @@ method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }),
19881
19993
  }), method(_void(), array(TerminalSessionInfoSchema).readonly(), { auth: "admin" }), method(object({
19882
19994
  profileId: string(),
19883
19995
  cols: number().int().positive(),
19884
- rows: number().int().positive()
19996
+ rows: number().int().positive(),
19997
+ executable: string().max(1024).optional(),
19998
+ args: array(string().max(2048)).max(64).optional(),
19999
+ cwd: string().max(1024).optional(),
20000
+ environment: array(string().max(4096)).max(64).optional()
19885
20001
  }), TerminalSessionInfoSchema, {
19886
20002
  kind: "mutation",
19887
20003
  auth: "admin"
@@ -22663,10 +22779,10 @@ DeviceType.LawnMower, method(object({ deviceId: number().int().nonnegative() }),
22663
22779
  *
22664
22780
  * • The SDK (mobile / web client) consumes `getConnectionEndpoints()`
22665
22781
  * to receive an ordered list of candidate base URLs it should race
22666
- * on connect — LAN IPv4 first (lowest latency when on same network),
22667
- * then public hostname (if a tunnel is up), then IPv6. The SDK can
22668
- * race them with short timeouts and stick with the winner for the
22669
- * session.
22782
+ * on connect — LAN IPv4 and stable LAN IPv6 first (lowest latency
22783
+ * when on the same network), then public hostname (if a tunnel is
22784
+ * up). The SDK can race them with short timeouts and stick with the
22785
+ * winner for the session.
22670
22786
  *
22671
22787
  * Why hub-only: agents are not directly addressable by the operator's
22672
22788
  * clients — they reverse-connect to the hub. Exposing their interfaces
@@ -22821,6 +22937,17 @@ var NotificationEndpointSchema = object({
22821
22937
  /** What the ranking currently resolves to (null when nothing is reachable). */
22822
22938
  resolved: string().nullable()
22823
22939
  });
22940
+ /**
22941
+ * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
22942
+ * AUTO (every LAN IPv4 + the public tunnel). `resolved` is what that choice
22943
+ * currently expands to, so the UI can show the effective set either way.
22944
+ */
22945
+ var ViewerEndpointsSchema = object({
22946
+ /** The operator's explicit race set, or empty for AUTO. */
22947
+ baseUrls: array(string()).readonly(),
22948
+ /** What the ranking currently resolves to (may be empty if nothing is up). */
22949
+ resolved: array(string()).readonly()
22950
+ });
22824
22951
  var AllowedAddressesSchema = object({
22825
22952
  /**
22826
22953
  * Allowlist of interface addresses operators have explicitly opted
@@ -22829,6 +22956,20 @@ var AllowedAddressesSchema = object({
22829
22956
  * Network Addresses admin page and persisted by the addon.
22830
22957
  */
22831
22958
  addresses: array(string()).readonly() });
22959
+ var TlsStatusSchema = object({
22960
+ mode: _enum([
22961
+ "generated",
22962
+ "uploaded",
22963
+ "disabled"
22964
+ ]),
22965
+ leafFingerprintSha256: string().nullable(),
22966
+ caFingerprintSha256: string().nullable(),
22967
+ validTo: string().nullable(),
22968
+ sans: array(string()),
22969
+ caCertPem: string().nullable(),
22970
+ reissueError: string().nullable(),
22971
+ restartRequired: boolean()
22972
+ });
22832
22973
  method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
22833
22974
  /**
22834
22975
  * LEGACY HINT — do not send from new code. Kept optional so clients
@@ -22838,17 +22979,31 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
22838
22979
  */
22839
22980
  port: number().int().min(1).max(65535).optional(),
22840
22981
  /** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
22841
- * candidate. Default `true`. */
22982
+ * candidate. Default `false` — loopback is not a client route. */
22842
22983
  includeLoopback: boolean().optional(),
22843
- /** Skip IPv6 entries. Some legacy clients can't parse them.
22844
- * Default `false`. */
22984
+ /** Skip IPv6 entries. Default `false` the palette includes stable
22985
+ * LAN IPv6 (ICE/WebRTC uses dual-stack regardless). Pass `true` to
22986
+ * hide them. The viewer HTTP/WS race is `getViewerEndpoints`. */
22845
22987
  ipv4Only: boolean().optional(),
22846
22988
  /** Scheme to emit for LAN/loopback URLs. Default `'http'`.
22847
22989
  * Pass `'https'` when the caller is itself loaded over HTTPS
22848
22990
  * to avoid mixed-content blocks in the browser. The public
22849
22991
  * tunnel always emits `https://` regardless. */
22850
22992
  scheme: _enum(["http", "https"]).optional()
22851
- }), 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" });
22993
+ }), 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, {
22994
+ kind: "mutation",
22995
+ auth: "admin"
22996
+ }), method(object({
22997
+ certPem: string().min(1),
22998
+ keyPem: string().min(1),
22999
+ caPem: string().optional()
23000
+ }), TlsStatusSchema, {
23001
+ kind: "mutation",
23002
+ auth: "admin"
23003
+ }), method(_void(), object({ pem: string() })), method(_void(), TlsStatusSchema, {
23004
+ kind: "mutation",
23005
+ auth: "admin"
23006
+ });
22852
23007
  object({
22853
23008
  /** Lifecycle state of the lock. `jammed` means the motor reported
22854
23009
  * failure to reach the target — operator intervention required. */
@@ -28611,6 +28766,12 @@ Object.freeze({
28611
28766
  addonId: null,
28612
28767
  access: "create"
28613
28768
  },
28769
+ "localNetwork.downloadCa": {
28770
+ capName: "local-network",
28771
+ capScope: "system",
28772
+ addonId: null,
28773
+ access: "view"
28774
+ },
28614
28775
  "localNetwork.getAllowedAddresses": {
28615
28776
  capName: "local-network",
28616
28777
  capScope: "system",
@@ -28635,18 +28796,42 @@ Object.freeze({
28635
28796
  addonId: null,
28636
28797
  access: "view"
28637
28798
  },
28799
+ "localNetwork.getTlsStatus": {
28800
+ capName: "local-network",
28801
+ capScope: "system",
28802
+ addonId: null,
28803
+ access: "view"
28804
+ },
28805
+ "localNetwork.getViewerEndpoints": {
28806
+ capName: "local-network",
28807
+ capScope: "system",
28808
+ addonId: null,
28809
+ access: "view"
28810
+ },
28638
28811
  "localNetwork.list": {
28639
28812
  capName: "local-network",
28640
28813
  capScope: "system",
28641
28814
  addonId: null,
28642
28815
  access: "view"
28643
28816
  },
28817
+ "localNetwork.regenerateCertificate": {
28818
+ capName: "local-network",
28819
+ capScope: "system",
28820
+ addonId: null,
28821
+ access: "create"
28822
+ },
28644
28823
  "localNetwork.resetAllowlistToBestMatch": {
28645
28824
  capName: "local-network",
28646
28825
  capScope: "system",
28647
28826
  addonId: null,
28648
28827
  access: "delete"
28649
28828
  },
28829
+ "localNetwork.revertToGeneratedCertificate": {
28830
+ capName: "local-network",
28831
+ capScope: "system",
28832
+ addonId: null,
28833
+ access: "create"
28834
+ },
28650
28835
  "localNetwork.setAllowedAddresses": {
28651
28836
  capName: "local-network",
28652
28837
  capScope: "system",
@@ -28659,6 +28844,18 @@ Object.freeze({
28659
28844
  addonId: null,
28660
28845
  access: "create"
28661
28846
  },
28847
+ "localNetwork.setViewerEndpoints": {
28848
+ capName: "local-network",
28849
+ capScope: "system",
28850
+ addonId: null,
28851
+ access: "create"
28852
+ },
28853
+ "localNetwork.uploadCertificate": {
28854
+ capName: "local-network",
28855
+ capScope: "system",
28856
+ addonId: null,
28857
+ access: "create"
28858
+ },
28662
28859
  "lockControl.lock": {
28663
28860
  capName: "lock-control",
28664
28861
  capScope: "device",
@@ -31539,6 +31736,12 @@ Object.freeze({
31539
31736
  addonId: null,
31540
31737
  access: "create"
31541
31738
  },
31739
+ "terminalSession.updateInstance": {
31740
+ capName: "terminal-session",
31741
+ capScope: "system",
31742
+ addonId: null,
31743
+ access: "create"
31744
+ },
31542
31745
  "terminalSession.writeInput": {
31543
31746
  capName: "terminal-session",
31544
31747
  capScope: "system",
@@ -34026,6 +34229,35 @@ Object.freeze(Object.fromEntries([{
34026
34229
  }]
34027
34230
  }].map((s) => [s.stepId, s.defaultModelId])));
34028
34231
  string().min(1);
34232
+ var CLUSTER_STEP_SETTING_FIELDS = [{
34233
+ stepId: "face-embedding",
34234
+ key: "minLandmarkFaceSize",
34235
+ label: "Min face size for recognition (detection px)",
34236
+ 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.",
34237
+ type: "slider",
34238
+ min: 0,
34239
+ max: 64,
34240
+ step: 2,
34241
+ default: 24
34242
+ }];
34243
+ function clusterStepSettingKey(stepId, fieldKey) {
34244
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
34245
+ }
34246
+ var ClusterSettingNumberSchema = number().finite();
34247
+ function readClusterStepSettings(config) {
34248
+ const out = {};
34249
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
34250
+ const parsed = ClusterSettingNumberSchema.safeParse(config[clusterStepSettingKey(field.stepId, field.key)]);
34251
+ const value = parsed.success ? parsed.data : field.default;
34252
+ const existing = out[field.stepId] ?? {};
34253
+ out[field.stepId] = {
34254
+ ...existing,
34255
+ [field.key]: value
34256
+ };
34257
+ }
34258
+ return out;
34259
+ }
34260
+ readClusterStepSettings({});
34029
34261
  object({
34030
34262
  /**
34031
34263
  * 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-export-alexa",
3
- "version": "1.2.32",
3
+ "version": "1.2.33",
4
4
  "description": "Alexa Smart Home Skill export — hub-side OAuth provider + directive handler. The companion AWS Lambda forwards Alexa directives to this addon's /addon/export-alexa/directive endpoint.",
5
5
  "keywords": [
6
6
  "camstack",