@camstack/types 1.2.92 → 1.2.94

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.
@@ -202,7 +202,7 @@ export type TrackEnvelope = z.infer<typeof TrackEnvelopeSchema>;
202
202
  * `snapshots[]` references — megabytes across a page of tracks. `slim`
203
203
  * keeps every scalar the list surfaces actually render (ids, class(es),
204
204
  * label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
205
- * zonesVisited, bestEventId, envelope, hasFace, hasRider) and returns `positions` /
205
+ * zonesVisited, bestEventId, envelope, hasFace, hasEmbeddedFace, hasRider) and returns `positions` /
206
206
  * `snapshots` as EMPTY arrays — detail views re-fetch the full row via
207
207
  * `getTrack`. Mirrors the event-store `projection` convention
208
208
  * (`getObjectEvents` et al.).
@@ -435,6 +435,7 @@ declare const TrackSchema: z.ZodObject<{
435
435
  maxY: z.ZodNumber;
436
436
  }, z.core.$strip>>;
437
437
  hasFace: z.ZodOptional<z.ZodBoolean>;
438
+ hasEmbeddedFace: z.ZodOptional<z.ZodBoolean>;
438
439
  hasRider: z.ZodOptional<z.ZodBoolean>;
439
440
  label: z.ZodOptional<z.ZodString>;
440
441
  labelScore: z.ZodOptional<z.ZodNumber>;
@@ -1087,6 +1088,7 @@ declare const RecentTracksPageSchema: z.ZodObject<{
1087
1088
  maxY: z.ZodNumber;
1088
1089
  }, z.core.$strip>>;
1089
1090
  hasFace: z.ZodOptional<z.ZodBoolean>;
1091
+ hasEmbeddedFace: z.ZodOptional<z.ZodBoolean>;
1090
1092
  hasRider: z.ZodOptional<z.ZodBoolean>;
1091
1093
  label: z.ZodOptional<z.ZodString>;
1092
1094
  labelScore: z.ZodOptional<z.ZodNumber>;
@@ -1348,6 +1350,7 @@ export declare const pipelineAnalyticsCapability: {
1348
1350
  maxY: z.ZodNumber;
1349
1351
  }, z.core.$strip>>;
1350
1352
  hasFace: z.ZodOptional<z.ZodBoolean>;
1353
+ hasEmbeddedFace: z.ZodOptional<z.ZodBoolean>;
1351
1354
  hasRider: z.ZodOptional<z.ZodBoolean>;
1352
1355
  label: z.ZodOptional<z.ZodString>;
1353
1356
  labelScore: z.ZodOptional<z.ZodNumber>;
@@ -1444,6 +1447,7 @@ export declare const pipelineAnalyticsCapability: {
1444
1447
  maxY: z.ZodNumber;
1445
1448
  }, z.core.$strip>>;
1446
1449
  hasFace: z.ZodOptional<z.ZodBoolean>;
1450
+ hasEmbeddedFace: z.ZodOptional<z.ZodBoolean>;
1447
1451
  hasRider: z.ZodOptional<z.ZodBoolean>;
1448
1452
  label: z.ZodOptional<z.ZodString>;
1449
1453
  labelScore: z.ZodOptional<z.ZodNumber>;
@@ -1563,6 +1567,7 @@ export declare const pipelineAnalyticsCapability: {
1563
1567
  maxY: z.ZodNumber;
1564
1568
  }, z.core.$strip>>;
1565
1569
  hasFace: z.ZodOptional<z.ZodBoolean>;
1570
+ hasEmbeddedFace: z.ZodOptional<z.ZodBoolean>;
1566
1571
  hasRider: z.ZodOptional<z.ZodBoolean>;
1567
1572
  label: z.ZodOptional<z.ZodString>;
1568
1573
  labelScore: z.ZodOptional<z.ZodNumber>;
@@ -1678,6 +1683,7 @@ export declare const pipelineAnalyticsCapability: {
1678
1683
  maxY: z.ZodNumber;
1679
1684
  }, z.core.$strip>>;
1680
1685
  hasFace: z.ZodOptional<z.ZodBoolean>;
1686
+ hasEmbeddedFace: z.ZodOptional<z.ZodBoolean>;
1681
1687
  hasRider: z.ZodOptional<z.ZodBoolean>;
1682
1688
  label: z.ZodOptional<z.ZodString>;
1683
1689
  labelScore: z.ZodOptional<z.ZodNumber>;
@@ -55,6 +55,7 @@ declare const DetailResultSchema: z.ZodObject<{
55
55
  }, z.core.$strip>>;
56
56
  embedding: z.ZodOptional<z.ZodString>;
57
57
  embeddingMagnitude: z.ZodOptional<z.ZodNumber>;
58
+ embeddingModelId: z.ZodOptional<z.ZodString>;
58
59
  label: z.ZodOptional<z.ZodString>;
59
60
  labelTier: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<1>, z.ZodLiteral<2>]>>;
60
61
  labelModelId: z.ZodOptional<z.ZodString>;
@@ -628,6 +629,7 @@ export declare const pipelineRunnerCapability: {
628
629
  }, z.core.$strip>>;
629
630
  embedding: z.ZodOptional<z.ZodString>;
630
631
  embeddingMagnitude: z.ZodOptional<z.ZodNumber>;
632
+ embeddingModelId: z.ZodOptional<z.ZodString>;
631
633
  label: z.ZodOptional<z.ZodString>;
632
634
  labelTier: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<1>, z.ZodLiteral<2>]>>;
633
635
  labelModelId: z.ZodOptional<z.ZodString>;
@@ -707,6 +709,7 @@ export declare const pipelineRunnerCapability: {
707
709
  }, z.core.$strip>>;
708
710
  embedding: z.ZodOptional<z.ZodString>;
709
711
  embeddingMagnitude: z.ZodOptional<z.ZodNumber>;
712
+ embeddingModelId: z.ZodOptional<z.ZodString>;
710
713
  label: z.ZodOptional<z.ZodString>;
711
714
  labelTier: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<1>, z.ZodLiteral<2>]>>;
712
715
  labelModelId: z.ZodOptional<z.ZodString>;
