@camstack/addon-cloudflare 1.2.25 → 1.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.
@@ -8003,6 +8003,15 @@ var LabelDefinitionSchema = object({
8003
8003
  description: string().optional(),
8004
8004
  icon: string().optional()
8005
8005
  });
8006
+ var ClassMapDefinitionSchema = object({
8007
+ mapping: record(string(), _enum([
8008
+ "person",
8009
+ "vehicle",
8010
+ "animal",
8011
+ "package"
8012
+ ])),
8013
+ preserveOriginal: boolean()
8014
+ });
8006
8015
  var MODEL_FORMATS = [
8007
8016
  "onnx",
8008
8017
  "coreml",
@@ -8181,7 +8190,13 @@ var ModelCatalogEntrySchema = object({
8181
8190
  * `id` stays the source of truth for resolution/download/persistence; grouping
8182
8191
  * is a presentation overlay resolved back to an `id`.
8183
8192
  */
8184
- group: ModelVariantGroupSchema.optional()
8193
+ group: ModelVariantGroupSchema.optional(),
8194
+ /**
8195
+ * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
8196
+ * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8197
+ * labels already ARE the CamStack macros (Scrypted identity map).
8198
+ */
8199
+ classMap: ClassMapDefinitionSchema.optional()
8185
8200
  });
8186
8201
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8187
8202
  format: literal("openvino"),
@@ -8210,7 +8225,8 @@ var ModelConvertMetadataSchema = object({
8210
8225
  "ocr",
8211
8226
  "segmentation"
8212
8227
  ]),
8213
- faceAlignment: boolean().optional()
8228
+ faceAlignment: boolean().optional(),
8229
+ classMap: ClassMapDefinitionSchema.optional()
8214
8230
  });
8215
8231
  var ConvertResultSchema = object({
8216
8232
  entry: ModelCatalogEntrySchema,
@@ -17240,6 +17256,33 @@ var NativeCropRefSchema = object({
17240
17256
  h: number()
17241
17257
  })
17242
17258
  });
