@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
@@ -7741,7 +7741,7 @@ function errMsg(err) {
7741
7741
  return String(err);
7742
7742
  }
7743
7743
  //#endregion
7744
- //#region ../types/dist/composition-D7ULvLdD.mjs
7744
+ //#region ../types/dist/composition-Bzr7GwgP.mjs
7745
7745
  /**
7746
7746
  * Deterministic SHA-256 hash of an arbitrary serialisable value. The
7747
7747
  * canonical form sorts object keys alphabetically at every depth so two
@@ -7884,6 +7884,8 @@ var SOURCE_CAP_CHANGED_AT_FIELD = {
7884
7884
  vibration: "lastChangedAt",
7885
7885
  tamper: "lastChangedAt"
7886
7886
  };
7887
+ /** Cap names whose presence in a device's bindings qualify it as a source. */
7888
+ var SOURCE_CAPS = Object.keys(SOURCE_CAP_ACTIVE_FIELD);
7887
7889
  /** True when a cap is a recognised binary/switch source. */
7888
7890
  function isSourceCap(capName) {
7889
7891
  return Object.prototype.hasOwnProperty.call(SOURCE_CAP_ACTIVE_FIELD, capName);
@@ -13015,7 +13017,7 @@ var BrokerStatusEnum = _enum([
13015
13017
  "unreachable",
13016
13018
  "error"
13017
13019
  ]);
13018
- var BrokerInfoSchema$1 = object({
13020
+ var BrokerInfoSchema = object({
13019
13021
  /** Stable broker id. Persisted; survives addon restarts. */
13020
13022
  id: string(),
13021
13023
  /** Addon id of the provider that OWNS this broker.
@@ -13148,7 +13150,7 @@ var GetStateInputSchema = object({
13148
13150
  * HA: entity_id (returns the cached entity state). */
13149
13151
  key: string()
13150
13152
  });
13151
- method(ListInputSchema, array(BrokerInfoSchema$1)), method(GetInputSchema, BrokerInfoSchema$1.nullable()), method(_void(), array(BrokerProviderInfoSchema), { auth: "admin" }), method(AddInputSchema, AddResultSchema, {
13153
+ method(ListInputSchema, array(BrokerInfoSchema)), method(GetInputSchema, BrokerInfoSchema.nullable()), method(_void(), array(BrokerProviderInfoSchema), { auth: "admin" }), method(AddInputSchema, AddResultSchema, {
13152
13154
  kind: "mutation",
13153
13155
  auth: "admin"
13154
13156
  }), method(RemoveInputSchema, _void(), {
@@ -18338,7 +18340,7 @@ var BrokerStatusSchema$1 = _enum([
18338
18340
  "unreachable",
18339
18341
  "tls-error"
18340
18342
  ]);
18341
- var BrokerInfoSchema = object({
18343
+ var BrokerInfoSchema$1 = object({
18342
18344
  id: string(),
18343
18345
  name: string(),
18344
18346
  url: string(),
@@ -18401,7 +18403,7 @@ var StatusSchema = object({
18401
18403
  brokerCount: number(),
18402
18404
  embeddedRunning: boolean()
18403
18405
  });
18404
- method(_void(), array(BrokerInfoSchema)), method(IdInputSchema, BrokerConnectionDetailsSchema, { auth: "admin" }), method(AddBrokerInputSchema, AddBrokerResultSchema, {
18406
+ method(_void(), array(BrokerInfoSchema$1)), method(IdInputSchema, BrokerConnectionDetailsSchema, { auth: "admin" }), method(AddBrokerInputSchema, AddBrokerResultSchema, {
18405
18407
  kind: "mutation",
18406
18408
  auth: "admin"
18407
18409
  }), method(IdInputSchema, _void(), {
@@ -21841,14 +21843,52 @@ var NcAlarmNonBlockingEditSchema = object({
21841
21843
  nonBlocking: boolean()
21842
21844
  });
21843
21845
  /**
21846
+ * Controllable openings: opt IN to blocking (default is do not block). Contacts
21847
+ * keep using {@link NcAlarmNonBlockingEditSchema}.
21848
+ */
21849
+ var NcAlarmBlockingEditSchema = object({
21850
+ mode: AlarmArmModeSchema,
21851
+ deviceId: number().int().positive(),
21852
+ /** true = on the list (blocks when open); false = off the list (default). */
21853
+ blocking: boolean()
21854
+ });
21855
+ /**
21856
+ * Controllable openings: opt OUT of secure-on-arm (default is secure ON —
21857
+ * close / lock / turn off when this mode arms).
21858
+ */
21859
+ var NcAlarmSecureOnArmEditSchema = object({
21860
+ mode: AlarmArmModeSchema,
21861
+ deviceId: number().int().positive(),
21862
+ /** true = secure on arm (default); false = do not actuate on arm. */
21863
+ secureOnArm: boolean()
21864
+ });
21865
+ /**
21866
+ * One arm mode's device-id list (non-blocking, blocking, or secure-on-arm-off).
21867
+ */
21868
+ var NcAlarmModeDeviceListSchema = object({
21869
+ mode: AlarmArmModeSchema,
21870
+ deviceIds: array(number().int()).max(200)
21871
+ });
21872
+ /**
21873
+ * One arm mode's non-blocking list: devices that may be open when that mode
21874
+ * arms, without the arm being refused.
21875
+ */
21876
+ var NcAlarmNonBlockingSchema = NcAlarmModeDeviceListSchema;
21877
+ /** Controllable devices that DO block when open (opt-in; default empty). */
21878
+ var NcAlarmBlockingSchema = NcAlarmModeDeviceListSchema;
21879
+ /**
21880
+ * Controllable devices that do NOT secure on arm (opt-out; default empty =
21881
+ * every controllable secures).
21882
+ */
21883
+ var NcAlarmSecureOnArmOffSchema = NcAlarmModeDeviceListSchema;
21884
+ /**
21844
21885
  * The per-mode lists, at most one per mode. Two lists for one mode have no
21845
21886
  * meaning a reader could agree on (union? the last one?), so they are refused
21846
21887
  * at the boundary rather than interpreted.
21847
21888
  */
21848
- var NcAlarmNonBlockingListSchema = array(object({
21849
- mode: AlarmArmModeSchema,
21850
- deviceIds: array(number().int()).max(200)
21851
- })).max(8).refine(uniqueModes, { message: "nonBlocking: at most one list per arm mode" });
21889
+ var NcAlarmNonBlockingListSchema = array(NcAlarmNonBlockingSchema).max(8).refine(uniqueModes, { message: "nonBlocking: at most one list per arm mode" });
21890
+ var NcAlarmBlockingListSchema = array(NcAlarmBlockingSchema).max(8).refine(uniqueModes, { message: "blocking: at most one list per arm mode" });
21891
+ var NcAlarmSecureOnArmOffListSchema = array(NcAlarmSecureOnArmOffSchema).max(8).refine(uniqueModes, { message: "secureOnArmOff: at most one list per arm mode" });
21852
21892
  /**
21853
21893
  * The three durations — global, and per mode since D697 — the panel's state
21854
21894
  * machine runs on, who hears about its transitions, and which openings each mode tolerates.
@@ -21891,9 +21931,23 @@ var NcAlarmSettingsSchema = object({
21891
21931
  * arm (a window left ajar for the cat under `home`, say). At most one entry
21892
21932
  * per mode is meaningful. Defaulted to `[]` so a blob stored before D630
21893
21933
  * parses as "every opening blocks" — the behaviour it was written under.
21934
+ * Contacts use this list; controllable openings use {@link blocking} instead
21935
+ * (default: do not block).
21894
21936
  */
21895
21937
  nonBlocking: NcAlarmNonBlockingListSchema.default([]),
21896
21938
  /**
21939
+ * Per arm mode, controllable openings that DO refuse the arm when open.
21940
+ * Default `[]` = none block (secure-on-arm closes them instead). Absent on a
21941
+ * blob older than this field — read as empty.
21942
+ */
21943
+ blocking: NcAlarmBlockingListSchema.default([]),
21944
+ /**
21945
+ * Per arm mode, controllable openings that must NOT be actuated on arm.
21946
+ * Default `[]` = every controllable secures (close / lock / off). Absent on
21947
+ * an older blob — read as empty (secure ON).
21948
+ */
21949
+ secureOnArmOff: NcAlarmSecureOnArmOffListSchema.default([]),
21950
+ /**
21897
21951
  * Per arm mode, the delays that mode OVERRIDES (D697). A mode with no entry, or an entry
21898
21952
  * without a field, uses the global value above — so `[]`, the default, is exactly the
21899
21953
  * behaviour of a blob stored before this field existed. Read through `resolveModeDelays`.
@@ -21903,7 +21957,7 @@ var NcAlarmSettingsSchema = object({
21903
21957
  /**
21904
21958
  * Every field optional — a tab edits one control at a time.
21905
21959
  *
21906
- * `nonBlocking` and `modeDelays` are re-declared WITHOUT their defaults:
21960
+ * List fields and `modeDelays` are re-declared WITHOUT their defaults:
21907
21961
  * `.partial()` does not remove an inner `.default()`, so a patch that never
21908
21962
  * named the field would parse to `[]` and wipe every mode's list on an
21909
21963
  * unrelated edit (the same trap {@link NcRulePatchSchema} documents). Here
@@ -21911,11 +21965,15 @@ var NcAlarmSettingsSchema = object({
21911
21965
  */
21912
21966
  var NcAlarmSettingsPatchSchema = NcAlarmSettingsSchema.extend({
21913
21967
  nonBlocking: NcAlarmNonBlockingListSchema,
21968
+ blocking: NcAlarmBlockingListSchema,
21969
+ secureOnArmOff: NcAlarmSecureOnArmOffListSchema,
21914
21970
  /** Per-mode, per-field edits — NOT the whole list (see NcAlarmModeDelaysEditSchema). */
21915
21971
  modeDelays: NcAlarmModeDelaysEditListSchema,
21916
21972
  /** ONE membership change; the panel applies it to the list it holds at its turn. */
21917
- nonBlockingEdit: NcAlarmNonBlockingEditSchema
21918
- }).partial().refine((p) => p.nonBlocking === void 0 || p.nonBlockingEdit === void 0, { message: "nonBlocking and nonBlockingEdit are exclusive — send the whole lists or one edit" });
21973
+ nonBlockingEdit: NcAlarmNonBlockingEditSchema,
21974
+ blockingEdit: NcAlarmBlockingEditSchema,
21975
+ secureOnArmEdit: NcAlarmSecureOnArmEditSchema
21976
+ }).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" });
21919
21977
  /**
21920
21978
  * What one arm mode actually arms, DERIVED from the enabled rules gated on it.
21921
21979
  * Never authored, never stored — see `alarm-mode-coverage.ts` for why a stored
@@ -22030,7 +22088,13 @@ var NcAlarmSensorStateSchema = object({
22030
22088
  /** Why `unknown`: the read failed, or the slice holds no word its cap defines (a placeholder included). */
22031
22089
  unknownWhy: _enum(["read-failed", "unknown-word"]).nullable(),
22032
22090
  /** The device manager's liveness as the centre mirrors it; null = not known. */
22033
- online: boolean().nullable()
22091
+ online: boolean().nullable(),
22092
+ /**
22093
+ * True when the opening is a cover / lock / switch — the table shows the
22094
+ * Secure-on-arm switch and uses the controllable defaults. False for contacts
22095
+ * and for non-openings. Defaulted so an older hub answer still parses.
22096
+ */
22097
+ controllable: boolean().default(false)
22034
22098
  });
22035
22099
  var NcAlarmSensorsInputSchema = object({ deviceIds: array(number().int().positive()).max(500) });
22036
22100
  var NcAlarmSensorsSchema = object({
@@ -24173,6 +24237,7 @@ var KeyEventSchema = object({
24173
24237
  bestEventId: string(),
24174
24238
  /** Track lifetime in ms (lastSeen - firstSeen). */
24175
24239
  windowMs: number().optional(),
24240
+ audioLabels: array(TrackAudioLabelSchema).readonly().optional(),
24176
24241
  ...TrackFlagFields,
24177
24242
  ...TrackRetrainFields
24178
24243
  });
@@ -36126,38 +36191,52 @@ DeviceType.Camera, method(object({
36126
36191
  deviceId: number(),
36127
36192
  status: OsdStatusSchema
36128
36193
  });
36194
+ _enum([
36195
+ "value",
36196
+ "unit",
36197
+ "full"
36198
+ ]);
36199
+ _enum([
36200
+ "value+unit",
36201
+ "value",
36202
+ "unit"
36203
+ ]);
36204
+ /**
36205
+ * How the operator reached the leaf device. `deviceId` is ALWAYS the
36206
+ * OSD-supported leaf that is read; `containerId` is set when the pick
36207
+ * went through a container (gateway) first.
36208
+ */
36209
+ var OsdTemplatePickSchema = object({
36210
+ containerId: number().int().optional(),
36211
+ deviceId: number().int()
36212
+ });
36213
+ /**
36214
+ * One named binding inside a multi-device template: device path + unit
36215
+ * selection + precision. The parser expands `{alias}`, `{alias.value}`,
36216
+ * `{alias.unit}`, or `{alias.full}` from the same binding — there is no
36217
+ * per-binding format lock.
36218
+ */
36219
+ var OsdTemplateBindingSchema = object({
36220
+ /** Token stem in the parser, e.g. `t` → `{t}` / `{t.value}`. Unique within the template. */
36221
+ alias: string().min(1).max(32).regex(/^[A-Za-z][A-Za-z0-9_-]*$/, "alias must start with a letter"),
36222
+ pick: OsdTemplatePickSchema,
36223
+ capName: string().min(1).max(64),
36224
+ valuePath: string().min(1).max(64),
36225
+ /** Convert TO this unit at render (`tryConvertUnit`). Absent = source unit. */
36226
+ displayUnit: string().max(16).optional(),
36227
+ maxDecimals: number().int().min(0).max(4).default(1)
36228
+ });
36129
36229
  /**
36130
- * `osd-manager` — the ORCHESTRATOR over the device-scope `osd` cap.
36131
- *
36132
- * The `osd` cap is the firmware contract: it probes a camera's overlay
36133
- * SLOTS and writes literal text into one. It has no idea WHERE that text
36134
- * comes from, and it must not — a driver that grew a "show the temperature
36135
- * here" feature would grow it once per vendor.
36136
- *
36137
- * This cap owns the other half: a per-(camera, slot) BINDING that says
36138
- * which value feeds the slot, how it is formatted, and under which
36139
- * conditions it is shown at all. One addon renders every binding on every
36140
- * camera, so a new source costs zero driver code.
36141
- *
36142
- * Three deliberate choices, each with a rejected alternative:
36143
- *
36144
- * 1. A source is `(capName, valuePath)` over the kernel's device
36145
- * runtime-state mirror — NOT a closed enum of source kinds. Every
36146
- * cap-keyed slice a device publishes is bindable the day the cap
36147
- * ships. The rejected alternative (one enum member per source, with
36148
- * a resolver branch each) is what makes "add the humidity too" a
36149
- * code change.
36150
- * 2. The display gate reuses `NcConditionsSchema` verbatim — the
36151
- * notification centre's condition vocabulary — rather than a parallel
36152
- * model. An operator who has learned one condition editor has learned
36153
- * both.
36154
- * 3. Because the renderer's facts are device STATE and not a detection
36155
- * record, only a SUBSET of that vocabulary can be answered here.
36156
- * `setSlotBinding` REJECTS the rest at write time (see
36157
- * `getConditionSupport`). It does not accept-then-fail-closed: a
36158
- * condition that can never be true renders a permanently blank
36159
- * overlay, and a blank overlay looks exactly like a broken camera.
36230
+ * A named template: bindings (alias → leaf field) + a parser that
36231
+ * references `{alias}` / `{alias.value}` / `{alias.unit}` / `{alias.full}`.
36160
36232
  */
36233
+ var OsdNamedTemplateSchema = object({
36234
+ id: string().min(1).max(64),
36235
+ name: string().min(1).max(64),
36236
+ bindings: array(OsdTemplateBindingSchema).max(32).default([]),
36237
+ /** Parser with alias placeholders, e.g. `{t.value} {t.unit} / {h}`. */
36238
+ parser: string().max(256).default("")
36239
+ });
36161
36240
  /** Where a slot's value comes from. */
36162
36241
  var OsdSourceSchema = discriminatedUnion("kind", [
36163
36242
  object({
@@ -36176,11 +36255,17 @@ var OsdSourceSchema = discriminatedUnion("kind", [
36176
36255
  deviceId: number().int().optional(),
36177
36256
  capName: string().min(1).max(64),
36178
36257
  /** Dot path inside the slice, e.g. `detected`, `value`, `mode`. */
36179
- valuePath: string().min(1).max(64)
36258
+ valuePath: string().min(1).max(64),
36259
+ /** Convert TO this unit at render. Absent = no conversion. */
36260
+ displayUnit: string().max(16).optional()
36180
36261
  }),
36181
36262
  object({
36182
36263
  kind: literal("latest-recognition"),
36183
36264
  recognition: _enum(["person", "plate"])
36265
+ }),
36266
+ object({
36267
+ kind: literal("template"),
36268
+ templateId: string().min(1).max(64)
36184
36269
  })
36185
36270
  ]);
36186
36271
  var OsdSlotBindingSchema = object({
@@ -36196,7 +36281,10 @@ var OsdSlotBindingSchema = object({
36196
36281
  * documented workaround for firmwares that reject `.` in overlay text.
36197
36282
  */
36198
36283
  maxDecimals: number().int().min(0).max(4).default(1),
36199
- /** Appended via `${unit}`. The state mirror does not carry units. */
36284
+ /**
36285
+ * Appended via `${unit}` when no unit conversion produces a label.
36286
+ * Prefer `source.displayUnit` for converted device-state values.
36287
+ */
36200
36288
  unitLabel: string().max(8).optional(),
36201
36289
  /** Raw value → display text, e.g. `{"true":"MOTION","false":""}`. */
36202
36290
  valueMap: record(string(), string()).optional(),
@@ -36305,6 +36393,12 @@ method(object({ deviceId: number().int() }), object({
36305
36393
  }), method(object({ deviceId: number().int() }), object({ results: array(OsdRenderResultSchema) }), {
36306
36394
  kind: "mutation",
36307
36395
  auth: "admin"
36396
+ }), method(object({}), object({ templates: array(OsdNamedTemplateSchema) }), { auth: "admin" }), method(object({ template: OsdNamedTemplateSchema }), object({ template: OsdNamedTemplateSchema }), {
36397
+ kind: "mutation",
36398
+ auth: "admin"
36399
+ }), method(object({ templateId: string().min(1).max(64) }), object({ success: literal(true) }), {
36400
+ kind: "mutation",
36401
+ auth: "admin"
36308
36402
  });
36309
36403
  /**
36310
36404
  * Feeder connectivity / power status — mirrors the HA petkit device-status
@@ -41512,6 +41606,7 @@ var zoneRulesCapability = {
41512
41606
  */
41513
41607
  durability: "restored"
41514
41608
  };
41609
+ SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
41515
41610
  /**
41516
41611
  * Most specific first. Extending this list is how a new device kind becomes
41517
41612
  * gateable; nothing else needs to change.
@@ -47752,6 +47847,12 @@ Object.freeze({
47752
47847
  addonId: null,
47753
47848
  access: "create"
47754
47849
  },
47850
+ "osdManager.deleteTemplate": {
47851
+ capName: "osd-manager",
47852
+ capScope: "system",
47853
+ addonId: null,
47854
+ access: "delete"
47855
+ },
47755
47856
  "osdManager.getConditionSupport": {
47756
47857
  capName: "osd-manager",
47757
47858
  capScope: "system",
@@ -47770,6 +47871,12 @@ Object.freeze({
47770
47871
  addonId: null,
47771
47872
  access: "view"
47772
47873
  },
47874
+ "osdManager.listTemplates": {
47875
+ capName: "osd-manager",
47876
+ capScope: "system",
47877
+ addonId: null,
47878
+ access: "view"
47879
+ },
47773
47880
  "osdManager.previewSlot": {
47774
47881
  capName: "osd-manager",
47775
47882
  capScope: "system",
@@ -47788,6 +47895,12 @@ Object.freeze({
47788
47895
  addonId: null,
47789
47896
  access: "create"
47790
47897
  },
47898
+ "osdManager.upsertTemplate": {
47899
+ capName: "osd-manager",
47900
+ capScope: "system",
47901
+ addonId: null,
47902
+ access: "create"
47903
+ },
47791
47904
  "petFeeder.callPet": {
47792
47905
  capName: "pet-feeder",
47793
47906
  capScope: "device",
@@ -54368,6 +54481,18 @@ var ARMED_WORD_PREFIX = "armed_";
54368
54481
  var ALARM_PANEL_CAP = "alarm-panel";
54369
54482
  var ALARM_PANEL_TRIGGER_METHOD = "trigger";
54370
54483
  /**
54484
+ * Opening caps that can be ACTUATED to a secure state on arm (close / lock /
54485
+ * off). Contacts are openings but not controllable — they only block.
54486
+ */
54487
+ var NC_ALARM_CONTROLLABLE_CAPS = [
54488
+ "cover",
54489
+ "lock-control",
54490
+ "switch"
54491
+ ];
54492
+ function isAlarmControllableCap(cap) {
54493
+ return NC_ALARM_CONTROLLABLE_CAPS.includes(cap);
54494
+ }
54495
+ /**
54371
54496
  * A rule belongs to the alarm when its `deviceState` gate names ANY device's
54372
54497
  * `armed_*` word, or an ENABLED `onTrigger` sequence pulls the alarm panel's
54373
54498
  * trigger (D630).
@@ -54376,6 +54501,32 @@ function ruleBelongsToAlarm(rule) {
54376
54501
  if ((rule.conditions.deviceState?.states ?? []).some((s) => s.trim().toLowerCase().startsWith(ARMED_WORD_PREFIX))) return true;
54377
54502
  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));
54378
54503
  }
54504
+ /** Whether this controllable should be closed/locked/turned off on arm. */
54505
+ function alarmDeviceSecureOnArm(input) {
54506
+ if (!input.controllable) return false;
54507
+ return !input.secureOnArmOff.includes(input.deviceId);
54508
+ }
54509
+ /** The one secure command for a controllable opening cap, or null for contacts. */
54510
+ function secureActuationFor(cap) {
54511
+ if (!isAlarmControllableCap(cap)) return null;
54512
+ switch (cap) {
54513
+ case "cover": return {
54514
+ cap,
54515
+ method: "close",
54516
+ args: {}
54517
+ };
54518
+ case "lock-control": return {
54519
+ cap,
54520
+ method: "lock",
54521
+ args: {}
54522
+ };
54523
+ case "switch": return {
54524
+ cap,
54525
+ method: "setState",
54526
+ args: { on: false }
54527
+ };
54528
+ }
54529
+ }
54379
54530
  var NC_ALARM_DELAY_FIELDS = [
54380
54531
  "exitDelaySec",
54381
54532
  "entryDelaySec",
@@ -54435,10 +54586,11 @@ function applyModeDelaysEdits(current, edits) {
54435
54586
  return out.filter((e) => e.exitDelaySec !== void 0 || e.entryDelaySec !== void 0 || e.triggeredDurationSec !== void 0);
54436
54587
  }
54437
54588
  /**
54438
- * Put ONE device on, or take it off, ONE mode's list. A no-op answers `changed: false`; an add
54439
- * to a full list is REFUSED by reason (never silently dropped); an emptied list drops its entry.
54589
+ * Put ONE device on, or take it off, ONE mode's device-id list. A no-op answers
54590
+ * `changed: false`; an add to a full list is REFUSED by reason (never silently
54591
+ * dropped); an emptied list drops its entry.
54440
54592
  */
54441
- function applyNonBlockingEdit(lists, edit) {
54593
+ function applyModeDeviceListEdit(lists, edit) {
54442
54594
  const copy = lists.map((l) => ({
54443
54595
  mode: l.mode,
54444
54596
  deviceIds: [...l.deviceIds]
@@ -54446,12 +54598,12 @@ function applyNonBlockingEdit(lists, edit) {
54446
54598
  const at = copy.findIndex((l) => l.mode === edit.mode);
54447
54599
  const held = at >= 0 ? copy[at]?.deviceIds ?? [] : [];
54448
54600
  const present = held.includes(edit.deviceId);
54449
- if (edit.nonBlocking === present) return {
54601
+ if (edit.present === present) return {
54450
54602
  kind: "applied",
54451
54603
  lists: copy,
54452
54604
  changed: false
54453
54605
  };
54454
- if (edit.nonBlocking) {
54606
+ if (edit.present) {
54455
54607
  if (held.length >= 200) return {
54456
54608
  kind: "refused",
54457
54609
  reason: "list-full",
@@ -54478,6 +54630,35 @@ function applyNonBlockingEdit(lists, edit) {
54478
54630
  };
54479
54631
  }
54480
54632
  /**
54633
+ * Put ONE device on, or take it off, ONE mode's non-blocking list.
54634
+ */
54635
+ function applyNonBlockingEdit(lists, edit) {
54636
+ return applyModeDeviceListEdit(lists, {
54637
+ mode: edit.mode,
54638
+ deviceId: edit.deviceId,
54639
+ present: edit.nonBlocking
54640
+ });
54641
+ }
54642
+ /** Controllable opt-in to blocking. */
54643
+ function applyBlockingEdit(lists, edit) {
54644
+ return applyModeDeviceListEdit(lists, {
54645
+ mode: edit.mode,
54646
+ deviceId: edit.deviceId,
54647
+ present: edit.blocking
54648
+ });
54649
+ }
54650
+ /**
54651
+ * Controllable secure-on-arm: `secureOnArm: true` removes from the opt-out list;
54652
+ * `false` adds to it.
54653
+ */
54654
+ function applySecureOnArmEdit(lists, edit) {
54655
+ return applyModeDeviceListEdit(lists, {
54656
+ mode: edit.mode,
54657
+ deviceId: edit.deviceId,
54658
+ present: !edit.secureOnArm
54659
+ });
54660
+ }
54661
+ /**
54481
54662
  * WHICH WAY A BOOLEAN SENSOR MOVED — read off the one slice a sensor event
54482
54663
  * persists (D640 "a sensor rule fires on the raise, the clear, or both").
54483
54664
  *
@@ -57680,12 +57861,24 @@ Object.defineProperty(exports, "addonWidgetsSourceCapability", {
57680
57861
  return addonWidgetsSourceCapability;
57681
57862
  }
57682
57863
  });
57864
+ Object.defineProperty(exports, "alarmDeviceSecureOnArm", {
57865
+ enumerable: true,
57866
+ get: function() {
57867
+ return alarmDeviceSecureOnArm;
57868
+ }
57869
+ });
57683
57870
  Object.defineProperty(exports, "alarmPanelCapability", {
57684
57871
  enumerable: true,
57685
57872
  get: function() {
57686
57873
  return alarmPanelCapability;
57687
57874
  }
57688
57875
  });
57876
+ Object.defineProperty(exports, "applyBlockingEdit", {
57877
+ enumerable: true,
57878
+ get: function() {
57879
+ return applyBlockingEdit;
57880
+ }
57881
+ });
57689
57882
  Object.defineProperty(exports, "applyModeDelaysEdits", {
57690
57883
  enumerable: true,
57691
57884
  get: function() {
@@ -57698,6 +57891,12 @@ Object.defineProperty(exports, "applyNonBlockingEdit", {
57698
57891
  return applyNonBlockingEdit;
57699
57892
  }
57700
57893
  });
57894
+ Object.defineProperty(exports, "applySecureOnArmEdit", {
57895
+ enumerable: true,
57896
+ get: function() {
57897
+ return applySecureOnArmEdit;
57898
+ }
57899
+ });
57701
57900
  Object.defineProperty(exports, "array", {
57702
57901
  enumerable: true,
57703
57902
  get: function() {
@@ -57878,6 +58077,12 @@ Object.defineProperty(exports, "hydrateSchema", {
57878
58077
  return hydrateSchema;
57879
58078
  }
57880
58079
  });
58080
+ Object.defineProperty(exports, "isAlarmControllableCap", {
58081
+ enumerable: true,
58082
+ get: function() {
58083
+ return isAlarmControllableCap;
58084
+ }
58085
+ });
57881
58086
  Object.defineProperty(exports, "isAudioClassName", {
57882
58087
  enumerable: true,
57883
58088
  get: function() {
@@ -58130,6 +58335,12 @@ Object.defineProperty(exports, "sceneMonitorCapability", {
58130
58335
  return sceneMonitorCapability;
58131
58336
  }
58132
58337
  });
58338
+ Object.defineProperty(exports, "secureActuationFor", {
58339
+ enumerable: true,
58340
+ get: function() {
58341
+ return secureActuationFor;
58342
+ }
58343
+ });
58133
58344
  Object.defineProperty(exports, "sensorRaisedOf", {
58134
58345
  enumerable: true,
58135
58346
  get: function() {
@@ -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-D-zzCBKK.js");
5
+ const require_clip_model_registry = require("../clip-model-registry-C_aKxHpy.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 { An as embeddingModelFailedError, Fr as BaseAddon, Ht as PoolMemoryWatchdog, Mn as embeddingRequirementsFailedError, Nn as embeddingRequirementsUnavailableError, Ur as normalizeNodeId, a as CLIP_EMBEDDING_STEP_ID, c as resolveClusterModelPin, i as CLIP_TEXT_MODELS, kn as embeddingEncoderCapability, n as DEFAULT_CLIP_MODEL, r as CLIP_IMAGE_MODELS, t as BUILTIN_CLIP_MODELS, tr as parseProcStatus, ur as resolvePoolMemoryPolicy } from "../clip-model-registry-Dkv8MUCO.mjs";
1
+ import { Br as BaseAddon, Fn as embeddingRequirementsFailedError, Ht as PoolMemoryWatchdog, In as embeddingRequirementsUnavailableError, Jr as normalizeNodeId, Mn as embeddingEncoderCapability, Nn as embeddingModelFailedError, a as CLIP_EMBEDDING_STEP_ID, ar as parseProcStatus, c as resolveClusterModelPin, i as CLIP_TEXT_MODELS, mr as resolvePoolMemoryPolicy, n as DEFAULT_CLIP_MODEL, r as CLIP_IMAGE_MODELS, t as BUILTIN_CLIP_MODELS } from "../clip-model-registry-C-IEAIQQ.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";
@@ -1,8 +1,8 @@
1
1
  import { a as e, i as t, n, o as r, r as i, t as a } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare__react__loadShare__.js-C0AuF9av.mjs";
2
2
  import { t as o } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-B3Wx5J80.mjs";
3
- import { a as s, i as c, n as l, o as u, r as d, s as f, t as p } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-B_KS96RA.mjs";
3
+ import { a as s, i as c, n as l, o as u, r as d, s as f, t as p } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-C1V_UEyk.mjs";
4
4
  import { n as m, r as h, t as g } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-Bm-iyjmq.mjs";
5
- import { t as _ } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BAqKeExF.mjs";
5
+ import { t as _ } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-7e_3hsiC.mjs";
6
6
  //#region ../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
7
7
  var v = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim(), y = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), b = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), x = (e) => {
8
8
  let t = b(e);
@@ -18,7 +18,7 @@ var e = {
18
18
  },
19
19
  "@camstack/types": {
20
20
  name: "@camstack/types",
21
- version: "1.2.290",
21
+ version: "1.2.296",
22
22
  scope: ["default"],
23
23
  loaded: !1,
24
24
  from: "addon_pipeline_analytics_widgets",
@@ -33,7 +33,7 @@ var e = {
33
33
  },
34
34
  "@camstack/ui-library": {
35
35
  name: "@camstack/ui-library",
36
- version: "1.2.221",
36
+ version: "1.2.223",
37
37
  scope: ["default"],
38
38
  loaded: !1,
39
39
  from: "addon_pipeline_analytics_widgets",