@camstack/addon-post-analysis 1.2.316 → 1.2.320

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 (15) hide show
  1. package/dist/{clip-model-registry-Dkv8MUCO.mjs → clip-model-registry-C-IEAIQQ.mjs} +232 -51
  2. package/dist/{clip-model-registry-D-zzCBKK.js → clip-model-registry-C_aKxHpy.js} +261 -50
  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-BNvVKYGi.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-D553qWb_.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-7e_3hsiC.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-C1V_UEyk.mjs +26 -0
  9. package/dist/pipeline-analytics/{hostInit-Cpm1aEUE.mjs → hostInit-ByDyL2zi.mjs} +2 -2
  10. package/dist/pipeline-analytics/index.js +692 -95
  11. package/dist/pipeline-analytics/index.mjs +692 -95
  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-BAqKeExF.mjs +0 -26
  15. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-B_KS96RA.mjs +0 -26
@@ -7710,7 +7710,7 @@ function errMsg(err) {
7710
7710
  return String(err);
7711
7711
  }
7712
7712
  //#endregion
7713
- //#region ../types/dist/composition-D7ULvLdD.mjs
7713
+ //#region ../types/dist/composition-Bzr7GwgP.mjs
7714
7714
  /**
7715
7715
  * Deterministic SHA-256 hash of an arbitrary serialisable value. The
7716
7716
  * canonical form sorts object keys alphabetically at every depth so two
@@ -7853,6 +7853,8 @@ var SOURCE_CAP_CHANGED_AT_FIELD = {
7853
7853
  vibration: "lastChangedAt",
7854
7854
  tamper: "lastChangedAt"
7855
7855
  };
7856
+ /** Cap names whose presence in a device's bindings qualify it as a source. */
7857
+ var SOURCE_CAPS = Object.keys(SOURCE_CAP_ACTIVE_FIELD);
7856
7858
  /** True when a cap is a recognised binary/switch source. */
