@camstack/addon-post-analysis 1.2.304 → 1.2.306

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (14) hide show
  1. package/dist/{clip-model-registry--qJe8fTH.js → clip-model-registry-C67UM_q_.js} +234 -8
  2. package/dist/{clip-model-registry-DBKCbXPJ.mjs → clip-model-registry-C9Aw4qkh.mjs} +193 -9
  3. package/dist/embedding-encoder/index.js +1 -1
  4. package/dist/embedding-encoder/index.mjs +1 -1
  5. package/dist/pipeline-analytics/_stub.js +2 -2
  6. package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-sLPWG5v8.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-QE0Juzwb.mjs} +2 -2
  7. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-MwQBD526.mjs +26 -0
  8. package/dist/pipeline-analytics/{_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-DJR5XsVb.mjs → _virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-B8qeS8Da.mjs} +1 -1
  9. package/dist/pipeline-analytics/{hostInit-D23-Tde_.mjs → hostInit-DzNrV8y8.mjs} +2 -2
  10. package/dist/pipeline-analytics/index.js +6617 -2793
  11. package/dist/pipeline-analytics/index.mjs +6657 -2836
  12. package/dist/pipeline-analytics/remoteEntry.js +1 -1
  13. package/package.json +1 -1
  14. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-CMq-UvYj.mjs +0 -26
@@ -11267,6 +11267,28 @@ var FailureCounters = class {
11267
11267
  this.counters.clear();
11268
11268
  }
11269
11269
  };
