@camstack/addon-model-studio 1.1.314 → 1.1.316

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 (20) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/{MotionZonesSettings-Bbq95ygz.mjs → MotionZonesSettings-CMwAQd-Y.mjs} +2 -2
  3. package/dist/{PrivacyMaskSettings-ZpD6VN7X.mjs → PrivacyMaskSettings-wx9DyDgK.mjs} +4 -4
  4. package/dist/{SceneMonitorEditor-BvsLHttM.mjs → SceneMonitorEditor-jDNxVNGw.mjs} +3 -3
  5. package/dist/_stub.js +6515 -6341
  6. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-BtG6KzLk.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-P5JTQUjR.mjs} +3 -3
  7. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-Cxz43vtF.mjs +26 -0
  8. package/dist/addon-model-studio.css +1 -1
  9. package/dist/{hostInit-XUNzuCDs.mjs → hostInit-DXaNbFAa.mjs} +2 -2
  10. package/dist/model-studio.addon.js +199 -12
  11. package/dist/model-studio.addon.mjs +199 -12
  12. package/dist/{player-overlays-Dc4klu5U.mjs → player-overlays-B0MiJ5R6.mjs} +1 -1
  13. package/dist/remoteEntry.js +1 -1
  14. package/dist/{responsive-D28CBU7-.mjs → responsive-BHzVDMt-.mjs} +1 -1
  15. package/dist/{scene-monitor-copy-KG_LV8wy.mjs → scene-monitor-copy-CBNkkNvs.mjs} +1 -1
  16. package/dist/{square-BpIRNy9u.mjs → square-SIMvtgyo.mjs} +1 -1
  17. package/dist/{trash-2-BwbD1FGM.mjs → trash-2-CTpwDufe.mjs} +1 -1
  18. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-D2YHXWx9.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-D6DfHBUW.mjs} +1 -1
  19. package/package.json +1 -1
  20. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DxAMUMtD.mjs +0 -26
@@ -36,7 +36,7 @@ async function r() {
36
36
  }
37
37
  },
