@camstack/addon-model-studio 1.1.181 → 1.1.182
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/{MotionZonesSettings-D2-zQjQZ.mjs → MotionZonesSettings-DB-47cOo.mjs} +2 -2
- package/dist/{PrivacyMaskSettings-DvWwawcZ.mjs → PrivacyMaskSettings-BIzb0D_0.mjs} +4 -4
- package/dist/{SceneMonitorEditor-Duajxv_A.mjs → SceneMonitorEditor-IaL6eXRr.mjs} +3 -3
- package/dist/_stub.js +13 -13
- package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-BBY6_TNd.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-CsOTOHLQ.mjs} +3 -3
- package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BmwlvTun.mjs +26 -0
- package/dist/{hostInit-D9K6OWiX.mjs → hostInit-Bl24UlY4.mjs} +2 -2
- package/dist/model-studio.addon.js +137 -48
- package/dist/model-studio.addon.mjs +137 -48
- package/dist/{player-overlays-BYYRZ16B.mjs → player-overlays-CISEjNtj.mjs} +1 -1
- package/dist/remoteEntry.js +1 -1
- package/dist/{responsive-D88q7dKI.mjs → responsive-CUot36ya.mjs} +1 -1
- package/dist/{scene-monitor-copy-BBWU6bfw.mjs → scene-monitor-copy-J64_2zC1.mjs} +1 -1
- package/dist/{square-_I0mPZ7d.mjs → square-CDSkPKBQ.mjs} +1 -1
- package/dist/{trash-2-D9kzsUUY.mjs → trash-2-C1NZwuGu.mjs} +1 -1
- package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-DHLDVQJr.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-DcHcLEYl.mjs} +1 -1
- package/package.json +1 -1
- package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-JwlaJnAm.mjs +0 -26
|
@@ -5941,7 +5941,7 @@ var ZodIssueCode = {
|
|
|
5941
5941
|
var ZodFirstPartyTypeKind;
|
|
5942
5942
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5943
5943
|
//#endregion
|
|
5944
|
-
//#region ../types/dist/sleep-
|
|
5944
|
+
//#region ../types/dist/sleep-DlrgY4Qb.mjs
|
|
5945
5945
|
/**
|
|
5946
5946
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5947
5947
|
* window to float samples (D455).
|
|
@@ -7556,6 +7556,10 @@ function toNodeId(idOrRunnerId) {
|
|
|
7556
7556
|
const head = idOrRunnerId.split("/")[0];
|
|
7557
7557
|
return head === void 0 || head.length === 0 ? idOrRunnerId : head;
|
|
7558
7558
|
}
|
|
7559
|
+
object({
|
|
7560
|
+
field: string().min(1),
|
|
7561
|
+
on: literal("advance")
|
|
7562
|
+
});
|
|
7559
7563
|
/**
|
|
7560
7564
|
* Output schema shared by the contribution + live methods.
|
|
7561
7565
|
*
|
|
@@ -8047,7 +8051,43 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
|
|
|
8047
8051
|
return DeviceRole;
|
|
8048
8052
|
}({});
|
|
8049
8053
|
//#endregion
|
|
8050
|
-
//#region ../types/dist/composition-
|
|
8054
|
+
//#region ../types/dist/composition-BK-GTFYb.mjs
|
|
8055
|
+
/**
|
|
8056
|
+
* LA tabella "quale booleano di questo tipo di device conta come ALTO", e il
|
|
8057
|
+
* valutatore puro del suo FRONTE.
|
|
8058
|
+
*
|
|
8059
|
+
* Viveva dentro il builtin virtual-doorbell
|
|
8060
|
+
* (`@camstack/system` — `builtins/doorbell/trigger-engine.ts`) e i suoi
|
|
8061
|
+
* predicati erano privati al modulo. Il recorder ne ha bisogno per il trigger
|
|
8062
|
+
* `RecordingTriggers.sensorDeviceIds`: copiarla avrebbe creato la SECONDA
|
|
8063
|
+
* tabella, che diverge alla prima cap aggiunta e il cui sintomo — "il sensore
|
|
8064
|
+
* fa suonare il campanello ma non registra" — è esattamente D62. Quindi si
|
|
8065
|
+
* SPOSTA qui e il doorbell la ri-esporta.
|
|
8066
|
+
*
|
|
8067
|
+
* ⚠ NON è `DEVICE_STATE_READERS` (`catalogs/device-state-vocabulary.ts`), e le
|
|
8068
|
+
* due non vanno unificate: quella risponde a "qual è la PAROLA di stato per una
|
|
8069
|
+
* regola" (e include `presence`, `cover`, `alarm-panel`), questa a "qual è il
|
|
8070
|
+
* booleano il cui FRONTE conta". Vocabolari deliberatamente diversi.
|
|
8071
|
+
*/
|
|
8072
|
+
/**
|
|
8073
|
+
* Known binary / switch source caps → the boolean slice field whose
|
|
8074
|
+
* false→true rise counts as ACTIVE. Every entry is "fire on active".
|
|
8075
|
+
* Sensors whose "active" reading is not a plain boolean (presence's string
|
|
8076
|
+
* state, connectivity's connected flag) are deliberately excluded — a
|
|
8077
|
+
* reconnect is not a doorbell press, and it is not a recording either.
|
|
8078
|
+
*/
|
|
8079
|
+
var SOURCE_CAP_ACTIVE_FIELD = {
|
|
8080
|
+
contact: "entryOpen",
|
|
8081
|
+
binary: "on",
|
|
8082
|
+
switch: "on",
|
|
8083
|
+
motion: "detected",
|
|
8084
|
+
flood: "flooded",
|
|
8085
|
+
gas: "detected",
|
|
8086
|
+
smoke: "detected",
|
|
8087
|
+
"carbon-monoxide": "detected",
|
|
8088
|
+
vibration: "detected",
|
|
8089
|
+
tamper: "tampered"
|
|
8090
|
+
};
|
|
8051
8091
|
/**
|
|
8052
8092
|
* Error types for the safe expression engine. Two distinct classes so callers
|
|
8053
8093
|
* can tell a compile-time (grammar) failure from a runtime (evaluation)
|
|
@@ -8245,6 +8285,20 @@ var table = {
|
|
|
8245
8285
|
const present = args.flatMap((a, i) => a === null ? [] : [asFiniteNumber(a, "latest", i)]);
|
|
8246
8286
|
return present.length === 0 ? null : finiteResult(Math.max(...present), "latest");
|
|
8247
8287
|
}
|
|
8288
|
+
},
|
|
8289
|
+
rose: {
|
|
8290
|
+
minArgs: 2,
|
|
8291
|
+
maxArgs: 3,
|
|
8292
|
+
apply: () => {
|
|
8293
|
+
throw new ExpressionEvalError("rose: stateful evaluation context is required");
|
|
8294
|
+
}
|
|
8295
|
+
},
|
|
8296
|
+
count: {
|
|
8297
|
+
minArgs: 1,
|
|
8298
|
+
maxArgs: 1,
|
|
8299
|
+
apply: () => {
|
|
8300
|
+
throw new ExpressionEvalError("count: stateful evaluation context is required");
|
|
8301
|
+
}
|
|
8248
8302
|
}
|
|
8249
8303
|
};
|
|
8250
8304
|
Object.freeze(Object.assign(Object.create(null), table));
|
|
@@ -8759,6 +8813,7 @@ var CompositionItemEntrySchema = object({
|
|
|
8759
8813
|
var CompositionFeatureSchema = discriminatedUnion("kind", [object({
|
|
8760
8814
|
kind: literal("fields"),
|
|
8761
8815
|
cap: string().min(1),
|
|
8816
|
+
enabled: boolean().optional(),
|
|
8762
8817
|
fields: record(string().min(1), CompositionFieldSourceSchema).refine((fields) => Object.keys(fields).length <= 32, { message: `at most 32 fields per capability` }),
|
|
8763
8818
|
/**
|
|
8764
8819
|
* Items of the cap's item array, keyed by item key (D663). Naming `items`
|
|
@@ -8770,6 +8825,7 @@ var CompositionFeatureSchema = discriminatedUnion("kind", [object({
|
|
|
8770
8825
|
}), object({
|
|
8771
8826
|
kind: literal("passthrough"),
|
|
8772
8827
|
cap: string().min(1),
|
|
8828
|
+
enabled: boolean().optional(),
|
|
8773
8829
|
source: CompositionSourceRefSchema
|
|
8774
8830
|
})]);
|
|
8775
8831
|
var CompositionSchema = object({
|
|
@@ -13421,6 +13477,15 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
|
|
|
13421
13477
|
}),
|
|
13422
13478
|
lastChangedAt: number()
|
|
13423
13479
|
});
|
|
13480
|
+
EventCategory.DoorbellOnPressed;
|
|
13481
|
+
var CompositionEventPlanSchema = object({
|
|
13482
|
+
featureIndex: number().int().nonnegative(),
|
|
13483
|
+
cap: string(),
|
|
13484
|
+
eventName: string(),
|
|
13485
|
+
category: _enum(EventCategory),
|
|
13486
|
+
stateField: string(),
|
|
13487
|
+
fieldKey: string()
|
|
13488
|
+
});
|
|
13424
13489
|
/** One refusal, named (D391). `path` points into the composition, e.g. `features[0].fields.celsius`. */
|
|
13425
13490
|
var CompositionProblemSchema = object({
|
|
13426
13491
|
code: _enum([
|
|
@@ -13470,12 +13535,14 @@ var CompositionUnavailableModeSchema = _enum([
|
|
|
13470
13535
|
]);
|
|
13471
13536
|
/**
|
|
13472
13537
|
* `derived` reads a source · `clock` reads only `now`, recomputed when a sibling
|
|
13473
|
-
* field of its cap changes value · `constant` reads nothing, computed once
|
|
13538
|
+
* field of its cap changes value · `constant` reads nothing, computed once ·
|
|
13539
|
+
* `accumulator` advances from the target's seed/current output.
|
|
13474
13540
|
*/
|
|
13475
13541
|
var CompositionFieldRoleSchema = _enum([
|
|
13476
13542
|
"derived",
|
|
13477
13543
|
"clock",
|
|
13478
|
-
"constant"
|
|
13544
|
+
"constant",
|
|
13545
|
+
"accumulator"
|
|
13479
13546
|
]);
|
|
13480
13547
|
/** The item a planned field belongs to; its `path` is then the dotted path INSIDE the item. */
|
|
13481
13548
|
var CompositionFieldItemSchema = object({
|
|
@@ -13511,6 +13578,7 @@ var CompositionFeatureModeSchema = _enum([
|
|
|
13511
13578
|
"replace"
|
|
13512
13579
|
]);
|
|
13513
13580
|
var CompositionFeaturePlanSchema = object({
|
|
13581
|
+
/** Index in the stored feature array; disabled features are omitted rather than re-indexed. */
|
|
13514
13582
|
featureIndex: number().int().nonnegative(),
|
|
13515
13583
|
cap: string(),
|
|
13516
13584
|
mode: CompositionFeatureModeSchema
|
|
@@ -13519,7 +13587,8 @@ var CompositionValidationSchema = object({
|
|
|
13519
13587
|
ok: boolean(),
|
|
13520
13588
|
problems: array(CompositionProblemSchema),
|
|
13521
13589
|
fields: array(CompositionFieldPlanSchema),
|
|
13522
|
-
features: array(CompositionFeaturePlanSchema)
|
|
13590
|
+
features: array(CompositionFeaturePlanSchema),
|
|
13591
|
+
events: array(CompositionEventPlanSchema)
|
|
13523
13592
|
});
|
|
13524
13593
|
/**
|
|
13525
13594
|
* Mirrors `CoreBlockStatus`, pinned by `core-blocks-source.spec.ts`. `degraded`:
|
|
@@ -15130,6 +15199,34 @@ var DeviceBindingsForDeviceSchema = object({
|
|
|
15130
15199
|
nativeAddonId: string()
|
|
15131
15200
|
}))
|
|
15132
15201
|
});
|
|
15202
|
+
/**
|
|
15203
|
+
* The STORED wrapper activation for one `(device, capability)` pair — the row
|
|
15204
|
+
* `setWrapperActive` writes, read back three-way (D675):
|
|
15205
|
+
*
|
|
15206
|
+
* - `value` — the store answered and holds an activation: the bound wrapper's
|
|
15207
|
+
* addon id, or `null`, the operator's explicit "off" marker (D62);
|
|
15208
|
+
* - `missing` — the store answered, its activation map exists, and it holds
|
|
15209
|
+
* nothing for this pair: the operator never activated or deactivated a
|
|
15210
|
+
* wrapper here;
|
|
15211
|
+
* - `failed` — the store could not be read, holds no activation map at all
|
|
15212
|
+
* (an empty or unready snapshot, D44), or holds something that is not an
|
|
15213
|
+
* activation. It carries NO information: a consumer must never read it as
|
|
15214
|
+
* `missing` (D315, D393).
|
|
15215
|
+
*
|
|
15216
|
+
* This is the persisted INPUT, not the derived `getBindings` view — no registry
|
|
15217
|
+
* resolution, no `defaultActive` auto-binding, no cluster native-cap folding.
|
|
15218
|
+
*/
|
|
15219
|
+
var WrapperActivationReadSchema = discriminatedUnion("kind", [
|
|
15220
|
+
object({
|
|
15221
|
+
kind: literal("value"),
|
|
15222
|
+
wrapperAddonId: string().nullable()
|
|
15223
|
+
}),
|
|
15224
|
+
object({ kind: literal("missing") }),
|
|
15225
|
+
object({
|
|
15226
|
+
kind: literal("failed"),
|
|
15227
|
+
error: string()
|
|
15228
|
+
})
|
|
15229
|
+
]);
|
|
15133
15230
|
var SavedDeviceRowSchema = object({
|
|
15134
15231
|
/** Numeric id reserved at allocateDeviceId time. */
|
|
15135
15232
|
id: number(),
|
|
@@ -15480,7 +15577,10 @@ method(object({
|
|
|
15480
15577
|
}), _void(), {
|
|
15481
15578
|
kind: "mutation",
|
|
15482
15579
|
auth: "admin"
|
|
15483
|
-
}), method(object({
|
|
15580
|
+
}), method(object({
|
|
15581
|
+
deviceId: number(),
|
|
15582
|
+
capName: string().min(1)
|
|
15583
|
+
}), WrapperActivationReadSchema), method(object({ capName: string() }), array(string())), method(object({ deviceType: string() }), array(object({
|
|
15484
15584
|
capName: string(),
|
|
15485
15585
|
wrappers: array(string())
|
|
15486
15586
|
}))), method(object({ deviceId: number() }), SettingsSchemaWithValuesSchema.nullable()), method(object({ deviceId: number() }), SettingsSchemaWithValuesSchema.nullable()), method(object({ deviceId: number() }), object({
|
|
@@ -26996,42 +27096,6 @@ DeviceType.Camera, method(object({
|
|
|
26996
27096
|
kind: "query",
|
|
26997
27097
|
auth: "protected"
|
|
26998
27098
|
});
|
|
26999
|
-
/**
|
|
27000
|
-
* LA tabella "quale booleano di questo tipo di device conta come ALTO", e il
|
|
27001
|
-
* valutatore puro del suo FRONTE.
|
|
27002
|
-
*
|
|
27003
|
-
* Viveva dentro il builtin virtual-doorbell
|
|
27004
|
-
* (`@camstack/system` — `builtins/doorbell/trigger-engine.ts`) e i suoi
|
|
27005
|
-
* predicati erano privati al modulo. Il recorder ne ha bisogno per il trigger
|
|
27006
|
-
* `RecordingTriggers.sensorDeviceIds`: copiarla avrebbe creato la SECONDA
|
|
27007
|
-
* tabella, che diverge alla prima cap aggiunta e il cui sintomo — "il sensore
|
|
27008
|
-
* fa suonare il campanello ma non registra" — è esattamente D62. Quindi si
|
|
27009
|
-
* SPOSTA qui e il doorbell la ri-esporta.
|
|
27010
|
-
*
|
|
27011
|
-
* ⚠ NON è `DEVICE_STATE_READERS` (`catalogs/device-state-vocabulary.ts`), e le
|
|
27012
|
-
* due non vanno unificate: quella risponde a "qual è la PAROLA di stato per una
|
|
27013
|
-
* regola" (e include `presence`, `cover`, `alarm-panel`), questa a "qual è il
|
|
27014
|
-
* booleano il cui FRONTE conta". Vocabolari deliberatamente diversi.
|
|
27015
|
-
*/
|
|
27016
|
-
/**
|
|
27017
|
-
* Known binary / switch source caps → the boolean slice field whose
|
|
27018
|
-
* false→true rise counts as ACTIVE. Every entry is "fire on active".
|
|
27019
|
-
* Sensors whose "active" reading is not a plain boolean (presence's string
|
|
27020
|
-
* state, connectivity's connected flag) are deliberately excluded — a
|
|
27021
|
-
* reconnect is not a doorbell press, and it is not a recording either.
|
|
27022
|
-
*/
|
|
27023
|
-
var SOURCE_CAP_ACTIVE_FIELD = {
|
|
27024
|
-
contact: "entryOpen",
|
|
27025
|
-
binary: "on",
|
|
27026
|
-
switch: "on",
|
|
27027
|
-
motion: "detected",
|
|
27028
|
-
flood: "flooded",
|
|
27029
|
-
gas: "detected",
|
|
27030
|
-
smoke: "detected",
|
|
27031
|
-
"carbon-monoxide": "detected",
|
|
27032
|
-
vibration: "detected",
|
|
27033
|
-
tamper: "tampered"
|
|
27034
|
-
};
|
|
27035
27099
|
object({
|
|
27036
27100
|
/** Ms epoch of the last press. null = never observed since this provider started. */
|
|
27037
27101
|
lastPressedAt: number().nullable(),
|
|
@@ -33003,12 +33067,21 @@ var RecordingStorageUsageSchema = object({
|
|
|
33003
33067
|
*/
|
|
33004
33068
|
devicesRead: _enum(["archive", "unavailable"]).optional(),
|
|
33005
33069
|
/**
|
|
33070
|
+
* Is the `archive` answer WHOLE (D674): the hour ledger loaded without
|
|
33071
|
+
* hitting its row cap, and at least one location resolved? Only then may a
|
|
33072
|
+
* camera ABSENT from `devices[]` be read as "no footage" — and only then is a
|
|
33073
|
+
* row's `oldestMs` the archive's oldest rather than the oldest of a fraction.
|
|
33074
|
+
* OPTIONAL: a recorder predating D674 omits it, and a consumer must read the
|
|
33075
|
+
* absence as `false`. A retention floor is a delete; it never guesses.
|
|
33076
|
+
*/
|
|
33077
|
+
complete: boolean().optional(),
|
|
33078
|
+
/**
|
|
33006
33079
|
* Per-physical-volume capacity. OPTIONAL, and consumers must render the rest
|
|
33007
|
-
* of the payload without it:
|
|
33008
|
-
*
|
|
33009
|
-
*
|
|
33010
|
-
*
|
|
33011
|
-
*
|
|
33080
|
+
* of the payload without it: a recorder that could not build it omits it. A
|
|
33081
|
+
* UI that dereferences it unconditionally crashes the whole Storage page over
|
|
33082
|
+
* a missing disk bar. (The hub's cap routers pass output through unvalidated
|
|
33083
|
+
* since 2026-07-11 — `cap-router-builder.ts` — so a newer recorder's fields
|
|
33084
|
+
* are not stripped by an older hub.)
|
|
33012
33085
|
*/
|
|
33013
33086
|
locations: array(RecordingLocationUsageSchema).optional()
|
|
33014
33087
|
});
|
|
@@ -35779,7 +35852,12 @@ Object.freeze({
|
|
|
35779
35852
|
number: {
|
|
35780
35853
|
kind: "fixed",
|
|
35781
35854
|
result: ["number", "null"]
|
|
35782
|
-
}
|
|
35855
|
+
},
|
|
35856
|
+
rose: {
|
|
35857
|
+
kind: "fixed",
|
|
35858
|
+
result: ["number", "null"]
|
|
35859
|
+
},
|
|
35860
|
+
count: NUMBER
|
|
35783
35861
|
});
|
|
35784
35862
|
`${COMPOSED_DEVICE_STABLE_ID_PREFIX}`;
|
|
35785
35863
|
/**
|
|
@@ -38894,6 +38972,12 @@ Object.freeze({
|
|
|
38894
38972
|
addonId: null,
|
|
38895
38973
|
access: "view"
|
|
38896
38974
|
},
|
|
38975
|
+
"deviceManager.getWrapperActivation": {
|
|
38976
|
+
capName: "device-manager",
|
|
38977
|
+
capScope: "system",
|
|
38978
|
+
addonId: null,
|
|
38979
|
+
access: "view"
|
|
38980
|
+
},
|
|
38897
38981
|
"deviceManager.listAll": {
|
|
38898
38982
|
capName: "device-manager",
|
|
38899
38983
|
capScope: "system",
|
|
@@ -44703,6 +44787,11 @@ Object.freeze({
|
|
|
44703
44787
|
form: "single",
|
|
44704
44788
|
optional: false
|
|
44705
44789
|
}],
|
|
44790
|
+
"deviceManager.getWrapperActivation": [{
|
|
44791
|
+
name: "deviceId",
|
|
44792
|
+
form: "single",
|
|
44793
|
+
optional: false
|
|
44794
|
+
}],
|
|
44706
44795
|
"deviceManager.listAll": [{
|
|
44707
44796
|
name: "deviceIds",
|
|
44708
44797
|
form: "array",
|
|
@@ -5920,7 +5920,7 @@ var ZodIssueCode = {
|
|
|
5920
5920
|
var ZodFirstPartyTypeKind;
|
|
5921
5921
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5922
5922
|
//#endregion
|
|
5923
|
-
//#region ../types/dist/sleep-
|
|
5923
|
+
//#region ../types/dist/sleep-DlrgY4Qb.mjs
|
|
5924
5924
|
/**
|
|
5925
5925
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5926
5926
|
* window to float samples (D455).
|
|
@@ -7535,6 +7535,10 @@ function toNodeId(idOrRunnerId) {
|
|
|
7535
7535
|
const head = idOrRunnerId.split("/")[0];
|
|
7536
7536
|
return head === void 0 || head.length === 0 ? idOrRunnerId : head;
|
|
7537
7537
|
}
|
|
7538
|
+
object({
|
|
7539
|
+
field: string().min(1),
|
|
7540
|
+
on: literal("advance")
|
|
7541
|
+
});
|
|
7538
7542
|
/**
|
|
7539
7543
|
* Output schema shared by the contribution + live methods.
|
|
7540
7544
|
*
|
|
@@ -8026,7 +8030,43 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
|
|
|
8026
8030
|
return DeviceRole;
|
|
8027
8031
|
}({});
|
|
8028
8032
|
//#endregion
|
|
8029
|
-
//#region ../types/dist/composition-
|
|
8033
|
+
//#region ../types/dist/composition-BK-GTFYb.mjs
|
|
8034
|
+
/**
|
|
8035
|
+
* LA tabella "quale booleano di questo tipo di device conta come ALTO", e il
|
|
8036
|
+
* valutatore puro del suo FRONTE.
|
|
8037
|
+
*
|
|
8038
|
+
* Viveva dentro il builtin virtual-doorbell
|
|
8039
|
+
* (`@camstack/system` — `builtins/doorbell/trigger-engine.ts`) e i suoi
|
|
8040
|
+
* predicati erano privati al modulo. Il recorder ne ha bisogno per il trigger
|
|
8041
|
+
* `RecordingTriggers.sensorDeviceIds`: copiarla avrebbe creato la SECONDA
|
|
8042
|
+
* tabella, che diverge alla prima cap aggiunta e il cui sintomo — "il sensore
|
|
8043
|
+
* fa suonare il campanello ma non registra" — è esattamente D62. Quindi si
|
|
8044
|
+
* SPOSTA qui e il doorbell la ri-esporta.
|
|
8045
|
+
*
|
|
8046
|
+
* ⚠ NON è `DEVICE_STATE_READERS` (`catalogs/device-state-vocabulary.ts`), e le
|
|
8047
|
+
* due non vanno unificate: quella risponde a "qual è la PAROLA di stato per una
|
|
8048
|
+
* regola" (e include `presence`, `cover`, `alarm-panel`), questa a "qual è il
|
|
8049
|
+
* booleano il cui FRONTE conta". Vocabolari deliberatamente diversi.
|
|
8050
|
+
*/
|
|
8051
|
+
/**
|
|
8052
|
+
* Known binary / switch source caps → the boolean slice field whose
|
|
8053
|
+
* false→true rise counts as ACTIVE. Every entry is "fire on active".
|
|
8054
|
+
* Sensors whose "active" reading is not a plain boolean (presence's string
|
|
8055
|
+
* state, connectivity's connected flag) are deliberately excluded — a
|
|
8056
|
+
* reconnect is not a doorbell press, and it is not a recording either.
|
|
8057
|
+
*/
|
|
8058
|
+
var SOURCE_CAP_ACTIVE_FIELD = {
|
|
8059
|
+
contact: "entryOpen",
|
|
8060
|
+
binary: "on",
|
|
8061
|
+
switch: "on",
|
|
8062
|
+
motion: "detected",
|
|
8063
|
+
flood: "flooded",
|
|
8064
|
+
gas: "detected",
|
|
8065
|
+
smoke: "detected",
|
|
8066
|
+
"carbon-monoxide": "detected",
|
|
8067
|
+
vibration: "detected",
|
|
8068
|
+
tamper: "tampered"
|
|
8069
|
+
};
|
|
8030
8070
|
/**
|
|
8031
8071
|
* Error types for the safe expression engine. Two distinct classes so callers
|
|
8032
8072
|
* can tell a compile-time (grammar) failure from a runtime (evaluation)
|
|
@@ -8224,6 +8264,20 @@ var table = {
|
|
|
8224
8264
|
const present = args.flatMap((a, i) => a === null ? [] : [asFiniteNumber(a, "latest", i)]);
|
|
8225
8265
|
return present.length === 0 ? null : finiteResult(Math.max(...present), "latest");
|
|
8226
8266
|
}
|
|
8267
|
+
},
|
|
8268
|
+
rose: {
|
|
8269
|
+
minArgs: 2,
|
|
8270
|
+
maxArgs: 3,
|
|
8271
|
+
apply: () => {
|
|
8272
|
+
throw new ExpressionEvalError("rose: stateful evaluation context is required");
|
|
8273
|
+
}
|
|
8274
|
+
},
|
|
8275
|
+
count: {
|
|
8276
|
+
minArgs: 1,
|
|
8277
|
+
maxArgs: 1,
|
|
8278
|
+
apply: () => {
|
|
8279
|
+
throw new ExpressionEvalError("count: stateful evaluation context is required");
|
|
8280
|
+
}
|
|
8227
8281
|
}
|
|
8228
8282
|
};
|
|
8229
8283
|
Object.freeze(Object.assign(Object.create(null), table));
|
|
@@ -8738,6 +8792,7 @@ var CompositionItemEntrySchema = object({
|
|
|
8738
8792
|
var CompositionFeatureSchema = discriminatedUnion("kind", [object({
|
|
8739
8793
|
kind: literal("fields"),
|
|
8740
8794
|
cap: string().min(1),
|
|
8795
|
+
enabled: boolean().optional(),
|
|
8741
8796
|
fields: record(string().min(1), CompositionFieldSourceSchema).refine((fields) => Object.keys(fields).length <= 32, { message: `at most 32 fields per capability` }),
|
|
8742
8797
|
/**
|
|
8743
8798
|
* Items of the cap's item array, keyed by item key (D663). Naming `items`
|
|
@@ -8749,6 +8804,7 @@ var CompositionFeatureSchema = discriminatedUnion("kind", [object({
|
|
|
8749
8804
|
}), object({
|
|
8750
8805
|
kind: literal("passthrough"),
|
|
8751
8806
|
cap: string().min(1),
|
|
8807
|
+
enabled: boolean().optional(),
|
|
8752
8808
|
source: CompositionSourceRefSchema
|
|
8753
8809
|
})]);
|
|
8754
8810
|
var CompositionSchema = object({
|
|
@@ -13400,6 +13456,15 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
|
|
|
13400
13456
|
}),
|
|
13401
13457
|
lastChangedAt: number()
|
|
13402
13458
|
});
|
|
13459
|
+
EventCategory.DoorbellOnPressed;
|
|
13460
|
+
var CompositionEventPlanSchema = object({
|
|
13461
|
+
featureIndex: number().int().nonnegative(),
|
|
13462
|
+
cap: string(),
|
|
13463
|
+
eventName: string(),
|
|
13464
|
+
category: _enum(EventCategory),
|
|
13465
|
+
stateField: string(),
|
|
13466
|
+
fieldKey: string()
|
|
13467
|
+
});
|
|
13403
13468
|
/** One refusal, named (D391). `path` points into the composition, e.g. `features[0].fields.celsius`. */
|
|
13404
13469
|
var CompositionProblemSchema = object({
|
|
13405
13470
|
code: _enum([
|
|
@@ -13449,12 +13514,14 @@ var CompositionUnavailableModeSchema = _enum([
|
|
|
13449
13514
|
]);
|
|
13450
13515
|
/**
|
|
13451
13516
|
* `derived` reads a source · `clock` reads only `now`, recomputed when a sibling
|
|
13452
|
-
* field of its cap changes value · `constant` reads nothing, computed once
|
|
13517
|
+
* field of its cap changes value · `constant` reads nothing, computed once ·
|
|
13518
|
+
* `accumulator` advances from the target's seed/current output.
|
|
13453
13519
|
*/
|
|
13454
13520
|
var CompositionFieldRoleSchema = _enum([
|
|
13455
13521
|
"derived",
|
|
13456
13522
|
"clock",
|
|
13457
|
-
"constant"
|
|
13523
|
+
"constant",
|
|
13524
|
+
"accumulator"
|
|
13458
13525
|
]);
|
|
13459
13526
|
/** The item a planned field belongs to; its `path` is then the dotted path INSIDE the item. */
|
|
13460
13527
|
var CompositionFieldItemSchema = object({
|
|
@@ -13490,6 +13557,7 @@ var CompositionFeatureModeSchema = _enum([
|
|
|
13490
13557
|
"replace"
|
|
13491
13558
|
]);
|
|
13492
13559
|
var CompositionFeaturePlanSchema = object({
|
|
13560
|
+
/** Index in the stored feature array; disabled features are omitted rather than re-indexed. */
|
|
13493
13561
|
featureIndex: number().int().nonnegative(),
|
|
13494
13562
|
cap: string(),
|
|
13495
13563
|
mode: CompositionFeatureModeSchema
|
|
@@ -13498,7 +13566,8 @@ var CompositionValidationSchema = object({
|
|
|
13498
13566
|
ok: boolean(),
|
|
13499
13567
|
problems: array(CompositionProblemSchema),
|
|
13500
13568
|
fields: array(CompositionFieldPlanSchema),
|
|
13501
|
-
features: array(CompositionFeaturePlanSchema)
|
|
13569
|
+
features: array(CompositionFeaturePlanSchema),
|
|
13570
|
+
events: array(CompositionEventPlanSchema)
|
|
13502
13571
|
});
|
|
13503
13572
|
/**
|
|
13504
13573
|
* Mirrors `CoreBlockStatus`, pinned by `core-blocks-source.spec.ts`. `degraded`:
|
|
@@ -15109,6 +15178,34 @@ var DeviceBindingsForDeviceSchema = object({
|
|
|
15109
15178
|
nativeAddonId: string()
|
|
15110
15179
|
}))
|
|
15111
15180
|
});
|
|
15181
|
+
/**
|
|
15182
|
+
* The STORED wrapper activation for one `(device, capability)` pair — the row
|
|
15183
|
+
* `setWrapperActive` writes, read back three-way (D675):
|
|
15184
|
+
*
|
|
15185
|
+
* - `value` — the store answered and holds an activation: the bound wrapper's
|
|
15186
|
+
* addon id, or `null`, the operator's explicit "off" marker (D62);
|
|
15187
|
+
* - `missing` — the store answered, its activation map exists, and it holds
|
|
15188
|
+
* nothing for this pair: the operator never activated or deactivated a
|
|
15189
|
+
* wrapper here;
|
|
15190
|
+
* - `failed` — the store could not be read, holds no activation map at all
|
|
15191
|
+
* (an empty or unready snapshot, D44), or holds something that is not an
|
|
15192
|
+
* activation. It carries NO information: a consumer must never read it as
|
|
15193
|
+
* `missing` (D315, D393).
|
|
15194
|
+
*
|
|
15195
|
+
* This is the persisted INPUT, not the derived `getBindings` view — no registry
|
|
15196
|
+
* resolution, no `defaultActive` auto-binding, no cluster native-cap folding.
|
|
15197
|
+
*/
|
|
15198
|
+
var WrapperActivationReadSchema = discriminatedUnion("kind", [
|
|
15199
|
+
object({
|
|
15200
|
+
kind: literal("value"),
|
|
15201
|
+
wrapperAddonId: string().nullable()
|
|
15202
|
+
}),
|
|
15203
|
+
object({ kind: literal("missing") }),
|
|
15204
|
+
object({
|
|
15205
|
+
kind: literal("failed"),
|
|
15206
|
+
error: string()
|
|
15207
|
+
})
|
|
15208
|
+
]);
|
|
15112
15209
|
var SavedDeviceRowSchema = object({
|
|
15113
15210
|
/** Numeric id reserved at allocateDeviceId time. */
|
|
15114
15211
|
id: number(),
|
|
@@ -15459,7 +15556,10 @@ method(object({
|
|
|
15459
15556
|
}), _void(), {
|
|
15460
15557
|
kind: "mutation",
|
|
15461
15558
|
auth: "admin"
|
|
15462
|
-
}), method(object({
|
|
15559
|
+
}), method(object({
|
|
15560
|
+
deviceId: number(),
|
|
15561
|
+
capName: string().min(1)
|
|
15562
|
+
}), WrapperActivationReadSchema), method(object({ capName: string() }), array(string())), method(object({ deviceType: string() }), array(object({
|
|
15463
15563
|
capName: string(),
|
|
15464
15564
|
wrappers: array(string())
|
|
15465
15565
|
}))), method(object({ deviceId: number() }), SettingsSchemaWithValuesSchema.nullable()), method(object({ deviceId: number() }), SettingsSchemaWithValuesSchema.nullable()), method(object({ deviceId: number() }), object({
|
|
@@ -26975,42 +27075,6 @@ DeviceType.Camera, method(object({
|
|
|
26975
27075
|
kind: "query",
|
|
26976
27076
|
auth: "protected"
|
|
26977
27077
|
});
|
|
26978
|
-
/**
|
|
26979
|
-
* LA tabella "quale booleano di questo tipo di device conta come ALTO", e il
|
|
26980
|
-
* valutatore puro del suo FRONTE.
|
|
26981
|
-
*
|
|
26982
|
-
* Viveva dentro il builtin virtual-doorbell
|
|
26983
|
-
* (`@camstack/system` — `builtins/doorbell/trigger-engine.ts`) e i suoi
|
|
26984
|
-
* predicati erano privati al modulo. Il recorder ne ha bisogno per il trigger
|
|
26985
|
-
* `RecordingTriggers.sensorDeviceIds`: copiarla avrebbe creato la SECONDA
|
|
26986
|
-
* tabella, che diverge alla prima cap aggiunta e il cui sintomo — "il sensore
|
|
26987
|
-
* fa suonare il campanello ma non registra" — è esattamente D62. Quindi si
|
|
26988
|
-
* SPOSTA qui e il doorbell la ri-esporta.
|
|
26989
|
-
*
|
|
26990
|
-
* ⚠ NON è `DEVICE_STATE_READERS` (`catalogs/device-state-vocabulary.ts`), e le
|
|
26991
|
-
* due non vanno unificate: quella risponde a "qual è la PAROLA di stato per una
|
|
26992
|
-
* regola" (e include `presence`, `cover`, `alarm-panel`), questa a "qual è il
|
|
26993
|
-
* booleano il cui FRONTE conta". Vocabolari deliberatamente diversi.
|
|
26994
|
-
*/
|
|
26995
|
-
/**
|
|
26996
|
-
* Known binary / switch source caps → the boolean slice field whose
|
|
26997
|
-
* false→true rise counts as ACTIVE. Every entry is "fire on active".
|
|
26998
|
-
* Sensors whose "active" reading is not a plain boolean (presence's string
|
|
26999
|
-
* state, connectivity's connected flag) are deliberately excluded — a
|
|
27000
|
-
* reconnect is not a doorbell press, and it is not a recording either.
|
|
27001
|
-
*/
|
|
27002
|
-
var SOURCE_CAP_ACTIVE_FIELD = {
|
|
27003
|
-
contact: "entryOpen",
|
|
27004
|
-
binary: "on",
|
|
27005
|
-
switch: "on",
|
|
27006
|
-
motion: "detected",
|
|
27007
|
-
flood: "flooded",
|
|
27008
|
-
gas: "detected",
|
|
27009
|
-
smoke: "detected",
|
|
27010
|
-
"carbon-monoxide": "detected",
|
|
27011
|
-
vibration: "detected",
|
|
27012
|
-
tamper: "tampered"
|
|
27013
|
-
};
|
|
27014
27078
|
object({
|
|
27015
27079
|
/** Ms epoch of the last press. null = never observed since this provider started. */
|
|
27016
27080
|
lastPressedAt: number().nullable(),
|
|
@@ -32982,12 +33046,21 @@ var RecordingStorageUsageSchema = object({
|
|
|
32982
33046
|
*/
|
|
32983
33047
|
devicesRead: _enum(["archive", "unavailable"]).optional(),
|
|
32984
33048
|
/**
|
|
33049
|
+
* Is the `archive` answer WHOLE (D674): the hour ledger loaded without
|
|
33050
|
+
* hitting its row cap, and at least one location resolved? Only then may a
|
|
33051
|
+
* camera ABSENT from `devices[]` be read as "no footage" — and only then is a
|
|
33052
|
+
* row's `oldestMs` the archive's oldest rather than the oldest of a fraction.
|
|
33053
|
+
* OPTIONAL: a recorder predating D674 omits it, and a consumer must read the
|
|
33054
|
+
* absence as `false`. A retention floor is a delete; it never guesses.
|
|
33055
|
+
*/
|
|
33056
|
+
complete: boolean().optional(),
|
|
33057
|
+
/**
|
|
32985
33058
|
* Per-physical-volume capacity. OPTIONAL, and consumers must render the rest
|
|
32986
|
-
* of the payload without it:
|
|
32987
|
-
*
|
|
32988
|
-
*
|
|
32989
|
-
*
|
|
32990
|
-
*
|
|
33059
|
+
* of the payload without it: a recorder that could not build it omits it. A
|
|
33060
|
+
* UI that dereferences it unconditionally crashes the whole Storage page over
|
|
33061
|
+
* a missing disk bar. (The hub's cap routers pass output through unvalidated
|
|
33062
|
+
* since 2026-07-11 — `cap-router-builder.ts` — so a newer recorder's fields
|
|
33063
|
+
* are not stripped by an older hub.)
|
|
32991
33064
|
*/
|
|
32992
33065
|
locations: array(RecordingLocationUsageSchema).optional()
|
|
32993
33066
|
});
|
|
@@ -35758,7 +35831,12 @@ Object.freeze({
|
|
|
35758
35831
|
number: {
|
|
35759
35832
|
kind: "fixed",
|
|
35760
35833
|
result: ["number", "null"]
|
|
35761
|
-
}
|
|
35834
|
+
},
|
|
35835
|
+
rose: {
|
|
35836
|
+
kind: "fixed",
|
|
35837
|
+
result: ["number", "null"]
|
|
35838
|
+
},
|
|
35839
|
+
count: NUMBER
|
|
35762
35840
|
});
|
|
35763
35841
|
`${COMPOSED_DEVICE_STABLE_ID_PREFIX}`;
|
|
35764
35842
|
/**
|
|
@@ -38873,6 +38951,12 @@ Object.freeze({
|
|
|
38873
38951
|
addonId: null,
|
|
38874
38952
|
access: "view"
|
|
38875
38953
|
},
|
|
38954
|
+
"deviceManager.getWrapperActivation": {
|
|
38955
|
+
capName: "device-manager",
|
|
38956
|
+
capScope: "system",
|
|
38957
|
+
addonId: null,
|
|
38958
|
+
access: "view"
|
|
38959
|
+
},
|
|
38876
38960
|
"deviceManager.listAll": {
|
|
38877
38961
|
capName: "device-manager",
|
|
38878
38962
|
capScope: "system",
|
|
@@ -44682,6 +44766,11 @@ Object.freeze({
|
|
|
44682
44766
|
form: "single",
|
|
44683
44767
|
optional: false
|
|
44684
44768
|
}],
|
|
44769
|
+
"deviceManager.getWrapperActivation": [{
|
|
44770
|
+
name: "deviceId",
|
|
44771
|
+
form: "single",
|
|
44772
|
+
optional: false
|
|
44773
|
+
}],
|
|
44685
44774
|
"deviceManager.listAll": [{
|
|
44686
44775
|
name: "deviceIds",
|
|
44687
44776
|
form: "array",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { h as e, l as t, u as n, y as r } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react__loadShare__.js-DJDHChgO.mjs";
|
|
2
|
-
import { o as i, s as a } from "./responsive-
|
|
2
|
+
import { o as i, s as a } from "./responsive-CUot36ya.mjs";
|
|
3
3
|
import { n as o, r as s, t as c } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-ds_Ehzaa.mjs";
|
|
4
4
|
var l = a("chevron-down", [["path", {
|
|
5
5
|
d: "m6 9 6 6 6-6",
|
package/dist/remoteEntry.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-
|
|
1
|
+
import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-DcHcLEYl.mjs";
|
|
2
2
|
export { t as get, e as init };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { c as e, g as t, h as n, l as r, n as i, p as a, r as o, t as s, u as c, y as l } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react__loadShare__.js-DJDHChgO.mjs";
|
|
2
2
|
import "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-ds_Ehzaa.mjs";
|
|
3
|
-
import { n as u } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-
|
|
3
|
+
import { n as u } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BmwlvTun.mjs";
|
|
4
4
|
//#region ../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
|
|
5
5
|
l();
|
|
6
6
|
var d = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim(), f = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), p = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), m = (e) => {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { c as e, h as t, p as n, y as r } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react__loadShare__.js-DJDHChgO.mjs";
|
|
2
|
-
import { s as i } from "./responsive-
|
|
2
|
+
import { s as i } from "./responsive-CUot36ya.mjs";
|
|
3
3
|
var a = i("camera", [["path", {
|
|
4
4
|
d: "M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z",
|
|
5
5
|
key: "18u6gg"
|
|
@@ -2753,7 +2753,7 @@ async function rr(e) {
|
|
|
2753
2753
|
}
|
|
2754
2754
|
}
|
|
2755
2755
|
async function ir() {
|
|
2756
|
-
return tr ||= rr(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-
|
|
2756
|
+
return tr ||= rr(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-CsOTOHLQ.mjs")).catch((e) => {
|
|
2757
2757
|
throw tr = void 0, e;
|
|
2758
2758
|
}), tr;
|
|
2759
2759
|
}
|