11270
+ var APPEARANCE_BIN_COUNT = 96;
11271
+ var APPEARANCE_BLOCKS = {
11272
+ upperHs: [0, 32],
11273
+ upperV: [32, 40],
11274
+ upperGrad: [40, 48],
11275
+ lowerHs: [48, 80],
11276
+ lowerV: [80, 88],
11277
+ lowerGrad: [88, 96]
11278
+ };
11279
+ /**
11280
+ * Whether appearance may influence anything at all (D683 §3.2, fix round 1
11281
+ * ruling 2026-09-30 on the Task 10 cost-bench STOP): OFF until the
11282
+ * descriptor is calibrated on tapes that carry it (Task 23, review M9).
11283
+ *
11284
+ * This is the ONE authority both addons read — never two settings that
11285
+ * could disagree (CLAUDE.md D62). The tracker's `TrackerV2Config.appearanceResolvesAmbiguity`
11286
+ * default reads it (`addon-post-analysis/pipeline/tracker-v2/types.ts`); the
11287
+ * runner's cost gate reads it too (`addon-pipeline/pipeline-runner/appearance-attach.ts`),
11288
+ * short-circuiting BEFORE any crop, resample or descriptor is computed, so a
11289
+ * disabled camera costs nothing extra per frame.
11290
+ */
11291
+ var APPEARANCE_RESOLVES_AMBIGUITY_DEFAULT = false;
11270
11292
  var ClipModelMetaSchema = object({
11271
11293
  /** The paired text encoder's catalog id (the embedding-encoder's text catalog). */
11272
11294
  textModelId: string().min(1),
@@ -20214,10 +20236,12 @@ var NcMediaPolicySchema = object({
20214
20236
  /**
20215
20237
  * Cooldown GRANULARITY over the subject's class — how much a fired
20216
20238
  * notification suppresses.
20217
- * - `shared` (default, and the absent value) — one window for the whole
20218
- * rule/scope: a cat silences the next dog for `cooldownSec`.
20219
- * - `per-class` — an independent window per detected class, so cat→dog fires
20220
- * at once and cat→cat still waits.
20239
+ * - `per-class` (default, and the absent value since 2026-10-01 — D36) — an
20240
+ * independent window per detected class: cat→dog fires at once, cat→cat
20241
+ * still waits.
20242
+ * - `shared` — one window for the whole rule/scope: a cat silences the next
20243
+ * dog for `cooldownSec`. Only written when an operator picks it; it is no
20244
+ * longer what an unset rule means.
20221
20245
  *
20222
20246
  * AUDIO subjects are ALWAYS per-class regardless of this setting: a scream
20223
20247
  * must not be swallowed by a bark's window (the precedent this generalizes —
@@ -20232,8 +20256,11 @@ var NcThrottleSchema = object({
20232
20256
  /**
20233
20257
  * Class granularity of the cooldown key. Optional rather than defaulted:
20234
20258
  * a Zod default does NOT run on the addon→addon cap path, so a persisted
20235
- * rule authored before this field simply carries none — and the engine
20236
- * reads absent as `shared`, the pre-existing behaviour.
20259
+ * rule authored before this field simply carries none. The engine used to
20260
+ * read absent as `shared` (D36); since 2026-10-01 it reads absent as
20261
+ * `per-class` — the operator's default — and only an explicit `shared`
20262
+ * still means `shared`. See `cooldownKey` / `keysPerClass` in the rule
20263
+ * engine, and D36's dated note.
20237
20264
  */
20238
20265
  granularity: NcThrottleGranularitySchema.optional()
20239
20266
  });
@@ -24492,13 +24519,19 @@ var pipelineAnalyticsCapability = {
24492
24519
  *
24493
24520
  * Operator-driven from the DI Events page (batch delete). Routes through
24494
24521
  * the same widened track-deletion cascade (design §5.2).
24522
+ *
24523
+ * `sparedMediaIds` (D683 Task 14): media rows the cascade LEFT because a
24524
+ * live stationary entry vouches for them (its key frame, owned by a track
24525
+ * that moved and was kept). Released when the entry retires. Optional:
24526
+ * absent from a provider that predates it.
24495
24527
  */
24496
24528
  deleteTracks: method(object({
24497
24529
  deviceId: number(),
24498
24530
  trackIds: array(string()).min(1)
24499
24531
  }), object({
24500
24532
  deleted: number().int(),
24501
- failed: array(string()).readonly()
24533
+ failed: array(string()).readonly(),
24534
+ sparedMediaIds: array(number().int()).readonly().optional()
24502
24535
  }), {
24503
24536
  kind: "mutation",
24504
24537
  auth: "admin"
@@ -27208,7 +27241,42 @@ var SetCameraSensorsInputSchema = object({
27208
27241
  /** `null` removes the attachment: the camera goes back to `not-configured`. */
27209
27242
  config: CameraSensorsConfigSchema.nullable()
27210
27243
  });
27211
- method(StorageMigrationLeaseInputSchema, object({ paused: literal(true) }), {
27244
+ /**
27245
+ * Why an early occupancy look (D691) was not scheduled.
27246
+ *
27247
+ * - `unknown-camera` — no session was ever dispatched for it, so there is no
27248
+ * node and no config to attach a burst with.
27249
+ * - `out-of-range` — the ask is negative or further out than the orchestrator
27250
+ * will hold a timer for; the parked-object cadence is the answer there.
27251
+ * - `no-burst-producer` — this build has no burst producer at all.
27252
+ * - `already-looked` — this camera's ONE early look since its last session has
27253
+ * been spent. A look's own burst can re-arm a flickering flip, and a look
27254
+ * per arm would chain a burst every ~30 s forever (review H2); the next
27255
+ * real session re-arms the budget.
27256
+ */
27257
+ var OccupancyLookRefusalSchema = _enum([
27258
+ "unknown-camera",
27259
+ "out-of-range",
27260
+ "no-burst-producer",
27261
+ "already-looked"
27262
+ ]);
27263
+ method(object({
27264
+ deviceId: number().int().nonnegative(),
27265
+ /** How long from NOW until the pending flip's sustain window ends. RELATIVE,
27266
+ * so the caller's clock and the orchestrator's never have to agree. */
27267
+ afterMs: number().finite(),
27268
+ /** Why, for the log. */
27269
+ reason: string()
27270
+ }), object({
27271
+ scheduled: boolean(),
27272
+ /** When `scheduled`: how long until the burst is dialled. */
27273
+ dueInMs: number().optional(),
27274
+ /** When not `scheduled`: why. */
27275
+ refusedBecause: OccupancyLookRefusalSchema.optional()
27276
+ }), {
27277
+ kind: "mutation",
27278
+ auth: "admin"
27279
+ }), method(StorageMigrationLeaseInputSchema, object({ paused: literal(true) }), {
27212
27280
  kind: "mutation",
27213
27281
  auth: "admin"
27214
27282
  }), method(StorageMigrationLeaseInputSchema, object({ resumed: literal(true) }), {
@@ -27462,6 +27530,8 @@ function buildDescriptor(capName, kind) {
27462
27530
  * contributes one entry per bound cap present in this map.
27463
27531
  */
27464
27532
  var EVENT_KIND_BY_CAP = Object.freeze(Object.fromEntries(Object.entries(CAP_TO_KIND).map(([capName, kind]) => [capName, buildDescriptor(capName, kind)])));
27533
+ /** The cap names covered by the taxonomy (for the anti-drift guard). */
27534
+ var EVENTFUL_CAP_NAMES = Object.keys(CAP_TO_KIND);
27465
27535
  /**
27466
27536
  * Build a full `EventKindDescriptor` for a taxonomy `kind`, stamping the
27467
27537
  * per-device `source`. Returns null when `kind` is not in the taxonomy.
@@ -48370,6 +48440,12 @@ Object.freeze({
48370
48440
  addonId: null,
48371
48441
  access: "delete"
48372
48442
  },
48443
+ "pipelineOrchestrator.requestOccupancyLook": {
48444
+ capName: "pipeline-orchestrator",
48445
+ capScope: "system",
48446
+ addonId: null,
48447
+ access: "create"
48448
+ },
48373
48449
  "pipelineOrchestrator.resetNodePipelineDefaults": {
48374
48450
  capName: "pipeline-orchestrator",
48375
48451
  capScope: "system",
@@ -52162,6 +52238,11 @@ Object.freeze({
52162
52238
  form: "single",
52163
52239
  optional: false
52164
52240
  }],
52241
+ "pipelineOrchestrator.requestOccupancyLook": [{
52242
+ name: "deviceId",
52243
+ form: "single",
52244
+ optional: false
52245
+ }],
52165
52246
  "pipelineOrchestrator.resolvePipeline": [{
52166
52247
  name: "deviceId",
52167
52248
  form: "single",
@@ -53240,6 +53321,13 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
53240
53321
  function systemEventKindsOfFamily(family) {
53241
53322
  return NC_SYSTEM_EVENT_KIND_GROUP_SPECS.filter((g) => g.family === family).flatMap((g) => g.kinds);
53242
53323
  }
53324
+ /** The kind names on an UNTYPED condition, or `undefined` when it has none. */
53325
+ function systemEventKindNamesOf(condition) {
53326
+ if (typeof condition !== "object" || condition === null || !("kinds" in condition)) return void 0;
53327
+ const kinds = condition.kinds;
53328
+ if (!Array.isArray(kinds)) return void 0;
53329
+ return kinds.filter((kind) => typeof kind === "string");
53330
+ }
53243
53331
  /**
53244
53332
  * One family, or `mixed`. Mixed covers kinds that span families, a legacy kind,
53245
53333
  * a kind this build does not know (it fails toward read-only and never toward
@@ -53324,6 +53412,102 @@ var NC_SYSTEM_DELIVERY = "system-event";
53324
53412
  function isSystemDelivery(delivery) {
53325
53413
  return delivery === NC_SYSTEM_DELIVERY;
53326
53414
  }
53415
+ /**
53416
+ * Which capability a device must carry to be OFFERED on a rule of this kind's
53417
+ * device-scope picker (operator ruling, 2026-10-01). `null` means "no
53418
+ * capability filter for this kind" — either every device applies (the system
53419
+ * families, each already a separate concern; see
53420
+ * `docs/architecture/notifications.md`'s D637 `deviceIds` table) or `mixed`,
53421
+ * which authors nothing.
53422
+ *
53423
+ * DERIVED, never a hand-picked list:
53424
+ * - `sensor` reads `EVENTFUL_CAP_NAMES` — the SAME cap table the engine
53425
+ * itself turns a linked device's bound caps into sensor event kinds with
53426
+ * (`EVENT_KIND_BY_CAP`). A device this picker offers for a sensor rule is
53427
+ * exactly a device the rule's `sensorKinds` condition could ever name.
53428
+ * - `detection` (which a package-event rule is — there is no separate
53429
+ * `package` kind, D637) / `occupancy` read the one pipeline cap a camera
53430
+ * needs to produce the detections / counts / parcels those kinds match on.
53431
+ * - `sound` reads the one cap a device needs to produce the audio metrics a
53432
+ * sound rule's sampling window is built from.
53433
+ * - `device-events` / `system` / `alarm` / `mixed` are `null`: a device
53434
+ * event rule's `deviceIds` legitimately spans every device type (liveness,
53435
+ * battery, consumable, `detection-blind`), a system rule has no device
53436
+ * scope at all (dropped from the editor's tabs), and `alarm`'s `deviceIds`
53437
+ * is a reference to whichever camera's rule set it off — not a scope this
53438
+ * picker authors.
53439
+ *
53440
+ * Callers resolve the ids via `deviceManager.listDeviceIdsByCaps` (max 16
53441
+ * names — `EVENTFUL_CAP_NAMES` is exactly 16) and must treat an unanswered
53442
+ * read as "unknown", never as "no devices" (D315): this function only names
53443
+ * WHICH caps to ask for, not what to show while the answer is pending.
53444
+ */
53445
+ function ruleDeviceCompatCapNames(kind) {
53446
+ switch (kind) {
53447
+ case "sensor": return EVENTFUL_CAP_NAMES;
53448
+ case "detection":
53449
+ case "occupancy": return ["detection-pipeline"];
53450
+ case "sound": return ["audio-metrics"];
53451
+ case "device-events":
53452
+ case "system":
53453
+ case "alarm":
53454
+ case "mixed": return null;
53455
+ }
53456
+ }
53457
+ /**
53458
+ * The capability every CAMERA carries: `camera-streams` is a `defaultActive`
53459
+ * wrapper bound to every `Camera`-type device (`camera-streams.cap.ts`).
53460
+ * Named once, because a sensor rule's compatible set needs it (below).
53461
+ */
53462
+ var NC_CAMERA_SCOPE_CAP_NAME = "camera-streams";
53463
+ /**
53464
+ * Every capability QUERY whose union is the set of devices a rule of this kind
53465
+ * may be SCOPED to (`conditions.devices`) — what the save-time guard and the
53466
+ * admin's Devices tab ask `deviceManager.listDeviceIdsByCaps`, one call per
53467
+ * entry. `null` exactly where {@link ruleDeviceCompatCapNames} is `null`.
53468
+ *
53469
+ * Several queries rather than one list because `listDeviceIdsByCaps` takes at
53470
+ * most 16 names and `EVENTFUL_CAP_NAMES` is already exactly 16.
53471
+ *
53472
+ * A `sensor` rule's set is the eventful devices PLUS every camera (fix round
53473
+ * 1, 2026-10-01): the engine matches a sensor rule scoped to a CAMERA — a
53474
+ * per-camera row carries the camera's id, and a linked set matches on
53475
+ * `rowCameraIds` (D630 §6) — so a camera-scoped sensor rule is legitimate and
53476
+ * a guard that refused it would make every such stored rule un-editable.
53477
+ */
53478
+ function ruleDeviceCompatCapQueries(kind) {
53479
+ const primary = ruleDeviceCompatCapNames(kind);
53480
+ if (primary === null) return null;
53481
+ return kind === "sensor" ? [primary, [NC_CAMERA_SCOPE_CAP_NAME]] : [primary];
53482
+ }
53483
+ /**
53484
+ * Which kind of rule is this?
53485
+ *
53486
+ * The CONDITION wins over the delivery wherever the engine says it does, and
53487
+ * the order below is the engine's own: `evaluateRule` checks the system branch
53488
+ * first, then the occupancy and audio gates. Takes a plain `delivery` string so
53489
+ * a trigger this build does not know still classifies (as `detection`, which is
53490
+ * the read-only path's own fallback). A system rule classifies by the FAMILY of
53491
+ * its event kinds (D637) — see {@link systemRuleKindOf}.
53492
+ */
53493
+ function ruleKindOf(rule) {
53494
+ if (isSystemDelivery(rule.delivery)) return systemRuleKindOf(rule.conditions.systemEvent);
53495
+ if (rule.conditions.occupancy !== void 0 && rule.delivery === "device-event") return "occupancy";
53496
+ if (rule.conditions.audio !== void 0 && rule.delivery === "immediate") return "sound";
53497
+ if (rule.delivery === "device-event") return "sensor";
53498
+ return "detection";
53499
+ }
53500
+ /**
53501
+ * A system rule's kind: its one family, or `mixed` (D637).
53502
+ *
53503
+ * Takes the UNTYPED condition for the same reason {@link NcRuleConditionsSubject}
53504
+ * is structural. `mixed` covers kinds across families, a legacy or unknown kind,
53505
+ * and no kinds at all — it fails toward read-only, never toward editable.
53506
+ */
53507
+ function systemRuleKindOf(condition) {
53508
+ const verdict = systemEventFamilyOf(systemEventKindNamesOf(condition) ?? []);
53509
+ return verdict.kind === "family" ? verdict.family : "mixed";
53510
+ }
53327
53511
  NC_AUDIO_DEFAULTS.hitPercent, NC_AUDIO_DEFAULTS.samplingSeconds;
53328
53512
  var WEEKDAY_TO_DAY = {
53329
53513
  Sun: 0,
@@ -55812,6 +55996,24 @@ function buildClipModelRegistry(entries) {
55812
55996
  /** The built-in catalog's registry. */
55813
55997
  var BUILTIN_CLIP_MODELS = buildClipModelRegistry(CLIP_IMAGE_MODELS);
55814
55998
  //#endregion
55999
+ Object.defineProperty(exports, "APPEARANCE_BIN_COUNT", {
56000
+ enumerable: true,
56001
+ get: function() {
56002
+ return APPEARANCE_BIN_COUNT;
56003
+ }
56004
+ });
56005
+ Object.defineProperty(exports, "APPEARANCE_BLOCKS", {
56006
+ enumerable: true,
56007
+ get: function() {
56008
+ return APPEARANCE_BLOCKS;
56009
+ }
56010
+ });
56011
+ Object.defineProperty(exports, "APPEARANCE_RESOLVES_AMBIGUITY_DEFAULT", {
56012
+ enumerable: true,
56013
+ get: function() {
56014
+ return APPEARANCE_RESOLVES_AMBIGUITY_DEFAULT;
56015
+ }
56016
+ });
55815
56017
  Object.defineProperty(exports, "ARCHIVED_DEBUG_NOTES_DEFAULT_LIMIT", {
55816
56018
  enumerable: true,
55817
56019
  get: function() {
@@ -56496,6 +56698,12 @@ Object.defineProperty(exports, "TrackSourceSchema", {
56496
56698
  return TrackSourceSchema;
56497
56699
  }
56498
56700
  });
56701
+ Object.defineProperty(exports, "ZodObject", {
56702
+ enumerable: true,
56703
+ get: function() {
56704
+ return ZodObject;
56705
+ }
56706
+ });
56499
56707
  Object.defineProperty(exports, "__exportAll", {
56500
56708
  enumerable: true,
56501
56709
  get: function() {
@@ -56784,6 +56992,12 @@ Object.defineProperty(exports, "literal", {
56784
56992
  return literal;
56785
56993
  }
56786
56994
  });
56995
+ Object.defineProperty(exports, "looseObject", {
56996
+ enumerable: true,
56997
+ get: function() {
56998
+ return looseObject;
56999
+ }
57000
+ });
56787
57001
  Object.defineProperty(exports, "mayWriteToLocation", {
56788
57002
  enumerable: true,
56789
57003
  get: function() {
@@ -56916,6 +57130,18 @@ Object.defineProperty(exports, "ruleBelongsToAlarm", {
56916
57130
  return ruleBelongsToAlarm;
56917
57131
  }
56918
57132
  });
57133
+ Object.defineProperty(exports, "ruleDeviceCompatCapQueries", {
57134
+ enumerable: true,
57135
+ get: function() {
57136
+ return ruleDeviceCompatCapQueries;
57137
+ }
57138
+ });
57139
+ Object.defineProperty(exports, "ruleKindOf", {
57140
+ enumerable: true,
57141
+ get: function() {
57142
+ return ruleKindOf;
57143
+ }
57144
+ });
56919
57145
  Object.defineProperty(exports, "sceneMonitorCapability", {
56920
57146
  enumerable: true,
56921
57147
  get: function() {
@@ -11236,6 +11236,28 @@ var FailureCounters = class {
11236
11236
  this.counters.clear();
11237
11237
  }
11238
11238
  };
11239
+ var APPEARANCE_BIN_COUNT = 96;
11240
+ var APPEARANCE_BLOCKS = {
11241
+ upperHs: [0, 32],
11242
+ upperV: [32, 40],
11243
+ upperGrad: [40, 48],
11244
+ lowerHs: [48, 80],
11245
+ lowerV: [80, 88],
11246
+ lowerGrad: [88, 96]
11247
+ };
11248
+ /**
11249
+ * Whether appearance may influence anything at all (D683 §3.2, fix round 1
11250
+ * ruling 2026-09-30 on the Task 10 cost-bench STOP): OFF until the
11251
+ * descriptor is calibrated on tapes that carry it (Task 23, review M9).
11252
+ *
11253
+ * This is the ONE authority both addons read — never two settings that
11254
+ * could disagree (CLAUDE.md D62). The tracker's `TrackerV2Config.appearanceResolvesAmbiguity`
11255
+ * default reads it (`addon-post-analysis/pipeline/tracker-v2/types.ts`); the
11256
+ * runner's cost gate reads it too (`addon-pipeline/pipeline-runner/appearance-attach.ts`),
11257
+ * short-circuiting BEFORE any crop, resample or descriptor is computed, so a
11258
+ * disabled camera costs nothing extra per frame.
11259
+ */
11260
+ var APPEARANCE_RESOLVES_AMBIGUITY_DEFAULT = false;
11239
11261
  var ClipModelMetaSchema = object({
11240
11262
  /** The paired text encoder's catalog id (the embedding-encoder's text catalog). */
11241
11263
  textModelId: string().min(1),
@@ -20183,10 +20205,12 @@ var NcMediaPolicySchema = object({
20183
20205
  /**
20184
20206
  * Cooldown GRANULARITY over the subject's class — how much a fired
20185
20207
  * notification suppresses.
20186
- * - `shared` (default, and the absent value) — one window for the whole
20187
- * rule/scope: a cat silences the next dog for `cooldownSec`.
20188
- * - `per-class` — an independent window per detected class, so cat→dog fires
20189
- * at once and cat→cat still waits.
20208
+ * - `per-class` (default, and the absent value since 2026-10-01 — D36) — an
20209
+ * independent window per detected class: cat→dog fires at once, cat→cat
20210
+ * still waits.
20211
+ * - `shared` — one window for the whole rule/scope: a cat silences the next
20212
+ * dog for `cooldownSec`. Only written when an operator picks it; it is no
20213
+ * longer what an unset rule means.
20190
20214
  *
20191
20215
  * AUDIO subjects are ALWAYS per-class regardless of this setting: a scream
20192
20216
  * must not be swallowed by a bark's window (the precedent this generalizes —
@@ -20201,8 +20225,11 @@ var NcThrottleSchema = object({
20201
20225
  /**
20202
20226
  * Class granularity of the cooldown key. Optional rather than defaulted:
20203
20227
  * a Zod default does NOT run on the addon→addon cap path, so a persisted
20204
- * rule authored before this field simply carries none — and the engine
20205
- * reads absent as `shared`, the pre-existing behaviour.
20228
+ * rule authored before this field simply carries none. The engine used to
20229
+ * read absent as `shared` (D36); since 2026-10-01 it reads absent as
20230
+ * `per-class` — the operator's default — and only an explicit `shared`
20231
+ * still means `shared`. See `cooldownKey` / `keysPerClass` in the rule
20232
+ * engine, and D36's dated note.
20206
20233
  */
20207
20234
  granularity: NcThrottleGranularitySchema.optional()
20208
20235
  });
@@ -24461,13 +24488,19 @@ var pipelineAnalyticsCapability = {
24461
24488
  *
24462
24489
  * Operator-driven from the DI Events page (batch delete). Routes through
24463
24490
  * the same widened track-deletion cascade (design §5.2).
24491
+ *
24492
+ * `sparedMediaIds` (D683 Task 14): media rows the cascade LEFT because a
24493
+ * live stationary entry vouches for them (its key frame, owned by a track
24494
+ * that moved and was kept). Released when the entry retires. Optional:
24495
+ * absent from a provider that predates it.
24464
24496
  */
24465
24497
  deleteTracks: method(object({
24466
24498
  deviceId: number(),
24467
24499
  trackIds: array(string()).min(1)
24468
24500
  }), object({
24469
24501
  deleted: number().int(),
24470
- failed: array(string()).readonly()
24502
+ failed: array(string()).readonly(),
24503
+ sparedMediaIds: array(number().int()).readonly().optional()
24471
24504
  }), {
24472
24505
  kind: "mutation",
24473
24506
  auth: "admin"
@@ -27177,7 +27210,42 @@ var SetCameraSensorsInputSchema = object({
27177
27210
  /** `null` removes the attachment: the camera goes back to `not-configured`. */
27178
27211
  config: CameraSensorsConfigSchema.nullable()
27179
27212
  });
27180
- method(StorageMigrationLeaseInputSchema, object({ paused: literal(true) }), {
27213
+ /**
27214
+ * Why an early occupancy look (D691) was not scheduled.
27215
+ *
27216
+ * - `unknown-camera` — no session was ever dispatched for it, so there is no
27217
+ * node and no config to attach a burst with.
27218
+ * - `out-of-range` — the ask is negative or further out than the orchestrator
27219
+ * will hold a timer for; the parked-object cadence is the answer there.
27220
+ * - `no-burst-producer` — this build has no burst producer at all.
27221
+ * - `already-looked` — this camera's ONE early look since its last session has
27222
+ * been spent. A look's own burst can re-arm a flickering flip, and a look
27223
+ * per arm would chain a burst every ~30 s forever (review H2); the next
27224
+ * real session re-arms the budget.
27225
+ */
27226
+ var OccupancyLookRefusalSchema = _enum([
27227
+ "unknown-camera",
27228
+ "out-of-range",
27229
+ "no-burst-producer",
27230
+ "already-looked"
27231
+ ]);
27232
+ method(object({
27233
+ deviceId: number().int().nonnegative(),
27234
+ /** How long from NOW until the pending flip's sustain window ends. RELATIVE,
27235
+ * so the caller's clock and the orchestrator's never have to agree. */
27236
+ afterMs: number().finite(),
27237
+ /** Why, for the log. */
27238
+ reason: string()
27239
+ }), object({
27240
+ scheduled: boolean(),
27241
+ /** When `scheduled`: how long until the burst is dialled. */
27242
+ dueInMs: number().optional(),
27243
+ /** When not `scheduled`: why. */
27244
+ refusedBecause: OccupancyLookRefusalSchema.optional()
27245
+ }), {
27246
+ kind: "mutation",
27247
+ auth: "admin"
27248
+ }), method(StorageMigrationLeaseInputSchema, object({ paused: literal(true) }), {
27181
27249
  kind: "mutation",
27182
27250
  auth: "admin"
27183
27251
  }), method(StorageMigrationLeaseInputSchema, object({ resumed: literal(true) }), {
@@ -27431,6 +27499,8 @@ function buildDescriptor(capName, kind) {
27431
27499
  * contributes one entry per bound cap present in this map.
27432
27500
  */
27433
27501
  var EVENT_KIND_BY_CAP = Object.freeze(Object.fromEntries(Object.entries(CAP_TO_KIND).map(([capName, kind]) => [capName, buildDescriptor(capName, kind)])));
27502
+ /** The cap names covered by the taxonomy (for the anti-drift guard). */
27503
+ var EVENTFUL_CAP_NAMES = Object.keys(CAP_TO_KIND);
27434
27504
  /**
27435
27505
  * Build a full `EventKindDescriptor` for a taxonomy `kind`, stamping the
27436
27506
  * per-device `source`. Returns null when `kind` is not in the taxonomy.
@@ -48339,6 +48409,12 @@ Object.freeze({
48339
48409
  addonId: null,
48340
48410
  access: "delete"
48341
48411
  },
48412
+ "pipelineOrchestrator.requestOccupancyLook": {
48413
+ capName: "pipeline-orchestrator",
48414
+ capScope: "system",
48415
+ addonId: null,
48416
+ access: "create"
48417
+ },
48342
48418
  "pipelineOrchestrator.resetNodePipelineDefaults": {
48343
48419
  capName: "pipeline-orchestrator",
48344
48420
  capScope: "system",
@@ -52131,6 +52207,11 @@ Object.freeze({
52131
52207
  form: "single",
52132
52208
  optional: false
52133
52209
  }],
52210
+ "pipelineOrchestrator.requestOccupancyLook": [{
52211
+ name: "deviceId",
52212
+ form: "single",
52213
+ optional: false
52214
+ }],
52134
52215
  "pipelineOrchestrator.resolvePipeline": [{
52135
52216
  name: "deviceId",
52136
52217
  form: "single",
@@ -53209,6 +53290,13 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
53209
53290
  function systemEventKindsOfFamily(family) {
53210
53291
  return NC_SYSTEM_EVENT_KIND_GROUP_SPECS.filter((g) => g.family === family).flatMap((g) => g.kinds);
53211
53292
  }
53293
+ /** The kind names on an UNTYPED condition, or `undefined` when it has none. */
53294
+ function systemEventKindNamesOf(condition) {
53295
+ if (typeof condition !== "object" || condition === null || !("kinds" in condition)) return void 0;
53296
+ const kinds = condition.kinds;
53297
+ if (!Array.isArray(kinds)) return void 0;
53298
+ return kinds.filter((kind) => typeof kind === "string");
53299
+ }
53212
53300
  /**
53213
53301
  * One family, or `mixed`. Mixed covers kinds that span families, a legacy kind,
53214
53302
  * a kind this build does not know (it fails toward read-only and never toward
@@ -53293,6 +53381,102 @@ var NC_SYSTEM_DELIVERY = "system-event";
53293
53381
  function isSystemDelivery(delivery) {
53294
53382
  return delivery === NC_SYSTEM_DELIVERY;
53295
53383
  }
53384
+ /**
53385
+ * Which capability a device must carry to be OFFERED on a rule of this kind's
53386
+ * device-scope picker (operator ruling, 2026-10-01). `null` means "no
53387
+ * capability filter for this kind" — either every device applies (the system
53388
+ * families, each already a separate concern; see
53389
+ * `docs/architecture/notifications.md`'s D637 `deviceIds` table) or `mixed`,
53390
+ * which authors nothing.
53391
+ *
53392
+ * DERIVED, never a hand-picked list:
53393
+ * - `sensor` reads `EVENTFUL_CAP_NAMES` — the SAME cap table the engine
53394
+ * itself turns a linked device's bound caps into sensor event kinds with
53395
+ * (`EVENT_KIND_BY_CAP`). A device this picker offers for a sensor rule is
53396
+ * exactly a device the rule's `sensorKinds` condition could ever name.
53397
+ * - `detection` (which a package-event rule is — there is no separate
53398
+ * `package` kind, D637) / `occupancy` read the one pipeline cap a camera
53399
+ * needs to produce the detections / counts / parcels those kinds match on.
53400
+ * - `sound` reads the one cap a device needs to produce the audio metrics a
53401
+ * sound rule's sampling window is built from.
53402
+ * - `device-events` / `system` / `alarm` / `mixed` are `null`: a device
53403
+ * event rule's `deviceIds` legitimately spans every device type (liveness,
53404
+ * battery, consumable, `detection-blind`), a system rule has no device
53405
+ * scope at all (dropped from the editor's tabs), and `alarm`'s `deviceIds`
53406
+ * is a reference to whichever camera's rule set it off — not a scope this
53407
+ * picker authors.
53408
+ *
53409
+ * Callers resolve the ids via `deviceManager.listDeviceIdsByCaps` (max 16
53410
+ * names — `EVENTFUL_CAP_NAMES` is exactly 16) and must treat an unanswered
53411
+ * read as "unknown", never as "no devices" (D315): this function only names
53412
+ * WHICH caps to ask for, not what to show while the answer is pending.
53413
+ */
53414
+ function ruleDeviceCompatCapNames(kind) {
53415
+ switch (kind) {
53416
+ case "sensor": return EVENTFUL_CAP_NAMES;
53417
+ case "detection":
53418
+ case "occupancy": return ["detection-pipeline"];
53419
+ case "sound": return ["audio-metrics"];
53420
+ case "device-events":
53421
+ case "system":
53422
+ case "alarm":
53423
+ case "mixed": return null;
53424
+ }
53425
+ }
53426
+ /**
53427
+ * The capability every CAMERA carries: `camera-streams` is a `defaultActive`
53428
+ * wrapper bound to every `Camera`-type device (`camera-streams.cap.ts`).
53429
+ * Named once, because a sensor rule's compatible set needs it (below).
53430
+ */
53431
+ var NC_CAMERA_SCOPE_CAP_NAME = "camera-streams";
53432
+ /**
53433
+ * Every capability QUERY whose union is the set of devices a rule of this kind
53434
+ * may be SCOPED to (`conditions.devices`) — what the save-time guard and the
53435
+ * admin's Devices tab ask `deviceManager.listDeviceIdsByCaps`, one call per
53436
+ * entry. `null` exactly where {@link ruleDeviceCompatCapNames} is `null`.
53437
+ *
53438
+ * Several queries rather than one list because `listDeviceIdsByCaps` takes at
53439
+ * most 16 names and `EVENTFUL_CAP_NAMES` is already exactly 16.
53440
+ *
53441
+ * A `sensor` rule's set is the eventful devices PLUS every camera (fix round
53442
+ * 1, 2026-10-01): the engine matches a sensor rule scoped to a CAMERA — a
53443
+ * per-camera row carries the camera's id, and a linked set matches on
53444
+ * `rowCameraIds` (D630 §6) — so a camera-scoped sensor rule is legitimate and
53445
+ * a guard that refused it would make every such stored rule un-editable.
53446
+ */
53447
+ function ruleDeviceCompatCapQueries(kind) {
53448
+ const primary = ruleDeviceCompatCapNames(kind);
53449
+ if (primary === null) return null;
53450
+ return kind === "sensor" ? [primary, [NC_CAMERA_SCOPE_CAP_NAME]] : [primary];
53451
+ }
53452
+ /**
53453
+ * Which kind of rule is this?
53454
+ *
53455
+ * The CONDITION wins over the delivery wherever the engine says it does, and
53456
+ * the order below is the engine's own: `evaluateRule` checks the system branch
53457
+ * first, then the occupancy and audio gates. Takes a plain `delivery` string so
53458
+ * a trigger this build does not know still classifies (as `detection`, which is
53459
+ * the read-only path's own fallback). A system rule classifies by the FAMILY of
53460
+ * its event kinds (D637) — see {@link systemRuleKindOf}.
53461
+ */
53462
+ function ruleKindOf(rule) {
53463
+ if (isSystemDelivery(rule.delivery)) return systemRuleKindOf(rule.conditions.systemEvent);
53464
+ if (rule.conditions.occupancy !== void 0 && rule.delivery === "device-event") return "occupancy";
53465
+ if (rule.conditions.audio !== void 0 && rule.delivery === "immediate") return "sound";
53466
+ if (rule.delivery === "device-event") return "sensor";
53467
+ return "detection";
53468
+ }
53469
+ /**
53470
+ * A system rule's kind: its one family, or `mixed` (D637).
53471
+ *
53472
+ * Takes the UNTYPED condition for the same reason {@link NcRuleConditionsSubject}
53473
+ * is structural. `mixed` covers kinds across families, a legacy or unknown kind,
53474
+ * and no kinds at all — it fails toward read-only, never toward editable.
53475
+ */
53476
+ function systemRuleKindOf(condition) {
53477
+ const verdict = systemEventFamilyOf(systemEventKindNamesOf(condition) ?? []);
53478
+ return verdict.kind === "family" ? verdict.family : "mixed";
53479
+ }
53296
53480
  NC_AUDIO_DEFAULTS.hitPercent, NC_AUDIO_DEFAULTS.samplingSeconds;
53297
53481
  var WEEKDAY_TO_DAY = {
53298
53482
  Sun: 0,
@@ -55781,4 +55965,4 @@ function buildClipModelRegistry(entries) {
55781
55965
  /** The built-in catalog's registry. */
55782
55966
  var BUILTIN_CLIP_MODELS = buildClipModelRegistry(CLIP_IMAGE_MODELS);
55783
55967
  //#endregion
55784
- export { NC_CLIP_RETENTION_MAX_SEC as $, storageOccupancyCapability as $n, TrackPuritySchema as $t, EVENT_KIND_BY_CAP as A, isMediaOwnerType as An, number as Ar, PoolMemoryWatchdog as At, MAX_ARCHIVED_DEBUG_NOTES as B, parseProcStatus as Bn, SCENE_DEFAULT_QUIET_SECONDS as Bt, DETECTION_PIPELINE_CAP_NAME as C, failureContributionCapability as Cn, normalizeNodeId as Cr, NcSystemEventKindSchema as Ct, EMBEDDING_REQUIREMENTS_FAILED as D, isDetectionMacroClass as Dn, boolean as Dr, NcTemplateVarDescriptorSchema as Dt, EMBEDDING_MODEL_FAILED as E, isAudioClassName as En, array as Er, NcTemplatePreviewSchema as Et, FailureCounters as F, kebabToCamel as Fn, string as Fr, SCENE_CONFIRM_DEFAULT_MAX_IMAGE_PX as Ft, MOTION_CLOSE_AFTER_MS as G, readTimelapseGeneratedAt as Gn, SetTrackPurityInputSchema as Gt, MAX_BIRTH_LATENCY_PROXY_MS as H, plateGalleryCapability as Hn, SCENE_DIVERGED as Ht, LabelAttributionSchema as I, mayWriteToLocation as In, tuple as Ir, SCENE_CONFIRM_DEFAULT_TIMEOUT_MS as It, NC_ALARM_SYSTEM_EVENT_KINDS as J, resolvePoolMemoryPolicy as Jn, TIMELAPSE_DENSE_FLOOR_SEC as Jt, MediaFileKindEnum as K, resolveClipSearchMinScore as Kn, SetTrackPurityResultSchema as Kt, ListTrackRelationsInputSchema as L, memoizePinnedFfmpeg as Ln, union as Lr, SCENE_DEFAULT_ANCHOR_THRESHOLD as Lt, EXPORT_DENSE_MAX_RANGES as M, isSystemDelivery as Mn, partialRecord as Mr, RECORDING_SOURCE_CAMSTACK_ADDON as Mt, FIRST_LEVEL_MACRO_CLASSES as N, isSystemEventSummaryRule as Nn, record as Nr, RebuildObjectEmbeddingsRefusalSchema as Nt, EMBEDDING_REQUIREMENTS_UNAVAILABLE as O, isEventOwnerType as On, discriminatedUnion as Or, OPS_LOG_DEFAULT_LIMIT as Ot, FULL_IMAGE_BBOX as P, isVectorIndexDimConflict as Pn, strictObject as Pr, RetrainStatusSchema as Pt, NC_CLIP_PRE_ROLL_DEFAULT_SEC as Q, servedTemplateVars as Qn, TimelapseRuleSchema as Qt, ListTrackRelationsResultSchema as R, notificationRulesCapability as Rn, unknown as Rr, SCENE_DEFAULT_CHECK_INTERVAL_SEC as Rt, DETECTION_MACRO_CLASSES as S, faceGalleryCapability as Sn, nodePin as Sr, NcSnoozeSuppressedSchema as St, DetectionSourceSchema as T, gifFromMp4Args as Tn, _enum as Tr, NcTemplatePreviewInputSchema as Tt, MAX_TRACK_PURITIES as U, readDeviceStateFrom as Un, SCENE_RESET_RECAPTURES as Ut, MAX_BIRTH_DECISION_RECORDS as V, pipelineAnalyticsCapability as Vn, SCENE_DEFAULT_UNCOVERED_POLICY as Vt, MAX_TRACK_RELATIONS as W, readMotionTriggeredBy as Wn, SceneMonitorSchema as Wt, NC_AUDIO_CONFIRM_WINDOW_SEC_DEFAULT as X, sceneMonitorCapability as Xn, TimelapseRuleInputSchema as Xt, NC_AUDIO_CONFIRM_HITS_DEFAULT as Y, ruleBelongsToAlarm as Yn, TRACK_RELATIONS_DEFAULT_LIMIT as Yt, NC_CLIP_POST_ROLL_DEFAULT_SEC as Z, sensorRaisedOf as Zn, TimelapseRulePatchSchema as Zt, ClearTrackRelationInputSchema as _, embeddingRefusalOf as _n, createEvent as _r, NcRuleTargetSchema as _t, CLIP_EMBEDDING_STEP_ID as a, alarmPanelCapability as an, templateCarriesSummary as ar, NC_SNOOZE_MAX_MINUTES as at, DEFAULT_EVENT_COLOR as b, encodeVectorBase64 as bn, hydrateSchema as br, NcSnoozeInputSchema as bt, resolveClusterModelPin as c, audioModeOf as cn, zoneAnalyticsCapability as cr, NC_TAXONOMY as ct, AlarmArmModeSchema as d, cosineSimilarity as dn, evaluateSensorEdge as dr, NcAlarmSettingsPatchSchema as dt, TrackRelationKindSchema as en, subKindsOf as er, NC_CONDITION_CATALOG as et, ArchivedDebugNoteSchema as f, deriveRecordingMode as fn, isSourceCap as fr, NcConditionDescriptorSchema as ft, COCO_TO_MACRO as g, embeddingModelFailedError as gn, CamProfileSchema as gr, NcRuleSchema as gt, BirthDecisionRecordSchema as h, embeddingEncoderCapability as hn, BaseAddon as hr, NcRulePatchSchema as ht, CLIP_TEXT_MODELS as i, addonWidgetsSourceCapability as in, systemEventSummaryScheduleOf as ir, NC_SENSOR_TRANSITION_KINDS as it, EVENT_OWNER_TYPES as j, isScheduleActive as jn, object as jr, RECORDING_EXPORT_MAX_READ_BYTES as jt, EVENT_DENSITY_BATCH_MAX as k, isKnownTemplateVar as kn, literal as kr, OpsLogEntrySchema as kt, ARCHIVED_DEBUG_NOTES_DEFAULT_LIMIT as l, buildEventKindDescriptor as ln, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as lr, NC_TEMPLATE_VARS as lt, BaseDevice as m, describeSystemEventFamilyProblem as mn, errMsg as mr, NcRuleInputSchema as mt, DEFAULT_CLIP_MODEL as n, TrackSideSchema as nn, systemEventFamilyProblems as nr, NC_CONSUMABLE_SYSTEM_EVENT_KINDS as nt, FACE_EMBEDDING_STEP_ID as o, assertTimelapseCadences as on, templateVarsFor as or, NC_SYSTEM_EVENT_KIND_GROUP_SPECS as ot, BIRTH_DECISION_DEFAULT_LIMIT as p, describeSystemEventDeliveryProblem as pn, DeviceType as pr, NcConditionsSchema as pt, MotionTriggeredBySchema as q, resolveLocationMode as qn, SetTrackRelationInputSchema as qt, CLIP_IMAGE_MODELS as r, TrackSourceSchema as rn, systemEventFilterApplies as rr, NC_DEFAULT_SNOOZE_MINUTES as rt, readClusterModelPinStrict as s, audioMetricsCapability as sn, vectorDimFromBase64 as sr, NC_TANK_SYSTEM_EVENT_KINDS as st, BUILTIN_CLIP_MODELS as t, TrackRelationSchema as tn, systemEventDeliveryProblems as tr, NC_CONSUMABLE_LOW_PERCENT_DEFAULT as tt, AUDIO_MACRO_LABELS as u, consumableLowPercentOf as un, canonicalHash as ur, NcAlarmConfigSchema as ut, ClearTrackRelationResultSchema as v, embeddingRequirementsFailedError as vn, customAction as vr, NcRuleUpdateInputSchema as vt, DeclaredDevices as w, gifDeriveSpeed as wn, sleep as wr, NcTaxonomySchema as wt, DEFAULT_TIMELAPSE_PREVIEW_TEXT as x, evictionPolicyOfLocation as xn, isDeviceScopedCap as xr, NcSnoozeSchema as xt, CoverStateSchema as y, embeddingRequirementsUnavailableError as yn, defineCustomActions as yr, NcScheduleSchema as yt, LockStateSchema as z, occupancyScope as zn, EventCategory as zr, SCENE_DEFAULT_OBSERVATION_SPACING_SEC as zt };
55968
+ export { NC_AUDIO_CONFIRM_WINDOW_SEC_DEFAULT as $, ruleDeviceCompatCapQueries as $n, TimelapseRuleInputSchema as $t, EMBEDDING_REQUIREMENTS_FAILED as A, isDetectionMacroClass as An, ZodObject as Ar, NcTemplateVarDescriptorSchema as At, ListTrackRelationsInputSchema as B, memoizePinnedFfmpeg as Bn, record as Br, SCENE_DEFAULT_ANCHOR_THRESHOLD as Bt, DEFAULT_EVENT_COLOR as C, encodeVectorBase64 as Cn, customAction as Cr, NcSnoozeInputSchema as Ct, DeclaredDevices as D, gifDeriveSpeed as Dn, nodePin as Dr, NcTaxonomySchema as Dt, DETECTION_PIPELINE_CAP_NAME as E, failureContributionCapability as En, isDeviceScopedCap as Er, NcSystemEventKindSchema as Et, EXPORT_DENSE_MAX_RANGES as F, isSystemDelivery as Fn, literal as Fr, RECORDING_SOURCE_CAMSTACK_ADDON as Ft, MAX_BIRTH_LATENCY_PROXY_MS as G, plateGalleryCapability as Gn, unknown as Gr, SCENE_DIVERGED as Gt, LockStateSchema as H, occupancyScope as Hn, string as Hr, SCENE_DEFAULT_OBSERVATION_SPACING_SEC as Ht, FIRST_LEVEL_MACRO_CLASSES as I, isSystemEventSummaryRule as In, looseObject as Ir, RebuildObjectEmbeddingsRefusalSchema as It, MOTION_CLOSE_AFTER_MS as J, readTimelapseGeneratedAt as Jn, SetTrackPurityInputSchema as Jt, MAX_TRACK_PURITIES as K, readDeviceStateFrom as Kn, EventCategory as Kr, SCENE_RESET_RECAPTURES as Kt, FULL_IMAGE_BBOX as L, isVectorIndexDimConflict as Ln, number as Lr, RetrainStatusSchema as Lt, EVENT_DENSITY_BATCH_MAX as M, isKnownTemplateVar as Mn, array as Mr, OpsLogEntrySchema as Mt, EVENT_KIND_BY_CAP as N, isMediaOwnerType as Nn, boolean as Nr, PoolMemoryWatchdog as Nt, DetectionSourceSchema as O, gifFromMp4Args as On, normalizeNodeId as Or, NcTemplatePreviewInputSchema as Ot, EVENT_OWNER_TYPES as P, isScheduleActive as Pn, discriminatedUnion as Pr, RECORDING_EXPORT_MAX_READ_BYTES as Pt, NC_AUDIO_CONFIRM_HITS_DEFAULT as Q, ruleBelongsToAlarm as Qn, TRACK_RELATIONS_DEFAULT_LIMIT as Qt, FailureCounters as R, kebabToCamel as Rn, object as Rr, SCENE_CONFIRM_DEFAULT_MAX_IMAGE_PX as Rt, CoverStateSchema as S, embeddingRequirementsUnavailableError as Sn, createEvent as Sr, NcScheduleSchema as St, DETECTION_MACRO_CLASSES as T, faceGalleryCapability as Tn, hydrateSchema as Tr, NcSnoozeSuppressedSchema as Tt, MAX_ARCHIVED_DEBUG_NOTES as U, parseProcStatus as Un, tuple as Ur, SCENE_DEFAULT_QUIET_SECONDS as Ut, ListTrackRelationsResultSchema as V, notificationRulesCapability as Vn, strictObject as Vr, SCENE_DEFAULT_CHECK_INTERVAL_SEC as Vt, MAX_BIRTH_DECISION_RECORDS as W, pipelineAnalyticsCapability as Wn, union as Wr, SCENE_DEFAULT_UNCOVERED_POLICY as Wt, MotionTriggeredBySchema as X, resolveLocationMode as Xn, SetTrackRelationInputSchema as Xt, MediaFileKindEnum as Y, resolveClipSearchMinScore as Yn, SetTrackPurityResultSchema as Yt, NC_ALARM_SYSTEM_EVENT_KINDS as Z, resolvePoolMemoryPolicy as Zn, TIMELAPSE_DENSE_FLOOR_SEC as Zt, BaseDevice as _, describeSystemEventFamilyProblem as _n, isSourceCap as _r, NcRuleInputSchema as _t, CLIP_EMBEDDING_STEP_ID as a, TrackSideSchema as an, subKindsOf as ar, NC_CONSUMABLE_SYSTEM_EVENT_KINDS as at, ClearTrackRelationInputSchema as b, embeddingRefusalOf as bn, BaseAddon as br, NcRuleTargetSchema as bt, resolveClusterModelPin as c, alarmPanelCapability as cn, systemEventFilterApplies as cr, NC_SNOOZE_MAX_MINUTES as ct, APPEARANCE_RESOLVES_AMBIGUITY_DEFAULT as d, audioModeOf as dn, templateVarsFor as dr, NC_TAXONOMY as dt, TimelapseRulePatchSchema as en, ruleKindOf as er, NC_CLIP_POST_ROLL_DEFAULT_SEC as et, ARCHIVED_DEBUG_NOTES_DEFAULT_LIMIT as f, buildEventKindDescriptor as fn, vectorDimFromBase64 as fr, NC_TEMPLATE_VARS as ft, BIRTH_DECISION_DEFAULT_LIMIT as g, describeSystemEventDeliveryProblem as gn, evaluateSensorEdge as gr, NcConditionsSchema as gt, ArchivedDebugNoteSchema as h, deriveRecordingMode as hn, canonicalHash as hr, NcConditionDescriptorSchema as ht, CLIP_TEXT_MODELS as i, TrackRelationSchema as in, storageOccupancyCapability as ir, NC_CONSUMABLE_LOW_PERCENT_DEFAULT as it, EMBEDDING_REQUIREMENTS_UNAVAILABLE as j, isEventOwnerType as jn, _enum as jr, OPS_LOG_DEFAULT_LIMIT as jt, EMBEDDING_MODEL_FAILED as k, isAudioClassName as kn, sleep as kr, NcTemplatePreviewSchema as kt, APPEARANCE_BIN_COUNT as l, assertTimelapseCadences as ln, systemEventSummaryScheduleOf as lr, NC_SYSTEM_EVENT_KIND_GROUP_SPECS as lt, AlarmArmModeSchema as m, cosineSimilarity as mn, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as mr, NcAlarmSettingsPatchSchema as mt, DEFAULT_CLIP_MODEL as n, TrackPuritySchema as nn, sensorRaisedOf as nr, NC_CLIP_RETENTION_MAX_SEC as nt, FACE_EMBEDDING_STEP_ID as o, TrackSourceSchema as on, systemEventDeliveryProblems as or, NC_DEFAULT_SNOOZE_MINUTES as ot, AUDIO_MACRO_LABELS as p, consumableLowPercentOf as pn, zoneAnalyticsCapability as pr, NcAlarmConfigSchema as pt, MAX_TRACK_RELATIONS as q, readMotionTriggeredBy as qn, SceneMonitorSchema as qt, CLIP_IMAGE_MODELS as r, TrackRelationKindSchema as rn, servedTemplateVars as rr, NC_CONDITION_CATALOG as rt, readClusterModelPinStrict as s, addonWidgetsSourceCapability as sn, systemEventFamilyProblems as sr, NC_SENSOR_TRANSITION_KINDS as st, BUILTIN_CLIP_MODELS as t, TimelapseRuleSchema as tn, sceneMonitorCapability as tr, NC_CLIP_PRE_ROLL_DEFAULT_SEC as tt, APPEARANCE_BLOCKS as u, audioMetricsCapability as un, templateCarriesSummary as ur, NC_TANK_SYSTEM_EVENT_KINDS as ut, BirthDecisionRecordSchema as v, embeddingEncoderCapability as vn, DeviceType as vr, NcRulePatchSchema as vt, DEFAULT_TIMELAPSE_PREVIEW_TEXT as w, evictionPolicyOfLocation as wn, defineCustomActions as wr, NcSnoozeSchema as wt, ClearTrackRelationResultSchema as x, embeddingRequirementsFailedError as xn, CamProfileSchema as xr, NcRuleUpdateInputSchema as xt, COCO_TO_MACRO as y, embeddingModelFailedError as yn, errMsg as yr, NcRuleSchema as yt, LabelAttributionSchema as z, mayWriteToLocation as zn, partialRecord as zr, SCENE_CONFIRM_DEFAULT_TIMEOUT_MS as zt };
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_clip_model_registry = require("../clip-model-registry--qJe8fTH.js");
5
+ const require_clip_model_registry = require("../clip-model-registry-C67UM_q_.js");
6
6
  let node_fs = require("node:fs");
7
7
  node_fs = require_clip_model_registry.__toESM(node_fs);
8
8
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { At as PoolMemoryWatchdog, Bn as parseProcStatus, Cr as normalizeNodeId, Jn as resolvePoolMemoryPolicy, a as CLIP_EMBEDDING_STEP_ID, c as resolveClusterModelPin, gn as embeddingModelFailedError, hn as embeddingEncoderCapability, hr as BaseAddon, i as CLIP_TEXT_MODELS, n as DEFAULT_CLIP_MODEL, r as CLIP_IMAGE_MODELS, t as BUILTIN_CLIP_MODELS, vn as embeddingRequirementsFailedError, yn as embeddingRequirementsUnavailableError } from "../clip-model-registry-DBKCbXPJ.mjs";
1
+ import { Nt as PoolMemoryWatchdog, Or as normalizeNodeId, Sn as embeddingRequirementsUnavailableError, Un as parseProcStatus, Zn as resolvePoolMemoryPolicy, a as CLIP_EMBEDDING_STEP_ID, br as BaseAddon, c as resolveClusterModelPin, i as CLIP_TEXT_MODELS, n as DEFAULT_CLIP_MODEL, r as CLIP_IMAGE_MODELS, t as BUILTIN_CLIP_MODELS, vn as embeddingEncoderCapability, xn as embeddingRequirementsFailedError, yn as embeddingModelFailedError } from "../clip-model-registry-C9Aw4qkh.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import * as fs from "node:fs";
4
4
  import * as path$1 from "node:path";