38
38
  "@camstack/types": {
39
- version: "1.2.435",
39
+ version: "1.2.438",
40
40
  scope: "default",
41
41
  shareConfig: {
42
42
  singleton: !0,
@@ -81,7 +81,7 @@ async function r() {
81
81
  }
82
82
  },
83
83
  "@camstack/ui-library": {
84
- version: "1.2.343",
84
+ version: "1.2.346",
85
85
  scope: "default",
86
86
  shareConfig: {
87
87
  singleton: !0,
@@ -5842,7 +5842,7 @@ var ZodIssueCode = {
5842
5842
  var ZodFirstPartyTypeKind;
5843
5843
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5844
5844
  //#endregion
5845
- //#region ../types/dist/sleep-Crlmu_tO.mjs
5845
+ //#region ../types/dist/sleep-BAvUCi_2.mjs
5846
5846
  /**
5847
5847
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5848
5848
  * window to float samples (D455).
@@ -9057,6 +9057,7 @@ var CAP_NAMES = Object.freeze([
9057
9057
  "image-settings",
9058
9058
  "integrations",
9059
9059
  "intercom",
9060
+ "ir-transmitter",
9060
9061
  "keychain",
9061
9062
  "keychain-admin",
9062
9063
  "lawn-mower-control",
@@ -10304,6 +10305,11 @@ Object.freeze({
10304
10305
  "path": "batteryPower",
10305
10306
  "valueType": "number"
10306
10307
  },
10308
+ {
10309
+ "path": "powerSource",
10310
+ "valueType": "enum",
10311
+ "enumValues": ["mains", "battery"]
10312
+ },
10307
10313
  {
10308
10314
  "path": "desiccantLeftDays",
10309
10315
  "valueType": "number"
@@ -10887,7 +10893,7 @@ object({
10887
10893
  params: record(string(), union([string(), number()])).optional()
10888
10894
  });
10889
10895
  //#endregion
10890
- //#region ../types/dist/err-msg-DIorGYeC.mjs
10896
+ //#region ../types/dist/err-msg-BCdlR2Li.mjs
10891
10897
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
10892
10898
  DeviceType["Camera"] = "camera";
10893
10899
  DeviceType["Hub"] = "hub";
@@ -11233,10 +11239,13 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
11233
11239
  /** Fallback when the notifier service name doesn't match a known
11234
11240
  * pattern. */
11235
11241
  DeviceRole["GenericNotifier"] = "generic-notifier";
11242
+ /** Emits a pulse train (infrared or RF) on request — the `ir-transmitter`
11243
+ * cap. A `DeviceType.Generic` device. */
11244
+ DeviceRole["IrTransmitter"] = "ir-transmitter";
11236
11245
  return DeviceRole;
11237
11246
  }({});
11238
11247
  //#endregion
11239
- //#region ../types/dist/composition-CZImLpOI.mjs
11248
+ //#region ../types/dist/composition-DpFv_J6D.mjs
11240
11249
  /**
11241
11250
  * The ffmpeg build every CamStack node downloads, per platform and arch.
11242
11251
  *
@@ -19304,12 +19313,13 @@ var CHANGED = {
19304
19313
  expr: "now"
19305
19314
  };
19306
19315
  function numeric(input) {
19316
+ const { alsoFrom, ...base } = input;
19307
19317
  return {
19308
- ...input,
19318
+ ...base,
19309
19319
  family: "numeric",
19310
19320
  deviceType: DeviceType.Sensor,
19311
19321
  memberDeviceType: DeviceType.Sensor,
19312
- memberDeviceTypes: [DeviceType.Sensor],
19322
+ memberDeviceTypes: [DeviceType.Sensor, ...alsoFrom?.deviceTypes ?? []],
19313
19323
  activeWhen: void 0,
19314
19324
  commandCaps: [],
19315
19325
  baseUnit: baseUnitOf(input.quantity),
@@ -19317,9 +19327,10 @@ function numeric(input) {
19317
19327
  accept: [{
19318
19328
  cap: input.outputCap,
19319
19329
  fieldPath: input.outputField
19320
- }]
19330
+ }, ...alsoFrom === void 0 ? [] : [alsoFrom.accept]]
19321
19331
  };
19322
19332
  }
19333
+ var CLIMATE_DEVICES = [DeviceType.Thermostat, DeviceType.Climate];
19323
19334
  function binary(input) {
19324
19335
  return {
19325
19336
  ...input,
@@ -19345,7 +19356,14 @@ var GROUP_TEMPLATES = [
19345
19356
  quantity: "temperature",
19346
19357
  defaultAggregate: "mean",
19347
19358
  empty: "null",
19348
- companions: [NOW$2]
19359
+ companions: [NOW$2],
19360
+ alsoFrom: {
19361
+ deviceTypes: CLIMATE_DEVICES,
19362
+ accept: {
19363
+ cap: "climate-control",
19364
+ fieldPath: "currentTemp"
19365
+ }
19366
+ }
19349
19367
  }),
19350
19368
  numeric({
19351
19369
  id: "humidity",
@@ -19356,7 +19374,14 @@ var GROUP_TEMPLATES = [
19356
19374
  quantity: "humidity",
19357
19375
  defaultAggregate: "mean",
19358
19376
  empty: "null",
19359
- companions: [NOW$2]
19377
+ companions: [NOW$2],
19378
+ alsoFrom: {
19379
+ deviceTypes: CLIMATE_DEVICES,
19380
+ accept: {
19381
+ cap: "climate-control",
19382
+ fieldPath: "currentHumidity"
19383
+ }
19384
+ }
19360
19385
  }),
19361
19386
  numeric({
19362
19387
  id: "pressure",
@@ -43602,6 +43627,17 @@ var LlmProfileSchema = object({
43602
43627
  * field in its editor only when its descriptor lists it in `profileFields`. */
43603
43628
  topK: number().int().positive().optional(),
43604
43629
  maxTokens: number().int().positive().optional(),
43630
+ /** How hard the model "thinks" before it answers. Omitted = the model's own
43631
+ * default. `off` matters for structured output: a thinking model can spend
43632
+ * the whole completion on reasoning and return an empty `content`. Carried
43633
+ * only by the wires that have it — a kind offers the field in its editor
43634
+ * only when its descriptor lists it in `profileFields`. */
43635
+ reasoningEffort: _enum([
43636
+ "off",
43637
+ "low",
43638
+ "medium",
43639
+ "high"
43640
+ ]).optional(),
43605
43641
  /** Prompt context window. Advisory for cloud kinds (they enforce their own). */
43606
43642
  contextLength: number().int().positive().optional(),
43607
43643
  /** Default system prompt. A caller's `system` REPLACES it (never appends —
@@ -43640,6 +43676,7 @@ var LlmProfileFieldSchema = _enum([
43640
43676
  "topP",
43641
43677
  "topK",
43642
43678
  "maxTokens",
43679
+ "reasoningEffort",
43643
43680
  "contextLength",
43644
43681
  "systemPrompt",
43645
43682
  "timeoutMs",
@@ -44896,6 +44933,43 @@ var NotificationActionSchema = object({
44896
44933
  */
44897
44934
  mode: _enum(["navigate", "background"]).optional()
44898
44935
  });
44936
+ /** A delivery parameter value: what a notifier declared it takes. */
44937
+ var DeliveryParamValueSchema = union([
44938
+ string(),
44939
+ number(),
44940
+ boolean()
44941
+ ]);
44942
+ /**
44943
+ * One extra delivery parameter a notifier KIND declares (D938). A rule that
44944
+ * addresses a target of that kind may set it; a kind that declares nothing is
44945
+ * never handed one. The admin UI derives its control from this descriptor —
44946
+ * no editor knows a service by name.
44947
+ *
44948
+ * Optional fields are `.optional()`, never `.default()` (a Zod default does not
44949
+ * run on the addon cap path).
44950
+ */
44951
+ var DeliveryParamSchema = object({
44952
+ key: string().min(1),
44953
+ label: string(),
44954
+ /** i18n key of the label, resolved by the declaring addon's namespace. */
44955
+ labelKey: string().optional(),
44956
+ type: _enum([
44957
+ "enum",
44958
+ "number",
44959
+ "boolean",
44960
+ "string"
44961
+ ]),
44962
+ /** `enum` only: the closed set of accepted values. */
44963
+ options: array(object({
44964
+ value: string(),
44965
+ label: string()
44966
+ })).optional(),
44967
+ /** `number` only. */
44968
+ min: number().optional(),
44969
+ max: number().optional(),
44970
+ /** What the notifier does when the rule sets nothing; shown as the placeholder. */
44971
+ default: DeliveryParamValueSchema.optional()
44972
+ });
44899
44973
  /**
44900
44974
  * The canonical notification. `body` is the only hard field (Apprise model).
44901
44975
  * `priority` is a 5-level ORDINAL (1=lowest … 3=normal(default) … 5=urgent),
@@ -44918,7 +44992,13 @@ var NotificationSchema = object({
44918
44992
  tag: string().optional(),
44919
44993
  deviceId: number().optional(),
44920
44994
  eventId: string().optional(),
44921
- metadata: record(string(), unknown()).optional()
44995
+ metadata: record(string(), unknown()).optional(),
44996
+ /**
44997
+ * Values for the parameters the target's kind DECLARES in
44998
+ * {@link TargetKindSchema} `deliveryParams`. Already validated against the
44999
+ * declaration by the sender; a notifier reads only the keys it declared.
45000
+ */
45001
+ delivery: record(string(), DeliveryParamValueSchema).optional()
44922
45002
  });