7857
7859
  function isSourceCap(capName) {
7858
7860
  return Object.prototype.hasOwnProperty.call(SOURCE_CAP_ACTIVE_FIELD, capName);
@@ -12984,7 +12986,7 @@ var BrokerStatusEnum = _enum([
12984
12986
  "unreachable",
12985
12987
  "error"
12986
12988
  ]);
12987
- var BrokerInfoSchema$1 = object({
12989
+ var BrokerInfoSchema = object({
12988
12990
  /** Stable broker id. Persisted; survives addon restarts. */
12989
12991
  id: string(),
12990
12992
  /** Addon id of the provider that OWNS this broker.
@@ -13117,7 +13119,7 @@ var GetStateInputSchema = object({
13117
13119
  * HA: entity_id (returns the cached entity state). */
13118
13120
  key: string()
13119
13121
  });
13120
- method(ListInputSchema, array(BrokerInfoSchema$1)), method(GetInputSchema, BrokerInfoSchema$1.nullable()), method(_void(), array(BrokerProviderInfoSchema), { auth: "admin" }), method(AddInputSchema, AddResultSchema, {
13122
+ method(ListInputSchema, array(BrokerInfoSchema)), method(GetInputSchema, BrokerInfoSchema.nullable()), method(_void(), array(BrokerProviderInfoSchema), { auth: "admin" }), method(AddInputSchema, AddResultSchema, {
13121
13123
  kind: "mutation",
13122
13124
  auth: "admin"
13123
13125
  }), method(RemoveInputSchema, _void(), {
@@ -18307,7 +18309,7 @@ var BrokerStatusSchema$1 = _enum([
18307
18309
  "unreachable",
18308
18310
  "tls-error"
18309
18311
  ]);
18310
- var BrokerInfoSchema = object({
18312
+ var BrokerInfoSchema$1 = object({
18311
18313
  id: string(),
18312
18314
  name: string(),
18313
18315
  url: string(),
@@ -18370,7 +18372,7 @@ var StatusSchema = object({
18370
18372
  brokerCount: number(),
18371
18373
  embeddedRunning: boolean()
18372
18374
  });
18373
- method(_void(), array(BrokerInfoSchema)), method(IdInputSchema, BrokerConnectionDetailsSchema, { auth: "admin" }), method(AddBrokerInputSchema, AddBrokerResultSchema, {
18375
+ method(_void(), array(BrokerInfoSchema$1)), method(IdInputSchema, BrokerConnectionDetailsSchema, { auth: "admin" }), method(AddBrokerInputSchema, AddBrokerResultSchema, {
18374
18376
  kind: "mutation",
18375
18377
  auth: "admin"
18376
18378
  }), method(IdInputSchema, _void(), {
@@ -21810,14 +21812,52 @@ var NcAlarmNonBlockingEditSchema = object({
21810
21812
  nonBlocking: boolean()
21811
21813
  });
21812
21814
  /**
21815
+ * Controllable openings: opt IN to blocking (default is do not block). Contacts
21816
+ * keep using {@link NcAlarmNonBlockingEditSchema}.
21817
+ */
21818
+ var NcAlarmBlockingEditSchema = object({
21819
+ mode: AlarmArmModeSchema,
21820
+ deviceId: number().int().positive(),
21821
+ /** true = on the list (blocks when open); false = off the list (default). */
21822
+ blocking: boolean()
21823
+ });
21824
+ /**
21825
+ * Controllable openings: opt OUT of secure-on-arm (default is secure ON —
21826
+ * close / lock / turn off when this mode arms).
21827
+ */
21828
+ var NcAlarmSecureOnArmEditSchema = object({
21829
+ mode: AlarmArmModeSchema,
21830
+ deviceId: number().int().positive(),
21831
+ /** true = secure on arm (default); false = do not actuate on arm. */
21832
+ secureOnArm: boolean()
21833
+ });
21834
+ /**
21835
+ * One arm mode's device-id list (non-blocking, blocking, or secure-on-arm-off).
21836
+ */
21837
+ var NcAlarmModeDeviceListSchema = object({
21838
+ mode: AlarmArmModeSchema,
21839
+ deviceIds: array(number().int()).max(200)
21840
+ });
21841
+ /**
21842
+ * One arm mode's non-blocking list: devices that may be open when that mode
21843
+ * arms, without the arm being refused.
21844
+ */
21845
+ var NcAlarmNonBlockingSchema = NcAlarmModeDeviceListSchema;
21846
+ /** Controllable devices that DO block when open (opt-in; default empty). */
21847
+ var NcAlarmBlockingSchema = NcAlarmModeDeviceListSchema;
21848
+ /**
21849
+ * Controllable devices that do NOT secure on arm (opt-out; default empty =
21850
+ * every controllable secures).
21851
+ */
21852
+ var NcAlarmSecureOnArmOffSchema = NcAlarmModeDeviceListSchema;
21853
+ /**
21813
21854
  * The per-mode lists, at most one per mode. Two lists for one mode have no
21814
21855
  * meaning a reader could agree on (union? the last one?), so they are refused
21815
21856
  * at the boundary rather than interpreted.
21816
21857
  */
21817
- var NcAlarmNonBlockingListSchema = array(object({
21818
- mode: AlarmArmModeSchema,
21819
- deviceIds: array(number().int()).max(200)
21820
- })).max(8).refine(uniqueModes, { message: "nonBlocking: at most one list per arm mode" });
21858
+ var NcAlarmNonBlockingListSchema = array(NcAlarmNonBlockingSchema).max(8).refine(uniqueModes, { message: "nonBlocking: at most one list per arm mode" });
21859
+ var NcAlarmBlockingListSchema = array(NcAlarmBlockingSchema).max(8).refine(uniqueModes, { message: "blocking: at most one list per arm mode" });
21860
+ var NcAlarmSecureOnArmOffListSchema = array(NcAlarmSecureOnArmOffSchema).max(8).refine(uniqueModes, { message: "secureOnArmOff: at most one list per arm mode" });
21821
21861
  /**
21822
21862
  * The three durations — global, and per mode since D697 — the panel's state
21823
21863
  * machine runs on, who hears about its transitions, and which openings each mode tolerates.
@@ -21860,9 +21900,23 @@ var NcAlarmSettingsSchema = object({
21860
21900
  * arm (a window left ajar for the cat under `home`, say). At most one entry
21861
21901
  * per mode is meaningful. Defaulted to `[]` so a blob stored before D630
21862
21902
  * parses as "every opening blocks" — the behaviour it was written under.
21903
+ * Contacts use this list; controllable openings use {@link blocking} instead
21904
+ * (default: do not block).
21863
21905
  */
21864
21906
  nonBlocking: NcAlarmNonBlockingListSchema.default([]),
21865
21907
  /**
21908
+ * Per arm mode, controllable openings that DO refuse the arm when open.
21909
+ * Default `[]` = none block (secure-on-arm closes them instead). Absent on a
21910
+ * blob older than this field — read as empty.
21911
+ */
21912
+ blocking: NcAlarmBlockingListSchema.default([]),
21913
+ /**
21914
+ * Per arm mode, controllable openings that must NOT be actuated on arm.
21915
+ * Default `[]` = every controllable secures (close / lock / off). Absent on
21916
+ * an older blob — read as empty (secure ON).
21917
+ */
21918
+ secureOnArmOff: NcAlarmSecureOnArmOffListSchema.default([]),
21919
+ /**
21866
21920
  * Per arm mode, the delays that mode OVERRIDES (D697). A mode with no entry, or an entry
21867
21921
  * without a field, uses the global value above — so `[]`, the default, is exactly the
21868
21922
  * behaviour of a blob stored before this field existed. Read through `resolveModeDelays`.
@@ -21872,7 +21926,7 @@ var NcAlarmSettingsSchema = object({
21872
21926
  /**
21873
21927
  * Every field optional — a tab edits one control at a time.
21874
21928
  *
21875
- * `nonBlocking` and `modeDelays` are re-declared WITHOUT their defaults:
21929
+ * List fields and `modeDelays` are re-declared WITHOUT their defaults:
21876
21930
  * `.partial()` does not remove an inner `.default()`, so a patch that never
21877
21931
  * named the field would parse to `[]` and wipe every mode's list on an
21878
21932
  * unrelated edit (the same trap {@link NcRulePatchSchema} documents). Here
@@ -21880,11 +21934,15 @@ var NcAlarmSettingsSchema = object({
21880
21934
  */
21881
21935
  var NcAlarmSettingsPatchSchema = NcAlarmSettingsSchema.extend({
21882
21936
  nonBlocking: NcAlarmNonBlockingListSchema,
21937
+ blocking: NcAlarmBlockingListSchema,
21938
+ secureOnArmOff: NcAlarmSecureOnArmOffListSchema,
21883
21939
  /** Per-mode, per-field edits — NOT the whole list (see NcAlarmModeDelaysEditSchema). */
21884
21940
  modeDelays: NcAlarmModeDelaysEditListSchema,
21885
21941
  /** ONE membership change; the panel applies it to the list it holds at its turn. */
21886
- nonBlockingEdit: NcAlarmNonBlockingEditSchema
21887
- }).partial().refine((p) => p.nonBlocking === void 0 || p.nonBlockingEdit === void 0, { message: "nonBlocking and nonBlockingEdit are exclusive — send the whole lists or one edit" });
21942
+ nonBlockingEdit: NcAlarmNonBlockingEditSchema,
21943
+ blockingEdit: NcAlarmBlockingEditSchema,
21944
+ secureOnArmEdit: NcAlarmSecureOnArmEditSchema
21945
+ }).partial().refine((p) => p.nonBlocking === void 0 || p.nonBlockingEdit === void 0, { message: "nonBlocking and nonBlockingEdit are exclusive — send the whole lists or one edit" }).refine((p) => p.blocking === void 0 || p.blockingEdit === void 0, { message: "blocking and blockingEdit are exclusive — send the whole lists or one edit" }).refine((p) => p.secureOnArmOff === void 0 || p.secureOnArmEdit === void 0, { message: "secureOnArmOff and secureOnArmEdit are exclusive — send the whole lists or one edit" });
21888
21946
  /**
21889
21947
  * What one arm mode actually arms, DERIVED from the enabled rules gated on it.
21890
21948
  * Never authored, never stored — see `alarm-mode-coverage.ts` for why a stored
@@ -21999,7 +22057,13 @@ var NcAlarmSensorStateSchema = object({
21999
22057
  /** Why `unknown`: the read failed, or the slice holds no word its cap defines (a placeholder included). */
22000
22058
  unknownWhy: _enum(["read-failed", "unknown-word"]).nullable(),
22001
22059
  /** The device manager's liveness as the centre mirrors it; null = not known. */
22002
- online: boolean().nullable()
22060
+ online: boolean().nullable(),
22061
+ /**
22062
+ * True when the opening is a cover / lock / switch — the table shows the
22063
+ * Secure-on-arm switch and uses the controllable defaults. False for contacts
22064
+ * and for non-openings. Defaulted so an older hub answer still parses.
22065
+ */
22066
+ controllable: boolean().default(false)
22003
22067
  });
22004
22068
  var NcAlarmSensorsInputSchema = object({ deviceIds: array(number().int().positive()).max(500) });
22005
22069
  var NcAlarmSensorsSchema = object({
@@ -24142,6 +24206,7 @@ var KeyEventSchema = object({
24142
24206
  bestEventId: string(),
24143
24207
  /** Track lifetime in ms (lastSeen - firstSeen). */
24144
24208
  windowMs: number().optional(),
24209
+ audioLabels: array(TrackAudioLabelSchema).readonly().optional(),
24145
24210
  ...TrackFlagFields,
24146
24211
  ...TrackRetrainFields
24147
24212
  });
@@ -36095,38 +36160,52 @@ DeviceType.Camera, method(object({
36095
36160
  deviceId: number(),
36096
36161
  status: OsdStatusSchema
36097
36162
  });
36163
+ _enum([
36164
+ "value",
36165
+ "unit",
36166
+ "full"
36167
+ ]);
36168
+ _enum([
36169
+ "value+unit",
36170
+ "value",
36171
+ "unit"
36172
+ ]);
36173
+ /**
36174
+ * How the operator reached the leaf device. `deviceId` is ALWAYS the
36175
+ * OSD-supported leaf that is read; `containerId` is set when the pick
36176
+ * went through a container (gateway) first.
36177
+ */
36178
+ var OsdTemplatePickSchema = object({
36179
+ containerId: number().int().optional(),
36180
+ deviceId: number().int()
36181
+ });
36098
36182
  /**
36099
- * `osd-manager` — the ORCHESTRATOR over the device-scope `osd` cap.
36100
- *
36101
- * The `osd` cap is the firmware contract: it probes a camera's overlay
36102
- * SLOTS and writes literal text into one. It has no idea WHERE that text
36103
- * comes from, and it must not — a driver that grew a "show the temperature
36104
- * here" feature would grow it once per vendor.
36105
- *
36106
- * This cap owns the other half: a per-(camera, slot) BINDING that says
36107
- * which value feeds the slot, how it is formatted, and under which
36108
- * conditions it is shown at all. One addon renders every binding on every
36109
- * camera, so a new source costs zero driver code.
36110
- *
36111
- * Three deliberate choices, each with a rejected alternative:
36112
- *
36113
- * 1. A source is `(capName, valuePath)` over the kernel's device
36114
- * runtime-state mirror — NOT a closed enum of source kinds. Every
36115
- * cap-keyed slice a device publishes is bindable the day the cap
36116
- * ships. The rejected alternative (one enum member per source, with
36117
- * a resolver branch each) is what makes "add the humidity too" a
36118
- * code change.
36119
- * 2. The display gate reuses `NcConditionsSchema` verbatim — the
36120
- * notification centre's condition vocabulary — rather than a parallel
36121
- * model. An operator who has learned one condition editor has learned
36122
- * both.
36123
- * 3. Because the renderer's facts are device STATE and not a detection
36124
- * record, only a SUBSET of that vocabulary can be answered here.
36125
- * `setSlotBinding` REJECTS the rest at write time (see
36126
- * `getConditionSupport`). It does not accept-then-fail-closed: a
36127
- * condition that can never be true renders a permanently blank
36128
- * overlay, and a blank overlay looks exactly like a broken camera.
36183
+ * One named binding inside a multi-device template: device path + unit
36184
+ * selection + precision. The parser expands `{alias}`, `{alias.value}`,
36185
+ * `{alias.unit}`, or `{alias.full}` from the same binding — there is no
36186
+ * per-binding format lock.
36129
36187
  */
36188
+ var OsdTemplateBindingSchema = object({
36189
+ /** Token stem in the parser, e.g. `t` → `{t}` / `{t.value}`. Unique within the template. */
36190
+ alias: string().min(1).max(32).regex(/^[A-Za-z][A-Za-z0-9_-]*$/, "alias must start with a letter"),
36191
+ pick: OsdTemplatePickSchema,
36192
+ capName: string().min(1).max(64),
36193
+ valuePath: string().min(1).max(64),
36194
+ /** Convert TO this unit at render (`tryConvertUnit`). Absent = source unit. */
36195
+ displayUnit: string().max(16).optional(),
36196
+ maxDecimals: number().int().min(0).max(4).default(1)
36197
+ });
36198
+ /**
36199
+ * A named template: bindings (alias → leaf field) + a parser that
36200
+ * references `{alias}` / `{alias.value}` / `{alias.unit}` / `{alias.full}`.
36201
+ */
36202
+ var OsdNamedTemplateSchema = object({
36203
+ id: string().min(1).max(64),
36204
+ name: string().min(1).max(64),
36205
+ bindings: array(OsdTemplateBindingSchema).max(32).default([]),
36206
+ /** Parser with alias placeholders, e.g. `{t.value} {t.unit} / {h}`. */
36207
+ parser: string().max(256).default("")
36208
+ });
36130
36209
  /** Where a slot's value comes from. */
36131
36210
  var OsdSourceSchema = discriminatedUnion("kind", [
36132
36211
  object({
@@ -36145,11 +36224,17 @@ var OsdSourceSchema = discriminatedUnion("kind", [
36145
36224
  deviceId: number().int().optional(),
36146
36225
  capName: string().min(1).max(64),
36147
36226
  /** Dot path inside the slice, e.g. `detected`, `value`, `mode`. */
36148
- valuePath: string().min(1).max(64)
36227
+ valuePath: string().min(1).max(64),
36228
+ /** Convert TO this unit at render. Absent = no conversion. */
36229
+ displayUnit: string().max(16).optional()
36149
36230
  }),
36150
36231
  object({
36151
36232
  kind: literal("latest-recognition"),
36152
36233
  recognition: _enum(["person", "plate"])
36234
+ }),
36235
+ object({
36236
+ kind: literal("template"),
36237
+ templateId: string().min(1).max(64)
36153
36238
  })
36154
36239
  ]);
36155
36240
  var OsdSlotBindingSchema = object({
@@ -36165,7 +36250,10 @@ var OsdSlotBindingSchema = object({
36165
36250
  * documented workaround for firmwares that reject `.` in overlay text.
36166
36251
  */
36167
36252
  maxDecimals: number().int().min(0).max(4).default(1),
36168
- /** Appended via `${unit}`. The state mirror does not carry units. */
36253
+ /**
36254
+ * Appended via `${unit}` when no unit conversion produces a label.
36255
+ * Prefer `source.displayUnit` for converted device-state values.
36256
+ */
36169
36257
  unitLabel: string().max(8).optional(),
36170
36258
  /** Raw value → display text, e.g. `{"true":"MOTION","false":""}`. */
36171
36259
  valueMap: record(string(), string()).optional(),
@@ -36274,6 +36362,12 @@ method(object({ deviceId: number().int() }), object({
36274
36362
  }), method(object({ deviceId: number().int() }), object({ results: array(OsdRenderResultSchema) }), {
36275
36363
  kind: "mutation",
36276
36364
  auth: "admin"
36365
+ }), method(object({}), object({ templates: array(OsdNamedTemplateSchema) }), { auth: "admin" }), method(object({ template: OsdNamedTemplateSchema }), object({ template: OsdNamedTemplateSchema }), {
36366
+ kind: "mutation",
36367
+ auth: "admin"
36368
+ }), method(object({ templateId: string().min(1).max(64) }), object({ success: literal(true) }), {
36369
+ kind: "mutation",
36370
+ auth: "admin"
36277
36371
  });
36278
36372
  /**
36279
36373
  * Feeder connectivity / power status — mirrors the HA petkit device-status
@@ -41481,6 +41575,7 @@ var zoneRulesCapability = {
41481
41575
  */
41482
41576
  durability: "restored"
41483
41577
  };
41578
+ SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
41484
41579
  /**
41485
41580
  * Most specific first. Extending this list is how a new device kind becomes
41486
41581
  * gateable; nothing else needs to change.
@@ -47721,6 +47816,12 @@ Object.freeze({
47721
47816
  addonId: null,
47722
47817
  access: "create"
47723
47818
  },
47819
+ "osdManager.deleteTemplate": {
47820
+ capName: "osd-manager",
47821
+ capScope: "system",
47822
+ addonId: null,
47823
+ access: "delete"
47824
+ },
47724
47825
  "osdManager.getConditionSupport": {
47725
47826
  capName: "osd-manager",
47726
47827
  capScope: "system",
@@ -47739,6 +47840,12 @@ Object.freeze({
47739
47840
  addonId: null,
47740
47841
  access: "view"
47741
47842
  },
47843
+ "osdManager.listTemplates": {
47844
+ capName: "osd-manager",
47845
+ capScope: "system",
47846
+ addonId: null,
47847
+ access: "view"
47848
+ },
47742
47849
  "osdManager.previewSlot": {
47743
47850
  capName: "osd-manager",
47744
47851
  capScope: "system",
@@ -47757,6 +47864,12 @@ Object.freeze({
47757
47864
  addonId: null,
47758
47865
  access: "create"
47759
47866
  },
47867
+ "osdManager.upsertTemplate": {
47868
+ capName: "osd-manager",
47869
+ capScope: "system",
47870
+ addonId: null,
47871
+ access: "create"
47872
+ },
47760
47873
  "petFeeder.callPet": {
47761
47874
  capName: "pet-feeder",
47762
47875
  capScope: "device",
@@ -54337,6 +54450,18 @@ var ARMED_WORD_PREFIX = "armed_";
54337
54450
  var ALARM_PANEL_CAP = "alarm-panel";
54338
54451
  var ALARM_PANEL_TRIGGER_METHOD = "trigger";
54339
54452
  /**
54453
+ * Opening caps that can be ACTUATED to a secure state on arm (close / lock /
54454
+ * off). Contacts are openings but not controllable — they only block.
54455
+ */
54456
+ var NC_ALARM_CONTROLLABLE_CAPS = [
54457
+ "cover",
54458
+ "lock-control",
54459
+ "switch"
54460
+ ];
54461
+ function isAlarmControllableCap(cap) {
54462
+ return NC_ALARM_CONTROLLABLE_CAPS.includes(cap);
54463
+ }
54464
+ /**
54340
54465
  * A rule belongs to the alarm when its `deviceState` gate names ANY device's
54341
54466
  * `armed_*` word, or an ENABLED `onTrigger` sequence pulls the alarm panel's
54342
54467
  * trigger (D630).
@@ -54345,6 +54470,32 @@ function ruleBelongsToAlarm(rule) {
54345
54470
  if ((rule.conditions.deviceState?.states ?? []).some((s) => s.trim().toLowerCase().startsWith(ARMED_WORD_PREFIX))) return true;
54346
54471
  return (rule.onTrigger ?? []).some((sequence) => sequence.enabled && sequence.actions.some((step) => step.kind === "cap" && step.cap === ALARM_PANEL_CAP && step.method === ALARM_PANEL_TRIGGER_METHOD));
54347
54472
  }
54473
+ /** Whether this controllable should be closed/locked/turned off on arm. */
54474
+ function alarmDeviceSecureOnArm(input) {
54475
+ if (!input.controllable) return false;
54476
+ return !input.secureOnArmOff.includes(input.deviceId);
54477
+ }
54478
+ /** The one secure command for a controllable opening cap, or null for contacts. */
54479
+ function secureActuationFor(cap) {
54480
+ if (!isAlarmControllableCap(cap)) return null;
54481
+ switch (cap) {
54482
+ case "cover": return {
54483
+ cap,
54484
+ method: "close",
54485
+ args: {}
54486
+ };
54487
+ case "lock-control": return {
54488
+ cap,
54489
+ method: "lock",
54490
+ args: {}
54491
+ };
54492
+ case "switch": return {
54493
+ cap,
54494
+ method: "setState",
54495
+ args: { on: false }
54496
+ };
54497
+ }
54498
+ }
54348
54499
  var NC_ALARM_DELAY_FIELDS = [
54349
54500
  "exitDelaySec",
54350
54501
  "entryDelaySec",
@@ -54404,10 +54555,11 @@ function applyModeDelaysEdits(current, edits) {
54404
54555
  return out.filter((e) => e.exitDelaySec !== void 0 || e.entryDelaySec !== void 0 || e.triggeredDurationSec !== void 0);
54405
54556
  }
54406
54557
  /**
54407
- * Put ONE device on, or take it off, ONE mode's list. A no-op answers `changed: false`; an add
54408
- * to a full list is REFUSED by reason (never silently dropped); an emptied list drops its entry.
54558
+ * Put ONE device on, or take it off, ONE mode's device-id list. A no-op answers
54559
+ * `changed: false`; an add to a full list is REFUSED by reason (never silently
54560
+ * dropped); an emptied list drops its entry.
54409
54561
  */
54410
- function applyNonBlockingEdit(lists, edit) {
54562
+ function applyModeDeviceListEdit(lists, edit) {
54411
54563
  const copy = lists.map((l) => ({
54412
54564
  mode: l.mode,
54413
54565
  deviceIds: [...l.deviceIds]
@@ -54415,12 +54567,12 @@ function applyNonBlockingEdit(lists, edit) {
54415
54567
  const at = copy.findIndex((l) => l.mode === edit.mode);
54416
54568
  const held = at >= 0 ? copy[at]?.deviceIds ?? [] : [];
54417
54569
  const present = held.includes(edit.deviceId);
54418
- if (edit.nonBlocking === present) return {
54570
+ if (edit.present === present) return {
54419
54571
  kind: "applied",
54420
54572
  lists: copy,
54421
54573
  changed: false
54422
54574
  };
54423
- if (edit.nonBlocking) {
54575
+ if (edit.present) {
54424
54576
  if (held.length >= 200) return {
54425
54577
  kind: "refused",
54426
54578
  reason: "list-full",
@@ -54447,6 +54599,35 @@ function applyNonBlockingEdit(lists, edit) {
54447
54599
  };
54448
54600
  }
54449
54601
  /**
54602
+ * Put ONE device on, or take it off, ONE mode's non-blocking list.
54603
+ */
54604
+ function applyNonBlockingEdit(lists, edit) {
54605
+ return applyModeDeviceListEdit(lists, {
54606
+ mode: edit.mode,
54607
+ deviceId: edit.deviceId,
54608
+ present: edit.nonBlocking
54609
+ });
54610
+ }
54611
+ /** Controllable opt-in to blocking. */
54612
+ function applyBlockingEdit(lists, edit) {
54613
+ return applyModeDeviceListEdit(lists, {
54614
+ mode: edit.mode,
54615
+ deviceId: edit.deviceId,
54616
+ present: edit.blocking
54617
+ });
54618
+ }
54619
+ /**
54620
+ * Controllable secure-on-arm: `secureOnArm: true` removes from the opt-out list;
54621
+ * `false` adds to it.
54622
+ */
54623
+ function applySecureOnArmEdit(lists, edit) {
54624
+ return applyModeDeviceListEdit(lists, {
54625
+ mode: edit.mode,
54626
+ deviceId: edit.deviceId,
54627
+ present: !edit.secureOnArm
54628
+ });
54629
+ }
54630
+ /**
54450
54631
  * WHICH WAY A BOOLEAN SENSOR MOVED — read off the one slice a sensor event
54451
54632
  * persists (D640 "a sensor rule fires on the raise, the clear, or both").
54452
54633
  *
@@ -56863,4 +57044,4 @@ function buildClipModelRegistry(entries) {
56863
57044
  /** The built-in catalog's registry. */
56864
57045
  var BUILTIN_CLIP_MODELS = buildClipModelRegistry(CLIP_IMAGE_MODELS);
56865
57046
  //#endregion
56866
- export { NC_ALARM_SYSTEM_EVENT_KINDS as $, notificationRulesCapability as $n, object as $r, SCENE_DEFAULT_UNCOVERED_POLICY as $t, EMBEDDING_REQUIREMENTS_FAILED as A, embeddingModelFailedError as An, canonicalHash as Ar, NcScheduleSchema as At, ListTrackRelationsInputSchema as B, isAudioClassName as Bn, hydrateSchema as Br, OPS_LOG_DEFAULT_LIMIT as Bt, DEFAULT_EVENT_COLOR as C, buildEventKindDescriptor as Cn, systemEventSummaryScheduleOf as Cr, NcConditionDescriptorSchema as Ct, DeclaredDevices as D, describeSystemEventDeliveryProblem as Dn, vectorDimFromBase64 as Dr, NcRuleSchema as Dt, DETECTION_PIPELINE_CAP_NAME as E, deriveRecordingMode as En, templateVarsFor as Er, NcRulePatchSchema as Et, EXPORT_DENSE_MAX_RANGES as F, evictionPolicyOfLocation as Fn, BaseAddon as Fr, NcSystemEventKindSchema as Ft, MAX_BIRTH_LATENCY_PROXY_MS as G, isRetiredClearKey as Gn, ZodObject as Gr, RebuildObjectEmbeddingsRefusalSchema as Gt, LockStateSchema as H, isEventOwnerType as Hn, nodePin as Hr, PoolMemoryWatchdog as Ht, FIRST_LEVEL_MACRO_CLASSES as I, faceGalleryCapability as In, CamProfileSchema as Ir, NcTaxonomySchema as It, MOTION_CLOSE_AFTER_MS as J, isSystemEventSummaryRule as Jn, boolean as Jr, SCENE_CONFIRM_DEFAULT_TIMEOUT_MS as Jt, MAX_TRACK_PURITIES as K, isScheduleActive as Kn, _enum as Kr, RetrainStatusSchema as Kt, FULL_IMAGE_BBOX as L, failureContributionCapability as Ln, createEvent as Lr, NcTemplatePreviewInputSchema as Lt, EVENT_DENSITY_BATCH_MAX as M, embeddingRequirementsFailedError as Mn, isSourceCap as Mr, NcSnoozeSchema as Mt, EVENT_KIND_BY_CAP as N, embeddingRequirementsUnavailableError as Nn, DeviceType as Nr, NcSnoozeSuppressedSchema as Nt, DetectionSourceSchema as O, describeSystemEventFamilyProblem as On, zoneAnalyticsCapability as Or, NcRuleTargetSchema as Ot, EVENT_OWNER_TYPES as P, encodeVectorBase64 as Pn, errMsg as Pr, NcStateSummarySectionIdSchema as Pt, NC_ALARM_DELAY_MAX_SEC as Q, memoizePinnedFfmpeg as Qn, number as Qr, SCENE_DEFAULT_QUIET_SECONDS as Qt, FailureCounters as R, gifDeriveSpeed as Rn, customAction as Rr, NcTemplatePreviewSchema as Rt, CoverStateSchema as S, audioModeOf as Sn, systemEventFilterApplies as Sr, NcAlarmSettingsPatchSchema as St, DETECTION_MACRO_CLASSES as T, cosineSimilarity as Tn, templateCarriesSummary as Tr, NcRuleInputSchema as Tt, MAX_ARCHIVED_DEBUG_NOTES as U, isKnownTemplateVar as Un, normalizeNodeId as Ur, RECORDING_EXPORT_MAX_READ_BYTES as Ut, ListTrackRelationsResultSchema as V, isDetectionMacroClass as Vn, isDeviceScopedCap as Vr, OpsLogEntrySchema as Vt, MAX_BIRTH_DECISION_RECORDS as W, isMediaOwnerType as Wn, sleep as Wr, RECORDING_SOURCE_CAMSTACK_ADDON as Wt, MotionTriggeredBySchema as X, kebabToCamel as Xn, literal as Xr, SCENE_DEFAULT_CHECK_INTERVAL_SEC as Xt, MediaFileKindEnum as Y, isVectorIndexDimConflict as Yn, discriminatedUnion as Yr, SCENE_DEFAULT_ANCHOR_THRESHOLD as Yt, NC_ALARM_DELAY_FIELDS as Z, mayWriteToLocation as Zn, looseObject as Zr, SCENE_DEFAULT_OBSERVATION_SPACING_SEC as Zt, BaseDevice as _, alarmPanelCapability as _n, servedTemplateVars as _r, NC_TAXONOMY as _t, CLIP_EMBEDDING_STEP_ID as a, tuple as ai, SetTrackRelationInputSchema as an, readMotionTriggeredBy as ar, NC_CLIP_RETENTION_MAX_SEC as at, ClearTrackRelationInputSchema as b, assertTimelapseCadences as bn, systemEventDeliveryProblems as br, NcAlarmSensorsInputSchema as bt, resolveClusterModelPin as c, EventCategory as ci, TimelapseRuleInputSchema as cn, resolveLocationMode as cr, NC_CONSUMABLE_SYSTEM_EVENT_KINDS as ct, APPEARANCE_RESOLVES_AMBIGUITY_DEFAULT as d, TrackPuritySchema as dn, ruleBelongsToAlarm as dr, NC_GROUPING_MAX_SEC as dt, partialRecord as ei, SCENE_DIVERGED as en, occupancyScope as er, NC_ALARM_TRIGGERED_MAX_SEC as et, ARCHIVED_DEBUG_NOTES_DEFAULT_LIMIT as f, TrackRelationKindSchema as fn, ruleDeviceCompatCapQueries as fr, NC_GROUPING_MIN_SEC as ft, BIRTH_DECISION_DEFAULT_LIMIT as g, addonWidgetsSourceCapability as gn, sensorRaisedOf as gr, NC_TANK_SYSTEM_EVENT_KINDS as gt, ArchivedDebugNoteSchema as h, TrackSourceSchema as hn, sceneMonitorCapability as hr, NC_SYSTEM_EVENT_KIND_GROUP_SPECS as ht, CLIP_TEXT_MODELS as i, templateLiteral as ii, SetTrackPurityResultSchema as in, readDeviceStateFrom as ir, NC_CLIP_PRE_ROLL_DEFAULT_SEC as it, EMBEDDING_REQUIREMENTS_UNAVAILABLE as j, embeddingRefusalOf as jn, evaluateSensorEdge as jr, NcSnoozeInputSchema as jt, EMBEDDING_MODEL_FAILED as k, embeddingEncoderCapability as kn, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as kr, NcRuleUpdateInputSchema as kt, APPEARANCE_BIN_COUNT as l, TimelapseRulePatchSchema as ln, resolveModeDelays as lr, NC_DEFAULT_SNOOZE_MINUTES as lt, AlarmArmModeSchema as m, TrackSideSchema as mn, ruleKindOf as mr, NC_SNOOZE_MAX_MINUTES as mt, DEFAULT_CLIP_MODEL as n, strictObject as ni, SceneMonitorSchema as nn, pipelineAnalyticsCapability as nr, NC_AUDIO_CONFIRM_WINDOW_SEC_DEFAULT as nt, FACE_EMBEDDING_STEP_ID as o, union as oi, TIMELAPSE_DENSE_FLOOR_SEC as on, readTimelapseGeneratedAt as or, NC_CONDITION_CATALOG as ot, AUDIO_MACRO_LABELS as p, TrackRelationSchema as pn, ruleGroupingApplies as pr, NC_SENSOR_TRANSITION_KINDS as pt, MAX_TRACK_RELATIONS as q, isSystemDelivery as qn, array as qr, SCENE_CONFIRM_DEFAULT_MAX_IMAGE_PX as qt, CLIP_IMAGE_MODELS as r, string as ri, SetTrackPurityInputSchema as rn, plateGalleryCapability as rr, NC_CLIP_POST_ROLL_DEFAULT_SEC as rt, readClusterModelPinStrict as s, unknown as si, TRACK_RELATIONS_DEFAULT_LIMIT as sn, resolveClipSearchMinScore as sr, NC_CONSUMABLE_LOW_PERCENT_DEFAULT as st, BUILTIN_CLIP_MODELS as t, record as ti, SCENE_RESET_RECAPTURES as tn, parseProcStatus as tr, NC_AUDIO_CONFIRM_HITS_DEFAULT as tt, APPEARANCE_BLOCKS as u, TimelapseRuleSchema as un, resolvePoolMemoryPolicy as ur, NC_GROUPING_DEFAULT_SEC as ut, BirthDecisionRecordSchema as v, applyModeDelaysEdits as vn, storageOccupancyCapability as vr, NC_TEMPLATE_VARS as vt, DEFAULT_TIMELAPSE_PREVIEW_TEXT as w, consumableLowPercentOf as wn, systemEventSummarySplitOf as wr, NcConditionsSchema as wt, ClearTrackRelationResultSchema as x, audioMetricsCapability as xn, systemEventFamilyProblems as xr, NcAlarmSensorsSchema as xt, COCO_TO_MACRO as y, applyNonBlockingEdit as yn, subKindsOf as yr, NcAlarmConfigSchema as yt, LabelAttributionSchema as z, gifFromMp4Args as zn, defineCustomActions as zr, NcTemplateVarDescriptorSchema as zt };
57047
+ export { NC_ALARM_SYSTEM_EVENT_KINDS as $, isVectorIndexDimConflict as $n, boolean as $r, SCENE_DEFAULT_UNCOVERED_POLICY as $t, EMBEDDING_REQUIREMENTS_FAILED as A, describeSystemEventDeliveryProblem as An, templateCarriesSummary as Ar, NcScheduleSchema as At, ListTrackRelationsInputSchema as B, failureContributionCapability as Bn, BaseAddon as Br, OPS_LOG_DEFAULT_LIMIT as Bt, DEFAULT_EVENT_COLOR as C, assertTimelapseCadences as Cn, storageOccupancyCapability as Cr, NcConditionDescriptorSchema as Ct, DeclaredDevices as D, consumableLowPercentOf as Dn, systemEventFilterApplies as Dr, NcRuleSchema as Dt, DETECTION_PIPELINE_CAP_NAME as E, buildEventKindDescriptor as En, systemEventFamilyProblems as Er, NcRulePatchSchema as Et, EXPORT_DENSE_MAX_RANGES as F, embeddingRequirementsFailedError as Fn, canonicalHash as Fr, NcSystemEventKindSchema as Ft, MAX_BIRTH_LATENCY_PROXY_MS as G, isDetectionMacroClass as Gn, hydrateSchema as Gr, RebuildObjectEmbeddingsRefusalSchema as Gt, LockStateSchema as H, gifFromMp4Args as Hn, createEvent as Hr, PoolMemoryWatchdog as Ht, FIRST_LEVEL_MACRO_CLASSES as I, embeddingRequirementsUnavailableError as In, evaluateSensorEdge as Ir, NcTaxonomySchema as It, MOTION_CLOSE_AFTER_MS as J, isMediaOwnerType as Jn, normalizeNodeId as Jr, SCENE_CONFIRM_DEFAULT_TIMEOUT_MS as Jt, MAX_TRACK_PURITIES as K, isEventOwnerType as Kn, isDeviceScopedCap as Kr, RetrainStatusSchema as Kt, FULL_IMAGE_BBOX as L, encodeVectorBase64 as Ln, isSourceCap as Lr, NcTemplatePreviewInputSchema as Lt, EVENT_DENSITY_BATCH_MAX as M, embeddingEncoderCapability as Mn, vectorDimFromBase64 as Mr, NcSnoozeSchema as Mt, EVENT_KIND_BY_CAP as N, embeddingModelFailedError as Nn, zoneAnalyticsCapability as Nr, NcSnoozeSuppressedSchema as Nt, DetectionSourceSchema as O, cosineSimilarity as On, systemEventSummaryScheduleOf as Or, NcRuleTargetSchema as Ot, EVENT_OWNER_TYPES as P, embeddingRefusalOf as Pn, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as Pr, NcStateSummarySectionIdSchema as Pt, NC_ALARM_DELAY_MAX_SEC as Q, isSystemEventSummaryRule as Qn, array as Qr, SCENE_DEFAULT_QUIET_SECONDS as Qt, FailureCounters as R, evictionPolicyOfLocation as Rn, DeviceType as Rr, NcTemplatePreviewSchema as Rt, CoverStateSchema as S, applySecureOnArmEdit as Sn, servedTemplateVars as Sr, NcAlarmSettingsPatchSchema as St, DETECTION_MACRO_CLASSES as T, audioModeOf as Tn, systemEventDeliveryProblems as Tr, NcRuleInputSchema as Tt, MAX_ARCHIVED_DEBUG_NOTES as U, isAlarmControllableCap as Un, customAction as Ur, RECORDING_EXPORT_MAX_READ_BYTES as Ut, ListTrackRelationsResultSchema as V, gifDeriveSpeed as Vn, CamProfileSchema as Vr, OpsLogEntrySchema as Vt, MAX_BIRTH_DECISION_RECORDS as W, isAudioClassName as Wn, defineCustomActions as Wr, RECORDING_SOURCE_CAMSTACK_ADDON as Wt, MotionTriggeredBySchema as X, isScheduleActive as Xn, ZodObject as Xr, SCENE_DEFAULT_CHECK_INTERVAL_SEC as Xt, MediaFileKindEnum as Y, isRetiredClearKey as Yn, sleep as Yr, SCENE_DEFAULT_ANCHOR_THRESHOLD as Yt, NC_ALARM_DELAY_FIELDS as Z, isSystemDelivery as Zn, _enum as Zr, SCENE_DEFAULT_OBSERVATION_SPACING_SEC as Zt, BaseDevice as _, alarmDeviceSecureOnArm as _n, ruleGroupingApplies as _r, NC_TAXONOMY as _t, CLIP_EMBEDDING_STEP_ID as a, partialRecord as ai, SetTrackRelationInputSchema as an, parseProcStatus as ar, NC_CLIP_RETENTION_MAX_SEC as at, ClearTrackRelationInputSchema as b, applyModeDelaysEdits as bn, secureActuationFor as br, NcAlarmSensorsInputSchema as bt, resolveClusterModelPin as c, string as ci, TimelapseRuleInputSchema as cn, readDeviceStateFrom as cr, NC_CONSUMABLE_SYSTEM_EVENT_KINDS as ct, APPEARANCE_RESOLVES_AMBIGUITY_DEFAULT as d, union as di, TrackPuritySchema as dn, resolveClipSearchMinScore as dr, NC_GROUPING_MAX_SEC as dt, discriminatedUnion as ei, SCENE_DIVERGED as en, kebabToCamel as er, NC_ALARM_TRIGGERED_MAX_SEC as et, ARCHIVED_DEBUG_NOTES_DEFAULT_LIMIT as f, unknown as fi, TrackRelationKindSchema as fn, resolveLocationMode as fr, NC_GROUPING_MIN_SEC as ft, BIRTH_DECISION_DEFAULT_LIMIT as g, addonWidgetsSourceCapability as gn, ruleDeviceCompatCapQueries as gr, NC_TANK_SYSTEM_EVENT_KINDS as gt, ArchivedDebugNoteSchema as h, TrackSourceSchema as hn, ruleBelongsToAlarm as hr, NC_SYSTEM_EVENT_KIND_GROUP_SPECS as ht, CLIP_TEXT_MODELS as i, object as ii, SetTrackPurityResultSchema as in, occupancyScope as ir, NC_CLIP_PRE_ROLL_DEFAULT_SEC as it, EMBEDDING_REQUIREMENTS_UNAVAILABLE as j, describeSystemEventFamilyProblem as jn, templateVarsFor as jr, NcSnoozeInputSchema as jt, EMBEDDING_MODEL_FAILED as k, deriveRecordingMode as kn, systemEventSummarySplitOf as kr, NcRuleUpdateInputSchema as kt, APPEARANCE_BIN_COUNT as l, templateLiteral as li, TimelapseRulePatchSchema as ln, readMotionTriggeredBy as lr, NC_DEFAULT_SNOOZE_MINUTES as lt, AlarmArmModeSchema as m, TrackSideSchema as mn, resolvePoolMemoryPolicy as mr, NC_SNOOZE_MAX_MINUTES as mt, DEFAULT_CLIP_MODEL as n, looseObject as ni, SceneMonitorSchema as nn, memoizePinnedFfmpeg as nr, NC_AUDIO_CONFIRM_WINDOW_SEC_DEFAULT as nt, FACE_EMBEDDING_STEP_ID as o, record as oi, TIMELAPSE_DENSE_FLOOR_SEC as on, pipelineAnalyticsCapability as or, NC_CONDITION_CATALOG as ot, AUDIO_MACRO_LABELS as p, EventCategory as pi, TrackRelationSchema as pn, resolveModeDelays as pr, NC_SENSOR_TRANSITION_KINDS as pt, MAX_TRACK_RELATIONS as q, isKnownTemplateVar as qn, nodePin as qr, SCENE_CONFIRM_DEFAULT_MAX_IMAGE_PX as qt, CLIP_IMAGE_MODELS as r, number as ri, SetTrackPurityInputSchema as rn, notificationRulesCapability as rr, NC_CLIP_POST_ROLL_DEFAULT_SEC as rt, readClusterModelPinStrict as s, strictObject as si, TRACK_RELATIONS_DEFAULT_LIMIT as sn, plateGalleryCapability as sr, NC_CONSUMABLE_LOW_PERCENT_DEFAULT as st, BUILTIN_CLIP_MODELS as t, literal as ti, SCENE_RESET_RECAPTURES as tn, mayWriteToLocation as tr, NC_AUDIO_CONFIRM_HITS_DEFAULT as tt, APPEARANCE_BLOCKS as u, tuple as ui, TimelapseRuleSchema as un, readTimelapseGeneratedAt as ur, NC_GROUPING_DEFAULT_SEC as ut, BirthDecisionRecordSchema as v, alarmPanelCapability as vn, ruleKindOf as vr, NC_TEMPLATE_VARS as vt, DEFAULT_TIMELAPSE_PREVIEW_TEXT as w, audioMetricsCapability as wn, subKindsOf as wr, NcConditionsSchema as wt, ClearTrackRelationResultSchema as x, applyNonBlockingEdit as xn, sensorRaisedOf as xr, NcAlarmSensorsSchema as xt, COCO_TO_MACRO as y, applyBlockingEdit as yn, sceneMonitorCapability as yr, NcAlarmConfigSchema as yt, LabelAttributionSchema as z, faceGalleryCapability as zn, errMsg as zr, NcTemplateVarDescriptorSchema as zt };