@camstack/addon-import-alexa 0.2.25 → 0.2.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -8178,6 +8178,15 @@ var LabelDefinitionSchema = object({
8178
8178
  description: string().optional(),
8179
8179
  icon: string().optional()
8180
8180
  });
8181
+ var ClassMapDefinitionSchema = object({
8182
+ mapping: record(string(), _enum([
8183
+ "person",
8184
+ "vehicle",
8185
+ "animal",
8186
+ "package"
8187
+ ])),
8188
+ preserveOriginal: boolean()
8189
+ });
8181
8190
  var MODEL_FORMATS = [
8182
8191
  "onnx",
8183
8192
  "coreml",
@@ -8356,7 +8365,13 @@ var ModelCatalogEntrySchema = object({
8356
8365
  * `id` stays the source of truth for resolution/download/persistence; grouping
8357
8366
  * is a presentation overlay resolved back to an `id`.
8358
8367
  */
8359
- group: ModelVariantGroupSchema.optional()
8368
+ group: ModelVariantGroupSchema.optional(),
8369
+ /**
8370
+ * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
8371
+ * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8372
+ * labels already ARE the CamStack macros (Scrypted identity map).
8373
+ */
8374
+ classMap: ClassMapDefinitionSchema.optional()
8360
8375
  });
8361
8376
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8362
8377
  format: literal("openvino"),
@@ -8385,7 +8400,8 @@ var ModelConvertMetadataSchema = object({
8385
8400
  "ocr",
8386
8401
  "segmentation"
8387
8402
  ]),
8388
- faceAlignment: boolean().optional()
8403
+ faceAlignment: boolean().optional(),
8404
+ classMap: ClassMapDefinitionSchema.optional()
8389
8405
  });
8390
8406
  var ConvertResultSchema = object({
8391
8407
  entry: ModelCatalogEntrySchema,
@@ -17763,6 +17779,33 @@ var NativeCropRefSchema = object({
17763
17779
  h: number()
17764
17780
  })
17765
17781
  });
