@camstack/types 1.2.425 → 1.2.427
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/capabilities/battery.cap.d.ts +2 -2
- package/dist/capabilities/power-meter.cap.d.ts +109 -1
- package/dist/composition/customize/scalar-merge.d.ts +21 -0
- package/dist/generated/customize-catalog.d.ts +114 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.js +323 -18
- package/dist/index.mjs +319 -19
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -62808,7 +62808,8 @@ var BATTERY_DEVICE_TYPES = [
|
|
|
62808
62808
|
require_err_msg.DeviceType.Switch,
|
|
62809
62809
|
require_err_msg.DeviceType.PetFeeder,
|
|
62810
62810
|
require_err_msg.DeviceType.Container,
|
|
62811
|
-
require_err_msg.DeviceType.Thermostat
|
|
62811
|
+
require_err_msg.DeviceType.Thermostat,
|
|
62812
|
+
require_err_msg.DeviceType.EventEmitter
|
|
62812
62813
|
];
|
|
62813
62814
|
/** Generic Customize target for the percentage reading (D936). */
|
|
62814
62815
|
var batteryCustomize = {
|
|
@@ -71593,9 +71594,9 @@ var PowerMeterStatusSchema = zod.z.object({
|
|
|
71593
71594
|
/** Cumulative energy in kilowatt-hours since the meter was reset. */
|
|
71594
71595
|
kwhTotal: zod.z.number().optional().meta(require_sleep.readingMeta("energy", { label: "Energy" })),
|
|
71595
71596
|
/** Voltage in volts. */
|
|
71596
|
-
volts: zod.z.number().optional().meta(require_sleep.readingMeta("voltage")),
|
|
71597
|
+
volts: zod.z.number().optional().meta(require_sleep.readingMeta("voltage", { label: "Voltage" })),
|
|
71597
71598
|
/** Current in amperes. */
|
|
71598
|
-
amps: zod.z.number().optional().meta(require_sleep.readingMeta("current")),
|
|
71599
|
+
amps: zod.z.number().optional().meta(require_sleep.readingMeta("current", { label: "Current" })),
|
|
71599
71600
|
/** Apparent power in volt-amperes. */
|
|
71600
71601
|
va: zod.z.number().optional().meta(require_sleep.readingMeta("apparent-power")),
|
|
71601
71602
|
/** Power factor (0..1) if reported. */
|
|
@@ -71603,17 +71604,74 @@ var PowerMeterStatusSchema = zod.z.object({
|
|
|
71603
71604
|
/** Ms epoch when the slice was last updated. */
|
|
71604
71605
|
lastFetchedAt: zod.z.number()
|
|
71605
71606
|
});
|
|
71607
|
+
/**
|
|
71608
|
+
* Loads that draw metered mains power (D951). The reading is a feature of the
|
|
71609
|
+
* device itself — a plug, a lamp, a fan, an air conditioner, a boiler, a
|
|
71610
|
+
* vacuum dock — not a separate sensor beside it. A `Sensor` stays: a clamp
|
|
71611
|
+
* meter or a standalone energy monitor IS the device. Cover, lock, valve,
|
|
71612
|
+
* camera and the like are left out: their draw is not what anyone meters.
|
|
71613
|
+
*/
|
|
71614
|
+
var POWER_METER_DEVICE_TYPES = [
|
|
71615
|
+
require_err_msg.DeviceType.Sensor,
|
|
71616
|
+
require_err_msg.DeviceType.Switch,
|
|
71617
|
+
require_err_msg.DeviceType.Light,
|
|
71618
|
+
require_err_msg.DeviceType.Fan,
|
|
71619
|
+
require_err_msg.DeviceType.Climate,
|
|
71620
|
+
require_err_msg.DeviceType.Thermostat,
|
|
71621
|
+
require_err_msg.DeviceType.Humidifier,
|
|
71622
|
+
require_err_msg.DeviceType.WaterHeater,
|
|
71623
|
+
require_err_msg.DeviceType.MediaPlayer,
|
|
71624
|
+
require_err_msg.DeviceType.Washer,
|
|
71625
|
+
require_err_msg.DeviceType.Dryer,
|
|
71626
|
+
require_err_msg.DeviceType.Dishwasher,
|
|
71627
|
+
require_err_msg.DeviceType.Vacuum,
|
|
71628
|
+
require_err_msg.DeviceType.LawnMower,
|
|
71629
|
+
require_err_msg.DeviceType.PetFeeder
|
|
71630
|
+
];
|
|
71631
|
+
/** Everything but a bare `Sensor`: a sensor that takes its reading from another sensor adds nothing. */
|
|
71632
|
+
var POWER_METER_CUSTOMIZE_DEVICE_TYPES = POWER_METER_DEVICE_TYPES.filter((type) => type !== require_err_msg.DeviceType.Sensor);
|
|
71633
|
+
/** One scalar target per reading; each is sourced from a device of its own (D951). */
|
|
71634
|
+
function powerTarget(id, unit) {
|
|
71635
|
+
return {
|
|
71636
|
+
id,
|
|
71637
|
+
cardinality: "scalar",
|
|
71638
|
+
vocabulary: {
|
|
71639
|
+
cap: "power-meter",
|
|
71640
|
+
stateField: id
|
|
71641
|
+
},
|
|
71642
|
+
deviceTypes: POWER_METER_CUSTOMIZE_DEVICE_TYPES,
|
|
71643
|
+
apply: "add",
|
|
71644
|
+
path: id,
|
|
71645
|
+
sources: [{
|
|
71646
|
+
kind: "numeric",
|
|
71647
|
+
requiredUnit: unit,
|
|
71648
|
+
transforms: [{ kind: "identity" }]
|
|
71649
|
+
}],
|
|
71650
|
+
companions: [{
|
|
71651
|
+
kind: "clock",
|
|
71652
|
+
path: "lastFetchedAt",
|
|
71653
|
+
when: "always"
|
|
71654
|
+
}],
|
|
71655
|
+
sourceReport: { status: "assignment-status" },
|
|
71656
|
+
advancedExpression: true
|
|
71657
|
+
};
|
|
71658
|
+
}
|
|
71659
|
+
/** "Power and energy" extension: watts, energy, voltage and current from other devices (D951). */
|
|
71660
|
+
var powerMeterCustomize = {
|
|
71661
|
+
version: 1,
|
|
71662
|
+
targets: [
|
|
71663
|
+
powerTarget("watts", "W"),
|
|
71664
|
+
powerTarget("kwhTotal", "kWh"),
|
|
71665
|
+
powerTarget("volts", "V"),
|
|
71666
|
+
powerTarget("amps", "A")
|
|
71667
|
+
]
|
|
71668
|
+
};
|
|
71606
71669
|
var powerMeterCapability = {
|
|
71607
71670
|
name: "power-meter",
|
|
71608
71671
|
scope: "device",
|
|
71609
71672
|
deviceNative: true,
|
|
71610
71673
|
mode: "singleton",
|
|
71611
|
-
deviceTypes:
|
|
71612
|
-
require_err_msg.DeviceType.Sensor,
|
|
71613
|
-
require_err_msg.DeviceType.Washer,
|
|
71614
|
-
require_err_msg.DeviceType.Dryer,
|
|
71615
|
-
require_err_msg.DeviceType.Dishwasher
|
|
71616
|
-
],
|
|
71674
|
+
deviceTypes: POWER_METER_DEVICE_TYPES,
|
|
71617
71675
|
methods: {},
|
|
71618
71676
|
status: {
|
|
71619
71677
|
schema: PowerMeterStatusSchema,
|
|
@@ -71670,7 +71728,8 @@ var powerMeterCapability = {
|
|
|
71670
71728
|
} },
|
|
71671
71729
|
/** Clock fields: written, but excluded from the compare that decides
|
|
71672
71730
|
* whether persisting is worth a SQLite commit. */
|
|
71673
|
-
volatileStateFields: ["lastFetchedAt"]
|
|
71731
|
+
volatileStateFields: ["lastFetchedAt"],
|
|
71732
|
+
customize: powerMeterCustomize
|
|
71674
71733
|
};
|
|
71675
71734
|
//#endregion
|
|
71676
71735
|
//#region src/capabilities/presence.cap.ts
|
|
@@ -80443,7 +80502,7 @@ function convertUnitTargets(from) {
|
|
|
80443
80502
|
//#region src/generated/customize-catalog.ts
|
|
80444
80503
|
/**
|
|
80445
80504
|
* Customize catalog, projected from every `*.cap.ts` `customize` block.
|
|
80446
|
-
*
|
|
80505
|
+
* 6 caps. Field keys are `runtimeState` paths. No Zod.
|
|
80447
80506
|
*/
|
|
80448
80507
|
var CAP_CUSTOMIZE_CATALOG = {
|
|
80449
80508
|
"battery": {
|
|
@@ -80458,7 +80517,8 @@ var CAP_CUSTOMIZE_CATALOG = {
|
|
|
80458
80517
|
require_err_msg.DeviceType.Switch,
|
|
80459
80518
|
require_err_msg.DeviceType.PetFeeder,
|
|
80460
80519
|
require_err_msg.DeviceType.Container,
|
|
80461
|
-
require_err_msg.DeviceType.Thermostat
|
|
80520
|
+
require_err_msg.DeviceType.Thermostat,
|
|
80521
|
+
require_err_msg.DeviceType.EventEmitter
|
|
80462
80522
|
],
|
|
80463
80523
|
apply: "add",
|
|
80464
80524
|
vocabularyCap: "battery",
|
|
@@ -80708,6 +80768,167 @@ var CAP_CUSTOMIZE_CATALOG = {
|
|
|
80708
80768
|
]
|
|
80709
80769
|
}]
|
|
80710
80770
|
},
|
|
80771
|
+
"power-meter": {
|
|
80772
|
+
version: 1,
|
|
80773
|
+
targets: [
|
|
80774
|
+
{
|
|
80775
|
+
id: "watts",
|
|
80776
|
+
cardinality: "scalar",
|
|
80777
|
+
deviceTypes: [
|
|
80778
|
+
require_err_msg.DeviceType.Switch,
|
|
80779
|
+
require_err_msg.DeviceType.Light,
|
|
80780
|
+
require_err_msg.DeviceType.Fan,
|
|
80781
|
+
require_err_msg.DeviceType.Climate,
|
|
80782
|
+
require_err_msg.DeviceType.Thermostat,
|
|
80783
|
+
require_err_msg.DeviceType.Humidifier,
|
|
80784
|
+
require_err_msg.DeviceType.WaterHeater,
|
|
80785
|
+
require_err_msg.DeviceType.MediaPlayer,
|
|
80786
|
+
require_err_msg.DeviceType.Washer,
|
|
80787
|
+
require_err_msg.DeviceType.Dryer,
|
|
80788
|
+
require_err_msg.DeviceType.Dishwasher,
|
|
80789
|
+
require_err_msg.DeviceType.Vacuum,
|
|
80790
|
+
require_err_msg.DeviceType.LawnMower,
|
|
80791
|
+
require_err_msg.DeviceType.PetFeeder
|
|
80792
|
+
],
|
|
80793
|
+
apply: "add",
|
|
80794
|
+
vocabularyCap: "power-meter",
|
|
80795
|
+
vocabularyStateField: "watts",
|
|
80796
|
+
sources: [{
|
|
80797
|
+
kind: "numeric",
|
|
80798
|
+
requiredUnit: "W",
|
|
80799
|
+
transformKinds: ["identity"],
|
|
80800
|
+
transforms: [{ kind: "identity" }]
|
|
80801
|
+
}],
|
|
80802
|
+
sourceReport: { status: "assignment-status" },
|
|
80803
|
+
advancedExpression: true,
|
|
80804
|
+
path: "watts",
|
|
80805
|
+
valueKind: "number",
|
|
80806
|
+
nullable: false,
|
|
80807
|
+
companions: [{
|
|
80808
|
+
kind: "clock",
|
|
80809
|
+
path: "lastFetchedAt",
|
|
80810
|
+
when: "always"
|
|
80811
|
+
}]
|
|
80812
|
+
},
|
|
80813
|
+
{
|
|
80814
|
+
id: "kwhTotal",
|
|
80815
|
+
cardinality: "scalar",
|
|
80816
|
+
deviceTypes: [
|
|
80817
|
+
require_err_msg.DeviceType.Switch,
|
|
80818
|
+
require_err_msg.DeviceType.Light,
|
|
80819
|
+
require_err_msg.DeviceType.Fan,
|
|
80820
|
+
require_err_msg.DeviceType.Climate,
|
|
80821
|
+
require_err_msg.DeviceType.Thermostat,
|
|
80822
|
+
require_err_msg.DeviceType.Humidifier,
|
|
80823
|
+
require_err_msg.DeviceType.WaterHeater,
|
|
80824
|
+
require_err_msg.DeviceType.MediaPlayer,
|
|
80825
|
+
require_err_msg.DeviceType.Washer,
|
|
80826
|
+
require_err_msg.DeviceType.Dryer,
|
|
80827
|
+
require_err_msg.DeviceType.Dishwasher,
|
|
80828
|
+
require_err_msg.DeviceType.Vacuum,
|
|
80829
|
+
require_err_msg.DeviceType.LawnMower,
|
|
80830
|
+
require_err_msg.DeviceType.PetFeeder
|
|
80831
|
+
],
|
|
80832
|
+
apply: "add",
|
|
80833
|
+
vocabularyCap: "power-meter",
|
|
80834
|
+
vocabularyStateField: "kwhTotal",
|
|
80835
|
+
sources: [{
|
|
80836
|
+
kind: "numeric",
|
|
80837
|
+
requiredUnit: "kWh",
|
|
80838
|
+
transformKinds: ["identity"],
|
|
80839
|
+
transforms: [{ kind: "identity" }]
|
|
80840
|
+
}],
|
|
80841
|
+
sourceReport: { status: "assignment-status" },
|
|
80842
|
+
advancedExpression: true,
|
|
80843
|
+
path: "kwhTotal",
|
|
80844
|
+
valueKind: "number",
|
|
80845
|
+
nullable: false,
|
|
80846
|
+
companions: [{
|
|
80847
|
+
kind: "clock",
|
|
80848
|
+
path: "lastFetchedAt",
|
|
80849
|
+
when: "always"
|
|
80850
|
+
}]
|
|
80851
|
+
},
|
|
80852
|
+
{
|
|
80853
|
+
id: "volts",
|
|
80854
|
+
cardinality: "scalar",
|
|
80855
|
+
deviceTypes: [
|
|
80856
|
+
require_err_msg.DeviceType.Switch,
|
|
80857
|
+
require_err_msg.DeviceType.Light,
|
|
80858
|
+
require_err_msg.DeviceType.Fan,
|
|
80859
|
+
require_err_msg.DeviceType.Climate,
|
|
80860
|
+
require_err_msg.DeviceType.Thermostat,
|
|
80861
|
+
require_err_msg.DeviceType.Humidifier,
|
|
80862
|
+
require_err_msg.DeviceType.WaterHeater,
|
|
80863
|
+
require_err_msg.DeviceType.MediaPlayer,
|
|
80864
|
+
require_err_msg.DeviceType.Washer,
|
|
80865
|
+
require_err_msg.DeviceType.Dryer,
|
|
80866
|
+
require_err_msg.DeviceType.Dishwasher,
|
|
80867
|
+
require_err_msg.DeviceType.Vacuum,
|
|
80868
|
+
require_err_msg.DeviceType.LawnMower,
|
|
80869
|
+
require_err_msg.DeviceType.PetFeeder
|
|
80870
|
+
],
|
|
80871
|
+
apply: "add",
|
|
80872
|
+
vocabularyCap: "power-meter",
|
|
80873
|
+
vocabularyStateField: "volts",
|
|
80874
|
+
sources: [{
|
|
80875
|
+
kind: "numeric",
|
|
80876
|
+
requiredUnit: "V",
|
|
80877
|
+
transformKinds: ["identity"],
|
|
80878
|
+
transforms: [{ kind: "identity" }]
|
|
80879
|
+
}],
|
|
80880
|
+
sourceReport: { status: "assignment-status" },
|
|
80881
|
+
advancedExpression: true,
|
|
80882
|
+
path: "volts",
|
|
80883
|
+
valueKind: "number",
|
|
80884
|
+
nullable: false,
|
|
80885
|
+
companions: [{
|
|
80886
|
+
kind: "clock",
|
|
80887
|
+
path: "lastFetchedAt",
|
|
80888
|
+
when: "always"
|
|
80889
|
+
}]
|
|
80890
|
+
},
|
|
80891
|
+
{
|
|
80892
|
+
id: "amps",
|
|
80893
|
+
cardinality: "scalar",
|
|
80894
|
+
deviceTypes: [
|
|
80895
|
+
require_err_msg.DeviceType.Switch,
|
|
80896
|
+
require_err_msg.DeviceType.Light,
|
|
80897
|
+
require_err_msg.DeviceType.Fan,
|
|
80898
|
+
require_err_msg.DeviceType.Climate,
|
|
80899
|
+
require_err_msg.DeviceType.Thermostat,
|
|
80900
|
+
require_err_msg.DeviceType.Humidifier,
|
|
80901
|
+
require_err_msg.DeviceType.WaterHeater,
|
|
80902
|
+
require_err_msg.DeviceType.MediaPlayer,
|
|
80903
|
+
require_err_msg.DeviceType.Washer,
|
|
80904
|
+
require_err_msg.DeviceType.Dryer,
|
|
80905
|
+
require_err_msg.DeviceType.Dishwasher,
|
|
80906
|
+
require_err_msg.DeviceType.Vacuum,
|
|
80907
|
+
require_err_msg.DeviceType.LawnMower,
|
|
80908
|
+
require_err_msg.DeviceType.PetFeeder
|
|
80909
|
+
],
|
|
80910
|
+
apply: "add",
|
|
80911
|
+
vocabularyCap: "power-meter",
|
|
80912
|
+
vocabularyStateField: "amps",
|
|
80913
|
+
sources: [{
|
|
80914
|
+
kind: "numeric",
|
|
80915
|
+
requiredUnit: "A",
|
|
80916
|
+
transformKinds: ["identity"],
|
|
80917
|
+
transforms: [{ kind: "identity" }]
|
|
80918
|
+
}],
|
|
80919
|
+
sourceReport: { status: "assignment-status" },
|
|
80920
|
+
advancedExpression: true,
|
|
80921
|
+
path: "amps",
|
|
80922
|
+
valueKind: "number",
|
|
80923
|
+
nullable: false,
|
|
80924
|
+
companions: [{
|
|
80925
|
+
kind: "clock",
|
|
80926
|
+
path: "lastFetchedAt",
|
|
80927
|
+
when: "always"
|
|
80928
|
+
}]
|
|
80929
|
+
}
|
|
80930
|
+
]
|
|
80931
|
+
},
|
|
80711
80932
|
"running-state": {
|
|
80712
80933
|
version: 1,
|
|
80713
80934
|
targets: [{
|
|
@@ -80806,7 +81027,9 @@ var CAP_RUNTIME_FIELD_UNITS = {
|
|
|
80806
81027
|
"humidity-sensor": { percent: "%" },
|
|
80807
81028
|
"power-meter": {
|
|
80808
81029
|
watts: "W",
|
|
80809
|
-
kwhTotal: "kWh"
|
|
81030
|
+
kwhTotal: "kWh",
|
|
81031
|
+
volts: "V",
|
|
81032
|
+
amps: "A"
|
|
80810
81033
|
},
|
|
80811
81034
|
"temperature-sensor": { celsius: "°C" }
|
|
80812
81035
|
};
|
|
@@ -80835,7 +81058,7 @@ function isLiteral(source, expr) {
|
|
|
80835
81058
|
}
|
|
80836
81059
|
//#endregion
|
|
80837
81060
|
//#region src/composition/customize/event-compile.ts
|
|
80838
|
-
var catalog$
|
|
81061
|
+
var catalog$5 = CAP_CUSTOMIZE_CATALOG;
|
|
80839
81062
|
function compilePulseOverride(input) {
|
|
80840
81063
|
const target = catalogTarget$4(input.draft.cap, input.draft.targetId);
|
|
80841
81064
|
if (target === null || target.shape !== "pulse") return fail$2("target");
|
|
@@ -80967,7 +81190,7 @@ function sensorEntries(sources, device, modes) {
|
|
|
80967
81190
|
};
|
|
80968
81191
|
}
|
|
80969
81192
|
function catalogTarget$4(cap, targetId) {
|
|
80970
|
-
const entry = catalog$
|
|
81193
|
+
const entry = catalog$5[cap];
|
|
80971
81194
|
if (entry === void 0) return null;
|
|
80972
81195
|
return entry.targets.find((target) => target.id === targetId) ?? null;
|
|
80973
81196
|
}
|
|
@@ -81092,7 +81315,7 @@ function wrap$2(feature) {
|
|
|
81092
81315
|
}
|
|
81093
81316
|
//#endregion
|
|
81094
81317
|
//#region src/composition/customize/scalar-compile.ts
|
|
81095
|
-
var catalog$
|
|
81318
|
+
var catalog$4 = CAP_CUSTOMIZE_CATALOG;
|
|
81096
81319
|
function compileScalarOverride(input) {
|
|
81097
81320
|
const target = catalogTarget$3(input.draft.cap, input.draft.targetId);
|
|
81098
81321
|
if (target === null || target.cardinality !== "scalar" || target.path === void 0) return fail$1("target");
|
|
@@ -81122,7 +81345,7 @@ function fail$1(reason) {
|
|
|
81122
81345
|
};
|
|
81123
81346
|
}
|
|
81124
81347
|
function catalogTarget$3(cap, targetId) {
|
|
81125
|
-
const entry = catalog$
|
|
81348
|
+
const entry = catalog$4[cap];
|
|
81126
81349
|
if (entry === void 0) return null;
|
|
81127
81350
|
return entry.targets.find((target) => target.id === targetId) ?? null;
|
|
81128
81351
|
}
|
|
@@ -81259,6 +81482,83 @@ function refOf$1(draft) {
|
|
|
81259
81482
|
};
|
|
81260
81483
|
}
|
|
81261
81484
|
//#endregion
|
|
81485
|
+
//#region src/composition/customize/scalar-merge.ts
|
|
81486
|
+
var catalog$3 = CAP_CUSTOMIZE_CATALOG;
|
|
81487
|
+
function scalarTargets(cap) {
|
|
81488
|
+
return (catalog$3[cap]?.targets ?? []).filter((target) => target.cardinality === "scalar" && target.path !== void 0);
|
|
81489
|
+
}
|
|
81490
|
+
/** How many scalar targets the cap declares: above one, the cap's feature is shared. */
|
|
81491
|
+
function scalarTargetCount(cap) {
|
|
81492
|
+
return scalarTargets(cap).length;
|
|
81493
|
+
}
|
|
81494
|
+
function valuePath(target) {
|
|
81495
|
+
return target.path ?? target.id;
|
|
81496
|
+
}
|
|
81497
|
+
function ownedPaths(target) {
|
|
81498
|
+
return [valuePath(target), ...(target.companions ?? []).map((companion) => companion.path)];
|
|
81499
|
+
}
|
|
81500
|
+
function find(cap, targetId) {
|
|
81501
|
+
return scalarTargets(cap).find((target) => target.id === targetId) ?? null;
|
|
81502
|
+
}
|
|
81503
|
+
function without(fields, paths) {
|
|
81504
|
+
return Object.fromEntries(Object.entries(fields).filter(([path]) => !paths.has(path)));
|
|
81505
|
+
}
|
|
81506
|
+
/**
|
|
81507
|
+
* The cap's feature with `compiled` (one target's own feature) merged in. A cap
|
|
81508
|
+
* with one scalar target is replaced whole, as before.
|
|
81509
|
+
*/
|
|
81510
|
+
function mergeScalarTarget(current, compiled, cap, targetId) {
|
|
81511
|
+
const target = find(cap, targetId);
|
|
81512
|
+
if (current === null || target === null || scalarTargetCount(cap) < 2) return compiled;
|
|
81513
|
+
const kept = without(current.fields, new Set(ownedPaths(target)));
|
|
81514
|
+
return {
|
|
81515
|
+
...current,
|
|
81516
|
+
...compiled,
|
|
81517
|
+
fields: {
|
|
81518
|
+
...kept,
|
|
81519
|
+
...compiled.fields
|
|
81520
|
+
}
|
|
81521
|
+
};
|
|
81522
|
+
}
|
|
81523
|
+
/** The cap's feature without `targetId`'s paths; null when no target value is left. */
|
|
81524
|
+
function removeScalarTarget(current, cap, targetId) {
|
|
81525
|
+
if (current === null) return null;
|
|
81526
|
+
const target = find(cap, targetId);
|
|
81527
|
+
if (target === null || scalarTargetCount(cap) < 2) return null;
|
|
81528
|
+
const stillAssigned = scalarTargets(cap).filter((row) => row.id !== targetId).filter((row) => current.fields[valuePath(row)] !== void 0);
|
|
81529
|
+
if (stillAssigned.length === 0) return null;
|
|
81530
|
+
const needed = new Set(stillAssigned.flatMap((row) => ownedPaths(row)));
|
|
81531
|
+
const drop = new Set(ownedPaths(target).filter((path) => !needed.has(path)));
|
|
81532
|
+
return {
|
|
81533
|
+
...current,
|
|
81534
|
+
fields: without(current.fields, drop)
|
|
81535
|
+
};
|
|
81536
|
+
}
|
|
81537
|
+
/**
|
|
81538
|
+
* The part of a stored feature one target owns — what a decode compares with
|
|
81539
|
+
* its recompiled feature. A cap with one target compares the whole feature.
|
|
81540
|
+
*/
|
|
81541
|
+
function ownedSlice(stored, cap, targetId) {
|
|
81542
|
+
const target = find(cap, targetId);
|
|
81543
|
+
if (target === null || scalarTargetCount(cap) < 2) return stored;
|
|
81544
|
+
const owned = new Set(ownedPaths(target));
|
|
81545
|
+
return {
|
|
81546
|
+
...stored,
|
|
81547
|
+
fields: Object.fromEntries(Object.entries(stored.fields).filter(([path]) => owned.has(path)))
|
|
81548
|
+
};
|
|
81549
|
+
}
|
|
81550
|
+
/**
|
|
81551
|
+
* The stored feature as ONE target sees it: null when the cap's feature holds
|
|
81552
|
+
* only its neighbours' readings (no assignment of this target), else the whole
|
|
81553
|
+
* feature. A cap with one target sees what is stored.
|
|
81554
|
+
*/
|
|
81555
|
+
function targetFeature(stored, cap, targetId) {
|
|
81556
|
+
if (stored === null) return null;
|
|
81557
|
+
const target = find(cap, targetId);
|
|
81558
|
+
if (target === null || scalarTargetCount(cap) < 2) return stored;
|
|
81559
|
+
return stored.fields[valuePath(target)] === void 0 ? null : stored;
|
|
81560
|
+
}
|
|
81561
|
+
//#endregion
|
|
81262
81562
|
//#region src/composition/customize/scalar-decode.ts
|
|
81263
81563
|
var catalog$2 = CAP_CUSTOMIZE_CATALOG;
|
|
81264
81564
|
function decodeScalarOverride(input) {
|
|
@@ -81369,7 +81669,7 @@ function reproduces$1(decoded, device, stored) {
|
|
|
81369
81669
|
sourceUnit: decoded.sourceUnit
|
|
81370
81670
|
});
|
|
81371
81671
|
if (!compiled.ok) return false;
|
|
81372
|
-
return sameFeature$1(compiled.value, stored);
|
|
81672
|
+
return sameFeature$1(compiled.value, ownedSlice(stored, decoded.draft.cap, decoded.draft.targetId));
|
|
81373
81673
|
}
|
|
81374
81674
|
function sameFeature$1(compiled, stored) {
|
|
81375
81675
|
return sameStored(wrap$1(withoutEnabled(compiled)), wrap$1(withoutEnabled(stored)));
|
|
@@ -119179,6 +119479,7 @@ exports.memoizePinnedFfmpeg = memoizePinnedFfmpeg;
|
|
|
119179
119479
|
exports.mergeClipLabels = mergeClipLabels;
|
|
119180
119480
|
exports.mergeKeyedArrayItem = mergeKeyedArrayItem;
|
|
119181
119481
|
exports.mergeOverrides = mergeOverrides;
|
|
119482
|
+
exports.mergeScalarTarget = mergeScalarTarget;
|
|
119182
119483
|
exports.mergeSecretStatePaths = require_sleep.mergeSecretStatePaths;
|
|
119183
119484
|
exports.mergeSettingsBags = mergeSettingsBags;
|
|
119184
119485
|
exports.mergeSourceInfo = mergeSourceInfo;
|
|
@@ -119245,6 +119546,7 @@ exports.optionalMethod = require_sleep.optionalMethod;
|
|
|
119245
119546
|
exports.osdCapability = osdCapability;
|
|
119246
119547
|
exports.osdManagerCapability = osdManagerCapability;
|
|
119247
119548
|
exports.overlayClusterStepSettings = overlayClusterStepSettings;
|
|
119549
|
+
exports.ownedSlice = ownedSlice;
|
|
119248
119550
|
exports.packagePickerItems = packagePickerItems;
|
|
119249
119551
|
exports.paintHex = paintHex;
|
|
119250
119552
|
exports.paletteEntryLabel = paletteEntryLabel;
|
|
@@ -119375,6 +119677,7 @@ exports.reducePoints = reducePoints;
|
|
|
119375
119677
|
exports.reducerForActive = reducerForActive;
|
|
119376
119678
|
exports.registerKnownSecret = require_sleep.registerKnownSecret;
|
|
119377
119679
|
exports.remapCropDetections = remapCropDetections;
|
|
119680
|
+
exports.removeScalarTarget = removeScalarTarget;
|
|
119378
119681
|
exports.renameAlarmProfile = renameAlarmProfile;
|
|
119379
119682
|
exports.renderVocabPhrase = renderVocabPhrase;
|
|
119380
119683
|
exports.replacedFieldKeys = replacedFieldKeys;
|
|
@@ -119463,6 +119766,7 @@ exports.runtimeStatePolicyFor = runtimeStatePolicyFor;
|
|
|
119463
119766
|
exports.sameDoFamily = sameDoFamily;
|
|
119464
119767
|
exports.sameHelperBody = sameHelperBody;
|
|
119465
119768
|
exports.sameRead = sameRead;
|
|
119769
|
+
exports.scalarTargetCount = scalarTargetCount;
|
|
119466
119770
|
exports.sceneMonitorCapability = sceneMonitorCapability;
|
|
119467
119771
|
exports.scheduleForSendTimes = scheduleForSendTimes;
|
|
119468
119772
|
exports.schemaDeclaresAnyField = require_sleep.schemaDeclaresAnyField;
|
|
@@ -119578,6 +119882,7 @@ exports.systemEventSummarySplitOf = systemEventSummarySplitOf;
|
|
|
119578
119882
|
exports.systemFamilyOfKind = systemFamilyOfKind;
|
|
119579
119883
|
exports.systemRuleKindOf = systemRuleKindOf;
|
|
119580
119884
|
exports.tamperCapability = tamperCapability;
|
|
119885
|
+
exports.targetFeature = targetFeature;
|
|
119581
119886
|
exports.taskLogEntrySchema = taskLogEntrySchema;
|
|
119582
119887
|
exports.taskPhaseSchema = taskPhaseSchema;
|
|
119583
119888
|
exports.taskTargetSchema = taskTargetSchema;
|