@camstack/addon-pipeline 1.2.621 → 1.2.623

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/audio-analyzer/index.js +3 -3
  2. package/dist/audio-analyzer/index.mjs +3 -3
  3. package/dist/{custom-model-catalog-Il8UY4D4.js → custom-model-catalog-BTBdgN2p.js} +29 -16
  4. package/dist/{custom-model-catalog-0_SnSXzN.mjs → custom-model-catalog-D5zTw1LU.mjs} +29 -10
  5. package/dist/detection-pipeline/index.js +67 -416
  6. package/dist/detection-pipeline/index.mjs +91 -440
  7. package/dist/{dist-ClkumZgv.js → dist-BVo3wa7s.js} +711 -302
  8. package/dist/{dist-DHqkQhTQ.mjs → dist-opSx6v5i.mjs} +651 -296
  9. package/dist/{model-catalogs-BagalaYp.js → model-catalogs-CQytR2AN.js} +1 -1
  10. package/dist/{model-catalogs-Z1GZAhSb.mjs → model-catalogs-rIvLUVlw.mjs} +1 -1
  11. package/dist/motion-wasm/index.js +1 -1
  12. package/dist/motion-wasm/index.mjs +1 -1
  13. package/dist/{node-CkJLxlWI.mjs → node-CGIYuJMN.mjs} +1 -1
  14. package/dist/{node-0O_61WVW.js → node-DqLsuN_A.js} +1 -1
  15. package/dist/pipeline-runner/index.js +115 -460
  16. package/dist/pipeline-runner/index.mjs +108 -453
  17. package/dist/{process-memory-Dj3UgL1e.mjs → process-memory-Bd-TuWfM.mjs} +1 -1
  18. package/dist/{process-memory-DdIOhjYB.js → process-memory-DyxG-0mG.js} +1 -1
  19. package/dist/recorder/index.js +2 -2
  20. package/dist/recorder/index.mjs +2 -2
  21. package/dist/{segment-demux-js-BePzacki.js → segment-demux-js-B4bfTQpK.js} +1 -1
  22. package/dist/{segment-demux-js-Bv0t0-tQ.mjs → segment-demux-js-CdVRzwSd.mjs} +1 -1
  23. package/dist/session-decode/decode-worker-main.js +12 -21
  24. package/dist/session-decode/decode-worker-main.mjs +12 -21
  25. package/dist/stream-broker/_stub.js +2 -2
  26. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-dNk74ahz.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-DF3FGCR8.mjs} +2 -2
  27. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-oUZNn2Kr.mjs +26 -0
  28. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-Bb-ETNGC.mjs +26 -0
  29. package/dist/stream-broker/demux-worker-child.js +1 -1
  30. package/dist/stream-broker/demux-worker-child.mjs +1 -1
  31. package/dist/stream-broker/{hostInit-CH5g78CJ.mjs → hostInit-BiyFzSqq.mjs} +2 -2
  32. package/dist/stream-broker/index.js +3 -3
  33. package/dist/stream-broker/index.mjs +3 -3
  34. package/dist/stream-broker/remoteEntry.js +1 -1
  35. package/dist/{worker-protocol-D_NzPcnh.mjs → worker-protocol-DngGEAT2.js} +102 -2
  36. package/dist/{worker-protocol-C-G8qmye.js → worker-protocol-_avq7y8O.mjs} +67 -25
  37. package/package.json +1 -1
  38. package/python/accelerator_facts.py +275 -0
  39. package/python/coreml_load_probe.py +105 -15
  40. package/python/inference_pool.py +19 -2
  41. package/python/openvino_compile_probe.py +72 -18
  42. package/python/postprocessors/ssd.py +12 -4
  43. package/python/postprocessors/test_ssd.py +64 -0
  44. package/python/test_accelerator_facts.py +105 -0
  45. package/python/test_coreml_load_probe.py +83 -0
  46. package/python/test_openvino_compile_probe.py +114 -0
  47. package/python/webgpu_isolated.py +19 -0
  48. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-2KkGoQ55.mjs +0 -26
  49. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-Dx-WrMx0.mjs +0 -26
@@ -1,5 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
- //#region ../types/dist/event-category-BfJwUd2S.mjs
2
+ //#region ../types/dist/event-category-fDPduoeC.mjs
3
3
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4
4
  EventCategory["SystemBoot"] = "system.boot";
5
5
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -326,9 +326,8 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
326
326
  EventCategory["PipelineMotionCalm"] = "pipeline.motion-calm";