@@ -103,6 +103,7 @@ export declare const snapshotCapability: {
103
103
  reason: z.ZodNullable<z.ZodEnum<{
104
104
  sleeping: "sleeping";
105
105
  unreachable: "unreachable";
106
+ offline: "offline";
106
107
  disabled: "disabled";
107
108
  waking: "waking";
108
109
  }>>;
@@ -175,6 +176,7 @@ export declare const snapshotCapability: {
175
176
  stateReason: z.ZodNullable<z.ZodEnum<{
176
177
  sleeping: "sleeping";
177
178
  unreachable: "unreachable";
179
+ offline: "offline";
178
180
  disabled: "disabled";
179
181
  waking: "waking";
180
182
  }>>;
package/dist/index.d.ts CHANGED
@@ -199,7 +199,8 @@ export { isScheduleActive } from './notification/schedule.js';
199
199
  export { NC_SYSTEM_EVENT_FILTER_KEYS, type NcSystemEventFilterKey, systemEventFilterApplies, systemEventFilterAppliesToAnyKind, } from './notification/system-event-filters.js';
200
200
  export type { TimelapseCadencePair, TimelapsePreviewMode, TimelapseRule, TimelapseRuleInput, TimelapseRulePatch, TimelapseTemplate, } from './notification/timelapse-rule.js';
201
201
  export { assertTimelapseCadences, DEFAULT_TIMELAPSE_PREVIEW_TEXT, readTimelapseGeneratedAt, TIMELAPSE_DENSE_FLOOR_SEC, TimelapseRuleInputSchema, TimelapseRulePatchSchema, TimelapseRuleSchema, TimelapseTemplateSchema, } from './notification/timelapse-rule.js';
202
- export { DEFAULT_DETAIL_CROP_CONVENTION, DETAIL_CROP_PADDING_FIELD, DETAIL_CROP_PADDING_KEY, DETAIL_CROP_SECTION_ID, DETAIL_CROP_SQUARE_KEY, type DetailCropConvention, DetailCropConventionSchema, type DetailCropRect, deriveDetailCropRect, type HydratedSettingsSection, type HydratedSettingsView, pickDetailCropConvention, readDetailCropConvention, } from './pipeline/detail-crop.js';
202
+ export { CLUSTER_MODEL_SCOPED_STEPS, CLUSTER_MODEL_SECTION_ID, type ClusterModelScopedStep, type ClusterStepModels, clusterModelSettingKey, DEFAULT_CLUSTER_STEP_MODELS, type HydratedClusterSection, type HydratedClusterView, isClusterScopedStep, pickClusterStepModels, readClusterStepModels, resolveClusterStepModelId, type StepModelScope, } from './pipeline/cluster-model-scope.js';
203
+ export { DEFAULT_DETAIL_CROP_CONVENTION, DETAIL_CROP_PADDING_FIELD, DETAIL_CROP_PADDING_KEY, DETAIL_CROP_SECTION_ID, DETAIL_CROP_SQUARE_KEY, FULL_IMAGE_BBOX, type DetailCropConvention, DetailCropConventionSchema, type DetailCropRect, deriveDetailCropRect, type HydratedSettingsSection, type HydratedSettingsView, pickDetailCropConvention, readDetailCropConvention, } from './pipeline/detail-crop.js';
203
204
  export { DEFAULT_NATIVE_LEASE_SETTINGS, NATIVE_LEASE_ACTIVITY_FIELD, NATIVE_LEASE_ACTIVITY_KEY, NATIVE_LEASE_ADMISSION_FIELD, NATIVE_LEASE_ADMISSION_KEY, NATIVE_LEASE_BUDGET_FIELD, NATIVE_LEASE_BUDGET_KEY, NATIVE_LEASE_HOLD_FIELD, NATIVE_LEASE_HOLD_KEY, NATIVE_LEASE_SECTION_ID, NATIVE_LEASE_TILE_BUDGET_FIELD, NATIVE_LEASE_TILE_BUDGET_KEY, type NativeLeaseAdmission, NativeLeaseAdmissionSchema, type NativeLeaseKnob, type NativeLeaseNumberKnob, type NativeLeaseSettings, type NativeLeaseSettingsOverride, NativeLeaseSettingsSchema, pickNativeLeaseOverride, readNativeLeaseOverride, } from './pipeline/native-lease.js';
204
205
  export { ACCESS_ROLES, type AccessRoleAssignment, type AccessRoleId, type AccessRoleSpec, buildRoleScopes, detectAccessRole, roleSpec, } from './schemas/access-roles.js';
205
206
  export { type ApiKeyRecord, ApiKeyRecordSchema, type CapScope, CapScopeSchema, type DeviceSelector, DeviceSelectorSchema, type DeviceTokenScope, type MethodAccess, MethodAccessSchema, type ScopedToken, ScopedTokenSchema, type TokenScope, TokenScopeSchema, type UserRecord, UserRecordSchema, } from './schemas/auth-records.js';
package/dist/index.js CHANGED
@@ -1530,12 +1530,25 @@ var RecordingBandSchema = zod.z.object({
1530
1530
  * segment is ever finalized and the camera records nothing anyway. At the 10 s
1531
1531
  * default segment length, 30 s leaves room for two full segments. `preBufferSec`
1532
1532
  * is retroactive only — it costs nothing at record time, it merely keeps
1533
- * already-written segments — so it is set to one segment length.
1533
+ * already-written segments.
1534
1534
  *
1535
- * An EXPLICIT `0` is left alone: that is an operator statement, not an omission.
1535
+ * ## Why `preBufferSec` is 15 and not one segment length
1536
+ *
1537
+ * It has to cover the broker's RECORDING pre-roll, which is media handed to the
1538
+ * writer from BEFORE the trigger (D192/D193). If this bound were narrower, the
1539
+ * keep gate would delete the very seconds the ring just supplied — two
1540
+ * authorities disagreeing about the same footage, which is the failure D191 was
1541
+ * written against. It is therefore set to `RECORDING_PRE_ROLL_MAX_MS` (15 s),
1542
+ * the widest window the broker can be configured to serve, so an operator
1543
+ * raising the cluster pre-roll can never walk past the gate silently. The
1544
+ * addon-side guard is
1545
+ * `packages/addon-pipeline/src/recorder/addon/__tests__/band-decision.spec.ts`.
1546
+ *
1547
+ * An EXPLICIT `0` is left alone: that is an operator statement, not an omission,
1548
+ * and it is excluded from that invariant by name.
1536
1549
  */
1537
1550
  var DEFAULT_EVENTS_BAND_BUFFER_SEC = {
1538
- preBufferSec: 10,
1551
+ preBufferSec: 15,
1539
1552
  postBufferSec: 30
1540
1553
  };
1541
1554
  /**
@@ -4223,11 +4236,15 @@ export default function block(ctx: AddonContext) {
4223
4236
  ): Promise<void> {
4224
4237
  const resolved: Record<string, unknown> = {}
4225
4238
  for (const [k, v] of Object.entries(args)) resolved[k] = substitute(v, vars)
4226
- const client = (ctx.api as unknown as Record<string, Record<string, { mutate: (i: unknown) => Promise<unknown> }>>)[capToRouterKey(cap)]
4227
- if (client === undefined || client[method] === undefined) {
4239
+ const client: unknown = Reflect.get(ctx.api, capToRouterKey(cap))
4240
+ const proc: unknown =
4241
+ typeof client === 'object' && client !== null ? Reflect.get(client, method) : undefined
4242
+ const mutate: unknown =
4243
+ typeof proc === 'object' && proc !== null ? Reflect.get(proc, 'mutate') : undefined
4244
+ if (typeof mutate !== 'function') {
4228
4245
  throw new Error('no such device method: ' + cap + '.' + method)
4229
4246
  }
4230
- await client[method]!.mutate({ ...resolved, deviceId })
4247
+ await mutate({ ...resolved, deviceId })
4231
4248
  }
4232
4249
 
4233
4250
  async function evaluateConditions(): Promise<boolean> {
@@ -14688,7 +14705,7 @@ var TrackEnvelopeSchema = zod.z.object({
14688
14705
  * `snapshots[]` references — megabytes across a page of tracks. `slim`
14689
14706
  * keeps every scalar the list surfaces actually render (ids, class(es),
14690
14707
  * label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
14691
- * zonesVisited, bestEventId, envelope, hasFace, hasRider) and returns `positions` /
14708
+ * zonesVisited, bestEventId, envelope, hasFace, hasEmbeddedFace, hasRider) and returns `positions` /
14692
14709
  * `snapshots` as EMPTY arrays — detail views re-fetch the full row via
14693
14710
  * `getTrack`. Mirrors the event-store `projection` convention
14694
14711
  * (`getObjectEvents` et al.).
@@ -14999,6 +15016,35 @@ var TrackSchema = zod.z.object({
14999
15016
  */
15000
15017
  hasFace: zod.z.boolean().optional(),
15001
15018
  /**
15019
+ * This track has a face row IN THE GALLERY: a crop **and** an embedding — a
15020
+ * face an operator could ASSIGN to an identity.
15021
+ *
15022
+ * The STRICT twin of {@link hasFace}, and the pair only earns its keep
15023
+ * because the two disagree. `hasFace` is stamped at the TOP of the face
15024
+ * branch, before every gate, and means no more than "a face detector produced
15025
+ * a face detail". This one is stamped at the single moment the gallery row
15026
+ * LANDS — after `FaceRecognizer.onTrackEnd` successfully persists it, i.e.
15027
+ * past the embedding-magnitude verdict, the `minFacePx` detection gate, the
15028
+ * candidate gate, the imageless-track drop (no crop was ever captured) and
15029
+ * the crop-store drop. Everything between the detector and that insert can
15030
+ * legitimately refuse the face, so a flag written any earlier promises the
15031
+ * operator something to assign and delivers nothing.
15032
+ *
15033
+ * **Independent of recognition.** A face collected but never auto-matched is
15034
+ * still assignable — it is in fact the face an operator most wants to reach —
15035
+ * so this is NOT gated on `recognizedIdentityId`. Recognition lands in
15036
+ * `subLabel`; this says only that the raw material exists.
15037
+ *
15038
+ * **Set once, never cleared.** A track that produced a gallery row produced
15039
+ * one; deleting the row later is the gallery's business, not this flag's.
15040
+ *
15041
+ * **Absent ≠ false**, the same rule as {@link hasFace}: every row written
15042
+ * before the column omits it, and so does every server that predates the
15043
+ * field. A consumer must test `=== true` and render nothing otherwise —
15044
+ * never infer "no assignable face".
15045
+ */
15046
+ hasEmbeddedFace: zod.z.boolean().optional(),
15047
+ /**
15002
15048
  * This subject CONTAINS a folded rider — a person the rider-pairing step
15003
15049
  * ([D34](../decisions/adr-0034.md)) removed from the frame BEFORE the tracker,
15004
15050
  * so the passage is tracked once and as a VEHICLE.
@@ -16965,6 +17011,26 @@ var DetailResultSchema = zod.z.object({
16965
17011
  * the consuming gate treats as accept — never as reject.
16966
17012
  */
16967
17013
  embeddingMagnitude: zod.z.number().optional(),
17014
+ /**
17015
+ * Model that produced `embedding` — the SAME contract `labelModelId` has for
17016
+ * `label`, and for the same reason: the producing node is the only side that
17017
+ * knows which model actually ran, and re-deriving it downstream is exactly
17018
+ * the inference this model exists to forbid.
17019
+ *
17020
+ * Additive and optional, so a runner that predates it degrades to
17021
+ * "unmeasurable" rather than to a wrong answer — the consumer falls back to
17022
+ * its previous assumption instead of refusing.
17023
+ *
17024
+ * Its absence was not cosmetic. `FaceRecognizer` needs the probe's model id
17025
+ * to use `face-matcher`'s same-model gate (`sample.modelId !== probe.modelId`);
17026
+ * with nothing on the wire it took the id from the GALLERY, so the gate
17027
+ * compared the gallery against itself and could never fire. That turned the
17028
+ * one guard protecting the face feature space into a tautology, and it is
17029
+ * why swapping `face-embedding`'s model would NOT have stranded the enrolled
17030
+ * gallery as the catalog comment predicts — it would have scored the new
17031
+ * model's vectors against the old model's samples in one cosine space.
17032
+ */
17033
+ embeddingModelId: zod.z.string().optional(),
16968
17034
  label: zod.z.string().optional(),
16969
17035
  /**
16970
17036
  * The tier `label` occupies, copied VERBATIM from the producing step's
@@ -19179,6 +19245,7 @@ var snapshotCapability = {
19179
19245
  isBattery: zod.z.boolean(),
19180
19246
  reason: zod.z.enum([
19181
19247
  "disabled",
19248
+ "offline",
19182
19249
  "sleeping",
19183
19250
  "unreachable",
19184
19251
  "waking"
@@ -19268,9 +19335,17 @@ targets: zod.z.array(zod.z.object({
19268
19335
  sleeping: zod.z.boolean(),
19269
19336
  /** Current device state rendered over the cached frame. State images
19270
19337
  * remain authoritative even when their photographic background is
19271
- * old; null means the link must carry a current camera frame. */
19338
+ * old; null means the link must carry a current camera frame.
19339
+ *
19340
+ * **This is the ONLY source a surface may derive an inactive tile
19341
+ * from.** A client that reads a device's `online`/`disabled` flags and
19342
+ * draws its own verdict will disagree with the pixels it is painting
19343
+ * — the frame comes from here, and so must the sentence over it
19344
+ * (D190). Pair with `ageMs` for the age of the photograph behind the
19345
+ * state. */
19272
19346
  stateReason: zod.z.enum([
19273
19347
  "disabled",
19348
+ "offline",
19274
19349
  "sleeping",
19275
19350
  "unreachable",
19276
19351
  "waking"
@@ -44325,6 +44400,166 @@ function readTimelapseGeneratedAt(rule, deviceId) {
44325
44400
  return rule.lastGeneratedAt ?? 0;
44326
44401
  }
44327
44402
  //#endregion
44403
+ //#region src/pipeline/cluster-model-scope.ts
44404
+ /**
44405
+ * A model choice has a SCOPE, and a scope change has a workflow.
44406
+ *
44407
+ * ## The two scopes
44408
+ *
44409
+ * Almost every pipeline step's model is a **node** question: which build runs
44410
+ * fastest on THIS accelerator. Two nodes may legitimately answer differently —
44411
+ * a Coral runs the tflite SSD, a Mac runs the coreml YOLO — because the answers
44412
+ * are compared against nothing. They produce boxes, and a box is a box.
44413
+ *
44414
+ * Two steps are not like that. `face-embedding` and `clip-embedding` produce
44415
+ * **vectors that land in ONE shared index** (`identity_samples`,
44416
+ * `vec_object_clip`) and are ranked against each other by cosine similarity.
44417
+ * Cosine similarity between two encoders is not a weak signal, it is a
44418
+ * meaningless number — and nothing inside a vector can tell you it happened.
44419
+ * So for those two steps the model is a **cluster** question with exactly one
44420
+ * answer, stored in exactly one row.
44421
+ *
44422
+ * That is the same argument [D52](../../../../docs/decisions/adr-0052.md) makes
44423
+ * for the crop convention (`detail-crop.ts`), one level up: the crop decides
44424
+ * WHAT pixels the encoder sees, this decides WHICH encoder sees them. Both are
44425
+ * cluster-wide for the same reason and neither may become per-node.
44426
+ *
44427
+ * ## Why the registry lives here and not in the step catalog
44428
+ *
44429
+ * The scope itself is declared on the step, in
44430
+ * `detection-pipeline/registry/step-definitions.ts` (`StepDefinition.modelScope`)
44431
+ * — that is where a new step declares what kind of choice its model is. But the
44432
+ * catalog lives inside `addon-pipeline`, and three packages that must NOT
44433
+ * import an addon need to know the set: the orchestrator (which renders and
44434
+ * stores the row), post-analysis (which pins the row for a re-embed pass) and
44435
+ * admin-ui (which mirrors it). So the set is mirrored here, and
44436
+ * `scripts/check-cluster-model-scope.ts` fails the build when the two disagree.
44437
+ * A hand-copied key that stops matching is exactly how a setting silently stops
44438
+ * arriving while both sides still look correct.
44439
+ *
44440
+ * ## The defaults ARE today's behaviour
44441
+ *
44442
+ * {@link DEFAULT_CLUSTER_STEP_MODELS} reproduces the catalog `defaultModelId`
44443
+ * of both steps. Declaring the scope therefore changes nothing on the day it
44444
+ * ships: the cluster row starts out saying what every node was already doing.
44445
+ * Changing it is legitimate — that is what the knob is for — but it invalidates
44446
+ * the stored vectors of that surface, and must be followed by a re-embed pass
44447
+ * (`face-reembed-pass.ts`, `embedding-rebuild.ts`).
44448
+ */
44449
+ /**
44450
+ * The cluster-scoped steps. Mirrored from the catalog's `modelScope: 'cluster'`
44451
+ * declarations and guarded by `scripts/check-cluster-model-scope.ts`.
44452
+ */
44453
+ var CLUSTER_MODEL_SCOPED_STEPS = [{
44454
+ stepId: "face-embedding",
44455
+ label: "Face recognition model",
44456
+ defaultModelId: "arcface-r100",
44457
+ indexName: "the enrolled face gallery",
44458
+ options: [
44459
+ {
44460
+ id: "arcface-r100",
44461
+ label: "ArcFace (ResNet34)"
44462
+ },
44463
+ {
44464
+ id: "auraface-r100",
44465
+ label: "AuraFace R100"
44466
+ },
44467
+ {
44468
+ id: "inception-resnet-v1",
44469
+ label: "Inception ResNet V1"
44470
+ }
44471
+ ]
44472
+ }, {
44473
+ stepId: "clip-embedding",
44474
+ label: "Semantic search model",
44475
+ defaultModelId: "mobileclip-s1",
44476
+ indexName: "the object semantic-search index",
44477
+ options: [{
44478
+ id: "mobileclip-s1",
44479
+ label: "MobileCLIP S1"
44480
+ }, {
44481
+ id: "mobileclip-s2",
44482
+ label: "MobileCLIP S2"
44483
+ }]
44484
+ }];
44485
+ /**
44486
+ * Store identity of the cluster row inside `pipeline-orchestrator`'s GLOBAL
44487
+ * (cluster-wide) settings — the same owner, and for the same reason, as the
44488
+ * detail-crop convention: hub-resident and neutral between the addons that
44489
+ * read it.
44490
+ */
44491
+ var CLUSTER_MODEL_SECTION_ID = "cluster-step-models";
44492
+ /**
44493
+ * The settings key holding one step's cluster model choice.
44494
+ *
44495
+ * Step-qualified so the keys stay unique across the addon's whole schema, which
44496
+ * is what lets {@link pickClusterStepModels} walk every section instead of
44497
+ * trusting the section id.
44498
+ */
44499
+ function clusterModelSettingKey(stepId) {
44500
+ return `clusterModel:${stepId}`;
44501
+ }
44502
+ /** True when this step's model is a cluster-wide choice rather than a per-node one. */
44503
+ function isClusterScopedStep(stepId) {
44504
+ return CLUSTER_MODEL_SCOPED_STEPS.some((s) => s.stepId === stepId);
44505
+ }
44506
+ /** The cluster row when nobody has configured one — today's catalog defaults. */
44507
+ var DEFAULT_CLUSTER_STEP_MODELS = Object.freeze(Object.fromEntries(CLUSTER_MODEL_SCOPED_STEPS.map((s) => [s.stepId, s.defaultModelId])));
44508
+ /** A stored choice is a non-empty model id, or it is not a choice. */
44509
+ var ChosenModelIdSchema = zod.z.string().min(1);
44510
+ /**
44511
+ * Narrow a FLAT settings record to the cluster row.
44512
+ *
44513
+ * Per-FIELD fallback, deliberately (same rule as `readDetailCropConvention`): a
44514
+ * junk face model must not also discard a valid clip model. An absent, empty or
44515
+ * non-string value resolves to the step's catalog default — the historical
44516
+ * behaviour — never to a blank id, because a blank id downstream becomes
44517
+ * "substitute the format default", which is precisely the substitution this
44518
+ * scope exists to forbid.
44519
+ */
44520
+ function readClusterStepModels(config) {
44521
+ const out = {};
44522
+ for (const step of CLUSTER_MODEL_SCOPED_STEPS) {
44523
+ const parsed = ChosenModelIdSchema.safeParse(config[clusterModelSettingKey(step.stepId)]);
44524
+ out[step.stepId] = parsed.success ? parsed.data : step.defaultModelId;
44525
+ }
44526
+ return out;
44527
+ }
44528
+ function isHydratedField$2(entry) {
44529
+ return typeof entry === "object" && entry !== null && "key" in entry;
44530
+ }
44531
+ /**
44532
+ * Extract the cluster row from an `addon-settings.getGlobalSettings` payload.
44533
+ *
44534
+ * Walks EVERY section rather than looking inside {@link CLUSTER_MODEL_SECTION_ID}
44535
+ * alone: the keys are unique across the addon's schema, and a section rename
44536
+ * must not silently revert the whole cluster to the defaults. A `null` payload
44537
+ * (addon mid-boot) is the defaults.
44538
+ */
44539
+ function pickClusterStepModels(view) {
44540
+ if (view === null) return DEFAULT_CLUSTER_STEP_MODELS;
44541
+ const flat = {};
44542
+ const wanted = new Set(CLUSTER_MODEL_SCOPED_STEPS.map((s) => clusterModelSettingKey(s.stepId)));
44543
+ for (const section of view.sections) for (const entry of section.fields) {
44544
+ if (!isHydratedField$2(entry) || typeof entry.key !== "string") continue;
44545
+ if (wanted.has(entry.key)) flat[entry.key] = entry.value;
44546
+ }
44547
+ return readClusterStepModels(flat);
44548
+ }
44549
+ /**
44550
+ * The cluster model for `stepId`, or `null` when the step is node-scoped.
44551
+ *
44552
+ * `null` is the signal to LEAVE THE CALLER'S RESOLUTION ALONE — it is not "no
44553
+ * model". Returning a default here for a node-scoped step would quietly
44554
+ * override every per-(node,device) selection in the fleet.
44555
+ */
44556
+ function resolveClusterStepModelId(stepId, models) {
44557
+ const step = CLUSTER_MODEL_SCOPED_STEPS.find((s) => s.stepId === stepId);
44558
+ if (step === void 0) return null;
44559
+ const chosen = models[stepId];
44560
+ return chosen !== void 0 && chosen !== "" ? chosen : step.defaultModelId;
44561
+ }
44562
+ //#endregion
44328
44563
  //#region src/pipeline/detail-crop.ts
44329
44564
  /**
44330
44565
  * THE detail-crop convention — the single derivation of the rectangle a
@@ -44439,6 +44674,30 @@ function pickDetailCropConvention(view) {
44439
44674
  }
44440
44675
  return readDetailCropConvention(flat);
44441
44676
  }
44677
+ /**
44678
+ * The normalised box that means "the image IS the subject".
44679
+ *
44680
+ * Used when the stored pixels are ALREADY the model's input — the 112×112
44681
+ * aligned face template a gallery sample carries. There is no rectangle left to
44682
+ * choose, and the convention must not choose one: re-detecting and re-aligning
44683
+ * over a template applies a SECOND warp, passes every gate, and produces a
44684
+ * plausible useless vector (session 2026-08-20 §3).
44685
+ *
44686
+ * Sending it as the whole frame with this box is exact rather than merely
44687
+ * convenient, and the reason is a property of {@link deriveDetailCropRect}, not
44688
+ * a coincidence: padding a full-frame box can only push OUTSIDE the frame, and
44689
+ * both edge modes bring it straight back — unsquared truncates, squared cannot
44690
+ * exceed the frame's short side and then slides inside. So for a SQUARE image
44691
+ * the derivation is the identity under every convention value, and an operator
44692
+ * changing the crop margin cannot silently re-cut an enrolled template.
44693
+ * `face-reembed-pass.spec.ts` asserts that identity against the real function.
44694
+ */
44695
+ var FULL_IMAGE_BBOX = Object.freeze({
44696
+ x: 0,
44697
+ y: 0,
44698
+ w: 1,
44699
+ h: 1
44700
+ });
44442
44701
  /** Slider bounds for the operator-facing padding knob (orchestrator settings UI). */
44443
44702
  var DETAIL_CROP_PADDING_FIELD = {
44444
44703
  min: 0,
@@ -46773,6 +47032,8 @@ exports.CAPABILITY_ROUTER_KEYS = CAPABILITY_ROUTER_KEYS;
46773
47032
  exports.CAP_NAMES_WITH_STATUS = CAP_NAMES_WITH_STATUS;
46774
47033
  exports.CAP_NODE_PIN_CONTEXT_KEY = require_sleep.CAP_NODE_PIN_CONTEXT_KEY;
46775
47034
  exports.CAP_PROVIDER_KIND_MAP = CAP_PROVIDER_KIND_MAP;
47035
+ exports.CLUSTER_MODEL_SCOPED_STEPS = CLUSTER_MODEL_SCOPED_STEPS;
47036
+ exports.CLUSTER_MODEL_SECTION_ID = CLUSTER_MODEL_SECTION_ID;
46776
47037
  exports.COCO_80_LABELS = COCO_80_LABELS;
46777
47038
  exports.COCO_TO_MACRO = COCO_TO_MACRO;
46778
47039
  exports.CONNECTION_TEST_TIMEOUT_MS = CONNECTION_TEST_TIMEOUT_MS;
@@ -46860,6 +47121,7 @@ exports.DECLARED_DEVICE_SWEEP_LIMIT = DECLARED_DEVICE_SWEEP_LIMIT;
46860
47121
  exports.DECLARED_INTEGRATION_FIXED_KEY = DECLARED_INTEGRATION_FIXED_KEY;
46861
47122
  exports.DEFAULT_ADDON_PLACEMENT = DEFAULT_ADDON_PLACEMENT;
46862
47123
  exports.DEFAULT_AUDIO_ANALYZER_CONFIG = DEFAULT_AUDIO_ANALYZER_CONFIG;
47124
+ exports.DEFAULT_CLUSTER_STEP_MODELS = DEFAULT_CLUSTER_STEP_MODELS;
46863
47125
  exports.DEFAULT_DECODER_HWACCEL_CONFIG = DEFAULT_DECODER_HWACCEL_CONFIG;
46864
47126
  exports.DEFAULT_DETAIL_CROP_CONVENTION = DEFAULT_DETAIL_CROP_CONVENTION;
46865
47127
  exports.DEFAULT_EVENTS_BAND_BUFFER_SEC = DEFAULT_EVENTS_BAND_BUFFER_SEC;
@@ -46978,6 +47240,7 @@ exports.ExpressionGlobalBindingSchema = ExpressionGlobalBindingSchema;
46978
47240
  exports.ExpressionLiteralBindingSchema = ExpressionLiteralBindingSchema;
46979
47241
  exports.ExpressionParseError = ExpressionParseError;
46980
47242
  exports.ExpressionSourceSchema = ExpressionSourceSchema;
47243
+ exports.FULL_IMAGE_BBOX = FULL_IMAGE_BBOX;
46981
47244
  exports.FanControlStatusSchema = FanControlStatusSchema;
46982
47245
  exports.FanDirectionSchema = FanDirectionSchema;
46983
47246
  exports.FeatureManifestSchema = FeatureManifestSchema;
@@ -47636,6 +47899,7 @@ exports.classifyBearerPrincipal = classifyBearerPrincipal;
47636
47899
  exports.classifyStream = classifyStream;
47637
47900
  exports.classifyStreams = classifyStreams;
47638
47901
  exports.climateControlCapability = climateControlCapability;
47902
+ exports.clusterModelSettingKey = clusterModelSettingKey;
47639
47903
  exports.collectHydratedFieldEntries = require_sleep.collectHydratedFieldEntries;
47640
47904
  exports.collectHydratedFieldValues = require_sleep.collectHydratedFieldValues;
47641
47905
  exports.colorCapability = colorCapability;
@@ -47754,6 +48018,7 @@ exports.isAudioLabelSelected = isAudioLabelSelected;
47754
48018
  exports.isAudioRule = isAudioRule;
47755
48019
  exports.isBaseConditionKey = isBaseConditionKey;
47756
48020
  exports.isBatteryPresenceFault = isBatteryPresenceFault;
48021
+ exports.isClusterScopedStep = isClusterScopedStep;
47757
48022
  exports.isCollectionArrayMethod = isCollectionArrayMethod;
47758
48023
  exports.isDeployableToAgent = isDeployableToAgent;
47759
48024
  exports.isDetectionMacroClass = isDetectionMacroClass;
@@ -47837,6 +48102,7 @@ exports.parseStreamParamsFormPatch = parseStreamParamsFormPatch;
47837
48102
  exports.patchAudio = patchAudio;
47838
48103
  exports.petFeederCapability = petFeederCapability;
47839
48104
  exports.pickAccessoryControl = pickAccessoryControl;
48105
+ exports.pickClusterStepModels = pickClusterStepModels;
47840
48106
  exports.pickDetailCropConvention = pickDetailCropConvention;
47841
48107
  exports.pickNativeLeaseOverride = pickNativeLeaseOverride;
47842
48108
  exports.pickPreferredRtspEntry = pickPreferredRtspEntry;
@@ -47860,6 +48126,7 @@ exports.procedureAuthKey = procedureAuthKey;
47860
48126
  exports.ptzAutotrackCapability = ptzAutotrackCapability;
47861
48127
  exports.ptzCapability = ptzCapability;
47862
48128
  exports.pythonScriptForBackend = pythonScriptForBackend;
48129
+ exports.readClusterStepModels = readClusterStepModels;
47863
48130
  exports.readDetailCropConvention = readDetailCropConvention;
47864
48131
  exports.readDeviceStateFrom = readDeviceStateFrom;
47865
48132
  exports.readNativeLeaseOverride = readNativeLeaseOverride;
@@ -47877,6 +48144,7 @@ exports.resolveAddonGroup = resolveAddonGroup;
47877
48144
  exports.resolveAddonPlacement = resolveAddonPlacement;
47878
48145
  exports.resolveAddonRuntime = resolveAddonRuntime;
47879
48146
  exports.resolveCapMount = require_sleep.resolveCapMount;
48147
+ exports.resolveClusterStepModelId = resolveClusterStepModelId;
47880
48148
  exports.resolveDetectionRuntime = resolveDetectionRuntime;
47881
48149
  exports.resolveDeviceControlKind = resolveDeviceControlKind;
47882
48150
  exports.resolveDeviceProfile = resolveDeviceProfile;
package/dist/index.mjs CHANGED
@@ -1529,12 +1529,25 @@ var RecordingBandSchema = z.object({
1529
1529
  * segment is ever finalized and the camera records nothing anyway. At the 10 s
1530
1530
  * default segment length, 30 s leaves room for two full segments. `preBufferSec`
1531
1531
  * is retroactive only — it costs nothing at record time, it merely keeps
1532
- * already-written segments — so it is set to one segment length.
1532
+ * already-written segments.
1533
1533
  *
1534
- * An EXPLICIT `0` is left alone: that is an operator statement, not an omission.
1534
+ * ## Why `preBufferSec` is 15 and not one segment length
1535
+ *
1536
+ * It has to cover the broker's RECORDING pre-roll, which is media handed to the
1537
+ * writer from BEFORE the trigger (D192/D193). If this bound were narrower, the
1538
+ * keep gate would delete the very seconds the ring just supplied — two
1539
+ * authorities disagreeing about the same footage, which is the failure D191 was
1540
+ * written against. It is therefore set to `RECORDING_PRE_ROLL_MAX_MS` (15 s),
1541
+ * the widest window the broker can be configured to serve, so an operator
1542
+ * raising the cluster pre-roll can never walk past the gate silently. The
1543
+ * addon-side guard is
1544
+ * `packages/addon-pipeline/src/recorder/addon/__tests__/band-decision.spec.ts`.
1545
+ *
1546
+ * An EXPLICIT `0` is left alone: that is an operator statement, not an omission,
1547
+ * and it is excluded from that invariant by name.
1535
1548
  */
1536
1549
  var DEFAULT_EVENTS_BAND_BUFFER_SEC = {
1537
- preBufferSec: 10,
1550
+ preBufferSec: 15,
1538
1551
  postBufferSec: 30
1539
1552
  };
1540
1553
  /**
@@ -4222,11 +4235,15 @@ export default function block(ctx: AddonContext) {
4222
4235
  ): Promise<void> {
4223
4236
  const resolved: Record<string, unknown> = {}
4224
4237
  for (const [k, v] of Object.entries(args)) resolved[k] = substitute(v, vars)
4225
- const client = (ctx.api as unknown as Record<string, Record<string, { mutate: (i: unknown) => Promise<unknown> }>>)[capToRouterKey(cap)]
4226
- if (client === undefined || client[method] === undefined) {
4238
+ const client: unknown = Reflect.get(ctx.api, capToRouterKey(cap))
4239
+ const proc: unknown =
4240
+ typeof client === 'object' && client !== null ? Reflect.get(client, method) : undefined
4241
+ const mutate: unknown =
4242
+ typeof proc === 'object' && proc !== null ? Reflect.get(proc, 'mutate') : undefined
4243
+ if (typeof mutate !== 'function') {
4227
4244
  throw new Error('no such device method: ' + cap + '.' + method)
4228
4245
  }
4229
- await client[method]!.mutate({ ...resolved, deviceId })
4246
+ await mutate({ ...resolved, deviceId })
4230
4247
  }
4231
4248
 
4232
4249
  async function evaluateConditions(): Promise<boolean> {
@@ -14687,7 +14704,7 @@ var TrackEnvelopeSchema = z.object({
14687
14704
  * `snapshots[]` references — megabytes across a page of tracks. `slim`
14688
14705
  * keeps every scalar the list surfaces actually render (ids, class(es),
14689
14706
  * label / audioLabels / importance enrichment, firstSeen/lastSeen, state,
14690
- * zonesVisited, bestEventId, envelope, hasFace, hasRider) and returns `positions` /
14707
+ * zonesVisited, bestEventId, envelope, hasFace, hasEmbeddedFace, hasRider) and returns `positions` /
14691
14708
  * `snapshots` as EMPTY arrays — detail views re-fetch the full row via
14692
14709
  * `getTrack`. Mirrors the event-store `projection` convention
14693
14710
  * (`getObjectEvents` et al.).
@@ -14998,6 +15015,35 @@ var TrackSchema = z.object({
14998
15015
  */
14999
15016
  hasFace: z.boolean().optional(),
15000
15017
  /**
15018
+ * This track has a face row IN THE GALLERY: a crop **and** an embedding — a
15019
+ * face an operator could ASSIGN to an identity.
15020
+ *
15021
+ * The STRICT twin of {@link hasFace}, and the pair only earns its keep
15022
+ * because the two disagree. `hasFace` is stamped at the TOP of the face
15023
+ * branch, before every gate, and means no more than "a face detector produced
15024
+ * a face detail". This one is stamped at the single moment the gallery row
15025
+ * LANDS — after `FaceRecognizer.onTrackEnd` successfully persists it, i.e.
15026
+ * past the embedding-magnitude verdict, the `minFacePx` detection gate, the
15027
+ * candidate gate, the imageless-track drop (no crop was ever captured) and
15028
+ * the crop-store drop. Everything between the detector and that insert can
15029
+ * legitimately refuse the face, so a flag written any earlier promises the
15030
+ * operator something to assign and delivers nothing.
15031
+ *
15032
+ * **Independent of recognition.** A face collected but never auto-matched is
15033
+ * still assignable — it is in fact the face an operator most wants to reach —
15034
+ * so this is NOT gated on `recognizedIdentityId`. Recognition lands in
15035
+ * `subLabel`; this says only that the raw material exists.
15036
+ *
15037
+ * **Set once, never cleared.** A track that produced a gallery row produced
15038
+ * one; deleting the row later is the gallery's business, not this flag's.
15039
+ *
15040
+ * **Absent ≠ false**, the same rule as {@link hasFace}: every row written
15041
+ * before the column omits it, and so does every server that predates the
15042
+ * field. A consumer must test `=== true` and render nothing otherwise —
15043
+ * never infer "no assignable face".
15044
+ */
15045
+ hasEmbeddedFace: z.boolean().optional(),
15046
+ /**
15001
15047
  * This subject CONTAINS a folded rider — a person the rider-pairing step
15002
15048
  * ([D34](../decisions/adr-0034.md)) removed from the frame BEFORE the tracker,
15003
15049
  * so the passage is tracked once and as a VEHICLE.
@@ -16964,6 +17010,26 @@ var DetailResultSchema = z.object({
16964
17010
  * the consuming gate treats as accept — never as reject.
16965
17011
  */
16966
17012
  embeddingMagnitude: z.number().optional(),
17013
+ /**
17014
+ * Model that produced `embedding` — the SAME contract `labelModelId` has for
17015
+ * `label`, and for the same reason: the producing node is the only side that
17016
+ * knows which model actually ran, and re-deriving it downstream is exactly
17017
+ * the inference this model exists to forbid.
17018
+ *
17019
+ * Additive and optional, so a runner that predates it degrades to
17020
+ * "unmeasurable" rather than to a wrong answer — the consumer falls back to
17021
+ * its previous assumption instead of refusing.
17022
+ *
17023
+ * Its absence was not cosmetic. `FaceRecognizer` needs the probe's model id
17024
+ * to use `face-matcher`'s same-model gate (`sample.modelId !== probe.modelId`);
17025
+ * with nothing on the wire it took the id from the GALLERY, so the gate
17026
+ * compared the gallery against itself and could never fire. That turned the
17027
+ * one guard protecting the face feature space into a tautology, and it is
17028
+ * why swapping `face-embedding`'s model would NOT have stranded the enrolled
17029
+ * gallery as the catalog comment predicts — it would have scored the new
17030
+ * model's vectors against the old model's samples in one cosine space.
17031
+ */
17032
+ embeddingModelId: z.string().optional(),
16967
17033
  label: z.string().optional(),
16968
17034
  /**
16969
17035
  * The tier `label` occupies, copied VERBATIM from the producing step's
@@ -19178,6 +19244,7 @@ var snapshotCapability = {
19178
19244
  isBattery: z.boolean(),
19179
19245
  reason: z.enum([
19180
19246
  "disabled",
19247
+ "offline",
19181
19248
  "sleeping",
19182
19249
  "unreachable",
19183
19250
  "waking"
@@ -19267,9 +19334,17 @@ targets: z.array(z.object({
19267
19334
  sleeping: z.boolean(),
19268
19335
  /** Current device state rendered over the cached frame. State images
19269
19336
  * remain authoritative even when their photographic background is
19270
- * old; null means the link must carry a current camera frame. */
19337
+ * old; null means the link must carry a current camera frame.
19338
+ *
19339
+ * **This is the ONLY source a surface may derive an inactive tile
19340
+ * from.** A client that reads a device's `online`/`disabled` flags and
19341
+ * draws its own verdict will disagree with the pixels it is painting
19342
+ * — the frame comes from here, and so must the sentence over it
19343
+ * (D190). Pair with `ageMs` for the age of the photograph behind the
19344
+ * state. */
19271
19345
  stateReason: z.enum([
19272
19346
  "disabled",
19347
+ "offline",
19273
19348
  "sleeping",
19274
19349
  "unreachable",
19275
19350
  "waking"
@@ -44317,6 +44392,166 @@ function readTimelapseGeneratedAt(rule, deviceId) {
44317
44392
  return rule.lastGeneratedAt ?? 0;
44318
44393
  }
44319
44394
  //#endregion
44395
+ //#region src/pipeline/cluster-model-scope.ts
44396
+ /**
44397
+ * A model choice has a SCOPE, and a scope change has a workflow.
44398
+ *
44399
+ * ## The two scopes
44400
+ *
44401
+ * Almost every pipeline step's model is a **node** question: which build runs
44402
+ * fastest on THIS accelerator. Two nodes may legitimately answer differently —
44403
+ * a Coral runs the tflite SSD, a Mac runs the coreml YOLO — because the answers
44404
+ * are compared against nothing. They produce boxes, and a box is a box.
44405
+ *
44406
+ * Two steps are not like that. `face-embedding` and `clip-embedding` produce
44407
+ * **vectors that land in ONE shared index** (`identity_samples`,
44408
+ * `vec_object_clip`) and are ranked against each other by cosine similarity.
44409
+ * Cosine similarity between two encoders is not a weak signal, it is a
44410
+ * meaningless number — and nothing inside a vector can tell you it happened.
44411
+ * So for those two steps the model is a **cluster** question with exactly one
44412
+ * answer, stored in exactly one row.
44413
+ *
44414
+ * That is the same argument [D52](../../../../docs/decisions/adr-0052.md) makes
44415
+ * for the crop convention (`detail-crop.ts`), one level up: the crop decides
44416
+ * WHAT pixels the encoder sees, this decides WHICH encoder sees them. Both are
44417
+ * cluster-wide for the same reason and neither may become per-node.
44418
+ *
44419
+ * ## Why the registry lives here and not in the step catalog
44420
+ *
44421
+ * The scope itself is declared on the step, in
44422
+ * `detection-pipeline/registry/step-definitions.ts` (`StepDefinition.modelScope`)
44423
+ * — that is where a new step declares what kind of choice its model is. But the
44424
+ * catalog lives inside `addon-pipeline`, and three packages that must NOT
44425
+ * import an addon need to know the set: the orchestrator (which renders and
44426
+ * stores the row), post-analysis (which pins the row for a re-embed pass) and
44427
+ * admin-ui (which mirrors it). So the set is mirrored here, and
44428
+ * `scripts/check-cluster-model-scope.ts` fails the build when the two disagree.
44429
+ * A hand-copied key that stops matching is exactly how a setting silently stops
44430
+ * arriving while both sides still look correct.
44431
+ *
44432
+ * ## The defaults ARE today's behaviour
44433
+ *
44434
+ * {@link DEFAULT_CLUSTER_STEP_MODELS} reproduces the catalog `defaultModelId`
44435
+ * of both steps. Declaring the scope therefore changes nothing on the day it
44436
+ * ships: the cluster row starts out saying what every node was already doing.
44437
+ * Changing it is legitimate — that is what the knob is for — but it invalidates
44438
+ * the stored vectors of that surface, and must be followed by a re-embed pass
44439
+ * (`face-reembed-pass.ts`, `embedding-rebuild.ts`).
44440
+ */
44441
+ /**
44442
+ * The cluster-scoped steps. Mirrored from the catalog's `modelScope: 'cluster'`
44443
+ * declarations and guarded by `scripts/check-cluster-model-scope.ts`.
44444
+ */
44445
+ var CLUSTER_MODEL_SCOPED_STEPS = [{
44446
+ stepId: "face-embedding",
44447
+ label: "Face recognition model",
44448
+ defaultModelId: "arcface-r100",
44449
+ indexName: "the enrolled face gallery",
44450
+ options: [
44451
+ {
44452
+ id: "arcface-r100",
44453
+ label: "ArcFace (ResNet34)"
44454
+ },
44455
+ {
44456
+ id: "auraface-r100",
44457
+ label: "AuraFace R100"
44458
+ },
44459
+ {
44460
+ id: "inception-resnet-v1",
44461
+ label: "Inception ResNet V1"
44462
+ }
44463
+ ]
44464
+ }, {
44465
+ stepId: "clip-embedding",
44466
+ label: "Semantic search model",
44467
+ defaultModelId: "mobileclip-s1",
44468
+ indexName: "the object semantic-search index",
44469
+ options: [{
44470
+ id: "mobileclip-s1",
44471
+ label: "MobileCLIP S1"
44472
+ }, {
44473
+ id: "mobileclip-s2",
44474
+ label: "MobileCLIP S2"
44475
+ }]
44476
+ }];
44477
+ /**
44478
+ * Store identity of the cluster row inside `pipeline-orchestrator`'s GLOBAL
44479
+ * (cluster-wide) settings — the same owner, and for the same reason, as the
44480
+ * detail-crop convention: hub-resident and neutral between the addons that
44481
+ * read it.
44482
+ */
44483
+ var CLUSTER_MODEL_SECTION_ID = "cluster-step-models";
44484
+ /**
44485
+ * The settings key holding one step's cluster model choice.
44486
+ *
44487
+ * Step-qualified so the keys stay unique across the addon's whole schema, which
44488
+ * is what lets {@link pickClusterStepModels} walk every section instead of
44489
+ * trusting the section id.
44490
+ */
44491
+ function clusterModelSettingKey(stepId) {
44492
+ return `clusterModel:${stepId}`;
44493
+ }
44494
+ /** True when this step's model is a cluster-wide choice rather than a per-node one. */
44495
+ function isClusterScopedStep(stepId) {
44496
+ return CLUSTER_MODEL_SCOPED_STEPS.some((s) => s.stepId === stepId);
44497
+ }
44498
+ /** The cluster row when nobody has configured one — today's catalog defaults. */
44499
+ var DEFAULT_CLUSTER_STEP_MODELS = Object.freeze(Object.fromEntries(CLUSTER_MODEL_SCOPED_STEPS.map((s) => [s.stepId, s.defaultModelId])));
44500
+ /** A stored choice is a non-empty model id, or it is not a choice. */
44501
+ var ChosenModelIdSchema = z.string().min(1);
44502
+ /**
44503
+ * Narrow a FLAT settings record to the cluster row.
44504
+ *
44505
+ * Per-FIELD fallback, deliberately (same rule as `readDetailCropConvention`): a
44506
+ * junk face model must not also discard a valid clip model. An absent, empty or
44507
+ * non-string value resolves to the step's catalog default — the historical
44508
+ * behaviour — never to a blank id, because a blank id downstream becomes
44509
+ * "substitute the format default", which is precisely the substitution this
44510
+ * scope exists to forbid.
44511
+ */
44512
+ function readClusterStepModels(config) {
44513
+ const out = {};
44514
+ for (const step of CLUSTER_MODEL_SCOPED_STEPS) {
44515
+ const parsed = ChosenModelIdSchema.safeParse(config[clusterModelSettingKey(step.stepId)]);
44516
+ out[step.stepId] = parsed.success ? parsed.data : step.defaultModelId;
44517
+ }
44518
+ return out;
44519
+ }
44520
+ function isHydratedField$2(entry) {
44521
+ return typeof entry === "object" && entry !== null && "key" in entry;
44522
+ }
44523
+ /**
44524
+ * Extract the cluster row from an `addon-settings.getGlobalSettings` payload.
44525
+ *
44526
+ * Walks EVERY section rather than looking inside {@link CLUSTER_MODEL_SECTION_ID}
44527
+ * alone: the keys are unique across the addon's schema, and a section rename
44528
+ * must not silently revert the whole cluster to the defaults. A `null` payload
44529
+ * (addon mid-boot) is the defaults.
44530
+ */
44531
+ function pickClusterStepModels(view) {
44532
+ if (view === null) return DEFAULT_CLUSTER_STEP_MODELS;
44533
+ const flat = {};
44534
+ const wanted = new Set(CLUSTER_MODEL_SCOPED_STEPS.map((s) => clusterModelSettingKey(s.stepId)));
44535
+ for (const section of view.sections) for (const entry of section.fields) {
44536
+ if (!isHydratedField$2(entry) || typeof entry.key !== "string") continue;
44537
+ if (wanted.has(entry.key)) flat[entry.key] = entry.value;
44538
+ }
44539
+ return readClusterStepModels(flat);
44540
+ }
44541
+ /**
44542
+ * The cluster model for `stepId`, or `null` when the step is node-scoped.
44543
+ *
44544
+ * `null` is the signal to LEAVE THE CALLER'S RESOLUTION ALONE — it is not "no
44545
+ * model". Returning a default here for a node-scoped step would quietly
44546
+ * override every per-(node,device) selection in the fleet.
44547
+ */
44548
+ function resolveClusterStepModelId(stepId, models) {
44549
+ const step = CLUSTER_MODEL_SCOPED_STEPS.find((s) => s.stepId === stepId);
44550
+ if (step === void 0) return null;
44551
+ const chosen = models[stepId];
44552
+ return chosen !== void 0 && chosen !== "" ? chosen : step.defaultModelId;
44553
+ }
44554
+ //#endregion
44320
44555
  //#region src/pipeline/detail-crop.ts
44321
44556
  /**
44322
44557
  * THE detail-crop convention — the single derivation of the rectangle a
@@ -44431,6 +44666,30 @@ function pickDetailCropConvention(view) {
44431
44666
  }
44432
44667
  return readDetailCropConvention(flat);
44433
44668
  }
44669
+ /**
44670
+ * The normalised box that means "the image IS the subject".
44671
+ *
44672
+ * Used when the stored pixels are ALREADY the model's input — the 112×112
44673
+ * aligned face template a gallery sample carries. There is no rectangle left to
44674
+ * choose, and the convention must not choose one: re-detecting and re-aligning
44675
+ * over a template applies a SECOND warp, passes every gate, and produces a
44676
+ * plausible useless vector (session 2026-08-20 §3).
44677
+ *
44678
+ * Sending it as the whole frame with this box is exact rather than merely
44679
+ * convenient, and the reason is a property of {@link deriveDetailCropRect}, not
44680
+ * a coincidence: padding a full-frame box can only push OUTSIDE the frame, and
44681
+ * both edge modes bring it straight back — unsquared truncates, squared cannot
44682
+ * exceed the frame's short side and then slides inside. So for a SQUARE image
44683
+ * the derivation is the identity under every convention value, and an operator
44684
+ * changing the crop margin cannot silently re-cut an enrolled template.
44685
+ * `face-reembed-pass.spec.ts` asserts that identity against the real function.
44686
+ */
44687
+ var FULL_IMAGE_BBOX = Object.freeze({
44688
+ x: 0,
44689
+ y: 0,
44690
+ w: 1,
44691
+ h: 1
44692
+ });
44434
44693
  /** Slider bounds for the operator-facing padding knob (orchestrator settings UI). */
44435
44694
  var DETAIL_CROP_PADDING_FIELD = {
44436
44695
  min: 0,
@@ -46651,4 +46910,4 @@ function enumerateInferenceDevices(hw) {
46651
46910
  return out;
46652
46911
  }
46653
46912
  //#endregion
46654
- export { ACCESSORY_LABEL, ACCESS_ROLES, ALEXA_EGRESS_PROFILE, ALL_CAPABILITY_DEFINITIONS, APPLE_SA_TO_MACRO, AUDIO_ANALYSIS_CAP_NAME, AUDIO_BACKEND_CHOICES, AUDIO_MACRO_LABELS, AUDIO_PRESETS, AccessoriesStatusSchema, AccessoryKind, AddBrokerInputSchema, AddonAutoUpdateSchema, AddonListItemSchema, AddonPageDeclarationSchema, AddonPageInfoSchema, AdoptInputSchema as AdoptionAdoptInputSchema, AdoptResultSchema as AdoptionAdoptResultSchema, AdoptionCandidateResultSchema, AdoptionFilterSchema, GetCandidateInputSchema as AdoptionGetCandidateInputSchema, AdoptionJobSchema, AdoptionJobStateSchema, ListCandidatesInputSchema as AdoptionListCandidatesInputSchema, ListCandidatesOutputSchema as AdoptionListCandidatesOutputSchema, AdoptionOutcomeSchema, ReleaseInputSchema as AdoptionReleaseInputSchema, AdoptionStatusSchema, AgentLoadSummarySchema, AirQualitySensorStatusSchema, AlarmArmModeSchema, AlarmPanelStatusSchema, AlarmStateSchema, AlertSchema, AlertSeveritySchema, AlertSourceSchema, AlertStatusSchema, AmbientLightSensorStatusSchema, ApiKeyRecordSchema, ApiKeySummarySchema, ArchiveEntrySchema, ArchiveManifestSchema, AttachmentMediaTypeSchema, AttachmentSchema, AudioAnalysisResultSchema, AudioAnalysisSettingsSchema, AudioChunkInputSchema, AudioClassSummarySchema, AudioClassificationLabelSchema, AudioClassificationResultSchema, AudioCodecInfoSchema, AudioDecodeSessionConfigSchema, AudioEncodeSchema, AudioEncodeSessionConfigSchema, AudioEncodedChunkSchema, AudioEventSchema, AudioLevelSchema, AudioMetricsHistoryPointSchema, AudioMetricsHistorySchema, AudioMetricsSnapshotSchema, AudioPcmChunkSchema, AuthResultSchema, AutoUpdateSettingsSchema, AutomationActionSchema, AutomationConditionOperatorSchema, AutomationConditionSchema, AutomationControlStatusSchema, AutomationRecipeSchema, AutomationTriggerSchema, AvailableIntegrationTypeSchema, BACKEND_TO_FORMAT, BASE_LIVE_EGRESS_PROFILE, BATTERY_DEVICE_PROFILE, BATTERY_UNREACHABLE_AFTER_MS, BOOT_RECOVERY_BACKOFF_MS, BacklightModeSchema, BackupDestinationInfoSchema, BackupEntrySchema, BaseAddon, BaseDevice, BaseDeviceProvider, BatteryStatusSchema, BinaryStatusSchema, BoundingBoxSchema, BrightnessStatusSchema, AddInputSchema as BrokerAddInputSchema, BrokerAudioClientSchema, BrokerClientsSchema, BrokerConnectionDetailsSchema, BrokerConsumerAttributionSchema, BrokerConsumerKindSchema, BrokerDecodedClientSchema, BrokerEncodedClientSchema, GetStateInputSchema as BrokerGetStateInputSchema, BrokerInfoSchema, BrokerProviderInfoSchema, PublishInputSchema as BrokerPublishInputSchema, RegistryStatusSchema as BrokerRegistryStatusSchema, BrokerRtspClientSchema, BrokerStatsSchema, BrokerStatusEnum, BrokerStatusSchema, SubscribeInputSchema as BrokerSubscribeInputSchema, SubscribeResultSchema as BrokerSubscribeResultSchema, TestConnectionResultSchema as BrokerTestConnectionResultSchema, UnsubscribeInputSchema as BrokerUnsubscribeInputSchema, CAMERA_SWITCH_CATALOG, CAMERA_SWITCH_ORDER, CAM_PROFILE_ORDER, CAPABILITY_NAMES, CAPABILITY_ROUTER_KEYS, CAP_NAMES_WITH_STATUS, CAP_NODE_PIN_CONTEXT_KEY, CAP_PROVIDER_KIND_MAP, COCO_80_LABELS, COCO_TO_MACRO, CONNECTION_TEST_TIMEOUT_MS, CORE_BLOCKS_ADDON_ID, CORE_BLOCK_ADDON_PREFIX, CamProfileSchema, CamStreamDescriptorSchema, CamStreamKindSchema, CamStreamResolutionSchema, CameraAssignmentStatusSchema, CameraAudioStatusSchema, CameraBrokerProfileSchema, CameraBrokerStatusSchema, CameraCredentialsSchema, CameraCredentialsStatusSchema, CameraDecoderShmSchema, CameraDecoderStatusSchema, CameraDetectionPhaseSchema, CameraDetectionProvisioningSchema, CameraDetectionProvisioningStateSchema, CameraDetectionStatusSchema, CameraMetricsSchema, CameraMetricsWithDeviceIdSchema, CameraMotionStatusSchema, CameraRecordingModeSchema, CameraRecordingStatusSchema, CameraSourceStatusSchema, CameraSourceStreamSchema, CameraStatusDegradationReasonSchema, CameraStatusDegradationSchema, CameraStatusSchema, CameraStatusStageSchema, CameraStreamSchema, CameraSwitchAuthoritySchema, CameraSwitchGroupSchema, CameraSwitchIdSchema, CameraSwitchSchema, CameraSwitchUnavailableReasonSchema, CandidateQueryFilterSchema, CapScopeSchema, CapabilityBindingsSchema, CarbonMonoxideStatusSchema, ChargingStatus, ClientNetworkStatsSchema, ClimateControlStatusSchema, ClipPlaybackSchema, ClipSchema, ClusterAddonNodeDeploymentSchema, ClusterAddonStatusEntrySchema, CollectionColumnSchema, CollectionIndexSchema, ColorStatusSchema, ConfigEntrySchema, ConfigSectionWithValuesSchema, ConfigTabDeclarationSchema, ConnectionTestDescriptorSchema, ConnectionTestInputSchema, ConnectionTestOutcomeSchema, ConnectivityStatusSchema, ConsumableItemSchema, ConsumablesStatusSchema, ContactStatusSchema, ControlKindSchema, ControlStatusSchema, ConvertArtifactSchema, ConvertResultSchema, ConvertTargetSchema, CoreBlockCompileResultSchema, CoreBlockInputSchema, CoreBlockPlacementSchema, CoreBlockSchema, CoreBlockStatusSchema, CoverStateSchema, CoverStatusSchema, CreateApiKeyInputSchema, CreateApiKeyResultSchema, CreateIntegrationInputSchema, CreateScopedTokenInputSchema, CreateScopedTokenResultSchema, CreateUserInputSchema, CustomActionInputSchema, CustomModelDescriptorSchema, DATAPLANE_SECRET_HEADER, DECLARED_DEVICE_SWEEP_LIMIT, DECLARED_INTEGRATION_FIXED_KEY, DEFAULT_ADDON_PLACEMENT, DEFAULT_AUDIO_ANALYZER_CONFIG, DEFAULT_DECODER_HWACCEL_CONFIG, DEFAULT_DETAIL_CROP_CONVENTION, DEFAULT_EVENTS_BAND_BUFFER_SEC, DEFAULT_EVENT_COLOR, DEFAULT_FEATURES, DEFAULT_NATIVE_LEASE_SETTINGS, DEFAULT_POOL_MEMORY_POLICY, DEFAULT_RECORDING_PROFILES, DEFAULT_RETENTION, DEFAULT_RUNTIME_STATE_DURABILITY, DEFAULT_SCRUB_THUMBNAIL_PRESET, DEFAULT_TIMELAPSE_PREVIEW_TEXT, DETAIL_CROP_PADDING_FIELD, DETAIL_CROP_PADDING_KEY, DETAIL_CROP_SECTION_ID, DETAIL_CROP_SQUARE_KEY, DETECTION_MACRO_CLASSES, DETECTION_PIPELINE_CAP_NAME, DEVICE_BACKEND_TO_FORMAT, DEVICE_CAP_NAMES, DEVICE_PROFILES, DEVICE_SCOPED_CAPS, DEVICE_SETTINGS_CONTRIBUTION_METHODS, DEVICE_STATE_READERS, DEVICE_STATUS_METHOD, DEVICE_TYPE_CONTROL_KIND, DEVICE_TYPE_INFO, EngineInfoSchema as DataStoreEngineInfoSchema, DayNightModeSchema, DayNightOptionsSchema, DayNightSettingsPatchSchema, DayNightStatusSchema, DeclaredDevices, DecodedAudioChunkSchema, DecodedFrameSchema, DecoderSessionConfigSchema, DecoderStatsSchema, DeleteIntegrationResultSchema, DetailCropConventionSchema, DetectionSourceSchema, DeviceCodeSeveritySchema, DeviceConfig, DeviceDiscoveryStatusSchema, ExposeInputSchema as DeviceExportExposeInputSchema, DeviceExportStatusSchema, UnexposeInputSchema as DeviceExportUnexposeInputSchema, DeviceFeature, DeviceInfoSchema, DeviceNetworkStatsSchema, DeviceRole, DeviceRuntimeState, DeviceSelectorSchema, DeviceStatusSchema, DeviceType, DiscoveredChildDeviceSchema, DiscoveredChildStatusSchema, DiscoveredDeviceSchema, DiscoveredTargetSchema, DiskReconcileJobSchema, DisposerChain, DoorbellPressEventSchema, DoorbellStatusSchema, EVENTFUL_CAP_NAMES, EVENT_KIND_BY_CAP, EVENT_PAD_MS, EVENT_TAXONOMY, EXPORT_DENSE_MAX_RANGES, EXPRESSION_BUILTINS, EXPRESSION_BUILTIN_NAMES, EXPRESSION_COMPILE_CACHE_CAPACITY, EXPRESSION_IDENTIFIER_RE, EXPRESSION_INJECTED_NOW, EgressEncodeSchema, EgressRateControlSchema, EgressTranscodeRequestSchema, EgressTranscodeSchema, ElementConfigStore, EmbeddingInfoSchema, EmbeddingResultSchema, EncodeProfileSchema, EncodedPacketSchema, EnrichedWidgetMetadataSchema, EnumSensorDateTimeFormatSchema, EnumSensorStatusSchema, EventCategory, EventEmitterStatusSchema, EventFireSchema, EventItemSchema, EventKindCategorySchema, EventKindDescriptorSchema, EventKindIconSchema, EventKindSchema, EventKindsForDeviceSchema, EventMediaArtifactSchema, EventMediaCoverageSchema, EventMediaKindSchema, EventMediaProductionSchema, EventSourceType, ExportBytesSchema, ExportDenseRangeSchema, ExportDenseSchema, ExportDownloadSchema, ExportOptionsSchema, ExportRecordSchema, ExportSetupFieldSchema, ExportSetupSchema, ExportSpeedSchema, ExportStateSchema, ExportTimelapseSchema, ExposedDeviceSchema, ExposureModeSchema, ExpressionBindingSourceSchema, ExpressionEvalError, ExpressionFieldBindingSchema, ExpressionGlobalBindingSchema, ExpressionLiteralBindingSchema, ExpressionParseError, ExpressionSourceSchema, FanControlStatusSchema, FanDirectionSchema, FeatureManifestSchema, FeatureProbeStatusSchema, FloodStatusSchema, Fmp4BoxSplitter, FrameHandleFormatSchema, FrameHandleSchema, FrameInputSchema, GasStatusSchema, GetStreamWithCodecInputSchema, GlobalMetricsSchema, HAP_AUDIO_BASE, HAP_AUDIO_BITRATE_KBPS, HAP_AUDIO_VBV_KBITS, HAP_KEYFRAME_INTERVAL_SEC, HF_BASE_URL, HF_REPO, HWACCEL_OPTIONS, HealthStatusSchema, HfModelResolutionSchema, HistoryPointSchema, HistoryResolutionEnum, HumidifierStatusSchema, HumiditySensorStatusSchema, HvacModeSchema, ImageContractSchema, ImageContractStateSchema, ImageRotateSchema, ImageSettingsOptionsSchema, ImageSettingsPatchSchema, ImageSettingsStatusSchema, ImageStatusSchema, IngestOwnerSchema, InstalledPackageSchema, IntegrationLiteSchema, IntegrationWithStateSchema, IntercomAbilitySchema, IntercomStatusSchema, KNOWN_CAP_NAMES, KeyEventSchema, LOG_LEVEL_RANK, LabelAttributionSchema, LabelDefinitionSchema, LabelTierSchema, LawnMowerActivitySchema, LawnMowerControlStatusSchema, LinkedDeviceSchema, LinkedDevicesModeSchema, LlmDefaultSchema, LlmDefaultSelectorSchema, LlmDownloadProgressSchema, LlmErrorCodeSchema, LlmGenerateBaseInputSchema, LlmGenerateErrSchema, LlmGenerateOkSchema, LlmGenerateResultSchema, LlmImageSchema, LlmNodeModelSchema, LlmProfileKindDescriptorSchema, LlmProfileKindSchema, LlmProfileSchema, LlmRetryPolicySchema, LlmRuntimeCompleteInputSchema, LlmRuntimeDiskUsageSchema, LlmRuntimeNodeSchema, LlmRuntimeStatusSchema, LlmTimeoutDefaults, LlmUsageRollupSchema, LlmUsageSchema, LocateSegmentResultSchema, LocationStatSchema, LockControlStatusSchema, LockStateSchema, LogEntrySchema, LogLevelSchema, LogStreamEntrySchema, LoginMethodContributionSchema, LoginStageEnum, MACRO_LABELS, MAX_CLIP_EVENT_IDS, MAX_CLIP_LABELS, MAX_CONDITION_DEPTH, MAX_CONDITION_LEAVES, MAX_EXPRESSION_AST_NODES, MAX_EXPRESSION_BINDINGS, MAX_EXPRESSION_CALL_ARGS, MAX_EXPRESSION_EVAL_STEPS, MAX_EXPRESSION_SOURCE_LENGTH, METHOD_ACCESS_MAP, METHOD_DEVICE_SELECTORS, MODEL_FORMATS, MOTION_TRIGGER_FEATURE, ManagedModelCatalogEntrySchema, ManagedModelExtraFileSchema, ManagedModelRefSchema, ManagedRuntimeConfigSchema, MaskGridDimsSchema, MaskGridShapeSchema, MaskLineShapeSchema, MaskPointSchema, MaskPolygonShapeSchema, MaskPolygonVerticesSchema, MaskRectShapeSchema, MaskShapeKindSchema, MaskShapeSchema, MediaFileInfoSchema, MediaFileSchema, MediaPlayerRepeatSchema, MediaPlayerStateSchema, MediaPlayerStatusSchema, MeshPeerSchema, MeshStatusSchema, MethodAccessSchema, ModelCatalogEntrySchema, ModelConvertInputSchema, ModelConvertMetadataSchema, ModelDistributeInputSchema, ModelDistributeResultSchema, ModelExtraFileSchema, ModelFormatEntrySchema, ModelFormatsSchema, ModelSubstitutionSchema, ModelVariantGroupSchema, MotionAnalysisResultSchema, MotionEventSchema, MotionOnMotionChangedDataSchema, MotionRegionSchema, MotionSourceEnum, MotionSourcesSchema, MotionStatusSchema, MotionTriggerRuntimeStateSchema, MotionTriggerStatusSchema, MotionZoneOptionsSchema, MotionZonePatchSchema, MotionZoneRegionSchema, MotionZoneStatusSchema, StatusSchema as MqttBrokerStatusSchema, MutationFilterSchema, NATIVE_LEASE_ACTIVITY_FIELD, NATIVE_LEASE_ACTIVITY_KEY, NATIVE_LEASE_ADMISSION_FIELD, NATIVE_LEASE_ADMISSION_KEY, NATIVE_LEASE_BUDGET_FIELD, NATIVE_LEASE_BUDGET_KEY, NATIVE_LEASE_HOLD_FIELD, NATIVE_LEASE_HOLD_KEY, NATIVE_LEASE_SECTION_ID, NATIVE_LEASE_TILE_BUDGET_FIELD, NATIVE_LEASE_TILE_BUDGET_KEY, NC_ALARM_SYSTEM_EVENT_KINDS, NC_AUDIO_DBFS_FLOOR, NC_AUDIO_DB_MAX, NC_AUDIO_DB_MIN, NC_AUDIO_DB_OFFERED, NC_AUDIO_DB_STEP, NC_AUDIO_DEFAULTS, NC_AUDIO_HIT_PERCENT_MAX, NC_AUDIO_HIT_PERCENT_MIN, NC_AUDIO_SAMPLING_MAX_SEC, NC_AUDIO_SAMPLING_MIN_SEC, NC_AUDIO_SEED, NC_AUTHORABLE_SYSTEM_EVENT_KINDS, NC_BASE_CONDITION_KEYS, NC_CONDITION_CATALOG, NC_CONFIRM_DEFAULT_MAX_IMAGE_PX, NC_CONFIRM_DEFAULT_TIMEOUT_MS, NC_CONFIRM_MAX_TIMEOUT_MS, NC_CONFIRM_MIN_TIMEOUT_MS, NC_DEFAULT_SNOOZE_MINUTES, NC_HISTORY_LIMIT_DEFAULT, NC_HISTORY_LIMIT_MAX, NC_MAX_PER_TRACK_IMMEDIATE, NC_OCCUPANCY_DEFAULTS, NC_RULE_EDITOR_SECTION_ORDER, NC_RULE_KIND_SPECS, NC_RULE_SECTIONS, NC_SNOOZE_MAX_MINUTES, NC_SYSTEM_DELIVERY, NC_SYSTEM_EVENT_FILTER_KEYS, NC_TAXONOMY, NativeCropBboxSchema, NativeCropRefSchema, NativeCropResultSchema, NativeDetectionSchema, NativeLeaseAdmissionSchema, NativeLeaseSettingsSchema, NativeObjectClassEnum, NativeObjectDetectionRuntimeStateSchema, NativeObjectDetectionStatusSchema, NcAlarmConfigSchema, NcAlarmModeCoverageSchema, NcAlarmSettingsPatchSchema, NcAlarmSettingsSchema, NcAlarmSkipReasonSchema, NcAlarmSkippedDeviceSchema, NcAudioConditionSchema, NcConditionDescriptorSchema, NcConditionsSchema, NcConfirmExpectSchema, NcConfirmSchema, NcCrossingSchema, NcDeliverySchema, NcDeviceStateConditionSchema, NcHistoryEntrySchema, NcHistoryFilterSchema, NcHistoryRecordKindSchema, NcHistoryStatusSchema, NcHistorySubjectSchema, NcMediaFrameSchema, NcMediaPolicySchema, NcOccupancyConditionSchema, NcPlateMatcherSchema, NcRuleActionSchema, NcRuleActionSequenceSchema, NcRuleActionsSchema, NcRuleInputSchema, NcRuleNotificationButtonSchema, NcRulePatchSchema, NcRuleSchema, NcRuleTargetSchema, NcSceneConditionSchema, NcScheduleSchema, NcScheduleWindowSchema, NcSnoozeInputSchema, NcSnoozeSchema, NcSnoozeScopeSchema, NcSnoozeSuppressedSchema, NcSystemEventConditionSchema, NcSystemEventKindSchema, NcTaxonomyEntrySchema, NcTaxonomySchema, NcTestResultSchema, NcThrottleGranularitySchema, NcThrottleSchema, NcZoneConditionSchema, NetworkAccessStatusSchema, NetworkAddressSchema, NetworkEndpointSchema, NotificationActionIconSchema, NotificationActionSchema, NotificationFormatSchema, NotificationSchema, NotifierStatusSchema, NumericSensorStatusSchema, OPS_LOG_DEFAULT_LIMIT, OPS_LOG_RING_DEFAULT_MAX, OauthIntegrationDescriptorSchema, ObjectEventSchema, OpsLogDomainSchema, OpsLogEntrySchema, OpsLogOpSchema, OpsLogQueryInputSchema, OpsLogReasonSchema, OrchestratorMetricsSchema, OsdOverlayKindEnum, OsdOverlayPatchSchema, OsdOverlaySchema, OsdPositionEnum, OsdRenderOutcomeEnum, OsdRenderResultSchema, OsdSlotBindingSchema, OsdSlotViewSchema, OsdSourceOptionSchema, OsdSourceSchema, OsdSourceValueTypeEnum, OsdStatusSchema, PET_FEEDER_MANUAL_FEED_MAX, PET_FEEDER_MANUAL_FEED_MIN, PIPELINE_FLOW_CAPABILITY_NAMES, PIPELINE_OWNER_CAPABILITY_NAMES, PRIVACY_MASK_CAP_NAME, PROVIDER_KIND_CAP_NAMES, PYTHON_SCRIPT, PackageUpdateSchema, PackageVersionInfoSchema, PasskeyLoginMethodSchema, PasskeySummarySchema, PcmSampleFormatSchema, PerScopeBreakdownSchema, PetFeederStatusSchema, PickStreamPreferencesSchema, PickStreamRequirementsSchema, PickedCamStreamSchema, PipelineAssignmentSchema, PipelineDefaultStepSchema, PipelineEngineChoiceSchema, PipelineRunResultBridge, PipelineStepInputSchema, PipelineValidationIssueSchema, PipelineValidationResultSchema, PlaceholderReasonSchema, PolygonPointSchema, PoolMemoryWatchdog, PowerMeterStatusSchema, PresenceStatusSchema, PressureSensorStatusSchema, PrivacyMaskOptionsSchema, PrivacyMaskPatchSchema, PrivacyMaskRegionSchema, PrivacyMaskShapeSchema, PrivacyMaskStatusSchema, ProfileRtspEntrySchema, ProfileSlotSchema, ProfileSlotStatusSchema, ProviderStatusSchema, PtzAutotrackRuntimeStateSchema, PtzAutotrackSettingsSchema, PtzAutotrackStatusSchema, PtzAutotrackTargetOptionSchema, PtzMoveCommandSchema, PtzOptionsSchema, PtzPositionSchema, PtzPresetSchema, PtzStatusSchema, QueryFilterSchema, RATE_CONTROL_RELAXED, RATE_CONTROL_TIGHT, REACHABILITY_FAILURES_TO_OFFLINE, REACHABILITY_POLL_INTERVAL_MS, REACHABILITY_PROBE_TIMEOUT_MS, RECOGNITION_TYPES, RECORDING_EXPORT_MAX_READ_BYTES, RESERVED_BINDING_NAMES, RESTORED_CAP_NAMES, RUNTIME_DEFAULTS, RUNTIME_STATE_POLICY, RUNTIME_TO_FORMAT, RawStateResultSchema, ReadGopBytesResultSchema, ReadSegmentBytesResultSchema, ReadinessRegistry, ReadinessTimeoutError, RecentTracksPageSchema, RecentTracksQueryInput, RecordingAvailabilitySchema, RecordingBandModeSchema, RecordingBandSchema, RecordingBandTriggersSchema, RecordingConfigSchema, RecordingDaysSchema, RecordingDeviceUsageSchema, RecordingLocationUsageSchema, RecordingManifestSchema, RecordingRangeSchema, RecordingRebalanceInputSchema, RecordingRebalanceMoveSchema, RecordingRebalancePlanSchema, RecordingRebalanceSkipReasonSchema, RecordingRebalanceSkipSchema, RecordingRetentionSchema, RecordingStatusSchema, RecordingStorageModeSchema, RecordingStorageUsageSchema, RecordingTriggersSchema, RecordingWeekdaySchema, RedirectLoginMethodSchema, RelocateFootageClassSchema, RelocateFootageInputSchema, RelocateJobSchema, RelocateJobStateSchema, RelocateMediaInputSchema, RenderedAsSchema, ReportMotionInputSchema, RetrainAnnotationDraftSchema, RetrainAnnotationKindSchema, RetrainAnnotationSchema, RetrainAnnotationSourceSchema, RetrainAssistResultSchema, RetrainAssistSubjectSchema, RetrainCopyRefusalSchema, RetrainFrameCandidateSchema, RetrainFrameListSchema, RetrainFrameSchema, RetrainFrameSelectionSchema, RetrainMacroClassSchema, RetrainStatusSchema, RetrainTrackSchema, RetrainTransitionResultSchema, RingBuffer, RtpSourceSchema, RtspRestreamEntrySchema, RunnerCameraConfigSchema, RunnerCameraDeviceUIFields, RunnerFrameSourceSchema, RunnerInferenceDeviceSchema, RunnerLocalLoadSchema, RunnerLocalMetricsSchema, SCENE_CONDITIONS, SCENE_CONFIRM_DEFAULT_MAX_IMAGE_PX, SCENE_CONFIRM_DEFAULT_TIMEOUT_MS, SCENE_DEFAULT_ANCHOR_THRESHOLD, SCENE_DEFAULT_CHECK_INTERVAL_SEC, SCENE_DEFAULT_OBSERVATION_SPACING_SEC, SCENE_DEFAULT_QUIET_SECONDS, SCENE_DEFAULT_UNCOVERED_POLICY, SCENE_DIVERGED, SCENE_RESET_RECAPTURES, SCOPE_PRESETS, SCRUB_THUMBNAIL_PRESETS, SCRUB_THUMBNAIL_PRESET_LABELS, SCRUB_THUMBNAIL_PRESET_ORDER, SENSOR_FEATURES, SENSOR_MAP, SOURCE_INFO_METADATA_KEY, STREAM_PROFILE_META, STREAM_QUALITY_LABELS, SUB_DETECTION_TYPES, SYSTEM_CAP_NAMES, SYSTEM_SCOPE_DEVICE_METHODS, SceneCheckSchema, SceneConditionSchema, SceneConfirmSchema, SceneMonitorSchema, SceneMonitorStateSchema, SceneMonitorStatusSchema, SceneReferenceSchema, SceneUnavailableSchema, SceneUncoveredPolicySchema, SceneVerdictSchema, ScopedTokenSchema, ScopedTokenSummarySchema, ScoredObjectEventSchema, ScriptRunnerStatusSchema, ScrubThumbnailPresetSchema, SearchResultSchema, SendEmailInputSchema, SendEmailResultSchema, SendResultSchema, SensorEventSchema, ServerBootModeSchema, ServerPackageStatusSchema, ServerRollbackInfoSchema, ServerUpdateActionResultSchema, ServerUpdateCheckResultSchema, ServerUpdateStateSchema, SetSiteLocationInputSchema, SettingsPatchSchema, SettingsRecordSchema, SettingsSchemaWithValuesSchema, SettingsUpdateResultSchema, ShmRingStatsSchema, SiteLocationSchema, SiteLocationSourceSchema, SiteLocationStatusSchema, SmokeStatusSchema, SmtpStatusSchema, SnapshotImageSchema, SourceInfoSchema, SpatialDetectionSchema, SsoBridgeClaimsSchema, StartEmbeddedInputSchema, StationaryObjectSchema, AbortUploadInputSchema as StorageAbortUploadInputSchema, BeginDownloadInputSchema as StorageBeginDownloadInputSchema, BeginDownloadResultSchema as StorageBeginDownloadResultSchema, BeginUploadInputSchema as StorageBeginUploadInputSchema, BeginUploadResultSchema as StorageBeginUploadResultSchema, EndDownloadInputSchema as StorageEndDownloadInputSchema, FinalizeUploadInputSchema as StorageFinalizeUploadInputSchema, StorageLocationDeclarationSchema, StorageLocationRefSchema, StorageLocationSchema, StorageLocationTypeSchema, StorageMigrationClassSchema, StorageMigrationDestinationsSchema, StorageMigrationFootageMoveInputSchema, StorageMigrationInputSchema, StorageMigrationJobSchema, StorageMigrationLeaseInputSchema, StorageMigrationMediaMoveInputSchema, StorageMigrationMoveSchema, StorageMigrationParticipantSchema, StorageMigrationPhaseSchema, StorageMigrationPlanSchema, ProviderInfoSchema as StorageProviderInfoSchema, ReadChunkInputSchema as StorageReadChunkInputSchema, TestLocationResultSchema as StorageTestLocationResultSchema, WriteChunkInputSchema as StorageWriteChunkInputSchema, StreamCodecSchema, StreamFormatSchema, StreamNetworkStatsSchema, StreamParamsOptionsSchema, StreamParamsStatusSchema, StreamProfileConfigSchema, StreamProfileOptionsSchema, StreamProfilePatchSchema, StreamProfileSchema, StreamSourceEntrySchema, StreamSourceSchema, SubscribeAudioChunksInputSchema, SubscribeAudioChunksResultSchema, SubscribeFramesInputSchema, SubscribeFramesResultSchema, SwitchStatusSchema, SystemMetricsSchema, SystemMirror, TAXONOMY_COLORS, TIMELAPSE_DENSE_FLOOR_SEC, TIMEZONES, TRANSCODE_DOWN_MAX_BITRATE_KBPS, TRANSCODE_DOWN_MAX_HEIGHT, TamperStatusSchema, TankStatusSchema, TargetKindCapsSchema, TargetKindLevelSchema, TargetKindSchema, TargetSchema, TemperatureSensorStatusSchema, TerminalInstanceInfoSchema, TerminalLegacyCameraSchema, TerminalOutputBatchSchema, TerminalOutputEventSchema, TerminalProfileInfoSchema, TerminalSessionInfoSchema, TestConnectionResultSchema$1 as TestConnectionResultSchema, TestConnectionStatusEnum, TestResultSchema, TimelapseRuleInputSchema, TimelapseRulePatchSchema, TimelapseRuleSchema, TimelapseTemplateSchema, ToastSchema, TokenScopeSchema, TopologyNodeSchema, TopologyProcessSchema, TopologyServiceSchema, TrackCascadeCountsSchema, TrackEnvelopeSchema, TrackFlagsPatchSchema, TrackFlagsSchema, TrackProjectionSchema, TrackSchema, TrackSourceSchema, TrackStateSchema, TrackZoneFilterSchema, TrackedDetectionSchema, TrainingExportDeviceTotalsSchema, TrainingExportSummarySchema, TurnServerSchema, UNIT_TABLE, BrokerInfoSchema$1 as UnifiedBrokerInfoSchema, UnitConversionError, UpdateIntegrationInputSchema, UpdateStatusSchema, UpdateUserInputSchema, UserRecordSchema, UserSummarySchema, VISIT_MERGE_GAP_MS, VacuumControlStatusSchema, VacuumStateSchema, ValveStateSchema, ValveStatusSchema, VectorDeclareIndexInputSchema, VectorDeleteByFilterInputSchema, VectorDeleteInputSchema, VectorDeleteResultSchema, VectorFilterSchema, VectorGetInputSchema, VectorGetResultSchema, VectorItemSchema, VectorMatchSchema, VectorMetadataSchema, VectorMetricSchema, VectorQueryInputSchema, VectorQueryResultSchema, VectorStatsInputSchema, VectorStatsResultSchema, VectorUpsertInputSchema, VectorUpsertResultSchema, VibrationStatusSchema, VideoEncodeSchema, WEBRTC_EGRESS_PROFILE, WELL_KNOWN_TABS, WELL_KNOWN_TAB_MAP, WaterHeaterStatusSchema, WeatherStatusSchema, WebrtcStreamChoiceSchema, WebrtcStreamTargetSchema, WhiteBalanceModeSchema, WidgetHostEnum, WidgetLoginMethodSchema, WidgetMetadataSchema, WidgetRemoteSchema, WidgetSizeEnum, YAMNET_TO_MACRO, ZoneCrossingDirectionSchema, ZoneCrossingSchema, ZoneKindEnum, ZoneRuleModeEnum, ZoneRuleSchema, ZoneRuleStageEnum, ZoneRulesArraySchema, ZoneSchema, ZoneScopeBreakdownSchema, accessoriesCapability, accessoryStableId, addonPagesCapability, addonPagesSourceCapability, addonRoutesCapability, addonSettingsCapability, addonWidgetsCapability, addonWidgetsSourceCapability, addonsCapability, adminUiCapability, airQualitySensorCapability, alarmPanelCapability, alertsCapability, ambientLightSensorCapability, asBoolean, asJsonArray, asJsonObject, asNumber, asString, assertTimelapseCadences, audioAnalysisCapability, audioAnalyzerCapability, audioCodecCapability, audioIsFailClosed, audioKindId, audioLabelChoices, audioMetricsCapability, audioModeOf, audioOrDefaults, audioPlanFromEncodeProfile, authProviderCapability, autoAssignProfiles, automationControlCapability, backupCapability, bareAddonId, batteryCapability, bestLocationMatch, binaryCapability, bindAddonActions, brightnessCapability, brokerCapability, buildAddonRouteProvider, buildAudioArgs, buildEventKindDescriptor, buildFfmpegArgs, buildInputArgs, buildModelVariantGroups, buildNcTaxonomy, buildRoleScopes, buildStreamParamsConfigSchema, buildVideoArgs, buttonCapability, cameraCredentialsCapability, cameraPipelineConfigCapability, cameraStreamsCapability, canConvertUnit, canonicalEgressPlan, carbonMonoxideCapability, cellsToRects, classifyBearerPrincipal, classifyStream, classifyStreams, climateControlCapability, collectHydratedFieldEntries, collectHydratedFieldValues, colorCapability, colorForKind, commitWatchdogRestart, compileExpression, compileExpressionSafe, composeSwitchedOff, conditionDepth, conditionExclusionReason, conditionVisibleForKind, connectionTestCapability, connectivityCapability, consumablesCapability, contactCapability, controlCapability, convertUnit, coreBlockAddonId, coreBlockIdFromAddonId, coreBlocksCapability, cosineSimilarity, countConditionLeaves, coverCapability, createDeviceProxy, createDurableState, createEvent, createExpressionScope, createHwAccelCache, createLazyTrpcSource, createMirrorSource, createRuntimeStateBridge, createSliceHandle, createSystemProxy, customAction, customModelRegistryCapability, dataStoreProviderCapability, dayNightCapability, declarationOwnerNodeId, decodeVectorBase64, decoderCapability, defaultDeliveryForSection, defaultDeviceFor, defineCustomActions, deriveBatteryPresence, deriveCameraSwitches, deriveDetailCropRect, deriveRecordingMode, describeModelVariant, detectAccessRole, detectionPipelineCapability, deviceAdoptionCapability, deviceBackendToFormat, deviceCustomAction, deviceDiscoveryCapability, deviceExportCapability, deviceManagerCapability, deviceMatchesProfile, deviceOpsCapability, deviceProviderCapability, deviceSelectorMatches, deviceStateCapability, deviceStatusCapability, doorbellCapability, droppedConditionsForKind, egressTranscodeSharingKey, egressTransportFromRequest, embeddingEncoderCapability, emitDownForOwnedCaps, emitReadiness, encodeProfileFromStreamShape, encodeVectorBase64, enumSensorCapability, enumerateInferenceDevices, enumerateItemArrayFields, enumerateSchemaFields, errMsg, evaluateAst, evaluateExpressionSource, evaluatePoolMemory, evaluateZoneRules, event, eventEmitterCapability, eventsCapability, expandCapMethods, extractNestedAddonId, extractSourceInfoFromMetadata, faceGalleryCapability, fanControlCapability, featureProbeCapability, filesystemBrowseCapability, findTimezone, floodCapability, formatForBackend, formatForRuntime, gasCapability, generateAutomationBlock, getAudioMacroClassIds, getByPath, getCapsByProviderKind, getTaxonomyEntry, hasMotionTrigger, hfModelUrl, htmlToText, humidifierCapability, humiditySensorCapability, hydrateSchema, imageCapability, imageSettingsCapability, initialPoolMemoryState, integrationsCapability, intercomCapability, invocationFromEncodeProfile, isAgentOnlyPlacement, isArrayOutputSchema, isAudioLabelSelected, isAudioRule, isBaseConditionKey, isBatteryPresenceFault, isCollectionArrayMethod, isDeployableToAgent, isDetectionMacroClass, isDeviceConfigCap, isDeviceScopedCap, isEvent, isIsolatedBuiltin, isNode, isObjectInput, isOccupancyRule, isRestoredCap, isSameAddonId, isScheduleActive, isSoftwareDecode, isSystemDelivery, isVoidInput, jobKindSchema, kebabToCamel, knownValues, lawnMowerControlCapability, lifecycleJobSchema, lifecycleJobScopeSchema, lifecycleJobStateSchema, lifecycleTaskSchema, llmCapability, llmRuntimeCapability, localNetworkCapability, locationSimilarity, lockControlCapability, logBannerArgs, logDestinationCapability, logLevelAtMost, loginMethodCapability, looseSchema, makeProfileBrokerId, makeSourceBrokerId, mapAudioLabelToMacro, markdownToHtmlLite, markdownToText, maskUrlCredentials, mediaPlayerCapability, mergeSourceInfo, meshNetworkCapability, method, methodAccessForHttpMethod, metricsProviderCapability, modelConvertCapability, modelDistributorCapability, modelFormatForRuntime, motionCapability, motionDetectionCapability, motionTriggerCapability, motionZonesCapability, mqttBrokerCapability, nativeObjectDetectionCapability, networkAccessCapability, networkQualityCapability, nodePin, nodesCapability, normalizeAddonInitResult, normalizeAudioLabel, normalizeTokenScopes, normalizeUnit, notificationOutputCapability, notificationRulesCapability, notifierCapability, numericSensorCapability, oauthIntegrationCapability, objectInputDeclaresAddonId, osdCapability, osdManagerCapability, parseCameraStreamConfig, parseExpression, parseJsonArray, parseJsonObject, parseJsonUnknown, parseProcStatus, parseProfileBrokerId, parseRuleSection, parseStreamParamsFormPatch, patchAudio, petFeederCapability, pickAccessoryControl, pickDetailCropConvention, pickNativeLeaseOverride, pickPreferredRtspEntry, pickRestartCandidate, pickVideoEncoder, pickerForCondition, pipelineAnalyticsCapability, pipelineExecutorCapability, pipelineOrchestratorCapability, pipelineRunnerCapability, plateGalleryCapability, platformProbeCapability, poolMemoryThreshold, powerMeterCapability, prepareNotification, presenceCapability, pressureSensorCapability, principalMayReachAddon, privacyMaskCapability, procedureAuthKey, ptzAutotrackCapability, ptzCapability, pythonScriptForBackend, readDetailCropConvention, readDeviceStateFrom, readNativeLeaseOverride, readNodePin, readTimelapseGeneratedAt, readinessKey, rebootCapability, recordingCapability, recordingExportCapability, rectsToCells, requiresPython, resetPoolBaseline, resolveAddonExecution, resolveAddonGroup, resolveAddonPlacement, resolveAddonRuntime, resolveCapMount, resolveDetectionRuntime, resolveDeviceControlKind, resolveDeviceProfile, resolveEgressDecodeHwAccel, resolveFormat, resolveHydratedFieldValue, resolveModelFormat, resolveMutate, resolvePoolMemoryPolicy, resolveRecordingProfiles, resolveRunnerId, resolveScrubThumbnailGeometry, resolveVariantModelId, resolveViewableDeviceIds, roleSpec, ruleEditorSectionsForKind, ruleKindOf, ruleKindSpec, ruleMatchesSection, ruleSection, ruleSectionOf, ruleSeedForSection, runInferenceStep, runtimeDevices, runtimeStatePolicyFor, sceneMonitorCapability, scopeInherits, scopeKey, scopesAllowAddon, scopesAllowDeviceCap, scoreRuntimes, scriptRunnerCapability, selectAssignedProfileSlots, serverManagementCapability, setByPath, settingsStoreCapability, sleep, sleepCancellable, smokeCapability, smtpProviderCapability, snapshotCapability, ssoBridgeCapability, startReachabilityPoll, stateVocabularyFor, storageCapability, storageEvictableCapability, storageMigrationCapability, storageProviderCapability, streamBrokerCapability, streamCatalogCapability, streamParamsCapability, streamPixels, streamQualityLabel, subKindsOf, summarisePrivacyAudio, summarizeEffectiveScope, supportedRuntimes, switchCapability, switchedOffIds, synthesizeSourceInfo, systemCapability, systemEventFilterApplies, systemEventFilterAppliesToAnyKind, tamperCapability, taskLogEntrySchema, taskPhaseSchema, taskTargetSchema, temperatureSensorCapability, terminalSessionCapability, textToHtml, toDeviceSummary, toExpressionValue, toNodeId, toStreamSourceEntry, toastCapability, toggleAudioLabel, tokenize, transcodeBody, tryConvertUnit, turnProviderCapability, unitDimension, unitsForDimension, updateCapability, userManagementCapability, userPasskeysCapability, vacuumControlCapability, validateExpressionSource, validateRecipeBounds, valveCapability, vectorDimFromBase64, vectorStoreCapability, vibrationCapability, videoclipsCapability, viewerUiCapability, waterHeaterCapability, weatherCapability, webrtcClientHintsSchema, webrtcSessionCapability, wiringAddonHealthSchema, wiringHealthSnapshotSchema, wiringNodeHealthSchema, wiringProbeKindSchema, wiringProbeResultSchema, zodEntriesToConfigUI, zoneAnalyticsCapability, zoneRulesCapability, zonesCapability };
46913
+ export { ACCESSORY_LABEL, ACCESS_ROLES, ALEXA_EGRESS_PROFILE, ALL_CAPABILITY_DEFINITIONS, APPLE_SA_TO_MACRO, AUDIO_ANALYSIS_CAP_NAME, AUDIO_BACKEND_CHOICES, AUDIO_MACRO_LABELS, AUDIO_PRESETS, AccessoriesStatusSchema, AccessoryKind, AddBrokerInputSchema, AddonAutoUpdateSchema, AddonListItemSchema, AddonPageDeclarationSchema, AddonPageInfoSchema, AdoptInputSchema as AdoptionAdoptInputSchema, AdoptResultSchema as AdoptionAdoptResultSchema, AdoptionCandidateResultSchema, AdoptionFilterSchema, GetCandidateInputSchema as AdoptionGetCandidateInputSchema, AdoptionJobSchema, AdoptionJobStateSchema, ListCandidatesInputSchema as AdoptionListCandidatesInputSchema, ListCandidatesOutputSchema as AdoptionListCandidatesOutputSchema, AdoptionOutcomeSchema, ReleaseInputSchema as AdoptionReleaseInputSchema, AdoptionStatusSchema, AgentLoadSummarySchema, AirQualitySensorStatusSchema, AlarmArmModeSchema, AlarmPanelStatusSchema, AlarmStateSchema, AlertSchema, AlertSeveritySchema, AlertSourceSchema, AlertStatusSchema, AmbientLightSensorStatusSchema, ApiKeyRecordSchema, ApiKeySummarySchema, ArchiveEntrySchema, ArchiveManifestSchema, AttachmentMediaTypeSchema, AttachmentSchema, AudioAnalysisResultSchema, AudioAnalysisSettingsSchema, AudioChunkInputSchema, AudioClassSummarySchema, AudioClassificationLabelSchema, AudioClassificationResultSchema, AudioCodecInfoSchema, AudioDecodeSessionConfigSchema, AudioEncodeSchema, AudioEncodeSessionConfigSchema, AudioEncodedChunkSchema, AudioEventSchema, AudioLevelSchema, AudioMetricsHistoryPointSchema, AudioMetricsHistorySchema, AudioMetricsSnapshotSchema, AudioPcmChunkSchema, AuthResultSchema, AutoUpdateSettingsSchema, AutomationActionSchema, AutomationConditionOperatorSchema, AutomationConditionSchema, AutomationControlStatusSchema, AutomationRecipeSchema, AutomationTriggerSchema, AvailableIntegrationTypeSchema, BACKEND_TO_FORMAT, BASE_LIVE_EGRESS_PROFILE, BATTERY_DEVICE_PROFILE, BATTERY_UNREACHABLE_AFTER_MS, BOOT_RECOVERY_BACKOFF_MS, BacklightModeSchema, BackupDestinationInfoSchema, BackupEntrySchema, BaseAddon, BaseDevice, BaseDeviceProvider, BatteryStatusSchema, BinaryStatusSchema, BoundingBoxSchema, BrightnessStatusSchema, AddInputSchema as BrokerAddInputSchema, BrokerAudioClientSchema, BrokerClientsSchema, BrokerConnectionDetailsSchema, BrokerConsumerAttributionSchema, BrokerConsumerKindSchema, BrokerDecodedClientSchema, BrokerEncodedClientSchema, GetStateInputSchema as BrokerGetStateInputSchema, BrokerInfoSchema, BrokerProviderInfoSchema, PublishInputSchema as BrokerPublishInputSchema, RegistryStatusSchema as BrokerRegistryStatusSchema, BrokerRtspClientSchema, BrokerStatsSchema, BrokerStatusEnum, BrokerStatusSchema, SubscribeInputSchema as BrokerSubscribeInputSchema, SubscribeResultSchema as BrokerSubscribeResultSchema, TestConnectionResultSchema as BrokerTestConnectionResultSchema, UnsubscribeInputSchema as BrokerUnsubscribeInputSchema, CAMERA_SWITCH_CATALOG, CAMERA_SWITCH_ORDER, CAM_PROFILE_ORDER, CAPABILITY_NAMES, CAPABILITY_ROUTER_KEYS, CAP_NAMES_WITH_STATUS, CAP_NODE_PIN_CONTEXT_KEY, CAP_PROVIDER_KIND_MAP, CLUSTER_MODEL_SCOPED_STEPS, CLUSTER_MODEL_SECTION_ID, COCO_80_LABELS, COCO_TO_MACRO, CONNECTION_TEST_TIMEOUT_MS, CORE_BLOCKS_ADDON_ID, CORE_BLOCK_ADDON_PREFIX, CamProfileSchema, CamStreamDescriptorSchema, CamStreamKindSchema, CamStreamResolutionSchema, CameraAssignmentStatusSchema, CameraAudioStatusSchema, CameraBrokerProfileSchema, CameraBrokerStatusSchema, CameraCredentialsSchema, CameraCredentialsStatusSchema, CameraDecoderShmSchema, CameraDecoderStatusSchema, CameraDetectionPhaseSchema, CameraDetectionProvisioningSchema, CameraDetectionProvisioningStateSchema, CameraDetectionStatusSchema, CameraMetricsSchema, CameraMetricsWithDeviceIdSchema, CameraMotionStatusSchema, CameraRecordingModeSchema, CameraRecordingStatusSchema, CameraSourceStatusSchema, CameraSourceStreamSchema, CameraStatusDegradationReasonSchema, CameraStatusDegradationSchema, CameraStatusSchema, CameraStatusStageSchema, CameraStreamSchema, CameraSwitchAuthoritySchema, CameraSwitchGroupSchema, CameraSwitchIdSchema, CameraSwitchSchema, CameraSwitchUnavailableReasonSchema, CandidateQueryFilterSchema, CapScopeSchema, CapabilityBindingsSchema, CarbonMonoxideStatusSchema, ChargingStatus, ClientNetworkStatsSchema, ClimateControlStatusSchema, ClipPlaybackSchema, ClipSchema, ClusterAddonNodeDeploymentSchema, ClusterAddonStatusEntrySchema, CollectionColumnSchema, CollectionIndexSchema, ColorStatusSchema, ConfigEntrySchema, ConfigSectionWithValuesSchema, ConfigTabDeclarationSchema, ConnectionTestDescriptorSchema, ConnectionTestInputSchema, ConnectionTestOutcomeSchema, ConnectivityStatusSchema, ConsumableItemSchema, ConsumablesStatusSchema, ContactStatusSchema, ControlKindSchema, ControlStatusSchema, ConvertArtifactSchema, ConvertResultSchema, ConvertTargetSchema, CoreBlockCompileResultSchema, CoreBlockInputSchema, CoreBlockPlacementSchema, CoreBlockSchema, CoreBlockStatusSchema, CoverStateSchema, CoverStatusSchema, CreateApiKeyInputSchema, CreateApiKeyResultSchema, CreateIntegrationInputSchema, CreateScopedTokenInputSchema, CreateScopedTokenResultSchema, CreateUserInputSchema, CustomActionInputSchema, CustomModelDescriptorSchema, DATAPLANE_SECRET_HEADER, DECLARED_DEVICE_SWEEP_LIMIT, DECLARED_INTEGRATION_FIXED_KEY, DEFAULT_ADDON_PLACEMENT, DEFAULT_AUDIO_ANALYZER_CONFIG, DEFAULT_CLUSTER_STEP_MODELS, DEFAULT_DECODER_HWACCEL_CONFIG, DEFAULT_DETAIL_CROP_CONVENTION, DEFAULT_EVENTS_BAND_BUFFER_SEC, DEFAULT_EVENT_COLOR, DEFAULT_FEATURES, DEFAULT_NATIVE_LEASE_SETTINGS, DEFAULT_POOL_MEMORY_POLICY, DEFAULT_RECORDING_PROFILES, DEFAULT_RETENTION, DEFAULT_RUNTIME_STATE_DURABILITY, DEFAULT_SCRUB_THUMBNAIL_PRESET, DEFAULT_TIMELAPSE_PREVIEW_TEXT, DETAIL_CROP_PADDING_FIELD, DETAIL_CROP_PADDING_KEY, DETAIL_CROP_SECTION_ID, DETAIL_CROP_SQUARE_KEY, DETECTION_MACRO_CLASSES, DETECTION_PIPELINE_CAP_NAME, DEVICE_BACKEND_TO_FORMAT, DEVICE_CAP_NAMES, DEVICE_PROFILES, DEVICE_SCOPED_CAPS, DEVICE_SETTINGS_CONTRIBUTION_METHODS, DEVICE_STATE_READERS, DEVICE_STATUS_METHOD, DEVICE_TYPE_CONTROL_KIND, DEVICE_TYPE_INFO, EngineInfoSchema as DataStoreEngineInfoSchema, DayNightModeSchema, DayNightOptionsSchema, DayNightSettingsPatchSchema, DayNightStatusSchema, DeclaredDevices, DecodedAudioChunkSchema, DecodedFrameSchema, DecoderSessionConfigSchema, DecoderStatsSchema, DeleteIntegrationResultSchema, DetailCropConventionSchema, DetectionSourceSchema, DeviceCodeSeveritySchema, DeviceConfig, DeviceDiscoveryStatusSchema, ExposeInputSchema as DeviceExportExposeInputSchema, DeviceExportStatusSchema, UnexposeInputSchema as DeviceExportUnexposeInputSchema, DeviceFeature, DeviceInfoSchema, DeviceNetworkStatsSchema, DeviceRole, DeviceRuntimeState, DeviceSelectorSchema, DeviceStatusSchema, DeviceType, DiscoveredChildDeviceSchema, DiscoveredChildStatusSchema, DiscoveredDeviceSchema, DiscoveredTargetSchema, DiskReconcileJobSchema, DisposerChain, DoorbellPressEventSchema, DoorbellStatusSchema, EVENTFUL_CAP_NAMES, EVENT_KIND_BY_CAP, EVENT_PAD_MS, EVENT_TAXONOMY, EXPORT_DENSE_MAX_RANGES, EXPRESSION_BUILTINS, EXPRESSION_BUILTIN_NAMES, EXPRESSION_COMPILE_CACHE_CAPACITY, EXPRESSION_IDENTIFIER_RE, EXPRESSION_INJECTED_NOW, EgressEncodeSchema, EgressRateControlSchema, EgressTranscodeRequestSchema, EgressTranscodeSchema, ElementConfigStore, EmbeddingInfoSchema, EmbeddingResultSchema, EncodeProfileSchema, EncodedPacketSchema, EnrichedWidgetMetadataSchema, EnumSensorDateTimeFormatSchema, EnumSensorStatusSchema, EventCategory, EventEmitterStatusSchema, EventFireSchema, EventItemSchema, EventKindCategorySchema, EventKindDescriptorSchema, EventKindIconSchema, EventKindSchema, EventKindsForDeviceSchema, EventMediaArtifactSchema, EventMediaCoverageSchema, EventMediaKindSchema, EventMediaProductionSchema, EventSourceType, ExportBytesSchema, ExportDenseRangeSchema, ExportDenseSchema, ExportDownloadSchema, ExportOptionsSchema, ExportRecordSchema, ExportSetupFieldSchema, ExportSetupSchema, ExportSpeedSchema, ExportStateSchema, ExportTimelapseSchema, ExposedDeviceSchema, ExposureModeSchema, ExpressionBindingSourceSchema, ExpressionEvalError, ExpressionFieldBindingSchema, ExpressionGlobalBindingSchema, ExpressionLiteralBindingSchema, ExpressionParseError, ExpressionSourceSchema, FULL_IMAGE_BBOX, FanControlStatusSchema, FanDirectionSchema, FeatureManifestSchema, FeatureProbeStatusSchema, FloodStatusSchema, Fmp4BoxSplitter, FrameHandleFormatSchema, FrameHandleSchema, FrameInputSchema, GasStatusSchema, GetStreamWithCodecInputSchema, GlobalMetricsSchema, HAP_AUDIO_BASE, HAP_AUDIO_BITRATE_KBPS, HAP_AUDIO_VBV_KBITS, HAP_KEYFRAME_INTERVAL_SEC, HF_BASE_URL, HF_REPO, HWACCEL_OPTIONS, HealthStatusSchema, HfModelResolutionSchema, HistoryPointSchema, HistoryResolutionEnum, HumidifierStatusSchema, HumiditySensorStatusSchema, HvacModeSchema, ImageContractSchema, ImageContractStateSchema, ImageRotateSchema, ImageSettingsOptionsSchema, ImageSettingsPatchSchema, ImageSettingsStatusSchema, ImageStatusSchema, IngestOwnerSchema, InstalledPackageSchema, IntegrationLiteSchema, IntegrationWithStateSchema, IntercomAbilitySchema, IntercomStatusSchema, KNOWN_CAP_NAMES, KeyEventSchema, LOG_LEVEL_RANK, LabelAttributionSchema, LabelDefinitionSchema, LabelTierSchema, LawnMowerActivitySchema, LawnMowerControlStatusSchema, LinkedDeviceSchema, LinkedDevicesModeSchema, LlmDefaultSchema, LlmDefaultSelectorSchema, LlmDownloadProgressSchema, LlmErrorCodeSchema, LlmGenerateBaseInputSchema, LlmGenerateErrSchema, LlmGenerateOkSchema, LlmGenerateResultSchema, LlmImageSchema, LlmNodeModelSchema, LlmProfileKindDescriptorSchema, LlmProfileKindSchema, LlmProfileSchema, LlmRetryPolicySchema, LlmRuntimeCompleteInputSchema, LlmRuntimeDiskUsageSchema, LlmRuntimeNodeSchema, LlmRuntimeStatusSchema, LlmTimeoutDefaults, LlmUsageRollupSchema, LlmUsageSchema, LocateSegmentResultSchema, LocationStatSchema, LockControlStatusSchema, LockStateSchema, LogEntrySchema, LogLevelSchema, LogStreamEntrySchema, LoginMethodContributionSchema, LoginStageEnum, MACRO_LABELS, MAX_CLIP_EVENT_IDS, MAX_CLIP_LABELS, MAX_CONDITION_DEPTH, MAX_CONDITION_LEAVES, MAX_EXPRESSION_AST_NODES, MAX_EXPRESSION_BINDINGS, MAX_EXPRESSION_CALL_ARGS, MAX_EXPRESSION_EVAL_STEPS, MAX_EXPRESSION_SOURCE_LENGTH, METHOD_ACCESS_MAP, METHOD_DEVICE_SELECTORS, MODEL_FORMATS, MOTION_TRIGGER_FEATURE, ManagedModelCatalogEntrySchema, ManagedModelExtraFileSchema, ManagedModelRefSchema, ManagedRuntimeConfigSchema, MaskGridDimsSchema, MaskGridShapeSchema, MaskLineShapeSchema, MaskPointSchema, MaskPolygonShapeSchema, MaskPolygonVerticesSchema, MaskRectShapeSchema, MaskShapeKindSchema, MaskShapeSchema, MediaFileInfoSchema, MediaFileSchema, MediaPlayerRepeatSchema, MediaPlayerStateSchema, MediaPlayerStatusSchema, MeshPeerSchema, MeshStatusSchema, MethodAccessSchema, ModelCatalogEntrySchema, ModelConvertInputSchema, ModelConvertMetadataSchema, ModelDistributeInputSchema, ModelDistributeResultSchema, ModelExtraFileSchema, ModelFormatEntrySchema, ModelFormatsSchema, ModelSubstitutionSchema, ModelVariantGroupSchema, MotionAnalysisResultSchema, MotionEventSchema, MotionOnMotionChangedDataSchema, MotionRegionSchema, MotionSourceEnum, MotionSourcesSchema, MotionStatusSchema, MotionTriggerRuntimeStateSchema, MotionTriggerStatusSchema, MotionZoneOptionsSchema, MotionZonePatchSchema, MotionZoneRegionSchema, MotionZoneStatusSchema, StatusSchema as MqttBrokerStatusSchema, MutationFilterSchema, NATIVE_LEASE_ACTIVITY_FIELD, NATIVE_LEASE_ACTIVITY_KEY, NATIVE_LEASE_ADMISSION_FIELD, NATIVE_LEASE_ADMISSION_KEY, NATIVE_LEASE_BUDGET_FIELD, NATIVE_LEASE_BUDGET_KEY, NATIVE_LEASE_HOLD_FIELD, NATIVE_LEASE_HOLD_KEY, NATIVE_LEASE_SECTION_ID, NATIVE_LEASE_TILE_BUDGET_FIELD, NATIVE_LEASE_TILE_BUDGET_KEY, NC_ALARM_SYSTEM_EVENT_KINDS, NC_AUDIO_DBFS_FLOOR, NC_AUDIO_DB_MAX, NC_AUDIO_DB_MIN, NC_AUDIO_DB_OFFERED, NC_AUDIO_DB_STEP, NC_AUDIO_DEFAULTS, NC_AUDIO_HIT_PERCENT_MAX, NC_AUDIO_HIT_PERCENT_MIN, NC_AUDIO_SAMPLING_MAX_SEC, NC_AUDIO_SAMPLING_MIN_SEC, NC_AUDIO_SEED, NC_AUTHORABLE_SYSTEM_EVENT_KINDS, NC_BASE_CONDITION_KEYS, NC_CONDITION_CATALOG, NC_CONFIRM_DEFAULT_MAX_IMAGE_PX, NC_CONFIRM_DEFAULT_TIMEOUT_MS, NC_CONFIRM_MAX_TIMEOUT_MS, NC_CONFIRM_MIN_TIMEOUT_MS, NC_DEFAULT_SNOOZE_MINUTES, NC_HISTORY_LIMIT_DEFAULT, NC_HISTORY_LIMIT_MAX, NC_MAX_PER_TRACK_IMMEDIATE, NC_OCCUPANCY_DEFAULTS, NC_RULE_EDITOR_SECTION_ORDER, NC_RULE_KIND_SPECS, NC_RULE_SECTIONS, NC_SNOOZE_MAX_MINUTES, NC_SYSTEM_DELIVERY, NC_SYSTEM_EVENT_FILTER_KEYS, NC_TAXONOMY, NativeCropBboxSchema, NativeCropRefSchema, NativeCropResultSchema, NativeDetectionSchema, NativeLeaseAdmissionSchema, NativeLeaseSettingsSchema, NativeObjectClassEnum, NativeObjectDetectionRuntimeStateSchema, NativeObjectDetectionStatusSchema, NcAlarmConfigSchema, NcAlarmModeCoverageSchema, NcAlarmSettingsPatchSchema, NcAlarmSettingsSchema, NcAlarmSkipReasonSchema, NcAlarmSkippedDeviceSchema, NcAudioConditionSchema, NcConditionDescriptorSchema, NcConditionsSchema, NcConfirmExpectSchema, NcConfirmSchema, NcCrossingSchema, NcDeliverySchema, NcDeviceStateConditionSchema, NcHistoryEntrySchema, NcHistoryFilterSchema, NcHistoryRecordKindSchema, NcHistoryStatusSchema, NcHistorySubjectSchema, NcMediaFrameSchema, NcMediaPolicySchema, NcOccupancyConditionSchema, NcPlateMatcherSchema, NcRuleActionSchema, NcRuleActionSequenceSchema, NcRuleActionsSchema, NcRuleInputSchema, NcRuleNotificationButtonSchema, NcRulePatchSchema, NcRuleSchema, NcRuleTargetSchema, NcSceneConditionSchema, NcScheduleSchema, NcScheduleWindowSchema, NcSnoozeInputSchema, NcSnoozeSchema, NcSnoozeScopeSchema, NcSnoozeSuppressedSchema, NcSystemEventConditionSchema, NcSystemEventKindSchema, NcTaxonomyEntrySchema, NcTaxonomySchema, NcTestResultSchema, NcThrottleGranularitySchema, NcThrottleSchema, NcZoneConditionSchema, NetworkAccessStatusSchema, NetworkAddressSchema, NetworkEndpointSchema, NotificationActionIconSchema, NotificationActionSchema, NotificationFormatSchema, NotificationSchema, NotifierStatusSchema, NumericSensorStatusSchema, OPS_LOG_DEFAULT_LIMIT, OPS_LOG_RING_DEFAULT_MAX, OauthIntegrationDescriptorSchema, ObjectEventSchema, OpsLogDomainSchema, OpsLogEntrySchema, OpsLogOpSchema, OpsLogQueryInputSchema, OpsLogReasonSchema, OrchestratorMetricsSchema, OsdOverlayKindEnum, OsdOverlayPatchSchema, OsdOverlaySchema, OsdPositionEnum, OsdRenderOutcomeEnum, OsdRenderResultSchema, OsdSlotBindingSchema, OsdSlotViewSchema, OsdSourceOptionSchema, OsdSourceSchema, OsdSourceValueTypeEnum, OsdStatusSchema, PET_FEEDER_MANUAL_FEED_MAX, PET_FEEDER_MANUAL_FEED_MIN, PIPELINE_FLOW_CAPABILITY_NAMES, PIPELINE_OWNER_CAPABILITY_NAMES, PRIVACY_MASK_CAP_NAME, PROVIDER_KIND_CAP_NAMES, PYTHON_SCRIPT, PackageUpdateSchema, PackageVersionInfoSchema, PasskeyLoginMethodSchema, PasskeySummarySchema, PcmSampleFormatSchema, PerScopeBreakdownSchema, PetFeederStatusSchema, PickStreamPreferencesSchema, PickStreamRequirementsSchema, PickedCamStreamSchema, PipelineAssignmentSchema, PipelineDefaultStepSchema, PipelineEngineChoiceSchema, PipelineRunResultBridge, PipelineStepInputSchema, PipelineValidationIssueSchema, PipelineValidationResultSchema, PlaceholderReasonSchema, PolygonPointSchema, PoolMemoryWatchdog, PowerMeterStatusSchema, PresenceStatusSchema, PressureSensorStatusSchema, PrivacyMaskOptionsSchema, PrivacyMaskPatchSchema, PrivacyMaskRegionSchema, PrivacyMaskShapeSchema, PrivacyMaskStatusSchema, ProfileRtspEntrySchema, ProfileSlotSchema, ProfileSlotStatusSchema, ProviderStatusSchema, PtzAutotrackRuntimeStateSchema, PtzAutotrackSettingsSchema, PtzAutotrackStatusSchema, PtzAutotrackTargetOptionSchema, PtzMoveCommandSchema, PtzOptionsSchema, PtzPositionSchema, PtzPresetSchema, PtzStatusSchema, QueryFilterSchema, RATE_CONTROL_RELAXED, RATE_CONTROL_TIGHT, REACHABILITY_FAILURES_TO_OFFLINE, REACHABILITY_POLL_INTERVAL_MS, REACHABILITY_PROBE_TIMEOUT_MS, RECOGNITION_TYPES, RECORDING_EXPORT_MAX_READ_BYTES, RESERVED_BINDING_NAMES, RESTORED_CAP_NAMES, RUNTIME_DEFAULTS, RUNTIME_STATE_POLICY, RUNTIME_TO_FORMAT, RawStateResultSchema, ReadGopBytesResultSchema, ReadSegmentBytesResultSchema, ReadinessRegistry, ReadinessTimeoutError, RecentTracksPageSchema, RecentTracksQueryInput, RecordingAvailabilitySchema, RecordingBandModeSchema, RecordingBandSchema, RecordingBandTriggersSchema, RecordingConfigSchema, RecordingDaysSchema, RecordingDeviceUsageSchema, RecordingLocationUsageSchema, RecordingManifestSchema, RecordingRangeSchema, RecordingRebalanceInputSchema, RecordingRebalanceMoveSchema, RecordingRebalancePlanSchema, RecordingRebalanceSkipReasonSchema, RecordingRebalanceSkipSchema, RecordingRetentionSchema, RecordingStatusSchema, RecordingStorageModeSchema, RecordingStorageUsageSchema, RecordingTriggersSchema, RecordingWeekdaySchema, RedirectLoginMethodSchema, RelocateFootageClassSchema, RelocateFootageInputSchema, RelocateJobSchema, RelocateJobStateSchema, RelocateMediaInputSchema, RenderedAsSchema, ReportMotionInputSchema, RetrainAnnotationDraftSchema, RetrainAnnotationKindSchema, RetrainAnnotationSchema, RetrainAnnotationSourceSchema, RetrainAssistResultSchema, RetrainAssistSubjectSchema, RetrainCopyRefusalSchema, RetrainFrameCandidateSchema, RetrainFrameListSchema, RetrainFrameSchema, RetrainFrameSelectionSchema, RetrainMacroClassSchema, RetrainStatusSchema, RetrainTrackSchema, RetrainTransitionResultSchema, RingBuffer, RtpSourceSchema, RtspRestreamEntrySchema, RunnerCameraConfigSchema, RunnerCameraDeviceUIFields, RunnerFrameSourceSchema, RunnerInferenceDeviceSchema, RunnerLocalLoadSchema, RunnerLocalMetricsSchema, SCENE_CONDITIONS, SCENE_CONFIRM_DEFAULT_MAX_IMAGE_PX, SCENE_CONFIRM_DEFAULT_TIMEOUT_MS, SCENE_DEFAULT_ANCHOR_THRESHOLD, SCENE_DEFAULT_CHECK_INTERVAL_SEC, SCENE_DEFAULT_OBSERVATION_SPACING_SEC, SCENE_DEFAULT_QUIET_SECONDS, SCENE_DEFAULT_UNCOVERED_POLICY, SCENE_DIVERGED, SCENE_RESET_RECAPTURES, SCOPE_PRESETS, SCRUB_THUMBNAIL_PRESETS, SCRUB_THUMBNAIL_PRESET_LABELS, SCRUB_THUMBNAIL_PRESET_ORDER, SENSOR_FEATURES, SENSOR_MAP, SOURCE_INFO_METADATA_KEY, STREAM_PROFILE_META, STREAM_QUALITY_LABELS, SUB_DETECTION_TYPES, SYSTEM_CAP_NAMES, SYSTEM_SCOPE_DEVICE_METHODS, SceneCheckSchema, SceneConditionSchema, SceneConfirmSchema, SceneMonitorSchema, SceneMonitorStateSchema, SceneMonitorStatusSchema, SceneReferenceSchema, SceneUnavailableSchema, SceneUncoveredPolicySchema, SceneVerdictSchema, ScopedTokenSchema, ScopedTokenSummarySchema, ScoredObjectEventSchema, ScriptRunnerStatusSchema, ScrubThumbnailPresetSchema, SearchResultSchema, SendEmailInputSchema, SendEmailResultSchema, SendResultSchema, SensorEventSchema, ServerBootModeSchema, ServerPackageStatusSchema, ServerRollbackInfoSchema, ServerUpdateActionResultSchema, ServerUpdateCheckResultSchema, ServerUpdateStateSchema, SetSiteLocationInputSchema, SettingsPatchSchema, SettingsRecordSchema, SettingsSchemaWithValuesSchema, SettingsUpdateResultSchema, ShmRingStatsSchema, SiteLocationSchema, SiteLocationSourceSchema, SiteLocationStatusSchema, SmokeStatusSchema, SmtpStatusSchema, SnapshotImageSchema, SourceInfoSchema, SpatialDetectionSchema, SsoBridgeClaimsSchema, StartEmbeddedInputSchema, StationaryObjectSchema, AbortUploadInputSchema as StorageAbortUploadInputSchema, BeginDownloadInputSchema as StorageBeginDownloadInputSchema, BeginDownloadResultSchema as StorageBeginDownloadResultSchema, BeginUploadInputSchema as StorageBeginUploadInputSchema, BeginUploadResultSchema as StorageBeginUploadResultSchema, EndDownloadInputSchema as StorageEndDownloadInputSchema, FinalizeUploadInputSchema as StorageFinalizeUploadInputSchema, StorageLocationDeclarationSchema, StorageLocationRefSchema, StorageLocationSchema, StorageLocationTypeSchema, StorageMigrationClassSchema, StorageMigrationDestinationsSchema, StorageMigrationFootageMoveInputSchema, StorageMigrationInputSchema, StorageMigrationJobSchema, StorageMigrationLeaseInputSchema, StorageMigrationMediaMoveInputSchema, StorageMigrationMoveSchema, StorageMigrationParticipantSchema, StorageMigrationPhaseSchema, StorageMigrationPlanSchema, ProviderInfoSchema as StorageProviderInfoSchema, ReadChunkInputSchema as StorageReadChunkInputSchema, TestLocationResultSchema as StorageTestLocationResultSchema, WriteChunkInputSchema as StorageWriteChunkInputSchema, StreamCodecSchema, StreamFormatSchema, StreamNetworkStatsSchema, StreamParamsOptionsSchema, StreamParamsStatusSchema, StreamProfileConfigSchema, StreamProfileOptionsSchema, StreamProfilePatchSchema, StreamProfileSchema, StreamSourceEntrySchema, StreamSourceSchema, SubscribeAudioChunksInputSchema, SubscribeAudioChunksResultSchema, SubscribeFramesInputSchema, SubscribeFramesResultSchema, SwitchStatusSchema, SystemMetricsSchema, SystemMirror, TAXONOMY_COLORS, TIMELAPSE_DENSE_FLOOR_SEC, TIMEZONES, TRANSCODE_DOWN_MAX_BITRATE_KBPS, TRANSCODE_DOWN_MAX_HEIGHT, TamperStatusSchema, TankStatusSchema, TargetKindCapsSchema, TargetKindLevelSchema, TargetKindSchema, TargetSchema, TemperatureSensorStatusSchema, TerminalInstanceInfoSchema, TerminalLegacyCameraSchema, TerminalOutputBatchSchema, TerminalOutputEventSchema, TerminalProfileInfoSchema, TerminalSessionInfoSchema, TestConnectionResultSchema$1 as TestConnectionResultSchema, TestConnectionStatusEnum, TestResultSchema, TimelapseRuleInputSchema, TimelapseRulePatchSchema, TimelapseRuleSchema, TimelapseTemplateSchema, ToastSchema, TokenScopeSchema, TopologyNodeSchema, TopologyProcessSchema, TopologyServiceSchema, TrackCascadeCountsSchema, TrackEnvelopeSchema, TrackFlagsPatchSchema, TrackFlagsSchema, TrackProjectionSchema, TrackSchema, TrackSourceSchema, TrackStateSchema, TrackZoneFilterSchema, TrackedDetectionSchema, TrainingExportDeviceTotalsSchema, TrainingExportSummarySchema, TurnServerSchema, UNIT_TABLE, BrokerInfoSchema$1 as UnifiedBrokerInfoSchema, UnitConversionError, UpdateIntegrationInputSchema, UpdateStatusSchema, UpdateUserInputSchema, UserRecordSchema, UserSummarySchema, VISIT_MERGE_GAP_MS, VacuumControlStatusSchema, VacuumStateSchema, ValveStateSchema, ValveStatusSchema, VectorDeclareIndexInputSchema, VectorDeleteByFilterInputSchema, VectorDeleteInputSchema, VectorDeleteResultSchema, VectorFilterSchema, VectorGetInputSchema, VectorGetResultSchema, VectorItemSchema, VectorMatchSchema, VectorMetadataSchema, VectorMetricSchema, VectorQueryInputSchema, VectorQueryResultSchema, VectorStatsInputSchema, VectorStatsResultSchema, VectorUpsertInputSchema, VectorUpsertResultSchema, VibrationStatusSchema, VideoEncodeSchema, WEBRTC_EGRESS_PROFILE, WELL_KNOWN_TABS, WELL_KNOWN_TAB_MAP, WaterHeaterStatusSchema, WeatherStatusSchema, WebrtcStreamChoiceSchema, WebrtcStreamTargetSchema, WhiteBalanceModeSchema, WidgetHostEnum, WidgetLoginMethodSchema, WidgetMetadataSchema, WidgetRemoteSchema, WidgetSizeEnum, YAMNET_TO_MACRO, ZoneCrossingDirectionSchema, ZoneCrossingSchema, ZoneKindEnum, ZoneRuleModeEnum, ZoneRuleSchema, ZoneRuleStageEnum, ZoneRulesArraySchema, ZoneSchema, ZoneScopeBreakdownSchema, accessoriesCapability, accessoryStableId, addonPagesCapability, addonPagesSourceCapability, addonRoutesCapability, addonSettingsCapability, addonWidgetsCapability, addonWidgetsSourceCapability, addonsCapability, adminUiCapability, airQualitySensorCapability, alarmPanelCapability, alertsCapability, ambientLightSensorCapability, asBoolean, asJsonArray, asJsonObject, asNumber, asString, assertTimelapseCadences, audioAnalysisCapability, audioAnalyzerCapability, audioCodecCapability, audioIsFailClosed, audioKindId, audioLabelChoices, audioMetricsCapability, audioModeOf, audioOrDefaults, audioPlanFromEncodeProfile, authProviderCapability, autoAssignProfiles, automationControlCapability, backupCapability, bareAddonId, batteryCapability, bestLocationMatch, binaryCapability, bindAddonActions, brightnessCapability, brokerCapability, buildAddonRouteProvider, buildAudioArgs, buildEventKindDescriptor, buildFfmpegArgs, buildInputArgs, buildModelVariantGroups, buildNcTaxonomy, buildRoleScopes, buildStreamParamsConfigSchema, buildVideoArgs, buttonCapability, cameraCredentialsCapability, cameraPipelineConfigCapability, cameraStreamsCapability, canConvertUnit, canonicalEgressPlan, carbonMonoxideCapability, cellsToRects, classifyBearerPrincipal, classifyStream, classifyStreams, climateControlCapability, clusterModelSettingKey, collectHydratedFieldEntries, collectHydratedFieldValues, colorCapability, colorForKind, commitWatchdogRestart, compileExpression, compileExpressionSafe, composeSwitchedOff, conditionDepth, conditionExclusionReason, conditionVisibleForKind, connectionTestCapability, connectivityCapability, consumablesCapability, contactCapability, controlCapability, convertUnit, coreBlockAddonId, coreBlockIdFromAddonId, coreBlocksCapability, cosineSimilarity, countConditionLeaves, coverCapability, createDeviceProxy, createDurableState, createEvent, createExpressionScope, createHwAccelCache, createLazyTrpcSource, createMirrorSource, createRuntimeStateBridge, createSliceHandle, createSystemProxy, customAction, customModelRegistryCapability, dataStoreProviderCapability, dayNightCapability, declarationOwnerNodeId, decodeVectorBase64, decoderCapability, defaultDeliveryForSection, defaultDeviceFor, defineCustomActions, deriveBatteryPresence, deriveCameraSwitches, deriveDetailCropRect, deriveRecordingMode, describeModelVariant, detectAccessRole, detectionPipelineCapability, deviceAdoptionCapability, deviceBackendToFormat, deviceCustomAction, deviceDiscoveryCapability, deviceExportCapability, deviceManagerCapability, deviceMatchesProfile, deviceOpsCapability, deviceProviderCapability, deviceSelectorMatches, deviceStateCapability, deviceStatusCapability, doorbellCapability, droppedConditionsForKind, egressTranscodeSharingKey, egressTransportFromRequest, embeddingEncoderCapability, emitDownForOwnedCaps, emitReadiness, encodeProfileFromStreamShape, encodeVectorBase64, enumSensorCapability, enumerateInferenceDevices, enumerateItemArrayFields, enumerateSchemaFields, errMsg, evaluateAst, evaluateExpressionSource, evaluatePoolMemory, evaluateZoneRules, event, eventEmitterCapability, eventsCapability, expandCapMethods, extractNestedAddonId, extractSourceInfoFromMetadata, faceGalleryCapability, fanControlCapability, featureProbeCapability, filesystemBrowseCapability, findTimezone, floodCapability, formatForBackend, formatForRuntime, gasCapability, generateAutomationBlock, getAudioMacroClassIds, getByPath, getCapsByProviderKind, getTaxonomyEntry, hasMotionTrigger, hfModelUrl, htmlToText, humidifierCapability, humiditySensorCapability, hydrateSchema, imageCapability, imageSettingsCapability, initialPoolMemoryState, integrationsCapability, intercomCapability, invocationFromEncodeProfile, isAgentOnlyPlacement, isArrayOutputSchema, isAudioLabelSelected, isAudioRule, isBaseConditionKey, isBatteryPresenceFault, isClusterScopedStep, isCollectionArrayMethod, isDeployableToAgent, isDetectionMacroClass, isDeviceConfigCap, isDeviceScopedCap, isEvent, isIsolatedBuiltin, isNode, isObjectInput, isOccupancyRule, isRestoredCap, isSameAddonId, isScheduleActive, isSoftwareDecode, isSystemDelivery, isVoidInput, jobKindSchema, kebabToCamel, knownValues, lawnMowerControlCapability, lifecycleJobSchema, lifecycleJobScopeSchema, lifecycleJobStateSchema, lifecycleTaskSchema, llmCapability, llmRuntimeCapability, localNetworkCapability, locationSimilarity, lockControlCapability, logBannerArgs, logDestinationCapability, logLevelAtMost, loginMethodCapability, looseSchema, makeProfileBrokerId, makeSourceBrokerId, mapAudioLabelToMacro, markdownToHtmlLite, markdownToText, maskUrlCredentials, mediaPlayerCapability, mergeSourceInfo, meshNetworkCapability, method, methodAccessForHttpMethod, metricsProviderCapability, modelConvertCapability, modelDistributorCapability, modelFormatForRuntime, motionCapability, motionDetectionCapability, motionTriggerCapability, motionZonesCapability, mqttBrokerCapability, nativeObjectDetectionCapability, networkAccessCapability, networkQualityCapability, nodePin, nodesCapability, normalizeAddonInitResult, normalizeAudioLabel, normalizeTokenScopes, normalizeUnit, notificationOutputCapability, notificationRulesCapability, notifierCapability, numericSensorCapability, oauthIntegrationCapability, objectInputDeclaresAddonId, osdCapability, osdManagerCapability, parseCameraStreamConfig, parseExpression, parseJsonArray, parseJsonObject, parseJsonUnknown, parseProcStatus, parseProfileBrokerId, parseRuleSection, parseStreamParamsFormPatch, patchAudio, petFeederCapability, pickAccessoryControl, pickClusterStepModels, pickDetailCropConvention, pickNativeLeaseOverride, pickPreferredRtspEntry, pickRestartCandidate, pickVideoEncoder, pickerForCondition, pipelineAnalyticsCapability, pipelineExecutorCapability, pipelineOrchestratorCapability, pipelineRunnerCapability, plateGalleryCapability, platformProbeCapability, poolMemoryThreshold, powerMeterCapability, prepareNotification, presenceCapability, pressureSensorCapability, principalMayReachAddon, privacyMaskCapability, procedureAuthKey, ptzAutotrackCapability, ptzCapability, pythonScriptForBackend, readClusterStepModels, readDetailCropConvention, readDeviceStateFrom, readNativeLeaseOverride, readNodePin, readTimelapseGeneratedAt, readinessKey, rebootCapability, recordingCapability, recordingExportCapability, rectsToCells, requiresPython, resetPoolBaseline, resolveAddonExecution, resolveAddonGroup, resolveAddonPlacement, resolveAddonRuntime, resolveCapMount, resolveClusterStepModelId, resolveDetectionRuntime, resolveDeviceControlKind, resolveDeviceProfile, resolveEgressDecodeHwAccel, resolveFormat, resolveHydratedFieldValue, resolveModelFormat, resolveMutate, resolvePoolMemoryPolicy, resolveRecordingProfiles, resolveRunnerId, resolveScrubThumbnailGeometry, resolveVariantModelId, resolveViewableDeviceIds, roleSpec, ruleEditorSectionsForKind, ruleKindOf, ruleKindSpec, ruleMatchesSection, ruleSection, ruleSectionOf, ruleSeedForSection, runInferenceStep, runtimeDevices, runtimeStatePolicyFor, sceneMonitorCapability, scopeInherits, scopeKey, scopesAllowAddon, scopesAllowDeviceCap, scoreRuntimes, scriptRunnerCapability, selectAssignedProfileSlots, serverManagementCapability, setByPath, settingsStoreCapability, sleep, sleepCancellable, smokeCapability, smtpProviderCapability, snapshotCapability, ssoBridgeCapability, startReachabilityPoll, stateVocabularyFor, storageCapability, storageEvictableCapability, storageMigrationCapability, storageProviderCapability, streamBrokerCapability, streamCatalogCapability, streamParamsCapability, streamPixels, streamQualityLabel, subKindsOf, summarisePrivacyAudio, summarizeEffectiveScope, supportedRuntimes, switchCapability, switchedOffIds, synthesizeSourceInfo, systemCapability, systemEventFilterApplies, systemEventFilterAppliesToAnyKind, tamperCapability, taskLogEntrySchema, taskPhaseSchema, taskTargetSchema, temperatureSensorCapability, terminalSessionCapability, textToHtml, toDeviceSummary, toExpressionValue, toNodeId, toStreamSourceEntry, toastCapability, toggleAudioLabel, tokenize, transcodeBody, tryConvertUnit, turnProviderCapability, unitDimension, unitsForDimension, updateCapability, userManagementCapability, userPasskeysCapability, vacuumControlCapability, validateExpressionSource, validateRecipeBounds, valveCapability, vectorDimFromBase64, vectorStoreCapability, vibrationCapability, videoclipsCapability, viewerUiCapability, waterHeaterCapability, weatherCapability, webrtcClientHintsSchema, webrtcSessionCapability, wiringAddonHealthSchema, wiringHealthSnapshotSchema, wiringNodeHealthSchema, wiringProbeKindSchema, wiringProbeResultSchema, zodEntriesToConfigUI, zoneAnalyticsCapability, zoneRulesCapability, zonesCapability };
@@ -111,12 +111,25 @@ export type RecordingBand = z.infer<typeof RecordingBandSchema>;
111
111
  * segment is ever finalized and the camera records nothing anyway. At the 10 s
112
112
  * default segment length, 30 s leaves room for two full segments. `preBufferSec`
113
113
  * is retroactive only — it costs nothing at record time, it merely keeps
114
- * already-written segments — so it is set to one segment length.
114
+ * already-written segments.
115
115
  *
116
- * An EXPLICIT `0` is left alone: that is an operator statement, not an omission.
116
+ * ## Why `preBufferSec` is 15 and not one segment length
117
+ *
118
+ * It has to cover the broker's RECORDING pre-roll, which is media handed to the
119
+ * writer from BEFORE the trigger (D192/D193). If this bound were narrower, the
120
+ * keep gate would delete the very seconds the ring just supplied — two
121
+ * authorities disagreeing about the same footage, which is the failure D191 was
122
+ * written against. It is therefore set to `RECORDING_PRE_ROLL_MAX_MS` (15 s),
123
+ * the widest window the broker can be configured to serve, so an operator
124
+ * raising the cluster pre-roll can never walk past the gate silently. The
125
+ * addon-side guard is
126
+ * `packages/addon-pipeline/src/recorder/addon/__tests__/band-decision.spec.ts`.
127
+ *
128
+ * An EXPLICIT `0` is left alone: that is an operator statement, not an omission,
129
+ * and it is excluded from that invariant by name.
117
130
  */
118
131
  export declare const DEFAULT_EVENTS_BAND_BUFFER_SEC: {
119
- readonly preBufferSec: 10;
132
+ readonly preBufferSec: 15;
120
133
  readonly postBufferSec: 30;
121
134
  };
122
135
  export type DefaultEventsBandBufferSec = typeof DEFAULT_EVENTS_BAND_BUFFER_SEC;
@@ -0,0 +1,108 @@
1
+ /**
2
+ * How a step's model is chosen.
3
+ *
4
+ * - `'node'` — per (node, device). Free to differ across the fleet.
5
+ * - `'cluster'` — ONE value for the whole cluster. The step writes into a
6
+ * shared vector index, so two values would put two incomparable feature
7
+ * spaces in it with nothing in the data to show it.
8
+ *
9
+ * Absent on a {@link import('../types/pipeline-step.js').StepDefinition} means
10
+ * `'node'`, which is the safe reading: a step that never declared a scope has
11
+ * never had a cluster-wide row to read.
12
+ */
13
+ export type StepModelScope = 'node' | 'cluster';
14
+ /** One selectable model for a cluster-scoped step. */
15
+ export interface ClusterModelOption {
16
+ readonly id: string;
17
+ readonly label: string;
18
+ }
19
+ /** One cluster-scoped step, as every non-pipeline package sees it. */
20
+ export interface ClusterModelScopedStep {
21
+ readonly stepId: string;
22
+ /** Operator-facing label for the settings row. */
23
+ readonly label: string;
24
+ /**
25
+ * The model in force when nobody has chosen — the step's catalog
26
+ * `defaultModelId`, so declaring the scope is behaviour-neutral.
27
+ */
28
+ readonly defaultModelId: string;
29
+ /** The index a change invalidates, named in the operator-facing description. */
30
+ readonly indexName: string;
31
+ /**
32
+ * The choosable models, mirrored from the step's catalog (non-`legacy`
33
+ * entries) and guarded by `scripts/check-cluster-model-scope.ts`.
34
+ *
35
+ * Mirrored rather than derived because the orchestrator renders this dropdown
36
+ * and may not import an addon. A free-text field would have been less code
37
+ * and strictly worse: a typo there is not a validation error, it is a model
38
+ * that every node refuses, cluster-wide, and the symptom is "recognition
39
+ * stopped" with no bad value in sight.
40
+ */
41
+ readonly options: readonly ClusterModelOption[];
42
+ }
43
+ /**
44
+ * The cluster-scoped steps. Mirrored from the catalog's `modelScope: 'cluster'`
45
+ * declarations and guarded by `scripts/check-cluster-model-scope.ts`.
46
+ */
47
+ export declare const CLUSTER_MODEL_SCOPED_STEPS: readonly ClusterModelScopedStep[];
48
+ /**
49
+ * Store identity of the cluster row inside `pipeline-orchestrator`'s GLOBAL
50
+ * (cluster-wide) settings — the same owner, and for the same reason, as the
51
+ * detail-crop convention: hub-resident and neutral between the addons that
52
+ * read it.
53
+ */
54
+ export declare const CLUSTER_MODEL_SECTION_ID = "cluster-step-models";
55
+ /**
56
+ * The settings key holding one step's cluster model choice.
57
+ *
58
+ * Step-qualified so the keys stay unique across the addon's whole schema, which
59
+ * is what lets {@link pickClusterStepModels} walk every section instead of
60
+ * trusting the section id.
61
+ */
62
+ export declare function clusterModelSettingKey(stepId: string): string;
63
+ /** True when this step's model is a cluster-wide choice rather than a per-node one. */
64
+ export declare function isClusterScopedStep(stepId: string): boolean;
65
+ /** `stepId → modelId` for every cluster-scoped step. Total: never missing a key. */
66
+ export type ClusterStepModels = Readonly<Record<string, string>>;
67
+ /** The cluster row when nobody has configured one — today's catalog defaults. */
68
+ export declare const DEFAULT_CLUSTER_STEP_MODELS: ClusterStepModels;
69
+ /**
70
+ * Narrow a FLAT settings record to the cluster row.
71
+ *
72
+ * Per-FIELD fallback, deliberately (same rule as `readDetailCropConvention`): a
73
+ * junk face model must not also discard a valid clip model. An absent, empty or
74
+ * non-string value resolves to the step's catalog default — the historical
75
+ * behaviour — never to a blank id, because a blank id downstream becomes
76
+ * "substitute the format default", which is precisely the substitution this
77
+ * scope exists to forbid.
78
+ */
79
+ export declare function readClusterStepModels(config: Readonly<Record<string, unknown>>): ClusterStepModels;
80
+ /** One section of an `addon-settings.getGlobalSettings` payload. */
81
+ export interface HydratedClusterSection {
82
+ readonly fields: readonly unknown[];
83
+ }
84
+ /**
85
+ * Minimal structural view of `ConfigUISchemaWithValues` — only what this walk
86
+ * needs. Structural on purpose: the readers are addons that must not depend on
87
+ * the writer's schema type.
88
+ */
89
+ export interface HydratedClusterView {
90
+ readonly sections: readonly HydratedClusterSection[];
91
+ }
92
+ /**
93
+ * Extract the cluster row from an `addon-settings.getGlobalSettings` payload.
94
+ *
95
+ * Walks EVERY section rather than looking inside {@link CLUSTER_MODEL_SECTION_ID}
96
+ * alone: the keys are unique across the addon's schema, and a section rename
97
+ * must not silently revert the whole cluster to the defaults. A `null` payload
98
+ * (addon mid-boot) is the defaults.
99
+ */
100
+ export declare function pickClusterStepModels(view: HydratedClusterView | null): ClusterStepModels;
101
+ /**
102
+ * The cluster model for `stepId`, or `null` when the step is node-scoped.
103
+ *
104
+ * `null` is the signal to LEAVE THE CALLER'S RESOLUTION ALONE — it is not "no
105
+ * model". Returning a default here for a node-scoped step would quietly
106
+ * override every per-(node,device) selection in the fleet.
107
+ */
108
+ export declare function resolveClusterStepModelId(stepId: string, models: ClusterStepModels): string | null;
@@ -95,6 +95,25 @@ export interface HydratedSettingsView {
95
95
  * (addon mid-boot) is the default convention.
96
96
  */
97
97
  export declare function pickDetailCropConvention(view: HydratedSettingsView | null): DetailCropConvention;
98
+ /**
99
+ * The normalised box that means "the image IS the subject".
100
+ *
101
+ * Used when the stored pixels are ALREADY the model's input — the 112×112
102
+ * aligned face template a gallery sample carries. There is no rectangle left to
103
+ * choose, and the convention must not choose one: re-detecting and re-aligning
104
+ * over a template applies a SECOND warp, passes every gate, and produces a
105
+ * plausible useless vector (session 2026-08-20 §3).
106
+ *
107
+ * Sending it as the whole frame with this box is exact rather than merely
108
+ * convenient, and the reason is a property of {@link deriveDetailCropRect}, not
109
+ * a coincidence: padding a full-frame box can only push OUTSIDE the frame, and
110
+ * both edge modes bring it straight back — unsquared truncates, squared cannot
111
+ * exceed the frame's short side and then slides inside. So for a SQUARE image
112
+ * the derivation is the identity under every convention value, and an operator
113
+ * changing the crop margin cannot silently re-cut an enrolled template.
114
+ * `face-reembed-pass.spec.ts` asserts that identity against the real function.
115
+ */
116
+ export declare const FULL_IMAGE_BBOX: DetailCropRect;
98
117
  /** Slider bounds for the operator-facing padding knob (orchestrator settings UI). */
99
118
  export declare const DETAIL_CROP_PADDING_FIELD: {
100
119
  readonly min: 0;
@@ -1,4 +1,5 @@
1
1
  import type { ConfigField } from '../interfaces/config-ui.js';
2
+ import type { StepModelScope } from '../pipeline/cluster-model-scope.js';
2
3
  import type { ClassMapDefinition } from './labels.js';
3
4
  import type { ModelCatalogEntry } from './models.js';
4
5
  import type { PipelineSlot } from './pipeline.js';
@@ -12,7 +13,7 @@ export interface IPipelineStep {
12
13
  readonly definition: StepDefinition;
13
14
  getConfigSchema(): readonly ConfigField[];
14
15
  }
15
- export type PostprocessorType = 'yolo' | 'ssd' | 'rfdetr' | 'yolo-seg' | 'scrfd' | 'arcface' | 'clip' | 'softmax' | 'ctc' | 'saliency' | 'yamnet';
16
+ export type PostprocessorType = 'yolo' | 'ssd' | 'rfdetr' | 'yolonas' | 'yolo-seg' | 'scrfd' | 'arcface' | 'clip' | 'softmax' | 'ctc' | 'plate-slots' | 'saliency' | 'yamnet';
16
17
  export interface StepDefinition {
17
18
  /** Unique step identifier (e.g., 'object-detection', 'face-detection') */
18
19
  readonly id: string;
@@ -75,6 +76,27 @@ export interface StepDefinition {
75
76
  * duplicating the step definition per engine.
76
77
  */
77
78
  readonly defaultModelIdByFormat?: Readonly<Record<string, string>>;
79
+ /**
80
+ * WHOSE choice this step's model is — see
81
+ * [`pipeline/cluster-model-scope.ts`](../pipeline/cluster-model-scope.ts).
82
+ *
83
+ * - `'node'` (the default when absent) — per (node, device). Two nodes may
84
+ * answer differently because nothing compares their outputs: a box is a
85
+ * box.
86
+ * - `'cluster'` — ONE value for the whole cluster, stored in ONE
87
+ * `pipeline-orchestrator` global row. Declared by a step that writes into a
88
+ * SHARED VECTOR INDEX (`face-embedding` → the enrolled gallery,
89
+ * `clip-embedding` → `vec_object_clip`), where a second model does not
90
+ * degrade the ranking, it makes it meaningless — and nothing inside a
91
+ * vector can reveal which encoder produced it.
92
+ *
93
+ * A `'cluster'` declaration changes the RESOLUTION RULE, not just the storage:
94
+ * a node whose format ships no build of the chosen model REFUSES the step and
95
+ * logs it, where a node-scoped step would substitute that format's default
96
+ * ([D54](../../../../docs/decisions/adr-0056.md)). Substituting is what fills
97
+ * one index from several encoders.
98
+ */
99
+ readonly modelScope?: StepModelScope;
78
100
  /**
79
101
  * Whether a newly-seeded agent has this addon enabled by default.
80
102
  * Absent = `true`. Operators can always toggle this after boot; this
@@ -135,6 +157,14 @@ export interface StepDefinition {
135
157
  * `DEFAULT_MIN_TEXT_CONFIDENCE` (0, disabled).
136
158
  */
137
159
  readonly minTextConfidence?: number;
160
+ /**
161
+ * Plausibility gate for a FIXED-SLOT plate reader (`plate-slots`): the
162
+ * minimum probability the WEAKEST emitted character must carry. It replaces
163
+ * {@link minTextLength}, which carries no information for a reader that emits
164
+ * a full-length string on every input including a blank wall. Forwarded to
165
+ * the Python postprocessor; absent ⇒ its `DEFAULT_MIN_CHAR_PROBABILITY`.
166
+ */
167
+ readonly minCharProbability?: number;
138
168
  /** COCO-to-macro class mapping (e.g., 'car' → 'vehicle') */
139
169
  readonly classMap?: ClassMapDefinition;
140
170
  /** UI grouping label — steps with the same group are displayed together (e.g., 'Segmentation') */
@@ -234,6 +264,11 @@ export interface PoolModelConfig {
234
264
  readonly minTextLength?: number;
235
265
  /** Plate-OCR plausibility gate: confidence floor. */
236
266
  readonly minTextConfidence?: number;
267
+ /**
268
+ * Fixed-slot plate-OCR gate: minimum per-character probability. See
269
+ * {@link StepDefinition.minCharProbability}.
270
+ */
271
+ readonly minCharProbability?: number;
237
272
  /** Number of classes (for YOLO: 80 COCO or 1 for plate) */
238
273
  readonly numClasses?: number;
239
274
  /** Anchor strides for SCRFD (default [8, 16, 32]) */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/types",
3
- "version": "1.2.92",
3
+ "version": "1.2.94",
4
4
  "description": "Shared types, interfaces, and model catalogs for the CamStack detection ecosystem",
5
5
  "keywords": [
6
6
  "camstack",