@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.
Files changed (18) hide show
  1. package/dist/{MotionZonesSettings-D2-zQjQZ.mjs → MotionZonesSettings-DB-47cOo.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-DvWwawcZ.mjs → PrivacyMaskSettings-BIzb0D_0.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-Duajxv_A.mjs → SceneMonitorEditor-IaL6eXRr.mjs} +3 -3
  4. package/dist/_stub.js +13 -13
  5. 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
  6. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BmwlvTun.mjs +26 -0
  7. package/dist/{hostInit-D9K6OWiX.mjs → hostInit-Bl24UlY4.mjs} +2 -2
  8. package/dist/model-studio.addon.js +137 -48
  9. package/dist/model-studio.addon.mjs +137 -48
  10. package/dist/{player-overlays-BYYRZ16B.mjs → player-overlays-CISEjNtj.mjs} +1 -1
  11. package/dist/remoteEntry.js +1 -1
  12. package/dist/{responsive-D88q7dKI.mjs → responsive-CUot36ya.mjs} +1 -1
  13. package/dist/{scene-monitor-copy-BBWU6bfw.mjs → scene-monitor-copy-J64_2zC1.mjs} +1 -1
  14. package/dist/{square-_I0mPZ7d.mjs → square-CDSkPKBQ.mjs} +1 -1
  15. package/dist/{trash-2-D9kzsUUY.mjs → trash-2-C1NZwuGu.mjs} +1 -1
  16. 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
  17. package/package.json +1 -1
  18. 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-jkRQgtSc.mjs
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-CPFIlFfw.mjs
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({ capName: string() }), array(string())), method(object({ deviceType: string() }), array(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: the hub serves this method through a BAKED
33008
- * router, so a hub whose framework train predates a change to this array
33009
- * strips it out of an answer a newer recorder happily produced. A UI that
33010
- * dereferences it unconditionally crashes the whole Storage page over a
33011
- * missing disk bar.
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-jkRQgtSc.mjs
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-CPFIlFfw.mjs
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({ capName: string() }), array(string())), method(object({ deviceType: string() }), array(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: the hub serves this method through a BAKED
32987
- * router, so a hub whose framework train predates a change to this array
32988
- * strips it out of an answer a newer recorder happily produced. A UI that
32989
- * dereferences it unconditionally crashes the whole Storage page over a
32990
- * missing disk bar.
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-D88q7dKI.mjs";
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",
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-DHLDVQJr.mjs";
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-JwlaJnAm.mjs";
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-D88q7dKI.mjs";
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"
@@ -1,4 +1,4 @@
1
- import { s as e } from "./responsive-D88q7dKI.mjs";
1
+ import { s as e } from "./responsive-CUot36ya.mjs";
2
2
  var t = e("eye-off", [
3
3
  ["path", {
4
4
  d: "M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",
@@ -1,4 +1,4 @@
1
- import { s as e } from "./responsive-D88q7dKI.mjs";
1
+ import { s as e } from "./responsive-CUot36ya.mjs";
2
2
  var t = e("trash-2", [
3
3
  ["path", {
4
4
  d: "M10 11v6",
@@ -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-BBY6_TNd.mjs")).catch((e) => {
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-model-studio",
3
- "version": "1.1.181",
3
+ "version": "1.1.182",
4
4
  "description": "Custom detection model registry, conversion & distribution for CamStack",
5
5
  "keywords": [
6
6
  "camstack",