327
327
  /**
328
328
  * Per-camera pipeline config was mutated by the orchestrator
329
- * (3-level settings change via `setAgentAddonDefaults` /
330
- * `setCameraStepToggle` / `setCameraPipelineForAgent` or a
331
- * pipeline-scoped `applyDeviceSettingsPatch`). Orchestrator
329
+ * (a settings change via `setAgentInferenceDevices` /
330
+ * `setCameraStepToggle` / `setCameraStepSettings`). Orchestrator
332
331
  * subscribes to its own emission to hot-reload the assigned runner
333
332
  * via `attachCamera` so the next frame executes against the new
334
333
  * engine/steps without waiting for a rebalance or the next
@@ -4725,10 +4724,10 @@ var ZodType = /*@__PURE__*/ $constructor("ZodType", (inst, def) => {
4725
4724
  return array(this);
4726
4725
  },
4727
4726
  or(arg) {
4728
- return union([this, arg]);
4727
+ return union$1([this, arg]);
4729
4728
  },
4730
4729
  and(arg) {
4731
- return intersection(this, arg);
4730
+ return intersection$1(this, arg);
4732
4731
  },
4733
4732
  transform(tx) {
4734
4733
  return pipe(this, transform(tx));
@@ -5199,7 +5198,7 @@ var ZodUnion = /*@__PURE__*/ $constructor("ZodUnion", (inst, def) => {
5199
5198
  inst._zod.processJSONSchema = (ctx, json, params) => unionProcessor(inst, ctx, json, params);
5200
5199
  inst.options = def.options;
5201
5200
  });
5202
- function union(options, params) {
5201
+ function union$1(options, params) {
5203
5202
  return new ZodUnion({
5204
5203
  type: "union",
5205
5204
  options,
@@ -5223,7 +5222,7 @@ var ZodIntersection = /*@__PURE__*/ $constructor("ZodIntersection", (inst, def)
5223
5222
  ZodType.init(inst, def);
5224
5223
  inst._zod.processJSONSchema = (ctx, json, params) => intersectionProcessor(inst, ctx, json, params);
5225
5224
  });
5226
- function intersection(left, right) {
5225
+ function intersection$1(left, right) {
5227
5226
  return new ZodIntersection({
5228
5227
  type: "intersection",
5229
5228
  left,
@@ -5564,7 +5563,7 @@ var ZodIssueCode = {
5564
5563
  var ZodFirstPartyTypeKind;
5565
5564
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5566
5565
  //#endregion
5567
- //#region ../types/dist/sleep-6AqUnQIT.mjs
5566
+ //#region ../types/dist/sleep-CHIEEJkY.mjs
5568
5567
  /**
5569
5568
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5570
5569
  * window to float samples (D455).
@@ -8181,7 +8180,7 @@ var RecordIndexSchema = object({
8181
8180
  fields: array(RecordFieldPathSchema).min(1).max(4),
8182
8181
  unique: boolean().optional()
8183
8182
  }).strict();
8184
- var RecordRetentionSchema = union([
8183
+ var RecordRetentionSchema = union$1([
8185
8184
  object({
8186
8185
  ttlMs: number().int().positive(),
8187
8186
  from: _enum(["at", "write"])
@@ -8334,7 +8333,7 @@ var CAM_PROFILE_ORDER = [
8334
8333
  * the operator picked. Today's one user is the audio analyser, whose rule is
8335
8334
  * "the lowest AVAILABLE native rung" (D537).
8336
8335
  */
8337
- var AudioStreamPickSchema = union([CamProfileSchema, literal("auto")]);
8336
+ var AudioStreamPickSchema = union$1([CamProfileSchema, literal("auto")]);
8338
8337
  var CamStreamKindSchema = _enum([
8339
8338
  "pull-rtsp",
8340
8339
  "pull-rtmp",
@@ -8766,7 +8765,7 @@ var ContributionSectionSchema = object({
8766
8765
  description: string().optional(),
8767
8766
  style: _enum(["card", "accordion"]).optional(),
8768
8767
  defaultCollapsed: boolean().optional(),
8769
- columns: union([
8768
+ columns: union$1([
8770
8769
  literal(1),
8771
8770
  literal(2),
8772
8771
  literal(3),
@@ -8930,7 +8929,7 @@ var HF_REPO = "camstack/camstack-models";
8930
8929
  `${HF_REPO}`;
8931
8930
  object({
8932
8931
  code: string().regex(/^[a-z][a-z0-9-]*(\.[a-z0-9-]+)+$/),
8933
- params: record(string(), union([string(), number()])).optional()
8932
+ params: record(string(), union$1([string(), number()])).optional()
8934
8933
  });
8935
8934
  var CamstackError = class extends Error {
8936
8935
  i18nCode;
@@ -11033,7 +11032,7 @@ var CompositionFieldReadSchema = object({
11033
11032
  var CompositionFromSourceSchema = CompositionFieldReadSchema.extend({ kind: literal("from") });
11034
11033
  var CompositionBindingSchema = discriminatedUnion("kind", [CompositionFromSourceSchema, object({
11035
11034
  kind: literal("literal"),
11036
- value: union([
11035
+ value: union$1([
11037
11036
  string(),
11038
11037
  number(),
11039
11038
  boolean(),
@@ -11228,7 +11227,7 @@ var EncodeProfileSchema = object({
11228
11227
  */
11229
11228
  singleSlicePerFrame: boolean().optional()
11230
11229
  }),
11231
- audio: union([literal("passthrough"), object({
11230
+ audio: union$1([literal("passthrough"), object({
11232
11231
  codec: _enum([
11233
11232
  "opus",
11234
11233
  "aac",
@@ -11238,7 +11237,7 @@ var EncodeProfileSchema = object({
11238
11237
  ]),
11239
11238
  bitrateKbps: number().int().positive().optional(),
11240
11239
  sampleRateHz: number().int().positive().optional(),
11241
- channels: union([literal(1), literal(2)]).optional()
11240
+ channels: union$1([literal(1), literal(2)]).optional()
11242
11241
  })]),
11243
11242
  /**
11244
11243
  * ffmpeg input-side args, inserted between the fixed global flags
@@ -12326,13 +12325,22 @@ var BirthDecisionRecordSchema = object({
12326
12325
  decidedByBirthEvidence: boolean(),
12327
12326
  /** Best class-compatible crop score, or `null` when nothing compatible was
12328
12327
  * found — deliberately not 0, which would be a measurement that never was.
12329
- * Includes a box the detector's own per-class floor refused (reason
12330
- * `below-detector-floor`, D922): that box never confirms, but it is the
12331
- * score the crop really held. */
12328
+ * Includes a box the detector's own per-class floor refused (D922): since
12329
+ * D925 the gate's bar, not that floor, decides whether it confirms. */
12332
12330
  bestScore: number().nullable(),
12333
12331
  /** The bar this candidate actually faced (the phantom-cell hook may raise it). */
12334
12332
  appliedMinConfidence: number().nullable(),
12335
12333
  /**
12334
+ * The detector the gate re-judged the birth WITH (D925): the session's own
12335
+ * root model, inference-device pool and node — never a node default. `null`
12336
+ * when the frame named no session detector or no gate ran, and on rows
12337
+ * written before D925. A `session-device-unavailable` row names the session
12338
+ * detector that could not be reached.
12339
+ */
12340
+ detectorModelId: string().nullable().default(null),
12341
+ detectorDeviceKey: string().nullable().default(null),
12342
+ detectorNodeId: string().nullable().default(null),
12343
+ /**
12336
12344
  * The track's own `firstSeen` — the candidate's first frame, which is where
12337
12345
  * the timeline starts. `null` for a suppressed birth, which has no track.
12338
12346
  */
@@ -13974,7 +13982,7 @@ var StorageDrainProgressSchema = object({
13974
13982
  *
13975
13983
  * The orchestrator's `resolveRef(ref)` handles both cases.
13976
13984
  */
13977
- var StorageLocationRefSchema = union([StorageLocationTypeSchema, string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/)]);
13985
+ var StorageLocationRefSchema = union$1([StorageLocationTypeSchema, string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/)]);
13978
13986
  /**
13979
13987
  * `StorageLocationDeclaration` — a single storage-location entry declared by
13980
13988
  * an addon in its `package.json` under `camstack.storageLocations`.
@@ -15330,7 +15338,7 @@ var ViewerFeatureIdSchema = _enum([
15330
15338
  "scenes"
15331
15339
  ]);
15332
15340
  /** Which devices a viewer reaches: `allow` minus `block`. */
15333
- var ViewerDeviceAllowSchema = union([literal("*"), array(number().int().nonnegative())]);
15341
+ var ViewerDeviceAllowSchema = union$1([literal("*"), array(number().int().nonnegative())]);
15334
15342
  /**
15335
15343
  * The viewer grant, stored as ONE row of a user's `scopes`. A principal that
15336
15344
  * holds it is decided by the viewer rules ALONE — any other row it carries is
@@ -15394,8 +15402,8 @@ var MethodAccessSchema = _enum([
15394
15402
  * `access` is REQUIRED with min 1 element. `admin` bypass is the
15395
15403
  * "give me everything" escape; there is no wildcard scope.
15396
15404
  */
15397
- var AllowedProviderSchema = union([literal("*"), array(string())]);
15398
- var AllowedDevicesSchema = record(string(), union([literal("*"), array(string())]));
15405
+ var AllowedProviderSchema = union$1([literal("*"), array(string())]);
15406
+ var AllowedDevicesSchema = record(string(), union$1([literal("*"), array(string())]));
15399
15407
  var CapScopeSchema = _enum(["device", "system"]);
15400
15408
  /**
15401
15409
  * DeviceSelector (scope model v3 — 2026-08-12).
@@ -15501,7 +15509,7 @@ var TokenScopeSchema = preprocess(migrateLegacyTokenScope, discriminatedUnion("t
15501
15509
  * own rules alone. Kept apart from {@link TokenScope} so every surface that
15502
15510
  * edits capability rows (the scope picker, token minting) keeps its shape.
15503
15511
  */
15504
- var UserScopeSchema = union([ViewerTokenScopeSchema, TokenScopeSchema]);
15512
+ var UserScopeSchema = union$1([ViewerTokenScopeSchema, TokenScopeSchema]);
15505
15513
  object({
15506
15514
  id: string(),
15507
15515
  username: string(),
@@ -15550,7 +15558,7 @@ var AddonRoutesScopeSchema = object({
15550
15558
  access: array(MethodAccessSchema).min(1)
15551
15559
  });
15552
15560
  var PreferencesSelfScopeSchema = object({ type: literal("preferences-self") });
15553
- var CredentialScopeSchema = union([
15561
+ var CredentialScopeSchema = union$1([
15554
15562
  literal("*"),
15555
15563
  ShareViewScopeSchema,
15556
15564
  AddonRoutesScopeSchema,
@@ -15784,7 +15792,7 @@ object({
15784
15792
  /** The app executes it itself, silently (D858). */
15785
15793
  app: AppLoginPathSchema.nullable()
15786
15794
  });
15787
- var ExpressionBindingSourceSchema = union([
15795
+ var ExpressionBindingSourceSchema = union$1([
15788
15796
  object({
15789
15797
  kind: literal("field").optional(),
15790
15798
  sourceKey: string(),
@@ -15793,7 +15801,7 @@ var ExpressionBindingSourceSchema = union([
15793
15801
  }),
15794
15802
  object({
15795
15803
  kind: literal("literal"),
15796
- value: union([
15804
+ value: union$1([
15797
15805
  string(),
15798
15806
  number(),
15799
15807
  boolean(),
@@ -15836,11 +15844,11 @@ var AutomationConditionLeafSchema = object({
15836
15844
  cap: string().min(1),
15837
15845
  fieldPath: string().min(1),
15838
15846
  operator: AutomationConditionOperatorSchema,
15839
- value: union([
15847
+ value: union$1([
15840
15848
  string(),
15841
15849
  number(),
15842
15850
  boolean(),
15843
- array(union([string(), number()]))
15851
+ array(union$1([string(), number()]))
15844
15852
  ])
15845
15853
  });
15846
15854
  /**
@@ -15895,7 +15903,7 @@ var AutomationTriggerSchema = discriminatedUnion("kind", [
15895
15903
  cap: string().min(1),
15896
15904
  fieldPath: string().min(1),
15897
15905
  /** Fire when the field takes this value. Omit to fire on any change. */
15898
- becomes: union([
15906
+ becomes: union$1([
15899
15907
  string(),
15900
15908
  number(),
15901
15909
  boolean()
@@ -15949,7 +15957,7 @@ var AutomationActionSchema = discriminatedUnion("kind", [
15949
15957
  * or `{ $var }` for the device that triggered the run. An array is
15950
15958
  * fan-out at codegen — each id gets the same cap.method call.
15951
15959
  */
15952
- deviceId: union([
15960
+ deviceId: union$1([
15953
15961
  number().int(),
15954
15962
  array(number().int()).min(1),
15955
15963
  object({ $var: string().min(1) })
@@ -16117,7 +16125,7 @@ var ConfigSectionWithValuesSchema = object({
16117
16125
  descriptionKey: string().optional(),
16118
16126
  style: _enum(["card", "accordion"]).optional(),
16119
16127
  defaultCollapsed: boolean().optional(),
16120
- columns: union([
16128
+ columns: union$1([
16121
16129
  literal(1),
16122
16130
  literal(2),
16123
16131
  literal(3),
@@ -16935,7 +16943,7 @@ var CollectionColumnSchema = object({
16935
16943
  * collection surface simply cannot express their existing tables — which is
16936
16944
  * why they were still on the uncapped `table*` API.
16937
16945
  */
16938
- defaultValue: union([
16946
+ defaultValue: union$1([
16939
16947
  string(),
16940
16948
  number(),
16941
16949
  boolean()
@@ -16997,7 +17005,7 @@ method(object({
16997
17005
  }), object({
16998
17006
  /** The id the row HAS: assigned by SQLite on an insert, or the existing
16999
17007
  * row's own id on an update. */
17000
- id: union([string(), number()]) }), {
17008
+ id: union$1([string(), number()]) }), {
17001
17009
  kind: "mutation",
17002
17010
  auth: "admin"
17003
17011
  }), method(object({
@@ -17021,7 +17029,7 @@ id: union([string(), number()]) }), {
17021
17029
  * for an absent one, or the ROWID SQLite assigned on an `INTEGER`
17022
17030
  * primary key — which is the only place an auto key is knowable.
17023
17031
  */
17024
- id: union([string(), number()]) }), {
17032
+ id: union$1([string(), number()]) }), {
17025
17033
  kind: "mutation",
17026
17034
  auth: "admin"
17027
17035
  }), method(object({
@@ -19136,7 +19144,7 @@ var CompositionFieldStateSchema = object({
19136
19144
  item: CompositionFieldItemSchema.optional(),
19137
19145
  state: CompositionFieldStateKindSchema,
19138
19146
  /** `null` whenever `state === 'unavailable'`; never a plausible stand-in (D393). */
19139
- value: union([
19147
+ value: union$1([
19140
19148
  string(),
19141
19149
  number(),
19142
19150
  boolean(),
@@ -19298,7 +19306,7 @@ var RawSecretMigrationReportSchema = object({
19298
19306
  });
19299
19307
  /** Where a block runs. The operator chooses — a block driving a device on an
19300
19308
  * agent is the reason placement is not fixed to the hub. */
19301
- var CoreBlockPlacementSchema = union([literal("hub"), string().min(1)]);
19309
+ var CoreBlockPlacementSchema = union$1([literal("hub"), string().min(1)]);
19302
19310
  /** What a block's process is doing. Mirrors the addon runner's own lifecycle so
19303
19311
  * a failing block reads the same way a failing addon does. `degraded` is a
19304
19312
  * composition on an existing device with a field handed back to the native
@@ -19695,7 +19703,7 @@ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
19695
19703
  * for an absent one, or the ROWID SQLite assigned on an `INTEGER`
19696
19704
  * primary key — which is the only place an auto key is knowable.
19697
19705
  */
19698
- id: union([string(), number()]) }), {
19706
+ id: union$1([string(), number()]) }), {
19699
19707
  kind: "mutation",
19700
19708
  auth: "admin"
19701
19709
  }), method(object({
@@ -19703,7 +19711,7 @@ id: union([string(), number()]) }), {
19703
19711
  collection: string(),
19704
19712
  conflict: array(string()).readonly(),
19705
19713
  record: BulkRecordSchema
19706
- }), object({ id: union([string(), number()]) }), {
19714
+ }), object({ id: union$1([string(), number()]) }), {
19707
19715
  kind: "mutation",
19708
19716
  auth: "admin"
19709
19717
  }), method(object({
@@ -19830,20 +19838,20 @@ var RecordViewSchema = object({
19830
19838
  data: RecordBodySchema
19831
19839
  });
19832
19840
  /** Declared index fields only. Anything else does not compile, by design. */
19833
- var RecordWhereSchema = record(RecordFieldPathSchema, union([
19841
+ var RecordWhereSchema = record(RecordFieldPathSchema, union$1([
19834
19842
  string(),
19835
19843
  number(),
19836
19844
  boolean(),
19837
- object({ in: array(union([
19845
+ object({ in: array(union$1([
19838
19846
  string(),
19839
19847
  number(),
19840
19848
  boolean()
19841
19849
  ])).min(1).max(RECORD_BATCH_MAX) }),
19842
19850
  object({
19843
- gt: union([string(), number()]).optional(),
19844
- gte: union([string(), number()]).optional(),
19845
- lt: union([string(), number()]).optional(),
19846
- lte: union([string(), number()]).optional()
19851
+ gt: union$1([string(), number()]).optional(),
19852
+ gte: union$1([string(), number()]).optional(),
19853
+ lt: union$1([string(), number()]).optional(),
19854
+ lte: union$1([string(), number()]).optional()
19847
19855
  }).refine((r) => Object.keys(r).length > 0, { message: "name at least one bound" })
19848
19856
  ]));
19849
19857
  var KindShape = { kind: RecordKindNameSchema };
@@ -19994,7 +20002,7 @@ method(object({ kinds: record(RecordKindNameSchema, RecordKindDeclarationSchema)
19994
20002
  groupBy: RecordFieldPathSchema.optional(),
19995
20003
  where: RecordWhereSchema.optional()
19996
20004
  }), object({ rows: array(object({
19997
- group: union([
20005
+ group: union$1([
19998
20006
  string(),
19999
20007
  number(),
20000
20008
  _null()
@@ -20340,7 +20348,7 @@ var QueryWindowShape = {
20340
20348
  scope: string().optional(),
20341
20349
  from: number(),
20342
20350
  to: number(),
20343
- resolution: union([DeviceHistoryResolutionSchema, literal("auto")]).default("auto"),
20351
+ resolution: union$1([DeviceHistoryResolutionSchema, literal("auto")]).default("auto"),
20344
20352
  maxPoints: number().int().positive().max(5e3).default(1e3)
20345
20353
  };
20346
20354
  var QueryResultSchema = object({
@@ -20349,7 +20357,7 @@ var QueryResultSchema = object({
20349
20357
  truncated: boolean()
20350
20358
  });
20351
20359
  /** One read of a batch: a device's key or a node's key (exactly one subject). */
20352
- var QueryManyItemSchema = union([object({
20360
+ var QueryManyItemSchema = union$1([object({
20353
20361
  deviceId: number().int(),
20354
20362
  key: string(),
20355
20363
  scope: string().optional()
@@ -43301,7 +43309,7 @@ var LlmListModelsResultSchema = discriminatedUnion("ok", [object({
43301
43309
  code: LlmListModelsErrorCodeSchema,
43302
43310
  message: string()
43303
43311
  })]);
43304
- var LlmDefaultSelectorSchema = union([object({ consumer: string() }), object({ purpose: _enum(["text", "vision"]) })]);
43312
+ var LlmDefaultSelectorSchema = union$1([object({ consumer: string() }), object({ purpose: _enum(["text", "vision"]) })]);
43305
43313
  var LlmDefaultSchema = object({
43306
43314
  selector: LlmDefaultSelectorSchema,
43307
43315
  profileId: string()
@@ -43639,7 +43647,7 @@ var LogReadQuerySchema = object({
43639
43647
  */
43640
43648
  fromNodeId: string().min(1).max(200).optional(),
43641
43649
  /** Any other tag, exact match (AND). */
43642
- tags: record(string(), union([string(), number()])).optional(),
43650
+ tags: record(string(), union$1([string(), number()])).optional(),
43643
43651
  /** Severity FLOOR: this level and above. */
43644
43652
  level: LogLevelSchema.optional(),
43645
43653
  /** Case-insensitive substring over message, scope, tag values and meta values. */
@@ -43666,7 +43674,7 @@ var LogReadResultSchema = object({
43666
43674
  level: LogLevelSchema,
43667
43675
  scope: string().optional(),
43668
43676
  message: string(),
43669
- tags: record(string(), union([string(), number()])).optional(),
43677
+ tags: record(string(), union$1([string(), number()])).optional(),
43670
43678
  meta: record(string(), unknown()).optional()
43671
43679
  })),
43672
43680
  /** Pass as `before` for the next older page; null when nothing older exists. */
@@ -48157,7 +48165,7 @@ var OauthIntegrationDescriptorSchema = object({
48157
48165
  * The value is baked into the authorization code at `/authorize` and travels
48158
48166
  * on the tokens, so editing this field changes FUTURE links only.
48159
48167
  */
48160
- refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
48168
+ refreshTokenTtlSec: union$1([number().int().positive(), literal("never")]).optional()
48161
48169
  });
48162
48170
  method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
48163
48171
  /**
@@ -48193,7 +48201,7 @@ var OidcConnectionUpdateInputSchema = object({
48193
48201
  icon: string().optional(),
48194
48202
  issuerUrl: string().optional(),
48195
48203
  clientId: string().optional(),
48196
- clientSecret: union([string(), object({ $secretClear: literal(true) })]).optional(),
48204
+ clientSecret: union$1([string(), object({ $secretClear: literal(true) })]).optional(),
48197
48205
  redirectUri: string().optional(),
48198
48206
  scopes: string().optional(),
48199
48207
  usernameClaim: _enum([
@@ -48360,6 +48368,18 @@ Object.freeze({
48360
48368
  reason: "camera sensor mappings not loaded"
48361
48369
  });
48362
48370
  /**
48371
+ * What the vision model must answer before a package event is emitted
48372
+ * when a packages rule has "Confirm with the LLM" on.
48373
+ *
48374
+ * `package` is the verdict. `confidence` is 0..1. `reason` is the model's
48375
+ * one-line explanation, stored on the event so a drop is not silent.
48376
+ */
48377
+ var PackageLlmVerdictSchema = object({
48378
+ package: boolean(),
48379
+ confidence: number().min(0).max(1),
48380
+ reason: string().min(1)
48381
+ });
48382
+ /**
48363
48383
  * A model choice has a SCOPE, and a scope change has a workflow.
48364
48384
  *
48365
48385
  * ## The two scopes
@@ -48836,7 +48856,7 @@ var TrackFlagsSchema = object({
48836
48856
  * `trained` without a re-fetch. */
48837
48857
  retrainStatus: RetrainStatusSchema
48838
48858
  });
48839
- union([literal(1), literal(2)]);
48859
+ union$1([literal(1), literal(2)]);
48840
48860
  /**
48841
48861
  * WHO decided a label, and when. Carried per tier so a value can be traced to
48842
48862
  * the step and model that produced it — which is what makes the write rule
@@ -49343,6 +49363,21 @@ var ObjectEventSchema = object({
49343
49363
  * pick-up written before D684 — UNKNOWN, never 0 and never `timestamp`.
49344
49364
  */
49345
49365
  observedAt: number().optional(),
49366
+ /**
49367
+ * The delivery was emitted without a vision-model yes (D931).
49368
+ *
49369
+ * Set only when the packages rule asked for an LLM confirm and the model
49370
+ * was unreachable, timed out, or answered something that did not parse.
49371
+ * A notification reads it so it can say "possible" instead of a definite
49372
+ * delivery. Absent on every other row, and on a confirm that said yes.
49373
+ */
49374
+ packagePossible: boolean().optional(),
49375
+ /**
49376
+ * The vision model's verdict, when a packages rule asked for one and the
49377
+ * model answered the schema (D931). A "no" never becomes a row — the
49378
+ * detector drops it and logs the reason. Present on a yes.
49379
+ */
49380
+ packageLlmVerdict: PackageLlmVerdictSchema.optional(),
49346
49381
  /** The parent track's key-event importance [0,1], propagated to every object
49347
49382
  * event of the track (so an event row can be sorted by importance without a
49348
49383
  * track join). Absent on legacy rows / before the track was scored. */
@@ -51140,7 +51175,6 @@ var PipelineAddonSchemaSchema = object({
51140
51175
  defaultModelId: string(),
51141
51176
  defaultModelIdByFormat: record(string(), string()).optional(),
51142
51177
  enabledByDefault: boolean().optional(),
51143
- backfillIntoExistingOverrides: boolean().optional(),
51144
51178
  defaultConfidence: number(),
51145
51179
  group: string().optional(),
51146
51180
  configSchema: array(ConfigFieldBridge).readonly().optional()
@@ -51267,7 +51301,6 @@ var AudioTestResultSchema = object({
51267
51301
  error: string().optional(),
51268
51302
  frame: custom().optional()
51269
51303
  });
51270
- var PipelineConfigBridge = custom();
51271
51304
  var ConfigUISchemaBridge = custom();
51272
51305
  var ConfigUISchemaNullableBridge = custom();
51273
51306
  var InferenceCapabilitiesBridge = custom();
@@ -51292,7 +51325,6 @@ var pipelineExecutorCapability = {
51292
51325
  methods: {
51293
51326
  getAvailableEngines: method(_void(), array(PipelineEngineChoiceSchema)),
51294
51327
  getSelectedEngine: method(_void(), PipelineEngineChoiceSchema),
51295
- getDefaultSteps: method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)),
51296
51328
  /**
51297
51329
  * Per-node detection-engine provisioning snapshot. Returns the live
51298
51330
  * state of the lazy runtime-provisioning machine on `nodeId`
@@ -51314,54 +51346,6 @@ var pipelineExecutorCapability = {
51314
51346
  auth: "admin"
51315
51347
  }),
51316
51348
  /**
51317
- * Clear THIS node's executor-side PER-DEVICE settings stores (the
51318
- * per-camera step overrides the object-detection root reads via
51319
- * `applyDeviceOverridesToTree`). `nodeId` is the ROUTING key — the
51320
- * generated cap-router strips it (default `nodeIdMode: 'routing'`) and
51321
- * dispatches to that node, so the provider method runs ON the target
51322
- * node and receives no `nodeId`.
51323
- *
51324
- * This is the slimmed executor leg of the orchestrator's
51325
- * `resetNodePipelineDefaults` flow (which owns the real reset: node
51326
- * addonDefaults pins + per-camera orchestrator overrides). The legacy
51327
- * `resetToDefault` — which reset a persisted global step-tree seed
51328
- * nothing in the live per-camera path read — was removed together with
51329
- * that seed.
51330
- */
51331
- clearDeviceOverrides: method(object({ nodeId: string() }), object({
51332
- success: literal(true),
51333
- clearedDevices: number()
51334
- }), {
51335
- kind: "mutation",
51336
- auth: "admin"
51337
- }),
51338
- /**
51339
- * Auto tune (D745): the MODEL-BOUND thresholds (`bindsToModel` keys of
51340
- * the object-detection root, and their binding keys) stored in THIS node's
51341
- * per-camera detector settings — and, unless `dryRun`, remove them so the
51342
- * running model's own defaults apply. Every other key of a camera's store
51343
- * is kept. `nodeId` is the ROUTING key. `deviceIds` absent ⇒ every camera
51344
- * with a store. A camera whose store could not be read is `refused`, never
51345
- * reported as clean.
51346
- */
51347
- clearModelBoundDeviceOverrides: method(object({
51348
- nodeId: string(),
51349
- deviceIds: array(number()).readonly().optional(),
51350
- dryRun: boolean()
51351
- }), object({
51352
- entries: array(object({
51353
- deviceId: number(),
51354
- keys: array(string()).readonly()
51355
- })).readonly(),
51356
- refused: array(object({
51357
- deviceId: number(),
51358
- reason: string()
51359
- })).readonly()
51360
- }), {
51361
- kind: "mutation",
51362
- auth: "admin"
51363
- }),
51364
- /**
51365
51349
  * Which of THIS node's inference devices the executor currently refuses,
51366
51350
  * and why. `nodeId` is the ROUTING key (stripped by the generated router).
51367
51351
  *
@@ -51416,8 +51400,6 @@ var pipelineExecutorCapability = {
51416
51400
  auth: "admin"
51417
51401
  }),
51418
51402
  getSchema: method(_void(), PipelineSchemaSchema),
51419
- getGlobalSteps: method(_void(), array(PipelineDefaultStepSchema).readonly().nullable()),
51420
- getGlobalPipelineConfig: method(_void(), PipelineConfigBridge),
51421
51403
  getOrchestratorConfigSchema: method(_void(), ConfigUISchemaBridge),
51422
51404
  /**
51423
51405
  * Gate B (pre-init config-correctness gate). PURE COMPUTE against this
@@ -51776,11 +51758,18 @@ var KeptReasonSchema = _enum(["custom-pin"]);
51776
51758
  * Where a choice's latency came from (D791): this node's own benchmark
51777
51759
  * result, or the hardware-class table. Measured on the node beats the table.
51778
51760
  */
51779
- var LatencySourceSchema = discriminatedUnion("kind", [object({ kind: literal("table") }), object({
51780
- kind: literal("node-benchmark"),
51781
- resultId: string(),
51782
- measuredAtMs: number()
51783
- })]);
51761
+ var LatencySourceSchema = discriminatedUnion("kind", [
51762
+ object({ kind: literal("table") }),
51763
+ object({
51764
+ kind: literal("node-benchmark"),
51765
+ resultId: string(),
51766
+ measuredAtMs: number()
51767
+ }),
51768
+ object({
51769
+ kind: literal("estimated"),
51770
+ estimatedFrom: HardwareClassIdSchema
51771
+ })
51772
+ ]);
51784
51773
  var DeviceModelChoiceSchema = object({
51785
51774
  modelId: string(),
51786
51775
  p50Ms: number(),
@@ -51788,6 +51777,11 @@ var DeviceModelChoiceSchema = object({
51788
51777
  measured: boolean(),
51789
51778
  /** Absent on a plan from before D791 — read as the table. */
51790
51779
  source: LatencySourceSchema.optional(),
51780
+ /**
51781
+ * The measured class this latency was scaled from (D930). Absent when the
51782
+ * cell is the table or a node benchmark.
51783
+ */
51784
+ estimatedFrom: HardwareClassIdSchema.optional(),
51791
51785
  /** Parallel sessions at the camera rate with the headroom kept free: ⌊fps × (1 − headroom) / camera fps⌋. */
51792
51786
  capacitySessions: number(),
51793
51787
  personRecall: number()
@@ -51827,40 +51821,20 @@ var NodeDeviceChangeSchema = object({
51827
51821
  keys: array(string()).readonly()
51828
51822
  })).readonly()
51829
51823
  });
51830
- var CameraOverrideClearSchema = object({
51831
- deviceId: number(),
51832
- source: _enum(["step-override", "wholesale"]),
51824
+ /**
51825
+ * Every model and model-bound threshold lives on the accelerator that runs it
51826
+ * (D927), so the plan writes node / device entries only — there is no camera
51827
+ * layer for it to clear.
51828
+ */
51829
+ var AutoTuneWarningSchema = discriminatedUnion("kind", [object({
51830
+ kind: literal("custom-pin-kept"),
51833
51831
  nodeId: string(),
51834
- deviceKey: string().nullable(),
51835
- stepId: string(),
51836
- modelIdBefore: string().nullable(),
51837
- keys: array(string()).readonly()
51838
- });
51839
- var DetectorStoreClearSchema = object({
51840
- deviceId: number(),
51841
- keys: array(string()).readonly()
51842
- });
51843
- var AutoTuneWarningSchema = discriminatedUnion("kind", [
51844
- object({
51845
- kind: literal("detector-store-cluster-wide"),
51846
- skippedNodes: array(string()).readonly()
51847
- }),
51848
- object({
51849
- kind: literal("detector-store-unreadable"),
51850
- error: string()
51851
- }),
51852
- object({
51853
- kind: literal("custom-pin-kept"),
51854
- nodeId: string(),
51855
- deviceKey: string().nullable(),
51856
- deviceId: number().nullable(),
51857
- modelId: string()
51858
- }),
51859
- object({
51860
- kind: literal("custom-registry-unreadable"),
51861
- error: string()
51862
- })
51863
- ]);
51832
+ deviceKey: string(),
51833
+ modelId: string()
51834
+ }), object({
51835
+ kind: literal("custom-registry-unreadable"),
51836
+ error: string()
51837
+ })]);
51864
51838
  var AutoTuneOptionsSchema = object({
51865
51839
  /** Share of each accelerator's throughput kept free (0.3–0.5). */
51866
51840
  headroom: number().min(.3).max(.5).default(.4),
@@ -51882,8 +51856,6 @@ var AutoTunePlanSchema = object({
51882
51856
  generatedAt: number(),
51883
51857
  nodes: array(NodeRecommendationSchema).readonly(),
51884
51858
  nodeChanges: array(NodeDeviceChangeSchema).readonly(),
51885
- cameraClears: array(CameraOverrideClearSchema).readonly(),
51886
- detectorStoreClears: array(DetectorStoreClearSchema).readonly(),
51887
51859
  warnings: array(AutoTuneWarningSchema).readonly()
51888
51860
  });
51889
51861
  var AutoTuneApplyInputSchema = object({
@@ -51894,8 +51866,6 @@ var AutoTuneApplyInputSchema = object({
51894
51866
  var AutoTunePhaseResultSchema = object({
51895
51867
  phase: _enum([
51896
51868
  "download",
51897
- "camera-overrides",
51898
- "detector-thresholds",
51899
51869
  "node-models",
51900
51870
  "redispatch"
51901
51871
  ]),
@@ -52713,7 +52683,7 @@ var DetailResultSchema = object({
52713
52683
  * stops enriching rather than guessing, which is why addon-pipeline is
52714
52684
  * deployed BEFORE addon-post-analysis.
52715
52685
  */
52716
- labelTier: union([literal(1), literal(2)]).optional(),
52686
+ labelTier: union$1([literal(1), literal(2)]).optional(),
52717
52687
  /** Model that produced `label` — carried into the tier's attribution. */
52718
52688
  labelModelId: string().optional(),
52719
52689
  alignedCropJpeg: string().optional(),
@@ -53812,6 +53782,12 @@ var AgentPipelineSettingsSchema = object({
53812
53782
  /** Hub-persisted UI colour (`--color-node-*` theme tokens). */
53813
53783
  color: NodeColorIdSchema.optional(),
53814
53784
  /**
53785
+ * NODE-wide step settings (D927): `stepId → { key → value }`, applied on
53786
+ * every accelerator of the node under the device's own settings. Never a
53787
+ * model or a model-bound threshold. Written by `setNodeStepSettings`.
53788
+ */
53789
+ stepSettings: record(string(), record(string(), unknown()).readonly()).optional(),
53790
+ /**
53815
53791
  * Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
53816
53792
  * weight, steps}. Absent / all-disabled ⇒ the node's single default
53817
53793
  * accelerator (safe default); two+ enabled ⇒ the dispatcher balances
@@ -53827,17 +53803,6 @@ var AgentPipelineSettingsSchema = object({
53827
53803
  steps: record(string(), DeviceStepConfigSchema).optional()
53828
53804
  })).optional()
53829
53805
  });
53830
- var CameraPipelineForAgentSchema = object({
53831
- steps: array(PipelineStepInputSchema).readonly(),
53832
- audio: object({
53833
- modelId: string(),
53834
- enabled: boolean()
53835
- }).nullable()
53836
- });
53837
- var CameraStepOverridePatchSchema = object({
53838
- modelId: string().optional(),
53839
- settings: record(string(), unknown()).readonly().optional()
53840
- });
53841
53806
  var CameraStepSettingsSchema = record(string(), record(string(), unknown()).readonly());
53842
53807
  /** The three root-detector choices a camera has (D507: at most one root). */
53843
53808
  var CameraDetectionSourceSchema = _enum([
@@ -53847,9 +53812,7 @@ var CameraDetectionSourceSchema = _enum([
53847
53812
  ]);
53848
53813
  var CameraPipelineSettingsSchema = object({
53849
53814
  stepToggles: record(string(), boolean()).optional(),
53850
- stepSettings: CameraStepSettingsSchema.optional(),
53851
- stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
53852
- pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
53815
+ stepSettings: CameraStepSettingsSchema.optional()
53853
53816
  });
53854
53817
  /**
53855
53818
  * Pipeline placement record persisted by `addon-pipeline-orchestrator` via
@@ -54395,6 +54358,13 @@ method(object({
54395
54358
  }), object({ success: literal(true) }), {
54396
54359
  kind: "mutation",
54397
54360
  auth: "admin"
54361
+ }), method(object({
54362
+ agentNodeId: string(),
54363
+ addonId: string(),
54364
+ settings: record(string(), unknown()).nullable()
54365
+ }), object({ success: literal(true) }), {
54366
+ kind: "mutation",
54367
+ auth: "admin"
54398
54368
  }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({
54399
54369
  agentNodeId: string(),
54400
54370
  deviceKey: string()
@@ -54404,9 +54374,7 @@ method(object({
54404
54374
  }), method(object({ agentNodeId: string() }), object({
54405
54375
  success: literal(true),
54406
54376
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
54407
- effectiveModelId: string().nullable(),
54408
- /** Number of cameras whose node-scoped overrides were cleared. */
54409
- clearedCameraOverrides: number()
54377
+ effectiveModelId: string().nullable()
54410
54378
  }), {
54411
54379
  kind: "mutation",
54412
54380
  auth: "admin"
@@ -54461,15 +54429,6 @@ method(object({
54461
54429
  }), object({ success: literal(true) }), {
54462
54430
  kind: "mutation",
54463
54431
  auth: "admin"
54464
- }), method(object({ deviceId: number() }), record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).nullable()), method(object({
54465
- deviceId: number(),
54466
- agentNodeId: string(),
54467
- deviceKey: string(),
54468
- addonId: string(),
54469
- patch: CameraStepOverridePatchSchema.nullable()
54470
- }), object({ success: literal(true) }), {
54471
- kind: "mutation",
54472
- auth: "admin"
54473
54432
  }), method(object({
54474
54433
  deviceId: number(),
54475
54434
  addonId: string(),
@@ -54477,13 +54436,6 @@ method(object({
54477
54436
  }), object({ success: literal(true) }), {
54478
54437
  kind: "mutation",
54479
54438
  auth: "admin"
54480
- }), method(object({
54481
- deviceId: number(),
54482
- agentNodeId: string(),
54483
- pipeline: CameraPipelineForAgentSchema.nullable()
54484
- }), object({ success: literal(true) }), {
54485
- kind: "mutation",
54486
- auth: "admin"
54487
54439
  }), method(object({
54488
54440
  deviceId: number(),
54489
54441
  agentNodeId: string().optional()
@@ -54931,7 +54883,7 @@ method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), S
54931
54883
  */
54932
54884
  var EmailAddressSchema = email();
54933
54885
  var SendEmailInputSchema = object({
54934
- to: union([EmailAddressSchema, array(EmailAddressSchema).min(1)]),
54886
+ to: union$1([EmailAddressSchema, array(EmailAddressSchema).min(1)]),
54935
54887
  cc: array(EmailAddressSchema).optional(),
54936
54888
  bcc: array(EmailAddressSchema).optional(),
54937
54889
  /** RFC 5322 `From` field. Most relays will reject if the domain
@@ -55152,7 +55104,7 @@ var SsoBridgeClaimsSchema = object({
55152
55104
  * editing a descriptor must not retroactively extend or shorten a link the
55153
55105
  * operator already consented to.
55154
55106
  */
55155
- refreshTtl: union([number().int().positive(), literal("never")]).optional(),
55107
+ refreshTtl: union$1([number().int().positive(), literal("never")]).optional(),
55156
55108
  /**
55157
55109
  * Opaque handle of a hub-side LINK intent (D782). Set by an OIDC callback
55158
55110
  * that was started from a signed-in user's "Link" button: the finish then
@@ -55199,7 +55151,7 @@ method(object({
55199
55151
  * went through the numeric path would fail at mint time and break
55200
55152
  * linking rather than produce an eternal token.
55201
55153
  */
55202
- ttlSec: union([number().int().positive(), literal("never")]).optional()
55154
+ ttlSec: union$1([number().int().positive(), literal("never")]).optional()
55203
55155
  }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
55204
55156
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
55205
55157
  providerId: string().min(1),
@@ -55767,7 +55719,7 @@ method(_void(), array(TerminalProfileInfoSchema).readonly(), { auth: "admin" }),
55767
55719
  */
55768
55720
  var TurnServerSchema = object({
55769
55721
  /** Single URL or list of URLs (e.g. "turn:turn.example.com:3478?transport=udp"). */
55770
- urls: union([string(), array(string())]),
55722
+ urls: union$1([string(), array(string())]),
55771
55723
  username: string().optional(),
55772
55724
  credential: string().optional()
55773
55725
  });
@@ -55965,7 +55917,7 @@ var VectorMetricSchema = _enum([
55965
55917
  * Callers keep their rich records in their own store and put only the filterable
55966
55918
  * columns here (deviceId, timestamp, className, modelId, …).
55967
55919
  */
55968
- var VectorMetadataSchema = record(string(), union([
55920
+ var VectorMetadataSchema = record(string(), union$1([
55969
55921
  string(),
55970
55922
  number(),
55971
55923
  boolean()
@@ -55978,7 +55930,7 @@ var VectorMetadataSchema = record(string(), union([
55978
55930
  * caller will treat as matches.
55979
55931
  */
55980
55932
  var VectorFilterSchema = object({
55981
- equals: record(string(), union([
55933
+ equals: record(string(), union$1([
55982
55934
  string(),
55983
55935
  number(),
55984
55936
  boolean()
@@ -59142,7 +59094,7 @@ object({
59142
59094
  /** Current value. Numeric kind → number; select/text/datetime → string.
59143
59095
  * Datetime values are ISO 8601 strings (full timestamp, date-only,
59144
59096
  * or time-only — HA accepts all three forms). */
59145
- value: union([number(), string()]),
59097
+ value: union$1([number(), string()]),
59146
59098
  /** Acceptable values when `kind === 'select'`. Empty for other kinds. */
59147
59099
  options: array(string()),
59148
59100
  /** Ms epoch when the slice was last updated. */
@@ -59456,7 +59408,7 @@ object({
59456
59408
  });
59457
59409
  var DeviceIdSchema = number().int().nonnegative();
59458
59410
  /** A value a program option or setting can take. */
59459
- var DishwasherValueSchema = union([
59411
+ var DishwasherValueSchema = union$1([
59460
59412
  boolean(),
59461
59413
  string(),
59462
59414
  number()
@@ -62769,6 +62721,30 @@ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly(
62769
62721
  kind: "mutation",
62770
62722
  auth: "admin"
62771
62723
  });
62724
+ var CORE_ULTRA_265K_IGPU_CLOCK_MHZ = 2e3;
62725
+ var positiveOrNull = number().nullable().transform((value) => value !== null && Number.isFinite(value) && value > 0 ? value : null);
62726
+ var textOrNull = string().nullable().transform((value) => value !== null && value.trim() !== "" ? value : null);
62727
+ var PrecisionGopsSchema = object({
62728
+ int8: positiveOrNull,
62729
+ fp16: positiveOrNull
62730
+ });
62731
+ /** What one accelerator device reported. Every failed query is null. */
62732
+ var AcceleratorComputeSchema = object({
62733
+ deviceKey: string(),
62734
+ fullDeviceName: textOrNull,
62735
+ executionUnits: positiveOrNull,
62736
+ clockMHz: positiveOrNull,
62737
+ gops: PrecisionGopsSchema.nullable(),
62738
+ architecture: textOrNull,
62739
+ npuName: textOrNull,
62740
+ tops: positiveOrNull,
62741
+ vendor: textOrNull,
62742
+ webgpuArchitecture: textOrNull,
62743
+ webgpuDevice: textOrNull,
62744
+ computeUnits: positiveOrNull
62745
+ });
62746
+ object({ accelerators: array(AcceleratorComputeSchema).nullable() });
62747
+ 64 * CORE_ULTRA_265K_IGPU_CLOCK_MHZ;
62772
62748
  var ModelFormatSchema = _enum(MODEL_FORMATS);
62773
62749
  var HwAccelBackendInputSchema = _enum([
62774
62750
  "videotoolbox",
@@ -62882,7 +62858,12 @@ var HardwareInfoSchema = object({
62882
62858
  availableRAM_MB: number(),
62883
62859
  gpu: GpuInfoSchema.nullable(),
62884
62860
  npu: NpuInfoSchema.nullable(),
62885
- coral: CoralInfoSchema.nullable().optional()
62861
+ coral: CoralInfoSchema.nullable().optional(),
62862
+ /**
62863
+ * Per-accelerator compute (D930). Omitted by a node that has not probed it.
62864
+ * `null` fields inside an entry are a failed query, never a zero.
62865
+ */
62866
+ accelerators: array(AcceleratorComputeSchema).readonly().optional()
62886
62867
  });
62887
62868
  var PlatformScoreSchema = object({
62888
62869
  runtime: literal("python"),
@@ -65778,7 +65759,20 @@ var ZoneRuleSchema = object({
65778
65759
  * Defaults to `true` so operators creating a rule via the UI
65779
65760
  * see it active immediately.
65780
65761
  */
65781
- enabled: boolean().default(true)
65762
+ enabled: boolean().default(true),
65763
+ /**
65764
+ * Package stage only. When true, a package candidate may open from a
65765
+ * scene difference in this rule's zone after a person leaves. The
65766
+ * package model, when it boxes something overlapping, is extra evidence
65767
+ * and is not the gate. Absent or false keeps today's model path.
65768
+ */
65769
+ detectBySceneDifference: boolean().optional(),
65770
+ /**
65771
+ * Package stage only. When true, a promoted package is shown to the
65772
+ * `llm` cap before the delivery event is emitted. Absent or false emits
65773
+ * as today. Usable with or without `detectBySceneDifference`.
65774
+ */
65775
+ confirmWithLlm: boolean().optional()
65782
65776
  });
65783
65777
  array(ZoneRuleSchema).readonly();
65784
65778
  object({
@@ -66590,8 +66584,8 @@ var UserSummarySchema = object({
66590
66584
  id: string(),
66591
66585
  username: string(),
66592
66586
  isAdmin: boolean().default(false),
66593
- allowedProviders: union([array(string()), literal("*")]),
66594
- allowedDevices: record(string(), union([array(string()), literal("*")])),
66587
+ allowedProviders: union$1([array(string()), literal("*")]),
66588
+ allowedDevices: record(string(), union$1([array(string()), literal("*")])),
66595
66589
  /** Capability rows, or ONE viewer row (D921) — see `UserScopeSchema`. */
66596
66590
  scopes: array(UserScopeSchema).default([]),
66597
66591
  /**
@@ -66608,15 +66602,15 @@ var CreateUserInputSchema = object({
66608
66602
  username: string(),
66609
66603
  password: string().min(6),
66610
66604
  isAdmin: boolean().default(false),
66611
- allowedProviders: union([array(string()), literal("*")]).optional(),
66612
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
66605
+ allowedProviders: union$1([array(string()), literal("*")]).optional(),
66606
+ allowedDevices: record(string(), union$1([array(string()), literal("*")])).optional(),
66613
66607
  scopes: array(UserScopeSchema).optional()
66614
66608
  });
66615
66609
  var UpdateUserInputSchema = object({
66616
66610
  id: string(),
66617
66611
  isAdmin: boolean().optional(),
66618
- allowedProviders: union([array(string()), literal("*")]).optional(),
66619
- allowedDevices: record(string(), union([array(string()), literal("*")])).optional(),
66612
+ allowedProviders: union$1([array(string()), literal("*")]).optional(),
66613
+ allowedDevices: record(string(), union$1([array(string()), literal("*")])).optional(),
66620
66614
  scopes: array(UserScopeSchema).optional()
66621
66615
  });
66622
66616
  var OauthSessionSummarySchema = object({
@@ -66735,7 +66729,7 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
66735
66729
  * From `OauthIntegrationDescriptor.refreshTokenTtlSec`. Baked into the
66736
66730
  * code so the link carries its own lifetime; omit for the 30-day
66737
66731
  * default. */
66738
- refreshTtlSec: union([number().int().positive(), literal("never")]).optional()
66732
+ refreshTtlSec: union$1([number().int().positive(), literal("never")]).optional()
66739
66733
  }), object({ code: string() }), {
66740
66734
  kind: "mutation",
66741
66735
  access: "create"
@@ -67225,7 +67219,7 @@ var TrainingProviderUpdateEntryInputSchema = object({
67225
67219
  entryId: string().min(1),
67226
67220
  name: string().min(1),
67227
67221
  tokenId: string().optional(),
67228
- tokenSecret: union([string(), object({ $secretClear: literal(true) })]).optional(),
67222
+ tokenSecret: union$1([string(), object({ $secretClear: literal(true) })]).optional(),
67229
67223
  environment: string().optional(),
67230
67224
  gpuType: string().optional(),
67231
67225
  region: string().optional(),
@@ -67388,7 +67382,7 @@ method(object({}), array(TrainingProviderDescriptorSchema).readonly(), { auth: "
67388
67382
  * - **Jobs.** A persisted state machine, a reconcile loop against the
67389
67383
  * provider, a cost guard, a daily orphan sweep and the retention rules.
67390
67384
  * - **The return flow.** Verified artefacts → Model Studio
67391
- * (`custom-model-registry.importModelBundle`) → canary on cameras →
67385
+ * (`custom-model-registry.importModelBundle`) → canary on accelerators →
67392
67386
  * rollback. Nothing is ever registered automatically.
67393
67387
  *
67394
67388
  * Plan/start takes a live {@link TrainingCorpusSelection} (collections +
@@ -67525,20 +67519,24 @@ var TrainingProgressPointSchema = object({
67525
67519
  map50: number().nullable(),
67526
67520
  map50_95: number().nullable()
67527
67521
  });
67522
+ /** One accelerator: a `(node, inference device)` that runs the root detector. */
67523
+ var TrainingAcceleratorRefSchema = object({
67524
+ nodeId: string(),
67525
+ deviceKey: string()
67526
+ });
67527
+ /**
67528
+ * A canary pins the registered model on chosen ACCELERATORS — a model is
67529
+ * chosen by the accelerator that runs it (D927); every camera balanced onto
67530
+ * one runs it. `previous` is the root-detector pin each one had (`null` = it
67531
+ * ran its default), exactly, so rollback restores it.
67532
+ */
67528
67533
  var TrainingCanarySchema = object({
67529
- deviceIds: array(number().int()).readonly(),
67534
+ accelerators: array(TrainingAcceleratorRefSchema).readonly(),
67530
67535
  since: number(),
67531
- /** Every override the canary replaced, exactly, so rollback restores it. */
67532
- previous: array(object({
67533
- deviceId: number().int(),
67534
- nodeId: string(),
67535
- deviceKey: string(),
67536
- patch: object({
67537
- modelId: string().optional(),
67538
- settings: record(string(), unknown()).readonly().optional()
67539
- }).nullable()
67540
- })).readonly()
67536
+ previous: array(TrainingAcceleratorRefSchema.extend({ modelId: string().nullable() })).readonly()
67541
67537
  });
67538
+ /** An accelerator a canary may pin: it runs the root detector, on this model now. */
67539
+ var TrainingCanaryTargetSchema = TrainingAcceleratorRefSchema.extend({ pinnedModelId: string().nullable() });
67542
67540
  var TrainingJobSchema = object({
67543
67541
  id: string(),
67544
67542
  idempotencyKey: string(),
@@ -67650,11 +67648,11 @@ method(object({}), array(TrainingBaseModelSchema).readonly(), { auth: "admin" })
67650
67648
  kind: "mutation",
67651
67649
  auth: "admin",
67652
67650
  timeoutMs: 12e4
67653
- }), method(IdInput, TrainingResultSchema.nullable(), { auth: "admin" }), method(IdInput.extend({ canaryDeviceIds: array(number().int()).readonly() }), TrainingJobSchema, {
67651
+ }), method(IdInput, TrainingResultSchema.nullable(), { auth: "admin" }), method(_void(), array(TrainingCanaryTargetSchema).readonly(), { auth: "admin" }), method(IdInput.extend({ canaryAccelerators: array(TrainingAcceleratorRefSchema).readonly() }), TrainingJobSchema, {
67654
67652
  kind: "mutation",
67655
67653
  auth: "admin",
67656
67654
  timeoutMs: 30 * 6e4
67657
- }), method(IdInput.extend({ deviceIds: array(number().int()).min(1).readonly() }), TrainingJobSchema, {
67655
+ }), method(IdInput.extend({ accelerators: array(TrainingAcceleratorRefSchema).min(1).readonly() }), TrainingJobSchema, {
67658
67656
  kind: "mutation",
67659
67657
  auth: "admin",
67660
67658
  timeoutMs: 12e4
@@ -73643,20 +73641,6 @@ Object.freeze({
73643
73641
  access: "create",
73644
73642
  role: "admin"
73645
73643
  },
73646
- "pipelineExecutor.clearDeviceOverrides": {
73647
- capName: "pipeline-executor",
73648
- capScope: "system",
73649
- addonId: null,
73650
- access: "delete",
73651
- role: "admin"
73652
- },
73653
- "pipelineExecutor.clearModelBoundDeviceOverrides": {
73654
- capName: "pipeline-executor",
73655
- capScope: "system",
73656
- addonId: null,
73657
- access: "delete",
73658
- role: "admin"
73659
- },
73660
73644
  "pipelineExecutor.deleteModel": {
73661
73645
  capName: "pipeline-executor",
73662
73646
  capScope: "system",
@@ -73699,13 +73683,6 @@ Object.freeze({
73699
73683
  access: "view",
73700
73684
  role: "admin"
73701
73685
  },
73702
- "pipelineExecutor.getDefaultSteps": {
73703
- capName: "pipeline-executor",
73704
- capScope: "system",
73705
- addonId: null,
73706
- access: "view",
73707
- role: "admin"
73708
- },
73709
73686
  "pipelineExecutor.getDetectionConfigSchema": {
73710
73687
  capName: "pipeline-executor",
73711
73688
  capScope: "system",
@@ -73727,20 +73704,6 @@ Object.freeze({
73727
73704
  access: "view",
73728
73705
  role: "admin"
73729
73706
  },
73730
- "pipelineExecutor.getGlobalPipelineConfig": {
73731
- capName: "pipeline-executor",
73732
- capScope: "system",
73733
- addonId: null,
73734
- access: "view",
73735
- role: "admin"
73736
- },
73737
- "pipelineExecutor.getGlobalSteps": {
73738
- capName: "pipeline-executor",
73739
- capScope: "system",
73740
- addonId: null,
73741
- access: "view",
73742
- role: "admin"
73743
- },
73744
73707
  "pipelineExecutor.getInferenceDeviceHealth": {
73745
73708
  capName: "pipeline-executor",
73746
73709
  capScope: "system",
@@ -74000,13 +73963,6 @@ Object.freeze({
74000
73963
  access: "view",
74001
73964
  role: "admin"
74002
73965
  },
74003
- "pipelineOrchestrator.getCameraStepOverrides": {
74004
- capName: "pipeline-orchestrator",
74005
- capScope: "system",
74006
- addonId: null,
74007
- access: "view",
74008
- role: "admin"
74009
- },
74010
73966
  "pipelineOrchestrator.getCameraSwitches": {
74011
73967
  capName: "pipeline-orchestrator",
74012
73968
  capScope: "system",
@@ -74245,13 +74201,6 @@ Object.freeze({
74245
74201
  access: "create",
74246
74202
  role: "admin"
74247
74203
  },
74248
- "pipelineOrchestrator.setCameraPipelineForAgent": {
74249
- capName: "pipeline-orchestrator",
74250
- capScope: "system",
74251
- addonId: null,
74252
- access: "create",
74253
- role: "admin"
74254
- },
74255
74204
  "pipelineOrchestrator.setCameraSensors": {
74256
74205
  capName: "pipeline-orchestrator",
74257
74206
  capScope: "system",
@@ -74259,42 +74208,42 @@ Object.freeze({
74259
74208
  access: "create",
74260
74209
  role: "admin"
74261
74210
  },
74262
- "pipelineOrchestrator.setCameraStepOverride": {
74211
+ "pipelineOrchestrator.setCameraStepSettings": {
74263
74212
  capName: "pipeline-orchestrator",
74264
74213
  capScope: "system",
74265
74214
  addonId: null,
74266
74215
  access: "create",
74267
74216
  role: "admin"
74268
74217
  },
74269
- "pipelineOrchestrator.setCameraStepSettings": {
74218
+ "pipelineOrchestrator.setCameraStepToggle": {
74270
74219
  capName: "pipeline-orchestrator",
74271
74220
  capScope: "system",
74272
74221
  addonId: null,
74273
74222
  access: "create",
74274
74223
  role: "admin"
74275
74224
  },
74276
- "pipelineOrchestrator.setCameraStepToggle": {
74225
+ "pipelineOrchestrator.setCameraSwitch": {
74277
74226
  capName: "pipeline-orchestrator",
74278
74227
  capScope: "system",
74279
74228
  addonId: null,
74280
74229
  access: "create",
74281
74230
  role: "admin"
74282
74231
  },
74283
- "pipelineOrchestrator.setCameraSwitch": {
74232
+ "pipelineOrchestrator.setCapabilityBinding": {
74284
74233
  capName: "pipeline-orchestrator",
74285
74234
  capScope: "system",
74286
74235
  addonId: null,
74287
74236
  access: "create",
74288
74237
  role: "admin"
74289
74238
  },
74290
- "pipelineOrchestrator.setCapabilityBinding": {
74239
+ "pipelineOrchestrator.setLoadBalancingShares": {
74291
74240
  capName: "pipeline-orchestrator",
74292
74241
  capScope: "system",
74293
74242
  addonId: null,
74294
74243
  access: "create",
74295
74244
  role: "admin"
74296
74245
  },
74297
- "pipelineOrchestrator.setLoadBalancingShares": {
74246
+ "pipelineOrchestrator.setNodeStepSettings": {
74298
74247
  capName: "pipeline-orchestrator",
74299
74248
  capScope: "system",
74300
74249
  addonId: null,
@@ -76653,6 +76602,13 @@ Object.freeze({
76653
76602
  access: "view",
76654
76603
  role: "admin"
76655
76604
  },
76605
+ "training.listCanaryTargets": {
76606
+ capName: "training",
76607
+ capScope: "system",
76608
+ addonId: null,
76609
+ access: "view",
76610
+ role: "admin"
76611
+ },
76656
76612
  "training.listJobs": {
76657
76613
  capName: "training",
76658
76614
  capScope: "system",
@@ -83039,11 +82995,6 @@ Object.freeze({
83039
82995
  form: "single",
83040
82996
  optional: false
83041
82997
  }],
83042
- "pipelineExecutor.clearModelBoundDeviceOverrides": [{
83043
- name: "deviceIds",
83044
- form: "array",
83045
- optional: true
83046
- }],
83047
82998
  "pipelineExecutor.runPipeline": [{
83048
82999
  name: "deviceId",
83049
83000
  form: "single",
@@ -83099,11 +83050,6 @@ Object.freeze({
83099
83050
  form: "array",
83100
83051
  optional: true
83101
83052
  }],
83102
- "pipelineOrchestrator.getCameraStepOverrides": [{
83103
- name: "deviceId",
83104
- form: "single",
83105
- optional: false
83106
- }],
83107
83053
  "pipelineOrchestrator.getCameraSwitches": [{
83108
83054
  name: "deviceId",
83109
83055
  form: "single",
@@ -83144,21 +83090,11 @@ Object.freeze({
83144
83090
  form: "single",
83145
83091
  optional: false
83146
83092
  }],
83147
- "pipelineOrchestrator.setCameraPipelineForAgent": [{
83148
- name: "deviceId",
83149
- form: "single",
83150
- optional: false
83151
- }],
83152
83093
  "pipelineOrchestrator.setCameraSensors": [{
83153
83094
  name: "deviceId",
83154
83095
  form: "single",
83155
83096
  optional: false
83156
83097
  }],
83157
- "pipelineOrchestrator.setCameraStepOverride": [{
83158
- name: "deviceId",
83159
- form: "single",
83160
- optional: false
83161
- }],
83162
83098
  "pipelineOrchestrator.setCameraStepSettings": [{
83163
83099
  name: "deviceId",
83164
83100
  form: "single",
@@ -83836,11 +83772,6 @@ Object.freeze({
83836
83772
  form: "single",
83837
83773
  optional: false
83838
83774
  }],
83839
- "training.canaryResult": [{
83840
- name: "deviceIds",
83841
- form: "array",
83842
- optional: false
83843
- }],
83844
83775
  "update.getStatus": [{
83845
83776
  name: "deviceId",
83846
83777
  form: "single",
@@ -85373,6 +85304,430 @@ function buildBenchStepTree(schema, rootModelId, enabledStepIds) {
85373
85304
  ]
85374
85305
  }];
85375
85306
  }
85307
+ /** The object-detection step id — the first-level detector both recipes run. */
85308
+ var OBJECT_DETECTION_STEP_ID = "object-detection";
85309
+ /** Motion regions older than this describe a different frame. */
85310
+ var RECOVERY_MOTION_MAX_AGE_MS = 2e3;
85311
+ /** Area of a normalised rectangle, never negative. Shared with the D396 recipe. */
85312
+ function normalizedArea(r) {
85313
+ return Math.max(0, r.w) * Math.max(0, r.h);
85314
+ }
85315
+ var area = normalizedArea;
85316
+ function intersection(a, b) {
85317
+ return Math.max(0, Math.min(a.x + a.w, b.x + b.w) - Math.max(a.x, b.x)) * Math.max(0, Math.min(a.y + a.h, b.y + b.h) - Math.max(a.y, b.y));
85318
+ }
85319
+ /**
85320
+ * Share of `region` not covered by any detection box. The sum of pairwise
85321
+ * intersections over-counts where detections overlap each other, which only
85322
+ * makes the pass MORE conservative; clipped at 1.
85323
+ */
85324
+ function uncoveredFraction(region, detections) {
85325
+ const regionArea = area(region);
85326
+ if (regionArea <= 0) return 0;
85327
+ let covered = 0;
85328
+ for (const detection of detections) covered += intersection(region, detection);
85329
+ return 1 - Math.min(1, covered / regionArea);
85330
+ }
85331
+ /**
85332
+ * THE square-placement rule of this pass — one owner, shared by both recipes.
85333
+ *
85334
+ * A crop is a square of `side` native pixels centred where it can be and slid
85335
+ * inside the frame where it cannot. Both region rules place their squares
85336
+ * through this function so a crop means the same rectangle whichever rule
85337
+ * chose the region.
85338
+ */
85339
+ function squareAround(centreX, centreY, side, native) {
85340
+ return {
85341
+ left: Math.round(Math.max(0, Math.min(native.width - side, centreX - side / 2))),
85342
+ top: Math.round(Math.max(0, Math.min(native.height - side, centreY - side / 2))),
85343
+ side
85344
+ };
85345
+ }
85346
+ function contains(crop, x, y) {
85347
+ return x >= crop.left && x <= crop.left + crop.side && y >= crop.top && y <= crop.top + crop.side;
85348
+ }
85349
+ /**
85350
+ * Squares for one region: one when it fits the largest side, otherwise up to
85351
+ * two tiles along its longer axis (a person-sized blob with something small
85352
+ * at either end). The padded region decides the side, never the frame.
85353
+ */
85354
+ function cropsForRegion(region, native) {
85355
+ const widthPx = region.w * native.width;
85356
+ const heightPx = region.h * native.height;
85357
+ const longest = Math.max(widthPx, heightPx);
85358
+ const padded = longest * 1.5;
85359
+ const side = Math.round(Math.min(Math.max(padded, 640), 800));
85360
+ const centreX = (region.x + region.w / 2) * native.width;
85361
+ const centreY = (region.y + region.h / 2) * native.height;
85362
+ if (padded <= 800) return [squareAround(centreX, centreY, side, native)];
85363
+ const alongX = widthPx >= heightPx;
85364
+ const quarter = longest / 4;
85365
+ return [squareAround(alongX ? centreX - quarter : centreX, alongX ? centreY : centreY - quarter, side, native), squareAround(alongX ? centreX + quarter : centreX, alongX ? centreY : centreY + quarter, side, native)];
85366
+ }
85367
+ /**
85368
+ * The ONE place the two region gates are decided. `planRecoveryCrops` filters
85369
+ * on it and {@link countRecoverySkips} counts it, so the report can never
85370
+ * describe a gate the planner does not actually apply.
85371
+ */
85372
+ function classifyRegion(region, uncovered) {
85373
+ if (area(region) > .25) return "too-large";
85374
+ if (uncovered < .35) return "covered";
85375
+ return "eligible";
85376
+ }
85377
+ /**
85378
+ * WHY A FRAME PLANNED NO CROP, AS A NUMBER (D378).
85379
+ *
85380
+ * The pass report counts the passes that RAN, so "the second pass stops running
85381
+ * when a person is beside the dog" — a plausible reading of
85382
+ * {@link RECOVERY_MAX_REGION_FRAME_FRACTION} and
85383
+ * {@link RECOVERY_MIN_UNCOVERED_FRACTION}, and a live hypothesis on camera 615
85384
+ * — could not be confirmed or killed from the logs at all. This classifies the
85385
+ * regions a frame offered, against the same predicate the planner filters on.
85386
+ */
85387
+ function countRecoverySkips(input) {
85388
+ let tooLarge = 0;
85389
+ let covered = 0;
85390
+ let eligible = 0;
85391
+ for (const region of input.regions) switch (classifyRegion(region, uncoveredFraction(region, input.detections))) {
85392
+ case "too-large":
85393
+ tooLarge += 1;
85394
+ break;
85395
+ case "covered":
85396
+ covered += 1;
85397
+ break;
85398
+ case "eligible":
85399
+ eligible += 1;
85400
+ break;
85401
+ }
85402
+ return {
85403
+ tooLarge,
85404
+ covered,
85405
+ eligible
85406
+ };
85407
+ }
85408
+ function planRecoveryCrops(input) {
85409
+ const { native } = input;
85410
+ if (Math.min(native.width, native.height) < 640) return [];
85411
+ const ranked = input.regions.map((region) => ({
85412
+ region,
85413
+ uncovered: uncoveredFraction(region, input.detections)
85414
+ })).filter(({ region, uncovered }) => classifyRegion(region, uncovered) === "eligible").toSorted((a, b) => area(b.region) * b.uncovered - area(a.region) * a.uncovered);
85415
+ const planned = [];
85416
+ for (const { region } of ranked) for (const crop of cropsForRegion(region, native)) {
85417
+ if (planned.length >= 2) return planned;
85418
+ const centreX = crop.left + crop.side / 2;
85419
+ const centreY = crop.top + crop.side / 2;
85420
+ if (planned.some((existing) => contains(existing, centreX, centreY))) continue;
85421
+ planned.push(crop);
85422
+ }
85423
+ return planned;
85424
+ }
85425
+ /**
85426
+ * Boxes the executor produced on the crop VIEW → the result's own space.
85427
+ *
85428
+ * Three spaces meet here: the view the model saw (`view`, ≤640 px), the native
85429
+ * square it was cut from (`crop`, native px) and the space the full-frame
85430
+ * result reports in (`result`, native px on the `frameRef` path, the inline
85431
+ * ≤640 view otherwise). A box touching the view edge was clipped by the crop
85432
+ * and is dropped: half a person is not a person, and the tracker would take
85433
+ * the half as the whole.
85434
+ */
85435
+ function remapCropDetections(detections, crop, view, result, native) {
85436
+ const viewToNative = crop.side / Math.max(1, view.width);
85437
+ const nativeToResultX = result.width / Math.max(1, native.width);
85438
+ const nativeToResultY = result.height / Math.max(1, native.height);
85439
+ const out = [];
85440
+ for (const detection of detections) {
85441
+ const { x, y, width, height } = detection.bbox;
85442
+ if (x <= 2 || y <= 2 || x + width >= view.width - 2 || y + height >= view.height - 2) continue;
85443
+ out.push({
85444
+ ...detection,
85445
+ nativeRecovery: {
85446
+ score: detection.score,
85447
+ cropSidePx: crop.side,
85448
+ viewPx: view.width
85449
+ },
85450
+ bbox: {
85451
+ x: (crop.left + x * viewToNative) * nativeToResultX,
85452
+ y: (crop.top + y * viewToNative) * nativeToResultY,
85453
+ width: width * viewToNative * nativeToResultX,
85454
+ height: height * viewToNative * nativeToResultY
85455
+ }
85456
+ });
85457
+ }
85458
+ return out;
85459
+ }
85460
+ function boxIntersection(a, b) {
85461
+ return Math.max(0, Math.min(a.x + a.width, b.x + b.width) - Math.max(a.x, b.x)) * Math.max(0, Math.min(a.y + a.height, b.y + b.height) - Math.max(a.y, b.y));
85462
+ }
85463
+ function sameSubject(recovered, existing) {
85464
+ const inter = boxIntersection(recovered, existing);
85465
+ if (inter <= 0) return false;
85466
+ const areaR = recovered.width * recovered.height;
85467
+ const union = areaR + existing.width * existing.height - inter;
85468
+ if (union > 0 && inter / union >= .5) return true;
85469
+ return areaR > 0 && inter / areaR >= .7;
85470
+ }
85471
+ /**
85472
+ * Class-aware NMS of the recovered boxes against the full-frame ones. Every
85473
+ * full-frame box is kept as it is — the second pass only ADDS. A recovered box
85474
+ * is added when no full-frame box of the same macro class is the same subject
85475
+ * (`RECOVERY_FUSE_IOU`) or contains it (`RECOVERY_FUSE_CONTAINMENT`). Ids are
85476
+ * re-minted so a crop's `d0` cannot collide with the frame's.
85477
+ */
85478
+ function fuseRecoveredDetections(full, recovered) {
85479
+ const accepted = [];
85480
+ for (const [index, candidate] of recovered.entries()) {
85481
+ if ([...full, ...accepted].some((existing) => existing.macroClass === candidate.macroClass && sameSubject(candidate.bbox, existing.bbox))) continue;
85482
+ accepted.push({
85483
+ ...candidate,
85484
+ id: `recovered-${index}-${candidate.id}`
85485
+ });
85486
+ }
85487
+ return [...full, ...accepted];
85488
+ }
85489
+ /**
85490
+ * The step the second pass runs: the enabled first-level object detector of
85491
+ * the camera's own tree, with its own model and no children. Same model as
85492
+ * the full pass so a recovered box is comparable to a full-frame one.
85493
+ */
85494
+ function selectRecoveryStep(steps) {
85495
+ const detector = steps.find((step) => step.addonId === "object-detection" && step.enabled !== false);
85496
+ if (!detector) return null;
85497
+ return {
85498
+ addonId: detector.addonId,
85499
+ ...detector.modelId !== void 0 ? { modelId: detector.modelId } : {},
85500
+ enabled: true
85501
+ };
85502
+ }
85503
+ /**
85504
+ * Read the opt-in. Anything that is not the boolean `true` is the shipped
85505
+ * rule: a stored string or a number is a mis-write (this repo has shipped a
85506
+ * setting written into the wrong sqlite table before), and a mis-write must
85507
+ * not silently change what a camera detects on.
85508
+ */
85509
+ function readRecoveryRecipe(settings) {
85510
+ return settings?.["motionCropDispatch"] === true ? "motion-crop" : "uncovered-region";
85511
+ }
85512
+ /**
85513
+ * The recipe this camera's resolved step tree selects.
85514
+ *
85515
+ * Reads the ENABLED first-level detector's own settings, which is where
85516
+ * `pipelineOrchestrator.setCameraStepSettings` writes a per-camera value. A
85517
+ * tree with no enabled detector runs no second pass at all, so the answer
85518
+ * there is the shipped rule and it is never used.
85519
+ */
85520
+ function readRecoveryRecipeForSteps(steps) {
85521
+ return readRecoveryRecipe(steps.find((step) => step.addonId === "object-detection" && step.enabled !== false)?.settings);
85522
+ }
85523
+ /**
85524
+ * A motion box is grown ×1.5 about its centre before anything else.
85525
+ *
85526
+ * The motion step's box is the CHANGED pixels, which on a moving animal is the
85527
+ * leading edge plus its shadow, not the animal. The detector needs the subject
85528
+ * and the context it was trained on.
85529
+ */
85530
+ var MOTION_CROP_MOTION_PAD = 1.5;
85531
+ /**
85532
+ * An intersecting tracked box is grown ×1.25 — less, because it is already a
85533
+ * subject rectangle rather than a change mask.
85534
+ */
85535
+ var MOTION_CROP_TRACKED_PAD = 1.25;
85536
+ /**
85537
+ * The floor a `person` or `vehicle` box must clear when it came out of a CROP
85538
+ * rather than out of the full frame.
85539
+ *
85540
+ * Collected, not assumed: 3 085 quiet frames produced 27 motion-positive
85541
+ * frames and 28 crop invocations. The full-frame arm produced 0 boxes above
85542
+ * any gate; the crop arm produced 3, of which two are genuine false positives,
85543
+ * and both are night-IR corners upscaled into a 320 model — `vehicle 0.749`
85544
+ * and `person 0.701`. Zero false `animal` at any gate, which is why `animal`
85545
+ * is deliberately absent from this table: the class the pass exists to recover
85546
+ * is the class that never produced a false positive, and gating it would cost
85547
+ * the whole measured gain.
85548
+ *
85549
+ * This is a CROP-ONLY floor, applied on top of the per-macro floors the
85550
+ * executor already enforced. A full-frame `person` at 0.70 is untouched — the
85551
+ * full-frame arm is the one arm with ground truth behind its floor
85552
+ * (`minConfidencePerson` 0.65, raised on 2026-07-30 from a measured
85553
+ * distribution).
85554
+ *
85555
+ * The cost of this floor is stated rather than assumed away: it can also
85556
+ * remove a real distant person or vehicle recovered from a crop at 0.70–0.80.
85557
+ * Nothing in the quiet-footage sample measures that, so the floor is a
85558
+ * constant here rather than a slider, and the runner reports every drop it
85559
+ * makes per camera.
85560
+ */
85561
+ var CROP_CLASS_FLOORS = Object.freeze({
85562
+ person: .8,
85563
+ vehicle: .8
85564
+ });
85565
+ /**
85566
+ * Apply the crop-only class floors, REPORTING every drop.
85567
+ *
85568
+ * A class with no entry in {@link CROP_CLASS_FLOORS} is kept: a floor this
85569
+ * table cannot express is not a floor of zero, and silently dropping a class
85570
+ * nobody measured is the exact shape of silent drop this repo has paid for
85571
+ * three separate times.
85572
+ */
85573
+ function applyCropClassFloors(detections) {
85574
+ const kept = [];
85575
+ const dropped = [];
85576
+ for (const detection of detections) {
85577
+ const floor = CROP_CLASS_FLOORS[detection.macroClass];
85578
+ if (floor !== void 0 && detection.score < floor) {
85579
+ dropped.push({
85580
+ macroClass: detection.macroClass,
85581
+ score: detection.score,
85582
+ floor
85583
+ });
85584
+ continue;
85585
+ }
85586
+ kept.push(detection);
85587
+ }
85588
+ return {
85589
+ kept,
85590
+ dropped
85591
+ };
85592
+ }
85593
+ function scaleAbout(rect, factor) {
85594
+ const w = rect.w * factor;
85595
+ const h = rect.h * factor;
85596
+ return {
85597
+ x: rect.x + rect.w / 2 - w / 2,
85598
+ y: rect.y + rect.h / 2 - h / 2,
85599
+ w,
85600
+ h
85601
+ };
85602
+ }
85603
+ function overlaps(a, b) {
85604
+ return Math.min(a.x + a.w, b.x + b.w) > Math.max(a.x, b.x) && Math.min(a.y + a.h, b.y + b.h) > Math.max(a.y, b.y);
85605
+ }
85606
+ function union(a, b) {
85607
+ const x = Math.min(a.x, b.x);
85608
+ const y = Math.min(a.y, b.y);
85609
+ return {
85610
+ x,
85611
+ y,
85612
+ w: Math.max(a.x + a.w, b.x + b.w) - x,
85613
+ h: Math.max(a.y + a.h, b.y + b.h) - y
85614
+ };
85615
+ }
85616
+ function clampToFrame(rect) {
85617
+ const x = Math.max(0, rect.x);
85618
+ const y = Math.max(0, rect.y);
85619
+ return {
85620
+ x,
85621
+ y,
85622
+ w: Math.min(1, rect.x + rect.w) - x,
85623
+ h: Math.min(1, rect.y + rect.h) - y
85624
+ };
85625
+ }
85626
+ /**
85627
+ * Merge transitively every seed whose padded box overlaps another, and answer
85628
+ * the union rectangles.
85629
+ *
85630
+ * Transitive on purpose: a person, the dog beside them and the dog's shadow
85631
+ * are three components of one subject, and cutting three crops for them spends
85632
+ * two inferences on pixels the first one already showed the detector.
85633
+ */
85634
+ function mergeSeeds(seeds) {
85635
+ const merged = [];
85636
+ for (const seed of seeds) {
85637
+ let current = seed;
85638
+ let changed = true;
85639
+ while (changed) {
85640
+ changed = false;
85641
+ for (let i = merged.length - 1; i >= 0; i -= 1) {
85642
+ const other = merged[i];
85643
+ if (other === void 0 || !overlaps(current, other)) continue;
85644
+ current = union(current, other);
85645
+ merged.splice(i, 1);
85646
+ changed = true;
85647
+ }
85648
+ }
85649
+ merged.push(current);
85650
+ }
85651
+ return merged;
85652
+ }
85653
+ /**
85654
+ * The regions the measured recipe judges this frame on.
85655
+ *
85656
+ * Motion boxes padded {@link MOTION_CROP_MOTION_PAD}; every full-frame box
85657
+ * that intersects a RAW motion box padded {@link MOTION_CROP_TRACKED_PAD} and
85658
+ * added as a seed of its own; everything that overlaps merged; the result
85659
+ * clamped to the frame, ordered largest first and capped at
85660
+ * {@link MOTION_CROP_MAX_REGIONS}.
85661
+ *
85662
+ * There is deliberately no coverage gate and no size gate here. Those belong
85663
+ * to the shipped rule, and they are what makes it a rule about a subject
85664
+ * BESIDE a detected one; the measurement says the pass is worth running on the
85665
+ * detected subject's own region too.
85666
+ */
85667
+ function planMotionCropRegions(input) {
85668
+ if (input.regions.length === 0) return [];
85669
+ const seeds = input.regions.map((r) => scaleAbout(r, MOTION_CROP_MOTION_PAD));
85670
+ for (const detection of input.detections) {
85671
+ if (!input.regions.some((region) => overlaps(detection, region))) continue;
85672
+ seeds.push(scaleAbout(detection, MOTION_CROP_TRACKED_PAD));
85673
+ }
85674
+ return mergeSeeds(seeds).map(clampToFrame).filter((r) => r.w > 0 && r.h > 0).toSorted((a, b) => normalizedArea(b) - normalizedArea(a)).slice(0, 3);
85675
+ }
85676
+ /**
85677
+ * The square the detector is fed for one measured region.
85678
+ *
85679
+ * "Grow to the detector's input aspect ratio without ever shrinking" is a
85680
+ * SQUARE here, and that is a fact about the production detector rather than a
85681
+ * simplification: `yolov9m-320-int8` takes 320×320, as does every hardware
85682
+ * default in the catalog.
85683
+ *
85684
+ * The side is the region's longer side, floored at
85685
+ * {@link RECOVERY_CROP_MIN_SIDE_PX} — the growth is what magnifies the subject
85686
+ * — and ceilinged at {@link RECOVERY_CROP_MAX_SIDE_PX}. The ceiling is NOT a
85687
+ * simplification either: at 1024 px the same 320 model scored the reference
85688
+ * dog 0.52–0.76, and at 1280 px lost it entirely
85689
+ * (`docs/benchmarks/pipeline-frame-model-eval.md`, case `miss-dog-615`). A
85690
+ * region longer than the ceiling is TILED along its longer axis, never zoomed
85691
+ * out.
85692
+ */
85693
+ function motionCropsForRegion(region, native) {
85694
+ const widthPx = region.w * native.width;
85695
+ const heightPx = region.h * native.height;
85696
+ const longest = Math.max(widthPx, heightPx);
85697
+ const side = Math.round(Math.min(Math.max(longest, 640), 800));
85698
+ const centreX = (region.x + region.w / 2) * native.width;
85699
+ const centreY = (region.y + region.h / 2) * native.height;
85700
+ if (longest <= 800) return [squareAround(centreX, centreY, side, native)];
85701
+ const alongX = widthPx >= heightPx;
85702
+ const quarter = longest / 4;
85703
+ return [squareAround(alongX ? centreX - quarter : centreX, alongX ? centreY : centreY - quarter, side, native), squareAround(alongX ? centreX + quarter : centreX, alongX ? centreY : centreY + quarter, side, native)];
85704
+ }
85705
+ /** `true` when `inner` lies entirely inside `outer`. */
85706
+ function cropContains(outer, inner) {
85707
+ return inner.left >= outer.left && inner.top >= outer.top && inner.left + inner.side <= outer.left + outer.side && inner.top + inner.side <= outer.top + outer.side;
85708
+ }
85709
+ /**
85710
+ * The crops the measured recipe runs on this frame.
85711
+ *
85712
+ * Dedupe is by CONTAINMENT only. Two squares that merely overlap both run: the
85713
+ * pixels the second adds are pixels no other crop shows the detector, and the
85714
+ * fusion step downstream already refuses a duplicate BOX. Dropping a crop
85715
+ * because it overlapped would drop the subject sitting at its edge, which is
85716
+ * the whole population this pass exists for.
85717
+ *
85718
+ * A frame that cannot hold the smallest crop yields nothing: it is already
85719
+ * seen at scale.
85720
+ */
85721
+ function planMotionCrops(input) {
85722
+ const { native } = input;
85723
+ if (Math.min(native.width, native.height) < 640) return [];
85724
+ const planned = [];
85725
+ for (const region of planMotionCropRegions(input)) for (const crop of motionCropsForRegion(region, native)) {
85726
+ if (planned.some((existing) => cropContains(existing, crop))) continue;
85727
+ planned.push(crop);
85728
+ }
85729
+ return planned;
85730
+ }
85376
85731
  /** Side of the square, as a multiple of the face box's longer side. */
85377
85732
  var ROOT_FACE_REFINE_SCALE = 1.6;
85378
85733
  /**
@@ -86664,4 +87019,4 @@ function armRemovalReconcile(opts) {
86664
87019
  return () => clearInterval(timer);
86665
87020
  }
86666
87021
  //#endregion
86667
- export { audioAnalyzerCapability as $, maskUrlCredentials as $n, pipelineExecutorCapability as $t, NativeLeaseAdmissionSchema as A, invocationFromEncodeProfile as An, ffmpegRate as At, RECORDING_SOURCE_CAMSTACK_ADDON as B, MODEL_FORMATS as Bn, mapAudioLabelToMacro as Bt, EVENT_PAD_MS as C, videoclipsCapability as Cn, enumerateInferenceDevices as Ct, G711_SCALE_CORRECTION_DB as D, Fmp4BoxSplitter as Dn, evictionPolicyOfLocation as Dt, FailureCounters as E, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as En, evictionPolicyForMode as Et, PoolMemoryWatchdog as F, BOOT_RECOVERY_BACKOFF_MS as Fn, isFirstLevelMacroClass as Ft, VIDEOCLIPS_MAX_OFFER_BYTES as G, defineRecordKinds as Gn, modeMayWrite as Gt, RecordingConfigSchema as H, createEvent as Hn, mayWriteToLocation as Ht, RATE_CONTROL_RELAXED as I, BaseAddon as In, linkedLabelStepId as It, addonWidgetsSourceCapability as J, hydrateSchema as Jn, overlayClusterStepSettings as Jt, VISIT_MERGE_GAP_MS as K, expandAudioChunkToF32le as Kn, modelBindingKey as Kt, RATE_CONTROL_TIGHT as L, CAM_PROFILE_ORDER as Ln, linkedStepOf as Lt, NodeBenchRunnerInputSchema as M, DeviceFeature as Mn, gifDeriveSpeed as Mt, OpsLogEntrySchema as N, DeviceType as Nn, gifFromMp4Args as Nt, LABEL_SUPPLY_MACRO as O, buildFfmpegArgs as On, exportSubjectOf as Ot, PIPELINE_RAMP as P, errMsg as Pn, inferModelProvider as Pt, audioAnalysisCapability as Q, makeSourceBrokerId as Qn, pickNativeLeaseOverride as Qt, RECORDING_EXPORT_MAX_READ_BYTES as R, CamProfileSchema as Rn, loadContributionCapability as Rt, EVENT_OWNER_TYPES as S, supportedRuntimes as Sn, egressTransportFromRequest as St, ExportRecordSchema as T, AUDIO_PRESETS as Tn, eventOverlapsClipWindow as Tt, RecordingSignalStatusSchema as U, customAction as Un, memoizePinnedFfmpeg as Ut, ROOT_SUPPLIABLE_STEP_IDS as V, audioChunkBytesPerSample as Vn, mayReadLocation as Vt, RingBuffer as W, defineCustomActions as Wn, migrateLegacyDeviceSignalConfig as Wt, applyModelBoundSettings as X, isSecretMarker as Xn, pickClusterStepSettings as Xt, allowedSuppliedEffect as Y, isEvent as Yn, parseProcStatus as Yt, armRemovalReconcile as Z, makeProfileBrokerId as Zn, pickDetailCropConvention as Zt, DEFAULT_DETAIL_CROP_CONVENTION as _, stepModelRunsOnFormat as _n, EventCategory as _r, detectionPipelineCapability as _t, BackgroundRunRegistry as a, recordingSignalCapability as an, _enum as ar, clipExportFailure as at, DEVICE_BACKEND_TO_FORMAT as b, streamBrokerCapability as bn, edgetpuDelegateDevice as bt, CLIP_STILL_REASON_CODE_HEADER as c, resolveEgressDecodeHwAccel as cn, discriminatedUnion as cr, containingParentIndex as ct, CLUSTER_MODEL_SCOPED_STEPS as d, resolvePoolMemoryPolicy as dn, number as dr, declareLogChannel as dt, pipelineRunnerCapability as en, nodePin as er, audioKindId as et, COCO_80_LABELS as f, resolveRecordingProfiles as fn, object as fr, defaultDeviceFor as ft, DEFAULT_CLUSTER_STEP_SETTINGS as g, startMoverUnderClearance as gn, union as gr, deriveRootFaceRefineRect as gt, DEFAULT_AUDIO_ANALYZER_CONFIG as h, runtimeDevices as hn, string as hr, deriveRecordingMode as ht, AUDIO_MACRO_LABELS as i, recordingExportCapability as in, userError as ir, cameraStreamsCapability as it, NativeLeaseSettingsSchema as j, isSoftwareDecode as jn, gbToBytes as jt, LABEL_SUPPLY_VOCABULARIES as k, evaluateSensorEdge as kn, failureContributionCapability as kt, CLIP_STILL_REASON_HEADER as l, resolveLocationMode as ln, lazy as lr, createHwAccelCache as lt, CROP_SUPPLY_SOURCES as m, rootSuppliesOf as mn, record as mr, deriveDetailCropRect as mt, APPLE_SA_TO_MACRO as n, recordingArchiveCapability as nn, selectAssignedProfileSlots as nr, buildBenchStepTree as nt, BatteryStatusSchema as o, resolveClusterStepModelId as on, array as or, clipExportFailureOf as ot, COCO_TO_MACRO as p, resolveRootSupply as pn, preprocess as pr, deriveBatteryPresence as pt, YAMNET_TO_MACRO as q, hfModelUrl as qn, motionDetectionCapability as qt, AUDIO_BACKEND_CHOICES as r, recordingCapability as rn, sleep as rr, cameraOwnsMotionViaSensor as rt, CLIP_BROKER_PACED_RATES as s, resolveCreateExportSubject as sn, boolean as sr, collectModelBoundKeys as st, APPEARANCE_BLOCKS as t, rankStreams as tn, parseProfileBrokerId as tr, batteryCapability as tt, CLIP_STREAM_TRANSPORT_HEADER as u, resolveModelBoundSetting as un, literal as ur, createLogChannelsProvider as ut, DEFAULT_EVENTS_BAND_BUFFER_SEC as v, storageEvictableCapability as vn, deviceRemovalHookCapability as vt, EncodeProfileSchema as w, webrtcSessionCapability as wn, evaluateZoneRules as wt, DEVICE_RAMP as x, stripRetiredBandPreBufferSec as xn, egressTranscodeSharingKey as xt, DEFAULT_NATIVE_LEASE_SETTINGS as y, storageOccupancyCapability as yn, dominantClipLabels as yt, RECORDING_SOURCE_CAMSTACK as z, HF_REPO as zn, logChannelsCapability as zt };
87022
+ export { applyModelBoundSettings as $, defineCustomActions as $n, parseProcStatus as $t, NativeLeaseAdmissionSchema as A, stripRetiredBandPreBufferSec as An, evictionPolicyForMode as At, RECORDING_SOURCE_CAMSTACK as B, isSoftwareDecode as Bn, isFirstLevelMacroClass as Bt, EVENT_PAD_MS as C, runtimeDevices as Cn, record as Cr, dominantClipLabels as Ct, G711_SCALE_CORRECTION_DB as D, storageEvictableCapability as Dn, enumerateInferenceDevices as Dt, FailureCounters as E, stepModelRunsOnFormat as En, EventCategory as Er, egressTransportFromRequest as Et, PIPELINE_RAMP as F, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as Fn, fuseRecoveredDetections as Ft, RecordingSignalStatusSchema as G, BaseAddon as Gn, mapAudioLabelToMacro as Gt, RECOVERY_MOTION_MAX_AGE_MS as H, DeviceType as Hn, linkedStepOf as Ht, PoolMemoryWatchdog as I, Fmp4BoxSplitter as In, gbToBytes as It, VISIT_MERGE_GAP_MS as J, HF_REPO as Jn, memoizePinnedFfmpeg as Jt, RingBuffer as K, CAM_PROFILE_ORDER as Kn, mayReadLocation as Kt, RATE_CONTROL_RELAXED as L, buildFfmpegArgs as Ln, gifDeriveSpeed as Lt, NodeBenchRunnerInputSchema as M, videoclipsCapability as Mn, exportSubjectOf as Mt, OBJECT_DETECTION_STEP_ID as N, webrtcSessionCapability as Nn, failureContributionCapability as Nt, LABEL_SUPPLY_MACRO as O, storageOccupancyCapability as On, evaluateZoneRules as Ot, OpsLogEntrySchema as P, AUDIO_PRESETS as Pn, ffmpegRate as Pt, applyCropClassFloors as Q, customAction as Qn, overlayClusterStepSettings as Qt, RATE_CONTROL_TIGHT as R, evaluateSensorEdge as Rn, gifFromMp4Args as Rt, EVENT_OWNER_TYPES as S, rootSuppliesOf as Sn, preprocess as Sr, deviceRemovalHookCapability as St, ExportRecordSchema as T, startMoverUnderClearance as Tn, union$1 as Tr, egressTranscodeSharingKey as Tt, ROOT_SUPPLIABLE_STEP_IDS as U, errMsg as Un, loadContributionCapability as Ut, RECORDING_SOURCE_CAMSTACK_ADDON as V, DeviceFeature as Vn, linkedLabelStepId as Vt, RecordingConfigSchema as W, BOOT_RECOVERY_BACKOFF_MS as Wn, logChannelsCapability as Wt, addonWidgetsSourceCapability as X, audioChunkBytesPerSample as Xn, modeMayWrite as Xt, YAMNET_TO_MACRO as Y, MODEL_FORMATS as Yn, migrateLegacyDeviceSignalConfig as Yt, allowedSuppliedEffect as Z, createEvent as Zn, motionDetectionCapability as Zt, DEFAULT_DETAIL_CROP_CONVENTION as _, resolveLocationMode as _n, discriminatedUnion as _r, deriveBatteryPresence as _t, BackgroundRunRegistry as a, planMotionCrops as an, isSecretMarker as ar, buildBenchStepTree as at, DEVICE_BACKEND_TO_FORMAT as b, resolveRecordingProfiles as bn, number as br, deriveRootFaceRefineRect as bt, CLIP_STILL_REASON_CODE_HEADER as c, readRecoveryRecipeForSteps as cn, maskUrlCredentials as cr, clipExportFailure as ct, CLUSTER_MODEL_SCOPED_STEPS as d, recordingExportCapability as dn, selectAssignedProfileSlots as dr, containingParentIndex as dt, pickClusterStepSettings as en, defineRecordKinds as er, armRemovalReconcile as et, COCO_80_LABELS as f, recordingSignalCapability as fn, sleep as fr, countRecoverySkips as ft, DEFAULT_CLUSTER_STEP_SETTINGS as g, resolveEgressDecodeHwAccel as gn, boolean as gr, defaultDeviceFor as gt, DEFAULT_AUDIO_ANALYZER_CONFIG as h, resolveCreateExportSubject as hn, array as hr, declareLogChannel as ht, AUDIO_MACRO_LABELS as i, pipelineRunnerCapability as in, isEvent as ir, batteryCapability as it, NativeLeaseSettingsSchema as j, supportedRuntimes as jn, evictionPolicyOfLocation as jt, LABEL_SUPPLY_VOCABULARIES as k, streamBrokerCapability as kn, eventOverlapsClipWindow as kt, CLIP_STILL_REASON_HEADER as l, recordingArchiveCapability as ln, nodePin as lr, clipExportFailureOf as lt, CROP_SUPPLY_SOURCES as m, resolveClusterStepModelId as mn, _enum as mr, createLogChannelsProvider as mt, APPLE_SA_TO_MACRO as n, pickNativeLeaseOverride as nn, hfModelUrl as nr, audioAnalyzerCapability as nt, BatteryStatusSchema as o, planRecoveryCrops as on, makeProfileBrokerId as or, cameraOwnsMotionViaSensor as ot, COCO_TO_MACRO as p, remapCropDetections as pn, userError as pr, createHwAccelCache as pt, VIDEOCLIPS_MAX_OFFER_BYTES as q, CamProfileSchema as qn, mayWriteToLocation as qt, AUDIO_BACKEND_CHOICES as r, pipelineExecutorCapability as rn, hydrateSchema as rr, audioKindId as rt, CLIP_BROKER_PACED_RATES as s, rankStreams as sn, makeSourceBrokerId as sr, cameraStreamsCapability as st, APPEARANCE_BLOCKS as t, pickDetailCropConvention as tn, expandAudioChunkToF32le as tr, audioAnalysisCapability as tt, CLIP_STREAM_TRANSPORT_HEADER as u, recordingCapability as un, parseProfileBrokerId as ur, collectModelBoundKeys as ut, DEFAULT_EVENTS_BAND_BUFFER_SEC as v, resolveModelBoundSetting as vn, lazy as vr, deriveDetailCropRect as vt, EncodeProfileSchema as w, selectRecoveryStep as wn, string as wr, edgetpuDelegateDevice as wt, DEVICE_RAMP as x, resolveRootSupply as xn, object as xr, detectionPipelineCapability as xt, DEFAULT_NATIVE_LEASE_SETTINGS as y, resolvePoolMemoryPolicy as yn, literal as yr, deriveRecordingMode as yt, RECORDING_EXPORT_MAX_READ_BYTES as z, invocationFromEncodeProfile as zn, inferModelProvider as zt };