17259
+ object({
17260
+ crop: object({
17261
+ left: number(),
17262
+ top: number(),
17263
+ width: number().positive(),
17264
+ height: number().positive()
17265
+ }).optional(),
17266
+ content: object({
17267
+ width: number().int().positive(),
17268
+ height: number().int().positive()
17269
+ }),
17270
+ fit: _enum(["stretch", "contain"]),
17271
+ format: _enum([
17272
+ "rgb",
17273
+ "gray",
17274
+ "jpeg"
17275
+ ])
17276
+ });
17277
+ var FrameRefSchema = object({
17278
+ registryId: string().min(1),
17279
+ id: string().min(1),
17280
+ width: number().int().positive(),
17281
+ height: number().int().positive(),
17282
+ format: _enum(["rgb", "gray"]),
17283
+ timestamp: number(),
17284
+ capturedAt: number().optional()
17285
+ });
17243
17286
  var ModelFormatSchema$1 = _enum([
17244
17287
  "onnx",
17245
17288
  "coreml",
@@ -17484,6 +17527,12 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
17484
17527
  steps: array(PipelineStepInputSchema).min(1),
17485
17528
  frame: FrameInputSchema.optional(),
17486
17529
  /**
17530
+ * Process-local lazy frame. Valid only when caller and provider resolve
17531
+ * in the same execution-group process; split/cross-node callers use
17532
+ * `frame`/`image` inline compatibility instead.
17533
+ */
17534
+ frameRef: FrameRefSchema.optional(),
17535
+ /**
17487
17536
  * CB5 shm passthrough — a `FrameHandle` naming the same ring slot
17488
17537
  * the decoded pixels live in. One more member of the one-of
17489
17538
  * frame/frameHandle/image/imageBase64/referenceImage group.
@@ -17739,7 +17788,10 @@ var NativeCropResultSchema = object({
17739
17788
  * Which source served this crop, so a quality-sensitive consumer (the native
17740
17789
  * `keyFrame`) can reject a degraded fallback:
17741
17790
  * - `native` — cut from the decode worker's retained NATIVE surface (the
17742
- * quality path).
17791
+ * quality path). A subject-tile serve is also native-resolution and stays
17792
+ * `native` here: the public enum cannot name `tile` without a breaking cap
17793
+ * change. Runner telemetry distinguishes lease vs tile via `source` on the
17794
+ * internal crop result (`nativeHits` vs `tileHits`).
17743
17795
  * - `ram-fullframe` — the native surface MISSED but the request was full-frame,
17744
17796
  * so the ≤640 RAM `RetainedFrameStore` served it (honest lower-res; legit for
17745
17797
  * the blank-frame guard / 640-snapshot resolve, NOT for the clean keyFrame).
@@ -18230,12 +18282,41 @@ var RunnerLocalLoadSchema = object({
18230
18282
  * legacy `OrchestratorMetricsSchema` shape so existing dashboards keep
18231
18283
  * working unchanged when they switch to reading from the runner cap.
18232
18284
  */
18285
+ var FrameLazyCountersSchema = object({
18286
+ framesDecoded: number(),
18287
+ framesAdmitted: number(),
18288
+ framesDroppedPixelFree: number(),
18289
+ viewsMaterialized: number(),
18290
+ viewsSkipped: number(),
18291
+ workerToRunnerBytes: number(),
18292
+ runnerToPoolRawBytes: number(),
18293
+ runnerToPoolJpegBytes: number(),
18294
+ onDemandFullFrameRequests: number(),
18295
+ onDemandCropRequests: number(),
18296
+ nativeHits: number(),
18297
+ nativeMisses: number(),
18298
+ tileHits: number(),
18299
+ tileMisses: number(),
18300
+ fallbackHits: number(),
18301
+ fallbackMisses: number(),
18302
+ retainedWritesAvoided: number(),
18303
+ residentRefs: number(),
18304
+ residentBytes: number(),
18305
+ releases: number(),
18306
+ evictions: number(),
18307
+ staleMisses: number()
18308
+ });
18309
+ var FrameLazyMetricsSchema = object({
18310
+ node: FrameLazyCountersSchema,
18311
+ cameras: array(FrameLazyCountersSchema.extend({ deviceId: number() }))
18312
+ });
18233
18313
  var RunnerLocalMetricsSchema = object({
18234
18314
  nodeId: string(),
18235
18315
  activeCameras: number(),
18236
18316
  throttledCameras: number(),
18237
18317
  avgInferenceTimeMs: number(),
18238
- queueDepth: number()
18318
+ queueDepth: number(),
18319
+ frameLazy: FrameLazyMetricsSchema.optional()
18239
18320
  });
18240
18321
  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({
18241
18322
  handle: FrameHandleSchema,
@@ -19535,6 +19616,9 @@ method(_void(), ProviderInfoSchema), method(object({ config: record(string(), un
19535
19616
  location: StorageLocationSchema,
19536
19617
  relativePath: string()
19537
19618
  }), _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" });
19619
+ /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
19620
+ var ProfileSettingsSchemaBridge = unknown().nullable();
19621
+ var ProfileSettingsBagSchema = record(string(), unknown());
19538
19622
  /**
19539
19623
  * A live terminal session hosted by the provider addon. Output and input do
19540
19624
  * NOT flow through the capability — they use the addon data plane
@@ -19564,7 +19648,14 @@ var TerminalSessionInfoSchema = object({
19564
19648
  var TerminalProfileInfoSchema = object({
19565
19649
  profileId: string(),
19566
19650
  label: string(),
19567
- description: string().optional()
19651
+ description: string().optional(),
19652
+ /** Spawn defaults the instance form copies on create. */
19653
+ executable: string().optional(),
19654
+ args: array(string()).readonly().optional(),
19655
+ cwd: string().optional(),
19656
+ environment: array(string()).readonly().optional(),
19657
+ /** ConfigUISchema for instance knobs, or null when the profile has none. */
19658
+ settingsSchema: ProfileSettingsSchemaBridge.optional()
19568
19659
  });
19569
19660
  /**
19570
19661
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -19577,7 +19668,12 @@ var TerminalInstanceInfoSchema = object({
19577
19668
  profileId: string(),
19578
19669
  profileLabel: string(),
19579
19670
  name: string(),
19580
- enabled: boolean()
19671
+ enabled: boolean(),
19672
+ executable: string(),
19673
+ args: array(string()).readonly(),
19674
+ cwd: string(),
19675
+ environment: array(string()).readonly(),
19676
+ profileSettings: ProfileSettingsBagSchema
19581
19677
  });
19582
19678
  var TerminalLegacyCameraSchema = object({
19583
19679
  stableId: string(),
@@ -19607,7 +19703,23 @@ var TerminalOutputBatchSchema = object({
19607
19703
  method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }), method(_void(), array(TerminalInstanceInfoSchema).readonly(), { auth: "admin" }), method(object({
19608
19704
  targetNodeId: string().min(1),
19609
19705
  profileId: string().min(1),
19610
- name: string().trim().min(1).max(160).optional()
19706
+ name: string().trim().min(1).max(160).optional(),
19707
+ executable: string().max(1024).optional(),
19708
+ args: array(string().max(2048)).max(64).optional(),
19709
+ cwd: string().max(1024).optional(),
19710
+ environment: array(string().max(4096)).max(64).optional(),
19711
+ profileSettings: ProfileSettingsBagSchema.optional()
19712
+ }), TerminalInstanceInfoSchema, {
19713
+ kind: "mutation",
19714
+ auth: "admin"
19715
+ }), method(object({
19716
+ instanceId: string().min(1),
19717
+ name: string().trim().min(1).max(160).optional(),
19718
+ executable: string().max(1024).optional(),
19719
+ args: array(string().max(2048)).max(64).optional(),
19720
+ cwd: string().max(1024).optional(),
19721
+ environment: array(string().max(4096)).max(64).optional(),
19722
+ profileSettings: ProfileSettingsBagSchema.optional()
19611
19723
  }), TerminalInstanceInfoSchema, {
19612
19724
  kind: "mutation",
19613
19725
  auth: "admin"
@@ -19629,7 +19741,11 @@ method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }),
19629
19741
  }), method(_void(), array(TerminalSessionInfoSchema).readonly(), { auth: "admin" }), method(object({
19630
19742
  profileId: string(),
19631
19743
  cols: number().int().positive(),
19632
- rows: number().int().positive()
19744
+ rows: number().int().positive(),
19745
+ executable: string().max(1024).optional(),
19746
+ args: array(string().max(2048)).max(64).optional(),
19747
+ cwd: string().max(1024).optional(),
19748
+ environment: array(string().max(4096)).max(64).optional()
19633
19749
  }), TerminalSessionInfoSchema, {
19634
19750
  kind: "mutation",
19635
19751
  auth: "admin"
@@ -22434,10 +22550,10 @@ DeviceType.LawnMower, method(object({ deviceId: number().int().nonnegative() }),
22434
22550
  *
22435
22551
  * • The SDK (mobile / web client) consumes `getConnectionEndpoints()`
22436
22552
  * to receive an ordered list of candidate base URLs it should race
22437
- * on connect — LAN IPv4 first (lowest latency when on same network),
22438
- * then public hostname (if a tunnel is up), then IPv6. The SDK can
22439
- * race them with short timeouts and stick with the winner for the
22440
- * session.
22553
+ * on connect — LAN IPv4 and stable LAN IPv6 first (lowest latency
22554
+ * when on the same network), then public hostname (if a tunnel is
22555
+ * up). The SDK can race them with short timeouts and stick with the
22556
+ * winner for the session.
22441
22557
  *
22442
22558
  * Why hub-only: agents are not directly addressable by the operator's
22443
22559
  * clients — they reverse-connect to the hub. Exposing their interfaces
@@ -22592,6 +22708,17 @@ var NotificationEndpointSchema = object({
22592
22708
  /** What the ranking currently resolves to (null when nothing is reachable). */
22593
22709
  resolved: string().nullable()
22594
22710
  });
22711
+ /**
22712
+ * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
22713
+ * AUTO (every LAN IPv4 + the public tunnel). `resolved` is what that choice
22714
+ * currently expands to, so the UI can show the effective set either way.
22715
+ */
22716
+ var ViewerEndpointsSchema = object({
22717
+ /** The operator's explicit race set, or empty for AUTO. */
22718
+ baseUrls: array(string()).readonly(),
22719
+ /** What the ranking currently resolves to (may be empty if nothing is up). */
22720
+ resolved: array(string()).readonly()
22721
+ });
22595
22722
  var AllowedAddressesSchema = object({
22596
22723
  /**
22597
22724
  * Allowlist of interface addresses operators have explicitly opted
@@ -22600,6 +22727,20 @@ var AllowedAddressesSchema = object({
22600
22727
  * Network Addresses admin page and persisted by the addon.
22601
22728
  */
22602
22729
  addresses: array(string()).readonly() });
22730
+ var TlsStatusSchema = object({
22731
+ mode: _enum([
22732
+ "generated",
22733
+ "uploaded",
22734
+ "disabled"
22735
+ ]),
22736
+ leafFingerprintSha256: string().nullable(),
22737
+ caFingerprintSha256: string().nullable(),
22738
+ validTo: string().nullable(),
22739
+ sans: array(string()),
22740
+ caCertPem: string().nullable(),
22741
+ reissueError: string().nullable(),
22742
+ restartRequired: boolean()
22743
+ });
22603
22744
  method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
22604
22745
  /**
22605
22746
  * LEGACY HINT — do not send from new code. Kept optional so clients
@@ -22609,17 +22750,31 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
22609
22750
  */
22610
22751
  port: number().int().min(1).max(65535).optional(),
22611
22752
  /** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
22612
- * candidate. Default `true`. */
22753
+ * candidate. Default `false` — loopback is not a client route. */
22613
22754
  includeLoopback: boolean().optional(),
22614
- /** Skip IPv6 entries. Some legacy clients can't parse them.
22615
- * Default `false`. */
22755
+ /** Skip IPv6 entries. Default `false` the palette includes stable
22756
+ * LAN IPv6 (ICE/WebRTC uses dual-stack regardless). Pass `true` to
22757
+ * hide them. The viewer HTTP/WS race is `getViewerEndpoints`. */
22616
22758
  ipv4Only: boolean().optional(),
22617
22759
  /** Scheme to emit for LAN/loopback URLs. Default `'http'`.
22618
22760
  * Pass `'https'` when the caller is itself loaded over HTTPS
22619
22761
  * to avoid mixed-content blocks in the browser. The public
22620
22762
  * tunnel always emits `https://` regardless. */
22621
22763
  scheme: _enum(["http", "https"]).optional()
22622
- }), 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" });
22764
+ }), 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, {
22765
+ kind: "mutation",
22766
+ auth: "admin"
22767
+ }), method(object({
22768
+ certPem: string().min(1),
22769
+ keyPem: string().min(1),
22770
+ caPem: string().optional()
22771
+ }), TlsStatusSchema, {
22772
+ kind: "mutation",
22773
+ auth: "admin"
22774
+ }), method(_void(), object({ pem: string() })), method(_void(), TlsStatusSchema, {
22775
+ kind: "mutation",
22776
+ auth: "admin"
22777
+ });
22623
22778
  object({
22624
22779
  /** Lifecycle state of the lock. `jammed` means the motor reported
22625
22780
  * failure to reach the target — operator intervention required. */
@@ -28382,6 +28537,12 @@ Object.freeze({
28382
28537
  addonId: null,
28383
28538
  access: "create"
28384
28539
  },
28540
+ "localNetwork.downloadCa": {
28541
+ capName: "local-network",
28542
+ capScope: "system",
28543
+ addonId: null,
28544
+ access: "view"
28545
+ },
28385
28546
  "localNetwork.getAllowedAddresses": {
28386
28547
  capName: "local-network",
28387
28548
  capScope: "system",
@@ -28406,18 +28567,42 @@ Object.freeze({
28406
28567
  addonId: null,
28407
28568
  access: "view"
28408
28569
  },
28570
+ "localNetwork.getTlsStatus": {
28571
+ capName: "local-network",
28572
+ capScope: "system",
28573
+ addonId: null,
28574
+ access: "view"
28575
+ },
28576
+ "localNetwork.getViewerEndpoints": {
28577
+ capName: "local-network",
28578
+ capScope: "system",
28579
+ addonId: null,
28580
+ access: "view"
28581
+ },
28409
28582
  "localNetwork.list": {
28410
28583
  capName: "local-network",
28411
28584
  capScope: "system",
28412
28585
  addonId: null,
28413
28586
  access: "view"
28414
28587
  },
28588
+ "localNetwork.regenerateCertificate": {
28589
+ capName: "local-network",
28590
+ capScope: "system",
28591
+ addonId: null,
28592
+ access: "create"
28593
+ },
28415
28594
  "localNetwork.resetAllowlistToBestMatch": {
28416
28595
  capName: "local-network",
28417
28596
  capScope: "system",
28418
28597
  addonId: null,
28419
28598
  access: "delete"
28420
28599
  },
28600
+ "localNetwork.revertToGeneratedCertificate": {
28601
+ capName: "local-network",
28602
+ capScope: "system",
28603
+ addonId: null,
28604
+ access: "create"
28605
+ },
28421
28606
  "localNetwork.setAllowedAddresses": {
28422
28607
  capName: "local-network",
28423
28608
  capScope: "system",
@@ -28430,6 +28615,18 @@ Object.freeze({
28430
28615
  addonId: null,
28431
28616
  access: "create"
28432
28617
  },
28618
+ "localNetwork.setViewerEndpoints": {
28619
+ capName: "local-network",
28620
+ capScope: "system",
28621
+ addonId: null,
28622
+ access: "create"
28623
+ },
28624
+ "localNetwork.uploadCertificate": {
28625
+ capName: "local-network",
28626
+ capScope: "system",
28627
+ addonId: null,
28628
+ access: "create"
28629
+ },
28433
28630
  "lockControl.lock": {
28434
28631
  capName: "lock-control",
28435
28632
  capScope: "device",
@@ -31310,6 +31507,12 @@ Object.freeze({
31310
31507
  addonId: null,
31311
31508
  access: "create"
31312
31509
  },
31510
+ "terminalSession.updateInstance": {
31511
+ capName: "terminal-session",
31512
+ capScope: "system",
31513
+ addonId: null,
31514
+ access: "create"
31515
+ },
31313
31516
  "terminalSession.writeInput": {
31314
31517
  capName: "terminal-session",
31315
31518
  capScope: "system",
@@ -33797,6 +34000,35 @@ Object.freeze(Object.fromEntries([{
33797
34000
  }]
33798
34001
  }].map((s) => [s.stepId, s.defaultModelId])));
33799
34002
  string().min(1);
34003
+ var CLUSTER_STEP_SETTING_FIELDS = [{
34004
+ stepId: "face-embedding",
34005
+ key: "minLandmarkFaceSize",
34006
+ label: "Min face size for recognition (detection px)",
34007
+ 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.",
34008
+ type: "slider",
34009
+ min: 0,
34010
+ max: 64,
34011
+ step: 2,
34012
+ default: 24
34013
+ }];
34014
+ function clusterStepSettingKey(stepId, fieldKey) {
34015
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
34016
+ }
34017
+ var ClusterSettingNumberSchema = number().finite();
34018
+ function readClusterStepSettings(config) {
34019
+ const out = {};
34020
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
34021
+ const parsed = ClusterSettingNumberSchema.safeParse(config[clusterStepSettingKey(field.stepId, field.key)]);
34022
+ const value = parsed.success ? parsed.data : field.default;
34023
+ const existing = out[field.stepId] ?? {};
34024
+ out[field.stepId] = {
34025
+ ...existing,
34026
+ [field.key]: value
34027
+ };
34028
+ }
34029
+ return out;
34030
+ }
34031
+ readClusterStepSettings({});
33800
34032
  object({
33801
34033
  /**
33802
34034
  * Fraction of the box's own size added on EACH side before cutting.
@@ -8003,6 +8003,15 @@ var LabelDefinitionSchema = object({
8003
8003
  description: string().optional(),
8004
8004
  icon: string().optional()
8005
8005
  });
8006
+ var ClassMapDefinitionSchema = object({
8007
+ mapping: record(string(), _enum([
8008
+ "person",
8009
+ "vehicle",
8010
+ "animal",
8011
+ "package"
8012
+ ])),
8013
+ preserveOriginal: boolean()
8014
+ });
8006
8015
  var MODEL_FORMATS = [
8007
8016
  "onnx",
8008
8017
  "coreml",
@@ -8181,7 +8190,13 @@ var ModelCatalogEntrySchema = object({
8181
8190
  * `id` stays the source of truth for resolution/download/persistence; grouping
8182
8191
  * is a presentation overlay resolved back to an `id`.
8183
8192
  */
8184
- group: ModelVariantGroupSchema.optional()
8193
+ group: ModelVariantGroupSchema.optional(),
8194
+ /**
8195
+ * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
8196
+ * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8197
+ * labels already ARE the CamStack macros (Scrypted identity map).
8198
+ */
8199
+ classMap: ClassMapDefinitionSchema.optional()
8185
8200
  });
8186
8201
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8187
8202
  format: literal("openvino"),
@@ -8210,7 +8225,8 @@ var ModelConvertMetadataSchema = object({
8210
8225
  "ocr",
8211
8226
  "segmentation"
8212
8227
  ]),
8213
- faceAlignment: boolean().optional()
8228
+ faceAlignment: boolean().optional(),
8229
+ classMap: ClassMapDefinitionSchema.optional()
8214
8230
  });
8215
8231
  var ConvertResultSchema = object({
8216
8232
  entry: ModelCatalogEntrySchema,
@@ -17240,6 +17256,33 @@ var NativeCropRefSchema = object({
17240
17256
  h: number()
17241
17257
  })
17242
17258
  });
17259
+ object({
17260
+ crop: object({
17261
+ left: number(),
17262
+ top: number(),
17263
+ width: number().positive(),
17264
+ height: number().positive()
17265
+ }).optional(),
17266
+ content: object({
17267
+ width: number().int().positive(),
17268
+ height: number().int().positive()
17269
+ }),
17270
+ fit: _enum(["stretch", "contain"]),
17271
+ format: _enum([
17272
+ "rgb",
17273
+ "gray",
17274
+ "jpeg"
17275
+ ])
17276
+ });
17277
+ var FrameRefSchema = object({
17278
+ registryId: string().min(1),
17279
+ id: string().min(1),
17280
+ width: number().int().positive(),
17281
+ height: number().int().positive(),
17282
+ format: _enum(["rgb", "gray"]),
17283
+ timestamp: number(),
17284
+ capturedAt: number().optional()
17285
+ });
17243
17286
  var ModelFormatSchema$1 = _enum([
17244
17287
  "onnx",
17245
17288
  "coreml",
@@ -17484,6 +17527,12 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
17484
17527
  steps: array(PipelineStepInputSchema).min(1),
17485
17528
  frame: FrameInputSchema.optional(),
17486
17529
  /**
17530
+ * Process-local lazy frame. Valid only when caller and provider resolve
17531
+ * in the same execution-group process; split/cross-node callers use
17532
+ * `frame`/`image` inline compatibility instead.
17533
+ */
17534
+ frameRef: FrameRefSchema.optional(),
17535
+ /**
17487
17536
  * CB5 shm passthrough — a `FrameHandle` naming the same ring slot
17488
17537
  * the decoded pixels live in. One more member of the one-of
17489
17538
  * frame/frameHandle/image/imageBase64/referenceImage group.
@@ -17739,7 +17788,10 @@ var NativeCropResultSchema = object({
17739
17788
  * Which source served this crop, so a quality-sensitive consumer (the native
17740
17789
  * `keyFrame`) can reject a degraded fallback:
17741
17790
  * - `native` — cut from the decode worker's retained NATIVE surface (the
17742
- * quality path).
17791
+ * quality path). A subject-tile serve is also native-resolution and stays
17792
+ * `native` here: the public enum cannot name `tile` without a breaking cap
17793
+ * change. Runner telemetry distinguishes lease vs tile via `source` on the
17794
+ * internal crop result (`nativeHits` vs `tileHits`).
17743
17795
  * - `ram-fullframe` — the native surface MISSED but the request was full-frame,
17744
17796
  * so the ≤640 RAM `RetainedFrameStore` served it (honest lower-res; legit for
17745
17797
  * the blank-frame guard / 640-snapshot resolve, NOT for the clean keyFrame).
@@ -18230,12 +18282,41 @@ var RunnerLocalLoadSchema = object({
18230
18282
  * legacy `OrchestratorMetricsSchema` shape so existing dashboards keep
18231
18283
  * working unchanged when they switch to reading from the runner cap.
18232
18284
  */
18285
+ var FrameLazyCountersSchema = object({
18286
+ framesDecoded: number(),
18287
+ framesAdmitted: number(),
18288
+ framesDroppedPixelFree: number(),
18289
+ viewsMaterialized: number(),
18290
+ viewsSkipped: number(),
18291
+ workerToRunnerBytes: number(),
18292
+ runnerToPoolRawBytes: number(),
18293
+ runnerToPoolJpegBytes: number(),
18294
+ onDemandFullFrameRequests: number(),
18295
+ onDemandCropRequests: number(),
18296
+ nativeHits: number(),
18297
+ nativeMisses: number(),
18298
+ tileHits: number(),
18299
+ tileMisses: number(),
18300
+ fallbackHits: number(),
18301
+ fallbackMisses: number(),
18302
+ retainedWritesAvoided: number(),
18303
+ residentRefs: number(),
18304
+ residentBytes: number(),
18305
+ releases: number(),
18306
+ evictions: number(),
18307
+ staleMisses: number()
18308
+ });
18309
+ var FrameLazyMetricsSchema = object({
18310
+ node: FrameLazyCountersSchema,
18311
+ cameras: array(FrameLazyCountersSchema.extend({ deviceId: number() }))
18312
+ });
18233
18313
  var RunnerLocalMetricsSchema = object({
18234
18314
  nodeId: string(),
18235
18315
  activeCameras: number(),
18236
18316
  throttledCameras: number(),
18237
18317
  avgInferenceTimeMs: number(),
18238
- queueDepth: number()
18318
+ queueDepth: number(),
18319
+ frameLazy: FrameLazyMetricsSchema.optional()
18239
18320
  });
18240
18321
  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({
18241
18322
  handle: FrameHandleSchema,
@@ -19535,6 +19616,9 @@ method(_void(), ProviderInfoSchema), method(object({ config: record(string(), un
19535
19616
  location: StorageLocationSchema,
19536
19617
  relativePath: string()
19537
19618
  }), _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" });
19619
+ /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
19620
+ var ProfileSettingsSchemaBridge = unknown().nullable();
19621
+ var ProfileSettingsBagSchema = record(string(), unknown());
19538
19622
  /**
19539
19623
  * A live terminal session hosted by the provider addon. Output and input do
19540
19624
  * NOT flow through the capability — they use the addon data plane
@@ -19564,7 +19648,14 @@ var TerminalSessionInfoSchema = object({
19564
19648
  var TerminalProfileInfoSchema = object({
19565
19649
  profileId: string(),
19566
19650
  label: string(),
19567
- description: string().optional()
19651
+ description: string().optional(),
19652
+ /** Spawn defaults the instance form copies on create. */
19653
+ executable: string().optional(),
19654
+ args: array(string()).readonly().optional(),
19655
+ cwd: string().optional(),
19656
+ environment: array(string()).readonly().optional(),
19657
+ /** ConfigUISchema for instance knobs, or null when the profile has none. */
19658
+ settingsSchema: ProfileSettingsSchemaBridge.optional()
19568
19659
  });
19569
19660
  /**
19570
19661
  * A durable operator-created Terminal instance. Profiles are templates; only
@@ -19577,7 +19668,12 @@ var TerminalInstanceInfoSchema = object({
19577
19668
  profileId: string(),
19578
19669
  profileLabel: string(),
19579
19670
  name: string(),
19580
- enabled: boolean()
19671
+ enabled: boolean(),
19672
+ executable: string(),
19673
+ args: array(string()).readonly(),
19674
+ cwd: string(),
19675
+ environment: array(string()).readonly(),
19676
+ profileSettings: ProfileSettingsBagSchema
19581
19677
  });
19582
19678
  var TerminalLegacyCameraSchema = object({
19583
19679
  stableId: string(),
@@ -19607,7 +19703,23 @@ var TerminalOutputBatchSchema = object({
19607
19703
  method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }), method(_void(), array(TerminalInstanceInfoSchema).readonly(), { auth: "admin" }), method(object({
19608
19704
  targetNodeId: string().min(1),
19609
19705
  profileId: string().min(1),
19610
- name: string().trim().min(1).max(160).optional()
19706
+ name: string().trim().min(1).max(160).optional(),
19707
+ executable: string().max(1024).optional(),
19708
+ args: array(string().max(2048)).max(64).optional(),
19709
+ cwd: string().max(1024).optional(),
19710
+ environment: array(string().max(4096)).max(64).optional(),
19711
+ profileSettings: ProfileSettingsBagSchema.optional()
19712
+ }), TerminalInstanceInfoSchema, {
19713
+ kind: "mutation",
19714
+ auth: "admin"
19715
+ }), method(object({
19716
+ instanceId: string().min(1),
19717
+ name: string().trim().min(1).max(160).optional(),
19718
+ executable: string().max(1024).optional(),
19719
+ args: array(string().max(2048)).max(64).optional(),
19720
+ cwd: string().max(1024).optional(),
19721
+ environment: array(string().max(4096)).max(64).optional(),
19722
+ profileSettings: ProfileSettingsBagSchema.optional()
19611
19723
  }), TerminalInstanceInfoSchema, {
19612
19724
  kind: "mutation",
19613
19725
  auth: "admin"
@@ -19629,7 +19741,11 @@ method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }),
19629
19741
  }), method(_void(), array(TerminalSessionInfoSchema).readonly(), { auth: "admin" }), method(object({
19630
19742
  profileId: string(),
19631
19743
  cols: number().int().positive(),
19632
- rows: number().int().positive()
19744
+ rows: number().int().positive(),
19745
+ executable: string().max(1024).optional(),
19746
+ args: array(string().max(2048)).max(64).optional(),
19747
+ cwd: string().max(1024).optional(),
19748
+ environment: array(string().max(4096)).max(64).optional()
19633
19749
  }), TerminalSessionInfoSchema, {
19634
19750
  kind: "mutation",
19635
19751
  auth: "admin"
@@ -22434,10 +22550,10 @@ DeviceType.LawnMower, method(object({ deviceId: number().int().nonnegative() }),
22434
22550
  *
22435
22551
  * • The SDK (mobile / web client) consumes `getConnectionEndpoints()`
22436
22552
  * to receive an ordered list of candidate base URLs it should race
22437
- * on connect — LAN IPv4 first (lowest latency when on same network),
22438
- * then public hostname (if a tunnel is up), then IPv6. The SDK can
22439
- * race them with short timeouts and stick with the winner for the
22440
- * session.
22553
+ * on connect — LAN IPv4 and stable LAN IPv6 first (lowest latency
22554
+ * when on the same network), then public hostname (if a tunnel is
22555
+ * up). The SDK can race them with short timeouts and stick with the
22556
+ * winner for the session.
22441
22557
  *
22442
22558
  * Why hub-only: agents are not directly addressable by the operator's
22443
22559
  * clients — they reverse-connect to the hub. Exposing their interfaces
@@ -22592,6 +22708,17 @@ var NotificationEndpointSchema = object({
22592
22708
  /** What the ranking currently resolves to (null when nothing is reachable). */
22593
22709
  resolved: string().nullable()
22594
22710
  });
22711
+ /**
22712
+ * The URLs the SDK / viewer should race for API access. `baseUrls` empty =
22713
+ * AUTO (every LAN IPv4 + the public tunnel). `resolved` is what that choice
22714
+ * currently expands to, so the UI can show the effective set either way.
22715
+ */
22716
+ var ViewerEndpointsSchema = object({
22717
+ /** The operator's explicit race set, or empty for AUTO. */
22718
+ baseUrls: array(string()).readonly(),
22719
+ /** What the ranking currently resolves to (may be empty if nothing is up). */
22720
+ resolved: array(string()).readonly()
22721
+ });
22595
22722
  var AllowedAddressesSchema = object({
22596
22723
  /**
22597
22724
  * Allowlist of interface addresses operators have explicitly opted
@@ -22600,6 +22727,20 @@ var AllowedAddressesSchema = object({
22600
22727
  * Network Addresses admin page and persisted by the addon.
22601
22728
  */
22602
22729
  addresses: array(string()).readonly() });
22730
+ var TlsStatusSchema = object({
22731
+ mode: _enum([
22732
+ "generated",
22733
+ "uploaded",
22734
+ "disabled"
22735
+ ]),
22736
+ leafFingerprintSha256: string().nullable(),
22737
+ caFingerprintSha256: string().nullable(),
22738
+ validTo: string().nullable(),
22739
+ sans: array(string()),
22740
+ caCertPem: string().nullable(),
22741
+ reissueError: string().nullable(),
22742
+ restartRequired: boolean()
22743
+ });
22603
22744
  method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(object({
22604
22745
  /**
22605
22746
  * LEGACY HINT — do not send from new code. Kept optional so clients
@@ -22609,17 +22750,31 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
22609
22750
  */
22610
22751
  port: number().int().min(1).max(65535).optional(),
22611
22752
  /** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
22612
- * candidate. Default `true`. */
22753
+ * candidate. Default `false` — loopback is not a client route. */
22613
22754
  includeLoopback: boolean().optional(),
22614
- /** Skip IPv6 entries. Some legacy clients can't parse them.
22615
- * Default `false`. */
22755
+ /** Skip IPv6 entries. Default `false` the palette includes stable
22756
+ * LAN IPv6 (ICE/WebRTC uses dual-stack regardless). Pass `true` to
22757
+ * hide them. The viewer HTTP/WS race is `getViewerEndpoints`. */
22616
22758
  ipv4Only: boolean().optional(),
22617
22759
  /** Scheme to emit for LAN/loopback URLs. Default `'http'`.
22618
22760
  * Pass `'https'` when the caller is itself loaded over HTTPS
22619
22761
  * to avoid mixed-content blocks in the browser. The public
22620
22762
  * tunnel always emits `https://` regardless. */
22621
22763
  scheme: _enum(["http", "https"]).optional()
22622
- }), 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" });
22764
+ }), 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, {
22765
+ kind: "mutation",
22766
+ auth: "admin"
22767
+ }), method(object({
22768
+ certPem: string().min(1),
22769
+ keyPem: string().min(1),
22770
+ caPem: string().optional()
22771
+ }), TlsStatusSchema, {
22772
+ kind: "mutation",
22773
+ auth: "admin"
22774
+ }), method(_void(), object({ pem: string() })), method(_void(), TlsStatusSchema, {
22775
+ kind: "mutation",
22776
+ auth: "admin"
22777
+ });
22623
22778
  object({
22624
22779
  /** Lifecycle state of the lock. `jammed` means the motor reported
22625
22780
  * failure to reach the target — operator intervention required. */
@@ -28382,6 +28537,12 @@ Object.freeze({
28382
28537
  addonId: null,
28383
28538
  access: "create"
28384
28539
  },
28540
+ "localNetwork.downloadCa": {
28541
+ capName: "local-network",
28542
+ capScope: "system",
28543
+ addonId: null,
28544
+ access: "view"
28545
+ },
28385
28546
  "localNetwork.getAllowedAddresses": {
28386
28547
  capName: "local-network",
28387
28548
  capScope: "system",
@@ -28406,18 +28567,42 @@ Object.freeze({
28406
28567
  addonId: null,
28407
28568
  access: "view"
28408
28569
  },
28570
+ "localNetwork.getTlsStatus": {
28571
+ capName: "local-network",
28572
+ capScope: "system",
28573
+ addonId: null,
28574
+ access: "view"
28575
+ },
28576
+ "localNetwork.getViewerEndpoints": {
28577
+ capName: "local-network",
28578
+ capScope: "system",
28579
+ addonId: null,
28580
+ access: "view"
28581
+ },
28409
28582
  "localNetwork.list": {
28410
28583
  capName: "local-network",
28411
28584
  capScope: "system",
28412
28585
  addonId: null,
28413
28586
  access: "view"
28414
28587
  },
28588
+ "localNetwork.regenerateCertificate": {
28589
+ capName: "local-network",
28590
+ capScope: "system",
28591
+ addonId: null,
28592
+ access: "create"
28593
+ },
28415
28594
  "localNetwork.resetAllowlistToBestMatch": {
28416
28595
  capName: "local-network",
28417
28596
  capScope: "system",
28418
28597
  addonId: null,
28419
28598
  access: "delete"
28420
28599
  },
28600
+ "localNetwork.revertToGeneratedCertificate": {
28601
+ capName: "local-network",
28602
+ capScope: "system",
28603
+ addonId: null,
28604
+ access: "create"
28605
+ },
28421
28606
  "localNetwork.setAllowedAddresses": {
28422
28607
  capName: "local-network",
28423
28608
  capScope: "system",
@@ -28430,6 +28615,18 @@ Object.freeze({
28430
28615
  addonId: null,
28431
28616
  access: "create"
28432
28617
  },
28618
+ "localNetwork.setViewerEndpoints": {
28619
+ capName: "local-network",
28620
+ capScope: "system",
28621
+ addonId: null,
28622
+ access: "create"
28623
+ },
28624
+ "localNetwork.uploadCertificate": {
28625
+ capName: "local-network",
28626
+ capScope: "system",
28627
+ addonId: null,
28628
+ access: "create"
28629
+ },
28433
28630
  "lockControl.lock": {
28434
28631
  capName: "lock-control",
28435
28632
  capScope: "device",
@@ -31310,6 +31507,12 @@ Object.freeze({
31310
31507
  addonId: null,
31311
31508
  access: "create"
31312
31509
  },
31510
+ "terminalSession.updateInstance": {
31511
+ capName: "terminal-session",
31512
+ capScope: "system",
31513
+ addonId: null,
31514
+ access: "create"
31515
+ },
31313
31516
  "terminalSession.writeInput": {
31314
31517
  capName: "terminal-session",
31315
31518
  capScope: "system",
@@ -33797,6 +34000,35 @@ Object.freeze(Object.fromEntries([{
33797
34000
  }]
33798
34001
  }].map((s) => [s.stepId, s.defaultModelId])));
33799
34002
  string().min(1);
34003
+ var CLUSTER_STEP_SETTING_FIELDS = [{
34004
+ stepId: "face-embedding",
34005
+ key: "minLandmarkFaceSize",
34006
+ label: "Min face size for recognition (detection px)",
34007
+ 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.",
34008
+ type: "slider",
34009
+ min: 0,
34010
+ max: 64,
34011
+ step: 2,
34012
+ default: 24
34013
+ }];
34014
+ function clusterStepSettingKey(stepId, fieldKey) {
34015
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
34016
+ }
34017
+ var ClusterSettingNumberSchema = number().finite();
34018
+ function readClusterStepSettings(config) {
34019
+ const out = {};
34020
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
34021
+ const parsed = ClusterSettingNumberSchema.safeParse(config[clusterStepSettingKey(field.stepId, field.key)]);
34022
+ const value = parsed.success ? parsed.data : field.default;
34023
+ const existing = out[field.stepId] ?? {};
34024
+ out[field.stepId] = {
34025
+ ...existing,
34026
+ [field.key]: value
34027
+ };
34028
+ }
34029
+ return out;
34030
+ }
34031
+ readClusterStepSettings({});
33800
34032
  object({
33801
34033
  /**
33802
34034
  * Fraction of the box's own size added on EACH side before cutting.
@@ -21,7 +21,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
21
21
  enumerable: true
22
22
  }) : target, mod));
23
23
  //#endregion
24
- const require_dist = require("../dist-bN2ruooH.js");
24
+ const require_dist = require("../dist-CbCaiEpw.js");
25
25
  let node_crypto = require("node:crypto");
26
26
  let node_path = require("node:path");
27
27
  node_path = __toESM(node_path);
@@ -1,4 +1,4 @@
1
- import { a as BaseAddon, c as boolean, d as number, f as object, m as EventCategory, n as defineCustomActions, o as _enum, p as string, r as networkAccessCapability, s as array, t as customAction, u as literal } from "../dist-C55lXXNr.mjs";
1
+ import { a as BaseAddon, c as boolean, d as number, f as object, m as EventCategory, n as defineCustomActions, o as _enum, p as string, r as networkAccessCapability, s as array, t as customAction, u as literal } from "../dist-DnohT9Id.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import * as path from "node:path";
4
4
  import { spawn } from "node:child_process";
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_dist = require("../dist-bN2ruooH.js");
2
+ const require_dist = require("../dist-CbCaiEpw.js");
3
3
  //#region src/turn/cloudflare-turn.ts
4
4
  /**
5
5
  * Cloudflare returns ICE servers in several flavours depending on which
@@ -1,4 +1,4 @@
1
- import { a as BaseAddon, c as boolean, d as number, f as object, i as turnProviderCapability, l as discriminatedUnion, n as defineCustomActions, p as string, t as customAction, u as literal } from "../dist-C55lXXNr.mjs";
1
+ import { a as BaseAddon, c as boolean, d as number, f as object, i as turnProviderCapability, l as discriminatedUnion, n as defineCustomActions, p as string, t as customAction, u as literal } from "../dist-DnohT9Id.mjs";
2
2
  //#region src/turn/cloudflare-turn.ts
3
3
  /**
4
4
  * Cloudflare returns ICE servers in several flavours depending on which
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-cloudflare",
3
- "version": "1.2.25",
3
+ "version": "1.2.26",
4
4
  "description": "Cloudflare bundle — Tunnel (network-access) + TURN relay (turn-provider). Multi-entry npm package shipping 2 addons under a single bundle.",
5
5
  "keywords": [
6
6
  "camstack",