camstack 1.2.180 → 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,57 +17617,18 @@ var CLIP_SEARCH_STRICTNESS = [
17735
17617
  "strict"
17736
17618
  ];
17737
17619
  var ClipSearchStrictnessSchema = external_exports.enum(CLIP_SEARCH_STRICTNESS);
17738
- var MACRO_LABELS = [
17739
- {
17740
- id: "person",
17741
- name: "Person"
17742
- },
17743
- {
17744
- id: "vehicle",
17745
- name: "Vehicle"
17746
- },
17747
- {
17748
- id: "animal",
17749
- name: "Animal"
17750
- },
17751
- {
17752
- id: "package",
17753
- name: "Package"
17754
- }
17755
- ];
17756
- var DETECTION_MACRO_CLASSES = new Set(MACRO_LABELS.map((l) => l.id));
17757
- var COCO_TO_MACRO = {
17758
- mapping: {
17759
- person: "person",
17760
- bicycle: "vehicle",
17761
- car: "vehicle",
17762
- motorcycle: "vehicle",
17763
- airplane: "vehicle",
17764
- bus: "vehicle",
17765
- train: "vehicle",
17766
- truck: "vehicle",
17767
- boat: "vehicle",
17768
- bird: "animal",
17769
- cat: "animal",
17770
- dog: "animal",
17771
- horse: "animal",
17772
- sheep: "animal",
17773
- cow: "animal",
17774
- elephant: "animal",
17775
- bear: "animal",
17776
- zebra: "animal",
17777
- giraffe: "animal",
17778
- suitcase: "package",
17779
- backpack: "package",
17780
- handbag: "package"
17781
- },
17782
- preserveOriginal: false
17783
- };
17784
- var FILLABLE_STEP_IDS = [
17620
+ var LABEL_SUPPLY_STEP_IDS = [
17785
17621
  "animal-classifier",
17786
17622
  "vehicle-classifier",
17787
17623
  "package-detection"
17788
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
+ ];
17789
17632
  var MODEL_FORMATS = [
17790
17633
  "onnx",
17791
17634
  "coreml",
@@ -17802,7 +17645,35 @@ var ModelFormatEntrySchema = external_exports.object({
17802
17645
  /** Multi-file payload (directory members or sibling files). */
17803
17646
  files: external_exports.array(external_exports.string()).readonly().optional(),
17804
17647
  /** Runtime(s) that can use this format. If omitted, inferred from ModelFormat key */
17805
- 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()
17806
17677
  });
17807
17678
  var ModelExtraFileSchema = external_exports.object({
17808
17679
  url: external_exports.string(),
@@ -17879,11 +17750,31 @@ var ModelLicenseRecordSchema = external_exports.object({
17879
17750
  nonCommercial: external_exports.boolean().optional()
17880
17751
  });
17881
17752
  var ModelLicenseSchema = external_exports.preprocess((value) => typeof value === "string" ? { weights: value } : value, ModelLicenseRecordSchema);
17882
- var FillsClassifierEffectSchema = external_exports.object({
17883
- stepId: external_exports.enum(FILLABLE_STEP_IDS),
17884
- labelToEffect: external_exports.record(external_exports.string(), external_exports.string()),
17885
- uncovered: external_exports.array(external_exports.string()).readonly()
17886
- });
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
+ ]);
17887
17778
  var ModelCatalogEntrySchema = external_exports.object({
17888
17779
  id: external_exports.string(),
17889
17780
  name: external_exports.string(),
@@ -17949,6 +17840,35 @@ var ModelCatalogEntrySchema = external_exports.object({
17949
17840
  */
17950
17841
  defaultConfidence: external_exports.number().min(0).max(1).optional(),
17951
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
+ /**
17952
17872
  * When true, the executor produces a landmark-aligned crop (similarity warp
17953
17873
  * onto the canonical template) before this step runs, instead of a plain
17954
17874
  * axis-aligned bbox crop. Required for face-recognition embedders (ArcFace):
@@ -18010,15 +17930,15 @@ var ModelCatalogEntrySchema = external_exports.object({
18010
17930
  */
18011
17931
  classMap: DetectionCatalogClassMapSchema.optional(),
18012
17932
  /**
18013
- * The pipeline steps this ROOT detector already does the work of (D715):
18014
- * its labels name the effect the step exists to produce (`deer` for
18015
- * `animal-classifier`, `package` for `package-detection`). Derived from the
18016
- * labelmap by `deriveClassifierFills`, never hand-written; a COCO model
18017
- * declares none. Whether a declaration is honoured is the step's own
18018
- * `labelLink` policy (`resolveLabelLink`). `labelToEffect` values are in
18019
- * `FILLABLE_STEP_VOCABULARIES` (guard `check-label-link-vocabulary`).
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`).
18020
17940
  */
18021
- fillsClassifierEffects: external_exports.array(FillsClassifierEffectSchema).readonly().optional(),
17941
+ suppliesSteps: external_exports.array(RootStepSupplySchema).readonly().optional(),
18022
17942
  /**
18023
17943
  * The model's CLIP feature-space contract (text encoder, dimension, vector
18024
17944
  * index, token window, search floor) — see `clip-model.ts`. Present ONLY on a
@@ -19622,13 +19542,6 @@ var BrokerRtspClientSchema = external_exports.object({
19622
19542
  lastRtpAt: external_exports.number(),
19623
19543
  bytesSent: external_exports.number()
19624
19544
  });
19625
- var BrokerDecodedClientSchema = external_exports.object({
19626
- tag: external_exports.string(),
19627
- subscribedAt: external_exports.number(),
19628
- maxFps: external_exports.number(),
19629
- framesDelivered: external_exports.number(),
19630
- framesDropped: external_exports.number()
19631
- });
19632
19545
  var BrokerAudioClientSchema = external_exports.object({
19633
19546
  tag: external_exports.string(),
19634
19547
  subscribedAt: external_exports.number(),
@@ -19721,7 +19634,6 @@ var BrokerEncodedClientSchema = external_exports.object({
19721
19634
  });
19722
19635
  var BrokerClientsSchema = external_exports.object({
19723
19636
  rtsp: external_exports.array(BrokerRtspClientSchema).readonly(),
19724
- decoded: external_exports.array(BrokerDecodedClientSchema).readonly(),
19725
19637
  audio: external_exports.array(BrokerAudioClientSchema).readonly(),
19726
19638
  encoded: external_exports.array(BrokerEncodedClientSchema).readonly(),
19727
19639
  pipeClients: external_exports.number(),
@@ -20192,11 +20104,7 @@ var streamBrokerCapability = {
20192
20104
  listClients: method(external_exports.object({ brokerId: external_exports.string() }), BrokerClientsSchema),
20193
20105
  killClient: method(external_exports.object({
20194
20106
  brokerId: external_exports.string(),
20195
- channel: external_exports.enum([
20196
- "rtsp",
20197
- "decoded",
20198
- "audio"
20199
- ]),
20107
+ channel: external_exports.enum(["rtsp", "audio"]),
20200
20108
  handle: external_exports.string()
20201
20109
  }), external_exports.object({ killed: external_exports.boolean() }), {
20202
20110
  kind: "mutation",
@@ -20295,31 +20203,6 @@ var streamBrokerCapability = {
20295
20203
  maxCount: external_exports.number().int().positive().default(8)
20296
20204
  }), external_exports.array(DecodedAudioChunkSchema).readonly()),
20297
20205
  unsubscribeAudioChunks: method(external_exports.object({ subscriptionId: external_exports.string() }), external_exports.object({ released: external_exports.boolean() }), { kind: "mutation" }),
20298
- /**
20299
- * ── Shared-memory frame plane (Phase 5 / D9) ──────────────────────
20300
- *
20301
- * The handle-based replacement for the live-object `IStreamBroker.
20302
- * onDecodedFrame` callback path. A consumer:
20303
- *
20304
- * 1. `subscribeFrames({ brokerId, format })` — the broker spins up
20305
- * (or reuses) a `frameSink: 'shm'` decoder session producing that
20306
- * `format` and returns a `subscriptionId`.
20307
- * 2. polls `pullFrameHandles({ subscriptionId, maxCount })` — drains
20308
- * zero-pixel `FrameHandle[]`; each handle is fed to a
20309
- * `FrameRingReader` that opens the named shm segment and reads the
20310
- * pixels back zero-copy.
20311
- * 3. `unsubscribeFrames({ subscriptionId })` on teardown.
20312
- *
20313
- * The broker keeps one shm ring per `(brokerId, format)` actually
20314
- * requested — no broker-side `sharp` conversion. fps throttling is
20315
- * implicit (latest-wins ring reads drop frames for a slow consumer).
20316
- */
20317
- subscribeFrames: method(SubscribeFramesInputSchema, SubscribeFramesResultSchema, { kind: "mutation" }),
20318
- pullFrameHandles: method(external_exports.object({
20319
- subscriptionId: external_exports.string(),
20320
- maxCount: external_exports.number().int().positive().default(4)
20321
- }), external_exports.array(FrameHandleSchema).readonly()),
20322
- unsubscribeFrames: method(external_exports.object({ subscriptionId: external_exports.string() }), external_exports.object({ released: external_exports.boolean() }), { kind: "mutation" }),
20323
20206
  setPreBufferDuration: method(external_exports.object({
20324
20207
  brokerId: external_exports.string(),
20325
20208
  seconds: external_exports.number().min(0).max(30)
@@ -21799,67 +21682,255 @@ var dataStoreProviderCapability = {
21799
21682
  })
21800
21683
  }
21801
21684
  };
21802
- var ShmRingStatsSchema = external_exports.object({
21803
- sessionId: external_exports.string(),
21804
- slotCount: external_exports.number().int(),
21805
- slotByteLength: external_exports.number().int(),
21806
- segmentBytes: external_exports.number().int(),
21807
- budgetMb: external_exports.number().int(),
21808
- framesWritten: external_exports.number().int(),
21809
- getFrameHits: external_exports.number().int(),
21810
- getFrameMisses: external_exports.number().int()
21811
- });
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
+ };
21812
21922
  var decoderCapability = {
21813
21923
  name: "decoder",
21814
21924
  scope: "system",
21815
21925
  mode: "singleton",
21816
21926
  preferredProvider: "decoder-nodeav",
21817
21927
  methods: {
21818
- supportsCodec: method(external_exports.object({ codec: external_exports.string() }), external_exports.boolean()),
21819
21928
  getInfo: method(external_exports.void(), external_exports.object({
21820
21929
  id: external_exports.string(),
21821
21930
  name: external_exports.string(),
21822
- isPullMode: external_exports.boolean().optional(),
21823
- priority: external_exports.number().optional(),
21824
21931
  hwaccel: external_exports.string().optional(),
21825
21932
  probedBestHwaccel: external_exports.string().optional()
21826
21933
  })),
21827
- createSession: method(DecoderSessionConfigSchema, external_exports.object({
21828
- sessionId: external_exports.string(),
21829
- nodeId: external_exports.string()
21830
- })),
21831
- destroySession: method(external_exports.object({ sessionId: external_exports.string() }), external_exports.void()),
21832
- pushPacket: method(external_exports.object({
21833
- sessionId: external_exports.string(),
21834
- packet: EncodedPacketSchema
21835
- }), external_exports.void()),
21836
- openStream: method(external_exports.object({
21837
- sessionId: external_exports.string(),
21838
- url: external_exports.string()
21839
- }), external_exports.void()),
21840
- pullFrames: method(external_exports.object({
21841
- sessionId: external_exports.string(),
21842
- maxCount: external_exports.number().default(1),
21843
- waitMs: external_exports.number().optional()
21844
- }), external_exports.array(DecodedFrameSchema)),
21845
- pullHandles: method(external_exports.object({
21846
- sessionId: external_exports.string(),
21847
- maxCount: external_exports.number().default(1),
21848
- waitMs: external_exports.number().optional()
21849
- }), external_exports.array(FrameHandleSchema)),
21850
- getFrame: method(external_exports.object({ handle: FrameHandleSchema }), DecodedFrameSchema.nullable()),
21851
- getShmStats: method(external_exports.object({ sessionId: external_exports.string() }), ShmRingStatsSchema.nullable()),
21852
- updateConfig: method(external_exports.object({
21853
- sessionId: external_exports.string(),
21854
- config: DecoderSessionConfigSchema.partial()
21855
- }), external_exports.void()),
21856
- getStats: method(external_exports.object({ sessionId: external_exports.string() }), DecoderStatsSchema),
21857
- listActiveSessions: method(external_exports.void(), external_exports.array(external_exports.object({
21858
- sessionId: external_exports.string(),
21859
- codec: external_exports.string(),
21860
- outputFormat: external_exports.string(),
21861
- createdAtMs: external_exports.number()
21862
- })).readonly()),
21863
21934
  /**
21864
21935
  * Re-run the host platform-probe for the decoder's hwaccel backend
21865
21936
  * and write the detected value into the addon's own global
@@ -22569,6 +22640,10 @@ var DeviceInfoSchema = external_exports.object({
22569
22640
  isCamera: external_exports.boolean(),
22570
22641
  /** Current config values — serializable snapshot */
22571
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(),
22572
22647
  /** Hardware + identity blob (manufacturer / model / firmware / sn /
22573
22648
  * uid / mac / …). Populated by drivers; editable via setMetadata. */
22574
22649
  metadata: external_exports.record(external_exports.string(), external_exports.unknown()).nullable().optional(),
@@ -22733,12 +22808,22 @@ var DeviceRegisterPayloadSchema = external_exports.object({
22733
22808
  * call (workers re-register on init), so probe-driven updates
22734
22809
  * (e.g. PTZ flag flipping after the abilities probe) propagate. */
22735
22810
  features: external_exports.array(external_exports.string()).optional(),
22736
- 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()
22737
22818
  });
22738
22819
  var DeviceRemovePayloadSchema = external_exports.object({ deviceId: external_exports.number() });
22739
22820
  var DevicePersistConfigPayloadSchema = external_exports.object({
22740
22821
  deviceId: external_exports.number(),
22741
- 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()
22742
22827
  });
22743
22828
  var MigrateSwitchOutcomeSchema = external_exports.enum([
22744
22829
  "off",
@@ -24219,6 +24304,12 @@ var filesystemBrowseCapability = {
24219
24304
  })
24220
24305
  }
24221
24306
  };
24307
+ var HUB_ADDRESS_ROLES = [
24308
+ "appConnections",
24309
+ "notificationTaps",
24310
+ "internal",
24311
+ "publicEndpoint"
24312
+ ];
24222
24313
  var AI_CAP_TRANSPORT_TIMEOUT_MS = 6e5;
24223
24314
  var AI_MODEL_INSTALL_TIMEOUT_MS = 60 * 6e4;
24224
24315
  var LlmUsageSchema = external_exports.object({
@@ -24970,7 +25061,14 @@ var RedirectLoginMethodSchema = external_exports.object({
24970
25061
  icon: external_exports.string().optional(),
24971
25062
  /** Addon-owned HTTP route the button navigates to (GET). */
24972
25063
  startUrl: external_exports.string(),
24973
- 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()
24974
25072
  });
24975
25073
  var WidgetLoginMethodSchema = external_exports.object({
24976
25074
  kind: external_exports.literal("widget"),
@@ -25897,6 +25995,52 @@ var notificationOutputCapability = {
25897
25995
  })
25898
25996
  }
25899
25997
  };
25998
+ var MACRO_LABELS = [
25999
+ {
26000
+ id: "person",
26001
+ name: "Person"
26002
+ },
26003
+ {
26004
+ id: "vehicle",
26005
+ name: "Vehicle"
26006
+ },
26007
+ {
26008
+ id: "animal",
26009
+ name: "Animal"
26010
+ },
26011
+ {
26012
+ id: "package",
26013
+ name: "Package"
26014
+ }
26015
+ ];
26016
+ var DETECTION_MACRO_CLASSES = new Set(MACRO_LABELS.map((l) => l.id));
26017
+ var COCO_TO_MACRO = {
26018
+ mapping: {
26019
+ person: "person",
26020
+ bicycle: "vehicle",
26021
+ car: "vehicle",
26022
+ motorcycle: "vehicle",
26023
+ airplane: "vehicle",
26024
+ bus: "vehicle",
26025
+ train: "vehicle",
26026
+ truck: "vehicle",
26027
+ boat: "vehicle",
26028
+ bird: "animal",
26029
+ cat: "animal",
26030
+ dog: "animal",
26031
+ horse: "animal",
26032
+ sheep: "animal",
26033
+ cow: "animal",
26034
+ elephant: "animal",
26035
+ bear: "animal",
26036
+ zebra: "animal",
26037
+ giraffe: "animal",
26038
+ suitcase: "package",
26039
+ backpack: "package",
26040
+ handbag: "package"
26041
+ },
26042
+ preserveOriginal: false
26043
+ };
25900
26044
  var AUDIO_MACRO_LABELS = [
25901
26045
  {
25902
26046
  id: "speech",
@@ -26555,6 +26699,8 @@ var NcSystemEventKindSchema = external_exports.enum([
26555
26699
  "stream-offline",
26556
26700
  "node-online",
26557
26701
  "node-offline",
26702
+ "node-restarting",
26703
+ "node-updating",
26558
26704
  "node-inference-unavailable",
26559
26705
  "detection-blind",
26560
26706
  "addon-crash-loop",
@@ -27735,7 +27881,13 @@ var NcAlarmModeDelaysSchema = external_exports.object({
27735
27881
  * Absent = false (logged, not sent). Even when true it is not sent when that same sensor
27736
27882
  * is the one that starts the entry delay — the entry-delay notification already names it.
27737
27883
  */
27738
- 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()
27739
27891
  });
27740
27892
  var NcAlarmModeDelaysListSchema = external_exports.array(NcAlarmModeDelaysSchema).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
27741
27893
  var NcAlarmModeDelaysEditSchema = external_exports.object({
@@ -27749,7 +27901,9 @@ var NcAlarmModeDelaysEditSchema = external_exports.object({
27749
27901
  /** D706: set the switch, or `null` to clear it (back to the default, false). */
27750
27902
  notifyDuringEntryDelay: external_exports.boolean().nullable().optional(),
27751
27903
  /** D706: set the switch, or `null` to clear it (back to the default, false). */
27752
- 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()
27753
27907
  });
27754
27908
  var NcAlarmModeDelaysEditListSchema = external_exports.array(NcAlarmModeDelaysEditSchema).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
27755
27909
  var NcAlarmNonBlockingEditSchema = external_exports.object({
@@ -28607,8 +28761,8 @@ var DEFAULT_CLUSTER_STEP_MODELS = Object.freeze(Object.fromEntries(CLUSTER_MODEL
28607
28761
  var CLUSTER_STEP_SETTING_FIELDS = [{
28608
28762
  stepId: "face-embedding",
28609
28763
  key: "minLandmarkFaceSize",
28610
- label: "Min face size for recognition (detection px)",
28611
- 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.",
28612
28766
  type: "slider",
28613
28767
  min: 0,
28614
28768
  max: 64,
@@ -29298,7 +29452,12 @@ var RetrainMacroClassSchema = external_exports.enum([
29298
29452
  "plate"
29299
29453
  ]);
29300
29454
  var RetrainAnnotationKindSchema = external_exports.enum(["subject", "model_error"]);
29301
- var RetrainAnnotationSourceSchema = external_exports.enum(["operator", "assist"]);
29455
+ var RetrainAnnotationSourceSchema = external_exports.enum([
29456
+ "operator",
29457
+ "assist",
29458
+ "pipeline",
29459
+ "llm"
29460
+ ]);
29302
29461
  var RetrainBboxSchema = external_exports.object({
29303
29462
  x: external_exports.number(),
29304
29463
  y: external_exports.number(),
@@ -29307,7 +29466,8 @@ var RetrainBboxSchema = external_exports.object({
29307
29466
  });
29308
29467
  var RetrainAnnotationSchema = external_exports.object({
29309
29468
  id: external_exports.string(),
29310
- trackId: external_exports.string(),
29469
+ /** The frame's track. Absent on a recording still, which has none. */
29470
+ trackId: external_exports.string().optional(),
29311
29471
  deviceId: external_exports.number(),
29312
29472
  /** The COPY in retrain storage — never the source track's media key. */
29313
29473
  mediaKey: external_exports.string(),
@@ -29353,17 +29513,50 @@ var RetrainFrameCandidateSchema = external_exports.object({
29353
29513
  * fail, whatever became of the original. */
29354
29514
  copied: external_exports.boolean()
29355
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"]);
29356
29533
  var RetrainFrameSchema = external_exports.object({
29357
29534
  frameId: external_exports.string(),
29358
29535
  deviceId: external_exports.number(),
29359
- trackId: external_exports.string(),
29360
- /** Provenance only. It may already point at nothing — that is expected. */
29361
- 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(),
29362
29544
  sourceKind: MediaFileKindEnum,
29363
29545
  sizeBytes: external_exports.number().int(),
29364
29546
  width: external_exports.number().int(),
29365
29547
  height: external_exports.number().int(),
29366
- 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()
29367
29560
  });
29368
29561
  var RetrainCopyRefusalSchema = external_exports.enum([
29369
29562
  "source-missing",
@@ -29383,6 +29576,38 @@ var RetrainFrameListSchema = external_exports.object({
29383
29576
  /** What the page pre-selects — the native key frame when one survives. */
29384
29577
  autoPickMediaId: external_exports.number().int().optional()
29385
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
+ });
29386
29611
  var RetrainAssistSubjectSchema = external_exports.discriminatedUnion("kind", [external_exports.object({
29387
29612
  kind: external_exports.literal("package"),
29388
29613
  zone: RetrainBboxSchema.optional()
@@ -29406,6 +29631,151 @@ var RetrainAssistResultSchema = external_exports.discriminatedUnion("kind", [ext
29406
29631
  reason: external_exports.string(),
29407
29632
  detail: external_exports.string().optional()
29408
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
+ })]);
29409
29779
  var RetrainTransitionResultSchema = external_exports.object({
29410
29780
  trackId: external_exports.string(),
29411
29781
  /** Where the track ended up, whatever happened. */
@@ -30467,7 +30837,7 @@ var pipelineAnalyticsCapability = {
30467
30837
  * a frame leaves the dataset before export. */
30468
30838
  deselectRetrainFrame: method(external_exports.object({
30469
30839
  deviceId: external_exports.number(),
30470
- trackId: external_exports.string(),
30840
+ trackId: external_exports.string().optional(),
30471
30841
  frameId: external_exports.string()
30472
30842
  }), external_exports.object({
30473
30843
  removed: external_exports.boolean(),
@@ -30510,7 +30880,8 @@ var pipelineAnalyticsCapability = {
30510
30880
  */
30511
30881
  proposeRetrainAnnotations: method(external_exports.object({
30512
30882
  deviceId: external_exports.number(),
30513
- trackId: external_exports.string(),
30883
+ /** The frame's track, when it has one — checked against the frame. */
30884
+ trackId: external_exports.string().optional(),
30514
30885
  frameId: external_exports.string(),
30515
30886
  subject: RetrainAssistSubjectSchema,
30516
30887
  /** Which node runs it. Absent ⇒ wherever an unowned call lands. */
@@ -30519,8 +30890,12 @@ var pipelineAnalyticsCapability = {
30519
30890
  kind: "mutation",
30520
30891
  auth: "admin"
30521
30892
  }),
30522
- /** Every annotation on a track, oldest first. */
30523
- 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(), {
30524
30899
  kind: "query",
30525
30900
  auth: "admin"
30526
30901
  }),
@@ -30539,7 +30914,8 @@ var pipelineAnalyticsCapability = {
30539
30914
  */
30540
30915
  saveRetrainAnnotations: method(external_exports.object({
30541
30916
  deviceId: external_exports.number(),
30542
- trackId: external_exports.string(),
30917
+ /** The frame's track, when it has one — checked against the frame. */
30918
+ trackId: external_exports.string().optional(),
30543
30919
  frameId: external_exports.string(),
30544
30920
  annotations: external_exports.array(RetrainAnnotationDraftSchema)
30545
30921
  }), external_exports.array(RetrainAnnotationSchema).readonly(), {
@@ -30591,7 +30967,193 @@ var pipelineAnalyticsCapability = {
30591
30967
  * out, so two crops of the same subject can never end up in one feature
30592
30968
  * space (D52).
30593
30969
  */
30594
- 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(), {
30595
31157
  kind: "query",
30596
31158
  auth: "admin"
30597
31159
  }),
@@ -30758,6 +31320,30 @@ var pipelineAnalyticsCapability = {
30758
31320
  }) }
30759
31321
  }
30760
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
+ });
30761
31347
  var NativeCropRefSchema = external_exports.object({
30762
31348
  /** Handle keying the retained native surface (node-pinned to its owner). */
30763
31349
  handle: FrameHandleSchema,
@@ -30796,7 +31382,7 @@ var FrameRefSchema = external_exports.object({
30796
31382
  timestamp: external_exports.number(),
30797
31383
  capturedAt: external_exports.number().optional()
30798
31384
  });
30799
- var ModelFormatSchema$1 = external_exports.enum([
31385
+ var ModelFormatSchema$2 = external_exports.enum([
30800
31386
  "onnx",
30801
31387
  "coreml",
30802
31388
  "openvino",
@@ -30814,7 +31400,7 @@ var PipelineSlotSchema = external_exports.enum([
30814
31400
  var PipelineEngineChoiceSchema = external_exports.object({
30815
31401
  runtime: external_exports.literal("python"),
30816
31402
  backend: external_exports.string(),
30817
- format: ModelFormatSchema$1,
31403
+ format: ModelFormatSchema$2,
30818
31404
  device: external_exports.string().optional()
30819
31405
  });
30820
31406
  var EffectiveTuningSchema = external_exports.object({
@@ -30848,33 +31434,15 @@ var PipelineDefaultStepSchema = external_exports.lazy(() => external_exports.obj
30848
31434
  group: external_exports.string().optional(),
30849
31435
  settings: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
30850
31436
  }));
30851
- var PipelineTemplateStepSchema = external_exports.lazy(() => external_exports.object({
30852
- addonId: external_exports.string(),
30853
- enabled: external_exports.boolean(),
30854
- modelId: external_exports.string(),
30855
- children: external_exports.array(PipelineTemplateStepSchema).readonly(),
30856
- settings: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
30857
- }));
30858
- var PipelineTemplateSchema$1 = external_exports.object({
30859
- id: external_exports.string(),
30860
- name: external_exports.string(),
30861
- createdAt: external_exports.string(),
30862
- updatedAt: external_exports.string(),
30863
- engine: PipelineEngineChoiceSchema,
30864
- steps: external_exports.array(PipelineTemplateStepSchema).readonly()
30865
- });
30866
31437
  var PipelineModelOptionSchema = external_exports.object({
30867
31438
  id: external_exports.string(),
30868
31439
  name: external_exports.string(),
30869
- formats: external_exports.record(external_exports.string(), external_exports.object({
30870
- downloaded: external_exports.boolean(),
30871
- sizeMB: external_exports.number()
30872
- })),
31440
+ formats: external_exports.record(external_exports.string(), PipelineModelFormatStatusSchema),
30873
31441
  group: ModelVariantGroupSchema.optional(),
30874
31442
  legacy: external_exports.boolean().optional(),
30875
31443
  provider: ModelProviderIdSchema.optional(),
30876
31444
  defaultConfidence: external_exports.number().optional(),
30877
- fillsClassifierEffects: external_exports.array(FillsClassifierEffectSchema).readonly().optional()
31445
+ suppliesSteps: external_exports.array(RootStepSupplySchema).readonly().optional()
30878
31446
  });
30879
31447
  var ConfigFieldBridge = external_exports.custom();
30880
31448
  var PipelineAddonSchemaSchema = external_exports.object({
@@ -31062,6 +31630,32 @@ var pipelineExecutorCapability = {
31062
31630
  auth: "admin"
31063
31631
  }),
31064
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
+ /**
31065
31659
  * Which of THIS node's inference devices the executor currently refuses,
31066
31660
  * and why. `nodeId` is the ROUTING key (stripped by the generated router).
31067
31661
  *
@@ -31139,29 +31733,17 @@ var pipelineExecutorCapability = {
31139
31733
  steps: external_exports.array(PipelineStepInputSchema),
31140
31734
  deviceKey: external_exports.string().optional()
31141
31735
  }), PipelineValidationResultSchema),
31142
- listTemplates: method(external_exports.void(), external_exports.array(PipelineTemplateSchema$1).readonly()),
31143
- saveTemplate: method(external_exports.object({
31144
- name: external_exports.string(),
31145
- steps: external_exports.array(PipelineTemplateStepSchema).readonly(),
31146
- engine: PipelineEngineChoiceSchema
31147
- }), PipelineTemplateSchema$1, { kind: "mutation" }),
31148
- updateTemplate: method(external_exports.object({
31149
- id: external_exports.string(),
31150
- name: external_exports.string().optional(),
31151
- steps: external_exports.array(PipelineTemplateStepSchema).readonly().optional()
31152
- }), PipelineTemplateSchema$1, { kind: "mutation" }),
31153
- deleteTemplate: method(external_exports.object({ id: external_exports.string() }), external_exports.void(), { kind: "mutation" }),
31154
31736
  getCapabilities: method(external_exports.void(), InferenceCapabilitiesBridge),
31155
31737
  getAddonModels: method(external_exports.object({ addonId: external_exports.string() }), ModelAvailabilityListBridge),
31156
31738
  downloadModel: method(external_exports.object({
31157
31739
  addonId: external_exports.string(),
31158
31740
  modelId: external_exports.string(),
31159
- format: ModelFormatSchema$1
31741
+ format: ModelFormatSchema$2
31160
31742
  }), DownloadModelResultSchema, { kind: "mutation" }),
31161
31743
  deleteModel: method(external_exports.object({
31162
31744
  addonId: external_exports.string(),
31163
31745
  modelId: external_exports.string(),
31164
- format: ModelFormatSchema$1
31746
+ format: ModelFormatSchema$2
31165
31747
  }), external_exports.object({ success: external_exports.literal(true) }), { kind: "mutation" }),
31166
31748
  /**
31167
31749
  * Stateless single-frame execution. Callers (runner, benchmark) pass
@@ -31256,7 +31838,16 @@ var pipelineExecutorCapability = {
31256
31838
  * `device-not-servable`), and nothing reaches the camera's live
31257
31839
  * trace stream. Absent ⇒ unchanged behaviour.
31258
31840
  */
31259
- 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()
31260
31851
  }), PipelineRunResultBridge, { kind: "mutation" }),
31261
31852
  /**
31262
31853
  * Batched run — N raw frames packed into one cap call. The provider
@@ -31398,6 +31989,677 @@ var pipelineExecutorCapability = {
31398
31989
  getDetectionConfigSchema: method(external_exports.void(), ConfigUISchemaNullableBridge)
31399
31990
  }
31400
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
+ });
31401
32663
  var OrchestratorMetricsSchema = external_exports.object({
31402
32664
  activeCameras: external_exports.number(),
31403
32665
  throttledCameras: external_exports.number(),
@@ -32209,14 +33471,15 @@ var RunnerLocalLoadSchema = external_exports.object({
32209
33471
  * Per-inference-device live load (multi-device C4). One entry per deviceKey
32210
33472
  * this runner currently has attached cameras on, so the orchestrator's second
32211
33473
  * `balance()` pass (over a node's devices) weights on real per-pool session
32212
- * counts. Empty on single-device / pre-multi-device runners. `queueDepthTotal`
32213
- * 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).
32214
33478
  */
32215
33479
  devices: external_exports.array(external_exports.object({
32216
33480
  deviceKey: external_exports.string(),
32217
33481
  backend: external_exports.string(),
32218
- attachedCameras: external_exports.number(),
32219
- queueDepthTotal: external_exports.number()
33482
+ attachedCameras: external_exports.number()
32220
33483
  })).default([]),
32221
33484
  /** Hardware capability flags reported by this node. */
32222
33485
  hardware: external_exports.object({
@@ -32438,7 +33701,22 @@ var pipelineRunnerCapability = {
32438
33701
  */
32439
33702
  cropJpeg: external_exports.string().optional(),
32440
33703
  parent: DetailParentSchema,
32441
- 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()
32442
33720
  }), external_exports.object({ details: external_exports.array(DetailResultSchema) }).nullable(), { kind: "mutation" }),
32443
33721
  /**
32444
33722
  * Run ONE enrichment step against caller-supplied pixels, with NO camera
@@ -32569,7 +33847,30 @@ var pipelineRunnerCapability = {
32569
33847
  releaseParkedTrackFrames: method(external_exports.object({
32570
33848
  deviceId: external_exports.number(),
32571
33849
  trackId: external_exports.string()
32572
- }), 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
+ })
32573
33874
  }
32574
33875
  };
32575
33876
  var CameraPipelineConfigSchema = external_exports.object({
@@ -32582,14 +33883,6 @@ var CameraPipelineConfigSchema = external_exports.object({
32582
33883
  settings: external_exports.record(external_exports.string(), external_exports.unknown()).readonly().optional()
32583
33884
  }).nullable().optional()
32584
33885
  });
32585
- var PipelineTemplateSchema = external_exports.object({
32586
- id: external_exports.string(),
32587
- name: external_exports.string(),
32588
- description: external_exports.string().optional(),
32589
- config: CameraPipelineConfigSchema,
32590
- createdAt: external_exports.string(),
32591
- updatedAt: external_exports.string()
32592
- });
32593
33886
  var DeviceStepConfigSchema = external_exports.object({
32594
33887
  modelId: external_exports.string().optional(),
32595
33888
  settings: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
@@ -32663,9 +33956,10 @@ var CameraStepOverridePatchSchema = external_exports.object({
32663
33956
  modelId: external_exports.string().optional(),
32664
33957
  settings: external_exports.record(external_exports.string(), external_exports.unknown()).readonly().optional()
32665
33958
  });
33959
+ var CameraStepSettingsSchema = external_exports.record(external_exports.string(), external_exports.record(external_exports.string(), external_exports.unknown()).readonly());
32666
33960
  var CameraPipelineSettingsSchema = external_exports.object({
32667
- pinnedAgentNodeId: external_exports.string().optional(),
32668
33961
  stepToggles: external_exports.record(external_exports.string(), external_exports.boolean()).optional(),
33962
+ stepSettings: CameraStepSettingsSchema.optional(),
32669
33963
  stepOverridesByDevice: external_exports.record(external_exports.string(), external_exports.record(external_exports.string(), external_exports.record(external_exports.string(), CameraStepOverridePatchSchema))).optional(),
32670
33964
  pipelineByAgent: external_exports.record(external_exports.string(), CameraPipelineForAgentSchema).optional()
32671
33965
  });
@@ -32752,26 +34046,21 @@ var CameraBrokerProfileSchema = external_exports.object({
32752
34046
  width: external_exports.number(),
32753
34047
  height: external_exports.number(),
32754
34048
  subscribers: external_exports.number(),
32755
- inFps: external_exports.number(),
32756
- 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()
32757
34057
  });
32758
34058
  var CameraBrokerStatusSchema = external_exports.object({
32759
34059
  profiles: external_exports.array(CameraBrokerProfileSchema).readonly(),
32760
34060
  webrtcSessions: external_exports.number(),
32761
34061
  rtspRestream: external_exports.boolean()
32762
34062
  });
32763
- var CameraDecoderShmSchema = external_exports.object({
32764
- framesWritten: external_exports.number(),
32765
- getFrameHits: external_exports.number(),
32766
- getFrameMisses: external_exports.number(),
32767
- budgetMb: external_exports.number()
32768
- });
32769
- var CameraDecoderStatusSchema = external_exports.object({
32770
- nodeId: external_exports.string(),
32771
- formats: external_exports.array(external_exports.string()).readonly(),
32772
- sessionCount: external_exports.number(),
32773
- shm: CameraDecoderShmSchema
32774
- });
34063
+ var CameraDecoderStatusSchema = external_exports.object({ nodeId: external_exports.string() });
32775
34064
  var CameraMotionStatusSchema = external_exports.object({
32776
34065
  enabled: external_exports.boolean(),
32777
34066
  fps: external_exports.number()
@@ -33231,18 +34520,6 @@ var pipelineOrchestratorCapability = {
33231
34520
  auth: "admin"
33232
34521
  }),
33233
34522
  /**
33234
- * Set a node's detection WEIGHT (relative share for the quota balancer).
33235
- * `null` clears it (back to the implicit weight 1). Unpinned cameras
33236
- * distribute proportionally to weight; `maxCameras` still clamps on top.
33237
- */
33238
- setAgentDetectWeight: method(external_exports.object({
33239
- agentNodeId: external_exports.string(),
33240
- detectWeight: external_exports.number().positive().nullable()
33241
- }), external_exports.object({ success: external_exports.literal(true) }), {
33242
- kind: "mutation",
33243
- auth: "admin"
33244
- }),
33245
- /**
33246
34523
  * Set one node's placement CAPABILITIES — the per-node record that
33247
34524
  * replaced the four flat orchestrator lists (`enabledNodes`,
33248
34525
  * `enabledDecoderNodes`, `enabledAudioNodes`, `remoteSourcingNodes`).
@@ -33361,6 +34638,121 @@ var pipelineOrchestratorCapability = {
33361
34638
  kind: "mutation",
33362
34639
  auth: "admin"
33363
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
+ }),
33364
34756
  /** Read one camera's settings. Null when never touched (inherits agent defaults fully). */
33365
34757
  getCameraSettings: method(external_exports.object({ deviceId: external_exports.number() }), CameraPipelineSettingsSchema.nullable()),
33366
34758
  /** Set or clear the 3-state toggle for one (camera, addonId). Pass `enabled: null` to clear and revert to agent default. */
@@ -33390,6 +34782,22 @@ var pipelineOrchestratorCapability = {
33390
34782
  kind: "mutation",
33391
34783
  auth: "admin"
33392
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
+ }),
33393
34801
  /** Write or clear the wholesale per-agent pipeline override. Pass `pipeline: null` to drop the override. */
33394
34802
  setCameraPipelineForAgent: method(external_exports.object({
33395
34803
  deviceId: external_exports.number(),
@@ -33505,33 +34913,7 @@ var pipelineOrchestratorCapability = {
33505
34913
  auth: "admin"
33506
34914
  }),
33507
34915
  /** Snapshot of the in-flight or last disk-wins fleet reconcile. */
33508
- getReconcileFromDiskStatus: method(external_exports.void(), DiskReconcileJobSchema, { auth: "admin" }),
33509
- /** List every template the operator has saved. */
33510
- listTemplates: method(external_exports.void(), external_exports.array(PipelineTemplateSchema).readonly()),
33511
- /** Create a new named preset from a given CameraPipelineConfig. */
33512
- saveTemplate: method(external_exports.object({
33513
- name: external_exports.string(),
33514
- description: external_exports.string().optional(),
33515
- config: CameraPipelineConfigSchema
33516
- }), PipelineTemplateSchema, {
33517
- kind: "mutation",
33518
- auth: "admin"
33519
- }),
33520
- /** Partial update of a template. Any omitted field is preserved. */
33521
- updateTemplate: method(external_exports.object({
33522
- id: external_exports.string(),
33523
- name: external_exports.string().optional(),
33524
- description: external_exports.string().optional(),
33525
- config: CameraPipelineConfigSchema.optional()
33526
- }), PipelineTemplateSchema, {
33527
- kind: "mutation",
33528
- auth: "admin"
33529
- }),
33530
- /** Remove a template. Camera configs that were seeded from it keep a copy. */
33531
- deleteTemplate: method(external_exports.object({ id: external_exports.string() }), external_exports.object({ success: external_exports.literal(true) }), {
33532
- kind: "mutation",
33533
- auth: "admin"
33534
- })
34916
+ getReconcileFromDiskStatus: method(external_exports.void(), DiskReconcileJobSchema, { auth: "admin" })
33535
34917
  }
33536
34918
  };
33537
34919
  var LEGACY_ICON = {
@@ -34116,7 +35498,19 @@ var SsoBridgeClaimsSchema = external_exports.object({
34116
35498
  * editing a descriptor must not retroactively extend or shorten a link the
34117
35499
  * operator already consented to.
34118
35500
  */
34119
- 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()
34120
35514
  });
34121
35515
  var ssoBridgeCapability = {
34122
35516
  name: "sso-bridge",
@@ -35841,8 +37235,6 @@ var WebrtcStreamChoiceSchema = external_exports.object({
35841
37235
  ]).nullable(),
35842
37236
  /** Input FPS from the camera (null for adaptive). */
35843
37237
  inputFps: external_exports.number().nullable(),
35844
- /** Decoded FPS (null for adaptive). */
35845
- decodeFps: external_exports.number().nullable(),
35846
37238
  /** Bitrate in kbps (null for adaptive). */
35847
37239
  bitrateKbps: external_exports.number().nullable()
35848
37240
  });
@@ -36143,7 +37535,22 @@ var webrtcSessionCapability = {
36143
37535
  * field their hints were silently stripped by the schema and the
36144
37536
  * adaptive ladder started blind on the client's display size.
36145
37537
  */
36146
- 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()
36147
37554
  }), external_exports.object({
36148
37555
  sessionId: external_exports.string(),
36149
37556
  sdpAnswer: external_exports.string()
@@ -36223,6 +37630,35 @@ var webrtcSessionCapability = {
36223
37630
  alive: external_exports.boolean()
36224
37631
  })),
36225
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
+ /**
36226
37662
  * The SERVER's half of the stream-debug overlay, for one live session.
36227
37663
  *
36228
37664
  * The client can measure its own transport (`getStats()`); it cannot see
@@ -36508,6 +37944,46 @@ var AddonAutoUpdateSchema = ChannelWithInheritSchema;
36508
37944
  var RestartAddonResultSchema = external_exports.unknown();
36509
37945
  var InstallPackageResultSchema = external_exports.unknown();
36510
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
+ });
36511
37987
  var BulkUpdateItemStatusSchema = external_exports.enum([
36512
37988
  "queued",
36513
37989
  "updating",
@@ -36598,10 +38074,31 @@ var addonsCapability = {
36598
38074
  }),
36599
38075
  isWorkspaceAvailable: method(external_exports.void(), external_exports.boolean()),
36600
38076
  listWorkspacePackages: method(external_exports.void(), external_exports.array(external_exports.unknown()).readonly()),
36601
- 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, {
36602
38092
  kind: "mutation",
36603
38093
  auth: "admin"
36604
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" }),
36605
38102
  reloadPackages: method(external_exports.void(), ReloadPackagesResultSchema, {
36606
38103
  kind: "mutation",
36607
38104
  auth: "admin"
@@ -39322,6 +40819,9 @@ var CreateIntegrationInputSchema = external_exports.object({
39322
40819
  enabled: external_exports.boolean().optional(),
39323
40820
  info: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
39324
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(),
39325
40825
  skipRestart: external_exports.boolean().optional()
39326
40826
  });
39327
40827
  var UpdateIntegrationInputSchema = external_exports.object({
@@ -39357,7 +40857,9 @@ var integrationsCapability = {
39357
40857
  getSettings: method(external_exports.object({ id: external_exports.string() }), external_exports.record(external_exports.string(), external_exports.unknown()), { auth: "admin" }),
39358
40858
  setSettings: method(external_exports.object({
39359
40859
  id: external_exports.string(),
39360
- 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()
39361
40863
  }), external_exports.object({ success: external_exports.boolean() }), {
39362
40864
  kind: "mutation",
39363
40865
  auth: "admin"
@@ -39689,7 +41191,8 @@ var ConnectionEndpointSchema = external_exports.object({
39689
41191
  "lan-ipv6",
39690
41192
  "public",
39691
41193
  "loopback",
39692
- "app-link"
41194
+ "app-link",
41195
+ "custom"
39693
41196
  ]),
39694
41197
  /**
39695
41198
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -39775,6 +41278,62 @@ var ViewerEndpointsSchema = external_exports.object({
39775
41278
  /** What the ranking currently resolves to (may be empty if nothing is up). */
39776
41279
  resolved: external_exports.array(external_exports.string()).readonly()
39777
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
+ });
39778
41337
  var AllowedAddressesSchema = external_exports.object({
39779
41338
  /**
39780
41339
  * Allowlist of interface addresses operators have explicitly opted
@@ -39866,19 +41425,18 @@ var localNetworkCapability = {
39866
41425
  * tunnel always emits `https://` regardless. */
39867
41426
  scheme: external_exports.enum(["http", "https"]).optional(),
39868
41427
  /** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
39869
- * an address notification links can be flagged with, not a hub
41428
+ * an address notification taps can be flagged with, not a hub
39870
41429
  * route. Default `false`: racers and rankers never see it. */
39871
41430
  includeAppLink: external_exports.boolean().optional()
39872
41431
  }), GetConnectionEndpointsResultSchema),
39873
41432
  /**
39874
- * The address notification links are flagged with. `baseUrl: null` means
39875
- * AUTO, which is the CamStack app link (D709): viewer taps go through
39876
- * `https://camstack.zentik.app/…?hub=<appLinkHub>` and open the app. Any
39877
- * hub address the palette lists can be flagged instead; then viewer taps,
39878
- * attachment links and action buttons all use it. Signed media and
39879
- * buttons never use the app link — with it flagged (or AUTO) they keep
39880
- * the ranked hub ladder (a configured origin, a connected tunnel, then
39881
- * 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.
39882
41440
  *
39883
41441
  * Why an explicit marker: the automatic ranking cannot know which of
39884
41442
  * several reachable addresses the RECIPIENT can actually open. A link is
@@ -39888,26 +41446,80 @@ var localNetworkCapability = {
39888
41446
  */
39889
41447
  getNotificationEndpoint: method(external_exports.void(), NotificationEndpointSchema),
39890
41448
  /**
39891
- * Mark which endpoint notification artifacts use. `baseUrl: null` restores
39892
- * AUTO. The value is stored verbatim (not an index into the candidate
39893
- * list): interfaces come and go, and an index would silently re-point at a
39894
- * 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.
39895
41452
  */
39896
41453
  setNotificationEndpoint: method(external_exports.object({ baseUrl: external_exports.string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }),
39897
41454
  /**
39898
- * The endpoints the SDK / viewer races for API access. Empty `baseUrls`
39899
- * means AUTO: every LAN IPv4 address plus the public tunnel, never IPv6,
39900
- * never mesh, never loopback. `resolved` is that set (or the operator's
39901
- * 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.
39902
41460
  */
39903
41461
  getViewerEndpoints: method(external_exports.void(), ViewerEndpointsSchema),
39904
41462
  /**
39905
- * Replace the viewer race set. Empty `baseUrls` restores AUTO. Stored
39906
- * verbatim (not indices) so a temporarily-down tunnel is not silently
39907
- * dropped from the operator's choice.
41463
+ * @deprecated Use `setAddressRole({ role: 'appConnections', … })`. It
41464
+ * replaces the same `appConnections` flags.
41465
+ * Empty `baseUrls` restores automatic.
39908
41466
  */
39909
41467
  setViewerEndpoints: method(external_exports.object({ baseUrls: external_exports.array(external_exports.string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }),
39910
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
+ /**
39911
41523
  * Read the operator's allowlist. Empty = "auto" (no filter). Used
39912
41524
  * by the admin UI's address selector to seed its checkbox state.
39913
41525
  */
@@ -40426,7 +42038,8 @@ var MotionStatusSchema = external_exports.object({
40426
42038
  * writes this slice (not even a boot seed), and neither does the runner's
40427
42039
  * phase machine: its phase is "a session is attached" for every on-motion
40428
42040
  * session, not motion, and it now has its own `DetectionPhaseTransition`.
40429
- * 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`).
40430
42043
  * - **Sensors** (Home Assistant binary sensors, Homematic, Matter, Alexa
40431
42044
  * imports) — the provider pushes both edges itself, from the upstream
40432
42045
  * system's own state change. That is the sensor's own fact.
@@ -45494,6 +47107,22 @@ var TotpStatusSchema = external_exports.object({
45494
47107
  /** Null when no row exists OR the row is still pending confirmation. */
45495
47108
  confirmedAt: external_exports.number().nullable()
45496
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
+ });
45497
47126
  var userManagementCapability = {
45498
47127
  name: "user-management",
45499
47128
  scope: "system",
@@ -45636,6 +47265,32 @@ var userManagementCapability = {
45636
47265
  username: external_exports.string(),
45637
47266
  scopes: external_exports.array(TokenScopeSchema)
45638
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
+ }),
45639
47294
  listOauthSessions: method(external_exports.void(), external_exports.array(OauthSessionSummarySchema), { auth: "admin" }),
45640
47295
  revokeOauthSession: method(external_exports.object({ id: external_exports.string() }), external_exports.object({ success: external_exports.boolean() }), {
45641
47296
  kind: "mutation",
@@ -46401,6 +48056,16 @@ var UNIT_TABLE = {
46401
48056
  }
46402
48057
  };
46403
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
+ });
46404
48069
  var HF_REPO = "camstack/camstack-models";
46405
48070
  var HF_BASE_URL = `https://huggingface.co/${HF_REPO}/resolve/main`;
46406
48071
  var AccessoryKind = {
@@ -46591,6 +48256,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
46591
48256
  addonId: null,
46592
48257
  access: "view"
46593
48258
  },
48259
+ "addons.listInstallations": {
48260
+ capName: "addons",
48261
+ capScope: "system",
48262
+ addonId: null,
48263
+ access: "view"
48264
+ },
46594
48265
  "addons.listJobs": {
46595
48266
  capName: "addons",
46596
48267
  capScope: "system",
@@ -47773,90 +49444,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
47773
49444
  addonId: null,
47774
49445
  access: "create"
47775
49446
  },
47776
- "decoder.createSession": {
47777
- capName: "decoder",
47778
- capScope: "system",
47779
- addonId: null,
47780
- access: "view"
47781
- },
47782
- "decoder.destroySession": {
47783
- capName: "decoder",
47784
- capScope: "system",
47785
- addonId: null,
47786
- access: "delete"
47787
- },
47788
- "decoder.getFrame": {
47789
- capName: "decoder",
47790
- capScope: "system",
47791
- addonId: null,
47792
- access: "view"
47793
- },
47794
49447
  "decoder.getInfo": {
47795
49448
  capName: "decoder",
47796
49449
  capScope: "system",
47797
49450
  addonId: null,
47798
49451
  access: "view"
47799
49452
  },
47800
- "decoder.getShmStats": {
47801
- capName: "decoder",
47802
- capScope: "system",
47803
- addonId: null,
47804
- access: "view"
47805
- },
47806
- "decoder.getStats": {
47807
- capName: "decoder",
47808
- capScope: "system",
47809
- addonId: null,
47810
- access: "view"
47811
- },
47812
- "decoder.listActiveSessions": {
47813
- capName: "decoder",
47814
- capScope: "system",
47815
- addonId: null,
47816
- access: "view"
47817
- },
47818
- "decoder.openStream": {
47819
- capName: "decoder",
47820
- capScope: "system",
47821
- addonId: null,
47822
- access: "view"
47823
- },
47824
- "decoder.pullFrames": {
47825
- capName: "decoder",
47826
- capScope: "system",
47827
- addonId: null,
47828
- access: "view"
47829
- },
47830
- "decoder.pullHandles": {
47831
- capName: "decoder",
47832
- capScope: "system",
47833
- addonId: null,
47834
- access: "view"
47835
- },
47836
- "decoder.pushPacket": {
47837
- capName: "decoder",
47838
- capScope: "system",
47839
- addonId: null,
47840
- access: "view"
47841
- },
47842
49453
  "decoder.reprobeHwaccel": {
47843
49454
  capName: "decoder",
47844
49455
  capScope: "system",
47845
49456
  addonId: null,
47846
49457
  access: "create"
47847
49458
  },
47848
- "decoder.supportsCodec": {
47849
- capName: "decoder",
47850
- capScope: "system",
47851
- addonId: null,
47852
- access: "view"
47853
- },
47854
- "decoder.updateConfig": {
47855
- capName: "decoder",
47856
- capScope: "system",
47857
- addonId: null,
47858
- access: "view"
47859
- },
47860
49459
  "detectionPipeline.applyDeviceSettingsPatch": {
47861
49460
  capName: "detection-pipeline",
47862
49461
  capScope: "device",
@@ -49123,6 +50722,96 @@ var METHOD_ACCESS_MAP = Object.freeze({
49123
50722
  addonId: null,
49124
50723
  access: "create"
49125
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
+ },
49126
50815
  "lawnMowerControl.dock": {
49127
50816
  capName: "lawn-mower-control",
49128
50817
  capScope: "device",
@@ -49345,12 +51034,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
49345
51034
  addonId: null,
49346
51035
  access: "view"
49347
51036
  },
51037
+ "localNetwork.addCustomAddress": {
51038
+ capName: "local-network",
51039
+ capScope: "system",
51040
+ addonId: null,
51041
+ access: "create"
51042
+ },
49348
51043
  "localNetwork.downloadCa": {
49349
51044
  capName: "local-network",
49350
51045
  capScope: "system",
49351
51046
  addonId: null,
49352
51047
  access: "view"
49353
51048
  },
51049
+ "localNetwork.getAddresses": {
51050
+ capName: "local-network",
51051
+ capScope: "system",
51052
+ addonId: null,
51053
+ access: "view"
51054
+ },
49354
51055
  "localNetwork.getAllowedAddresses": {
49355
51056
  capName: "local-network",
49356
51057
  capScope: "system",
@@ -49363,6 +51064,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
49363
51064
  addonId: null,
49364
51065
  access: "view"
49365
51066
  },
51067
+ "localNetwork.getHubAddresses": {
51068
+ capName: "local-network",
51069
+ capScope: "system",
51070
+ addonId: null,
51071
+ access: "view"
51072
+ },
49366
51073
  "localNetwork.getNotificationEndpoint": {
49367
51074
  capName: "local-network",
49368
51075
  capScope: "system",
@@ -49399,6 +51106,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
49399
51106
  addonId: null,
49400
51107
  access: "create"
49401
51108
  },
51109
+ "localNetwork.removeCustomAddress": {
51110
+ capName: "local-network",
51111
+ capScope: "system",
51112
+ addonId: null,
51113
+ access: "delete"
51114
+ },
49402
51115
  "localNetwork.resetAllowlistToBestMatch": {
49403
51116
  capName: "local-network",
49404
51117
  capScope: "system",
@@ -49411,6 +51124,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
49411
51124
  addonId: null,
49412
51125
  access: "create"
49413
51126
  },
51127
+ "localNetwork.setAddressRole": {
51128
+ capName: "local-network",
51129
+ capScope: "system",
51130
+ addonId: null,
51131
+ access: "create"
51132
+ },
49414
51133
  "localNetwork.setAllowedAddresses": {
49415
51134
  capName: "local-network",
49416
51135
  capScope: "system",
@@ -50467,6 +52186,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
50467
52186
  addonId: null,
50468
52187
  access: "create"
50469
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
+ },
50470
52201
  "pipelineAnalytics.applyDeviceSettingsPatch": {
50471
52202
  capName: "pipeline-analytics",
50472
52203
  capScope: "device",
@@ -50515,12 +52246,36 @@ var METHOD_ACCESS_MAP = Object.freeze({
50515
52246
  addonId: null,
50516
52247
  access: "view"
50517
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
+ },
50518
52261
  "pipelineAnalytics.deleteDeviceEvents": {
50519
52262
  capName: "pipeline-analytics",
50520
52263
  capScope: "device",
50521
52264
  addonId: null,
50522
52265
  access: "delete"
50523
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
+ },
50524
52279
  "pipelineAnalytics.deleteTracks": {
50525
52280
  capName: "pipeline-analytics",
50526
52281
  capScope: "device",
@@ -50725,6 +52480,30 @@ var METHOD_ACCESS_MAP = Object.freeze({
50725
52480
  addonId: null,
50726
52481
  access: "view"
50727
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
+ },
50728
52507
  "pipelineAnalytics.listRetrainFrames": {
50729
52508
  capName: "pipeline-analytics",
50730
52509
  capScope: "device",
@@ -50767,12 +52546,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
50767
52546
  addonId: null,
50768
52547
  access: "create"
50769
52548
  },
52549
+ "pipelineAnalytics.previewRetrainDataset": {
52550
+ capName: "pipeline-analytics",
52551
+ capScope: "device",
52552
+ addonId: null,
52553
+ access: "view"
52554
+ },
50770
52555
  "pipelineAnalytics.proposeRetrainAnnotations": {
50771
52556
  capName: "pipeline-analytics",
50772
52557
  capScope: "device",
50773
52558
  addonId: null,
50774
52559
  access: "create"
50775
52560
  },
52561
+ "pipelineAnalytics.proposeRetrainAnnotationsWithLlm": {
52562
+ capName: "pipeline-analytics",
52563
+ capScope: "device",
52564
+ addonId: null,
52565
+ access: "create"
52566
+ },
50776
52567
  "pipelineAnalytics.pruneEvents": {
50777
52568
  capName: "pipeline-analytics",
50778
52569
  capScope: "device",
@@ -50827,6 +52618,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
50827
52618
  addonId: null,
50828
52619
  access: "create"
50829
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
+ },
50830
52633
  "pipelineAnalytics.restageRetrainTrack": {
50831
52634
  capName: "pipeline-analytics",
50832
52635
  capScope: "device",
@@ -50857,6 +52660,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
50857
52660
  addonId: null,
50858
52661
  access: "create"
50859
52662
  },
52663
+ "pipelineAnalytics.setRetrainFrameComplete": {
52664
+ capName: "pipeline-analytics",
52665
+ capScope: "device",
52666
+ addonId: null,
52667
+ access: "create"
52668
+ },
50860
52669
  "pipelineAnalytics.setTrackFlags": {
50861
52670
  capName: "pipeline-analytics",
50862
52671
  capScope: "device",
@@ -50881,6 +52690,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
50881
52690
  addonId: null,
50882
52691
  access: "create"
50883
52692
  },
52693
+ "pipelineAnalytics.verifyRetrainDatasetVersion": {
52694
+ capName: "pipeline-analytics",
52695
+ capScope: "device",
52696
+ addonId: null,
52697
+ access: "view"
52698
+ },
50884
52699
  "pipelineAnalytics.wipeAllAnalytics": {
50885
52700
  capName: "pipeline-analytics",
50886
52701
  capScope: "device",
@@ -50893,6 +52708,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
50893
52708
  addonId: null,
50894
52709
  access: "delete"
50895
52710
  },
52711
+ "pipelineAnalytics.writeRetrainArchive": {
52712
+ capName: "pipeline-analytics",
52713
+ capScope: "device",
52714
+ addonId: null,
52715
+ access: "create"
52716
+ },
50896
52717
  "pipelineExecutor.cacheFrameInPool": {
50897
52718
  capName: "pipeline-executor",
50898
52719
  capScope: "system",
@@ -50905,13 +52726,13 @@ var METHOD_ACCESS_MAP = Object.freeze({
50905
52726
  addonId: null,
50906
52727
  access: "delete"
50907
52728
  },
50908
- "pipelineExecutor.deleteModel": {
52729
+ "pipelineExecutor.clearModelBoundDeviceOverrides": {
50909
52730
  capName: "pipeline-executor",
50910
52731
  capScope: "system",
50911
52732
  addonId: null,
50912
52733
  access: "delete"
50913
52734
  },
50914
- "pipelineExecutor.deleteTemplate": {
52735
+ "pipelineExecutor.deleteModel": {
50915
52736
  capName: "pipeline-executor",
50916
52737
  capScope: "system",
50917
52738
  addonId: null,
@@ -51055,12 +52876,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
51055
52876
  addonId: null,
51056
52877
  access: "view"
51057
52878
  },
51058
- "pipelineExecutor.listTemplates": {
51059
- capName: "pipeline-executor",
51060
- capScope: "system",
51061
- addonId: null,
51062
- access: "view"
51063
- },
51064
52879
  "pipelineExecutor.rearmInferenceDevice": {
51065
52880
  capName: "pipeline-executor",
51066
52881
  capScope: "system",
@@ -51085,12 +52900,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
51085
52900
  addonId: null,
51086
52901
  access: "create"
51087
52902
  },
51088
- "pipelineExecutor.saveTemplate": {
51089
- capName: "pipeline-executor",
51090
- capScope: "system",
51091
- addonId: null,
51092
- access: "create"
51093
- },
51094
52903
  "pipelineExecutor.setVideoPipelineSteps": {
51095
52904
  capName: "pipeline-executor",
51096
52905
  capScope: "system",
@@ -51109,17 +52918,23 @@ var METHOD_ACCESS_MAP = Object.freeze({
51109
52918
  addonId: null,
51110
52919
  access: "create"
51111
52920
  },
51112
- "pipelineExecutor.updateTemplate": {
52921
+ "pipelineExecutor.validatePipeline": {
51113
52922
  capName: "pipeline-executor",
51114
52923
  capScope: "system",
51115
52924
  addonId: null,
52925
+ access: "view"
52926
+ },
52927
+ "pipelineOrchestrator.abortNodeBenchmark": {
52928
+ capName: "pipeline-orchestrator",
52929
+ capScope: "system",
52930
+ addonId: null,
51116
52931
  access: "create"
51117
52932
  },
51118
- "pipelineExecutor.validatePipeline": {
51119
- capName: "pipeline-executor",
52933
+ "pipelineOrchestrator.applyAutoTune": {
52934
+ capName: "pipeline-orchestrator",
51120
52935
  capScope: "system",
51121
52936
  addonId: null,
51122
- access: "view"
52937
+ access: "create"
51123
52938
  },
51124
52939
  "pipelineOrchestrator.applyDeviceSettingsPatch": {
51125
52940
  capName: "pipeline-orchestrator",
@@ -51139,7 +52954,7 @@ var METHOD_ACCESS_MAP = Object.freeze({
51139
52954
  addonId: null,
51140
52955
  access: "create"
51141
52956
  },
51142
- "pipelineOrchestrator.deleteTemplate": {
52957
+ "pipelineOrchestrator.deleteNodeBenchmarkResult": {
51143
52958
  capName: "pipeline-orchestrator",
51144
52959
  capScope: "system",
51145
52960
  addonId: null,
@@ -51235,6 +53050,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
51235
53050
  addonId: null,
51236
53051
  access: "view"
51237
53052
  },
53053
+ "pipelineOrchestrator.getEffectiveShares": {
53054
+ capName: "pipeline-orchestrator",
53055
+ capScope: "system",
53056
+ addonId: null,
53057
+ access: "view"
53058
+ },
51238
53059
  "pipelineOrchestrator.getGlobalMetrics": {
51239
53060
  capName: "pipeline-orchestrator",
51240
53061
  capScope: "system",
@@ -51247,6 +53068,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
51247
53068
  addonId: null,
51248
53069
  access: "view"
51249
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
+ },
51250
53089
  "pipelineOrchestrator.getNodeInferenceDevices": {
51251
53090
  capName: "pipeline-orchestrator",
51252
53091
  capScope: "system",
@@ -51271,6 +53110,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
51271
53110
  addonId: null,
51272
53111
  access: "view"
51273
53112
  },
53113
+ "pipelineOrchestrator.getPlacementStats": {
53114
+ capName: "pipeline-orchestrator",
53115
+ capScope: "system",
53116
+ addonId: null,
53117
+ access: "view"
53118
+ },
51274
53119
  "pipelineOrchestrator.getReconcileFromDiskStatus": {
51275
53120
  capName: "pipeline-orchestrator",
51276
53121
  capScope: "system",
@@ -51283,7 +53128,7 @@ var METHOD_ACCESS_MAP = Object.freeze({
51283
53128
  addonId: null,
51284
53129
  access: "view"
51285
53130
  },
51286
- "pipelineOrchestrator.listTemplates": {
53131
+ "pipelineOrchestrator.listNodeBenchmarkResults": {
51287
53132
  capName: "pipeline-orchestrator",
51288
53133
  capScope: "system",
51289
53134
  addonId: null,
@@ -51295,6 +53140,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
51295
53140
  addonId: null,
51296
53141
  access: "create"
51297
53142
  },
53143
+ "pipelineOrchestrator.planAutoTune": {
53144
+ capName: "pipeline-orchestrator",
53145
+ capScope: "system",
53146
+ addonId: null,
53147
+ access: "view"
53148
+ },
51298
53149
  "pipelineOrchestrator.rebalance": {
51299
53150
  capName: "pipeline-orchestrator",
51300
53151
  capScope: "system",
@@ -51337,12 +53188,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
51337
53188
  addonId: null,
51338
53189
  access: "create"
51339
53190
  },
51340
- "pipelineOrchestrator.saveTemplate": {
51341
- capName: "pipeline-orchestrator",
51342
- capScope: "system",
51343
- addonId: null,
51344
- access: "create"
51345
- },
51346
53191
  "pipelineOrchestrator.setAgentCapabilities": {
51347
53192
  capName: "pipeline-orchestrator",
51348
53193
  capScope: "system",
@@ -51355,12 +53200,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
51355
53200
  addonId: null,
51356
53201
  access: "create"
51357
53202
  },
51358
- "pipelineOrchestrator.setAgentDetectWeight": {
51359
- capName: "pipeline-orchestrator",
51360
- capScope: "system",
51361
- addonId: null,
51362
- access: "create"
51363
- },
51364
53203
  "pipelineOrchestrator.setAgentInferenceDevices": {
51365
53204
  capName: "pipeline-orchestrator",
51366
53205
  capScope: "system",
@@ -51397,6 +53236,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
51397
53236
  addonId: null,
51398
53237
  access: "create"
51399
53238
  },
53239
+ "pipelineOrchestrator.setCameraStepSettings": {
53240
+ capName: "pipeline-orchestrator",
53241
+ capScope: "system",
53242
+ addonId: null,
53243
+ access: "create"
53244
+ },
51400
53245
  "pipelineOrchestrator.setCameraStepToggle": {
51401
53246
  capName: "pipeline-orchestrator",
51402
53247
  capScope: "system",
@@ -51415,12 +53260,36 @@ var METHOD_ACCESS_MAP = Object.freeze({
51415
53260
  addonId: null,
51416
53261
  access: "create"
51417
53262
  },
53263
+ "pipelineOrchestrator.setLoadBalancingShares": {
53264
+ capName: "pipeline-orchestrator",
53265
+ capScope: "system",
53266
+ addonId: null,
53267
+ access: "create"
53268
+ },
51418
53269
  "pipelineOrchestrator.setPipelineDevicePin": {
51419
53270
  capName: "pipeline-orchestrator",
51420
53271
  capScope: "system",
51421
53272
  addonId: null,
51422
53273
  access: "create"
51423
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
+ },
51424
53293
  "pipelineOrchestrator.unassignAudio": {
51425
53294
  capName: "pipeline-orchestrator",
51426
53295
  capScope: "system",
@@ -51433,8 +53302,8 @@ var METHOD_ACCESS_MAP = Object.freeze({
51433
53302
  addonId: null,
51434
53303
  access: "create"
51435
53304
  },
51436
- "pipelineOrchestrator.updateTemplate": {
51437
- capName: "pipeline-orchestrator",
53305
+ "pipelineRunner.abortNodeBench": {
53306
+ capName: "pipeline-runner",
51438
53307
  capScope: "system",
51439
53308
  addonId: null,
51440
53309
  access: "create"
@@ -51487,6 +53356,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
51487
53356
  addonId: null,
51488
53357
  access: "view"
51489
53358
  },
53359
+ "pipelineRunner.getNodeBenchStatus": {
53360
+ capName: "pipeline-runner",
53361
+ capScope: "system",
53362
+ addonId: null,
53363
+ access: "view"
53364
+ },
51490
53365
  "pipelineRunner.getParkedTrackFrame": {
51491
53366
  capName: "pipeline-runner",
51492
53367
  capScope: "system",
@@ -51529,6 +53404,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
51529
53404
  addonId: null,
51530
53405
  access: "create"
51531
53406
  },
53407
+ "pipelineRunner.startNodeBench": {
53408
+ capName: "pipeline-runner",
53409
+ capScope: "system",
53410
+ addonId: null,
53411
+ access: "create"
53412
+ },
51532
53413
  "plateGallery.assignPlate": {
51533
53414
  capName: "plate-gallery",
51534
53415
  capScope: "system",
@@ -52873,12 +54754,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
52873
54754
  addonId: null,
52874
54755
  access: "view"
52875
54756
  },
52876
- "streamBroker.pullFrameHandles": {
52877
- capName: "stream-broker",
52878
- capScope: "system",
52879
- addonId: null,
52880
- access: "view"
52881
- },
52882
54757
  "streamBroker.regenerateRtspToken": {
52883
54758
  capName: "stream-broker",
52884
54759
  capScope: "system",
@@ -52945,12 +54820,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
52945
54820
  addonId: null,
52946
54821
  access: "create"
52947
54822
  },
52948
- "streamBroker.subscribeFrames": {
52949
- capName: "stream-broker",
52950
- capScope: "system",
52951
- addonId: null,
52952
- access: "create"
52953
- },
52954
54823
  "streamBroker.unassignProfile": {
52955
54824
  capName: "stream-broker",
52956
54825
  capScope: "system",
@@ -52963,12 +54832,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
52963
54832
  addonId: null,
52964
54833
  access: "create"
52965
54834
  },
52966
- "streamBroker.unsubscribeFrames": {
52967
- capName: "stream-broker",
52968
- capScope: "system",
52969
- addonId: null,
52970
- access: "create"
52971
- },
52972
54835
  "streamCatalog.getCatalog": {
52973
54836
  capName: "stream-catalog",
52974
54837
  capScope: "device",
@@ -53263,18 +55126,36 @@ var METHOD_ACCESS_MAP = Object.freeze({
53263
55126
  addonId: null,
53264
55127
  access: "delete"
53265
55128
  },
55129
+ "userManagement.findUserByExternalIdentity": {
55130
+ capName: "user-management",
55131
+ capScope: "system",
55132
+ addonId: null,
55133
+ access: "view"
55134
+ },
53266
55135
  "userManagement.getTotpStatus": {
53267
55136
  capName: "user-management",
53268
55137
  capScope: "system",
53269
55138
  addonId: null,
53270
55139
  access: "view"
53271
55140
  },
55141
+ "userManagement.linkExternalIdentity": {
55142
+ capName: "user-management",
55143
+ capScope: "system",
55144
+ addonId: null,
55145
+ access: "create"
55146
+ },
53272
55147
  "userManagement.listApiKeys": {
53273
55148
  capName: "user-management",
53274
55149
  capScope: "system",
53275
55150
  addonId: null,
53276
55151
  access: "view"
53277
55152
  },
55153
+ "userManagement.listExternalIdentities": {
55154
+ capName: "user-management",
55155
+ capScope: "system",
55156
+ addonId: null,
55157
+ access: "view"
55158
+ },
53278
55159
  "userManagement.listOauthSessions": {
53279
55160
  capName: "user-management",
53280
55161
  capScope: "system",
@@ -53353,6 +55234,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
53353
55234
  addonId: null,
53354
55235
  access: "create"
53355
55236
  },
55237
+ "userManagement.unlinkExternalIdentity": {
55238
+ capName: "user-management",
55239
+ capScope: "system",
55240
+ addonId: null,
55241
+ access: "delete"
55242
+ },
53356
55243
  "userManagement.updateUser": {
53357
55244
  capName: "user-management",
53358
55245
  capScope: "system",
@@ -53665,6 +55552,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
53665
55552
  addonId: null,
53666
55553
  access: "create"
53667
55554
  },
55555
+ "webrtcSession.applyDownlinkProbe": {
55556
+ capName: "webrtc-session",
55557
+ capScope: "device",
55558
+ addonId: null,
55559
+ access: "create"
55560
+ },
53668
55561
  "webrtcSession.closeSession": {
53669
55562
  capName: "webrtc-session",
53670
55563
  capScope: "device",
@@ -55518,11 +57411,6 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
55518
57411
  form: "single",
55519
57412
  optional: false
55520
57413
  }],
55521
- "decoder.createSession": [{
55522
- name: "deviceId",
55523
- form: "single",
55524
- optional: true
55525
- }],
55526
57414
  "detectionPipeline.applyDeviceSettingsPatch": [{
55527
57415
  name: "deviceId",
55528
57416
  form: "single",
@@ -56493,6 +58381,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
56493
58381
  form: "single",
56494
58382
  optional: false
56495
58383
  }],
58384
+ "pipelineAnalytics.addRetrainFrameFromRecording": [{
58385
+ name: "deviceId",
58386
+ form: "single",
58387
+ optional: false
58388
+ }],
56496
58389
  "pipelineAnalytics.applyDeviceSettingsPatch": [{
56497
58390
  name: "deviceId",
56498
58391
  form: "single",
@@ -56683,6 +58576,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
56683
58576
  form: "single",
56684
58577
  optional: false
56685
58578
  }],
58579
+ "pipelineAnalytics.proposeRetrainAnnotationsWithLlm": [{
58580
+ name: "deviceId",
58581
+ form: "single",
58582
+ optional: false
58583
+ }],
56686
58584
  "pipelineAnalytics.pruneEventsBefore": [{
56687
58585
  name: "deviceId",
56688
58586
  form: "single",
@@ -56733,6 +58631,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
56733
58631
  form: "single",
56734
58632
  optional: false
56735
58633
  }],
58634
+ "pipelineAnalytics.setRetrainFrameComplete": [{
58635
+ name: "deviceId",
58636
+ form: "single",
58637
+ optional: false
58638
+ }],
56736
58639
  "pipelineAnalytics.setTrackFlags": [{
56737
58640
  name: "deviceId",
56738
58641
  form: "single",
@@ -56753,6 +58656,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
56753
58656
  form: "single",
56754
58657
  optional: false
56755
58658
  }],
58659
+ "pipelineExecutor.clearModelBoundDeviceOverrides": [{
58660
+ name: "deviceIds",
58661
+ form: "array",
58662
+ optional: true
58663
+ }],
56756
58664
  "pipelineExecutor.runPipeline": [{
56757
58665
  name: "deviceId",
56758
58666
  form: "single",
@@ -56858,6 +58766,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
56858
58766
  form: "single",
56859
58767
  optional: false
56860
58768
  }],
58769
+ "pipelineOrchestrator.setCameraStepSettings": [{
58770
+ name: "deviceId",
58771
+ form: "single",
58772
+ optional: false
58773
+ }],
56861
58774
  "pipelineOrchestrator.setCameraStepToggle": [{
56862
58775
  name: "deviceId",
56863
58776
  form: "single",
@@ -57629,6 +59542,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
57629
59542
  form: "single",
57630
59543
  optional: false
57631
59544
  }],
59545
+ "webrtcSession.applyDownlinkProbe": [{
59546
+ name: "deviceId",
59547
+ form: "single",
59548
+ optional: false
59549
+ }],
57632
59550
  "webrtcSession.closeSession": [{
57633
59551
  name: "deviceId",
57634
59552
  form: "single",
@@ -57779,6 +59697,8 @@ var NC_SYSTEM_EVENT_FAMILY = {
57779
59697
  "detection-blind": "device-events",
57780
59698
  "node-online": "system",
57781
59699
  "node-offline": "system",
59700
+ "node-restarting": "system",
59701
+ "node-updating": "system",
57782
59702
  "node-inference-unavailable": "system",
57783
59703
  "addon-crash-loop": "system",
57784
59704
  "addon-update-available": "system",
@@ -57857,6 +59777,7 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
57857
59777
  kinds: [
57858
59778
  "node-offline",
57859
59779
  "node-online",
59780
+ "node-restarting",
57860
59781
  "node-inference-unavailable"
57861
59782
  ]
57862
59783
  },
@@ -57878,6 +59799,7 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
57878
59799
  label: "Server & container updates",
57879
59800
  kinds: [
57880
59801
  "server-update-available",
59802
+ "node-updating",
57881
59803
  "server-updated",
57882
59804
  "wrapper-update-available"
57883
59805
  ]
@@ -57999,6 +59921,7 @@ var STATE_SUMMARY_SECTION_VARS = [
57999
59921
  kinds: [
58000
59922
  "node-offline",
58001
59923
  "node-online",
59924
+ "node-restarting",
58002
59925
  "node-inference-unavailable"
58003
59926
  ]
58004
59927
  },
@@ -58020,6 +59943,7 @@ var STATE_SUMMARY_SECTION_VARS = [
58020
59943
  example: "server 1.2.377 \u2192 1.2.378",
58021
59944
  kinds: [
58022
59945
  "server-update-available",
59946
+ "node-updating",
58023
59947
  "server-updated",
58024
59948
  "wrapper-update-available"
58025
59949
  ]
@@ -58052,7 +59976,7 @@ var STATE_SUMMARY_VARS = [
58052
59976
  {
58053
59977
  name: "summarySection",
58054
59978
  label: "Summary: this section",
58055
- 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.",
58056
59980
  example: "Batterie scariche",
58057
59981
  group: "system",
58058
59982
  families: ["rule"],
@@ -58425,6 +60349,8 @@ var NC_TEMPLATE_VARS = [
58425
60349
  systemEventKinds: [
58426
60350
  "node-online",
58427
60351
  "node-offline",
60352
+ "node-restarting",
60353
+ "node-updating",
58428
60354
  "node-inference-unavailable",
58429
60355
  "addon-crash-loop",
58430
60356
  ...UPDATES,
@@ -58443,6 +60369,8 @@ var NC_TEMPLATE_VARS = [
58443
60369
  systemEventKinds: [
58444
60370
  "node-online",
58445
60371
  "node-offline",
60372
+ "node-restarting",
60373
+ "node-updating",
58446
60374
  "node-inference-unavailable",
58447
60375
  "addon-crash-loop",
58448
60376
  ...UPDATES,
@@ -58496,6 +60424,7 @@ var NC_TEMPLATE_VARS = [
58496
60424
  systemEventKinds: [
58497
60425
  ...UPDATES,
58498
60426
  "addon-updated",
60427
+ "node-updating",
58499
60428
  "server-updated"
58500
60429
  ]
58501
60430
  },
@@ -58507,7 +60436,11 @@ var NC_TEMPLATE_VARS = [
58507
60436
  families: ["rule"],
58508
60437
  fields: [...RULE_TEXT],
58509
60438
  kinds: ["system"],
58510
- systemEventKinds: [...PACKAGE_UPDATES, "server-updated"]
60439
+ systemEventKinds: [
60440
+ ...PACKAGE_UPDATES,
60441
+ "node-updating",
60442
+ "server-updated"
60443
+ ]
58511
60444
  },
58512
60445
  {
58513
60446
  name: "nodes",
@@ -58559,7 +60492,7 @@ var NC_TEMPLATE_VARS = [
58559
60492
  families: ["rule"],
58560
60493
  fields: [...RULE_TEXT],
58561
60494
  kinds: ["system"],
58562
- systemEventKinds: ["server-updated"]
60495
+ systemEventKinds: ["node-updating", "server-updated"]
58563
60496
  },
58564
60497
  {
58565
60498
  name: "toVersion",
@@ -58569,7 +60502,7 @@ var NC_TEMPLATE_VARS = [
58569
60502
  families: ["rule"],
58570
60503
  fields: [...RULE_TEXT],
58571
60504
  kinds: ["system"],
58572
- systemEventKinds: ["server-updated"]
60505
+ systemEventKinds: ["node-updating", "server-updated"]
58573
60506
  },
58574
60507
  {
58575
60508
  name: "destinationsOk",
@@ -59036,6 +60969,7 @@ var TimelapseRuleSchema = TimelapseRuleInputSchema.extend({
59036
60969
  updatedAt: external_exports.number()
59037
60970
  });
59038
60971
  var ProviderMotionDataSchema = MotionOnMotionChangedDataSchema.omit({ triggeredBy: true });
60972
+ var OVERHEAD_MS = 3 * 6e4;
59039
60973
  var DetailCropConventionSchema = external_exports.object({
59040
60974
  /**
59041
60975
  * Fraction of the box's own size added on EACH side before cutting.