@camstack/addon-admin-ui 1.2.266 → 1.2.268
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.
- package/dist/assets/{AddonCollectionPage-CH9hGNsl.js → AddonCollectionPage-BDiyJC3r.js} +1 -1
- package/dist/assets/{Addons-X99-jWIv.js → Addons-Be4Azmoc.js} +1 -1
- package/dist/assets/AdminTabs-B1ePQeIx.js +1 -0
- package/dist/assets/{AiProfiles-CufCtwdR.js → AiProfiles-BbgOs6Wv.js} +1 -1
- package/dist/assets/{BrokerForm-DwGhDxrN.js → BrokerForm-BiJ_fkWn.js} +1 -1
- package/dist/assets/{Build-BcXP2_Y6.js → Build-DpJ8jmcp.js} +3 -3
- package/dist/assets/{Capabilities-B9uMfM8F.js → Capabilities-PB-e53MB.js} +1 -1
- package/dist/assets/{CapabilityBadges-Ct0inpgH.js → CapabilityBadges-DRR9N-ly.js} +1 -1
- package/dist/assets/{Cluster-rHjZM17h.js → Cluster-BaiZhiqI.js} +1 -1
- package/dist/assets/{Data-6q4IrgiO.js → Data-DHJ9pfzS.js} +1 -1
- package/dist/assets/{DetectionIntelligence-rRyquGIU.js → DetectionIntelligence-D6L1j9ki.js} +1 -1
- package/dist/assets/{DeviceAggregateSection-BewPZ0sX.js → DeviceAggregateSection-CwHetJpD.js} +1 -1
- package/dist/assets/{DeviceDetail-BZnajsi4.js → DeviceDetail-BMk4K5n1.js} +2 -2
- package/dist/assets/{Devices-Dcnq_aGP.js → Devices-C2w0vkan.js} +1 -1
- package/dist/assets/{EmbedPlayerPage-CSI6tdlW.js → EmbedPlayerPage-CplJLJc0.js} +1 -1
- package/dist/assets/{Events-CmI5AZ3S.js → Events-e9aG36Qi.js} +1 -1
- package/dist/assets/{FormBuilder-WQFPFTW5.js → FormBuilder-JPtoOHSA.js} +1 -1
- package/dist/assets/{Identity-ChZKnMoO.js → Identity-C0Vp9au9.js} +1 -1
- package/dist/assets/{IntegrationDetail-C6a5DNTQ.js → IntegrationDetail-DbRK5Cnr.js} +1 -1
- package/dist/assets/{Integrations-B1y3lr-7.js → Integrations-BL-TTvQX.js} +1 -1
- package/dist/assets/{Integrations-BsaYvGqF.js → Integrations-LVaSjYlH.js} +1 -1
- package/dist/assets/{Locations-DlDjZxSv.js → Locations-BCua9deL.js} +2 -2
- package/dist/assets/{Logs-DTYBczsw.js → Logs-BJ3nvNoI.js} +1 -1
- package/dist/assets/{MotionZonesSettings-E1rpEAhz.js → MotionZonesSettings-DeGQM5jm.js} +1 -1
- package/dist/assets/{MyAccess-C8OY0BtW.js → MyAccess-DS16d29E.js} +1 -1
- package/dist/assets/{Network-QocgpPKi.js → Network-C5ZnyS5r.js} +1 -1
- package/dist/assets/{NodeAddonsSettingsPanel-1JQaJsCE.js → NodeAddonsSettingsPanel-C9YokgVm.js} +1 -1
- package/dist/assets/{NodeInferenceDevices-C1sPl_zK.js → NodeInferenceDevices-BR1alNg3.js} +1 -1
- package/dist/assets/Notifications-DKYzXSrT.js +1 -0
- package/dist/assets/{Pipeline-CgGpYxcl.js → Pipeline-4MAMRXJo.js} +1 -1
- package/dist/assets/{Plates-DmPIKCi6.js → Plates-CTSHkuf5.js} +1 -1
- package/dist/assets/{PrivacyMaskSettings-Di4BC6vd.js → PrivacyMaskSettings-DkWop0gJ.js} +1 -1
- package/dist/assets/{ProviderIcon-CalACBCv.js → ProviderIcon-8uzoGT4j.js} +1 -1
- package/dist/assets/{Recordings-LG_EAP5Y.js → Recordings-ay1wn0pq.js} +1 -1
- package/dist/assets/{ScanNetworkModal-CzpESdou.js → ScanNetworkModal-v8RWRhPS.js} +1 -1
- package/dist/assets/{SceneMonitorEditor-oyJ6wM8D.js → SceneMonitorEditor-D7e4SZrV.js} +1 -1
- package/dist/assets/{Scenes-DdGSsxoN.js → Scenes-BYyeS62P.js} +1 -1
- package/dist/assets/{Settings-pkejy-p8.js → Settings-DrT7D1kz.js} +1 -1
- package/dist/assets/{Showroom-BPYNBg_-.js → Showroom-D_1uLqvo.js} +1 -1
- package/dist/assets/{StorageLocationsPanel-Bh9serlr.js → StorageLocationsPanel-BGgNXdNU.js} +1 -1
- package/dist/assets/{Terminal-CA5TdsrG.js → Terminal-B5vVbe69.js} +1 -1
- package/dist/assets/{Viewer-Drmg2Ejy.js → Viewer-N8pbvIUg.js} +1 -1
- package/dist/assets/{_virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-D_KUeTsd.js → _virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-D8C1tKZ3.js} +1 -1
- package/dist/assets/{archive-qAgd4cmZ.js → archive-Dlpv9Fc4.js} +1 -1
- package/dist/assets/{authed-media-zct-j3cj.js → authed-media-0NlBkfwF.js} +1 -1
- package/dist/assets/{boxes-B76KDVc3.js → boxes-D35FAE-d.js} +1 -1
- package/dist/assets/circle-slash-B7yc0bun.js +1 -0
- package/dist/assets/{debounced-invalidate-D_2NBRHb.js → debounced-invalidate-DkBJ3ZGO.js} +1 -1
- package/dist/assets/dist-D26xnhfQ.js +1 -0
- package/dist/assets/dist-DCYho4PN.js +349 -0
- package/dist/assets/{face-bbox-B8LQFqpz.js → face-bbox-z_aqx5D-.js} +1 -1
- package/dist/assets/{hard-drive-download-QwRO-K79.js → hard-drive-download-D_gHpk7t.js} +1 -1
- package/dist/assets/{hostInit-GlPGaf9F.js → hostInit-DJMlT8WD.js} +1 -1
- package/dist/assets/{index-BFsDCSWR.css → index-B-0u4ZEx.css} +1 -1
- package/dist/assets/{index-DMcMbxBl.js → index-DuNKDpIx.js} +3 -3
- package/dist/assets/{layers-DpGMZn67.js → layers-O7ZsGJL2.js} +1 -1
- package/dist/assets/{location-owned-usage-DyThbZ3H.js → location-owned-usage-Df31U1rG.js} +1 -1
- package/dist/assets/{mf-entry-bootstrap-0-466c9d23.js → mf-entry-bootstrap-0-37a7ec9e.js} +2 -2
- package/dist/assets/{player-overlays-DBeLKlvr.js → player-overlays-9O4jHfnc.js} +1 -1
- package/dist/assets/remoteEntry-BEDwfa3K.js +1 -0
- package/dist/assets/{send-Dj20pEAB.js → send-BmzjCKvR.js} +1 -1
- package/dist/assets/{settings-2-DFFRVeal.js → settings-2-B3oOnw5X.js} +1 -1
- package/dist/assets/{square-check-big-CrYM6cIR.js → square-check-big-DN9a1lmn.js} +1 -1
- package/dist/assets/src-CUkzMOJh.js +67 -0
- package/dist/assets/src-Ch3F2Q7H.js +349 -0
- package/dist/assets/{use-scenes-feed-BnJkVAGn.js → use-scenes-feed-prMUbWfO.js} +1 -1
- package/dist/assets/{use-stationary-objects-EvgA5taz.js → use-stationary-objects-h7BENgzl.js} +1 -1
- package/dist/assets/useEventInvalidation-Df0jCPOD.js +1 -0
- package/dist/assets/{useNodeUrlSelection-CuL0_KpS.js → useNodeUrlSelection-D9dwaKm2.js} +1 -1
- package/dist/assets/user-round-B_KAmYi2.js +1 -0
- package/dist/assets/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-CZO6_ULN.js → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-BfsJd_Ta.js} +2 -2
- package/dist/index.html +6 -6
- package/dist/server/addon.js +149 -4
- package/package.json +1 -1
- package/dist/assets/AdminTabs-CYf73mcj.js +0 -1
- package/dist/assets/Notifications-DN0lnKy8.js +0 -1
- package/dist/assets/circle-slash-DqKy2VT5.js +0 -1
- package/dist/assets/dist-BZGaQ7Y7.js +0 -1
- package/dist/assets/dist-C2bPequg.js +0 -349
- package/dist/assets/remoteEntry-Blr1kesh.js +0 -1
- package/dist/assets/src-B2UA4y-L.js +0 -349
- package/dist/assets/src-Cr7Ldmwc.js +0 -67
- package/dist/assets/useEventInvalidation-B6eXiCUA.js +0 -1
- package/dist/assets/user-round-Cs8qBz0D.js +0 -1
package/dist/server/addon.js
CHANGED
|
@@ -5361,7 +5361,7 @@ var ZodIssueCode = {
|
|
|
5361
5361
|
var ZodFirstPartyTypeKind;
|
|
5362
5362
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5363
5363
|
//#endregion
|
|
5364
|
-
//#region ../types/dist/sleep-
|
|
5364
|
+
//#region ../types/dist/sleep-DU7mu4wb.mjs
|
|
5365
5365
|
/**
|
|
5366
5366
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5367
5367
|
* window to float samples (D455).
|
|
@@ -17211,6 +17211,16 @@ var NcCrossingSchema = _enum([
|
|
|
17211
17211
|
"exit",
|
|
17212
17212
|
"any"
|
|
17213
17213
|
]);
|
|
17214
|
+
/**
|
|
17215
|
+
* Which edge of a BOOLEAN sensor fires a device-event rule (D640).
|
|
17216
|
+
* - `raised` — the sensor went high: water detected, smoke, open, tampered.
|
|
17217
|
+
* - `cleared` — it went back: dry, clear, closed.
|
|
17218
|
+
* - absent — both edges, which is what every rule authored before this did.
|
|
17219
|
+
*
|
|
17220
|
+
* There is no third member for "both": absence already says it, and a value
|
|
17221
|
+
* that means the same as absence is a second way to write one rule.
|
|
17222
|
+
*/
|
|
17223
|
+
var NcSensorTransitionSchema = _enum(["raised", "cleared"]);
|
|
17214
17224
|
/** Admin-zone membership condition (zone IDs as stamped by the ZoneEngine). */
|
|
17215
17225
|
var NcZoneConditionSchema = object({
|
|
17216
17226
|
ids: array(string().min(1)).min(1),
|
|
@@ -17400,6 +17410,20 @@ var NcConditionsSchema = object({
|
|
|
17400
17410
|
scene: NcSceneConditionSchema.optional(),
|
|
17401
17411
|
/** Device scope — absent = all devices. */
|
|
17402
17412
|
devices: array(number()).optional(),
|
|
17413
|
+
/**
|
|
17414
|
+
* Device EXCLUSION (D641) — "every device except these". Judged on the SAME
|
|
17415
|
+
* subject ids {@link devices} is judged on (the camera, the sensor that
|
|
17416
|
+
* fired, a linked set's sensor and row cameras), so a sensor fanned out per
|
|
17417
|
+
* linked camera is excluded exactly where an include would have tested it.
|
|
17418
|
+
* `min(1)`: an empty exclusion excludes nothing and is written as absent.
|
|
17419
|
+
*
|
|
17420
|
+
* Not for `system-event` rules — those carry their own
|
|
17421
|
+
* `systemEvent.excludeDeviceIds` (D636), and the hub refuses this key there.
|
|
17422
|
+
* Editors present the two lists as ONE field (All | Only these | All except
|
|
17423
|
+
* these); the engine evaluates each independently, so a legacy rule
|
|
17424
|
+
* carrying both still means "these, minus those".
|
|
17425
|
+
*/
|
|
17426
|
+
devicesExclude: array(number()).min(1).optional(),
|
|
17403
17427
|
/** Detector class names (any overlap with the record's class set). */
|
|
17404
17428
|
classes: array(string().min(1)).optional(),
|
|
17405
17429
|
/** Veto classes — any overlap fails the rule. */
|
|
@@ -17533,6 +17557,16 @@ var NcConditionsSchema = object({
|
|
|
17533
17557
|
*/
|
|
17534
17558
|
sensorKinds: array(string().min(1)).optional(),
|
|
17535
17559
|
/**
|
|
17560
|
+
* DEVICE-EVENT only (D640). Fire on one edge of a boolean sensor —
|
|
17561
|
+
* {@link NcSensorTransitionSchema}. Which field of the slice means "raised"
|
|
17562
|
+
* is `@camstack/types` → `notification/sensor-raised.ts`. A reading the
|
|
17563
|
+
* engine cannot place (a kind with no raise, an unreadable slice) PASSES:
|
|
17564
|
+
* the condition fails open towards notifying, never towards silence. Editors
|
|
17565
|
+
* offer it only when every chosen {@link sensorKinds} member has a raise
|
|
17566
|
+
* (`sensorTransitionOffered`), and the hub refuses it on any other delivery.
|
|
17567
|
+
*/
|
|
17568
|
+
sensorTransition: NcSensorTransitionSchema.optional(),
|
|
17569
|
+
/**
|
|
17536
17570
|
* PACKAGE-EVENT only. Which package phase fires the rule — `delivered`
|
|
17537
17571
|
* (a parked parcel appeared), `picked-up` (it departed), or `both`. Fails
|
|
17538
17572
|
* when the subject's phase does not match (a subject always carries a phase
|
|
@@ -18151,6 +18185,7 @@ var NcConditionDescriptorSchema = object({
|
|
|
18151
18185
|
/** Editor widget the UI renders — never hardcode per-condition forms. */
|
|
18152
18186
|
valueType: _enum([
|
|
18153
18187
|
"deviceIdList",
|
|
18188
|
+
"deviceIdExcludeList",
|
|
18154
18189
|
"stringList",
|
|
18155
18190
|
"number01",
|
|
18156
18191
|
"number",
|
|
@@ -18161,6 +18196,7 @@ var NcConditionDescriptorSchema = object({
|
|
|
18161
18196
|
"plateMatcher",
|
|
18162
18197
|
"packagePhase",
|
|
18163
18198
|
"crossingSelect",
|
|
18199
|
+
"sensorTransition",
|
|
18164
18200
|
"polygonDraw",
|
|
18165
18201
|
"occupancy",
|
|
18166
18202
|
"audio",
|
|
@@ -18311,6 +18347,28 @@ var NcHistoryFilterSchema = object({
|
|
|
18311
18347
|
limit: number().int().min(1).max(500).default(100)
|
|
18312
18348
|
});
|
|
18313
18349
|
/**
|
|
18350
|
+
* Every rule's last run, in one answer.
|
|
18351
|
+
*
|
|
18352
|
+
* A rule ABSENT from `runs` produced no delivery inside `horizonMs` — how far
|
|
18353
|
+
* back this answer looked, in ms before the hub's now. It is the outbox prune
|
|
18354
|
+
* window (7 days by default, operator-configurable), NARROWED when the read hit
|
|
18355
|
+
* its row bound: the answer never claims a window it did not read. `null` means
|
|
18356
|
+
* the operator keeps the outbox forever AND the read reached its end, so absent
|
|
18357
|
+
* means "never on record". A UI derives its "not in the last N days" from this
|
|
18358
|
+
* value, never from a constant — and only when the call ANSWERED (D315).
|
|
18359
|
+
*/
|
|
18360
|
+
var NcRuleLastRunsSchema = object({
|
|
18361
|
+
runs: array(object({
|
|
18362
|
+
ruleId: string(),
|
|
18363
|
+
/** Fire time of the newest row (`createdAt`, epoch ms). */
|
|
18364
|
+
lastAt: number(),
|
|
18365
|
+
status: NcHistoryStatusSchema,
|
|
18366
|
+
/** The camera/device of that row (a digest row files under its first camera). */
|
|
18367
|
+
deviceId: number()
|
|
18368
|
+
})),
|
|
18369
|
+
horizonMs: number().nonnegative().nullable()
|
|
18370
|
+
});
|
|
18371
|
+
/**
|
|
18314
18372
|
* What a snooze covers. Broader scopes win when several overlap, so one window
|
|
18315
18373
|
* leaves ONE digest rather than a rule snooze and a whole-feed snooze both
|
|
18316
18374
|
* summarising the same silence.
|
|
@@ -18491,6 +18549,14 @@ var NcAlarmModeCoverageSchema = object({
|
|
|
18491
18549
|
/** Ids named by the covering rules. A SUBSET when `allDevices` is true. */
|
|
18492
18550
|
deviceIds: array(number().int()),
|
|
18493
18551
|
/**
|
|
18552
|
+
* D641: the ids NOT covered although `allDevices` is true — every unscoped
|
|
18553
|
+
* covering rule EXCLUDES them (`conditions.devicesExclude`) and no named rule
|
|
18554
|
+
* covers them. Always `[]` when `allDevices` is false. Excluded by the rules,
|
|
18555
|
+
* which is not the same as skipped by a switch: never in `skippedDevices`.
|
|
18556
|
+
* Defaulted so an answer computed before this field parses as "none".
|
|
18557
|
+
*/
|
|
18558
|
+
allDevicesExcept: array(number().int()).default([]),
|
|
18559
|
+
/**
|
|
18494
18560
|
* Devices this mode NAMES but cannot actually arm, each with the switch that
|
|
18495
18561
|
* excludes it.
|
|
18496
18562
|
*
|
|
@@ -18626,7 +18692,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
|
|
|
18626
18692
|
})), method(object({}), object({ vars: array(NcTemplateVarDescriptorSchema) })), method(NcTemplatePreviewInputSchema, NcTemplatePreviewSchema, {
|
|
18627
18693
|
kind: "mutation",
|
|
18628
18694
|
access: "view"
|
|
18629
|
-
}), method(object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), object({ entries: array(NcHistoryEntrySchema) }), { auth: "admin" }), method(object({ artifactId: string().min(1) }), object({ url: string().nullable() }), { auth: "admin" }), method(object({}), object({ snoozes: array(NcSnoozeSchema) }), { caller: "required" }), method(object({ snooze: NcSnoozeInputSchema }), object({ snooze: NcSnoozeSchema }), {
|
|
18695
|
+
}), method(object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), object({ entries: array(NcHistoryEntrySchema) }), { auth: "admin" }), method(object({}), NcRuleLastRunsSchema, { auth: "admin" }), method(object({ artifactId: string().min(1) }), object({ url: string().nullable() }), { auth: "admin" }), method(object({}), object({ snoozes: array(NcSnoozeSchema) }), { caller: "required" }), method(object({ snooze: NcSnoozeInputSchema }), object({ snooze: NcSnoozeSchema }), {
|
|
18630
18696
|
kind: "mutation",
|
|
18631
18697
|
caller: "required"
|
|
18632
18698
|
}), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
|
|
@@ -23072,7 +23138,11 @@ function buildDescriptor(capName, kind) {
|
|
|
23072
23138
|
icon: legacyIcon(t.iconId)
|
|
23073
23139
|
};
|
|
23074
23140
|
}
|
|
23075
|
-
|
|
23141
|
+
/**
|
|
23142
|
+
* Sensor / control cap name → static event-kind descriptor. A linked device
|
|
23143
|
+
* contributes one entry per bound cap present in this map.
|
|
23144
|
+
*/
|
|
23145
|
+
var EVENT_KIND_BY_CAP = Object.freeze(Object.fromEntries(Object.entries(CAP_TO_KIND).map(([capName, kind]) => [capName, buildDescriptor(capName, kind)])));
|
|
23076
23146
|
/**
|
|
23077
23147
|
* server-management — per-NODE singleton capability for a node's ROOT
|
|
23078
23148
|
* package lifecycle (runtime-updatable node packages).
|
|
@@ -33632,6 +33702,42 @@ DeviceType.Camera, method(object({
|
|
|
33632
33702
|
package: array(ZoneRuleSchema).readonly()
|
|
33633
33703
|
});
|
|
33634
33704
|
/**
|
|
33705
|
+
* LA tabella "quale booleano di questo tipo di device conta come ALTO", e il
|
|
33706
|
+
* valutatore puro del suo FRONTE.
|
|
33707
|
+
*
|
|
33708
|
+
* Viveva dentro il builtin virtual-doorbell
|
|
33709
|
+
* (`@camstack/system` — `builtins/doorbell/trigger-engine.ts`) e i suoi
|
|
33710
|
+
* predicati erano privati al modulo. Il recorder ne ha bisogno per il trigger
|
|
33711
|
+
* `RecordingTriggers.sensorDeviceIds`: copiarla avrebbe creato la SECONDA
|
|
33712
|
+
* tabella, che diverge alla prima cap aggiunta e il cui sintomo — "il sensore
|
|
33713
|
+
* fa suonare il campanello ma non registra" — è esattamente D62. Quindi si
|
|
33714
|
+
* SPOSTA qui e il doorbell la ri-esporta.
|
|
33715
|
+
*
|
|
33716
|
+
* ⚠ NON è `DEVICE_STATE_READERS` (`catalogs/device-state-vocabulary.ts`), e le
|
|
33717
|
+
* due non vanno unificate: quella risponde a "qual è la PAROLA di stato per una
|
|
33718
|
+
* regola" (e include `presence`, `cover`, `alarm-panel`), questa a "qual è il
|
|
33719
|
+
* booleano il cui FRONTE conta". Vocabolari deliberatamente diversi.
|
|
33720
|
+
*/
|
|
33721
|
+
/**
|
|
33722
|
+
* Known binary / switch source caps → the boolean slice field whose
|
|
33723
|
+
* false→true rise counts as ACTIVE. Every entry is "fire on active".
|
|
33724
|
+
* Sensors whose "active" reading is not a plain boolean (presence's string
|
|
33725
|
+
* state, connectivity's connected flag) are deliberately excluded — a
|
|
33726
|
+
* reconnect is not a doorbell press, and it is not a recording either.
|
|
33727
|
+
*/
|
|
33728
|
+
var SOURCE_CAP_ACTIVE_FIELD = {
|
|
33729
|
+
contact: "entryOpen",
|
|
33730
|
+
binary: "on",
|
|
33731
|
+
switch: "on",
|
|
33732
|
+
motion: "detected",
|
|
33733
|
+
flood: "flooded",
|
|
33734
|
+
gas: "detected",
|
|
33735
|
+
smoke: "detected",
|
|
33736
|
+
"carbon-monoxide": "detected",
|
|
33737
|
+
vibration: "detected",
|
|
33738
|
+
tamper: "tampered"
|
|
33739
|
+
};
|
|
33740
|
+
/**
|
|
33635
33741
|
* Accessory device helpers — shared across drivers.
|
|
33636
33742
|
*
|
|
33637
33743
|
* Many vendor-specific drivers register accessory child devices on
|
|
@@ -38537,6 +38643,12 @@ Object.freeze({
|
|
|
38537
38643
|
addonId: null,
|
|
38538
38644
|
access: "view"
|
|
38539
38645
|
},
|
|
38646
|
+
"notificationRules.getRuleLastRuns": {
|
|
38647
|
+
capName: "notification-rules",
|
|
38648
|
+
capScope: "system",
|
|
38649
|
+
addonId: null,
|
|
38650
|
+
access: "view"
|
|
38651
|
+
},
|
|
38540
38652
|
"notificationRules.getTemplateCatalog": {
|
|
38541
38653
|
capName: "notification-rules",
|
|
38542
38654
|
capScope: "system",
|
|
@@ -44179,6 +44291,39 @@ new Map(Object.entries({
|
|
|
44179
44291
|
}));
|
|
44180
44292
|
[...NC_SYSTEM_EVENT_FILTER_KEYS];
|
|
44181
44293
|
NC_AUDIO_DEFAULTS.hitPercent, NC_AUDIO_DEFAULTS.samplingSeconds;
|
|
44294
|
+
/**
|
|
44295
|
+
* WHICH WAY A BOOLEAN SENSOR MOVED — read off the one slice a sensor event
|
|
44296
|
+
* persists (D640 "a sensor rule fires on the raise, the clear, or both").
|
|
44297
|
+
*
|
|
44298
|
+
* A device-event rule over a flood sensor notified on BOTH edges: water
|
|
44299
|
+
* detected, and back to dry. `NcConditions.sensorTransition` lets the rule
|
|
44300
|
+
* name one edge; this file answers, for one `SensorEvent`, which edge it is.
|
|
44301
|
+
*
|
|
44302
|
+
* NOT A SECOND TABLE. The "which boolean of this cap counts as HIGH" question
|
|
44303
|
+
* already has one answer, `SOURCE_CAP_ACTIVE_FIELD`
|
|
44304
|
+
* (`catalogs/sensor-active-state.ts`, the doorbell's and the recorder's edge
|
|
44305
|
+
* table), and a sensor event names its kind, not its cap. So the table here is
|
|
44306
|
+
* DERIVED: event kind → cap (`EVENT_KIND_BY_CAP`) → that cap's active field.
|
|
44307
|
+
* Only kinds whose taxonomy category is `sensor` take part — a switch has an
|
|
44308
|
+
* `on` boolean too, but "it triggers / it clears" is not a sentence about a
|
|
44309
|
+
* light, and offering it there would be a knob with a misleading label.
|
|
44310
|
+
* `presence` is a WORD (`home` / `not_home` / a zone), not a boolean, and is
|
|
44311
|
+
* absent from the source table, so it is absent here.
|
|
44312
|
+
*
|
|
44313
|
+
* `undefined` = never guessed: a kind with no raise (a doorbell press, a
|
|
44314
|
+
* button, a cover), or a slice whose field is missing or not a boolean. The
|
|
44315
|
+
* engine then does NOT filter — a flood alert must not go silent because one
|
|
44316
|
+
* read came back unreadable (the same stance as the alarm's `sensorEdgeOf`).
|
|
44317
|
+
*
|
|
44318
|
+
* Pure, RN-safe: the viewer imports the support rule from here.
|
|
44319
|
+
*/
|
|
44320
|
+
/** Event kind → the boolean field of its cap slice that means "raised". */
|
|
44321
|
+
var NC_SENSOR_RAISED_FIELD_BY_KIND = Object.freeze(Object.fromEntries(Object.entries(EVENT_KIND_BY_CAP).flatMap(([capName, descriptor]) => {
|
|
44322
|
+
const field = SOURCE_CAP_ACTIVE_FIELD[capName];
|
|
44323
|
+
if (field === void 0 || descriptor.category !== "sensor") return [];
|
|
44324
|
+
return [[descriptor.kind, field]];
|
|
44325
|
+
})));
|
|
44326
|
+
Object.freeze(Object.keys(NC_SENSOR_RAISED_FIELD_BY_KIND));
|
|
44182
44327
|
var RULE_BODY_ONLY = ["body"];
|
|
44183
44328
|
var RULE_TEXT = ["title", "body"];
|
|
44184
44329
|
var BATTERY = ["device-battery-low", "device-battery-normal"];
|
|
@@ -44708,7 +44853,7 @@ var AdminUIAddon = class extends BaseAddon {
|
|
|
44708
44853
|
capability: adminUiCapability,
|
|
44709
44854
|
provider: {
|
|
44710
44855
|
getStaticDir: async () => ({ staticDir: resolveAdminUiDistDir() }),
|
|
44711
|
-
getVersion: async () => ({ version: "1.2.
|
|
44856
|
+
getVersion: async () => ({ version: "1.2.268" })
|
|
44712
44857
|
}
|
|
44713
44858
|
}];
|
|
44714
44859
|
}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{S as e,x as t}from"./_virtual_mf___mfe_internal__admin_ui_host__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-DhP-Lgiq.js";import{s as n}from"./index-DMcMbxBl.js";import{t as r}from"./StableTabPanel-Dc954AQl.js";function i({tabs:i,defaultTab:a}){let[o,s]=n(),c=o.get(`tab`),l=a??i[0]?.id??``,u=i.some(e=>e.id===c)?c:l,d=i.find(e=>e.id===u)??i[0],f=e=>{let t=new URLSearchParams(o);t.set(`tab`,e),s(t,{replace:!0})};return e(`div`,{className:`space-y-3`,children:[t(`div`,{className:`flex border-b border-border overflow-x-auto`,children:i.map(n=>{let r=n.icon;return e(`button`,{onClick:()=>f(n.id),className:`flex shrink-0 items-center gap-1.5 whitespace-nowrap px-3 py-2 text-xs font-medium border-b-2 transition-colors ${n.id===u?`border-primary text-primary`:`border-transparent text-foreground-subtle hover:text-foreground`}`,children:[r&&t(r,{className:`h-3.5 w-3.5`}),n.label]},n.id)})}),t(r,{tabKey:u,children:d?.content})]})}export{i as t};
|