44923
45003
  /** One declared native severity/priority level for a kind. */
44924
45004
  var TargetKindLevelSchema = object({
@@ -45024,6 +45104,11 @@ var TargetKindSchema = object({
45024
45104
  */
45025
45105
  destinationKeys: array(string()).optional(),
45026
45106
  supportsDiscovery: boolean(),
45107
+ /**
45108
+ * Extra delivery parameters a rule may set for a target of this kind (D938).
45109
+ * Absent = none; the rule editor then offers nothing.
45110
+ */
45111
+ deliveryParams: array(DeliveryParamSchema).optional(),
45027
45112
  caps: TargetKindCapsSchema
45028
45113
  });
45029
45114
  /**
@@ -57194,7 +57279,9 @@ var ManifestShapeSchema = object({
57194
57279
  icon: string().optional()
57195
57280
  }).optional(),
57196
57281
  protected: boolean().optional(),
57197
- removable: boolean().optional()
57282
+ removable: boolean().optional(),
57283
+ /** Declared Integrations-page block (mirror of `AddonDeclaration.integrationSection`). */
57284
+ integrationSection: _enum(["system", "providers"]).optional()
57198
57285
  });
57199
57286
  var AddonProcessSchema = object({
57200
57287
  pid: number().optional(),
@@ -57916,6 +58003,56 @@ DeviceType.Button, method(object({ deviceId: number().int().nonnegative() }), _v
57916
58003
  auth: "protected"
57917
58004
  });
57918
58005
  /**
58006
+ * A pulse train in signed microseconds: mark (+) first, then space (-), strictly
58007
+ * alternating, no zeros, 2..1024 entries.
58008
+ */
58009
+ var IrTimingsSchema = array(number().int()).min(2).max(1024).superRefine((timings, ctx) => {
58010
+ timings.forEach((value, index) => {
58011
+ const expectMark = index % 2 === 0;
58012
+ if (value === 0 || value > 0 !== expectMark) ctx.addIssue({
58013
+ code: "custom",
58014
+ message: `timing ${index} must be a non-zero ${expectMark ? "mark (positive)" : "space (negative)"}`,
58015
+ path: [index]
58016
+ });
58017
+ });
58018
+ });
58019
+ /** Per-command transmit options. Every key is optional; a transmitter applies what it can. */
58020
+ var TransmitSettingsSchema = object({
58021
+ carrierHz: number().int().positive().optional(),
58022
+ dutyCyclePercent: number().int().min(1).max(100).optional(),
58023
+ repeat: number().int().min(0).max(20).optional(),
58024
+ repeatDelayMs: number().int().min(0).optional()
58025
+ });
58026
+ /** The setting keys a transmitter may declare as settable (`getInfo.settable`). */
58027
+ var TransmitSettingKeySchema = _enum([
58028
+ "carrierHz",
58029
+ "dutyCyclePercent",
58030
+ "repeat",
58031
+ "repeatDelayMs"
58032
+ ]);
58033
+ var IrMediumSchema = _enum(["ir", "rf"]);
58034
+ var IrSendResultSchema = object({
58035
+ ok: literal(true),
58036
+ /** Settings the transmitter could not apply; the train was still sent. */
58037
+ ignoredSettings: array(string())
58038
+ });
58039
+ var IrTransmitterInfoSchema = object({
58040
+ media: array(IrMediumSchema),
58041
+ settable: array(TransmitSettingKeySchema),
58042
+ maxTimings: number().int().positive()
58043
+ });
58044
+ DeviceType.Generic, method(object({
58045
+ deviceId: number().int().nonnegative(),
58046
+ timings: IrTimingsSchema,
58047
+ settings: TransmitSettingsSchema.optional()
58048
+ }), IrSendResultSchema, {
58049
+ kind: "mutation",
58050
+ auth: "protected"
58051
+ }), method(object({ deviceId: number().int().nonnegative() }), IrTransmitterInfoSchema, {
58052
+ kind: "query",
58053
+ auth: "protected"
58054
+ });
58055
+ /**
57919
58056
  * `calendar-source` — collection cap exposing per-provider calendars and
57920
58057
  * their events. Every addon that contributes calendars (Home Assistant,
57921
58058
  * a future Google Calendar addon, …) registers a provider here. The hub
@@ -62018,9 +62155,14 @@ object({
62018
62155
  * (`device_class: problem`, on = low). True when the tank reports empty,
62019
62156
  * or, on a dual-hopper model, when EITHER hopper is empty. */
62020
62157
  lowFood: boolean(),
62021
- /** Battery charge 0..100 (%). Null on mains-powered models or when the
62022
- * device has no battery reading. */
62158
+ /** Battery charge 0..100 (%). On a feeder running on `mains` this is the
62159
+ * BACKUP battery's charge, not the power source. Null when the device has
62160
+ * no battery reading. */
62023
62161
  batteryPower: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
62162
+ /** What the feeder is powered from right now: `mains` (plugged in, the
62163
+ * battery is only a backup) or `battery`. Null when the device does not
62164
+ * report it. */
62165
+ powerSource: _enum(["mains", "battery"]).nullable(),
62024
62166
  /**
62025
62167
  * Desiccant life remaining, stored in seconds (duration base, D944).
62026
62168
  * Providers convert from the days the feeder reports. Null when the
@@ -70394,6 +70536,20 @@ Object.freeze({
70394
70536
  access: "create",
70395
70537
  role: "viewer"
70396
70538
  },
70539
+ "irTransmitter.getInfo": {
70540
+ capName: "ir-transmitter",
70541
+ capScope: "device",
70542
+ addonId: null,
70543
+ access: "view",
70544
+ role: "viewer"
70545
+ },
70546
+ "irTransmitter.send": {
70547
+ capName: "ir-transmitter",
70548
+ capScope: "device",
70549
+ addonId: null,
70550
+ access: "create",
70551
+ role: "viewer"
70552
+ },
70397
70553
  "keychain.delete": {
70398
70554
  capName: "keychain",
70399
70555
  capScope: "system",
@@ -78017,6 +78173,11 @@ var ACTUATOR_CAP_VOCABULARY = {
78017
78173
  icon: "circle-dot"
78018
78174
  }]
78019
78175
  },
78176
+ "ir-transmitter": {
78177
+ scope: "device",
78178
+ noun: t("IR / RF transmitter", "Trasmettitore IR / RF"),
78179
+ notOperatorFacing: { send: "a raw pulse train is not something an operator composes in an automation; the remote that owns the command table sends it" }
78180
+ },
78020
78181
  control: {
78021
78182
  scope: "device",
78022
78183
  noun: t("Control", "Controllo"),
@@ -81736,6 +81897,16 @@ Object.freeze({
81736
81897
  form: "single",
81737
81898
  optional: false
81738
81899
  }],
81900
+ "irTransmitter.getInfo": [{
81901
+ name: "deviceId",
81902
+ form: "single",
81903
+ optional: false
81904
+ }],
81905
+ "irTransmitter.send": [{
81906
+ name: "deviceId",
81907
+ form: "single",
81908
+ optional: false
81909
+ }],
81739
81910
  "keychain.deleteDeviceScope": [{
81740
81911
  name: "deviceId",
81741
81912
  form: "single",
@@ -84769,6 +84940,22 @@ DEFAULT_NATIVE_LEASE_SETTINGS.admission;
84769
84940
  String.raw`(?<=^|["'(\s>,\[{])`;
84770
84941
  var MB = 1024 * 1024;
84771
84942
  1024 * MB, 3072 * MB;
84943
+ discriminatedUnion("kind", [object({
84944
+ kind: literal("raw"),
84945
+ timings: array(number().int()),
84946
+ settings: TransmitSettingsSchema.optional()
84947
+ }), object({
84948
+ kind: literal("pronto"),
84949
+ code: string()
84950
+ })]);
84951
+ object({
84952
+ manufacturer: string().optional(),
84953
+ supportedModels: array(string()).optional(),
84954
+ supportedController: string().optional(),
84955
+ commandsEncoding: string(),
84956
+ delay: number().nonnegative().optional(),
84957
+ commands: record(string(), unknown())
84958
+ });
84772
84959
  //#endregion
84773
84960
  //#region src/convert-orchestrator.ts
84774
84961
  function supports(hw, targets) {