camstack 1.2.179 → 1.2.181

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.
@@ -8,7 +8,7 @@ import * as dgram from "dgram";
8
8
  import * as os from "os";
9
9
  import { parseArgs } from "util";
10
10
 
11
- // ../types/dist/event-category-BGmz_oxW.mjs
11
+ // ../types/dist/event-category-DaIZi00R.mjs
12
12
  var EventCategory = /* @__PURE__ */ (function(EventCategory2) {
13
13
  EventCategory2["SystemBoot"] = "system.boot";
14
14
  EventCategory2["SystemAddonsReady"] = "system.addons-ready";
@@ -29,6 +29,7 @@ var EventCategory = /* @__PURE__ */ (function(EventCategory2) {
29
29
  EventCategory2["AddonPageReady"] = "addon.page-ready";
30
30
  EventCategory2["AddonWidgetReady"] = "addon.widget-ready";
31
31
  EventCategory2["AddonLoadFailed"] = "addon.load-failed";
32
+ EventCategory2["KeychainChanged"] = "keychain.changed";
32
33
  EventCategory2["AddonLoadRecovered"] = "addon.load-recovered";
33
34
  EventCategory2["AddonRetryScheduled"] = "addon.retry-scheduled";
34
35
  EventCategory2["SystemLivenessFailed"] = "system.liveness-failed";
@@ -116,7 +117,6 @@ var EventCategory = /* @__PURE__ */ (function(EventCategory2) {
116
117
  EventCategory2["AgentWsDisconnected"] = "agent.ws.disconnected";
117
118
  EventCategory2["AgentBackupActivated"] = "agent.backup.activated";
118
119
  EventCategory2["OrchestrationSettingsUpdated"] = "orchestration.settings-updated";
119
- EventCategory2["PipelineAgentHwaccelChanged"] = "pipeline.agent-hwaccel-changed";
120
120
  EventCategory2["MotionAnalysis"] = "detection.motion-analysis";
121
121
  EventCategory2["MotionZonesRaw"] = "detection.motion-zones-raw";
122
122
  EventCategory2["MotionOnMotionChanged"] = "motion.on-motion-changed";
@@ -14681,7 +14681,7 @@ function date4(params) {
14681
14681
  // ../../node_modules/zod/v4/classic/external.js
14682
14682
  config(en_default());
14683
14683
 
14684
- // ../types/dist/sleep-DXKLNFvA.mjs
14684
+ // ../types/dist/sleep-DujUvOcb.mjs
14685
14685
  var AUDIO_CHUNK_FORMATS = [
14686
14686
  "f32le",
14687
14687
  "pcmu",
@@ -14875,6 +14875,7 @@ var WELL_KNOWN_TABS = [
14875
14875
  }
14876
14876
  ];
14877
14877
  var WELL_KNOWN_TAB_MAP = Object.fromEntries(WELL_KNOWN_TABS.map((t) => [t.id, t]));
14878
+ var SECRET_RETRY_MAX_MS = 5 * 6e4;
14878
14879
  var PEER_BYTES_CHUNK_BYTES = 256 * 1024;
14879
14880
  var PeerBytesTicketSchema = external_exports.object({
14880
14881
  /** `http://127.0.0.1:<port>/<token>`. One `GET` takes it. */
@@ -14893,6 +14894,7 @@ var PeerBytesTicketSchema = external_exports.object({
14893
14894
  */
14894
14895
  declaredBytes: external_exports.number().int().nonnegative().nullable()
14895
14896
  });
14897
+ var REVALIDATE_AFTER_MS = 15 * 6e4;
14896
14898
  var CamProfileSchema = external_exports.enum([
14897
14899
  "high",
14898
14900
  "mid",
@@ -15019,27 +15021,6 @@ var StreamSourceSchema = external_exports.object({
15019
15021
  audioCodec: external_exports.string().optional(),
15020
15022
  metadata: external_exports.record(external_exports.string(), external_exports.unknown()).readonly().optional()
15021
15023
  });
15022
- var EncodedPacketSchema = external_exports.object({
15023
- type: external_exports.enum(["video", "audio"]),
15024
- data: external_exports.instanceof(Uint8Array),
15025
- pts: external_exports.number(),
15026
- dts: external_exports.number(),
15027
- keyframe: external_exports.boolean(),
15028
- codec: external_exports.string()
15029
- });
15030
- var DecodedFrameSchema = external_exports.object({
15031
- data: external_exports.instanceof(Uint8Array),
15032
- width: external_exports.number(),
15033
- height: external_exports.number(),
15034
- format: external_exports.enum([
15035
- "jpeg",
15036
- "rgb",
15037
- "bgr",
15038
- "yuv420",
15039
- "gray"
15040
- ]),
15041
- timestamp: external_exports.number()
15042
- });
15043
15024
  var FrameHandleSchema = external_exports.object({
15044
15025
  shmId: external_exports.string(),
15045
15026
  slot: external_exports.number().int().nonnegative(),
@@ -15058,31 +15039,6 @@ var FrameHandleSchema = external_exports.object({
15058
15039
  nodeId: external_exports.string(),
15059
15040
  slotCount: external_exports.number().int().positive()
15060
15041
  });
15061
- var FrameHandleFormatSchema = external_exports.enum([
15062
- "rgb",
15063
- "bgr",
15064
- "yuv420",
15065
- "gray"
15066
- ]);
15067
- var SubscribeFramesInputSchema = external_exports.object({
15068
- brokerId: external_exports.string(),
15069
- format: FrameHandleFormatSchema,
15070
- /**
15071
- * Optional reader-side cadence hint in frames per second. The broker does
15072
- * NOT throttle — latest-wins ring reads drop frames implicitly for a slow
15073
- * consumer. The value is echoed back in `SubscribeFramesResult.maxFps` so
15074
- * the consumer can pace its own `pullFrameHandles` polling.
15075
- */
15076
- maxFps: external_exports.number().positive().optional(),
15077
- /** Short caller-identity tag (`motion`, `detection`, …) for diagnostics. */
15078
- tag: external_exports.string().optional()
15079
- });
15080
- var SubscribeFramesResultSchema = external_exports.object({
15081
- /** Opaque id the consumer passes to `pullFrameHandles` / `unsubscribeFrames`. */
15082
- subscriptionId: external_exports.string(),
15083
- /** Reader-side cadence hint (frames/s) — echoes `SubscribeFramesInput.maxFps`. */
15084
- maxFps: external_exports.number().nonnegative()
15085
- });
15086
15042
  var AudioChunkFormatSchema = external_exports.enum(AUDIO_CHUNK_FORMATS);
15087
15043
  var DecodedAudioChunkSchema = external_exports.object({
15088
15044
  data: external_exports.instanceof(Uint8Array),
@@ -15128,9 +15084,7 @@ var BrokerStatusSchema = external_exports.enum([
15128
15084
  var BrokerStatsSchema = external_exports.object({
15129
15085
  status: BrokerStatusSchema,
15130
15086
  inputFps: external_exports.number(),
15131
- decodeFps: external_exports.number(),
15132
15087
  encodedSubscribers: external_exports.number(),
15133
- decodedSubscribers: external_exports.number(),
15134
15088
  uptimeMs: external_exports.number(),
15135
15089
  bitrateKbps: external_exports.number(),
15136
15090
  idrIntervalMs: external_exports.number(),
@@ -15143,14 +15097,6 @@ var BrokerStatsSchema = external_exports.object({
15143
15097
  preBufferMs: external_exports.number(),
15144
15098
  preBufferPackets: external_exports.number(),
15145
15099
  /**
15146
- * Moleculer node id of the decoder provider currently servicing this
15147
- * stream's decoded subscribers. `null` until the deferred decoder is
15148
- * created (no decoded clients yet, or codec not detected). Surfaces the
15149
- * runtime decoder placement so the UI can show "Decoder: <agent>" without
15150
- * a separate cap call per broker.
15151
- */
15152
- decoderNodeId: external_exports.string().nullable(),
15153
- /**
15154
15100
  * Detected audio track parameters from the RTSP DESCRIBE / SDP. `null`
15155
15101
  * when the stream has no audio track or the broker is in cold start.
15156
15102
  * `supported = false` means the codec was detected but the local
@@ -17592,70 +17538,6 @@ var StorageLocationDeclarationSchema = external_exports.object({
17592
17538
  "backup"
17593
17539
  ]).optional()
17594
17540
  });
17595
- var DecoderStatsSchema = external_exports.object({
17596
- inputFps: external_exports.number(),
17597
- outputFps: external_exports.number(),
17598
- avgDecodeTimeMs: external_exports.number(),
17599
- droppedFrames: external_exports.number(),
17600
- /**
17601
- * Pull-mode adaptive-fps telemetry (optional — only pull sessions run the
17602
- * lag-driven controller; push sessions omit these). `lagMs` is the EWMA of
17603
- * the decoder's real-time drift (rising = falling behind live); `adaptiveFps`
17604
- * is the current lag-throttled emit rate (≤ `effectiveFps` ceiling).
17605
- */
17606
- lagMs: external_exports.number().optional(),
17607
- effectiveFps: external_exports.number().optional(),
17608
- adaptiveFps: external_exports.number().optional()
17609
- });
17610
- var DecoderSessionConfigSchema = external_exports.object({
17611
- codec: external_exports.string(),
17612
- maxFps: external_exports.number().default(0),
17613
- outputFormat: external_exports.enum([
17614
- "jpeg",
17615
- "rgb",
17616
- "bgr",
17617
- "yuv420",
17618
- "gray"
17619
- ]).default("jpeg"),
17620
- scale: external_exports.number().default(1),
17621
- width: external_exports.number().optional(),
17622
- height: external_exports.number().optional(),
17623
- /**
17624
- * Identifier of the camera this decoder session serves. Optional
17625
- * because the cap is generic (any caller could request decode), but
17626
- * stream-broker passes it so decoder logs include `deviceId` for
17627
- * per-camera filtering when diagnosing failures (e.g. node-av
17628
- * sendPacket errors on a single hung camera).
17629
- */
17630
- deviceId: external_exports.number().int().nonnegative().optional(),
17631
- /**
17632
- * Free-form tag for log scoping. Stream-broker uses
17633
- * `broker:<deviceId>/<profile>`. Decoder session logger surfaces it
17634
- * on every line so `grep tag=broker:5/high` filters one camera
17635
- * profile cleanly.
17636
- */
17637
- tag: external_exports.string().optional(),
17638
- /**
17639
- * Where the session delivers decoded frames (Phase 5 / D9):
17640
- *
17641
- * - `'callback'` (default) — the legacy pixel path: decoded frames are
17642
- * buffered as `DecodedFrame`s and drained via `pullFrames`.
17643
- * - `'shm'` — the shared-memory frame plane: decoded frames are written
17644
- * into an OS shared-memory ring and drained as zero-pixel
17645
- * `FrameHandle`s via `pullHandles`. A session is one mode or the
17646
- * other — `pullFrames` returns nothing for an `'shm'` session and
17647
- * `pullHandles` returns nothing for a `'callback'` session.
17648
- */
17649
- frameSink: external_exports.enum(["callback", "shm"]).default("callback"),
17650
- /**
17651
- * Per-camera decoder DEBUG facility. When `true`, a pull-mode session emits
17652
- * a throttled (~1Hz) structured `decoder debug` line (effective/adaptive fps,
17653
- * real-time lag, dropped-frame delta, avg decode time, hwaccel). Mirrors the
17654
- * stream-broker's `streamingDebug` gate — off by default so production logs
17655
- * stay quiet and the emit path pays zero per-frame cost when disabled.
17656
- */
17657
- debug: external_exports.boolean().optional()
17658
- });
17659
17541
  var LogChannelLevelSchema = external_exports.enum([
17660
17542
  "info",
17661
17543
  "warn",
@@ -17735,6 +17617,18 @@ var CLIP_SEARCH_STRICTNESS = [
17735
17617
  "strict"
17736
17618
  ];
17737
17619
  var ClipSearchStrictnessSchema = external_exports.enum(CLIP_SEARCH_STRICTNESS);
17620
+ var LABEL_SUPPLY_STEP_IDS = [
17621
+ "animal-classifier",
17622
+ "vehicle-classifier",
17623
+ "package-detection"
17624
+ ];
17625
+ var CROP_SUPPLY_STEP_IDS = ["plate-detection", "face-detection"];
17626
+ var MASK_SUPPLY_STEP_IDS = ["segmentation"];
17627
+ var ROOT_SUPPLIABLE_STEP_IDS = [
17628
+ ...LABEL_SUPPLY_STEP_IDS,
17629
+ ...CROP_SUPPLY_STEP_IDS,
17630
+ ...MASK_SUPPLY_STEP_IDS
17631
+ ];
17738
17632
  var MODEL_FORMATS = [
17739
17633
  "onnx",
17740
17634
  "coreml",
@@ -17751,7 +17645,35 @@ var ModelFormatEntrySchema = external_exports.object({
17751
17645
  /** Multi-file payload (directory members or sibling files). */
17752
17646
  files: external_exports.array(external_exports.string()).readonly().optional(),
17753
17647
  /** Runtime(s) that can use this format. If omitted, inferred from ModelFormat key */
17754
- runtimes: external_exports.array(external_exports.enum(["python"])).readonly().optional()
17648
+ runtimes: external_exports.array(external_exports.enum(["python"])).readonly().optional(),
17649
+ /**
17650
+ * Content revision of the artefact, for one hosted OFF the CamStack mirror.
17651
+ * A format on the mirror leaves it unset: its revision (the sha256 of its
17652
+ * weight file) comes from the downloader's generated table, kept in step
17653
+ * with the mirror by `scripts/check-hosted-model-revisions.ts` (D744). A
17654
+ * node records the revision it downloaded next to the file
17655
+ * (`<file>.revision`); a copy with no record or a different one is stale
17656
+ * unless its weight file hashes to the revision, and a stale copy is
17657
+ * downloaded again, the old one serving until the new one is complete. No
17658
+ * revision at all ⇒ a file on disk is current, whatever it holds (D743).
17659
+ */
17660
+ revision: external_exports.string().min(1).optional()
17661
+ });
17662
+ var ModelOnDiskStateSchema = external_exports.enum([
17663
+ "current",
17664
+ "stale",
17665
+ "missing"
17666
+ ]);
17667
+ var ModelFormatPrecisionSchema = external_exports.enum([
17668
+ "fp32",
17669
+ "fp16",
17670
+ "int8"
17671
+ ]);
17672
+ var PipelineModelFormatStatusSchema = external_exports.object({
17673
+ downloaded: external_exports.boolean(),
17674
+ sizeMB: external_exports.number(),
17675
+ onDisk: ModelOnDiskStateSchema.optional(),
17676
+ precision: ModelFormatPrecisionSchema.optional()
17755
17677
  });
17756
17678
  var ModelExtraFileSchema = external_exports.object({
17757
17679
  url: external_exports.string(),
@@ -17828,6 +17750,31 @@ var ModelLicenseRecordSchema = external_exports.object({
17828
17750
  nonCommercial: external_exports.boolean().optional()
17829
17751
  });
17830
17752
  var ModelLicenseSchema = external_exports.preprocess((value) => typeof value === "string" ? { weights: value } : value, ModelLicenseRecordSchema);
17753
+ var RootStepSupplySchema = external_exports.discriminatedUnion("kind", [
17754
+ external_exports.object({
17755
+ kind: external_exports.literal("label"),
17756
+ stepId: external_exports.enum(LABEL_SUPPLY_STEP_IDS),
17757
+ labelToEffect: external_exports.record(external_exports.string(), external_exports.string()),
17758
+ uncovered: external_exports.array(external_exports.string()).readonly()
17759
+ }),
17760
+ external_exports.object({
17761
+ kind: external_exports.literal("crop"),
17762
+ stepId: external_exports.enum(CROP_SUPPLY_STEP_IDS),
17763
+ rootLabels: external_exports.array(external_exports.string()).readonly(),
17764
+ parentMacro: external_exports.enum(["vehicle", "person"]),
17765
+ childClass: external_exports.enum(["plate", "face"]),
17766
+ /**
17767
+ * The root's smaller input side, stamped on read by `rootSuppliesOf` from
17768
+ * the model entry — what a step's `minRootInputPx` gate judges. Never
17769
+ * stored by an import.
17770
+ */
17771
+ rootInputPx: external_exports.number().int().positive().optional()
17772
+ }),
17773
+ external_exports.object({
17774
+ kind: external_exports.literal("mask"),
17775
+ stepId: external_exports.enum(MASK_SUPPLY_STEP_IDS)
17776
+ })
17777
+ ]);
17831
17778
  var ModelCatalogEntrySchema = external_exports.object({
17832
17779
  id: external_exports.string(),
17833
17780
  name: external_exports.string(),
@@ -17893,6 +17840,35 @@ var ModelCatalogEntrySchema = external_exports.object({
17893
17840
  */
17894
17841
  defaultConfidence: external_exports.number().min(0).max(1).optional(),
17895
17842
  /**
17843
+ * Per-MODEL default of the per-class confidence floors (`minConfidence<Macro>`
17844
+ * on a detector step), keyed by macro class: `{ person: 0.45 }`. A class
17845
+ * absent here runs at the step slider's global default. The same row shape
17846
+ * the floor measurement produces (`model-floors.json`: modelId → floors), so
17847
+ * a measured table is copied in as-is. An operator override is bound to the
17848
+ * model it was made for and does not survive a model change (D738). A custom
17849
+ * / imported model may declare it; without it, the global defaults apply.
17850
+ */
17851
+ defaultClassFloors: external_exports.record(external_exports.string(), external_exports.number().min(0).max(1)).optional(),
17852
+ /**
17853
+ * The inference precision this model's OpenVINO IR needs on an Intel GPU.
17854
+ * Absent ⇒ the device default (f16 on a GPU). Set to `'f32'` for an FP32 IR
17855
+ * that produces invalid output at f16 — measured 2026-10-07 for YOLO26
17856
+ * base IRs (`yolo26s`: 0 true / 146 false positives; `yolo26m*`: NaN
17857
+ * scores) on the Core Ultra iGPU and the N100. Threaded to the pool as
17858
+ * `PoolModelConfig.gpuInferencePrecision`; the pool sets
17859
+ * INFERENCE_PRECISION_HINT on a GPU only. Costs ~60% latency on the GPU.
17860
+ */
17861
+ gpuInferencePrecision: external_exports.enum(["f32", "f16"]).optional(),
17862
+ /**
17863
+ * ROOT detectors only: per supplied step (`animal-classifier`, …), the
17864
+ * minimum DETECTION score from which this root's own fine label (species,
17865
+ * vehicle type — D736 root supply) is taken (D741). Below it the detection
17866
+ * keeps its macro class without the fine label. `1` = never take it from
17867
+ * this root. Absent ⇒ no floor beyond the macro floor. The supplied step's
17868
+ * `minConfidence` slider, bound to the ROOT model, overrides it.
17869
+ */
17870
+ suppliedLabelFloors: external_exports.record(external_exports.string(), external_exports.number().min(0).max(1)).optional(),
17871
+ /**
17896
17872
  * When true, the executor produces a landmark-aligned crop (similarity warp
17897
17873
  * onto the canonical template) before this step runs, instead of a plain
17898
17874
  * axis-aligned bbox crop. Required for face-recognition embedders (ArcFace):
@@ -17954,6 +17930,16 @@ var ModelCatalogEntrySchema = external_exports.object({
17954
17930
  */
17955
17931
  classMap: DetectionCatalogClassMapSchema.optional(),
17956
17932
  /**
17933
+ * The pipeline steps this ROOT detector can supply from its own output
17934
+ * (D730): its labels name a step's effect (`deer` for `animal-classifier`)
17935
+ * or draw a step's box (`license_plate` for `plate-detection`). Computed at
17936
+ * import from THIS model's labelmap by `deriveRootSupplies`, never written
17937
+ * by hand and never assumed per family; a row without it is derived on read
17938
+ * (`rootSuppliesOf`). Whether a camera uses it is the step's own
17939
+ * `useRootModel` flag (`resolveRootSupply`).
17940
+ */
17941
+ suppliesSteps: external_exports.array(RootStepSupplySchema).readonly().optional(),
17942
+ /**
17957
17943
  * The model's CLIP feature-space contract (text encoder, dimension, vector
17958
17944
  * index, token window, search floor) — see `clip-model.ts`. Present ONLY on a
17959
17945
  * CLIP image encoder; its absence is what "not a CLIP model" means to the
@@ -19556,13 +19542,6 @@ var BrokerRtspClientSchema = external_exports.object({
19556
19542
  lastRtpAt: external_exports.number(),
19557
19543
  bytesSent: external_exports.number()
19558
19544
  });
19559
- var BrokerDecodedClientSchema = external_exports.object({
19560
- tag: external_exports.string(),
19561
- subscribedAt: external_exports.number(),
19562
- maxFps: external_exports.number(),
19563
- framesDelivered: external_exports.number(),
19564
- framesDropped: external_exports.number()
19565
- });
19566
19545
  var BrokerAudioClientSchema = external_exports.object({
19567
19546
  tag: external_exports.string(),
19568
19547
  subscribedAt: external_exports.number(),
@@ -19655,7 +19634,6 @@ var BrokerEncodedClientSchema = external_exports.object({
19655
19634
  });
19656
19635
  var BrokerClientsSchema = external_exports.object({
19657
19636
  rtsp: external_exports.array(BrokerRtspClientSchema).readonly(),
19658
- decoded: external_exports.array(BrokerDecodedClientSchema).readonly(),
19659
19637
  audio: external_exports.array(BrokerAudioClientSchema).readonly(),
19660
19638
  encoded: external_exports.array(BrokerEncodedClientSchema).readonly(),
19661
19639
  pipeClients: external_exports.number(),
@@ -20126,11 +20104,7 @@ var streamBrokerCapability = {
20126
20104
  listClients: method(external_exports.object({ brokerId: external_exports.string() }), BrokerClientsSchema),
20127
20105
  killClient: method(external_exports.object({
20128
20106
  brokerId: external_exports.string(),
20129
- channel: external_exports.enum([
20130
- "rtsp",
20131
- "decoded",
20132
- "audio"
20133
- ]),
20107
+ channel: external_exports.enum(["rtsp", "audio"]),
20134
20108
  handle: external_exports.string()
20135
20109
  }), external_exports.object({ killed: external_exports.boolean() }), {
20136
20110
  kind: "mutation",
@@ -20229,31 +20203,6 @@ var streamBrokerCapability = {
20229
20203
  maxCount: external_exports.number().int().positive().default(8)
20230
20204
  }), external_exports.array(DecodedAudioChunkSchema).readonly()),
20231
20205
  unsubscribeAudioChunks: method(external_exports.object({ subscriptionId: external_exports.string() }), external_exports.object({ released: external_exports.boolean() }), { kind: "mutation" }),
20232
- /**
20233
- * ── Shared-memory frame plane (Phase 5 / D9) ──────────────────────
20234
- *
20235
- * The handle-based replacement for the live-object `IStreamBroker.
20236
- * onDecodedFrame` callback path. A consumer:
20237
- *
20238
- * 1. `subscribeFrames({ brokerId, format })` — the broker spins up
20239
- * (or reuses) a `frameSink: 'shm'` decoder session producing that
20240
- * `format` and returns a `subscriptionId`.
20241
- * 2. polls `pullFrameHandles({ subscriptionId, maxCount })` — drains
20242
- * zero-pixel `FrameHandle[]`; each handle is fed to a
20243
- * `FrameRingReader` that opens the named shm segment and reads the
20244
- * pixels back zero-copy.
20245
- * 3. `unsubscribeFrames({ subscriptionId })` on teardown.
20246
- *
20247
- * The broker keeps one shm ring per `(brokerId, format)` actually
20248
- * requested — no broker-side `sharp` conversion. fps throttling is
20249
- * implicit (latest-wins ring reads drop frames for a slow consumer).
20250
- */
20251
- subscribeFrames: method(SubscribeFramesInputSchema, SubscribeFramesResultSchema, { kind: "mutation" }),
20252
- pullFrameHandles: method(external_exports.object({
20253
- subscriptionId: external_exports.string(),
20254
- maxCount: external_exports.number().int().positive().default(4)
20255
- }), external_exports.array(FrameHandleSchema).readonly()),
20256
- unsubscribeFrames: method(external_exports.object({ subscriptionId: external_exports.string() }), external_exports.object({ released: external_exports.boolean() }), { kind: "mutation" }),
20257
20206
  setPreBufferDuration: method(external_exports.object({
20258
20207
  brokerId: external_exports.string(),
20259
20208
  seconds: external_exports.number().min(0).max(30)
@@ -21733,67 +21682,255 @@ var dataStoreProviderCapability = {
21733
21682
  })
21734
21683
  }
21735
21684
  };
21736
- var ShmRingStatsSchema = external_exports.object({
21737
- sessionId: external_exports.string(),
21738
- slotCount: external_exports.number().int(),
21739
- slotByteLength: external_exports.number().int(),
21740
- segmentBytes: external_exports.number().int(),
21741
- budgetMb: external_exports.number().int(),
21742
- framesWritten: external_exports.number().int(),
21743
- getFrameHits: external_exports.number().int(),
21744
- getFrameMisses: external_exports.number().int()
21745
- });
21685
+ var KeychainUnavailableReasonSchema = external_exports.enum([
21686
+ "key-missing",
21687
+ "wrong-key",
21688
+ "key-file-unreadable",
21689
+ "store-unavailable",
21690
+ "not-initialized",
21691
+ "decrypt-failed"
21692
+ ]);
21693
+ var KeychainStateSchema = external_exports.discriminatedUnion("state", [external_exports.object({ state: external_exports.literal("ready") }), external_exports.object({
21694
+ state: external_exports.literal("locked"),
21695
+ reason: KeychainUnavailableReasonSchema
21696
+ })]);
21697
+ var KeychainResolveEntrySchema = external_exports.discriminatedUnion("kind", [
21698
+ external_exports.object({
21699
+ kind: external_exports.literal("value"),
21700
+ value: external_exports.string(),
21701
+ version: external_exports.number().int()
21702
+ }),
21703
+ external_exports.object({ kind: external_exports.literal("missing") }),
21704
+ external_exports.object({
21705
+ kind: external_exports.literal("unavailable"),
21706
+ reason: KeychainUnavailableReasonSchema
21707
+ }),
21708
+ external_exports.object({ kind: external_exports.literal("forbidden") })
21709
+ ]);
21710
+ var KeychainResolveResultSchema = external_exports.record(external_exports.string(), KeychainResolveEntrySchema);
21711
+ var KeychainSecretMetaSchema = external_exports.object({
21712
+ ref: external_exports.string(),
21713
+ owner: external_exports.string(),
21714
+ /** Formatted scope (`global`, `node/<id>`, `device/<id>`, …). */
21715
+ scope: external_exports.string(),
21716
+ fieldPath: external_exports.string(),
21717
+ version: external_exports.number().int(),
21718
+ createdAt: external_exports.number(),
21719
+ updatedAt: external_exports.number(),
21720
+ /** `addon:<id>` | `user:<id>` | `system`. */
21721
+ updatedBy: external_exports.string(),
21722
+ /** Coarse — written at most once an hour per ref. `null` = never read. */
21723
+ lastReadAt: external_exports.number().nullable()
21724
+ });
21725
+ var RefListSchema = external_exports.array(external_exports.string().min(1)).max(512);
21726
+ var keychainCapability = {
21727
+ name: "keychain",
21728
+ scope: "system",
21729
+ mode: "singleton",
21730
+ internal: true,
21731
+ methods: {
21732
+ /** Store (or replace) the caller's value at `ref`. Refused while locked. */
21733
+ put: method(external_exports.object({
21734
+ ref: external_exports.string().min(1),
21735
+ value: external_exports.string().min(1)
21736
+ }), external_exports.object({
21737
+ ref: external_exports.string(),
21738
+ version: external_exports.number().int()
21739
+ }), {
21740
+ kind: "mutation",
21741
+ auth: "admin"
21742
+ }),
21743
+ /**
21744
+ * Resolve the caller's refs in one round-trip. A locked keychain answers
21745
+ * `unavailable` per ref — never `missing`, never an empty value.
21746
+ */
21747
+ resolve: method(external_exports.object({ refs: RefListSchema }), KeychainResolveResultSchema, { auth: "admin" }),
21748
+ /** Remove the caller's refs. Unknown refs are ignored. */
21749
+ delete: method(external_exports.object({ refs: RefListSchema }), external_exports.object({ deleted: external_exports.number().int() }), {
21750
+ kind: "mutation",
21751
+ auth: "admin"
21752
+ }),
21753
+ /** The caller's own refs, metadata only. */
21754
+ listMeta: method(external_exports.object({}), external_exports.array(KeychainSecretMetaSchema).readonly(), { auth: "admin" }),
21755
+ /** Whether values can be served — the save path refuses a write while locked. */
21756
+ getState: method(external_exports.object({}), KeychainStateSchema, { auth: "admin" })
21757
+ }
21758
+ };
21759
+ var KeychainKeySourceKindSchema = external_exports.enum([
21760
+ "config-file",
21761
+ "previous-config-file",
21762
+ "platform",
21763
+ "default-file"
21764
+ ]);
21765
+ var KeychainKeySourceSchema = external_exports.object({
21766
+ kind: KeychainKeySourceKindSchema,
21767
+ /** File sources only — a path is not a secret. */
21768
+ path: external_exports.string().optional(),
21769
+ /**
21770
+ * True when a whole-volume backup of the data directory carries this key
21771
+ * next to the database it protects (the default file). The page warns.
21772
+ */
21773
+ sharesBackupWithDatabase: external_exports.boolean()
21774
+ });
21775
+ var KeychainStatusSchema = external_exports.object({
21776
+ keychain: KeychainStateSchema,
21777
+ /** The source of the master key in use; `null` while locked. */
21778
+ keySource: KeychainKeySourceSchema.nullable(),
21779
+ /** The source configured to be primary — differs from `keySource` while a rotation is pending. */
21780
+ configuredSource: KeychainKeySourceSchema,
21781
+ /** Short fingerprint of the master key in use (`HMAC(KEK, label)`, 16 hex). */
21782
+ fingerprint: external_exports.string().nullable(),
21783
+ activeKeyId: external_exports.string().nullable(),
21784
+ /**
21785
+ * The keychain unlocked with a NON-primary source: the configured primary
21786
+ * key is not the one that wraps the data key yet. `rotateMasterKey` moves it.
21787
+ */
21788
+ rotationPending: external_exports.boolean(),
21789
+ /** Wrapped copies of the data key under a previous master key, kept until purged. */
21790
+ retiredWraps: external_exports.number().int(),
21791
+ recoveryKeyDownloadedAt: external_exports.number().nullable(),
21792
+ secretCount: external_exports.number().int()
21793
+ });
21794
+ var KeychainSecretUsageSchema = external_exports.enum([
21795
+ "in-use",
21796
+ "orphan",
21797
+ "unknown"
21798
+ ]);
21799
+ var KeychainAdminSecretSchema = KeychainSecretMetaSchema.extend({ usage: KeychainSecretUsageSchema });
21800
+ var KeychainAuditActionSchema = external_exports.enum([
21801
+ "put",
21802
+ "delete",
21803
+ "reveal",
21804
+ "rotate-master-key",
21805
+ "purge-retired-keys",
21806
+ "download-recovery-key",
21807
+ "delete-orphans",
21808
+ "reset",
21809
+ "initialize"
21810
+ ]);
21811
+ var KeychainAuditEntrySchema = external_exports.object({
21812
+ id: external_exports.string(),
21813
+ at: external_exports.number(),
21814
+ action: KeychainAuditActionSchema,
21815
+ /** `addon:<id>` | `user:<id>` | `system`. */
21816
+ actor: external_exports.string(),
21817
+ ref: external_exports.string().nullable(),
21818
+ detail: external_exports.string().nullable()
21819
+ });
21820
+ var KEYCHAIN_RESET_CONFIRMATION = "RESET KEYCHAIN";
21821
+ var SystemHeldSecretNameSchema = external_exports.enum(["jwt-signing-key"]);
21822
+ var keychainAdminCapability = {
21823
+ name: "keychain-admin",
21824
+ scope: "system",
21825
+ mode: "singleton",
21826
+ methods: {
21827
+ status: method(external_exports.object({}), KeychainStatusSchema, { auth: "admin" }),
21828
+ listSecrets: method(external_exports.object({}), external_exports.array(KeychainAdminSecretSchema).readonly(), { auth: "admin" }),
21829
+ listAudit: method(external_exports.object({ limit: external_exports.number().int().min(1).max(500).optional() }), external_exports.array(KeychainAuditEntrySchema).readonly(), { auth: "admin" }),
21830
+ /**
21831
+ * Show one value to the operator. Audited. The UI hides it again after a
21832
+ * few seconds; nothing caches it.
21833
+ */
21834
+ reveal: method(external_exports.object({ ref: external_exports.string().min(1) }), external_exports.object({
21835
+ value: external_exports.string(),
21836
+ version: external_exports.number().int()
21837
+ }), {
21838
+ kind: "mutation",
21839
+ auth: "admin",
21840
+ caller: "required"
21841
+ }),
21842
+ /**
21843
+ * Replace a system-held secret (no form edits it) with an operator-supplied
21844
+ * value — e.g. importing the session signing key a pre-keychain hub kept in
21845
+ * config.yaml, so the tokens it signed stay valid. Audited as the operator.
21846
+ * Replacing the session signing key invalidates every token signed with the
21847
+ * previous one.
21848
+ */
21849
+ setSystemSecret: method(external_exports.object({
21850
+ name: SystemHeldSecretNameSchema,
21851
+ value: external_exports.string().min(16)
21852
+ }), external_exports.object({
21853
+ ref: external_exports.string(),
21854
+ version: external_exports.number().int()
21855
+ }), {
21856
+ kind: "mutation",
21857
+ auth: "admin",
21858
+ caller: "required"
21859
+ }),
21860
+ /** Delete refs no owner points at any more. Re-checked here; `unknown` is kept. */
21861
+ deleteOrphans: method(external_exports.object({ refs: external_exports.array(external_exports.string().min(1)).max(1e3) }), external_exports.object({
21862
+ deleted: external_exports.array(external_exports.string()).readonly(),
21863
+ kept: external_exports.array(external_exports.object({
21864
+ ref: external_exports.string(),
21865
+ usage: KeychainSecretUsageSchema
21866
+ })).readonly()
21867
+ }), {
21868
+ kind: "mutation",
21869
+ auth: "admin",
21870
+ caller: "required"
21871
+ }),
21872
+ /**
21873
+ * Wrap the data key under the configured primary master key.
21874
+ *
21875
+ * Pending rotation (the keychain unlocked with a previous source): re-wrap
21876
+ * under the primary. Otherwise, with the default file as primary: generate
21877
+ * a new master key, write it there, re-wrap. A file or OS-keychain primary
21878
+ * that is already in use cannot be replaced from here — put the new key at
21879
+ * the source, keep the old one as `keychain.previousKeyFile`, restart, and
21880
+ * rotate. No value is re-encrypted either way; the previous wrap is kept
21881
+ * (retired) until purged.
21882
+ */
21883
+ rotateMasterKey: method(external_exports.object({}), external_exports.object({
21884
+ fingerprint: external_exports.string(),
21885
+ keySource: KeychainKeySourceSchema
21886
+ }), {
21887
+ kind: "mutation",
21888
+ auth: "admin",
21889
+ caller: "required"
21890
+ }),
21891
+ purgeRetiredKeys: method(external_exports.object({}), external_exports.object({ purged: external_exports.number().int() }), {
21892
+ kind: "mutation",
21893
+ auth: "admin",
21894
+ caller: "required"
21895
+ }),
21896
+ /** The master key, base64. Audited; marks the recovery copy as taken. */
21897
+ downloadRecoveryKey: method(external_exports.object({}), external_exports.object({
21898
+ key: external_exports.string(),
21899
+ fingerprint: external_exports.string(),
21900
+ keySource: KeychainKeySourceSchema
21901
+ }), {
21902
+ kind: "mutation",
21903
+ auth: "admin",
21904
+ caller: "required"
21905
+ }),
21906
+ /**
21907
+ * Lost-key recovery: archive every stored value into a
21908
+ * `keychain:secrets-orphaned-<ts>` table and start over with a new data
21909
+ * key. Every secret field then reads "not set". Requires the typed
21910
+ * confirmation {@link KEYCHAIN_RESET_CONFIRMATION}.
21911
+ */
21912
+ resetKeychain: method(external_exports.object({ confirm: external_exports.literal(KEYCHAIN_RESET_CONFIRMATION) }), external_exports.object({
21913
+ archivedCollection: external_exports.string().nullable(),
21914
+ archived: external_exports.number().int()
21915
+ }), {
21916
+ kind: "mutation",
21917
+ auth: "admin",
21918
+ caller: "required"
21919
+ })
21920
+ }
21921
+ };
21746
21922
  var decoderCapability = {
21747
21923
  name: "decoder",
21748
21924
  scope: "system",
21749
21925
  mode: "singleton",
21750
21926
  preferredProvider: "decoder-nodeav",
21751
21927
  methods: {
21752
- supportsCodec: method(external_exports.object({ codec: external_exports.string() }), external_exports.boolean()),
21753
21928
  getInfo: method(external_exports.void(), external_exports.object({
21754
21929
  id: external_exports.string(),
21755
21930
  name: external_exports.string(),
21756
- isPullMode: external_exports.boolean().optional(),
21757
- priority: external_exports.number().optional(),
21758
21931
  hwaccel: external_exports.string().optional(),
21759
21932
  probedBestHwaccel: external_exports.string().optional()
21760
21933
  })),
21761
- createSession: method(DecoderSessionConfigSchema, external_exports.object({
21762
- sessionId: external_exports.string(),
21763
- nodeId: external_exports.string()
21764
- })),
21765
- destroySession: method(external_exports.object({ sessionId: external_exports.string() }), external_exports.void()),
21766
- pushPacket: method(external_exports.object({
21767
- sessionId: external_exports.string(),
21768
- packet: EncodedPacketSchema
21769
- }), external_exports.void()),
21770
- openStream: method(external_exports.object({
21771
- sessionId: external_exports.string(),
21772
- url: external_exports.string()
21773
- }), external_exports.void()),
21774
- pullFrames: method(external_exports.object({
21775
- sessionId: external_exports.string(),
21776
- maxCount: external_exports.number().default(1),
21777
- waitMs: external_exports.number().optional()
21778
- }), external_exports.array(DecodedFrameSchema)),
21779
- pullHandles: method(external_exports.object({
21780
- sessionId: external_exports.string(),
21781
- maxCount: external_exports.number().default(1),
21782
- waitMs: external_exports.number().optional()
21783
- }), external_exports.array(FrameHandleSchema)),
21784
- getFrame: method(external_exports.object({ handle: FrameHandleSchema }), DecodedFrameSchema.nullable()),
21785
- getShmStats: method(external_exports.object({ sessionId: external_exports.string() }), ShmRingStatsSchema.nullable()),
21786
- updateConfig: method(external_exports.object({
21787
- sessionId: external_exports.string(),
21788
- config: DecoderSessionConfigSchema.partial()
21789
- }), external_exports.void()),
21790
- getStats: method(external_exports.object({ sessionId: external_exports.string() }), DecoderStatsSchema),
21791
- listActiveSessions: method(external_exports.void(), external_exports.array(external_exports.object({
21792
- sessionId: external_exports.string(),
21793
- codec: external_exports.string(),
21794
- outputFormat: external_exports.string(),
21795
- createdAtMs: external_exports.number()
21796
- })).readonly()),
21797
21934
  /**
21798
21935
  * Re-run the host platform-probe for the decoder's hwaccel backend
21799
21936
  * and write the detected value into the addon's own global
@@ -22503,6 +22640,10 @@ var DeviceInfoSchema = external_exports.object({
22503
22640
  isCamera: external_exports.boolean(),
22504
22641
  /** Current config values — serializable snapshot */
22505
22642
  config: external_exports.record(external_exports.string(), external_exports.unknown()),
22643
+ /** Paths inside `config` the device's schema declares secret (D783) —
22644
+ * what the non-admin redaction withholds. Paths, never values. Absent
22645
+ * when the owning runner has not reported them. */
22646
+ secretConfigPaths: external_exports.array(external_exports.string()).optional(),
22506
22647
  /** Hardware + identity blob (manufacturer / model / firmware / sn /
22507
22648
  * uid / mac / …). Populated by drivers; editable via setMetadata. */
22508
22649
  metadata: external_exports.record(external_exports.string(), external_exports.unknown()).nullable().optional(),
@@ -22667,12 +22808,22 @@ var DeviceRegisterPayloadSchema = external_exports.object({
22667
22808
  * call (workers re-register on init), so probe-driven updates
22668
22809
  * (e.g. PTZ flag flipping after the abilities probe) propagate. */
22669
22810
  features: external_exports.array(external_exports.string()).optional(),
22670
- config: external_exports.record(external_exports.string(), external_exports.unknown())
22811
+ config: external_exports.record(external_exports.string(), external_exports.unknown()),
22812
+ /** Config paths the device's own schema DECLARES secret
22813
+ * (`.meta({ secret: true })` — dotted, `[]` for array items, e.g.
22814
+ * `connection.password`). Re-published on every register; the non-admin
22815
+ * redaction withholds them at any depth (D783). Optional: an older runner
22816
+ * omits it and the keyword backstop applies. */
22817
+ secretConfigPaths: external_exports.array(external_exports.string()).optional()
22671
22818
  });
22672
22819
  var DeviceRemovePayloadSchema = external_exports.object({ deviceId: external_exports.number() });
22673
22820
  var DevicePersistConfigPayloadSchema = external_exports.object({
22674
22821
  deviceId: external_exports.number(),
22675
- data: external_exports.record(external_exports.string(), external_exports.unknown())
22822
+ data: external_exports.record(external_exports.string(), external_exports.unknown()),
22823
+ /** The paths the device's schema declares secret (D783), when the caller
22824
+ * knows them — those values are kept in the keychain, not the blob (D787).
22825
+ * Absent: the paths the device last reported at `registerDevice` apply. */
22826
+ secretConfigPaths: external_exports.array(external_exports.string()).optional()
22676
22827
  });
22677
22828
  var MigrateSwitchOutcomeSchema = external_exports.enum([
22678
22829
  "off",
@@ -24153,6 +24304,12 @@ var filesystemBrowseCapability = {
24153
24304
  })
24154
24305
  }
24155
24306
  };
24307
+ var HUB_ADDRESS_ROLES = [
24308
+ "appConnections",
24309
+ "notificationTaps",
24310
+ "internal",
24311
+ "publicEndpoint"
24312
+ ];
24156
24313
  var AI_CAP_TRANSPORT_TIMEOUT_MS = 6e5;
24157
24314
  var AI_MODEL_INSTALL_TIMEOUT_MS = 60 * 6e4;
24158
24315
  var LlmUsageSchema = external_exports.object({
@@ -24904,7 +25061,14 @@ var RedirectLoginMethodSchema = external_exports.object({
24904
25061
  icon: external_exports.string().optional(),
24905
25062
  /** Addon-owned HTTP route the button navigates to (GET). */
24906
25063
  startUrl: external_exports.string(),
24907
- stage: LoginStageEnum
25064
+ stage: LoginStageEnum,
25065
+ /**
25066
+ * The provider names an external identity a signed-in user can link to
25067
+ * their own account (D782): `auth.listLinkableProviders` /
25068
+ * `beginExternalLink` offer exactly the redirect methods that set this,
25069
+ * whatever their id. Absent / false — a login button only (magic-link).
25070
+ */
25071
+ linkable: external_exports.boolean().optional()
24908
25072
  });
24909
25073
  var WidgetLoginMethodSchema = external_exports.object({
24910
25074
  kind: external_exports.literal("widget"),
@@ -26535,6 +26699,8 @@ var NcSystemEventKindSchema = external_exports.enum([
26535
26699
  "stream-offline",
26536
26700
  "node-online",
26537
26701
  "node-offline",
26702
+ "node-restarting",
26703
+ "node-updating",
26538
26704
  "node-inference-unavailable",
26539
26705
  "detection-blind",
26540
26706
  "addon-crash-loop",
@@ -27715,7 +27881,13 @@ var NcAlarmModeDelaysSchema = external_exports.object({
27715
27881
  * Absent = false (logged, not sent). Even when true it is not sent when that same sensor
27716
27882
  * is the one that starts the entry delay — the entry-delay notification already names it.
27717
27883
  */
27718
- notifySensorRewatched: external_exports.boolean().optional()
27884
+ notifySensorRewatched: external_exports.boolean().optional(),
27885
+ /**
27886
+ * D735: notify "ignored" when a sensor this arm bypassed really MOVED while armed (its own
27887
+ * change time is after the arm) and set nothing off. Absent = false (logged, not sent). A
27888
+ * re-sync, a recovery from `unavailable` or a duplicate is never announced, switch or not.
27889
+ */
27890
+ notifySensorIgnored: external_exports.boolean().optional()
27719
27891
  });
27720
27892
  var NcAlarmModeDelaysListSchema = external_exports.array(NcAlarmModeDelaysSchema).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
27721
27893
  var NcAlarmModeDelaysEditSchema = external_exports.object({
@@ -27729,7 +27901,9 @@ var NcAlarmModeDelaysEditSchema = external_exports.object({
27729
27901
  /** D706: set the switch, or `null` to clear it (back to the default, false). */
27730
27902
  notifyDuringEntryDelay: external_exports.boolean().nullable().optional(),
27731
27903
  /** D706: set the switch, or `null` to clear it (back to the default, false). */
27732
- notifySensorRewatched: external_exports.boolean().nullable().optional()
27904
+ notifySensorRewatched: external_exports.boolean().nullable().optional(),
27905
+ /** D735: set the switch, or `null` to clear it (back to the default, false). */
27906
+ notifySensorIgnored: external_exports.boolean().nullable().optional()
27733
27907
  });
27734
27908
  var NcAlarmModeDelaysEditListSchema = external_exports.array(NcAlarmModeDelaysEditSchema).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
27735
27909
  var NcAlarmNonBlockingEditSchema = external_exports.object({
@@ -28587,8 +28761,8 @@ var DEFAULT_CLUSTER_STEP_MODELS = Object.freeze(Object.fromEntries(CLUSTER_MODEL
28587
28761
  var CLUSTER_STEP_SETTING_FIELDS = [{
28588
28762
  stepId: "face-embedding",
28589
28763
  key: "minLandmarkFaceSize",
28590
- label: "Min face size for recognition (detection px)",
28591
- 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.",
28764
+ label: "Min face size to embed (detection-frame px)",
28765
+ description: "Faces smaller than this in the small frame the detector sees are not embedded, so they can never be recognised. Below it the face cannot be aligned reliably and a bad embedding matches everyone. Same value on every node. 0 = no limit.",
28592
28766
  type: "slider",
28593
28767
  min: 0,
28594
28768
  max: 64,
@@ -29278,7 +29452,12 @@ var RetrainMacroClassSchema = external_exports.enum([
29278
29452
  "plate"
29279
29453
  ]);
29280
29454
  var RetrainAnnotationKindSchema = external_exports.enum(["subject", "model_error"]);
29281
- var RetrainAnnotationSourceSchema = external_exports.enum(["operator", "assist"]);
29455
+ var RetrainAnnotationSourceSchema = external_exports.enum([
29456
+ "operator",
29457
+ "assist",
29458
+ "pipeline",
29459
+ "llm"
29460
+ ]);
29282
29461
  var RetrainBboxSchema = external_exports.object({
29283
29462
  x: external_exports.number(),
29284
29463
  y: external_exports.number(),
@@ -29287,7 +29466,8 @@ var RetrainBboxSchema = external_exports.object({
29287
29466
  });
29288
29467
  var RetrainAnnotationSchema = external_exports.object({
29289
29468
  id: external_exports.string(),
29290
- trackId: external_exports.string(),
29469
+ /** The frame's track. Absent on a recording still, which has none. */
29470
+ trackId: external_exports.string().optional(),
29291
29471
  deviceId: external_exports.number(),
29292
29472
  /** The COPY in retrain storage — never the source track's media key. */
29293
29473
  mediaKey: external_exports.string(),
@@ -29333,17 +29513,50 @@ var RetrainFrameCandidateSchema = external_exports.object({
29333
29513
  * fail, whatever became of the original. */
29334
29514
  copied: external_exports.boolean()
29335
29515
  });
29516
+ var RetrainPipelineBoxSchema = external_exports.object({
29517
+ /** Normalised `[0,1]` against the full frame. */
29518
+ bbox: RetrainBboxSchema,
29519
+ macroClass: RetrainMacroClassSchema,
29520
+ label: external_exports.string().optional(),
29521
+ subLabel: external_exports.string().optional(),
29522
+ /** The detection score of the position used, when it was recorded. */
29523
+ score: external_exports.number().optional(),
29524
+ /** The root model that produced the track, when it was recorded. */
29525
+ modelId: external_exports.string().optional(),
29526
+ trackId: external_exports.string(),
29527
+ /** `subject-box`: recorded on this very frame. `position`: the track's
29528
+ * position nearest the capture time, `deltaMs` away. */
29529
+ basis: external_exports.enum(["subject-box", "position"]),
29530
+ deltaMs: external_exports.number()
29531
+ });
29532
+ var RetrainFrameOriginSchema = external_exports.enum(["track", "recording"]);
29336
29533
  var RetrainFrameSchema = external_exports.object({
29337
29534
  frameId: external_exports.string(),
29338
29535
  deviceId: external_exports.number(),
29339
- trackId: external_exports.string(),
29340
- /** Provenance only. It may already point at nothing — that is expected. */
29341
- sourceMediaId: external_exports.number().int(),
29536
+ origin: RetrainFrameOriginSchema,
29537
+ /** The track it was copied from. Absent on a recording still. */
29538
+ trackId: external_exports.string().optional(),
29539
+ /** Provenance only. It may already point at nothing — that is expected.
29540
+ * Absent on a recording still. */
29541
+ sourceMediaId: external_exports.number().int().optional(),
29542
+ /** A recording still: the playhead instant it was taken at. */
29543
+ epochMs: external_exports.number().optional(),
29342
29544
  sourceKind: MediaFileKindEnum,
29343
29545
  sizeBytes: external_exports.number().int(),
29344
29546
  width: external_exports.number().int(),
29345
29547
  height: external_exports.number().int(),
29346
- copiedAt: external_exports.number()
29548
+ copiedAt: external_exports.number(),
29549
+ /** When the CAMERA captured the frame. Absent on a copy taken before D785. */
29550
+ capturedAt: external_exports.number().optional(),
29551
+ /** The operator's "every subject in this frame is boxed". Detector
29552
+ * evaluation keeps only complete frames: an unboxed subject would count as
29553
+ * a false positive. */
29554
+ complete: external_exports.boolean(),
29555
+ /** The boxes the pipeline drew on this frame. Present on list answers;
29556
+ * empty when nothing the track store holds can be placed on it. */
29557
+ pipelineBoxes: external_exports.array(RetrainPipelineBoxSchema).readonly().optional(),
29558
+ /** The named collections this frame belongs to. Present on list answers. */
29559
+ collectionIds: external_exports.array(external_exports.string()).readonly().optional()
29347
29560
  });
29348
29561
  var RetrainCopyRefusalSchema = external_exports.enum([
29349
29562
  "source-missing",
@@ -29363,6 +29576,38 @@ var RetrainFrameListSchema = external_exports.object({
29363
29576
  /** What the page pre-selects — the native key frame when one survives. */
29364
29577
  autoPickMediaId: external_exports.number().int().optional()
29365
29578
  });
29579
+ var RetrainExportFilterSchema = external_exports.object({
29580
+ deviceIds: external_exports.array(external_exports.number()).optional(),
29581
+ frameIds: external_exports.array(external_exports.string()).max(2e4).optional(),
29582
+ /** Only frames in at least one of these named collections. */
29583
+ collectionIds: external_exports.array(external_exports.string()).max(200).optional(),
29584
+ /** Exactly the frames of this dataset version (and its completeOnly). An
29585
+ * unknown id selects nothing. */
29586
+ datasetVersionId: external_exports.string().optional(),
29587
+ batchId: external_exports.string().optional(),
29588
+ /** Only frames the operator marked complete (all subjects boxed). */
29589
+ completeOnly: external_exports.boolean().optional()
29590
+ });
29591
+ var RetrainExportLayoutSchema = external_exports.enum(["frames", "crops"]);
29592
+ var RetrainArchiveTargetSchema = external_exports.object({
29593
+ kind: external_exports.literal("http"),
29594
+ method: external_exports.enum(["PUT", "POST"]),
29595
+ url: external_exports.string().url(),
29596
+ headers: external_exports.record(external_exports.string(), external_exports.string()).optional()
29597
+ });
29598
+ var RetrainArchiveResultSchema = external_exports.object({
29599
+ batchId: external_exports.string(),
29600
+ frames: external_exports.number().int(),
29601
+ crops: external_exports.number().int(),
29602
+ annotations: external_exports.number().int(),
29603
+ /** Frames planned but not shipped (unreadable copy, path too long). */
29604
+ missing: external_exports.number().int(),
29605
+ bytes: external_exports.number().int(),
29606
+ /** sha256 of the exact bytes sent. */
29607
+ sha256: external_exports.string(),
29608
+ /** The target's HTTP status. */
29609
+ status: external_exports.number().int()
29610
+ });
29366
29611
  var RetrainAssistSubjectSchema = external_exports.discriminatedUnion("kind", [external_exports.object({
29367
29612
  kind: external_exports.literal("package"),
29368
29613
  zone: RetrainBboxSchema.optional()
@@ -29386,6 +29631,151 @@ var RetrainAssistResultSchema = external_exports.discriminatedUnion("kind", [ext
29386
29631
  reason: external_exports.string(),
29387
29632
  detail: external_exports.string().optional()
29388
29633
  })]);
29634
+ var RetrainCollectionSchema = external_exports.object({
29635
+ id: external_exports.string(),
29636
+ name: external_exports.string(),
29637
+ createdAt: external_exports.number(),
29638
+ frameCount: external_exports.number().int()
29639
+ });
29640
+ var RetrainCollectionCreateResultSchema = external_exports.discriminatedUnion("kind", [external_exports.object({
29641
+ kind: external_exports.literal("created"),
29642
+ collection: RetrainCollectionSchema
29643
+ }), external_exports.object({
29644
+ kind: external_exports.literal("refused"),
29645
+ reason: external_exports.enum(["empty-name", "duplicate-name"])
29646
+ })]);
29647
+ var RetrainCollectionRenameResultSchema = external_exports.discriminatedUnion("kind", [external_exports.object({
29648
+ kind: external_exports.literal("renamed"),
29649
+ collection: RetrainCollectionSchema
29650
+ }), external_exports.object({
29651
+ kind: external_exports.literal("refused"),
29652
+ reason: external_exports.enum([
29653
+ "empty-name",
29654
+ "duplicate-name",
29655
+ "unknown-collection"
29656
+ ])
29657
+ })]);
29658
+ var AddRetrainFrameFromRecordingResultSchema = external_exports.discriminatedUnion("kind", [external_exports.object({
29659
+ kind: external_exports.literal("added"),
29660
+ collectionId: external_exports.string(),
29661
+ frame: RetrainFrameSchema,
29662
+ /** The moment was already in the dataset; nothing was decoded. */
29663
+ reused: external_exports.boolean()
29664
+ }), external_exports.object({
29665
+ kind: external_exports.literal("refused"),
29666
+ reason: external_exports.enum([
29667
+ "unknown-collection",
29668
+ "still-unavailable",
29669
+ "still-busy",
29670
+ "unreadable-image",
29671
+ "write-failed"
29672
+ ]),
29673
+ detail: external_exports.string().optional()
29674
+ })]);
29675
+ var RetrainAssistProfileSchema = external_exports.object({
29676
+ id: external_exports.string(),
29677
+ name: external_exports.string(),
29678
+ model: external_exports.string(),
29679
+ kind: external_exports.string(),
29680
+ /** `true` when the frame would leave the house (a cloud vendor, or an
29681
+ * endpoint that is not on the local network). The page confirms each such
29682
+ * run, and the provider refuses one without `allowCloud`. */
29683
+ leavesHouse: external_exports.boolean()
29684
+ });
29685
+ var RetrainLlmProposalSchema = RetrainAnnotationDraftSchema.extend({ reason: external_exports.string() });
29686
+ var RetrainLlmReviewSchema = external_exports.object({
29687
+ /** The `ref` the page sent the box under. */
29688
+ ref: external_exports.string(),
29689
+ verdict: external_exports.enum([
29690
+ "confirmed",
29691
+ "wrong-class",
29692
+ "not-an-object",
29693
+ "uncertain"
29694
+ ]),
29695
+ suggestedClass: RetrainMacroClassSchema.optional(),
29696
+ reason: external_exports.string()
29697
+ });
29698
+ var RetrainLlmAssistResultSchema = external_exports.discriminatedUnion("kind", [external_exports.object({
29699
+ kind: external_exports.literal("proposed"),
29700
+ profileId: external_exports.string(),
29701
+ model: external_exports.string(),
29702
+ /** The frame was sent outside the house for this answer. */
29703
+ leftHouse: external_exports.boolean(),
29704
+ proposals: external_exports.array(RetrainLlmProposalSchema).readonly(),
29705
+ reviews: external_exports.array(RetrainLlmReviewSchema).readonly(),
29706
+ rejected: external_exports.number().int()
29707
+ }), external_exports.object({
29708
+ kind: external_exports.literal("refused"),
29709
+ reason: external_exports.enum([
29710
+ "unknown-frame",
29711
+ "unreadable-frame",
29712
+ "unknown-profile",
29713
+ "profile-disabled",
29714
+ "no-vision",
29715
+ "cloud-not-confirmed",
29716
+ "llm-error",
29717
+ "malformed-answer"
29718
+ ]),
29719
+ detail: external_exports.string().optional()
29720
+ })]);
29721
+ var RetrainDatasetSelectionSchema = external_exports.object({
29722
+ deviceIds: external_exports.array(external_exports.number()).readonly().optional(),
29723
+ collectionIds: external_exports.array(external_exports.string()).max(200).readonly().optional(),
29724
+ frameIds: external_exports.array(external_exports.string()).max(2e4).readonly().optional()
29725
+ });
29726
+ var RetrainDatasetStatsSchema = external_exports.object({
29727
+ frames: external_exports.number().int(),
29728
+ completeFrames: external_exports.number().int(),
29729
+ /** `completeFrames / frames`, 0..1. */
29730
+ completeness: external_exports.number(),
29731
+ /** Boxes to learn (model errors excluded). */
29732
+ subjects: external_exports.number().int(),
29733
+ modelErrors: external_exports.number().int(),
29734
+ /** Complete frames with no subject. */
29735
+ hardNegatives: external_exports.number().int(),
29736
+ /** Subjects per class × camera × day/night. */
29737
+ cells: external_exports.array(external_exports.object({
29738
+ macroClass: external_exports.string(),
29739
+ deviceId: external_exports.number(),
29740
+ lighting: external_exports.enum([
29741
+ "day",
29742
+ "night",
29743
+ "unknown"
29744
+ ]),
29745
+ subjects: external_exports.number().int(),
29746
+ frames: external_exports.number().int()
29747
+ })).readonly(),
29748
+ cameras: external_exports.array(external_exports.object({
29749
+ deviceId: external_exports.number(),
29750
+ frames: external_exports.number().int(),
29751
+ completeFrames: external_exports.number().int()
29752
+ })).readonly()
29753
+ });
29754
+ var RetrainDatasetVersionSchema = external_exports.object({
29755
+ id: external_exports.string(),
29756
+ name: external_exports.string(),
29757
+ createdAt: external_exports.number(),
29758
+ selection: RetrainDatasetSelectionSchema,
29759
+ layout: RetrainExportLayoutSchema,
29760
+ completeOnly: external_exports.boolean(),
29761
+ frameCount: external_exports.number().int(),
29762
+ /** sha256 of what the frames taught when the version was frozen. */
29763
+ annotationHash: external_exports.string(),
29764
+ /** The export manifest schema the version was cut under. */
29765
+ manifestSchema: external_exports.string(),
29766
+ stats: RetrainDatasetStatsSchema
29767
+ });
29768
+ var CreateRetrainDatasetVersionResultSchema = external_exports.discriminatedUnion("kind", [external_exports.object({
29769
+ kind: external_exports.literal("created"),
29770
+ version: RetrainDatasetVersionSchema
29771
+ }), external_exports.object({
29772
+ kind: external_exports.literal("refused"),
29773
+ reason: external_exports.enum([
29774
+ "empty-name",
29775
+ "duplicate-name",
29776
+ "no-frames"
29777
+ ])
29778
+ })]);
29389
29779
  var RetrainTransitionResultSchema = external_exports.object({
29390
29780
  trackId: external_exports.string(),
29391
29781
  /** Where the track ended up, whatever happened. */
@@ -30447,7 +30837,7 @@ var pipelineAnalyticsCapability = {
30447
30837
  * a frame leaves the dataset before export. */
30448
30838
  deselectRetrainFrame: method(external_exports.object({
30449
30839
  deviceId: external_exports.number(),
30450
- trackId: external_exports.string(),
30840
+ trackId: external_exports.string().optional(),
30451
30841
  frameId: external_exports.string()
30452
30842
  }), external_exports.object({
30453
30843
  removed: external_exports.boolean(),
@@ -30490,7 +30880,8 @@ var pipelineAnalyticsCapability = {
30490
30880
  */
30491
30881
  proposeRetrainAnnotations: method(external_exports.object({
30492
30882
  deviceId: external_exports.number(),
30493
- trackId: external_exports.string(),
30883
+ /** The frame's track, when it has one — checked against the frame. */
30884
+ trackId: external_exports.string().optional(),
30494
30885
  frameId: external_exports.string(),
30495
30886
  subject: RetrainAssistSubjectSchema,
30496
30887
  /** Which node runs it. Absent ⇒ wherever an unowned call lands. */
@@ -30499,8 +30890,12 @@ var pipelineAnalyticsCapability = {
30499
30890
  kind: "mutation",
30500
30891
  auth: "admin"
30501
30892
  }),
30502
- /** Every annotation on a track, oldest first. */
30503
- listRetrainAnnotations: method(external_exports.object({ trackId: external_exports.string() }), external_exports.array(RetrainAnnotationSchema).readonly(), {
30893
+ /** Every annotation on a track, or on named frames (a recording still has
30894
+ * no track), oldest first. One of the two is required. */
30895
+ listRetrainAnnotations: method(external_exports.object({
30896
+ trackId: external_exports.string().optional(),
30897
+ frameIds: external_exports.array(external_exports.string()).max(2e3).optional()
30898
+ }), external_exports.array(RetrainAnnotationSchema).readonly(), {
30504
30899
  kind: "query",
30505
30900
  auth: "admin"
30506
30901
  }),
@@ -30519,7 +30914,8 @@ var pipelineAnalyticsCapability = {
30519
30914
  */
30520
30915
  saveRetrainAnnotations: method(external_exports.object({
30521
30916
  deviceId: external_exports.number(),
30522
- trackId: external_exports.string(),
30917
+ /** The frame's track, when it has one — checked against the frame. */
30918
+ trackId: external_exports.string().optional(),
30523
30919
  frameId: external_exports.string(),
30524
30920
  annotations: external_exports.array(RetrainAnnotationDraftSchema)
30525
30921
  }), external_exports.array(RetrainAnnotationSchema).readonly(), {
@@ -30571,7 +30967,193 @@ var pipelineAnalyticsCapability = {
30571
30967
  * out, so two crops of the same subject can never end up in one feature
30572
30968
  * space (D52).
30573
30969
  */
30574
- getRetrainExportUrl: method(external_exports.object({ deviceIds: external_exports.array(external_exports.number()).optional() }), external_exports.object({ url: external_exports.string() }), {
30970
+ getRetrainExportUrl: method(RetrainExportFilterSchema.extend({ layout: RetrainExportLayoutSchema.optional() }), external_exports.object({ url: external_exports.string() }), {
30971
+ kind: "query",
30972
+ auth: "admin"
30973
+ }),
30974
+ /**
30975
+ * The operator's "every subject in this frame is boxed" — set and cleared
30976
+ * by hand, never derived: a frame with no box may be a complete hard
30977
+ * negative, and a frame with three boxes may still miss a fourth person.
30978
+ */
30979
+ setRetrainFrameComplete: method(external_exports.object({
30980
+ deviceId: external_exports.number(),
30981
+ trackId: external_exports.string().optional(),
30982
+ frameId: external_exports.string(),
30983
+ complete: external_exports.boolean()
30984
+ }), RetrainFrameSchema, {
30985
+ kind: "mutation",
30986
+ auth: "admin"
30987
+ }),
30988
+ /**
30989
+ * Stream the annotated archive to a TARGET instead of a browser — the
30990
+ * same tar `getRetrainExportUrl` serves (manifest first, one JPEG in
30991
+ * memory at a time, paced), written chunk by chunk into one HTTP request.
30992
+ * The bytes never cross this cap and never land on the hub's disk; the
30993
+ * answer is what was sent, with its sha256.
30994
+ */
30995
+ writeRetrainArchive: method(external_exports.object({
30996
+ filter: RetrainExportFilterSchema,
30997
+ layout: RetrainExportLayoutSchema,
30998
+ target: RetrainArchiveTargetSchema
30999
+ }), RetrainArchiveResultSchema, {
31000
+ kind: "mutation",
31001
+ auth: "admin",
31002
+ timeoutMs: 60 * 6e4
31003
+ }),
31004
+ /** The counts a selection would freeze — class × camera × day/night,
31005
+ * completeness — without freezing anything. Index reads only. */
31006
+ previewRetrainDataset: method(external_exports.object({
31007
+ selection: RetrainDatasetSelectionSchema,
31008
+ completeOnly: external_exports.boolean().optional()
31009
+ }), RetrainDatasetStatsSchema, {
31010
+ kind: "query",
31011
+ auth: "admin"
31012
+ }),
31013
+ /**
31014
+ * Freeze a dataset version: the frames the selection yields (the same plan
31015
+ * the annotated export builds), the hash of what they teach, the export
31016
+ * parameters and the counts. Immutable — a different selection is a new
31017
+ * version. Export it with `getRetrainExportUrl({ datasetVersionId })`.
31018
+ */
31019
+ createRetrainDatasetVersion: method(external_exports.object({
31020
+ name: external_exports.string().max(120),
31021
+ selection: RetrainDatasetSelectionSchema,
31022
+ layout: RetrainExportLayoutSchema,
31023
+ completeOnly: external_exports.boolean()
31024
+ }), CreateRetrainDatasetVersionResultSchema, {
31025
+ kind: "mutation",
31026
+ auth: "admin",
31027
+ timeoutMs: 12e4
31028
+ }),
31029
+ /** Every dataset version, newest first. */
31030
+ listRetrainDatasetVersions: method(external_exports.object({}), external_exports.array(RetrainDatasetVersionSchema).readonly(), {
31031
+ kind: "query",
31032
+ auth: "admin"
31033
+ }),
31034
+ /** Delete a version. Its frames stay in the dataset. */
31035
+ deleteRetrainDatasetVersion: method(external_exports.object({ id: external_exports.string() }), external_exports.object({ deleted: external_exports.boolean() }), {
31036
+ kind: "mutation",
31037
+ auth: "admin"
31038
+ }),
31039
+ /** Does the corpus still teach what the version froze? `missingFrames`
31040
+ * counts frames that left the dataset (or lost every box and tick). */
31041
+ verifyRetrainDatasetVersion: method(external_exports.object({ id: external_exports.string() }), external_exports.object({
31042
+ found: external_exports.boolean(),
31043
+ annotationHash: external_exports.string(),
31044
+ matches: external_exports.boolean(),
31045
+ missingFrames: external_exports.number().int()
31046
+ }), {
31047
+ kind: "query",
31048
+ auth: "admin",
31049
+ timeoutMs: 12e4
31050
+ }),
31051
+ /** The enabled, vision-capable LLM profiles, each saying whether a frame
31052
+ * sent to it leaves the house. */
31053
+ listRetrainAssistProfiles: method(external_exports.object({}), external_exports.array(RetrainAssistProfileSchema).readonly(), {
31054
+ kind: "query",
31055
+ auth: "admin"
31056
+ }),
31057
+ /**
31058
+ * Ask a vision LLM (the `llm` capability) about ONE copied frame: list the
31059
+ * objects of `classes` with boxes, and review the boxes already on the
31060
+ * canvas (sent by `ref`). Answers drafts (`source: 'llm'`) and reviews —
31061
+ * nothing is stored, nothing is accepted. A profile that sends the frame
31062
+ * outside the house is refused unless `allowCloud` says the operator
31063
+ * confirmed this run.
31064
+ */
31065
+ proposeRetrainAnnotationsWithLlm: method(external_exports.object({
31066
+ deviceId: external_exports.number(),
31067
+ trackId: external_exports.string().optional(),
31068
+ frameId: external_exports.string(),
31069
+ profileId: external_exports.string(),
31070
+ classes: external_exports.array(RetrainMacroClassSchema).min(1),
31071
+ boxes: external_exports.array(external_exports.object({
31072
+ ref: external_exports.string(),
31073
+ bbox: RetrainBboxSchema,
31074
+ macroClass: RetrainMacroClassSchema,
31075
+ label: external_exports.string().optional()
31076
+ })).max(50),
31077
+ allowCloud: external_exports.boolean()
31078
+ }), RetrainLlmAssistResultSchema, {
31079
+ kind: "mutation",
31080
+ auth: "admin",
31081
+ timeoutMs: 18e4
31082
+ }),
31083
+ /**
31084
+ * Create a named collection — a set over the retrain corpus ("packages
31085
+ * porch night"). Names are unique case-insensitively and never empty;
31086
+ * both refusals are named.
31087
+ */
31088
+ createRetrainCollection: method(external_exports.object({ name: external_exports.string().max(120) }), RetrainCollectionCreateResultSchema, {
31089
+ kind: "mutation",
31090
+ auth: "admin"
31091
+ }),
31092
+ /** Every collection, newest first, with its frame count. */
31093
+ listRetrainCollections: method(external_exports.object({}), external_exports.array(RetrainCollectionSchema).readonly(), {
31094
+ kind: "query",
31095
+ auth: "admin"
31096
+ }),
31097
+ renameRetrainCollection: method(external_exports.object({
31098
+ id: external_exports.string(),
31099
+ name: external_exports.string().max(120)
31100
+ }), RetrainCollectionRenameResultSchema, {
31101
+ kind: "mutation",
31102
+ auth: "admin"
31103
+ }),
31104
+ /**
31105
+ * Delete a collection. Its recording stills that no other collection
31106
+ * holds are deleted with their annotations (nothing else reaches them);
31107
+ * frames copied from tracks always stay in the dataset.
31108
+ */
31109
+ deleteRetrainCollection: method(external_exports.object({ id: external_exports.string() }), external_exports.object({
31110
+ deleted: external_exports.boolean(),
31111
+ removedFrames: external_exports.number().int()
31112
+ }), {
31113
+ kind: "mutation",
31114
+ auth: "admin"
31115
+ }),
31116
+ /**
31117
+ * Add the frame at a recording instant to a collection — the frame the
31118
+ * model may have seen NOTHING in. The recorder re-decodes the native
31119
+ * frame at `epochMs`; the dataset copies it (trackless, durable). The same
31120
+ * moment twice is one copy. Every refusal is named.
31121
+ */
31122
+ addRetrainFrameFromRecording: method(external_exports.object({
31123
+ collectionId: external_exports.string(),
31124
+ deviceId: external_exports.number(),
31125
+ epochMs: external_exports.number()
31126
+ }), AddRetrainFrameFromRecordingResultSchema, {
31127
+ kind: "mutation",
31128
+ auth: "admin",
31129
+ timeoutMs: 6e4
31130
+ }),
31131
+ /** Add frames already in the dataset to a collection. */
31132
+ addRetrainFramesToCollection: method(external_exports.object({
31133
+ collectionId: external_exports.string(),
31134
+ frameIds: external_exports.array(external_exports.string()).min(1).max(500)
31135
+ }), external_exports.object({
31136
+ added: external_exports.number().int(),
31137
+ alreadyMember: external_exports.number().int(),
31138
+ unknownFrameIds: external_exports.array(external_exports.string()).readonly()
31139
+ }), {
31140
+ kind: "mutation",
31141
+ auth: "admin"
31142
+ }),
31143
+ /** Remove a frame from a collection. A recording still left in no
31144
+ * collection is deleted with its annotations (`deletedFrame`). */
31145
+ removeRetrainFrameFromCollection: method(external_exports.object({
31146
+ collectionId: external_exports.string(),
31147
+ frameId: external_exports.string()
31148
+ }), external_exports.object({
31149
+ removed: external_exports.boolean(),
31150
+ deletedFrame: external_exports.boolean()
31151
+ }), {
31152
+ kind: "mutation",
31153
+ auth: "admin"
31154
+ }),
31155
+ /** The frames of a collection, with their pipeline boxes. */
31156
+ listRetrainCollectionFrames: method(external_exports.object({ collectionId: external_exports.string() }), external_exports.array(RetrainFrameSchema).readonly(), {
30575
31157
  kind: "query",
30576
31158
  auth: "admin"
30577
31159
  }),
@@ -30738,6 +31320,30 @@ var pipelineAnalyticsCapability = {
30738
31320
  }) }
30739
31321
  }
30740
31322
  };
31323
+ var SuppliedRootOutputSchema = external_exports.object({
31324
+ stepId: external_exports.string(),
31325
+ /** The root model that drew the boxes — stamped on the result. */
31326
+ modelId: external_exports.string(),
31327
+ detections: external_exports.array(external_exports.object({
31328
+ /** `[x1, y1, x2, y2]` in the pixels of the call's image. */
31329
+ bbox: external_exports.tuple([
31330
+ external_exports.number(),
31331
+ external_exports.number(),
31332
+ external_exports.number(),
31333
+ external_exports.number()
31334
+ ]),
31335
+ score: external_exports.number(),
31336
+ /**
31337
+ * Five facial landmarks in the same pixels — a face the step's own
31338
+ * detector already re-found inside a root face box (D730), so its
31339
+ * embedder child aligns it exactly as it aligns any detected face.
31340
+ */
31341
+ landmarks: external_exports.array(external_exports.object({
31342
+ x: external_exports.number(),
31343
+ y: external_exports.number()
31344
+ })).optional()
31345
+ })).min(1)
31346
+ });
30741
31347
  var NativeCropRefSchema = external_exports.object({
30742
31348
  /** Handle keying the retained native surface (node-pinned to its owner). */
30743
31349
  handle: FrameHandleSchema,
@@ -30776,7 +31382,7 @@ var FrameRefSchema = external_exports.object({
30776
31382
  timestamp: external_exports.number(),
30777
31383
  capturedAt: external_exports.number().optional()
30778
31384
  });
30779
- var ModelFormatSchema$1 = external_exports.enum([
31385
+ var ModelFormatSchema$2 = external_exports.enum([
30780
31386
  "onnx",
30781
31387
  "coreml",
30782
31388
  "openvino",
@@ -30794,7 +31400,7 @@ var PipelineSlotSchema = external_exports.enum([
30794
31400
  var PipelineEngineChoiceSchema = external_exports.object({
30795
31401
  runtime: external_exports.literal("python"),
30796
31402
  backend: external_exports.string(),
30797
- format: ModelFormatSchema$1,
31403
+ format: ModelFormatSchema$2,
30798
31404
  device: external_exports.string().optional()
30799
31405
  });
30800
31406
  var EffectiveTuningSchema = external_exports.object({
@@ -30828,32 +31434,15 @@ var PipelineDefaultStepSchema = external_exports.lazy(() => external_exports.obj
30828
31434
  group: external_exports.string().optional(),
30829
31435
  settings: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
30830
31436
  }));
30831
- var PipelineTemplateStepSchema = external_exports.lazy(() => external_exports.object({
30832
- addonId: external_exports.string(),
30833
- enabled: external_exports.boolean(),
30834
- modelId: external_exports.string(),
30835
- children: external_exports.array(PipelineTemplateStepSchema).readonly(),
30836
- settings: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
30837
- }));
30838
- var PipelineTemplateSchema$1 = external_exports.object({
30839
- id: external_exports.string(),
30840
- name: external_exports.string(),
30841
- createdAt: external_exports.string(),
30842
- updatedAt: external_exports.string(),
30843
- engine: PipelineEngineChoiceSchema,
30844
- steps: external_exports.array(PipelineTemplateStepSchema).readonly()
30845
- });
30846
31437
  var PipelineModelOptionSchema = external_exports.object({
30847
31438
  id: external_exports.string(),
30848
31439
  name: external_exports.string(),
30849
- formats: external_exports.record(external_exports.string(), external_exports.object({
30850
- downloaded: external_exports.boolean(),
30851
- sizeMB: external_exports.number()
30852
- })),
31440
+ formats: external_exports.record(external_exports.string(), PipelineModelFormatStatusSchema),
30853
31441
  group: ModelVariantGroupSchema.optional(),
30854
31442
  legacy: external_exports.boolean().optional(),
30855
31443
  provider: ModelProviderIdSchema.optional(),
30856
- defaultConfidence: external_exports.number().optional()
31444
+ defaultConfidence: external_exports.number().optional(),
31445
+ suppliesSteps: external_exports.array(RootStepSupplySchema).readonly().optional()
30857
31446
  });
30858
31447
  var ConfigFieldBridge = external_exports.custom();
30859
31448
  var PipelineAddonSchemaSchema = external_exports.object({
@@ -31041,6 +31630,32 @@ var pipelineExecutorCapability = {
31041
31630
  auth: "admin"
31042
31631
  }),
31043
31632
  /**
31633
+ * Auto tune (D745): the MODEL-BOUND thresholds (`bindsToModel` keys of
31634
+ * the object-detection root, and their binding keys) stored in THIS node's
31635
+ * per-camera detector settings — and, unless `dryRun`, remove them so the
31636
+ * running model's own defaults apply. Every other key of a camera's store
31637
+ * is kept. `nodeId` is the ROUTING key. `deviceIds` absent ⇒ every camera
31638
+ * with a store. A camera whose store could not be read is `refused`, never
31639
+ * reported as clean.
31640
+ */
31641
+ clearModelBoundDeviceOverrides: method(external_exports.object({
31642
+ nodeId: external_exports.string(),
31643
+ deviceIds: external_exports.array(external_exports.number()).readonly().optional(),
31644
+ dryRun: external_exports.boolean()
31645
+ }), external_exports.object({
31646
+ entries: external_exports.array(external_exports.object({
31647
+ deviceId: external_exports.number(),
31648
+ keys: external_exports.array(external_exports.string()).readonly()
31649
+ })).readonly(),
31650
+ refused: external_exports.array(external_exports.object({
31651
+ deviceId: external_exports.number(),
31652
+ reason: external_exports.string()
31653
+ })).readonly()
31654
+ }), {
31655
+ kind: "mutation",
31656
+ auth: "admin"
31657
+ }),
31658
+ /**
31044
31659
  * Which of THIS node's inference devices the executor currently refuses,
31045
31660
  * and why. `nodeId` is the ROUTING key (stripped by the generated router).
31046
31661
  *
@@ -31118,29 +31733,17 @@ var pipelineExecutorCapability = {
31118
31733
  steps: external_exports.array(PipelineStepInputSchema),
31119
31734
  deviceKey: external_exports.string().optional()
31120
31735
  }), PipelineValidationResultSchema),
31121
- listTemplates: method(external_exports.void(), external_exports.array(PipelineTemplateSchema$1).readonly()),
31122
- saveTemplate: method(external_exports.object({
31123
- name: external_exports.string(),
31124
- steps: external_exports.array(PipelineTemplateStepSchema).readonly(),
31125
- engine: PipelineEngineChoiceSchema
31126
- }), PipelineTemplateSchema$1, { kind: "mutation" }),
31127
- updateTemplate: method(external_exports.object({
31128
- id: external_exports.string(),
31129
- name: external_exports.string().optional(),
31130
- steps: external_exports.array(PipelineTemplateStepSchema).readonly().optional()
31131
- }), PipelineTemplateSchema$1, { kind: "mutation" }),
31132
- deleteTemplate: method(external_exports.object({ id: external_exports.string() }), external_exports.void(), { kind: "mutation" }),
31133
31736
  getCapabilities: method(external_exports.void(), InferenceCapabilitiesBridge),
31134
31737
  getAddonModels: method(external_exports.object({ addonId: external_exports.string() }), ModelAvailabilityListBridge),
31135
31738
  downloadModel: method(external_exports.object({
31136
31739
  addonId: external_exports.string(),
31137
31740
  modelId: external_exports.string(),
31138
- format: ModelFormatSchema$1
31741
+ format: ModelFormatSchema$2
31139
31742
  }), DownloadModelResultSchema, { kind: "mutation" }),
31140
31743
  deleteModel: method(external_exports.object({
31141
31744
  addonId: external_exports.string(),
31142
31745
  modelId: external_exports.string(),
31143
- format: ModelFormatSchema$1
31746
+ format: ModelFormatSchema$2
31144
31747
  }), external_exports.object({ success: external_exports.literal(true) }), { kind: "mutation" }),
31145
31748
  /**
31146
31749
  * Stateless single-frame execution. Callers (runner, benchmark) pass
@@ -31235,7 +31838,16 @@ var pipelineExecutorCapability = {
31235
31838
  * `device-not-servable`), and nothing reaches the camera's live
31236
31839
  * trace stream. Absent ⇒ unchanged behaviour.
31237
31840
  */
31238
- replay: external_exports.literal(true).optional()
31841
+ replay: external_exports.literal(true).optional(),
31842
+ /**
31843
+ * Root-supplied detections for the tree's ROOT step (D730). Set by
31844
+ * `runDetailSubtree` when the camera's root model supplies a crop-kind
31845
+ * step (a Frigate+ `license_plate` for `plate-detection`): the step is
31846
+ * NOT inferred, these boxes are its output, and its children (the plate
31847
+ * reader) run on them through their own crop policy. Boxes are in the
31848
+ * PIXELS of the image this call carries. Absent ⇒ the root step runs.
31849
+ */
31850
+ suppliedRoot: SuppliedRootOutputSchema.optional()
31239
31851
  }), PipelineRunResultBridge, { kind: "mutation" }),
31240
31852
  /**
31241
31853
  * Batched run — N raw frames packed into one cap call. The provider
@@ -31377,6 +31989,677 @@ var pipelineExecutorCapability = {
31377
31989
  getDetectionConfigSchema: method(external_exports.void(), ConfigUISchemaNullableBridge)
31378
31990
  }
31379
31991
  };
31992
+ var ModelFormatSchema$1 = external_exports.enum(MODEL_FORMATS);
31993
+ var MIN_SESSIONS_PER_DEVICE_RANGE = {
31994
+ min: 1,
31995
+ max: 8
31996
+ };
31997
+ var HardwareClassIdSchema = external_exports.enum([
31998
+ "intel-core-ultra",
31999
+ "intel-n-series",
32000
+ "apple-m-base",
32001
+ "apple-m-pro",
32002
+ "unknown"
32003
+ ]);
32004
+ var AcceleratorKindSchema = external_exports.enum([
32005
+ "intel-npu",
32006
+ "intel-igpu",
32007
+ "x86-cpu",
32008
+ "arm-cpu",
32009
+ "apple-ane",
32010
+ "coral"
32011
+ ]);
32012
+ var RecommendationReasonSchema = external_exports.discriminatedUnion("kind", [
32013
+ external_exports.object({
32014
+ kind: external_exports.literal("capacity"),
32015
+ sessions: external_exports.number(),
32016
+ minSessions: external_exports.number()
32017
+ }),
32018
+ external_exports.object({
32019
+ kind: external_exports.literal("tie-faster"),
32020
+ over: external_exports.string(),
32021
+ recallDelta: external_exports.number()
32022
+ }),
32023
+ external_exports.object({
32024
+ kind: external_exports.literal("stepped-down"),
32025
+ from: external_exports.string(),
32026
+ to: external_exports.string(),
32027
+ limitedBy: external_exports.string()
32028
+ }),
32029
+ external_exports.object({
32030
+ kind: external_exports.literal("no-fit-lightest"),
32031
+ sessions: external_exports.number(),
32032
+ minSessions: external_exports.number()
32033
+ }),
32034
+ external_exports.object({
32035
+ kind: external_exports.literal("derived-latency"),
32036
+ modelId: external_exports.string()
32037
+ }),
32038
+ external_exports.object({ kind: external_exports.literal("cpu-device") }),
32039
+ external_exports.object({ kind: external_exports.literal("coral-untouched") }),
32040
+ external_exports.object({ kind: external_exports.literal("device-disabled") }),
32041
+ external_exports.object({ kind: external_exports.literal("device-unavailable") }),
32042
+ external_exports.object({ kind: external_exports.literal("node-offline") }),
32043
+ external_exports.object({ kind: external_exports.literal("no-hardware-facts") }),
32044
+ external_exports.object({
32045
+ kind: external_exports.literal("no-measured-data"),
32046
+ hardwareClass: HardwareClassIdSchema
32047
+ }),
32048
+ external_exports.object({
32049
+ kind: external_exports.literal("no-family-build"),
32050
+ format: ModelFormatSchema$1
32051
+ }),
32052
+ external_exports.object({
32053
+ kind: external_exports.literal("kept-custom-pin"),
32054
+ modelId: external_exports.string(),
32055
+ deviceKey: external_exports.string()
32056
+ })
32057
+ ]);
32058
+ var KeptReasonSchema = external_exports.enum(["custom-pin"]);
32059
+ var LatencySourceSchema = external_exports.discriminatedUnion("kind", [external_exports.object({ kind: external_exports.literal("table") }), external_exports.object({
32060
+ kind: external_exports.literal("node-benchmark"),
32061
+ resultId: external_exports.string(),
32062
+ measuredAtMs: external_exports.number()
32063
+ })]);
32064
+ var DeviceModelChoiceSchema = external_exports.object({
32065
+ modelId: external_exports.string(),
32066
+ p50Ms: external_exports.number(),
32067
+ fps: external_exports.number(),
32068
+ measured: external_exports.boolean(),
32069
+ /** Absent on a plan from before D791 — read as the table. */
32070
+ source: LatencySourceSchema.optional(),
32071
+ /** Parallel sessions at the camera rate with the headroom kept free: ⌊fps × (1 − headroom) / camera fps⌋. */
32072
+ capacitySessions: external_exports.number(),
32073
+ personRecall: external_exports.number()
32074
+ });
32075
+ var DeviceRecommendationSchema = external_exports.object({
32076
+ deviceKey: external_exports.string(),
32077
+ accelerator: AcceleratorKindSchema.nullable(),
32078
+ enabled: external_exports.boolean(),
32079
+ available: external_exports.boolean(),
32080
+ chosen: DeviceModelChoiceSchema.nullable(),
32081
+ /** Present when the device is kept as is: Apply writes nothing on it. */
32082
+ kept: KeptReasonSchema.optional(),
32083
+ reasons: external_exports.array(RecommendationReasonSchema).readonly()
32084
+ });
32085
+ var NodeRecommendationSchema = external_exports.object({
32086
+ nodeId: external_exports.string(),
32087
+ reachable: external_exports.boolean(),
32088
+ hardwareClass: HardwareClassIdSchema.nullable(),
32089
+ cpuModel: external_exports.string().nullable(),
32090
+ skipped: external_exports.boolean(),
32091
+ acceleratorModelId: external_exports.string().nullable(),
32092
+ devices: external_exports.array(DeviceRecommendationSchema).readonly(),
32093
+ reasons: external_exports.array(RecommendationReasonSchema).readonly()
32094
+ });
32095
+ var ModelPinChangeSchema = external_exports.object({
32096
+ stepId: external_exports.string(),
32097
+ before: external_exports.string().nullable(),
32098
+ after: external_exports.string().nullable()
32099
+ });
32100
+ var NodeDeviceChangeSchema = external_exports.object({
32101
+ nodeId: external_exports.string(),
32102
+ deviceKey: external_exports.string(),
32103
+ madeExplicit: external_exports.boolean(),
32104
+ modelPins: external_exports.array(ModelPinChangeSchema).readonly(),
32105
+ thresholds: external_exports.array(external_exports.object({
32106
+ stepId: external_exports.string(),
32107
+ keys: external_exports.array(external_exports.string()).readonly()
32108
+ })).readonly()
32109
+ });
32110
+ var CameraOverrideClearSchema = external_exports.object({
32111
+ deviceId: external_exports.number(),
32112
+ source: external_exports.enum(["step-override", "wholesale"]),
32113
+ nodeId: external_exports.string(),
32114
+ deviceKey: external_exports.string().nullable(),
32115
+ stepId: external_exports.string(),
32116
+ modelIdBefore: external_exports.string().nullable(),
32117
+ keys: external_exports.array(external_exports.string()).readonly()
32118
+ });
32119
+ var DetectorStoreClearSchema = external_exports.object({
32120
+ deviceId: external_exports.number(),
32121
+ keys: external_exports.array(external_exports.string()).readonly()
32122
+ });
32123
+ var AutoTuneWarningSchema = external_exports.discriminatedUnion("kind", [
32124
+ external_exports.object({
32125
+ kind: external_exports.literal("detector-store-cluster-wide"),
32126
+ skippedNodes: external_exports.array(external_exports.string()).readonly()
32127
+ }),
32128
+ external_exports.object({
32129
+ kind: external_exports.literal("detector-store-unreadable"),
32130
+ error: external_exports.string()
32131
+ }),
32132
+ external_exports.object({
32133
+ kind: external_exports.literal("coral-enabled"),
32134
+ nodeId: external_exports.string(),
32135
+ deviceKey: external_exports.string()
32136
+ }),
32137
+ external_exports.object({
32138
+ kind: external_exports.literal("custom-pin-kept"),
32139
+ nodeId: external_exports.string(),
32140
+ deviceKey: external_exports.string().nullable(),
32141
+ deviceId: external_exports.number().nullable(),
32142
+ modelId: external_exports.string()
32143
+ }),
32144
+ external_exports.object({
32145
+ kind: external_exports.literal("custom-registry-unreadable"),
32146
+ error: external_exports.string()
32147
+ })
32148
+ ]);
32149
+ var AutoTuneOptionsSchema = external_exports.object({
32150
+ /** Share of each accelerator's throughput kept free (0.3–0.5). */
32151
+ headroom: external_exports.number().min(0.3).max(0.5).default(0.4),
32152
+ /**
32153
+ * The least number of parallel sessions every device must sustain at the
32154
+ * camera rate with the headroom kept free (D755). The most accurate model
32155
+ * that reaches it wins.
32156
+ */
32157
+ minSessionsPerDevice: external_exports.number().int().min(MIN_SESSIONS_PER_DEVICE_RANGE.min).max(MIN_SESSIONS_PER_DEVICE_RANGE.max).default(2)
32158
+ });
32159
+ var AutoTunePlanSchema = external_exports.object({
32160
+ /** Hash of everything the apply will write — the apply refuses a different one. */
32161
+ planHash: external_exports.string(),
32162
+ family: external_exports.literal("yolov9"),
32163
+ headroom: external_exports.number(),
32164
+ minSessionsPerDevice: external_exports.number(),
32165
+ /** The detection rate a session is counted at (the fastest camera running the pipeline root). */
32166
+ cameraFps: external_exports.number(),
32167
+ generatedAt: external_exports.number(),
32168
+ nodes: external_exports.array(NodeRecommendationSchema).readonly(),
32169
+ nodeChanges: external_exports.array(NodeDeviceChangeSchema).readonly(),
32170
+ cameraClears: external_exports.array(CameraOverrideClearSchema).readonly(),
32171
+ detectorStoreClears: external_exports.array(DetectorStoreClearSchema).readonly(),
32172
+ warnings: external_exports.array(AutoTuneWarningSchema).readonly()
32173
+ });
32174
+ var AutoTuneApplyInputSchema = external_exports.object({
32175
+ planHash: external_exports.string(),
32176
+ headroom: external_exports.number().min(0.3).max(0.5).default(0.4),
32177
+ minSessionsPerDevice: external_exports.number().int().min(MIN_SESSIONS_PER_DEVICE_RANGE.min).max(MIN_SESSIONS_PER_DEVICE_RANGE.max).default(2)
32178
+ });
32179
+ var AutoTunePhaseResultSchema = external_exports.object({
32180
+ phase: external_exports.enum([
32181
+ "download",
32182
+ "camera-overrides",
32183
+ "detector-thresholds",
32184
+ "node-models",
32185
+ "redispatch"
32186
+ ]),
32187
+ ok: external_exports.boolean(),
32188
+ detail: external_exports.string()
32189
+ });
32190
+ var AutoTuneApplyResultSchema = external_exports.discriminatedUnion("kind", [
32191
+ external_exports.object({
32192
+ kind: external_exports.literal("applied"),
32193
+ planHash: external_exports.string(),
32194
+ phases: external_exports.array(AutoTunePhaseResultSchema).readonly()
32195
+ }),
32196
+ external_exports.object({
32197
+ kind: external_exports.literal("aborted"),
32198
+ phases: external_exports.array(AutoTunePhaseResultSchema).readonly()
32199
+ }),
32200
+ external_exports.object({
32201
+ kind: external_exports.literal("stale"),
32202
+ plan: AutoTunePlanSchema
32203
+ }),
32204
+ external_exports.object({
32205
+ kind: external_exports.literal("refused"),
32206
+ reason: external_exports.enum(["apply-in-progress"])
32207
+ })
32208
+ ]);
32209
+ var SessionPlacementPolicySchema = external_exports.enum(["least-loaded", "share"]);
32210
+ var LoadBalancingSharesInputSchema = external_exports.object({
32211
+ /** nodeId → share (> 0). A node left out keeps its weight. */
32212
+ nodes: external_exports.record(external_exports.string(), external_exports.number().positive()).default({}),
32213
+ /** nodeId → deviceKey → share (> 0). A device left out keeps its weight. */
32214
+ devices: external_exports.record(external_exports.string(), external_exports.record(external_exports.string(), external_exports.number().positive())).default({})
32215
+ });
32216
+ var PlacementStatsInputSchema = external_exports.object({
32217
+ /** Window the observed shares are averaged over (default 1 h, max 24 h). */
32218
+ windowMs: external_exports.number().int().min(6e4).max(1440 * 60 * 1e3).default(3600 * 1e3)
32219
+ });
32220
+ var PlacementDeviceStatsSchema = external_exports.object({
32221
+ deviceKey: external_exports.string(),
32222
+ /** Sessions running on this device now. */
32223
+ sessionsNow: external_exports.number(),
32224
+ /** Sessions started on this device inside the window. */
32225
+ sessionsStarted: external_exports.number(),
32226
+ /** Time-weighted share of the node's parallel sessions over the window (0–1); null = no session ran. */
32227
+ observedShare: external_exports.number().nullable()
32228
+ });
32229
+ var PlacementNodeStatsSchema = external_exports.object({
32230
+ nodeId: external_exports.string(),
32231
+ sessionsNow: external_exports.number(),
32232
+ sessionsStarted: external_exports.number(),
32233
+ /** Time-weighted share of the cluster's parallel sessions over the window (0–1); null = none ran. */
32234
+ observedShare: external_exports.number().nullable(),
32235
+ /** Most sessions this node ran at once inside the window. */
32236
+ peakSessions: external_exports.number(),
32237
+ /** Sessions a share election handed elsewhere because this node was full or drowning. */
32238
+ yieldsAway: external_exports.number(),
32239
+ devices: external_exports.array(PlacementDeviceStatsSchema).readonly()
32240
+ });
32241
+ var StaleDevicePinSchema = external_exports.object({
32242
+ deviceId: external_exports.number(),
32243
+ deviceKey: external_exports.string(),
32244
+ /** `disabled` — the key exists on some node but is not enabled anywhere; `absent` — no node has it. */
32245
+ reason: external_exports.enum(["disabled", "absent"])
32246
+ });
32247
+ var PlacementStatsSchema = external_exports.object({
32248
+ policy: SessionPlacementPolicySchema,
32249
+ windowMs: external_exports.number(),
32250
+ /** How much of the window was actually observed (the hub keeps it in memory). */
32251
+ observedForMs: external_exports.number(),
32252
+ sessionsNow: external_exports.number(),
32253
+ /** Most parallel sessions across the cluster inside the window. */
32254
+ clusterPeakSessions: external_exports.number(),
32255
+ nodes: external_exports.array(PlacementNodeStatsSchema).readonly(),
32256
+ stalePins: external_exports.array(StaleDevicePinSchema).readonly()
32257
+ });
32258
+ var CapacitySourceSchema = external_exports.enum(["hardware", "benchmark"]);
32259
+ var CapacityFallbackSchema = external_exports.enum(["no-benchmark-results", "partial-benchmark-results"]);
32260
+ var SuggestSharesInputSchema = external_exports.object({
32261
+ headroom: external_exports.number().min(0.3).max(0.5).default(0.4),
32262
+ /** Default `hardware`. */
32263
+ source: CapacitySourceSchema.default("hardware")
32264
+ });
32265
+ var SuggestedDeviceShareSchema = external_exports.object({
32266
+ deviceKey: external_exports.string(),
32267
+ /** Share of the node (0–100, rounded). */
32268
+ share: external_exports.number(),
32269
+ modelId: external_exports.string().nullable(),
32270
+ /** Inferences per second at that model, from the measured table; null when sized by a benchmark. */
32271
+ fps: external_exports.number().nullable(),
32272
+ /** False for a table cell derived from another chip; true for a measured cell or a benchmark. */
32273
+ measured: external_exports.boolean(),
32274
+ /**
32275
+ * Advisory session cap: ⌊fps × (1 − headroom) / camera fps⌋ from the table,
32276
+ * or the benchmark's measured max sessions. Never enforced.
32277
+ */
32278
+ suggestedMaxSessions: external_exports.number().nullable()
32279
+ });
32280
+ var SuggestedNodeShareSchema = external_exports.object({
32281
+ nodeId: external_exports.string(),
32282
+ /** Share of the cluster (0–100, rounded); null = node skipped (offline, unknown hardware). */
32283
+ share: external_exports.number().nullable(),
32284
+ /** Parallel sessions the node sustains at the suggested models with the headroom kept free. */
32285
+ capacitySessions: external_exports.number(),
32286
+ devices: external_exports.array(SuggestedDeviceShareSchema).readonly(),
32287
+ skippedReason: external_exports.string().nullable(),
32288
+ /** What this node's capacity was read from; null when the node is skipped. */
32289
+ capacitySource: CapacitySourceSchema.nullable(),
32290
+ /** Set when the `benchmark` source was asked for and this node used `hardware`. */
32291
+ capacityFallback: CapacityFallbackSchema.nullable()
32292
+ });
32293
+ var SuggestSharesResultSchema = external_exports.object({
32294
+ headroom: external_exports.number(),
32295
+ /** The source asked for; each node says what it actually used. */
32296
+ source: CapacitySourceSchema,
32297
+ /** Camera detection rate the capacity is counted in (the fastest camera's fps). */
32298
+ cameraFps: external_exports.number(),
32299
+ /** The Auto tune capacity floor the models were picked at. */
32300
+ minSessionsPerDevice: external_exports.number(),
32301
+ nodes: external_exports.array(SuggestedNodeShareSchema).readonly()
32302
+ });
32303
+ var ShareSourceSchema = external_exports.enum([
32304
+ "hardware",
32305
+ "benchmark",
32306
+ "manual"
32307
+ ]);
32308
+ var SetShareSourceInputSchema = external_exports.object({ source: ShareSourceSchema });
32309
+ var ShareWeightsSchema = external_exports.object({
32310
+ nodes: external_exports.record(external_exports.string(), external_exports.number()),
32311
+ devices: external_exports.record(external_exports.string(), external_exports.record(external_exports.string(), external_exports.number()))
32312
+ });
32313
+ var EffectiveDeviceShareSchema = external_exports.object({
32314
+ deviceKey: external_exports.string(),
32315
+ /** Can take sessions now (enabled, available, can run the root). */
32316
+ eligible: external_exports.boolean(),
32317
+ /** The share the source assigns, as a percentage of the node's devices. */
32318
+ configuredPct: external_exports.number(),
32319
+ /** The share actually used, after an ineligible device's share went to the others. */
32320
+ effectivePct: external_exports.number()
32321
+ });
32322
+ var EffectiveNodeShareSchema = external_exports.object({
32323
+ nodeId: external_exports.string(),
32324
+ eligible: external_exports.boolean(),
32325
+ configuredPct: external_exports.number(),
32326
+ effectivePct: external_exports.number(),
32327
+ /** Automatic sources: what this node's share was computed from; null under `manual` or before the first answer. */
32328
+ capacitySource: CapacitySourceSchema.nullable(),
32329
+ /** Automatic `benchmark`: why this node used `hardware` instead. */
32330
+ capacityFallback: CapacityFallbackSchema.nullable(),
32331
+ devices: external_exports.array(EffectiveDeviceShareSchema).readonly()
32332
+ });
32333
+ var EffectiveSharesSchema = external_exports.object({
32334
+ source: ShareSourceSchema,
32335
+ policy: SessionPlacementPolicySchema,
32336
+ /** An automatic source with no computed answer yet: the stored sliders are used meanwhile. */
32337
+ autoPending: external_exports.boolean(),
32338
+ /** When the automatic shares were last computed (ms epoch); null = never. */
32339
+ computedAt: external_exports.number().nullable(),
32340
+ /** What made the system recompute them last. */
32341
+ trigger: external_exports.string().nullable(),
32342
+ nodes: external_exports.array(EffectiveNodeShareSchema).readonly(),
32343
+ /** The relative weights the election reads (before eligibility). */
32344
+ nodeWeights: external_exports.record(external_exports.string(), external_exports.number()),
32345
+ deviceWeights: external_exports.record(external_exports.string(), external_exports.record(external_exports.string(), external_exports.number()))
32346
+ });
32347
+ var NODE_BENCHMARK_DEFAULTS = {
32348
+ fpsPerStream: 10,
32349
+ budgetMinutes: 45,
32350
+ minBudgetMinutes: 10,
32351
+ maxBudgetMinutes: 120,
32352
+ /** A result older than this no longer beats the table. */
32353
+ staleAfterDays: 30,
32354
+ /** Warm-in per ramp step (not accounted). */
32355
+ settleSec: 5,
32356
+ /** Accounted window per ramp step. */
32357
+ measureSec: 20,
32358
+ /** Longest the drain may take before the run is refused. */
32359
+ drainTimeoutSec: 120,
32360
+ /** Candidate models per device in one run. */
32361
+ maxModelsPerDevice: 6
32362
+ };
32363
+ var NodeBenchmarkPhaseSchema = external_exports.enum(["device", "pipeline"]);
32364
+ var NodeBenchmarkDevicePlanSchema = external_exports.object({
32365
+ /** `<backend>:<device>` — `openvino:npu`, `coreml:all`, `cpu`. */
32366
+ deviceKey: external_exports.string().min(1),
32367
+ /**
32368
+ * Root detector candidates for the `device` measurement, in the order
32369
+ * measured. The FIRST is the one the `pipeline` measurement runs.
32370
+ */
32371
+ modelIds: external_exports.array(external_exports.string().min(1)).min(1).max(NODE_BENCHMARK_DEFAULTS.maxModelsPerDevice)
32372
+ });
32373
+ var NodeBenchmarkPlanSchema = external_exports.object({
32374
+ nodeId: external_exports.string().min(1),
32375
+ devices: external_exports.array(NodeBenchmarkDevicePlanSchema).min(1),
32376
+ /** Which measurements run. At least one. */
32377
+ phases: external_exports.array(NodeBenchmarkPhaseSchema).min(1).default(["device", "pipeline"]),
32378
+ /**
32379
+ * Detail steps (catalog step ids under the root: faces, plates,
32380
+ * classifiers, CLIP…) the `pipeline` measurement enables. The root
32381
+ * detector always runs.
32382
+ */
32383
+ steps: external_exports.array(external_exports.string().min(1)).default([]),
32384
+ /** Offered rate of one stream / session. */
32385
+ fpsPerStream: external_exports.number().int().min(1).max(30).default(NODE_BENCHMARK_DEFAULTS.fpsPerStream),
32386
+ /** Hard deadline: the mode ends and the cluster is restored when it passes. */
32387
+ budgetMinutes: external_exports.number().int().min(NODE_BENCHMARK_DEFAULTS.minBudgetMinutes).max(NODE_BENCHMARK_DEFAULTS.maxBudgetMinutes).default(NODE_BENCHMARK_DEFAULTS.budgetMinutes),
32388
+ /** Keep the models the run downloaded (default: delete what was not installed before). */
32389
+ keepDownloadedModels: external_exports.boolean().default(false),
32390
+ /** Start although the other nodes' capacity does not cover the sessions running now. */
32391
+ acceptInsufficientHeadroom: external_exports.boolean().default(false)
32392
+ });
32393
+ var NodeBenchmarkRefusalKindSchema = external_exports.enum([
32394
+ "benchmark-active",
32395
+ "node-offline",
32396
+ "unknown-device",
32397
+ "no-phase",
32398
+ "insufficient-headroom"
32399
+ ]);
32400
+ var NodeBenchmarkRefusalSchema = external_exports.object({
32401
+ kind: NodeBenchmarkRefusalKindSchema,
32402
+ detail: external_exports.string(),
32403
+ overridable: external_exports.boolean()
32404
+ });
32405
+ var NodeBenchmarkMovingCameraSchema = external_exports.object({
32406
+ deviceId: external_exports.number(),
32407
+ /** Placed on the node now (a standing attach or a running session). */
32408
+ placedOnNode: external_exports.boolean(),
32409
+ /** A node pin naming this node, ignored for the run. */
32410
+ pinnedToNode: external_exports.boolean()
32411
+ });
32412
+ var NodeBenchmarkStayingCameraSchema = external_exports.object({
32413
+ deviceId: external_exports.number(),
32414
+ reason: external_exports.literal("only-frame-source")
32415
+ });
32416
+ var NodeBenchmarkPreflightSchema = external_exports.object({
32417
+ nodeId: external_exports.string(),
32418
+ online: external_exports.boolean(),
32419
+ moving: external_exports.array(NodeBenchmarkMovingCameraSchema).readonly(),
32420
+ /** Keep running on the node during the run; the result is flagged contaminated. */
32421
+ staying: external_exports.array(NodeBenchmarkStayingCameraSchema).readonly(),
32422
+ estimatedDurationMs: external_exports.number(),
32423
+ /** The run ends and the cluster is restored at the latest after this long. */
32424
+ budgetMs: external_exports.number(),
32425
+ phases: external_exports.array(NodeBenchmarkPhaseSchema).readonly(),
32426
+ steps: external_exports.array(external_exports.string()).readonly(),
32427
+ devices: external_exports.array(NodeBenchmarkDevicePlanSchema).readonly(),
32428
+ /** Parallel sessions the cluster runs now, and what the other nodes can carry. */
32429
+ headroom: external_exports.object({
32430
+ sessionsNow: external_exports.number(),
32431
+ otherNodesCapacitySessions: external_exports.number().nullable()
32432
+ }),
32433
+ refusals: external_exports.array(NodeBenchmarkRefusalSchema).readonly(),
32434
+ canStart: external_exports.boolean()
32435
+ });
32436
+ var NodeBenchProgressSchema = external_exports.object({
32437
+ phase: external_exports.enum([
32438
+ "preparing",
32439
+ "device",
32440
+ "pipeline",
32441
+ "cleanup"
32442
+ ]),
32443
+ deviceKey: external_exports.string().nullable(),
32444
+ modelId: external_exports.string().nullable(),
32445
+ /** Streams (device) or sessions (pipeline) of the step running now. */
32446
+ load: external_exports.number().nullable(),
32447
+ cellsDone: external_exports.number(),
32448
+ cellsTotal: external_exports.number(),
32449
+ message: external_exports.string()
32450
+ });
32451
+ var NodeBenchLimitSchema = external_exports.enum([
32452
+ "p95",
32453
+ "drops",
32454
+ "errors",
32455
+ "stall",
32456
+ "cpu",
32457
+ "ram",
32458
+ "none"
32459
+ ]);
32460
+ var NodeBenchRampStepSchema = external_exports.object({
32461
+ load: external_exports.number(),
32462
+ pass: external_exports.boolean(),
32463
+ p95Ms: external_exports.number(),
32464
+ dropRatio: external_exports.number(),
32465
+ /** Completed frames per second over the accounted window. */
32466
+ fps: external_exports.number(),
32467
+ cpuPct: external_exports.number().nullable(),
32468
+ ramFreePct: external_exports.number().nullable(),
32469
+ failReasons: external_exports.array(external_exports.string()).readonly()
32470
+ });
32471
+ var NodeBenchDeviceCellSchema = external_exports.object({
32472
+ phase: external_exports.literal("device"),
32473
+ deviceKey: external_exports.string(),
32474
+ modelId: external_exports.string(),
32475
+ /** Single-stream latency (the K = 1 step). */
32476
+ p50Ms: external_exports.number(),
32477
+ p95Ms: external_exports.number(),
32478
+ p99Ms: external_exports.number(),
32479
+ /** Frames per second sustained at the last passing step. */
32480
+ fps: external_exports.number(),
32481
+ /** Streams at the camera rate the device carried inside the frame interval; 0 = not even one. */
32482
+ kMax: external_exports.number(),
32483
+ limitedBy: NodeBenchLimitSchema,
32484
+ /** First call (model load + warm-up). */
32485
+ warmupMs: external_exports.number(),
32486
+ ramp: external_exports.array(NodeBenchRampStepSchema).readonly()
32487
+ });
32488
+ var NodeBenchPipelineCellSchema = external_exports.object({
32489
+ phase: external_exports.literal("pipeline"),
32490
+ deviceKey: external_exports.string(),
32491
+ modelId: external_exports.string(),
32492
+ steps: external_exports.array(external_exports.string()).readonly(),
32493
+ /** Parallel sessions at the camera rate the node carried; 0 = not even one. */
32494
+ maxSessions: external_exports.number(),
32495
+ limitedBy: NodeBenchLimitSchema,
32496
+ /** Detail steps that produced at least one result on the clip — a step that never fired measured nothing. */
32497
+ stepsFired: external_exports.array(external_exports.string()).readonly(),
32498
+ warmupMs: external_exports.number(),
32499
+ ramp: external_exports.array(NodeBenchRampStepSchema).readonly()
32500
+ });
32501
+ var NodeBenchCellSchema = external_exports.discriminatedUnion("phase", [NodeBenchDeviceCellSchema, NodeBenchPipelineCellSchema]);
32502
+ var NodeBenchFingerprintSchema = external_exports.object({
32503
+ pipelineVersion: external_exports.string().nullable(),
32504
+ cpuModel: external_exports.string().nullable(),
32505
+ ramGb: external_exports.number().nullable(),
32506
+ os: external_exports.string().nullable(),
32507
+ /** Per device: the pool the cells ran on (runtime + tuning). */
32508
+ pools: external_exports.record(external_exports.string(), external_exports.object({
32509
+ runtime: external_exports.string(),
32510
+ numWorkers: external_exports.number(),
32511
+ concurrency: external_exports.number(),
32512
+ batchMode: external_exports.string()
32513
+ })).default({})
32514
+ });
32515
+ var NodeBenchClipSchema = external_exports.object({
32516
+ /** `camstack-bench-v1` or `reference-images` (the fallback when the clip is not reachable). */
32517
+ id: external_exports.string(),
32518
+ revision: external_exports.string().nullable(),
32519
+ frames: external_exports.number(),
32520
+ width: external_exports.number(),
32521
+ height: external_exports.number()
32522
+ });
32523
+ var NodeBenchRunnerInputSchema = external_exports.object({
32524
+ runId: external_exports.string().min(1),
32525
+ devices: external_exports.array(NodeBenchmarkDevicePlanSchema).min(1),
32526
+ phases: external_exports.array(NodeBenchmarkPhaseSchema).min(1),
32527
+ /** The full detail step tree root for the `pipeline` measurement is built on the node from these ids. */
32528
+ steps: external_exports.array(external_exports.string()).default([]),
32529
+ fpsPerStream: external_exports.number().int().min(1).max(30),
32530
+ /** The runner stops on its own past this instant, whatever the hub does. */
32531
+ deadlineAtMs: external_exports.number(),
32532
+ settleSec: external_exports.number().min(0).max(60).default(NODE_BENCHMARK_DEFAULTS.settleSec),
32533
+ measureSec: external_exports.number().min(2).max(300).default(NODE_BENCHMARK_DEFAULTS.measureSec),
32534
+ keepDownloadedModels: external_exports.boolean().default(false)
32535
+ });
32536
+ var NodeBenchRunnerStateSchema = external_exports.enum([
32537
+ "running",
32538
+ "done",
32539
+ "failed",
32540
+ "aborted"
32541
+ ]);
32542
+ var NodeBenchRunnerStatusSchema = external_exports.object({
32543
+ runId: external_exports.string(),
32544
+ nodeId: external_exports.string(),
32545
+ state: NodeBenchRunnerStateSchema,
32546
+ progress: NodeBenchProgressSchema.nullable(),
32547
+ /** Every finished cell so far — a run stopped half way keeps what it measured. */
32548
+ cells: external_exports.array(NodeBenchCellSchema).readonly(),
32549
+ fingerprint: NodeBenchFingerprintSchema.nullable(),
32550
+ clip: NodeBenchClipSchema.nullable(),
32551
+ /** Cameras seen running on the node during the run (they share its pools). */
32552
+ activeCameraIds: external_exports.array(external_exports.number()).readonly(),
32553
+ /** Models the run downloaded and then deleted (not installed before). */
32554
+ deletedModels: external_exports.array(external_exports.string()).readonly(),
32555
+ error: external_exports.string().nullable(),
32556
+ startedAtMs: external_exports.number(),
32557
+ finishedAtMs: external_exports.number().nullable()
32558
+ });
32559
+ var NodeBenchmarkStateSchema = external_exports.enum([
32560
+ "draining",
32561
+ "measuring",
32562
+ "restoring",
32563
+ "done",
32564
+ "failed",
32565
+ "aborted"
32566
+ ]);
32567
+ var NodeBenchmarkEndReasonSchema = external_exports.enum([
32568
+ "completed",
32569
+ "operator-abort",
32570
+ "deadline",
32571
+ "node-lost",
32572
+ "runner-lost",
32573
+ "hub-restart",
32574
+ "drain-timeout",
32575
+ "failed"
32576
+ ]);
32577
+ var NodeBenchmarkRunSchema = external_exports.object({
32578
+ runId: external_exports.string(),
32579
+ nodeId: external_exports.string(),
32580
+ state: NodeBenchmarkStateSchema,
32581
+ plan: NodeBenchmarkPlanSchema,
32582
+ startedAtMs: external_exports.number(),
32583
+ deadlineAtMs: external_exports.number(),
32584
+ finishedAtMs: external_exports.number().nullable(),
32585
+ endReason: NodeBenchmarkEndReasonSchema.nullable(),
32586
+ error: external_exports.string().nullable(),
32587
+ /** Cameras moved off the node for the run. */
32588
+ moved: external_exports.array(external_exports.number()).readonly(),
32589
+ /** Cameras that stayed (their only frame source is the node). */
32590
+ staying: external_exports.array(external_exports.number()).readonly(),
32591
+ /** Something else ran on the node's pools during the run. */
32592
+ contaminated: external_exports.boolean(),
32593
+ progress: NodeBenchProgressSchema.nullable(),
32594
+ resultIds: external_exports.array(external_exports.string()).readonly()
32595
+ });
32596
+ var NodeBenchmarkStatusSchema = external_exports.object({
32597
+ /** The node the cluster is in benchmark mode for; null = none. */
32598
+ modeNodeId: external_exports.string().nullable(),
32599
+ run: NodeBenchmarkRunSchema.nullable()
32600
+ });
32601
+ var NodeBenchmarkResultSchema = external_exports.object({
32602
+ id: external_exports.string(),
32603
+ runId: external_exports.string(),
32604
+ nodeId: external_exports.string(),
32605
+ cell: NodeBenchCellSchema,
32606
+ fpsPerStream: external_exports.number(),
32607
+ fingerprint: NodeBenchFingerprintSchema.nullable(),
32608
+ clip: NodeBenchClipSchema.nullable(),
32609
+ /** Other work shared the node's pools (a camera that could not move, or the hub's own duties). */
32610
+ contaminated: external_exports.boolean(),
32611
+ stayingCameras: external_exports.array(external_exports.number()).readonly(),
32612
+ /** The run ended early; the cell itself completed. */
32613
+ partialRun: external_exports.boolean(),
32614
+ measuredAtMs: external_exports.number()
32615
+ });
32616
+ var ListNodeBenchmarkResultsInputSchema = external_exports.object({
32617
+ nodeId: external_exports.string().optional(),
32618
+ deviceKey: external_exports.string().optional()
32619
+ });
32620
+ var NodeBenchmarkResultViewSchema = NodeBenchmarkResultSchema.extend({
32621
+ /** `fresh` beats the table; `stale` falls back to it; `superseded` = a newer row covers the same cell. */
32622
+ standing: external_exports.enum([
32623
+ "fresh",
32624
+ "stale",
32625
+ "superseded"
32626
+ ]),
32627
+ staleWhy: external_exports.enum([
32628
+ "age",
32629
+ "runtime",
32630
+ "pool-tuning"
32631
+ ]).nullable()
32632
+ });
32633
+ var NodeBenchmarkManifestSchema = external_exports.object({
32634
+ runId: external_exports.string(),
32635
+ nodeId: external_exports.string(),
32636
+ startedAtMs: external_exports.number(),
32637
+ deadlineAtMs: external_exports.number(),
32638
+ plan: NodeBenchmarkPlanSchema,
32639
+ moved: external_exports.array(external_exports.number()).readonly(),
32640
+ staying: external_exports.array(external_exports.number()).readonly()
32641
+ });
32642
+ var NodeBenchmarkCandidatesSchema = external_exports.object({
32643
+ nodeId: external_exports.string(),
32644
+ reachable: external_exports.boolean(),
32645
+ devices: external_exports.array(external_exports.object({
32646
+ deviceKey: external_exports.string(),
32647
+ enabled: external_exports.boolean(),
32648
+ available: external_exports.boolean(),
32649
+ /** Ordered: what Auto tune would pick first, then the rest of the family by accuracy. */
32650
+ suggested: external_exports.array(external_exports.string()).readonly(),
32651
+ /** Every root detector the device has a build for. */
32652
+ all: external_exports.array(external_exports.string()).readonly(),
32653
+ /** The model the device runs now, when pinned. */
32654
+ currentModelId: external_exports.string().nullable()
32655
+ })).readonly(),
32656
+ /** Detail steps the node's catalog offers under the root (for the `pipeline` measurement). */
32657
+ steps: external_exports.array(external_exports.object({
32658
+ id: external_exports.string(),
32659
+ name: external_exports.string(),
32660
+ slot: external_exports.string()
32661
+ })).readonly()
32662
+ });
31380
32663
  var OrchestratorMetricsSchema = external_exports.object({
31381
32664
  activeCameras: external_exports.number(),
31382
32665
  throttledCameras: external_exports.number(),
@@ -32188,14 +33471,15 @@ var RunnerLocalLoadSchema = external_exports.object({
32188
33471
  * Per-inference-device live load (multi-device C4). One entry per deviceKey
32189
33472
  * this runner currently has attached cameras on, so the orchestrator's second
32190
33473
  * `balance()` pass (over a node's devices) weights on real per-pool session
32191
- * counts. Empty on single-device / pre-multi-device runners. `queueDepthTotal`
32192
- * per device is 0 until the pool backlog gets a public accessor (follow-up).
33474
+ * counts. Empty on single-device / pre-multi-device runners. There is no
33475
+ * per-device queue depth: the inference pool's backlog has no accessor, and
33476
+ * a field that always read 0 was removed rather than shown as a measurement
33477
+ * (D762).
32193
33478
  */
32194
33479
  devices: external_exports.array(external_exports.object({
32195
33480
  deviceKey: external_exports.string(),
32196
33481
  backend: external_exports.string(),
32197
- attachedCameras: external_exports.number(),
32198
- queueDepthTotal: external_exports.number()
33482
+ attachedCameras: external_exports.number()
32199
33483
  })).default([]),
32200
33484
  /** Hardware capability flags reported by this node. */
32201
33485
  hardware: external_exports.object({
@@ -32417,7 +33701,22 @@ var pipelineRunnerCapability = {
32417
33701
  */
32418
33702
  cropJpeg: external_exports.string().optional(),
32419
33703
  parent: DetailParentSchema,
32420
- steps: external_exports.array(external_exports.string()).optional()
33704
+ steps: external_exports.array(external_exports.string()).optional(),
33705
+ /**
33706
+ * The camera's root model already drew this step's boxes (D730): a
33707
+ * `license_plate` inside the parent vehicle. The named step is NOT
33708
+ * inferred — these FRAME-space boxes are its output — and its
33709
+ * requested children (the plate reader) run on them. Absent ⇒ every
33710
+ * requested step infers as before.
33711
+ */
33712
+ supplied: external_exports.object({
33713
+ stepId: external_exports.string(),
33714
+ modelId: external_exports.string(),
33715
+ boxes: external_exports.array(external_exports.object({
33716
+ bbox: NativeCropBboxSchema,
33717
+ score: external_exports.number()
33718
+ })).min(1)
33719
+ }).optional()
32421
33720
  }), external_exports.object({ details: external_exports.array(DetailResultSchema) }).nullable(), { kind: "mutation" }),
32422
33721
  /**
32423
33722
  * Run ONE enrichment step against caller-supplied pixels, with NO camera
@@ -32548,7 +33847,30 @@ var pipelineRunnerCapability = {
32548
33847
  releaseParkedTrackFrames: method(external_exports.object({
32549
33848
  deviceId: external_exports.number(),
32550
33849
  trackId: external_exports.string()
32551
- }), external_exports.object({ released: external_exports.number().int().nonnegative() }), { kind: "mutation" })
33850
+ }), external_exports.object({ released: external_exports.number().int().nonnegative() }), { kind: "mutation" }),
33851
+ /**
33852
+ * Start measuring THIS node for the orchestrator's node benchmark: the
33853
+ * bench clip decoded once into RAM, each device × candidate detector on an
33854
+ * open-loop ramp (`device`), then the chosen pipeline with the requested
33855
+ * detail steps (`pipeline`). Everything runs in-process with the executor
33856
+ * — no frame crosses a node (D9) — and writes nothing: no track, event,
33857
+ * media or notification. Reached by `nodePin(nodeId)`. Answers at once;
33858
+ * one run per node; the run stops itself at `deadlineAtMs`.
33859
+ */
33860
+ startNodeBench: method(NodeBenchRunnerInputSchema, external_exports.object({
33861
+ accepted: external_exports.literal(true),
33862
+ runId: external_exports.string()
33863
+ }), {
33864
+ kind: "mutation",
33865
+ auth: "admin"
33866
+ }),
33867
+ /** The run's progress and every finished cell; null when this runner does not know `runId`. */
33868
+ getNodeBenchStatus: method(external_exports.object({ runId: external_exports.string() }), NodeBenchRunnerStatusSchema.nullable(), { auth: "admin" }),
33869
+ /** Stop the run; what it finished is kept. */
33870
+ abortNodeBench: method(external_exports.object({ runId: external_exports.string() }), external_exports.object({ aborted: external_exports.boolean() }), {
33871
+ kind: "mutation",
33872
+ auth: "admin"
33873
+ })
32552
33874
  }
32553
33875
  };
32554
33876
  var CameraPipelineConfigSchema = external_exports.object({
@@ -32561,14 +33883,6 @@ var CameraPipelineConfigSchema = external_exports.object({
32561
33883
  settings: external_exports.record(external_exports.string(), external_exports.unknown()).readonly().optional()
32562
33884
  }).nullable().optional()
32563
33885
  });
32564
- var PipelineTemplateSchema = external_exports.object({
32565
- id: external_exports.string(),
32566
- name: external_exports.string(),
32567
- description: external_exports.string().optional(),
32568
- config: CameraPipelineConfigSchema,
32569
- createdAt: external_exports.string(),
32570
- updatedAt: external_exports.string()
32571
- });
32572
33886
  var DeviceStepConfigSchema = external_exports.object({
32573
33887
  modelId: external_exports.string().optional(),
32574
33888
  settings: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
@@ -32642,9 +33956,10 @@ var CameraStepOverridePatchSchema = external_exports.object({
32642
33956
  modelId: external_exports.string().optional(),
32643
33957
  settings: external_exports.record(external_exports.string(), external_exports.unknown()).readonly().optional()
32644
33958
  });
33959
+ var CameraStepSettingsSchema = external_exports.record(external_exports.string(), external_exports.record(external_exports.string(), external_exports.unknown()).readonly());
32645
33960
  var CameraPipelineSettingsSchema = external_exports.object({
32646
- pinnedAgentNodeId: external_exports.string().optional(),
32647
33961
  stepToggles: external_exports.record(external_exports.string(), external_exports.boolean()).optional(),
33962
+ stepSettings: CameraStepSettingsSchema.optional(),
32648
33963
  stepOverridesByDevice: external_exports.record(external_exports.string(), external_exports.record(external_exports.string(), external_exports.record(external_exports.string(), CameraStepOverridePatchSchema))).optional(),
32649
33964
  pipelineByAgent: external_exports.record(external_exports.string(), CameraPipelineForAgentSchema).optional()
32650
33965
  });
@@ -32731,26 +34046,21 @@ var CameraBrokerProfileSchema = external_exports.object({
32731
34046
  width: external_exports.number(),
32732
34047
  height: external_exports.number(),
32733
34048
  subscribers: external_exports.number(),
32734
- inFps: external_exports.number(),
32735
- outFps: external_exports.number()
34049
+ /**
34050
+ * Encoded packets/s the broker receives from the camera. null when the
34051
+ * broker's stats read failed — unknown, never 0 (a 0 here reads as a stall).
34052
+ * There is no output rate: decoding runs in the session decode workers, not
34053
+ * in the broker, so the broker's own decoded-frame rate is 0 on every live
34054
+ * camera and is not served (D758).
34055
+ */
34056
+ inFps: external_exports.number().nullable()
32736
34057
  });
32737
34058
  var CameraBrokerStatusSchema = external_exports.object({
32738
34059
  profiles: external_exports.array(CameraBrokerProfileSchema).readonly(),
32739
34060
  webrtcSessions: external_exports.number(),
32740
34061
  rtspRestream: external_exports.boolean()
32741
34062
  });
32742
- var CameraDecoderShmSchema = external_exports.object({
32743
- framesWritten: external_exports.number(),
32744
- getFrameHits: external_exports.number(),
32745
- getFrameMisses: external_exports.number(),
32746
- budgetMb: external_exports.number()
32747
- });
32748
- var CameraDecoderStatusSchema = external_exports.object({
32749
- nodeId: external_exports.string(),
32750
- formats: external_exports.array(external_exports.string()).readonly(),
32751
- sessionCount: external_exports.number(),
32752
- shm: CameraDecoderShmSchema
32753
- });
34063
+ var CameraDecoderStatusSchema = external_exports.object({ nodeId: external_exports.string() });
32754
34064
  var CameraMotionStatusSchema = external_exports.object({
32755
34065
  enabled: external_exports.boolean(),
32756
34066
  fps: external_exports.number()
@@ -33210,18 +34520,6 @@ var pipelineOrchestratorCapability = {
33210
34520
  auth: "admin"
33211
34521
  }),
33212
34522
  /**
33213
- * Set a node's detection WEIGHT (relative share for the quota balancer).
33214
- * `null` clears it (back to the implicit weight 1). Unpinned cameras
33215
- * distribute proportionally to weight; `maxCameras` still clamps on top.
33216
- */
33217
- setAgentDetectWeight: method(external_exports.object({
33218
- agentNodeId: external_exports.string(),
33219
- detectWeight: external_exports.number().positive().nullable()
33220
- }), external_exports.object({ success: external_exports.literal(true) }), {
33221
- kind: "mutation",
33222
- auth: "admin"
33223
- }),
33224
- /**
33225
34523
  * Set one node's placement CAPABILITIES — the per-node record that
33226
34524
  * replaced the four flat orchestrator lists (`enabledNodes`,
33227
34525
  * `enabledDecoderNodes`, `enabledAudioNodes`, `remoteSourcingNodes`).
@@ -33340,6 +34638,121 @@ var pipelineOrchestratorCapability = {
33340
34638
  kind: "mutation",
33341
34639
  auth: "admin"
33342
34640
  }),
34641
+ /**
34642
+ * Auto tune (D745, D755) — DRY RUN. Recommends ONE detector family
34643
+ * (YOLOv9) for the whole cluster from each node's static hardware class
34644
+ * and the measured latency table: per device, the most accurate model
34645
+ * that sustains at least `minSessionsPerDevice` parallel sessions at the
34646
+ * camera rate with the headroom kept free (no load input), and lists every write
34647
+ * the apply would make: the node model pins set, the enrichment pins and
34648
+ * model-bound thresholds removed (node level and per camera), and the
34649
+ * per-camera detector thresholds cleared. Writes nothing. Step
34650
+ * enablement, device enablement, pins, recording, notifications, zones and
34651
+ * rules are never part of it. `planHash` names exactly this diff.
34652
+ */
34653
+ planAutoTune: method(AutoTuneOptionsSchema, AutoTunePlanSchema, { auth: "admin" }),
34654
+ /**
34655
+ * Auto tune (D745) — APPLY the plan the operator confirmed. Recomputes
34656
+ * the plan and refuses (`stale`, with the fresh plan) when its hash is not
34657
+ * `planHash`, so what is written is exactly the confirmed diff. Offline
34658
+ * nodes are skipped; there is no undo.
34659
+ */
34660
+ applyAutoTune: method(AutoTuneApplyInputSchema, AutoTuneApplyResultSchema, {
34661
+ kind: "mutation",
34662
+ auth: "admin"
34663
+ }),
34664
+ /**
34665
+ * Load balancing (D748) — write node shares (`detectWeight`) and per-node
34666
+ * device shares (inference-device `weight`) in ONE atomic read-modify-write
34667
+ * of the agent settings — the only writer of node shares (the per-node
34668
+ * `setAgentDetectWeight` it replaced raced its siblings, one RMW each).
34669
+ * A node or device left out keeps its weight. Never changes the
34670
+ * `sessionPlacement` policy.
34671
+ */
34672
+ setLoadBalancingShares: method(LoadBalancingSharesInputSchema, external_exports.object({ success: external_exports.literal(true) }), {
34673
+ kind: "mutation",
34674
+ auth: "admin"
34675
+ }),
34676
+ /**
34677
+ * Load balancing (D748) — what placement actually did: per node and
34678
+ * device, sessions now, sessions started and the time-weighted share of
34679
+ * PARALLEL sessions over `windowMs`; the cluster's parallel peak; yields
34680
+ * a share election made; and every device pin the session path cannot
34681
+ * honour. In memory on the hub — a restart starts a new window.
34682
+ */
34683
+ getPlacementStats: method(PlacementStatsInputSchema, PlacementStatsSchema, { auth: "admin" }),
34684
+ /**
34685
+ * Load balancing (D748, D755) — shares proportional to each node's
34686
+ * capacity in parallel sessions: from the latency table at the models
34687
+ * Auto tune picks (`hardware`), or from node benchmark results
34688
+ * (`benchmark`, each node without results falling back to `hardware` and
34689
+ * saying so). The automatic shares are exactly this answer. Per device,
34690
+ * an ADVISORY session cap. Writes nothing.
34691
+ */
34692
+ suggestShares: method(SuggestSharesInputSchema, SuggestSharesResultSchema, { auth: "admin" }),
34693
+ /**
34694
+ * Load balancing (D750) — the shares placement reads now: the source
34695
+ * (automatic capacity shares or the operator's sliders), each node's and
34696
+ * device's configured share, and the effective share after a node or
34697
+ * device that cannot take sessions gave its share to the others.
34698
+ */
34699
+ getEffectiveShares: method(external_exports.void(), EffectiveSharesSchema, { auth: "admin" }),
34700
+ /**
34701
+ * Load balancing (D750, D755) — switch the share source: `hardware`
34702
+ * (automatic, from static capacity), `benchmark` (automatic, from node
34703
+ * benchmark results) or `manual`. Going manual seeds the sliders with the
34704
+ * current automatic shares (one atomic write), so nothing jumps; going
34705
+ * to an automatic source recomputes at once.
34706
+ */
34707
+ setShareSource: method(SetShareSourceInputSchema, external_exports.object({ success: external_exports.literal(true) }), {
34708
+ kind: "mutation",
34709
+ auth: "admin"
34710
+ }),
34711
+ /**
34712
+ * Node benchmark — what a run of this plan would do, without doing it:
34713
+ * the cameras that leave the node, those that cannot (the node is their
34714
+ * only frame source; they stay and flag the run), the estimated duration
34715
+ * and every reason it may not start. The confirmation shows this.
34716
+ */
34717
+ getNodeBenchmarkPreflight: method(NodeBenchmarkPlanSchema, NodeBenchmarkPreflightSchema, { auth: "admin" }),
34718
+ /**
34719
+ * Node benchmark — start ONE run (cluster-wide lock). The orchestrator
34720
+ * persists a restore manifest, enters benchmark mode for the node (out of
34721
+ * placement, its camera pins ignored, nothing rewritten), drains it, drives
34722
+ * the node's own runner, then restores — always, including after an
34723
+ * abort, a lost node or a hub restart. Answers at once; poll
34724
+ * `getNodeBenchmarkStatus`. Refused runs carry the preflight.
34725
+ */
34726
+ startNodeBenchmark: method(NodeBenchmarkPlanSchema, external_exports.discriminatedUnion("kind", [external_exports.object({
34727
+ kind: external_exports.literal("started"),
34728
+ runId: external_exports.string()
34729
+ }), external_exports.object({
34730
+ kind: external_exports.literal("refused"),
34731
+ preflight: NodeBenchmarkPreflightSchema
34732
+ })]), {
34733
+ kind: "mutation",
34734
+ auth: "admin"
34735
+ }),
34736
+ /** Node benchmark — the active run (or the last one) and the node in benchmark mode. */
34737
+ getNodeBenchmarkStatus: method(external_exports.void(), NodeBenchmarkStatusSchema, { auth: "admin" }),
34738
+ /** Node benchmark — stop the active run; the cluster is restored as it was. */
34739
+ abortNodeBenchmark: method(external_exports.object({ runId: external_exports.string() }), external_exports.object({ aborted: external_exports.boolean() }), {
34740
+ kind: "mutation",
34741
+ auth: "admin"
34742
+ }),
34743
+ /**
34744
+ * Node benchmark — root detector candidates per device (what Auto tune
34745
+ * would pick first, then the family) and the detail steps the node's
34746
+ * catalog offers, for the plan editor.
34747
+ */
34748
+ getNodeBenchmarkCandidates: method(external_exports.object({ nodeId: external_exports.string() }), NodeBenchmarkCandidatesSchema, { auth: "admin" }),
34749
+ /** Node benchmark — stored results, newest first, each with its standing today. */
34750
+ listNodeBenchmarkResults: method(ListNodeBenchmarkResultsInputSchema, external_exports.array(NodeBenchmarkResultViewSchema).readonly(), { auth: "admin" }),
34751
+ /** Node benchmark — delete one result; Auto tune and the shares stop reading it. */
34752
+ deleteNodeBenchmarkResult: method(external_exports.object({ id: external_exports.string() }), external_exports.object({ deleted: external_exports.boolean() }), {
34753
+ kind: "mutation",
34754
+ auth: "admin"
34755
+ }),
33343
34756
  /** Read one camera's settings. Null when never touched (inherits agent defaults fully). */
33344
34757
  getCameraSettings: method(external_exports.object({ deviceId: external_exports.number() }), CameraPipelineSettingsSchema.nullable()),
33345
34758
  /** Set or clear the 3-state toggle for one (camera, addonId). Pass `enabled: null` to clear and revert to agent default. */
@@ -33369,6 +34782,22 @@ var pipelineOrchestratorCapability = {
33369
34782
  kind: "mutation",
33370
34783
  auth: "admin"
33371
34784
  }),
34785
+ /**
34786
+ * Write or clear one step's CAMERA-WIDE settings (D754) — the fields this
34787
+ * camera overrides on every accelerator it runs on. `settings` is the
34788
+ * whole field-level bag for that step (only the overridden keys; a
34789
+ * model-bound field travels with its binding key); `null` or `{}` clears
34790
+ * it. Merged at dispatch between the node base and the per-(node,device)
34791
+ * override, key by key.
34792
+ */
34793
+ setCameraStepSettings: method(external_exports.object({
34794
+ deviceId: external_exports.number(),
34795
+ addonId: external_exports.string(),
34796
+ settings: external_exports.record(external_exports.string(), external_exports.unknown()).nullable()
34797
+ }), external_exports.object({ success: external_exports.literal(true) }), {
34798
+ kind: "mutation",
34799
+ auth: "admin"
34800
+ }),
33372
34801
  /** Write or clear the wholesale per-agent pipeline override. Pass `pipeline: null` to drop the override. */
33373
34802
  setCameraPipelineForAgent: method(external_exports.object({
33374
34803
  deviceId: external_exports.number(),
@@ -33484,33 +34913,7 @@ var pipelineOrchestratorCapability = {
33484
34913
  auth: "admin"
33485
34914
  }),
33486
34915
  /** Snapshot of the in-flight or last disk-wins fleet reconcile. */
33487
- getReconcileFromDiskStatus: method(external_exports.void(), DiskReconcileJobSchema, { auth: "admin" }),
33488
- /** List every template the operator has saved. */
33489
- listTemplates: method(external_exports.void(), external_exports.array(PipelineTemplateSchema).readonly()),
33490
- /** Create a new named preset from a given CameraPipelineConfig. */
33491
- saveTemplate: method(external_exports.object({
33492
- name: external_exports.string(),
33493
- description: external_exports.string().optional(),
33494
- config: CameraPipelineConfigSchema
33495
- }), PipelineTemplateSchema, {
33496
- kind: "mutation",
33497
- auth: "admin"
33498
- }),
33499
- /** Partial update of a template. Any omitted field is preserved. */
33500
- updateTemplate: method(external_exports.object({
33501
- id: external_exports.string(),
33502
- name: external_exports.string().optional(),
33503
- description: external_exports.string().optional(),
33504
- config: CameraPipelineConfigSchema.optional()
33505
- }), PipelineTemplateSchema, {
33506
- kind: "mutation",
33507
- auth: "admin"
33508
- }),
33509
- /** Remove a template. Camera configs that were seeded from it keep a copy. */
33510
- deleteTemplate: method(external_exports.object({ id: external_exports.string() }), external_exports.object({ success: external_exports.literal(true) }), {
33511
- kind: "mutation",
33512
- auth: "admin"
33513
- })
34916
+ getReconcileFromDiskStatus: method(external_exports.void(), DiskReconcileJobSchema, { auth: "admin" })
33514
34917
  }
33515
34918
  };
33516
34919
  var LEGACY_ICON = {
@@ -34095,7 +35498,19 @@ var SsoBridgeClaimsSchema = external_exports.object({
34095
35498
  * editing a descriptor must not retroactively extend or shorten a link the
34096
35499
  * operator already consented to.
34097
35500
  */
34098
- refreshTtl: external_exports.union([external_exports.number().int().positive(), external_exports.literal("never")]).optional()
35501
+ refreshTtl: external_exports.union([external_exports.number().int().positive(), external_exports.literal("never")]).optional(),
35502
+ /**
35503
+ * Opaque handle of a hub-side LINK intent (D782). Set by an OIDC callback
35504
+ * that was started from a signed-in user's "Link" button: the finish then
35505
+ * links this identity to the intent's user instead of signing anyone in.
35506
+ * The handle carries no user id — the hub resolves it, single-use.
35507
+ */
35508
+ linkIntent: external_exports.string().optional(),
35509
+ /**
35510
+ * Verified `iss` of the id_token behind an OIDC login bridge (D782). A
35511
+ * subject is unique only per issuer, so a link is bound to it.
35512
+ */
35513
+ issuer: external_exports.string().optional()
34099
35514
  });
34100
35515
  var ssoBridgeCapability = {
34101
35516
  name: "sso-bridge",
@@ -35820,8 +37235,6 @@ var WebrtcStreamChoiceSchema = external_exports.object({
35820
37235
  ]).nullable(),
35821
37236
  /** Input FPS from the camera (null for adaptive). */
35822
37237
  inputFps: external_exports.number().nullable(),
35823
- /** Decoded FPS (null for adaptive). */
35824
- decodeFps: external_exports.number().nullable(),
35825
37238
  /** Bitrate in kbps (null for adaptive). */
35826
37239
  bitrateKbps: external_exports.number().nullable()
35827
37240
  });
@@ -36122,7 +37535,22 @@ var webrtcSessionCapability = {
36122
37535
  * field their hints were silently stripped by the schema and the
36123
37536
  * adaptive ladder started blind on the client's display size.
36124
37537
  */
36125
- hints: webrtcClientHintsSchema.optional()
37538
+ hints: webrtcClientHintsSchema.optional(),
37539
+ /**
37540
+ * Talk-back (D771): relay the PEER's audio to the device's speaker
37541
+ * through the `intercom` cap's push-talk triple. When `true` and the
37542
+ * offer lets the peer send audio, the answer's audio is `sendrecv`
37543
+ * and every inbound frame goes to `intercom.pushTalkAudio` for this
37544
+ * `deviceId`; absent/false answers `sendonly`, as for every viewer.
37545
+ *
37546
+ * TRUSTED-CALLER ONLY. Set by the Alexa export for an Echo on a camera
37547
+ * with `intercom`, when the linked user may control that camera. The
37548
+ * hub STRIPS it from every request-bound call (a browser), exactly as
37549
+ * it overwrites `relayOnly` — a viewer's talk permission is the
37550
+ * intercom cap's own surface (share tokens gate it there), and this
37551
+ * flag must not become a second door to the camera's speaker.
37552
+ */
37553
+ talkback: external_exports.boolean().optional()
36126
37554
  }), external_exports.object({
36127
37555
  sessionId: external_exports.string(),
36128
37556
  sdpAnswer: external_exports.string()
@@ -36202,6 +37630,35 @@ var webrtcSessionCapability = {
36202
37630
  alive: external_exports.boolean()
36203
37631
  })),
36204
37632
  /**
37633
+ * The viewer's downlink probe, for ONE live session (D733).
37634
+ *
37635
+ * The player measures `/adaptive-probe` after the session's first decoded
37636
+ * frame (D635). It used to act on the reading itself, by opening a SECOND
37637
+ * session with `hints.downlinkMbps` — every adaptive live open became two
37638
+ * sessions, two ICE + DTLS handshakes and two server pipelines. It now
37639
+ * hands the measurement to the session it already has; the provider picks
37640
+ * the rung exactly as it would from an offer's hints (same viewport
37641
+ * ceiling) and moves the session there — in place when the negotiated
37642
+ * codec carries the new rendition, by the existing re-offer
37643
+ * (`getSessionState.pendingRenegotiation`) when it cannot.
37644
+ *
37645
+ * A MEASUREMENT, never a tier: the client does not choose. A probe only
37646
+ * raises the rung; lowering it stays the ladder's call on delivery.
37647
+ * `held` answers why nothing moved (`not-adaptive`, `pinned`,
37648
+ * `already-there`, `recorded`, …) — a client that gets ANY answer must not
37649
+ * fall back to a reconnect; only a provider that does not know the method
37650
+ * (an older hub) leaves the client its legacy second session.
37651
+ */
37652
+ applyDownlinkProbe: method(external_exports.object({
37653
+ deviceId: external_exports.number().int().nonnegative(),
37654
+ sessionId: external_exports.string(),
37655
+ downlinkMbps: external_exports.number().nonnegative()
37656
+ }), external_exports.object({
37657
+ outcome: external_exports.enum(["switching", "held"]),
37658
+ tier: CamProfileSchema.nullable(),
37659
+ reason: external_exports.string()
37660
+ }), { kind: "mutation" }),
37661
+ /**
36205
37662
  * The SERVER's half of the stream-debug overlay, for one live session.
36206
37663
  *
36207
37664
  * The client can measure its own transport (`getStats()`); it cannot see
@@ -36487,6 +37944,46 @@ var AddonAutoUpdateSchema = ChannelWithInheritSchema;
36487
37944
  var RestartAddonResultSchema = external_exports.unknown();
36488
37945
  var InstallPackageResultSchema = external_exports.unknown();
36489
37946
  var ReloadPackagesResultSchema = external_exports.unknown();
37947
+ var UninstallNodeOutcomeSchema = external_exports.enum([
37948
+ "uninstalled",
37949
+ "not-installed",
37950
+ "refused",
37951
+ "failed",
37952
+ "pending-reconnect"
37953
+ ]);
37954
+ var UninstallNodeResultSchema = external_exports.object({
37955
+ nodeId: external_exports.string(),
37956
+ outcome: UninstallNodeOutcomeSchema,
37957
+ error: external_exports.string().optional(),
37958
+ addonIds: external_exports.array(external_exports.string()).readonly(),
37959
+ runnersStopped: external_exports.array(external_exports.string()).readonly(),
37960
+ warnings: external_exports.array(external_exports.string()).readonly()
37961
+ });
37962
+ var UninstallPackageResultSchema = external_exports.object({
37963
+ /** Every targeted node ended `uninstalled`, `not-installed` or `pending-reconnect`. */
37964
+ success: external_exports.boolean(),
37965
+ packageName: external_exports.string(),
37966
+ results: external_exports.array(UninstallNodeResultSchema).readonly()
37967
+ });
37968
+ var PackageInstallationSchema = external_exports.object({
37969
+ packageName: external_exports.string(),
37970
+ nodeId: external_exports.string(),
37971
+ nodeName: external_exports.string(),
37972
+ isHub: external_exports.boolean(),
37973
+ isOnline: external_exports.boolean(),
37974
+ version: external_exports.string().nullable(),
37975
+ addonIds: external_exports.array(external_exports.string()).readonly(),
37976
+ source: external_exports.enum(["live", "recorded"]),
37977
+ /** The hub installs this package too. `false` on an agent row = an orphan. */
37978
+ onHub: external_exports.boolean()
37979
+ });
37980
+ var PackageInstallationsSchema = external_exports.object({
37981
+ installations: external_exports.array(PackageInstallationSchema).readonly(),
37982
+ unreachable: external_exports.array(external_exports.object({
37983
+ nodeId: external_exports.string(),
37984
+ error: external_exports.string()
37985
+ })).readonly()
37986
+ });
36490
37987
  var BulkUpdateItemStatusSchema = external_exports.enum([
36491
37988
  "queued",
36492
37989
  "updating",
@@ -36577,10 +38074,31 @@ var addonsCapability = {
36577
38074
  }),
36578
38075
  isWorkspaceAvailable: method(external_exports.void(), external_exports.boolean()),
36579
38076
  listWorkspacePackages: method(external_exports.void(), external_exports.array(external_exports.unknown()).readonly()),
36580
- uninstallPackage: method(external_exports.object({ packageName: external_exports.string() }), external_exports.unknown(), {
38077
+ /**
38078
+ * Uninstall a package. `nodeId` omitted (or `'hub'`) uninstalls on the hub
38079
+ * — the original behaviour, which still THROWS on failure. An agent
38080
+ * `nodeId` removes it from that agent through `$agent.undeploy`
38081
+ * (runners stopped, caps deregistered, code deleted) and prunes the node's
38082
+ * declared roster so the back-fill never returns it. `everywhere: true`
38083
+ * does both for every node that has it (agents first, hub last); offline
38084
+ * nodes answer `pending-reconnect`. Node-level failures in those two modes
38085
+ * are REPORTED per node, never thrown. Protected packages are refused.
38086
+ */
38087
+ uninstallPackage: method(external_exports.object({
38088
+ packageName: external_exports.string().min(1),
38089
+ nodeId: external_exports.string().optional(),
38090
+ everywhere: external_exports.boolean().optional()
38091
+ }), UninstallPackageResultSchema, {
36581
38092
  kind: "mutation",
36582
38093
  auth: "admin"
36583
38094
  }),
38095
+ /**
38096
+ * Which nodes have a package (or, with no `packageName`, every package on
38097
+ * every node). Hub from its installer, online agents from `$agent.status`
38098
+ * (in parallel, bounded), offline agents from their declared roster.
38099
+ * Drives the uninstall confirm and the Addons page's "not on the hub" list.
38100
+ */
38101
+ listInstallations: method(external_exports.object({ packageName: external_exports.string().optional() }), PackageInstallationsSchema, { auth: "admin" }),
36584
38102
  reloadPackages: method(external_exports.void(), ReloadPackagesResultSchema, {
36585
38103
  kind: "mutation",
36586
38104
  auth: "admin"
@@ -39301,6 +40819,9 @@ var CreateIntegrationInputSchema = external_exports.object({
39301
40819
  enabled: external_exports.boolean().optional(),
39302
40820
  info: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
39303
40821
  settings: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
40822
+ /** Keys of `settings` the form's schema declares secret (by type) — kept in
40823
+ * the keychain, not the table (D787). */
40824
+ secretKeys: external_exports.array(external_exports.string()).optional(),
39304
40825
  skipRestart: external_exports.boolean().optional()
39305
40826
  });
39306
40827
  var UpdateIntegrationInputSchema = external_exports.object({
@@ -39336,7 +40857,9 @@ var integrationsCapability = {
39336
40857
  getSettings: method(external_exports.object({ id: external_exports.string() }), external_exports.record(external_exports.string(), external_exports.unknown()), { auth: "admin" }),
39337
40858
  setSettings: method(external_exports.object({
39338
40859
  id: external_exports.string(),
39339
- settings: external_exports.record(external_exports.string(), external_exports.unknown())
40860
+ settings: external_exports.record(external_exports.string(), external_exports.unknown()),
40861
+ /** Keys the form's schema declares secret (by type) — keychain-stored (D787). */
40862
+ secretKeys: external_exports.array(external_exports.string()).optional()
39340
40863
  }), external_exports.object({ success: external_exports.boolean() }), {
39341
40864
  kind: "mutation",
39342
40865
  auth: "admin"
@@ -39668,7 +41191,8 @@ var ConnectionEndpointSchema = external_exports.object({
39668
41191
  "lan-ipv6",
39669
41192
  "public",
39670
41193
  "loopback",
39671
- "app-link"
41194
+ "app-link",
41195
+ "custom"
39672
41196
  ]),
39673
41197
  /**
39674
41198
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -39754,6 +41278,62 @@ var ViewerEndpointsSchema = external_exports.object({
39754
41278
  /** What the ranking currently resolves to (may be empty if nothing is up). */
39755
41279
  resolved: external_exports.array(external_exports.string()).readonly()
39756
41280
  });
41281
+ var HubAddressSnapshotSchema = external_exports.object({
41282
+ override: external_exports.string().nullable(),
41283
+ resolved: external_exports.string().nullable(),
41284
+ source: external_exports.enum([
41285
+ "override",
41286
+ "auto",
41287
+ "none"
41288
+ ])
41289
+ });
41290
+ var HubAddressesSchema = external_exports.object({
41291
+ cluster: HubAddressSnapshotSchema,
41292
+ browser: HubAddressSnapshotSchema
41293
+ });
41294
+ var HubAddressRoleSchema = external_exports.enum(HUB_ADDRESS_ROLES);
41295
+ var RoleSourceSchema = external_exports.enum([
41296
+ "flagged",
41297
+ "auto",
41298
+ "none"
41299
+ ]);
41300
+ var HubAddressRoleResolutionSchema = external_exports.object({
41301
+ /** The address carrying the flag, or null = automatic. */
41302
+ flagged: external_exports.string().nullable(),
41303
+ /** The address in use, or null when nothing qualifies (never loopback). */
41304
+ resolved: external_exports.string().nullable(),
41305
+ source: RoleSourceSchema
41306
+ });
41307
+ var HubAppConnectionsResolutionSchema = external_exports.object({
41308
+ /** The addresses flagged `appConnections`, or empty = automatic. */
41309
+ flagged: external_exports.array(external_exports.string()).readonly(),
41310
+ /** What the apps race right now. */
41311
+ resolved: external_exports.array(external_exports.string()).readonly(),
41312
+ source: RoleSourceSchema
41313
+ });
41314
+ var HubAddressRowSchema = ConnectionEndpointSchema.extend({
41315
+ /** In the hub's detected palette right now. */
41316
+ detected: external_exports.boolean(),
41317
+ /** Entered by the operator (removable). */
41318
+ custom: external_exports.boolean(),
41319
+ /** The roles explicitly flagged on this address. */
41320
+ flags: external_exports.array(HubAddressRoleSchema).readonly(),
41321
+ /** The roles this address serves right now — flagged or automatic. */
41322
+ inUse: external_exports.array(HubAddressRoleSchema).readonly(),
41323
+ /** The roles this address may be flagged with. */
41324
+ eligible: external_exports.array(HubAddressRoleSchema).readonly()
41325
+ });
41326
+ var HubAddressBookSchema = external_exports.object({
41327
+ rows: external_exports.array(HubAddressRowSchema).readonly(),
41328
+ roles: external_exports.object({
41329
+ appConnections: HubAppConnectionsResolutionSchema,
41330
+ notificationTaps: HubAddressRoleResolutionSchema,
41331
+ internal: HubAddressRoleResolutionSchema,
41332
+ publicEndpoint: HubAddressRoleResolutionSchema
41333
+ }),
41334
+ /** The `hub=` an app link carries (D709), or null. */
41335
+ appLinkHub: external_exports.string().nullable()
41336
+ });
39757
41337
  var AllowedAddressesSchema = external_exports.object({
39758
41338
  /**
39759
41339
  * Allowlist of interface addresses operators have explicitly opted
@@ -39845,19 +41425,18 @@ var localNetworkCapability = {
39845
41425
  * tunnel always emits `https://` regardless. */
39846
41426
  scheme: external_exports.enum(["http", "https"]).optional(),
39847
41427
  /** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
39848
- * an address notification links can be flagged with, not a hub
41428
+ * an address notification taps can be flagged with, not a hub
39849
41429
  * route. Default `false`: racers and rankers never see it. */
39850
41430
  includeAppLink: external_exports.boolean().optional()
39851
41431
  }), GetConnectionEndpointsResultSchema),
39852
41432
  /**
39853
- * The address notification links are flagged with. `baseUrl: null` means
39854
- * AUTO, which is the CamStack app link (D709): viewer taps go through
39855
- * `https://camstack.zentik.app/…?hub=<appLinkHub>` and open the app. Any
39856
- * hub address the palette lists can be flagged instead; then viewer taps,
39857
- * attachment links and action buttons all use it. Signed media and
39858
- * buttons never use the app link — with it flagged (or AUTO) they keep
39859
- * the ranked hub ladder (a configured origin, a connected tunnel, then
39860
- * the LAN), never loopback.
41433
+ * The `notificationTaps` role (D734): where TAPPING a notification opens.
41434
+ * `baseUrl: null` means AUTO, which is the CamStack app link (D709): taps
41435
+ * go through `https://camstack.zentik.app/…?hub=<appLinkHub>` and open the
41436
+ * app. Any hub address the palette lists can be flagged instead; then a
41437
+ * tap opens that address. Only the tap: action buttons, attachment /
41438
+ * media links and admin links follow the `publicEndpoint` role
41439
+ * (`getAddresses().roles.publicEndpoint`), never this one.
39861
41440
  *
39862
41441
  * Why an explicit marker: the automatic ranking cannot know which of
39863
41442
  * several reachable addresses the RECIPIENT can actually open. A link is
@@ -39867,26 +41446,80 @@ var localNetworkCapability = {
39867
41446
  */
39868
41447
  getNotificationEndpoint: method(external_exports.void(), NotificationEndpointSchema),
39869
41448
  /**
39870
- * Mark which endpoint notification artifacts use. `baseUrl: null` restores
39871
- * AUTO. The value is stored verbatim (not an index into the candidate
39872
- * list): interfaces come and go, and an index would silently re-point at a
39873
- * different address after a reboot.
41449
+ * @deprecated Use `setAddressRole({ role: 'notificationTaps', … })`. It
41450
+ * writes the same `notificationTaps` flag, with the same validation. `baseUrl: null` restores automatic; an
41451
+ * address that is not detected becomes a custom address.
39874
41452
  */
39875
41453
  setNotificationEndpoint: method(external_exports.object({ baseUrl: external_exports.string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }),
39876
41454
  /**
39877
- * The endpoints the SDK / viewer races for API access. Empty `baseUrls`
39878
- * means AUTO: every LAN IPv4 address plus the public tunnel, never IPv6,
39879
- * never mesh, never loopback. `resolved` is that set (or the operator's
39880
- * explicit subset) as it stands right now.
41455
+ * The `appConnections` role as shipped apps read it: the flagged addresses
41456
+ * (detected or custom), or empty for AUTO — every LAN IPv4 address plus
41457
+ * the public tunnel, never IPv6, mesh, loopback or a custom address.
41458
+ * `resolved` is the set as it stands right now; the custom ones in it are
41459
+ * also in `getConnectionEndpoints`, which the apps filter by it.
39881
41460
  */
39882
41461
  getViewerEndpoints: method(external_exports.void(), ViewerEndpointsSchema),
39883
41462
  /**
39884
- * Replace the viewer race set. Empty `baseUrls` restores AUTO. Stored
39885
- * verbatim (not indices) so a temporarily-down tunnel is not silently
39886
- * dropped from the operator's choice.
41463
+ * @deprecated Use `setAddressRole({ role: 'appConnections', … })`. It
41464
+ * replaces the same `appConnections` flags.
41465
+ * Empty `baseUrls` restores automatic.
39887
41466
  */
39888
41467
  setViewerEndpoints: method(external_exports.object({ baseUrls: external_exports.array(external_exports.string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }),
39889
41468
  /**
41469
+ * The Network page's Addresses table and every role's answer — the ONE
41470
+ * reading of "which address is this hub reached at, for what": detected
41471
+ * endpoints and custom addresses with their role flags, and per role the
41472
+ * flagged address, the one in use and whether it is automatic. Agent
41473
+ * deliveries and LAN devices read `roles.internal`; sign-in, OAuth2 and
41474
+ * the notification centre's buttons / media / admin links read
41475
+ * `roles.publicEndpoint`; nothing ranks the palette itself. `scheme` is
41476
+ * the one the caller shows LAN rows in (as `getConnectionEndpoints`);
41477
+ * `internal` and `publicEndpoint` are always resolved over the HTTPS
41478
+ * palette.
41479
+ */
41480
+ getAddresses: method(external_exports.object({ scheme: external_exports.enum(["http", "https"]).optional() }).optional(), HubAddressBookSchema),
41481
+ /**
41482
+ * Add a custom address. Validated: an http(s) origin with a host, no
41483
+ * credentials, no path, never loopback — an invalid one is refused with
41484
+ * the reason and nothing is stored. Adding an address that already exists
41485
+ * only updates its label.
41486
+ */
41487
+ addCustomAddress: method(external_exports.object({
41488
+ baseUrl: external_exports.string(),
41489
+ label: external_exports.string().max(80)
41490
+ }), HubAddressBookSchema, {
41491
+ kind: "mutation",
41492
+ auth: "admin"
41493
+ }),
41494
+ /** Remove a custom address. Its role flags go with it (those roles turn automatic). */
41495
+ removeCustomAddress: method(external_exports.object({ baseUrl: external_exports.string() }), HubAddressBookSchema, {
41496
+ kind: "mutation",
41497
+ auth: "admin"
41498
+ }),
41499
+ /**
41500
+ * Flag (`enabled: true`) or unflag an address for a role. For a
41501
+ * single-valued role, flagging moves the flag off every other address.
41502
+ * `baseUrl: null` returns the role to automatic. The address must be a row
41503
+ * of the table (detected, custom, or the app link for `notificationTaps`);
41504
+ * `publicEndpoint` on a plain-http address is refused unless
41505
+ * `acceptInsecureHttp`, and never takes the app link.
41506
+ */
41507
+ setAddressRole: method(external_exports.object({
41508
+ role: HubAddressRoleSchema,
41509
+ baseUrl: external_exports.string().nullable(),
41510
+ enabled: external_exports.boolean(),
41511
+ acceptInsecureHttp: external_exports.boolean().optional()
41512
+ }), HubAddressBookSchema, {
41513
+ kind: "mutation",
41514
+ auth: "admin"
41515
+ }),
41516
+ /**
41517
+ * @deprecated Read `getAddresses().roles.internal` / `.publicEndpoint`.
41518
+ * Kept so an addon built against the D729 amendment keeps resolving:
41519
+ * `cluster` = the `internal` role, `browser` = the `publicEndpoint` role.
41520
+ */
41521
+ getHubAddresses: method(external_exports.void(), HubAddressesSchema),
41522
+ /**
39890
41523
  * Read the operator's allowlist. Empty = "auto" (no filter). Used
39891
41524
  * by the admin UI's address selector to seed its checkbox state.
39892
41525
  */
@@ -40405,7 +42038,8 @@ var MotionStatusSchema = external_exports.object({
40405
42038
  * writes this slice (not even a boot seed), and neither does the runner's
40406
42039
  * phase machine: its phase is "a session is attached" for every on-motion
40407
42040
  * session, not motion, and it now has its own `DetectionPhaseTransition`.
40408
- * A provider's `isDetected` answers from the hub's slice.
42041
+ * A provider's `isDetected` and `getStatus` answer from the hub's slice
42042
+ * (`hubMotionNativeProvider`).
40409
42043
  * - **Sensors** (Home Assistant binary sensors, Homematic, Matter, Alexa
40410
42044
  * imports) — the provider pushes both edges itself, from the upstream
40411
42045
  * system's own state change. That is the sensor's own fact.
@@ -45473,6 +47107,22 @@ var TotpStatusSchema = external_exports.object({
45473
47107
  /** Null when no row exists OR the row is still pending confirmation. */
45474
47108
  confirmedAt: external_exports.number().nullable()
45475
47109
  });
47110
+ var ExternalIdentitySchema = external_exports.object({
47111
+ /** Login-method id of the provider instance, e.g. `auth-oidc/authentik`. */
47112
+ provider: external_exports.string(),
47113
+ /** The IdP's stable subject (`sub`) for this account. */
47114
+ subject: external_exports.string(),
47115
+ /** The verified `iss` of the IdP the identity was linked under — `sub` is unique only per issuer. */
47116
+ issuer: external_exports.string(),
47117
+ userId: external_exports.string(),
47118
+ /** What the IdP called the account at link time (username / email) — display only. */
47119
+ label: external_exports.string().optional(),
47120
+ linkedAt: external_exports.number()
47121
+ });
47122
+ var ExternalIdentityKeySchema = external_exports.object({
47123
+ provider: external_exports.string().min(1),
47124
+ subject: external_exports.string().min(1)
47125
+ });
45476
47126
  var userManagementCapability = {
45477
47127
  name: "user-management",
45478
47128
  scope: "system",
@@ -45615,6 +47265,32 @@ var userManagementCapability = {
45615
47265
  username: external_exports.string(),
45616
47266
  scopes: external_exports.array(TokenScopeSchema)
45617
47267
  }).nullable(), { access: "view" }),
47268
+ listExternalIdentities: method(external_exports.object({ userId: external_exports.string() }), external_exports.array(ExternalIdentitySchema), { auth: "admin" }),
47269
+ /** The user an identity is linked to, or `null`. */
47270
+ findUserByExternalIdentity: method(ExternalIdentityKeySchema, external_exports.object({
47271
+ userId: external_exports.string(),
47272
+ issuer: external_exports.string()
47273
+ }).nullable(), { auth: "admin" }),
47274
+ /**
47275
+ * Link `(provider, subject)` to `userId`. Idempotent for the same user;
47276
+ * REFUSES (throws) an identity already linked to another user, and a
47277
+ * user that does not exist.
47278
+ */
47279
+ linkExternalIdentity: method(ExternalIdentityKeySchema.extend({
47280
+ userId: external_exports.string(),
47281
+ issuer: external_exports.string().min(1),
47282
+ label: external_exports.string().optional()
47283
+ }), external_exports.object({ success: external_exports.literal(true) }), {
47284
+ kind: "mutation",
47285
+ auth: "admin",
47286
+ access: "create"
47287
+ }),
47288
+ /** Remove one link of `userId`. `success: false` when it was not linked to that user. */
47289
+ unlinkExternalIdentity: method(ExternalIdentityKeySchema.extend({ userId: external_exports.string() }), external_exports.object({ success: external_exports.boolean() }), {
47290
+ kind: "mutation",
47291
+ auth: "admin",
47292
+ access: "delete"
47293
+ }),
45618
47294
  listOauthSessions: method(external_exports.void(), external_exports.array(OauthSessionSummarySchema), { auth: "admin" }),
45619
47295
  revokeOauthSession: method(external_exports.object({ id: external_exports.string() }), external_exports.object({ success: external_exports.boolean() }), {
45620
47296
  kind: "mutation",
@@ -46380,6 +48056,16 @@ var UNIT_TABLE = {
46380
48056
  }
46381
48057
  };
46382
48058
  var INVERTIBLE_CAPS = SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
48059
+ var FRIGATE_STOCK_CLASS_FLOORS = Object.freeze({
48060
+ person: 0.5,
48061
+ vehicle: 0.5,
48062
+ animal: 0.5
48063
+ });
48064
+ var FRIGATE_PLUS_CLASS_FLOORS = Object.freeze({
48065
+ person: 0.65,
48066
+ vehicle: 0.65,
48067
+ animal: 0.65
48068
+ });
46383
48069
  var HF_REPO = "camstack/camstack-models";
46384
48070
  var HF_BASE_URL = `https://huggingface.co/${HF_REPO}/resolve/main`;
46385
48071
  var AccessoryKind = {
@@ -46570,6 +48256,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
46570
48256
  addonId: null,
46571
48257
  access: "view"
46572
48258
  },
48259
+ "addons.listInstallations": {
48260
+ capName: "addons",
48261
+ capScope: "system",
48262
+ addonId: null,
48263
+ access: "view"
48264
+ },
46573
48265
  "addons.listJobs": {
46574
48266
  capName: "addons",
46575
48267
  capScope: "system",
@@ -47752,90 +49444,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
47752
49444
  addonId: null,
47753
49445
  access: "create"
47754
49446
  },
47755
- "decoder.createSession": {
47756
- capName: "decoder",
47757
- capScope: "system",
47758
- addonId: null,
47759
- access: "view"
47760
- },
47761
- "decoder.destroySession": {
47762
- capName: "decoder",
47763
- capScope: "system",
47764
- addonId: null,
47765
- access: "delete"
47766
- },
47767
- "decoder.getFrame": {
47768
- capName: "decoder",
47769
- capScope: "system",
47770
- addonId: null,
47771
- access: "view"
47772
- },
47773
49447
  "decoder.getInfo": {
47774
49448
  capName: "decoder",
47775
49449
  capScope: "system",
47776
49450
  addonId: null,
47777
49451
  access: "view"
47778
49452
  },
47779
- "decoder.getShmStats": {
47780
- capName: "decoder",
47781
- capScope: "system",
47782
- addonId: null,
47783
- access: "view"
47784
- },
47785
- "decoder.getStats": {
47786
- capName: "decoder",
47787
- capScope: "system",
47788
- addonId: null,
47789
- access: "view"
47790
- },
47791
- "decoder.listActiveSessions": {
47792
- capName: "decoder",
47793
- capScope: "system",
47794
- addonId: null,
47795
- access: "view"
47796
- },
47797
- "decoder.openStream": {
47798
- capName: "decoder",
47799
- capScope: "system",
47800
- addonId: null,
47801
- access: "view"
47802
- },
47803
- "decoder.pullFrames": {
47804
- capName: "decoder",
47805
- capScope: "system",
47806
- addonId: null,
47807
- access: "view"
47808
- },
47809
- "decoder.pullHandles": {
47810
- capName: "decoder",
47811
- capScope: "system",
47812
- addonId: null,
47813
- access: "view"
47814
- },
47815
- "decoder.pushPacket": {
47816
- capName: "decoder",
47817
- capScope: "system",
47818
- addonId: null,
47819
- access: "view"
47820
- },
47821
49453
  "decoder.reprobeHwaccel": {
47822
49454
  capName: "decoder",
47823
49455
  capScope: "system",
47824
49456
  addonId: null,
47825
49457
  access: "create"
47826
49458
  },
47827
- "decoder.supportsCodec": {
47828
- capName: "decoder",
47829
- capScope: "system",
47830
- addonId: null,
47831
- access: "view"
47832
- },
47833
- "decoder.updateConfig": {
47834
- capName: "decoder",
47835
- capScope: "system",
47836
- addonId: null,
47837
- access: "view"
47838
- },
47839
49459
  "detectionPipeline.applyDeviceSettingsPatch": {
47840
49460
  capName: "detection-pipeline",
47841
49461
  capScope: "device",
@@ -49102,6 +50722,96 @@ var METHOD_ACCESS_MAP = Object.freeze({
49102
50722
  addonId: null,
49103
50723
  access: "create"
49104
50724
  },
50725
+ "keychain.delete": {
50726
+ capName: "keychain",
50727
+ capScope: "system",
50728
+ addonId: null,
50729
+ access: "delete"
50730
+ },
50731
+ "keychain.getState": {
50732
+ capName: "keychain",
50733
+ capScope: "system",
50734
+ addonId: null,
50735
+ access: "view"
50736
+ },
50737
+ "keychain.listMeta": {
50738
+ capName: "keychain",
50739
+ capScope: "system",
50740
+ addonId: null,
50741
+ access: "view"
50742
+ },
50743
+ "keychain.put": {
50744
+ capName: "keychain",
50745
+ capScope: "system",
50746
+ addonId: null,
50747
+ access: "create"
50748
+ },
50749
+ "keychain.resolve": {
50750
+ capName: "keychain",
50751
+ capScope: "system",
50752
+ addonId: null,
50753
+ access: "view"
50754
+ },
50755
+ "keychainAdmin.deleteOrphans": {
50756
+ capName: "keychain-admin",
50757
+ capScope: "system",
50758
+ addonId: null,
50759
+ access: "delete"
50760
+ },
50761
+ "keychainAdmin.downloadRecoveryKey": {
50762
+ capName: "keychain-admin",
50763
+ capScope: "system",
50764
+ addonId: null,
50765
+ access: "create"
50766
+ },
50767
+ "keychainAdmin.listAudit": {
50768
+ capName: "keychain-admin",
50769
+ capScope: "system",
50770
+ addonId: null,
50771
+ access: "view"
50772
+ },
50773
+ "keychainAdmin.listSecrets": {
50774
+ capName: "keychain-admin",
50775
+ capScope: "system",
50776
+ addonId: null,
50777
+ access: "view"
50778
+ },
50779
+ "keychainAdmin.purgeRetiredKeys": {
50780
+ capName: "keychain-admin",
50781
+ capScope: "system",
50782
+ addonId: null,
50783
+ access: "delete"
50784
+ },
50785
+ "keychainAdmin.resetKeychain": {
50786
+ capName: "keychain-admin",
50787
+ capScope: "system",
50788
+ addonId: null,
50789
+ access: "delete"
50790
+ },
50791
+ "keychainAdmin.reveal": {
50792
+ capName: "keychain-admin",
50793
+ capScope: "system",
50794
+ addonId: null,
50795
+ access: "create"
50796
+ },
50797
+ "keychainAdmin.rotateMasterKey": {
50798
+ capName: "keychain-admin",
50799
+ capScope: "system",
50800
+ addonId: null,
50801
+ access: "create"
50802
+ },
50803
+ "keychainAdmin.setSystemSecret": {
50804
+ capName: "keychain-admin",
50805
+ capScope: "system",
50806
+ addonId: null,
50807
+ access: "create"
50808
+ },
50809
+ "keychainAdmin.status": {
50810
+ capName: "keychain-admin",
50811
+ capScope: "system",
50812
+ addonId: null,
50813
+ access: "view"
50814
+ },
49105
50815
  "lawnMowerControl.dock": {
49106
50816
  capName: "lawn-mower-control",
49107
50817
  capScope: "device",
@@ -49324,12 +51034,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
49324
51034
  addonId: null,
49325
51035
  access: "view"
49326
51036
  },
51037
+ "localNetwork.addCustomAddress": {
51038
+ capName: "local-network",
51039
+ capScope: "system",
51040
+ addonId: null,
51041
+ access: "create"
51042
+ },
49327
51043
  "localNetwork.downloadCa": {
49328
51044
  capName: "local-network",
49329
51045
  capScope: "system",
49330
51046
  addonId: null,
49331
51047
  access: "view"
49332
51048
  },
51049
+ "localNetwork.getAddresses": {
51050
+ capName: "local-network",
51051
+ capScope: "system",
51052
+ addonId: null,
51053
+ access: "view"
51054
+ },
49333
51055
  "localNetwork.getAllowedAddresses": {
49334
51056
  capName: "local-network",
49335
51057
  capScope: "system",
@@ -49342,6 +51064,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
49342
51064
  addonId: null,
49343
51065
  access: "view"
49344
51066
  },
51067
+ "localNetwork.getHubAddresses": {
51068
+ capName: "local-network",
51069
+ capScope: "system",
51070
+ addonId: null,
51071
+ access: "view"
51072
+ },
49345
51073
  "localNetwork.getNotificationEndpoint": {
49346
51074
  capName: "local-network",
49347
51075
  capScope: "system",
@@ -49378,6 +51106,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
49378
51106
  addonId: null,
49379
51107
  access: "create"
49380
51108
  },
51109
+ "localNetwork.removeCustomAddress": {
51110
+ capName: "local-network",
51111
+ capScope: "system",
51112
+ addonId: null,
51113
+ access: "delete"
51114
+ },
49381
51115
  "localNetwork.resetAllowlistToBestMatch": {
49382
51116
  capName: "local-network",
49383
51117
  capScope: "system",
@@ -49390,6 +51124,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
49390
51124
  addonId: null,
49391
51125
  access: "create"
49392
51126
  },
51127
+ "localNetwork.setAddressRole": {
51128
+ capName: "local-network",
51129
+ capScope: "system",
51130
+ addonId: null,
51131
+ access: "create"
51132
+ },
49393
51133
  "localNetwork.setAllowedAddresses": {
49394
51134
  capName: "local-network",
49395
51135
  capScope: "system",
@@ -50446,6 +52186,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
50446
52186
  addonId: null,
50447
52187
  access: "create"
50448
52188
  },
52189
+ "pipelineAnalytics.addRetrainFrameFromRecording": {
52190
+ capName: "pipeline-analytics",
52191
+ capScope: "device",
52192
+ addonId: null,
52193
+ access: "create"
52194
+ },
52195
+ "pipelineAnalytics.addRetrainFramesToCollection": {
52196
+ capName: "pipeline-analytics",
52197
+ capScope: "device",
52198
+ addonId: null,
52199
+ access: "create"
52200
+ },
50449
52201
  "pipelineAnalytics.applyDeviceSettingsPatch": {
50450
52202
  capName: "pipeline-analytics",
50451
52203
  capScope: "device",
@@ -50494,12 +52246,36 @@ var METHOD_ACCESS_MAP = Object.freeze({
50494
52246
  addonId: null,
50495
52247
  access: "view"
50496
52248
  },
52249
+ "pipelineAnalytics.createRetrainCollection": {
52250
+ capName: "pipeline-analytics",
52251
+ capScope: "device",
52252
+ addonId: null,
52253
+ access: "create"
52254
+ },
52255
+ "pipelineAnalytics.createRetrainDatasetVersion": {
52256
+ capName: "pipeline-analytics",
52257
+ capScope: "device",
52258
+ addonId: null,
52259
+ access: "create"
52260
+ },
50497
52261
  "pipelineAnalytics.deleteDeviceEvents": {
50498
52262
  capName: "pipeline-analytics",
50499
52263
  capScope: "device",
50500
52264
  addonId: null,
50501
52265
  access: "delete"
50502
52266
  },
52267
+ "pipelineAnalytics.deleteRetrainCollection": {
52268
+ capName: "pipeline-analytics",
52269
+ capScope: "device",
52270
+ addonId: null,
52271
+ access: "delete"
52272
+ },
52273
+ "pipelineAnalytics.deleteRetrainDatasetVersion": {
52274
+ capName: "pipeline-analytics",
52275
+ capScope: "device",
52276
+ addonId: null,
52277
+ access: "delete"
52278
+ },
50503
52279
  "pipelineAnalytics.deleteTracks": {
50504
52280
  capName: "pipeline-analytics",
50505
52281
  capScope: "device",
@@ -50704,6 +52480,30 @@ var METHOD_ACCESS_MAP = Object.freeze({
50704
52480
  addonId: null,
50705
52481
  access: "view"
50706
52482
  },
52483
+ "pipelineAnalytics.listRetrainAssistProfiles": {
52484
+ capName: "pipeline-analytics",
52485
+ capScope: "device",
52486
+ addonId: null,
52487
+ access: "view"
52488
+ },
52489
+ "pipelineAnalytics.listRetrainCollectionFrames": {
52490
+ capName: "pipeline-analytics",
52491
+ capScope: "device",
52492
+ addonId: null,
52493
+ access: "view"
52494
+ },
52495
+ "pipelineAnalytics.listRetrainCollections": {
52496
+ capName: "pipeline-analytics",
52497
+ capScope: "device",
52498
+ addonId: null,
52499
+ access: "view"
52500
+ },
52501
+ "pipelineAnalytics.listRetrainDatasetVersions": {
52502
+ capName: "pipeline-analytics",
52503
+ capScope: "device",
52504
+ addonId: null,
52505
+ access: "view"
52506
+ },
50707
52507
  "pipelineAnalytics.listRetrainFrames": {
50708
52508
  capName: "pipeline-analytics",
50709
52509
  capScope: "device",
@@ -50746,12 +52546,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
50746
52546
  addonId: null,
50747
52547
  access: "create"
50748
52548
  },
52549
+ "pipelineAnalytics.previewRetrainDataset": {
52550
+ capName: "pipeline-analytics",
52551
+ capScope: "device",
52552
+ addonId: null,
52553
+ access: "view"
52554
+ },
50749
52555
  "pipelineAnalytics.proposeRetrainAnnotations": {
50750
52556
  capName: "pipeline-analytics",
50751
52557
  capScope: "device",
50752
52558
  addonId: null,
50753
52559
  access: "create"
50754
52560
  },
52561
+ "pipelineAnalytics.proposeRetrainAnnotationsWithLlm": {
52562
+ capName: "pipeline-analytics",
52563
+ capScope: "device",
52564
+ addonId: null,
52565
+ access: "create"
52566
+ },
50755
52567
  "pipelineAnalytics.pruneEvents": {
50756
52568
  capName: "pipeline-analytics",
50757
52569
  capScope: "device",
@@ -50806,6 +52618,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
50806
52618
  addonId: null,
50807
52619
  access: "create"
50808
52620
  },
52621
+ "pipelineAnalytics.removeRetrainFrameFromCollection": {
52622
+ capName: "pipeline-analytics",
52623
+ capScope: "device",
52624
+ addonId: null,
52625
+ access: "delete"
52626
+ },
52627
+ "pipelineAnalytics.renameRetrainCollection": {
52628
+ capName: "pipeline-analytics",
52629
+ capScope: "device",
52630
+ addonId: null,
52631
+ access: "create"
52632
+ },
50809
52633
  "pipelineAnalytics.restageRetrainTrack": {
50810
52634
  capName: "pipeline-analytics",
50811
52635
  capScope: "device",
@@ -50836,6 +52660,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
50836
52660
  addonId: null,
50837
52661
  access: "create"
50838
52662
  },
52663
+ "pipelineAnalytics.setRetrainFrameComplete": {
52664
+ capName: "pipeline-analytics",
52665
+ capScope: "device",
52666
+ addonId: null,
52667
+ access: "create"
52668
+ },
50839
52669
  "pipelineAnalytics.setTrackFlags": {
50840
52670
  capName: "pipeline-analytics",
50841
52671
  capScope: "device",
@@ -50860,6 +52690,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
50860
52690
  addonId: null,
50861
52691
  access: "create"
50862
52692
  },
52693
+ "pipelineAnalytics.verifyRetrainDatasetVersion": {
52694
+ capName: "pipeline-analytics",
52695
+ capScope: "device",
52696
+ addonId: null,
52697
+ access: "view"
52698
+ },
50863
52699
  "pipelineAnalytics.wipeAllAnalytics": {
50864
52700
  capName: "pipeline-analytics",
50865
52701
  capScope: "device",
@@ -50872,6 +52708,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
50872
52708
  addonId: null,
50873
52709
  access: "delete"
50874
52710
  },
52711
+ "pipelineAnalytics.writeRetrainArchive": {
52712
+ capName: "pipeline-analytics",
52713
+ capScope: "device",
52714
+ addonId: null,
52715
+ access: "create"
52716
+ },
50875
52717
  "pipelineExecutor.cacheFrameInPool": {
50876
52718
  capName: "pipeline-executor",
50877
52719
  capScope: "system",
@@ -50884,13 +52726,13 @@ var METHOD_ACCESS_MAP = Object.freeze({
50884
52726
  addonId: null,
50885
52727
  access: "delete"
50886
52728
  },
50887
- "pipelineExecutor.deleteModel": {
52729
+ "pipelineExecutor.clearModelBoundDeviceOverrides": {
50888
52730
  capName: "pipeline-executor",
50889
52731
  capScope: "system",
50890
52732
  addonId: null,
50891
52733
  access: "delete"
50892
52734
  },
50893
- "pipelineExecutor.deleteTemplate": {
52735
+ "pipelineExecutor.deleteModel": {
50894
52736
  capName: "pipeline-executor",
50895
52737
  capScope: "system",
50896
52738
  addonId: null,
@@ -51034,12 +52876,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
51034
52876
  addonId: null,
51035
52877
  access: "view"
51036
52878
  },
51037
- "pipelineExecutor.listTemplates": {
51038
- capName: "pipeline-executor",
51039
- capScope: "system",
51040
- addonId: null,
51041
- access: "view"
51042
- },
51043
52879
  "pipelineExecutor.rearmInferenceDevice": {
51044
52880
  capName: "pipeline-executor",
51045
52881
  capScope: "system",
@@ -51064,12 +52900,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
51064
52900
  addonId: null,
51065
52901
  access: "create"
51066
52902
  },
51067
- "pipelineExecutor.saveTemplate": {
51068
- capName: "pipeline-executor",
51069
- capScope: "system",
51070
- addonId: null,
51071
- access: "create"
51072
- },
51073
52903
  "pipelineExecutor.setVideoPipelineSteps": {
51074
52904
  capName: "pipeline-executor",
51075
52905
  capScope: "system",
@@ -51088,17 +52918,23 @@ var METHOD_ACCESS_MAP = Object.freeze({
51088
52918
  addonId: null,
51089
52919
  access: "create"
51090
52920
  },
51091
- "pipelineExecutor.updateTemplate": {
52921
+ "pipelineExecutor.validatePipeline": {
51092
52922
  capName: "pipeline-executor",
51093
52923
  capScope: "system",
51094
52924
  addonId: null,
52925
+ access: "view"
52926
+ },
52927
+ "pipelineOrchestrator.abortNodeBenchmark": {
52928
+ capName: "pipeline-orchestrator",
52929
+ capScope: "system",
52930
+ addonId: null,
51095
52931
  access: "create"
51096
52932
  },
51097
- "pipelineExecutor.validatePipeline": {
51098
- capName: "pipeline-executor",
52933
+ "pipelineOrchestrator.applyAutoTune": {
52934
+ capName: "pipeline-orchestrator",
51099
52935
  capScope: "system",
51100
52936
  addonId: null,
51101
- access: "view"
52937
+ access: "create"
51102
52938
  },
51103
52939
  "pipelineOrchestrator.applyDeviceSettingsPatch": {
51104
52940
  capName: "pipeline-orchestrator",
@@ -51118,7 +52954,7 @@ var METHOD_ACCESS_MAP = Object.freeze({
51118
52954
  addonId: null,
51119
52955
  access: "create"
51120
52956
  },
51121
- "pipelineOrchestrator.deleteTemplate": {
52957
+ "pipelineOrchestrator.deleteNodeBenchmarkResult": {
51122
52958
  capName: "pipeline-orchestrator",
51123
52959
  capScope: "system",
51124
52960
  addonId: null,
@@ -51214,6 +53050,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
51214
53050
  addonId: null,
51215
53051
  access: "view"
51216
53052
  },
53053
+ "pipelineOrchestrator.getEffectiveShares": {
53054
+ capName: "pipeline-orchestrator",
53055
+ capScope: "system",
53056
+ addonId: null,
53057
+ access: "view"
53058
+ },
51217
53059
  "pipelineOrchestrator.getGlobalMetrics": {
51218
53060
  capName: "pipeline-orchestrator",
51219
53061
  capScope: "system",
@@ -51226,6 +53068,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
51226
53068
  addonId: null,
51227
53069
  access: "view"
51228
53070
  },
53071
+ "pipelineOrchestrator.getNodeBenchmarkCandidates": {
53072
+ capName: "pipeline-orchestrator",
53073
+ capScope: "system",
53074
+ addonId: null,
53075
+ access: "view"
53076
+ },
53077
+ "pipelineOrchestrator.getNodeBenchmarkPreflight": {
53078
+ capName: "pipeline-orchestrator",
53079
+ capScope: "system",
53080
+ addonId: null,
53081
+ access: "view"
53082
+ },
53083
+ "pipelineOrchestrator.getNodeBenchmarkStatus": {
53084
+ capName: "pipeline-orchestrator",
53085
+ capScope: "system",
53086
+ addonId: null,
53087
+ access: "view"
53088
+ },
51229
53089
  "pipelineOrchestrator.getNodeInferenceDevices": {
51230
53090
  capName: "pipeline-orchestrator",
51231
53091
  capScope: "system",
@@ -51250,6 +53110,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
51250
53110
  addonId: null,
51251
53111
  access: "view"
51252
53112
  },
53113
+ "pipelineOrchestrator.getPlacementStats": {
53114
+ capName: "pipeline-orchestrator",
53115
+ capScope: "system",
53116
+ addonId: null,
53117
+ access: "view"
53118
+ },
51253
53119
  "pipelineOrchestrator.getReconcileFromDiskStatus": {
51254
53120
  capName: "pipeline-orchestrator",
51255
53121
  capScope: "system",
@@ -51262,7 +53128,7 @@ var METHOD_ACCESS_MAP = Object.freeze({
51262
53128
  addonId: null,
51263
53129
  access: "view"
51264
53130
  },
51265
- "pipelineOrchestrator.listTemplates": {
53131
+ "pipelineOrchestrator.listNodeBenchmarkResults": {
51266
53132
  capName: "pipeline-orchestrator",
51267
53133
  capScope: "system",
51268
53134
  addonId: null,
@@ -51274,6 +53140,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
51274
53140
  addonId: null,
51275
53141
  access: "create"
51276
53142
  },
53143
+ "pipelineOrchestrator.planAutoTune": {
53144
+ capName: "pipeline-orchestrator",
53145
+ capScope: "system",
53146
+ addonId: null,
53147
+ access: "view"
53148
+ },
51277
53149
  "pipelineOrchestrator.rebalance": {
51278
53150
  capName: "pipeline-orchestrator",
51279
53151
  capScope: "system",
@@ -51316,12 +53188,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
51316
53188
  addonId: null,
51317
53189
  access: "create"
51318
53190
  },
51319
- "pipelineOrchestrator.saveTemplate": {
51320
- capName: "pipeline-orchestrator",
51321
- capScope: "system",
51322
- addonId: null,
51323
- access: "create"
51324
- },
51325
53191
  "pipelineOrchestrator.setAgentCapabilities": {
51326
53192
  capName: "pipeline-orchestrator",
51327
53193
  capScope: "system",
@@ -51334,12 +53200,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
51334
53200
  addonId: null,
51335
53201
  access: "create"
51336
53202
  },
51337
- "pipelineOrchestrator.setAgentDetectWeight": {
51338
- capName: "pipeline-orchestrator",
51339
- capScope: "system",
51340
- addonId: null,
51341
- access: "create"
51342
- },
51343
53203
  "pipelineOrchestrator.setAgentInferenceDevices": {
51344
53204
  capName: "pipeline-orchestrator",
51345
53205
  capScope: "system",
@@ -51376,6 +53236,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
51376
53236
  addonId: null,
51377
53237
  access: "create"
51378
53238
  },
53239
+ "pipelineOrchestrator.setCameraStepSettings": {
53240
+ capName: "pipeline-orchestrator",
53241
+ capScope: "system",
53242
+ addonId: null,
53243
+ access: "create"
53244
+ },
51379
53245
  "pipelineOrchestrator.setCameraStepToggle": {
51380
53246
  capName: "pipeline-orchestrator",
51381
53247
  capScope: "system",
@@ -51394,12 +53260,36 @@ var METHOD_ACCESS_MAP = Object.freeze({
51394
53260
  addonId: null,
51395
53261
  access: "create"
51396
53262
  },
53263
+ "pipelineOrchestrator.setLoadBalancingShares": {
53264
+ capName: "pipeline-orchestrator",
53265
+ capScope: "system",
53266
+ addonId: null,
53267
+ access: "create"
53268
+ },
51397
53269
  "pipelineOrchestrator.setPipelineDevicePin": {
51398
53270
  capName: "pipeline-orchestrator",
51399
53271
  capScope: "system",
51400
53272
  addonId: null,
51401
53273
  access: "create"
51402
53274
  },
53275
+ "pipelineOrchestrator.setShareSource": {
53276
+ capName: "pipeline-orchestrator",
53277
+ capScope: "system",
53278
+ addonId: null,
53279
+ access: "create"
53280
+ },
53281
+ "pipelineOrchestrator.startNodeBenchmark": {
53282
+ capName: "pipeline-orchestrator",
53283
+ capScope: "system",
53284
+ addonId: null,
53285
+ access: "create"
53286
+ },
53287
+ "pipelineOrchestrator.suggestShares": {
53288
+ capName: "pipeline-orchestrator",
53289
+ capScope: "system",
53290
+ addonId: null,
53291
+ access: "view"
53292
+ },
51403
53293
  "pipelineOrchestrator.unassignAudio": {
51404
53294
  capName: "pipeline-orchestrator",
51405
53295
  capScope: "system",
@@ -51412,8 +53302,8 @@ var METHOD_ACCESS_MAP = Object.freeze({
51412
53302
  addonId: null,
51413
53303
  access: "create"
51414
53304
  },
51415
- "pipelineOrchestrator.updateTemplate": {
51416
- capName: "pipeline-orchestrator",
53305
+ "pipelineRunner.abortNodeBench": {
53306
+ capName: "pipeline-runner",
51417
53307
  capScope: "system",
51418
53308
  addonId: null,
51419
53309
  access: "create"
@@ -51466,6 +53356,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
51466
53356
  addonId: null,
51467
53357
  access: "view"
51468
53358
  },
53359
+ "pipelineRunner.getNodeBenchStatus": {
53360
+ capName: "pipeline-runner",
53361
+ capScope: "system",
53362
+ addonId: null,
53363
+ access: "view"
53364
+ },
51469
53365
  "pipelineRunner.getParkedTrackFrame": {
51470
53366
  capName: "pipeline-runner",
51471
53367
  capScope: "system",
@@ -51508,6 +53404,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
51508
53404
  addonId: null,
51509
53405
  access: "create"
51510
53406
  },
53407
+ "pipelineRunner.startNodeBench": {
53408
+ capName: "pipeline-runner",
53409
+ capScope: "system",
53410
+ addonId: null,
53411
+ access: "create"
53412
+ },
51511
53413
  "plateGallery.assignPlate": {
51512
53414
  capName: "plate-gallery",
51513
53415
  capScope: "system",
@@ -52852,12 +54754,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
52852
54754
  addonId: null,
52853
54755
  access: "view"
52854
54756
  },
52855
- "streamBroker.pullFrameHandles": {
52856
- capName: "stream-broker",
52857
- capScope: "system",
52858
- addonId: null,
52859
- access: "view"
52860
- },
52861
54757
  "streamBroker.regenerateRtspToken": {
52862
54758
  capName: "stream-broker",
52863
54759
  capScope: "system",
@@ -52924,12 +54820,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
52924
54820
  addonId: null,
52925
54821
  access: "create"
52926
54822
  },
52927
- "streamBroker.subscribeFrames": {
52928
- capName: "stream-broker",
52929
- capScope: "system",
52930
- addonId: null,
52931
- access: "create"
52932
- },
52933
54823
  "streamBroker.unassignProfile": {
52934
54824
  capName: "stream-broker",
52935
54825
  capScope: "system",
@@ -52942,12 +54832,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
52942
54832
  addonId: null,
52943
54833
  access: "create"
52944
54834
  },
52945
- "streamBroker.unsubscribeFrames": {
52946
- capName: "stream-broker",
52947
- capScope: "system",
52948
- addonId: null,
52949
- access: "create"
52950
- },
52951
54835
  "streamCatalog.getCatalog": {
52952
54836
  capName: "stream-catalog",
52953
54837
  capScope: "device",
@@ -53242,18 +55126,36 @@ var METHOD_ACCESS_MAP = Object.freeze({
53242
55126
  addonId: null,
53243
55127
  access: "delete"
53244
55128
  },
55129
+ "userManagement.findUserByExternalIdentity": {
55130
+ capName: "user-management",
55131
+ capScope: "system",
55132
+ addonId: null,
55133
+ access: "view"
55134
+ },
53245
55135
  "userManagement.getTotpStatus": {
53246
55136
  capName: "user-management",
53247
55137
  capScope: "system",
53248
55138
  addonId: null,
53249
55139
  access: "view"
53250
55140
  },
55141
+ "userManagement.linkExternalIdentity": {
55142
+ capName: "user-management",
55143
+ capScope: "system",
55144
+ addonId: null,
55145
+ access: "create"
55146
+ },
53251
55147
  "userManagement.listApiKeys": {
53252
55148
  capName: "user-management",
53253
55149
  capScope: "system",
53254
55150
  addonId: null,
53255
55151
  access: "view"
53256
55152
  },
55153
+ "userManagement.listExternalIdentities": {
55154
+ capName: "user-management",
55155
+ capScope: "system",
55156
+ addonId: null,
55157
+ access: "view"
55158
+ },
53257
55159
  "userManagement.listOauthSessions": {
53258
55160
  capName: "user-management",
53259
55161
  capScope: "system",
@@ -53332,6 +55234,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
53332
55234
  addonId: null,
53333
55235
  access: "create"
53334
55236
  },
55237
+ "userManagement.unlinkExternalIdentity": {
55238
+ capName: "user-management",
55239
+ capScope: "system",
55240
+ addonId: null,
55241
+ access: "delete"
55242
+ },
53335
55243
  "userManagement.updateUser": {
53336
55244
  capName: "user-management",
53337
55245
  capScope: "system",
@@ -53644,6 +55552,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
53644
55552
  addonId: null,
53645
55553
  access: "create"
53646
55554
  },
55555
+ "webrtcSession.applyDownlinkProbe": {
55556
+ capName: "webrtc-session",
55557
+ capScope: "device",
55558
+ addonId: null,
55559
+ access: "create"
55560
+ },
53647
55561
  "webrtcSession.closeSession": {
53648
55562
  capName: "webrtc-session",
53649
55563
  capScope: "device",
@@ -55497,11 +57411,6 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
55497
57411
  form: "single",
55498
57412
  optional: false
55499
57413
  }],
55500
- "decoder.createSession": [{
55501
- name: "deviceId",
55502
- form: "single",
55503
- optional: true
55504
- }],
55505
57414
  "detectionPipeline.applyDeviceSettingsPatch": [{
55506
57415
  name: "deviceId",
55507
57416
  form: "single",
@@ -56472,6 +58381,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
56472
58381
  form: "single",
56473
58382
  optional: false
56474
58383
  }],
58384
+ "pipelineAnalytics.addRetrainFrameFromRecording": [{
58385
+ name: "deviceId",
58386
+ form: "single",
58387
+ optional: false
58388
+ }],
56475
58389
  "pipelineAnalytics.applyDeviceSettingsPatch": [{
56476
58390
  name: "deviceId",
56477
58391
  form: "single",
@@ -56662,6 +58576,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
56662
58576
  form: "single",
56663
58577
  optional: false
56664
58578
  }],
58579
+ "pipelineAnalytics.proposeRetrainAnnotationsWithLlm": [{
58580
+ name: "deviceId",
58581
+ form: "single",
58582
+ optional: false
58583
+ }],
56665
58584
  "pipelineAnalytics.pruneEventsBefore": [{
56666
58585
  name: "deviceId",
56667
58586
  form: "single",
@@ -56712,6 +58631,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
56712
58631
  form: "single",
56713
58632
  optional: false
56714
58633
  }],
58634
+ "pipelineAnalytics.setRetrainFrameComplete": [{
58635
+ name: "deviceId",
58636
+ form: "single",
58637
+ optional: false
58638
+ }],
56715
58639
  "pipelineAnalytics.setTrackFlags": [{
56716
58640
  name: "deviceId",
56717
58641
  form: "single",
@@ -56732,6 +58656,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
56732
58656
  form: "single",
56733
58657
  optional: false
56734
58658
  }],
58659
+ "pipelineExecutor.clearModelBoundDeviceOverrides": [{
58660
+ name: "deviceIds",
58661
+ form: "array",
58662
+ optional: true
58663
+ }],
56735
58664
  "pipelineExecutor.runPipeline": [{
56736
58665
  name: "deviceId",
56737
58666
  form: "single",
@@ -56837,6 +58766,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
56837
58766
  form: "single",
56838
58767
  optional: false
56839
58768
  }],
58769
+ "pipelineOrchestrator.setCameraStepSettings": [{
58770
+ name: "deviceId",
58771
+ form: "single",
58772
+ optional: false
58773
+ }],
56840
58774
  "pipelineOrchestrator.setCameraStepToggle": [{
56841
58775
  name: "deviceId",
56842
58776
  form: "single",
@@ -57608,6 +59542,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
57608
59542
  form: "single",
57609
59543
  optional: false
57610
59544
  }],
59545
+ "webrtcSession.applyDownlinkProbe": [{
59546
+ name: "deviceId",
59547
+ form: "single",
59548
+ optional: false
59549
+ }],
57611
59550
  "webrtcSession.closeSession": [{
57612
59551
  name: "deviceId",
57613
59552
  form: "single",
@@ -57758,6 +59697,8 @@ var NC_SYSTEM_EVENT_FAMILY = {
57758
59697
  "detection-blind": "device-events",
57759
59698
  "node-online": "system",
57760
59699
  "node-offline": "system",
59700
+ "node-restarting": "system",
59701
+ "node-updating": "system",
57761
59702
  "node-inference-unavailable": "system",
57762
59703
  "addon-crash-loop": "system",
57763
59704
  "addon-update-available": "system",
@@ -57836,6 +59777,7 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
57836
59777
  kinds: [
57837
59778
  "node-offline",
57838
59779
  "node-online",
59780
+ "node-restarting",
57839
59781
  "node-inference-unavailable"
57840
59782
  ]
57841
59783
  },
@@ -57857,6 +59799,7 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
57857
59799
  label: "Server & container updates",
57858
59800
  kinds: [
57859
59801
  "server-update-available",
59802
+ "node-updating",
57860
59803
  "server-updated",
57861
59804
  "wrapper-update-available"
57862
59805
  ]
@@ -57978,6 +59921,7 @@ var STATE_SUMMARY_SECTION_VARS = [
57978
59921
  kinds: [
57979
59922
  "node-offline",
57980
59923
  "node-online",
59924
+ "node-restarting",
57981
59925
  "node-inference-unavailable"
57982
59926
  ]
57983
59927
  },
@@ -57999,6 +59943,7 @@ var STATE_SUMMARY_SECTION_VARS = [
57999
59943
  example: "server 1.2.377 \u2192 1.2.378",
58000
59944
  kinds: [
58001
59945
  "server-update-available",
59946
+ "node-updating",
58002
59947
  "server-updated",
58003
59948
  "wrapper-update-available"
58004
59949
  ]
@@ -58031,7 +59976,7 @@ var STATE_SUMMARY_VARS = [
58031
59976
  {
58032
59977
  name: "summarySection",
58033
59978
  label: "Summary: this section",
58034
- description: "The section a per-section summary row is about (D698); on a summary sent as one message, every section it reports, comma-separated.",
59979
+ description: "The section a per-section summary row is about; on a summary sent as one message, every section it reports, comma-separated.",
58035
59980
  example: "Batterie scariche",
58036
59981
  group: "system",
58037
59982
  families: ["rule"],
@@ -58404,6 +60349,8 @@ var NC_TEMPLATE_VARS = [
58404
60349
  systemEventKinds: [
58405
60350
  "node-online",
58406
60351
  "node-offline",
60352
+ "node-restarting",
60353
+ "node-updating",
58407
60354
  "node-inference-unavailable",
58408
60355
  "addon-crash-loop",
58409
60356
  ...UPDATES,
@@ -58422,6 +60369,8 @@ var NC_TEMPLATE_VARS = [
58422
60369
  systemEventKinds: [
58423
60370
  "node-online",
58424
60371
  "node-offline",
60372
+ "node-restarting",
60373
+ "node-updating",
58425
60374
  "node-inference-unavailable",
58426
60375
  "addon-crash-loop",
58427
60376
  ...UPDATES,
@@ -58475,6 +60424,7 @@ var NC_TEMPLATE_VARS = [
58475
60424
  systemEventKinds: [
58476
60425
  ...UPDATES,
58477
60426
  "addon-updated",
60427
+ "node-updating",
58478
60428
  "server-updated"
58479
60429
  ]
58480
60430
  },
@@ -58486,7 +60436,11 @@ var NC_TEMPLATE_VARS = [
58486
60436
  families: ["rule"],
58487
60437
  fields: [...RULE_TEXT],
58488
60438
  kinds: ["system"],
58489
- systemEventKinds: [...PACKAGE_UPDATES, "server-updated"]
60439
+ systemEventKinds: [
60440
+ ...PACKAGE_UPDATES,
60441
+ "node-updating",
60442
+ "server-updated"
60443
+ ]
58490
60444
  },
58491
60445
  {
58492
60446
  name: "nodes",
@@ -58538,7 +60492,7 @@ var NC_TEMPLATE_VARS = [
58538
60492
  families: ["rule"],
58539
60493
  fields: [...RULE_TEXT],
58540
60494
  kinds: ["system"],
58541
- systemEventKinds: ["server-updated"]
60495
+ systemEventKinds: ["node-updating", "server-updated"]
58542
60496
  },
58543
60497
  {
58544
60498
  name: "toVersion",
@@ -58548,7 +60502,7 @@ var NC_TEMPLATE_VARS = [
58548
60502
  families: ["rule"],
58549
60503
  fields: [...RULE_TEXT],
58550
60504
  kinds: ["system"],
58551
- systemEventKinds: ["server-updated"]
60505
+ systemEventKinds: ["node-updating", "server-updated"]
58552
60506
  },
58553
60507
  {
58554
60508
  name: "destinationsOk",
@@ -59015,6 +60969,7 @@ var TimelapseRuleSchema = TimelapseRuleInputSchema.extend({
59015
60969
  updatedAt: external_exports.number()
59016
60970
  });
59017
60971
  var ProviderMotionDataSchema = MotionOnMotionChangedDataSchema.omit({ triggeredBy: true });
60972
+ var OVERHEAD_MS = 3 * 6e4;
59018
60973
  var DetailCropConventionSchema = external_exports.object({
59019
60974
  /**
59020
60975
  * Fraction of the box's own size added on EACH side before cutting.