camstack 1.2.38 → 1.2.40

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.
@@ -14522,7 +14522,7 @@ function date4(params) {
14522
14522
  // ../../node_modules/zod/v4/classic/external.js
14523
14523
  config(en_default());
14524
14524
 
14525
- // ../types/dist/sleep-B8EIZt4h.mjs
14525
+ // ../types/dist/sleep-Cs9MWLcT.mjs
14526
14526
  var WELL_KNOWN_TABS = [
14527
14527
  {
14528
14528
  id: "overview",
@@ -15926,6 +15926,16 @@ var LabelDefinitionSchema = external_exports.object({
15926
15926
  description: external_exports.string().optional(),
15927
15927
  icon: external_exports.string().optional()
15928
15928
  });
15929
+ var CLASS_MAP_MACRO_TARGETS = [
15930
+ "person",
15931
+ "vehicle",
15932
+ "animal",
15933
+ "package"
15934
+ ];
15935
+ var ClassMapDefinitionSchema = external_exports.object({
15936
+ mapping: external_exports.record(external_exports.string(), external_exports.enum(CLASS_MAP_MACRO_TARGETS)),
15937
+ preserveOriginal: external_exports.boolean()
15938
+ });
15929
15939
  var MODEL_FORMATS = [
15930
15940
  "onnx",
15931
15941
  "coreml",
@@ -15979,6 +15989,13 @@ var ModelVariantGroupSchema = external_exports.object({
15979
15989
  */
15980
15990
  resolution: external_exports.number().int().positive().optional()
15981
15991
  });
15992
+ var MODEL_PROVIDER_IDS = [
15993
+ "camstack",
15994
+ "frigate",
15995
+ "scrypted",
15996
+ "custom"
15997
+ ];
15998
+ var ModelProviderIdSchema = external_exports.enum(MODEL_PROVIDER_IDS);
15982
15999
  var ModelCatalogEntrySchema = external_exports.object({
15983
16000
  id: external_exports.string(),
15984
16001
  name: external_exports.string(),
@@ -16074,7 +16091,19 @@ var ModelCatalogEntrySchema = external_exports.object({
16074
16091
  * `id` stays the source of truth for resolution/download/persistence; grouping
16075
16092
  * is a presentation overlay resolved back to an `id`.
16076
16093
  */
16077
- group: ModelVariantGroupSchema.optional()
16094
+ group: ModelVariantGroupSchema.optional(),
16095
+ /**
16096
+ * Catalog source for the pipeline stepper's provider-first picker. Absent on
16097
+ * built-in CamStack entries (treated as `camstack`) and on registry rows
16098
+ * persisted before this field existed (`inferModelProvider` fills those).
16099
+ */
16100
+ provider: ModelProviderIdSchema.optional(),
16101
+ /**
16102
+ * Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
16103
+ * applies (Frigate / COCO public catalog). Set on a custom model whose raw
16104
+ * labels already ARE the CamStack macros (Scrypted identity map).
16105
+ */
16106
+ classMap: ClassMapDefinitionSchema.optional()
16078
16107
  });
16079
16108
  var ConvertTargetSchema = external_exports.discriminatedUnion("format", [external_exports.object({
16080
16109
  format: external_exports.literal("openvino"),
@@ -16103,7 +16132,8 @@ var ModelConvertMetadataSchema = external_exports.object({
16103
16132
  "ocr",
16104
16133
  "segmentation"
16105
16134
  ]),
16106
- faceAlignment: external_exports.boolean().optional()
16135
+ faceAlignment: external_exports.boolean().optional(),
16136
+ classMap: ClassMapDefinitionSchema.optional()
16107
16137
  });
16108
16138
  var ConvertArtifactSchema = external_exports.object({
16109
16139
  format: external_exports.enum(MODEL_FORMATS),
@@ -22740,14 +22770,22 @@ var NcOccupancyConditionSchema = external_exports.object({
22740
22770
  sustainSeconds: external_exports.number().int().min(0).max(3600).default(15)
22741
22771
  });
22742
22772
  var NcAudioConditionSchema = external_exports.object({
22743
- /** LABEL MODE: audio macro labels. Present ⇒ fires on the first labelled frame. */
22773
+ /** LABEL MODE: audio macro labels. Present ⇒ count-in-window confirm. */
22744
22774
  labels: external_exports.array(external_exports.string().min(1)).min(1).optional(),
22745
22775
  /** LEVEL MODE: floor in dBFS (negative-going, `0` = full scale). */
22746
22776
  dbThreshold: external_exports.number().min(-96).max(0).optional(),
22747
22777
  /** LEVEL MODE ONLY: percentage of the window's samples that must be hits (1–100). */
22748
22778
  hitPercent: external_exports.number().int().min(1).max(100).default(60),
22749
22779
  /** LEVEL MODE ONLY: length of the sampling window in seconds. */
22750
- samplingSeconds: external_exports.number().int().min(1).max(300).default(10)
22780
+ samplingSeconds: external_exports.number().int().min(1).max(300).default(10),
22781
+ /**
22782
+ * LABEL MODE: how many labelled frames must land inside
22783
+ * {@link NcAudioConditionSchema.shape.confirmWindowSec} before dispatch.
22784
+ * Absent ⇒ 2 (the matcher default). `1` is first-frame fire.
22785
+ */
22786
+ confirmHits: external_exports.number().int().min(1).max(20).optional(),
22787
+ /** LABEL MODE: the window those frames must share, in seconds. Absent ⇒ 5. */
22788
+ confirmWindowSec: external_exports.number().int().min(1).max(60).optional()
22751
22789
  });
22752
22790
  var NcCrossingSchema = external_exports.enum([
22753
22791
  "enter",
@@ -24565,6 +24603,46 @@ var RecentTracksPageSchema = external_exports.object({
24565
24603
  /** Cursor for the next page, or null when this page is the last. */
24566
24604
  nextCursor: external_exports.string().nullable()
24567
24605
  });
24606
+ var LIST_GROUPS_DEFAULT_LIMIT = 40;
24607
+ var LIST_GROUPS_MAX_LIMIT = 100;
24608
+ var AnalyticsGroupRecordSchema = external_exports.object({
24609
+ id: external_exports.string(),
24610
+ deviceId: external_exports.number().int(),
24611
+ openedAt: external_exports.number().int(),
24612
+ closedAt: external_exports.number().int(),
24613
+ timestamp: external_exports.number().int(),
24614
+ memberCount: external_exports.number().int(),
24615
+ memberTrackIds: external_exports.array(external_exports.string()).readonly(),
24616
+ className: external_exports.string(),
24617
+ classes: external_exports.array(external_exports.string()).readonly(),
24618
+ /** Relative event-media path, or null when the group has no picture yet. */
24619
+ mediaUrl: external_exports.string().nullable(),
24620
+ singleton: external_exports.boolean()
24621
+ });
24622
+ var AnalyticsGroupMemberSchema = external_exports.object({
24623
+ trackId: external_exports.string(),
24624
+ deviceId: external_exports.number().int(),
24625
+ className: external_exports.string(),
24626
+ firstSeen: external_exports.number().int(),
24627
+ lastSeen: external_exports.number().int(),
24628
+ mediaUrl: external_exports.string().nullable()
24629
+ });
24630
+ var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: external_exports.array(AnalyticsGroupMemberSchema).readonly() });
24631
+ var ListGroupsQueryInput = external_exports.object({
24632
+ /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
24633
+ deviceIds: external_exports.array(external_exports.number()),
24634
+ /** Window lower bound on `closedAt` (inclusive). */
24635
+ since: external_exports.number().optional(),
24636
+ /** Window upper bound on `openedAt` (inclusive). */
24637
+ until: external_exports.number().optional(),
24638
+ limit: external_exports.number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
24639
+ /** Opaque continuation cursor from a previous page's `nextCursor`. */
24640
+ cursor: external_exports.string().optional()
24641
+ });
24642
+ var ListGroupsPageSchema = external_exports.object({
24643
+ groups: external_exports.array(AnalyticsGroupRecordSchema).readonly(),
24644
+ nextCursor: external_exports.string().nullable()
24645
+ });
24568
24646
  var KeyEventQueryInput = external_exports.object({
24569
24647
  deviceId: external_exports.number(),
24570
24648
  /** Window lower bound (track firstSeen ≥ since). */
@@ -24640,7 +24718,9 @@ var TrackCascadeCountsSchema = external_exports.object({
24640
24718
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
24641
24719
  plates: external_exports.number().int(),
24642
24720
  /** Per-track CLIP search vectors removed (best-effort). */
24643
- embeddings: external_exports.number().int()
24721
+ embeddings: external_exports.number().int(),
24722
+ /** Group membership + group rows removed with their last member (best-effort). */
24723
+ groups: external_exports.number().int()
24644
24724
  });
24645
24725
  var DiskReconcileCountsSchema = external_exports.object({
24646
24726
  mediaDropped: external_exports.number().int(),
@@ -24782,6 +24862,16 @@ var pipelineAnalyticsCapability = {
24782
24862
  * are not included (same contract as `listTracks`).
24783
24863
  */
24784
24864
  listRecentTracks: method(RecentTracksQueryInput, RecentTracksPageSchema),
24865
+ /**
24866
+ * Batched co-moving group listing — the Groups feed. Same merge/cursor
24867
+ * contract as {@link listRecentTracks}. A group is a sealed partition of
24868
+ * one session; `getGroup` is the detail with members.
24869
+ */
24870
+ listGroups: method(ListGroupsQueryInput, ListGroupsPageSchema),
24871
+ getGroup: method(external_exports.object({
24872
+ deviceId: external_exports.number(),
24873
+ groupId: external_exports.string().min(1)
24874
+ }), AnalyticsGroupDetailSchema.nullable()),
24785
24875
  clearTracks: method(external_exports.object({ deviceId: external_exports.number() }), external_exports.void(), {
24786
24876
  kind: "mutation",
24787
24877
  auth: "admin"
@@ -25370,6 +25460,33 @@ var NativeCropRefSchema = external_exports.object({
25370
25460
  h: external_exports.number()
25371
25461
  })
25372
25462
  });
25463
+ external_exports.object({
25464
+ crop: external_exports.object({
25465
+ left: external_exports.number(),
25466
+ top: external_exports.number(),
25467
+ width: external_exports.number().positive(),
25468
+ height: external_exports.number().positive()
25469
+ }).optional(),
25470
+ content: external_exports.object({
25471
+ width: external_exports.number().int().positive(),
25472
+ height: external_exports.number().int().positive()
25473
+ }),
25474
+ fit: external_exports.enum(["stretch", "contain"]),
25475
+ format: external_exports.enum([
25476
+ "rgb",
25477
+ "gray",
25478
+ "jpeg"
25479
+ ])
25480
+ });
25481
+ var FrameRefSchema = external_exports.object({
25482
+ registryId: external_exports.string().min(1),
25483
+ id: external_exports.string().min(1),
25484
+ width: external_exports.number().int().positive(),
25485
+ height: external_exports.number().int().positive(),
25486
+ format: external_exports.enum(["rgb", "gray"]),
25487
+ timestamp: external_exports.number(),
25488
+ capturedAt: external_exports.number().optional()
25489
+ });
25373
25490
  var ModelFormatSchema$1 = external_exports.enum([
25374
25491
  "onnx",
25375
25492
  "coreml",
@@ -25436,7 +25553,8 @@ var PipelineModelOptionSchema = external_exports.object({
25436
25553
  sizeMB: external_exports.number()
25437
25554
  })),
25438
25555
  group: ModelVariantGroupSchema.optional(),
25439
- legacy: external_exports.boolean().optional()
25556
+ legacy: external_exports.boolean().optional(),
25557
+ provider: ModelProviderIdSchema.optional()
25440
25558
  });
25441
25559
  var ConfigFieldBridge = external_exports.custom();
25442
25560
  var PipelineAddonSchemaSchema = external_exports.object({
@@ -25669,7 +25787,7 @@ var pipelineExecutorCapability = {
25669
25787
  * legacy call shape used by existing benchmark code; once all
25670
25788
  * callers pass it explicitly we make it required.
25671
25789
  *
25672
- * Exactly one of `frame`, `frameHandle`, `imageBase64`,
25790
+ * Exactly one of `frame`, `frameRef`, `frameHandle`, `imageBase64`,
25673
25791
  * `referenceImage` must be provided:
25674
25792
  * - `frame`: runtime dispatch path (runner → decoded broker frame).
25675
25793
  * Carries the raw buffer, dimensions, and format; the executor
@@ -25691,6 +25809,12 @@ var pipelineExecutorCapability = {
25691
25809
  steps: external_exports.array(PipelineStepInputSchema).min(1),
25692
25810
  frame: FrameInputSchema.optional(),
25693
25811
  /**
25812
+ * Process-local lazy frame. Valid only when caller and provider resolve
25813
+ * in the same execution-group process; split/cross-node callers use
25814
+ * `frame`/`image` inline compatibility instead.
25815
+ */
25816
+ frameRef: FrameRefSchema.optional(),
25817
+ /**
25694
25818
  * CB5 shm passthrough — a `FrameHandle` naming the same ring slot
25695
25819
  * the decoded pixels live in. One more member of the one-of
25696
25820
  * frame/frameHandle/image/imageBase64/referenceImage group.
@@ -25993,7 +26117,10 @@ var NativeCropResultSchema = external_exports.object({
25993
26117
  * Which source served this crop, so a quality-sensitive consumer (the native
25994
26118
  * `keyFrame`) can reject a degraded fallback:
25995
26119
  * - `native` — cut from the decode worker's retained NATIVE surface (the
25996
- * quality path).
26120
+ * quality path). A subject-tile serve is also native-resolution and stays
26121
+ * `native` here: the public enum cannot name `tile` without a breaking cap
26122
+ * change. Runner telemetry distinguishes lease vs tile via `source` on the
26123
+ * internal crop result (`nativeHits` vs `tileHits`).
25997
26124
  * - `ram-fullframe` — the native surface MISSED but the request was full-frame,
25998
26125
  * so the ≤640 RAM `RetainedFrameStore` served it (honest lower-res; legit for
25999
26126
  * the blank-frame guard / 640-snapshot resolve, NOT for the clean keyFrame).
@@ -26496,12 +26623,41 @@ var RunnerLocalLoadSchema = external_exports.object({
26496
26623
  cpuCores: external_exports.number().optional()
26497
26624
  })
26498
26625
  });
26626
+ var FrameLazyCountersSchema = external_exports.object({
26627
+ framesDecoded: external_exports.number(),
26628
+ framesAdmitted: external_exports.number(),
26629
+ framesDroppedPixelFree: external_exports.number(),
26630
+ viewsMaterialized: external_exports.number(),
26631
+ viewsSkipped: external_exports.number(),
26632
+ workerToRunnerBytes: external_exports.number(),
26633
+ runnerToPoolRawBytes: external_exports.number(),
26634
+ runnerToPoolJpegBytes: external_exports.number(),
26635
+ onDemandFullFrameRequests: external_exports.number(),
26636
+ onDemandCropRequests: external_exports.number(),
26637
+ nativeHits: external_exports.number(),
26638
+ nativeMisses: external_exports.number(),
26639
+ tileHits: external_exports.number(),
26640
+ tileMisses: external_exports.number(),
26641
+ fallbackHits: external_exports.number(),
26642
+ fallbackMisses: external_exports.number(),
26643
+ retainedWritesAvoided: external_exports.number(),
26644
+ residentRefs: external_exports.number(),
26645
+ residentBytes: external_exports.number(),
26646
+ releases: external_exports.number(),
26647
+ evictions: external_exports.number(),
26648
+ staleMisses: external_exports.number()
26649
+ });
26650
+ var FrameLazyMetricsSchema = external_exports.object({
26651
+ node: FrameLazyCountersSchema,
26652
+ cameras: external_exports.array(FrameLazyCountersSchema.extend({ deviceId: external_exports.number() }))
26653
+ });
26499
26654
  var RunnerLocalMetricsSchema = external_exports.object({
26500
26655
  nodeId: external_exports.string(),
26501
26656
  activeCameras: external_exports.number(),
26502
26657
  throttledCameras: external_exports.number(),
26503
26658
  avgInferenceTimeMs: external_exports.number(),
26504
- queueDepth: external_exports.number()
26659
+ queueDepth: external_exports.number(),
26660
+ frameLazy: FrameLazyMetricsSchema.optional()
26505
26661
  });
26506
26662
  var pipelineRunnerCapability = {
26507
26663
  name: "pipeline-runner",
@@ -28288,6 +28444,8 @@ var storageProviderCapability = {
28288
28444
  endDownload: method(EndDownloadInputSchema, external_exports.void(), { kind: "mutation" })
28289
28445
  }
28290
28446
  };
28447
+ var ProfileSettingsSchemaBridge = external_exports.unknown().nullable();
28448
+ var ProfileSettingsBagSchema = external_exports.record(external_exports.string(), external_exports.unknown());
28291
28449
  var TerminalSessionInfoSchema = external_exports.object({
28292
28450
  /** Opaque session id minted by the provider on `openSession`. */
28293
28451
  sessionId: external_exports.string(),
@@ -28303,7 +28461,14 @@ var TerminalSessionInfoSchema = external_exports.object({
28303
28461
  var TerminalProfileInfoSchema = external_exports.object({
28304
28462
  profileId: external_exports.string(),
28305
28463
  label: external_exports.string(),
28306
- description: external_exports.string().optional()
28464
+ description: external_exports.string().optional(),
28465
+ /** Spawn defaults the instance form copies on create. */
28466
+ executable: external_exports.string().optional(),
28467
+ args: external_exports.array(external_exports.string()).readonly().optional(),
28468
+ cwd: external_exports.string().optional(),
28469
+ environment: external_exports.array(external_exports.string()).readonly().optional(),
28470
+ /** ConfigUISchema for instance knobs, or null when the profile has none. */
28471
+ settingsSchema: ProfileSettingsSchemaBridge.optional()
28307
28472
  });
28308
28473
  var TerminalInstanceInfoSchema = external_exports.object({
28309
28474
  instanceId: external_exports.string(),
@@ -28312,7 +28477,12 @@ var TerminalInstanceInfoSchema = external_exports.object({
28312
28477
  profileId: external_exports.string(),
28313
28478
  profileLabel: external_exports.string(),
28314
28479
  name: external_exports.string(),
28315
- enabled: external_exports.boolean()
28480
+ enabled: external_exports.boolean(),
28481
+ executable: external_exports.string(),
28482
+ args: external_exports.array(external_exports.string()).readonly(),
28483
+ cwd: external_exports.string(),
28484
+ environment: external_exports.array(external_exports.string()).readonly(),
28485
+ profileSettings: ProfileSettingsBagSchema
28316
28486
  });
28317
28487
  var TerminalLegacyCameraSchema = external_exports.object({
28318
28488
  stableId: external_exports.string(),
@@ -28351,7 +28521,24 @@ var terminalSessionCapability = {
28351
28521
  createInstance: method(external_exports.object({
28352
28522
  targetNodeId: external_exports.string().min(1),
28353
28523
  profileId: external_exports.string().min(1),
28354
- name: external_exports.string().trim().min(1).max(160).optional()
28524
+ name: external_exports.string().trim().min(1).max(160).optional(),
28525
+ executable: external_exports.string().max(1024).optional(),
28526
+ args: external_exports.array(external_exports.string().max(2048)).max(64).optional(),
28527
+ cwd: external_exports.string().max(1024).optional(),
28528
+ environment: external_exports.array(external_exports.string().max(4096)).max(64).optional(),
28529
+ profileSettings: ProfileSettingsBagSchema.optional()
28530
+ }), TerminalInstanceInfoSchema, {
28531
+ kind: "mutation",
28532
+ auth: "admin"
28533
+ }),
28534
+ updateInstance: method(external_exports.object({
28535
+ instanceId: external_exports.string().min(1),
28536
+ name: external_exports.string().trim().min(1).max(160).optional(),
28537
+ executable: external_exports.string().max(1024).optional(),
28538
+ args: external_exports.array(external_exports.string().max(2048)).max(64).optional(),
28539
+ cwd: external_exports.string().max(1024).optional(),
28540
+ environment: external_exports.array(external_exports.string().max(4096)).max(64).optional(),
28541
+ profileSettings: ProfileSettingsBagSchema.optional()
28355
28542
  }), TerminalInstanceInfoSchema, {
28356
28543
  kind: "mutation",
28357
28544
  auth: "admin"
@@ -28386,7 +28573,11 @@ var terminalSessionCapability = {
28386
28573
  openSession: method(external_exports.object({
28387
28574
  profileId: external_exports.string(),
28388
28575
  cols: external_exports.number().int().positive(),
28389
- rows: external_exports.number().int().positive()
28576
+ rows: external_exports.number().int().positive(),
28577
+ executable: external_exports.string().max(1024).optional(),
28578
+ args: external_exports.array(external_exports.string().max(2048)).max(64).optional(),
28579
+ cwd: external_exports.string().max(1024).optional(),
28580
+ environment: external_exports.array(external_exports.string().max(4096)).max(64).optional()
28390
28581
  }), TerminalSessionInfoSchema, {
28391
28582
  kind: "mutation",
28392
28583
  auth: "admin"
@@ -32109,6 +32300,12 @@ var NotificationEndpointSchema = external_exports.object({
32109
32300
  /** What the ranking currently resolves to (null when nothing is reachable). */
32110
32301
  resolved: external_exports.string().nullable()
32111
32302
  });
32303
+ var ViewerEndpointsSchema = external_exports.object({
32304
+ /** The operator's explicit race set, or empty for AUTO. */
32305
+ baseUrls: external_exports.array(external_exports.string()).readonly(),
32306
+ /** What the ranking currently resolves to (may be empty if nothing is up). */
32307
+ resolved: external_exports.array(external_exports.string()).readonly()
32308
+ });
32112
32309
  var AllowedAddressesSchema = external_exports.object({
32113
32310
  /**
32114
32311
  * Allowlist of interface addresses operators have explicitly opted
@@ -32118,6 +32315,20 @@ var AllowedAddressesSchema = external_exports.object({
32118
32315
  */
32119
32316
  addresses: external_exports.array(external_exports.string()).readonly()
32120
32317
  });
32318
+ var TlsStatusSchema = external_exports.object({
32319
+ mode: external_exports.enum([
32320
+ "generated",
32321
+ "uploaded",
32322
+ "disabled"
32323
+ ]),
32324
+ leafFingerprintSha256: external_exports.string().nullable(),
32325
+ caFingerprintSha256: external_exports.string().nullable(),
32326
+ validTo: external_exports.string().nullable(),
32327
+ sans: external_exports.array(external_exports.string()),
32328
+ caCertPem: external_exports.string().nullable(),
32329
+ reissueError: external_exports.string().nullable(),
32330
+ restartRequired: external_exports.boolean()
32331
+ });
32121
32332
  var localNetworkCapability = {
32122
32333
  name: "local-network",
32123
32334
  scope: "system",
@@ -32137,13 +32348,13 @@ var localNetworkCapability = {
32137
32348
  */
32138
32349
  getPreferred: method(external_exports.void(), PreferredSchema),
32139
32350
  /**
32140
- * Ordered candidate base URLs the SDK should try on connect.
32141
- * Includes LAN IPs (one per non-internal interface), the public
32142
- * tunnel hostname (when active), and loopback as a last-resort
32143
- * fallback. Filterable by `includeLoopback` / `ipv4Only`.
32144
- * Honours `getAllowedAddresses()` when set addresses outside
32145
- * the allowlist are dropped (the public tunnel + loopback are
32146
- * always included as escape hatches).
32351
+ * Ordered candidate base URLs (the palette the Network tab shows).
32352
+ * Includes LAN IPv4, stable LAN IPv6, the public tunnel, and mesh when
32353
+ * joined. Loopback is off by default. The SDK races the subset from
32354
+ * `getViewerEndpoints`, not this full list — IPv6 stays here because
32355
+ * WebRTC ICE gathers dual-stack regardless of the HTTP race. Honours
32356
+ * `getAllowedAddresses()` when set addresses outside the allowlist
32357
+ * are dropped (the public tunnel is still included as an escape hatch).
32147
32358
  *
32148
32359
  * **The port is the hub's, not the caller's** (D62 — a function's fact
32149
32360
  * belongs to whoever already owns it). This method used to take a `port`
@@ -32174,10 +32385,11 @@ var localNetworkCapability = {
32174
32385
  */
32175
32386
  port: external_exports.number().int().min(1).max(65535).optional(),
32176
32387
  /** Include `http(s)://127.0.0.1:<port>` as the lowest-priority
32177
- * candidate. Default `true`. */
32388
+ * candidate. Default `false` — loopback is not a client route. */
32178
32389
  includeLoopback: external_exports.boolean().optional(),
32179
- /** Skip IPv6 entries. Some legacy clients can't parse them.
32180
- * Default `false`. */
32390
+ /** Skip IPv6 entries. Default `false` the palette includes stable
32391
+ * LAN IPv6 (ICE/WebRTC uses dual-stack regardless). Pass `true` to
32392
+ * hide them. The viewer HTTP/WS race is `getViewerEndpoints`. */
32181
32393
  ipv4Only: external_exports.boolean().optional(),
32182
32394
  /** Scheme to emit for LAN/loopback URLs. Default `'http'`.
32183
32395
  * Pass `'https'` when the caller is itself loaded over HTTPS
@@ -32206,6 +32418,19 @@ var localNetworkCapability = {
32206
32418
  */
32207
32419
  setNotificationEndpoint: method(external_exports.object({ baseUrl: external_exports.string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }),
32208
32420
  /**
32421
+ * The endpoints the SDK / viewer races for API access. Empty `baseUrls`
32422
+ * means AUTO: every LAN IPv4 address plus the public tunnel, never IPv6,
32423
+ * never mesh, never loopback. `resolved` is that set (or the operator's
32424
+ * explicit subset) as it stands right now.
32425
+ */
32426
+ getViewerEndpoints: method(external_exports.void(), ViewerEndpointsSchema),
32427
+ /**
32428
+ * Replace the viewer race set. Empty `baseUrls` restores AUTO. Stored
32429
+ * verbatim (not indices) so a temporarily-down tunnel is not silently
32430
+ * dropped from the operator's choice.
32431
+ */
32432
+ setViewerEndpoints: method(external_exports.object({ baseUrls: external_exports.array(external_exports.string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }),
32433
+ /**
32209
32434
  * Read the operator's allowlist. Empty = "auto" (no filter). Used
32210
32435
  * by the admin UI's address selector to seed its checkbox state.
32211
32436
  */
@@ -32223,7 +32448,34 @@ var localNetworkCapability = {
32223
32448
  * when the operator wants to wipe their manual edits and start
32224
32449
  * over from the auto-detected best matches.
32225
32450
  */
32226
- resetAllowlistToBestMatch: method(external_exports.void(), AllowedAddressesSchema, { kind: "mutation" })
32451
+ resetAllowlistToBestMatch: method(external_exports.void(), AllowedAddressesSchema, { kind: "mutation" }),
32452
+ /**
32453
+ * Live TLS material for the Network → Local access certificate card.
32454
+ * LAN HTTP / hostname are addon settings (`globalSettingsSchema`), not
32455
+ * a second store — this query is status, not configuration.
32456
+ */
32457
+ getTlsStatus: method(external_exports.void(), TlsStatusSchema),
32458
+ /** Issue a new leaf under the existing local CA. Disabled in uploaded mode. */
32459
+ regenerateCertificate: method(external_exports.object({ reason: external_exports.string().optional() }), TlsStatusSchema, {
32460
+ kind: "mutation",
32461
+ auth: "admin"
32462
+ }),
32463
+ /** Replace the served material with operator-supplied PEMs. */
32464
+ uploadCertificate: method(external_exports.object({
32465
+ certPem: external_exports.string().min(1),
32466
+ keyPem: external_exports.string().min(1),
32467
+ caPem: external_exports.string().optional()
32468
+ }), TlsStatusSchema, {
32469
+ kind: "mutation",
32470
+ auth: "admin"
32471
+ }),
32472
+ /** The local CA PEM, or empty when there is none to download. */
32473
+ downloadCa: method(external_exports.void(), external_exports.object({ pem: external_exports.string() })),
32474
+ /** Drop uploaded material and return to the generated local CA. */
32475
+ revertToGeneratedCertificate: method(external_exports.void(), TlsStatusSchema, {
32476
+ kind: "mutation",
32477
+ auth: "admin"
32478
+ })
32227
32479
  },
32228
32480
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
32229
32481
  mount: { kind: "hub-only" }
@@ -33756,7 +34008,12 @@ var PlateInfoSchema = external_exports.object({
33756
34008
  plateBbox: BoundingBoxSchema.optional(),
33757
34009
  /** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
33758
34010
  keyFrameMediaKey: external_exports.string().optional(),
33759
- base64: external_exports.string().optional()
34011
+ base64: external_exports.string().optional(),
34012
+ /**
34013
+ * Same crop as a data-plane URL. `getPlateByTrack` returns this and
34014
+ * never inlines JPEG; `listPlates` still inlines for the admin-ui.
34015
+ */
34016
+ cropUrl: external_exports.string().optional()
33760
34017
  });
33761
34018
  var MediaFileLiteSchema = external_exports.object({
33762
34019
  key: external_exports.string(),
@@ -38897,6 +39154,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
38897
39154
  addonId: null,
38898
39155
  access: "create"
38899
39156
  },
39157
+ "localNetwork.downloadCa": {
39158
+ capName: "local-network",
39159
+ capScope: "system",
39160
+ addonId: null,
39161
+ access: "view"
39162
+ },
38900
39163
  "localNetwork.getAllowedAddresses": {
38901
39164
  capName: "local-network",
38902
39165
  capScope: "system",
@@ -38921,18 +39184,42 @@ var METHOD_ACCESS_MAP = Object.freeze({
38921
39184
  addonId: null,
38922
39185
  access: "view"
38923
39186
  },
39187
+ "localNetwork.getTlsStatus": {
39188
+ capName: "local-network",
39189
+ capScope: "system",
39190
+ addonId: null,
39191
+ access: "view"
39192
+ },
39193
+ "localNetwork.getViewerEndpoints": {
39194
+ capName: "local-network",
39195
+ capScope: "system",
39196
+ addonId: null,
39197
+ access: "view"
39198
+ },
38924
39199
  "localNetwork.list": {
38925
39200
  capName: "local-network",
38926
39201
  capScope: "system",
38927
39202
  addonId: null,
38928
39203
  access: "view"
38929
39204
  },
39205
+ "localNetwork.regenerateCertificate": {
39206
+ capName: "local-network",
39207
+ capScope: "system",
39208
+ addonId: null,
39209
+ access: "create"
39210
+ },
38930
39211
  "localNetwork.resetAllowlistToBestMatch": {
38931
39212
  capName: "local-network",
38932
39213
  capScope: "system",
38933
39214
  addonId: null,
38934
39215
  access: "delete"
38935
39216
  },
39217
+ "localNetwork.revertToGeneratedCertificate": {
39218
+ capName: "local-network",
39219
+ capScope: "system",
39220
+ addonId: null,
39221
+ access: "create"
39222
+ },
38936
39223
  "localNetwork.setAllowedAddresses": {
38937
39224
  capName: "local-network",
38938
39225
  capScope: "system",
@@ -38945,6 +39232,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
38945
39232
  addonId: null,
38946
39233
  access: "create"
38947
39234
  },
39235
+ "localNetwork.setViewerEndpoints": {
39236
+ capName: "local-network",
39237
+ capScope: "system",
39238
+ addonId: null,
39239
+ access: "create"
39240
+ },
39241
+ "localNetwork.uploadCertificate": {
39242
+ capName: "local-network",
39243
+ capScope: "system",
39244
+ addonId: null,
39245
+ access: "create"
39246
+ },
38948
39247
  "lockControl.lock": {
38949
39248
  capName: "lock-control",
38950
39249
  capScope: "device",
@@ -39743,6 +40042,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
39743
40042
  addonId: null,
39744
40043
  access: "view"
39745
40044
  },
40045
+ "pipelineAnalytics.getGroup": {
40046
+ capName: "pipeline-analytics",
40047
+ capScope: "device",
40048
+ addonId: null,
40049
+ access: "view"
40050
+ },
39746
40051
  "pipelineAnalytics.getKeyEvents": {
39747
40052
  capName: "pipeline-analytics",
39748
40053
  capScope: "device",
@@ -39827,6 +40132,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
39827
40132
  addonId: null,
39828
40133
  access: "view"
39829
40134
  },
40135
+ "pipelineAnalytics.listGroups": {
40136
+ capName: "pipeline-analytics",
40137
+ capScope: "device",
40138
+ addonId: null,
40139
+ access: "view"
40140
+ },
39830
40141
  "pipelineAnalytics.listOpsLog": {
39831
40142
  capName: "pipeline-analytics",
39832
40143
  capScope: "device",
@@ -41825,6 +42136,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
41825
42136
  addonId: null,
41826
42137
  access: "create"
41827
42138
  },
42139
+ "terminalSession.updateInstance": {
42140
+ capName: "terminal-session",
42141
+ capScope: "system",
42142
+ addonId: null,
42143
+ access: "create"
42144
+ },
41828
42145
  "terminalSession.writeInput": {
41829
42146
  capName: "terminal-session",
41830
42147
  capScope: "system",
@@ -43240,6 +43557,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
43240
43557
  form: "single",
43241
43558
  optional: false
43242
43559
  }],
43560
+ "pipelineAnalytics.getGroup": [{
43561
+ name: "deviceId",
43562
+ form: "single",
43563
+ optional: false
43564
+ }],
43243
43565
  "pipelineAnalytics.getKeyEvents": [{
43244
43566
  name: "deviceId",
43245
43567
  form: "single",
@@ -43295,6 +43617,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
43295
43617
  form: "array",
43296
43618
  optional: false
43297
43619
  }],
43620
+ "pipelineAnalytics.listGroups": [{
43621
+ name: "deviceIds",
43622
+ form: "array",
43623
+ optional: false
43624
+ }],
43298
43625
  "pipelineAnalytics.listOpsLog": [{
43299
43626
  name: "deviceId",
43300
43627
  form: "single",
@@ -44196,6 +44523,35 @@ var CLUSTER_MODEL_SCOPED_STEPS = [{
44196
44523
  }];
44197
44524
  var DEFAULT_CLUSTER_STEP_MODELS = Object.freeze(Object.fromEntries(CLUSTER_MODEL_SCOPED_STEPS.map((s) => [s.stepId, s.defaultModelId])));
44198
44525
  var ChosenModelIdSchema = external_exports.string().min(1);
44526
+ var CLUSTER_STEP_SETTING_FIELDS = [{
44527
+ stepId: "face-embedding",
44528
+ key: "minLandmarkFaceSize",
44529
+ label: "Min face size for recognition (detection px)",
44530
+ description: "Refuse to embed a face smaller than this IN THE DETECTION FRAME. Applies to every node \u2014 the enrolled gallery is one index, and two admission floors would fill it from two policies. 0 disables the gate.",
44531
+ type: "slider",
44532
+ min: 0,
44533
+ max: 64,
44534
+ step: 2,
44535
+ default: 24
44536
+ }];
44537
+ function clusterStepSettingKey(stepId, fieldKey) {
44538
+ return `clusterStepSetting:${stepId}:${fieldKey}`;
44539
+ }
44540
+ var ClusterSettingNumberSchema = external_exports.number().finite();
44541
+ function readClusterStepSettings(config2) {
44542
+ const out = {};
44543
+ for (const field of CLUSTER_STEP_SETTING_FIELDS) {
44544
+ const parsed = ClusterSettingNumberSchema.safeParse(config2[clusterStepSettingKey(field.stepId, field.key)]);
44545
+ const value = parsed.success ? parsed.data : field.default;
44546
+ const existing = out[field.stepId] ?? {};
44547
+ out[field.stepId] = {
44548
+ ...existing,
44549
+ [field.key]: value
44550
+ };
44551
+ }
44552
+ return out;
44553
+ }
44554
+ var DEFAULT_CLUSTER_STEP_SETTINGS = readClusterStepSettings({});
44199
44555
  var DetailCropConventionSchema = external_exports.object({
44200
44556
  /**
44201
44557
  * Fraction of the box's own size added on EACH side before cutting.