17782
+ object({
17783
+ crop: object({
17784
+ left: number(),
17785
+ top: number(),
17786
+ width: number().positive(),
17787
+ height: number().positive()
17788
+ }).optional(),
17789
+ content: object({
17790
+ width: number().int().positive(),
17791
+ height: number().int().positive()
17792
+ }),
17793
+ fit: _enum(["stretch", "contain"]),
17794
+ format: _enum([
17795
+ "rgb",
17796
+ "gray",
17797
+ "jpeg"
17798
+ ])
17799
+ });
17800
+ var FrameRefSchema = object({
17801
+ registryId: string().min(1),
17802
+ id: string().min(1),
17803
+ width: number().int().positive(),
17804
+ height: number().int().positive(),
17805
+ format: _enum(["rgb", "gray"]),
17806
+ timestamp: number(),
17807
+ capturedAt: number().optional()
17808
+ });
17766
17809
  var ModelFormatSchema$1 = _enum([
17767
17810
  "onnx",
17768
17811
  "coreml",
@@ -18007,6 +18050,12 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
18007
18050
  steps: array(PipelineStepInputSchema).min(1),
18008
18051
  frame: FrameInputSchema.optional(),
18009
18052
  /**
18053
+ * Process-local lazy frame. Valid only when caller and provider resolve
18054
+ * in the same execution-group process; split/cross-node callers use
18055
+ * `frame`/`image` inline compatibility instead.
18056
+ */
18057
+ frameRef: FrameRefSchema.optional(),
18058
+ /**
18010
18059
  * CB5 shm passthrough — a `FrameHandle` naming the same ring slot
18011
18060
  * the decoded pixels live in. One more member of the one-of
18012
18061
  * frame/frameHandle/image/imageBase64/referenceImage group.
@@ -18302,7 +18351,10 @@ var NativeCropResultSchema = object({
18302
18351
  * Which source served this crop, so a quality-sensitive consumer (the native
18303
18352
  * `keyFrame`) can reject a degraded fallback:
18304
18353
  * - `native` — cut from the decode worker's retained NATIVE surface (the
18305
- * quality path).
18354
+ * quality path). A subject-tile serve is also native-resolution and stays
18355
+ * `native` here: the public enum cannot name `tile` without a breaking cap
18356
+ * change. Runner telemetry distinguishes lease vs tile via `source` on the
18357
+ * internal crop result (`nativeHits` vs `tileHits`).
18306
18358
  * - `ram-fullframe` — the native surface MISSED but the request was full-frame,
18307
18359
  * so the ≤640 RAM `RetainedFrameStore` served it (honest lower-res; legit for
18308
18360
  * the blank-frame guard / 640-snapshot resolve, NOT for the clean keyFrame).
@@ -18793,12 +18845,41 @@ var RunnerLocalLoadSchema = object({
18793
18845
  * legacy `OrchestratorMetricsSchema` shape so existing dashboards keep
18794
18846
  * working unchanged when they switch to reading from the runner cap.
18795
18847
  */
18848
+ var FrameLazyCountersSchema = object({
18849
+ framesDecoded: number(),
18850
+ framesAdmitted: number(),
18851
+ framesDroppedPixelFree: number(),
18852
+ viewsMaterialized: number(),
18853
+ viewsSkipped: number(),
18854
+ workerToRunnerBytes: number(),
18855
+ runnerToPoolRawBytes: number(),
18856
+ runnerToPoolJpegBytes: number(),
18857
+ onDemandFullFrameRequests: number(),
18858
+ onDemandCropRequests: number(),
18859
+ nativeHits: number(),
18860
+ nativeMisses: number(),
18861
+ tileHits: number(),
18862
+ tileMisses: number(),
18863
+ fallbackHits: number(),
18864
+ fallbackMisses: number(),
18865
+ retainedWritesAvoided: number(),
18866
+ residentRefs: number(),
18867
+ residentBytes: number(),
18868
+ releases: number(),
18869
+ evictions: number(),
18870
+ staleMisses: number()
18871
+ });
18872
+ var FrameLazyMetricsSchema = object({
18873
+ node: FrameLazyCountersSchema,
18874
+ cameras: array(FrameLazyCountersSchema.extend({ deviceId: number() }))
18875
+ });
18796
18876
  var RunnerLocalMetricsSchema = object({
18797
18877
  nodeId: string(),
18798
18878
  activeCameras: number(),
18799
18879
  throttledCameras: number(),
18800
18880
  avgInferenceTimeMs: number(),
18801
- queueDepth: number()
18881
+ queueDepth: number(),
18882
+ frameLazy: FrameLazyMetricsSchema.optional()
18802
18883
  });
18803
18884
  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({
18804
18885
  handle: FrameHandleSchema,
@@ -20098,6 +20179,9 @@ method(_void(), ProviderInfoSchema), method(object({ config: record(string(), un
20098
20179
  location: StorageLocationSchema,
20099
20180
  relativePath: string()
20100
20181
  }), _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" });
20182
+ /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
20183
+ var ProfileSettingsSchemaBridge = unknown().nullable();
20184
+ var ProfileSettingsBagSchema = record(string(), unknown());
20101
20185
  /**
20102
20186
  * A live terminal session hosted by the provider addon. Output and input do
20103
20187
  * NOT flow through the capability — they use the addon data plane
@@ -20127,7 +20211,14 @@ var TerminalSessionInfoSchema = object({
20127
20211
  var TerminalProfileInfoSchema = object({
20128
20212
  profileId: string(),
20129
20213
  label: string(),
20130
- description: string().optional()
20214
+ description: string().optional(),
20215
+ /** Spawn defaults the instance form copies on create. */
20216
+ executable: string().optional(),
20217
+ args: array(string()).readonly().optional(),
20218
+ cwd: string().optional(),
20219
+ environment: array(string()).readonly().optional(),
20220
+ /** ConfigUISchema for instance knobs, or null when the profile has none. */
20221
+ settingsSchema: ProfileSettingsSchemaBridge.optional()
20131
20222
  });
20132
20223
  /**
20133
20224
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -20140,7 +20231,12 @@ var TerminalInstanceInfoSchema = object({
20140
20231
  profileId: string(),
20141
20232
  profileLabel: string(),
20142
20233
  name: string(),
20143
- enabled: boolean()
20234
+ enabled: boolean(),
20235
+ executable: string(),
20236
+ args: array(string()).readonly(),
20237
+ cwd: string(),
20238
+ environment: array(string()).readonly(),
20239
+ profileSettings: ProfileSettingsBagSchema
20144
20240
  });
20145
20241
  var TerminalLegacyCameraSchema = object({
20146
20242
  stableId: string(),
@@ -20170,7 +20266,23 @@ var TerminalOutputBatchSchema = object({
20170
20266
  method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }), method(_void(), array(TerminalInstanceInfoSchema).readonly(), { auth: "admin" }), method(object({
20171
20267
  targetNodeId: string().min(1),
20172
20268
  profileId: string().min(1),
20173
- name: string().trim().min(1).max(160).optional()
20269
+ name: string().trim().min(1).max(160).optional(),
20270
+ executable: string().max(1024).optional(),
20271
+ args: array(string().max(2048)).max(64).optional(),
20272
+ cwd: string().max(1024).optional(),
20273
+ environment: array(string().max(4096)).max(64).optional(),
20274
+ profileSettings: ProfileSettingsBagSchema.optional()
20275
+ }), TerminalInstanceInfoSchema, {
20276
+ kind: "mutation",
20277
+ auth: "admin"
20278
+ }), method(object({
20279
+ instanceId: string().min(1),
20280
+ name: string().trim().min(1).max(160).optional(),
20281
+ executable: string().max(1024).optional(),
20282
+ args: array(string().max(2048)).max(64).optional(),
20283
+ cwd: string().max(1024).optional(),
20284
+ environment: array(string().max(4096)).max(64).optional(),
20285
+ profileSettings: ProfileSettingsBagSchema.optional()
20174
20286
  }), TerminalInstanceInfoSchema, {
20175
20287
  kind: "mutation",
20176
20288
  auth: "admin"
@@ -20192,7 +20304,11 @@ method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }),
20192
20304
  }), method(_void(), array(TerminalSessionInfoSchema).readonly(), { auth: "admin" }), method(object({
20193
20305
  profileId: string(),
20194
20306
  cols: number().int().positive(),
20195
- rows: number().int().positive()
20307
+ rows: number().int().positive(),
20308
+ executable: string().max(1024).optional(),
20309
+ args: array(string().max(2048)).max(64).optional(),
20310
+ cwd: string().max(1024).optional(),
20311
+ environment: array(string().max(4096)).max(64).optional()
20196
20312
  }), TerminalSessionInfoSchema, {
20197
20313
  kind: "mutation",
20198
20314
  auth: "admin"
@@ -24084,10 +24200,10 @@ var lawnMowerControlCapability = {
24084
24200
  *
24085
24201
  * • The SDK (mobile / web client) consumes `getConnectionEndpoints()`
24086
24202
  * to receive an ordered list of candidate base URLs it should race
24087
- * on connect — LAN IPv4 first (lowest latency when on same network),
24088
- * then public hostname (if a tunnel is up), then IPv6. The SDK can
24089
- * race them with short timeouts and stick with the winner for the
24090
- * session.
24203
+ * on connect — LAN IPv4 and stable LAN IPv6 first (lowest latency
24204
+ * when on the same network), then public hostname (if a tunnel is
24205
+ * up). The SDK can race them with short timeouts and stick with the
24206
+ * winner for the session.
24091
24207
  *
24092
24208
  * Why hub-only: agents are not directly addressable by the operator's
24093
24209
  * clients — they reverse-connect to the hub. Exposing their interfaces
@@ -24242,6 +24358,17 @@ var NotificationEndpointSchema = object({
24242
24358
  /** What the ranking currently resolves to (null when nothing is reachable). */
24243
24359
  resolved: string().nullable()
24244
24360
  });
24361
+ /**
24362
+ * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
24363
+ * AUTO (every LAN IPv4 + the public tunnel). `resolved` is what that choice
24364
+ * currently expands to, so the UI can show the effective set either way.
24365
+ */
24366
+ var ViewerEndpointsSchema = object({
24367
+ /** The operator's explicit race set, or empty for AUTO. */
24368
+ baseUrls: array(string()).readonly(),
24369
+ /** What the ranking currently resolves to (may be empty if nothing is up). */
24370
+ resolved: array(string()).readonly()
24371
+ });
24245
24372
  var AllowedAddressesSchema = object({
24246
24373
  /**
24247
24374
  * Allowlist of interface addresses operators have explicitly opted
@@ -24250,6 +24377,20 @@ var AllowedAddressesSchema = object({
24250
24377
  * Network Addresses admin page and persisted by the addon.
24251
24378
  */
24252
24379
  addresses: array(string()).readonly() });
24380
+ var TlsStatusSchema = object({
24381
+ mode: _enum([
24382
+ "generated",
24383
+ "uploaded",
24384
+ "disabled"
24385
+ ]),
24386
+ leafFingerprintSha256: string().nullable(),
24387
+ caFingerprintSha256: string().nullable(),
24388
+ validTo: string().nullable(),
24389
+ sans: array(string()),
24390
+ caCertPem: string().nullable(),
24391
+ reissueError: string().nullable(),
24392
+ restartRequired: boolean()
24393
+ });
24253
24394
  method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
24254
24395
  /**
24255
24396
  * LEGACY HINT — do not send from new code. Kept optional so clients
@@ -24259,17 +24400,31 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
24259
24400
  */
24260
24401
  port: number().int().min(1).max(65535).optional(),
24261
24402
  /** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
24262
- * candidate. Default `true`. */
24403
+ * candidate. Default `false` — loopback is not a client route. */
24263
24404
  includeLoopback: boolean().optional(),
24264
- /** Skip IPv6 entries. Some legacy clients can't parse them.
24265
- * Default `false`. */
24405
+ /** Skip IPv6 entries. Default `false` the palette includes stable
24406
+ * LAN IPv6 (ICE/WebRTC uses dual-stack regardless). Pass `true` to
24407
+ * hide them. The viewer HTTP/WS race is `getViewerEndpoints`. */
24266
24408
  ipv4Only: boolean().optional(),
24267
24409
  /** Scheme to emit for LAN/loopback URLs. Default `'http'`.
24268
24410
  * Pass `'https'` when the caller is itself loaded over HTTPS
24269
24411
  * to avoid mixed-content blocks in the browser. The public
24270
24412
  * tunnel always emits `https://` regardless. */
24271
24413
  scheme: _enum(["http", "https"]).optional()
24272
- }), 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" });
24414
+ }), 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, {
24415
+ kind: "mutation",
24416
+ auth: "admin"
24417
+ }), method(object({
24418
+ certPem: string().min(1),
24419
+ keyPem: string().min(1),
24420
+ caPem: string().optional()
24421
+ }), TlsStatusSchema, {
24422
+ kind: "mutation",
24423
+ auth: "admin"
24424
+ }), method(_void(), object({ pem: string() })), method(_void(), TlsStatusSchema, {
24425
+ kind: "mutation",
24426
+ auth: "admin"
24427
+ });
24273
24428
  var LockControlStatusSchema = object({
24274
24429
  /** Lifecycle state of the lock. `jammed` means the motor reported
24275
24430
  * failure to reach the target — operator intervention required. */
@@ -32296,6 +32451,12 @@ Object.freeze({
32296
32451
  addonId: null,
32297
32452
  access: "create"
32298
32453
  },
32454
+ "localNetwork.downloadCa": {
32455
+ capName: "local-network",
32456
+ capScope: "system",
32457
+ addonId: null,
32458
+ access: "view"
32459
+ },
32299
32460
  "localNetwork.getAllowedAddresses": {
32300
32461
  capName: "local-network",
32301
32462
  capScope: "system",
@@ -32320,18 +32481,42 @@ Object.freeze({
32320
32481
  addonId: null,
32321
32482
  access: "view"
32322
32483
  },
32484
+ "localNetwork.getTlsStatus": {
32485
+ capName: "local-network",
32486
+ capScope: "system",
32487
+ addonId: null,
32488
+ access: "view"
32489
+ },
32490
+ "localNetwork.getViewerEndpoints": {
32491
+ capName: "local-network",
32492
+ capScope: "system",
32493
+ addonId: null,
32494
+ access: "view"
32495
+ },
32323
32496
  "localNetwork.list": {
32324
32497
  capName: "local-network",
32325
32498
  capScope: "system",
32326
32499
  addonId: null,
32327
32500
  access: "view"
32328
32501
  },
32502
+ "localNetwork.regenerateCertificate": {
32503
+ capName: "local-network",
32504
+ capScope: "system",
32505
+ addonId: null,
32506
+ access: "create"
32507
+ },
32329
32508
  "localNetwork.resetAllowlistToBestMatch": {
32330
32509
  capName: "local-network",
32331
32510
  capScope: "system",
32332
32511
  addonId: null,
32333
32512
  access: "delete"
32334
32513
  },
32514
+ "localNetwork.revertToGeneratedCertificate": {
32515
+ capName: "local-network",
32516
+ capScope: "system",
32517
+ addonId: null,
32518
+ access: "create"
32519
+ },
32335
32520
  "localNetwork.setAllowedAddresses": {
32336
32521
  capName: "local-network",
32337
32522
  capScope: "system",
@@ -32344,6 +32529,18 @@ Object.freeze({
32344
32529
  addonId: null,
32345
32530
  access: "create"
32346
32531
  },
32532
+ "localNetwork.setViewerEndpoints": {
32533
+ capName: "local-network",
32534
+ capScope: "system",
32535
+ addonId: null,
32536
+ access: "create"
32537
+ },
32538
+ "localNetwork.uploadCertificate": {
32539
+ capName: "local-network",
32540
+ capScope: "system",
32541
+ addonId: null,
32542
+ access: "create"
32543
+ },
32347
32544
  "lockControl.lock": {
32348
32545
  capName: "lock-control",
32349
32546
  capScope: "device",
@@ -35224,6 +35421,12 @@ Object.freeze({
35224
35421
  addonId: null,
35225
35422
  access: "create"
35226
35423
  },
35424
+ "terminalSession.updateInstance": {
35425
+ capName: "terminal-session",
35426
+ capScope: "system",
35427
+ addonId: null,
35428
+ access: "create"
35429
+ },
35227
35430
  "terminalSession.writeInput": {
35228
35431
  capName: "terminal-session",
35229
35432
  capScope: "system",
@@ -37711,6 +37914,35 @@ Object.freeze(Object.fromEntries([{
37711
37914
  }]
37712
37915
  }].map((s) => [s.stepId, s.defaultModelId])));
37713
37916
  string().min(1);
37917
+ var CLUSTER_STEP_SETTING_FIELDS = [{
37918
+ stepId: "face-embedding",
37919
+ key: "minLandmarkFaceSize",
37920
+ label: "Min face size for recognition (detection px)",
37921
+ 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.",
37922
+ type: "slider",
37923
+ min: 0,
37924
+ max: 64,
37925
+ step: 2,
37926
+ default: 24
37927
+ }];
37928
+ function clusterStepSettingKey(stepId, fieldKey) {
37929
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
37930
+ }
37931
+ var ClusterSettingNumberSchema = number().finite();
37932
+ function readClusterStepSettings(config) {
37933
+ const out = {};
37934
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
37935
+ const parsed = ClusterSettingNumberSchema.safeParse(config[clusterStepSettingKey(field.stepId, field.key)]);
37936
+ const value = parsed.success ? parsed.data : field.default;
37937
+ const existing = out[field.stepId] ?? {};
37938
+ out[field.stepId] = {
37939
+ ...existing,
37940
+ [field.key]: value
37941
+ };
37942
+ }
37943
+ return out;
37944
+ }
37945
+ readClusterStepSettings({});
37714
37946
  object({
37715
37947
  /**
37716
37948
  * Fraction of the box's own size added on EACH side before cutting.
package/dist/addon.mjs CHANGED
@@ -8178,6 +8178,15 @@ var LabelDefinitionSchema = object({
8178
8178
  description: string().optional(),
8179
8179
  icon: string().optional()
8180
8180
  });
8181
+ var ClassMapDefinitionSchema = object({
8182
+ mapping: record(string(), _enum([
8183
+ "person",
8184
+ "vehicle",
8185
+ "animal",
8186
+ "package"
8187
+ ])),
8188
+ preserveOriginal: boolean()
8189
+ });
8181
8190
  var MODEL_FORMATS = [
8182
8191
  "onnx",
8183
8192
  "coreml",
@@ -8356,7 +8365,13 @@ var ModelCatalogEntrySchema = object({
8356
8365
  * `id` stays the source of truth for resolution/download/persistence; grouping
8357
8366
  * is a presentation overlay resolved back to an `id`.
8358
8367
  */
8359
- group: ModelVariantGroupSchema.optional()
8368
+ group: ModelVariantGroupSchema.optional(),
8369
+ /**
8370
+ * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
8371
+ * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8372
+ * labels already ARE the CamStack macros (Scrypted identity map).
8373
+ */
8374
+ classMap: ClassMapDefinitionSchema.optional()
8360
8375
  });
8361
8376
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8362
8377
  format: literal("openvino"),
@@ -8385,7 +8400,8 @@ var ModelConvertMetadataSchema = object({
8385
8400
  "ocr",
8386
8401
  "segmentation"
8387
8402
  ]),
8388
- faceAlignment: boolean().optional()
8403
+ faceAlignment: boolean().optional(),
8404
+ classMap: ClassMapDefinitionSchema.optional()
8389
8405
  });
8390
8406
  var ConvertResultSchema = object({
8391
8407
  entry: ModelCatalogEntrySchema,
@@ -17763,6 +17779,33 @@ var NativeCropRefSchema = object({
17763
17779
  h: number()
17764
17780
  })
17765
17781
  });
17782
+ object({
17783
+ crop: object({
17784
+ left: number(),
17785
+ top: number(),
17786
+ width: number().positive(),
17787
+ height: number().positive()
17788
+ }).optional(),
17789
+ content: object({
17790
+ width: number().int().positive(),
17791
+ height: number().int().positive()
17792
+ }),
17793
+ fit: _enum(["stretch", "contain"]),
17794
+ format: _enum([
17795
+ "rgb",
17796
+ "gray",
17797
+ "jpeg"
17798
+ ])
17799
+ });
17800
+ var FrameRefSchema = object({
17801
+ registryId: string().min(1),
17802
+ id: string().min(1),
17803
+ width: number().int().positive(),
17804
+ height: number().int().positive(),
17805
+ format: _enum(["rgb", "gray"]),
17806
+ timestamp: number(),
17807
+ capturedAt: number().optional()
17808
+ });
17766
17809
  var ModelFormatSchema$1 = _enum([
17767
17810
  "onnx",
17768
17811
  "coreml",
@@ -18007,6 +18050,12 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
18007
18050
  steps: array(PipelineStepInputSchema).min(1),
18008
18051
  frame: FrameInputSchema.optional(),
18009
18052
  /**
18053
+ * Process-local lazy frame. Valid only when caller and provider resolve
18054
+ * in the same execution-group process; split/cross-node callers use
18055
+ * `frame`/`image` inline compatibility instead.
18056
+ */
18057
+ frameRef: FrameRefSchema.optional(),
18058
+ /**
18010
18059
  * CB5 shm passthrough — a `FrameHandle` naming the same ring slot
18011
18060
  * the decoded pixels live in. One more member of the one-of
18012
18061
  * frame/frameHandle/image/imageBase64/referenceImage group.
@@ -18302,7 +18351,10 @@ var NativeCropResultSchema = object({
18302
18351
  * Which source served this crop, so a quality-sensitive consumer (the native
18303
18352
  * `keyFrame`) can reject a degraded fallback:
18304
18353
  * - `native` — cut from the decode worker's retained NATIVE surface (the
18305
- * quality path).
18354
+ * quality path). A subject-tile serve is also native-resolution and stays
18355
+ * `native` here: the public enum cannot name `tile` without a breaking cap
18356
+ * change. Runner telemetry distinguishes lease vs tile via `source` on the
18357
+ * internal crop result (`nativeHits` vs `tileHits`).
18306
18358
  * - `ram-fullframe` — the native surface MISSED but the request was full-frame,
18307
18359
  * so the ≤640 RAM `RetainedFrameStore` served it (honest lower-res; legit for
18308
18360
  * the blank-frame guard / 640-snapshot resolve, NOT for the clean keyFrame).
@@ -18793,12 +18845,41 @@ var RunnerLocalLoadSchema = object({
18793
18845
  * legacy `OrchestratorMetricsSchema` shape so existing dashboards keep
18794
18846
  * working unchanged when they switch to reading from the runner cap.
18795
18847
  */
18848
+ var FrameLazyCountersSchema = object({
18849
+ framesDecoded: number(),
18850
+ framesAdmitted: number(),
18851
+ framesDroppedPixelFree: number(),
18852
+ viewsMaterialized: number(),
18853
+ viewsSkipped: number(),
18854
+ workerToRunnerBytes: number(),
18855
+ runnerToPoolRawBytes: number(),
18856
+ runnerToPoolJpegBytes: number(),
18857
+ onDemandFullFrameRequests: number(),
18858
+ onDemandCropRequests: number(),
18859
+ nativeHits: number(),
18860
+ nativeMisses: number(),
18861
+ tileHits: number(),
18862
+ tileMisses: number(),
18863
+ fallbackHits: number(),
18864
+ fallbackMisses: number(),
18865
+ retainedWritesAvoided: number(),
18866
+ residentRefs: number(),
18867
+ residentBytes: number(),
18868
+ releases: number(),
18869
+ evictions: number(),
18870
+ staleMisses: number()
18871
+ });
18872
+ var FrameLazyMetricsSchema = object({
18873
+ node: FrameLazyCountersSchema,
18874
+ cameras: array(FrameLazyCountersSchema.extend({ deviceId: number() }))
18875
+ });
18796
18876
  var RunnerLocalMetricsSchema = object({
18797
18877
  nodeId: string(),
18798
18878
  activeCameras: number(),
18799
18879
  throttledCameras: number(),
18800
18880
  avgInferenceTimeMs: number(),
18801
- queueDepth: number()
18881
+ queueDepth: number(),
18882
+ frameLazy: FrameLazyMetricsSchema.optional()
18802
18883
  });
18803
18884
  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({
18804
18885
  handle: FrameHandleSchema,
@@ -20098,6 +20179,9 @@ method(_void(), ProviderInfoSchema), method(object({ config: record(string(), un
20098
20179
  location: StorageLocationSchema,
20099
20180
  relativePath: string()
20100
20181
  }), _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" });
20182
+ /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
20183
+ var ProfileSettingsSchemaBridge = unknown().nullable();
20184
+ var ProfileSettingsBagSchema = record(string(), unknown());
20101
20185
  /**
20102
20186
  * A live terminal session hosted by the provider addon. Output and input do
20103
20187
  * NOT flow through the capability — they use the addon data plane
@@ -20127,7 +20211,14 @@ var TerminalSessionInfoSchema = object({
20127
20211
  var TerminalProfileInfoSchema = object({
20128
20212
  profileId: string(),
20129
20213
  label: string(),
20130
- description: string().optional()
20214
+ description: string().optional(),
20215
+ /** Spawn defaults the instance form copies on create. */
20216
+ executable: string().optional(),
20217
+ args: array(string()).readonly().optional(),
20218
+ cwd: string().optional(),
20219
+ environment: array(string()).readonly().optional(),
20220
+ /** ConfigUISchema for instance knobs, or null when the profile has none. */
20221
+ settingsSchema: ProfileSettingsSchemaBridge.optional()
20131
20222
  });
20132
20223
  /**
20133
20224
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -20140,7 +20231,12 @@ var TerminalInstanceInfoSchema = object({
20140
20231
  profileId: string(),
20141
20232
  profileLabel: string(),
20142
20233
  name: string(),
20143
- enabled: boolean()
20234
+ enabled: boolean(),
20235
+ executable: string(),
20236
+ args: array(string()).readonly(),
20237
+ cwd: string(),
20238
+ environment: array(string()).readonly(),
20239
+ profileSettings: ProfileSettingsBagSchema
20144
20240
  });
20145
20241
  var TerminalLegacyCameraSchema = object({
20146
20242
  stableId: string(),
@@ -20170,7 +20266,23 @@ var TerminalOutputBatchSchema = object({
20170
20266
  method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }), method(_void(), array(TerminalInstanceInfoSchema).readonly(), { auth: "admin" }), method(object({
20171
20267
  targetNodeId: string().min(1),
20172
20268
  profileId: string().min(1),
20173
- name: string().trim().min(1).max(160).optional()
20269
+ name: string().trim().min(1).max(160).optional(),
20270
+ executable: string().max(1024).optional(),
20271
+ args: array(string().max(2048)).max(64).optional(),
20272
+ cwd: string().max(1024).optional(),
20273
+ environment: array(string().max(4096)).max(64).optional(),
20274
+ profileSettings: ProfileSettingsBagSchema.optional()
20275
+ }), TerminalInstanceInfoSchema, {
20276
+ kind: "mutation",
20277
+ auth: "admin"
20278
+ }), method(object({
20279
+ instanceId: string().min(1),
20280
+ name: string().trim().min(1).max(160).optional(),
20281
+ executable: string().max(1024).optional(),
20282
+ args: array(string().max(2048)).max(64).optional(),
20283
+ cwd: string().max(1024).optional(),
20284
+ environment: array(string().max(4096)).max(64).optional(),
20285
+ profileSettings: ProfileSettingsBagSchema.optional()
20174
20286
  }), TerminalInstanceInfoSchema, {
20175
20287
  kind: "mutation",
20176
20288
  auth: "admin"
@@ -20192,7 +20304,11 @@ method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }),
20192
20304
  }), method(_void(), array(TerminalSessionInfoSchema).readonly(), { auth: "admin" }), method(object({
20193
20305
  profileId: string(),
20194
20306
  cols: number().int().positive(),
20195
- rows: number().int().positive()
20307
+ rows: number().int().positive(),
20308
+ executable: string().max(1024).optional(),
20309
+ args: array(string().max(2048)).max(64).optional(),
20310
+ cwd: string().max(1024).optional(),
20311
+ environment: array(string().max(4096)).max(64).optional()
20196
20312
  }), TerminalSessionInfoSchema, {
20197
20313
  kind: "mutation",
20198
20314
  auth: "admin"
@@ -24084,10 +24200,10 @@ var lawnMowerControlCapability = {
24084
24200
  *
24085
24201
  * • The SDK (mobile / web client) consumes `getConnectionEndpoints()`
24086
24202
  * to receive an ordered list of candidate base URLs it should race
24087
- * on connect — LAN IPv4 first (lowest latency when on same network),
24088
- * then public hostname (if a tunnel is up), then IPv6. The SDK can
24089
- * race them with short timeouts and stick with the winner for the
24090
- * session.
24203
+ * on connect — LAN IPv4 and stable LAN IPv6 first (lowest latency
24204
+ * when on the same network), then public hostname (if a tunnel is
24205
+ * up). The SDK can race them with short timeouts and stick with the
24206
+ * winner for the session.
24091
24207
  *
24092
24208
  * Why hub-only: agents are not directly addressable by the operator's
24093
24209
  * clients — they reverse-connect to the hub. Exposing their interfaces
@@ -24242,6 +24358,17 @@ var NotificationEndpointSchema = object({
24242
24358
  /** What the ranking currently resolves to (null when nothing is reachable). */
24243
24359
  resolved: string().nullable()
24244
24360
  });
24361
+ /**
24362
+ * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
24363
+ * AUTO (every LAN IPv4 + the public tunnel). `resolved` is what that choice
24364
+ * currently expands to, so the UI can show the effective set either way.
24365
+ */
24366
+ var ViewerEndpointsSchema = object({
24367
+ /** The operator's explicit race set, or empty for AUTO. */
24368
+ baseUrls: array(string()).readonly(),
24369
+ /** What the ranking currently resolves to (may be empty if nothing is up). */
24370
+ resolved: array(string()).readonly()
24371
+ });
24245
24372
  var AllowedAddressesSchema = object({
24246
24373
  /**
24247
24374
  * Allowlist of interface addresses operators have explicitly opted
@@ -24250,6 +24377,20 @@ var AllowedAddressesSchema = object({
24250
24377
  * Network Addresses admin page and persisted by the addon.
24251
24378
  */
24252
24379
  addresses: array(string()).readonly() });
24380
+ var TlsStatusSchema = object({
24381
+ mode: _enum([
24382
+ "generated",
24383
+ "uploaded",
24384
+ "disabled"
24385
+ ]),
24386
+ leafFingerprintSha256: string().nullable(),
24387
+ caFingerprintSha256: string().nullable(),
24388
+ validTo: string().nullable(),
24389
+ sans: array(string()),
24390
+ caCertPem: string().nullable(),
24391
+ reissueError: string().nullable(),
24392
+ restartRequired: boolean()
24393
+ });
24253
24394
  method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
24254
24395
  /**
24255
24396
  * LEGACY HINT — do not send from new code. Kept optional so clients
@@ -24259,17 +24400,31 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
24259
24400
  */
24260
24401
  port: number().int().min(1).max(65535).optional(),
24261
24402
  /** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
24262
- * candidate. Default `true`. */
24403
+ * candidate. Default `false` — loopback is not a client route. */
24263
24404
  includeLoopback: boolean().optional(),
24264
- /** Skip IPv6 entries. Some legacy clients can't parse them.
24265
- * Default `false`. */
24405
+ /** Skip IPv6 entries. Default `false` the palette includes stable
24406
+ * LAN IPv6 (ICE/WebRTC uses dual-stack regardless). Pass `true` to
24407
+ * hide them. The viewer HTTP/WS race is `getViewerEndpoints`. */
24266
24408
  ipv4Only: boolean().optional(),
24267
24409
  /** Scheme to emit for LAN/loopback URLs. Default `'http'`.
24268
24410
  * Pass `'https'` when the caller is itself loaded over HTTPS
24269
24411
  * to avoid mixed-content blocks in the browser. The public
24270
24412
  * tunnel always emits `https://` regardless. */
24271
24413
  scheme: _enum(["http", "https"]).optional()
24272
- }), 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" });
24414
+ }), 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, {
24415
+ kind: "mutation",
24416
+ auth: "admin"
24417
+ }), method(object({
24418
+ certPem: string().min(1),
24419
+ keyPem: string().min(1),
24420
+ caPem: string().optional()
24421
+ }), TlsStatusSchema, {
24422
+ kind: "mutation",
24423
+ auth: "admin"
24424
+ }), method(_void(), object({ pem: string() })), method(_void(), TlsStatusSchema, {
24425
+ kind: "mutation",
24426
+ auth: "admin"
24427
+ });
24273
24428
  var LockControlStatusSchema = object({
24274
24429
  /** Lifecycle state of the lock. `jammed` means the motor reported
24275
24430
  * failure to reach the target — operator intervention required. */
@@ -32296,6 +32451,12 @@ Object.freeze({
32296
32451
  addonId: null,
32297
32452
  access: "create"
32298
32453
  },
32454
+ "localNetwork.downloadCa": {
32455
+ capName: "local-network",
32456
+ capScope: "system",
32457
+ addonId: null,
32458
+ access: "view"
32459
+ },
32299
32460
  "localNetwork.getAllowedAddresses": {
32300
32461
  capName: "local-network",
32301
32462
  capScope: "system",
@@ -32320,18 +32481,42 @@ Object.freeze({
32320
32481
  addonId: null,
32321
32482
  access: "view"
32322
32483
  },
32484
+ "localNetwork.getTlsStatus": {
32485
+ capName: "local-network",
32486
+ capScope: "system",
32487
+ addonId: null,
32488
+ access: "view"
32489
+ },
32490
+ "localNetwork.getViewerEndpoints": {
32491
+ capName: "local-network",
32492
+ capScope: "system",
32493
+ addonId: null,
32494
+ access: "view"
32495
+ },
32323
32496
  "localNetwork.list": {
32324
32497
  capName: "local-network",
32325
32498
  capScope: "system",
32326
32499
  addonId: null,
32327
32500
  access: "view"
32328
32501
  },
32502
+ "localNetwork.regenerateCertificate": {
32503
+ capName: "local-network",
32504
+ capScope: "system",
32505
+ addonId: null,
32506
+ access: "create"
32507
+ },
32329
32508
  "localNetwork.resetAllowlistToBestMatch": {
32330
32509
  capName: "local-network",
32331
32510
  capScope: "system",
32332
32511
  addonId: null,
32333
32512
  access: "delete"
32334
32513
  },
32514
+ "localNetwork.revertToGeneratedCertificate": {
32515
+ capName: "local-network",
32516
+ capScope: "system",
32517
+ addonId: null,
32518
+ access: "create"
32519
+ },
32335
32520
  "localNetwork.setAllowedAddresses": {
32336
32521
  capName: "local-network",
32337
32522
  capScope: "system",
@@ -32344,6 +32529,18 @@ Object.freeze({
32344
32529
  addonId: null,
32345
32530
  access: "create"
32346
32531
  },
32532
+ "localNetwork.setViewerEndpoints": {
32533
+ capName: "local-network",
32534
+ capScope: "system",
32535
+ addonId: null,
32536
+ access: "create"
32537
+ },
32538
+ "localNetwork.uploadCertificate": {
32539
+ capName: "local-network",
32540
+ capScope: "system",
32541
+ addonId: null,
32542
+ access: "create"
32543
+ },
32347
32544
  "lockControl.lock": {
32348
32545
  capName: "lock-control",
32349
32546
  capScope: "device",
@@ -35224,6 +35421,12 @@ Object.freeze({
35224
35421
  addonId: null,
35225
35422
  access: "create"
35226
35423
  },
35424
+ "terminalSession.updateInstance": {
35425
+ capName: "terminal-session",
35426
+ capScope: "system",
35427
+ addonId: null,
35428
+ access: "create"
35429
+ },
35227
35430
  "terminalSession.writeInput": {
35228
35431
  capName: "terminal-session",
35229
35432
  capScope: "system",
@@ -37711,6 +37914,35 @@ Object.freeze(Object.fromEntries([{
37711
37914
  }]
37712
37915
  }].map((s) => [s.stepId, s.defaultModelId])));
37713
37916
  string().min(1);
37917
+ var CLUSTER_STEP_SETTING_FIELDS = [{
37918
+ stepId: "face-embedding",
37919
+ key: "minLandmarkFaceSize",
37920
+ label: "Min face size for recognition (detection px)",
37921
+ 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.",
37922
+ type: "slider",
37923
+ min: 0,
37924
+ max: 64,
37925
+ step: 2,
37926
+ default: 24
37927
+ }];
37928
+ function clusterStepSettingKey(stepId, fieldKey) {
37929
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
37930
+ }
37931
+ var ClusterSettingNumberSchema = number().finite();
37932
+ function readClusterStepSettings(config) {
37933
+ const out = {};
37934
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
37935
+ const parsed = ClusterSettingNumberSchema.safeParse(config[clusterStepSettingKey(field.stepId, field.key)]);
37936
+ const value = parsed.success ? parsed.data : field.default;
37937
+ const existing = out[field.stepId] ?? {};
37938
+ out[field.stepId] = {
37939
+ ...existing,
37940
+ [field.key]: value
37941
+ };
37942
+ }
37943
+ return out;
37944
+ }
37945
+ readClusterStepSettings({});
37714
37946
  object({
37715
37947
  /**
37716
37948
  * 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-import-alexa",
3
- "version": "0.2.25",
3
+ "version": "0.2.26",
4
4
  "description": "Alexa device-import provider for CamStack — imports the smart-home devices in a user's Alexa account via the unofficial alexa-remote2 cookie/token client (the inverse of the Alexa exporter)",
5
5
  "keywords": [
6
6
  "camstack",