iobroker.javascript 10.1.3 → 10.2.0

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 (131) hide show
  1. package/README.md +24 -47
  2. package/admin/assets/AiChatPanel-DzN_zJhJ.js +27 -0
  3. package/admin/assets/AiChatService-k72w0sOt.js +216 -0
  4. package/admin/assets/AiDiffView-DAleMXcP.js +1 -0
  5. package/admin/assets/AiInlineProvider-C5EJApDe.js +5 -0
  6. package/admin/assets/Debugger-C4EMPnwD.js +15 -0
  7. package/admin/assets/Error-DBiAAbCC.js +1 -0
  8. package/admin/assets/Import-Dm-2zYlI.js +1 -0
  9. package/admin/assets/RulesEditor-1zrGeOYq.js +1 -0
  10. package/admin/assets/RulesEditor-CybrKL-9.css +1 -0
  11. package/admin/assets/ScriptEditor-DrKzMShn.js +2 -0
  12. package/admin/assets/ScriptEditorVanillaMonaco-uvElLaRp.js +3 -0
  13. package/admin/assets/_virtual_mf-localSharedImportMap___mfe_internal__iobroker_javascript__mf_owner__1-CQpJXcpz.js +1 -0
  14. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__113183188387379__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-Drq9CkPs.js +1217 -0
  15. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__113183188387379__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-B8K8J9cp.js +9 -0
  16. package/admin/assets/aiPromptBuilder-LTtUGqJp.js +1 -0
  17. package/admin/assets/{blockly-DBw-ytY1.js → blockly-Fp-1_Ye3.js} +1 -1
  18. package/admin/assets/{blocks_action-CaHoI2vK.js → blocks_action-xqgGyzT2.js} +1 -1
  19. package/admin/assets/{blocks_convert-Dno4Uyat.js → blocks_convert-PyFGxenp.js} +1 -1
  20. package/admin/assets/{blocks_logic-C4MPyL6T.js → blocks_logic-BJxcqx2J.js} +1 -1
  21. package/admin/assets/{blocks_number-BMu9V-ca.js → blocks_number-xkiHAbop.js} +1 -1
  22. package/admin/assets/{blocks_object-vU59tx8A.js → blocks_object-D7_2tXgc.js} +1 -1
  23. package/admin/assets/{blocks_procedures-CfhGGNAK.js → blocks_procedures-BSaG5k0y.js} +1 -1
  24. package/admin/assets/{blocks_sendto-oZjHfEt6.js → blocks_sendto-CdFzuf2Q.js} +1 -1
  25. package/admin/assets/{blocks_switch-DtRe2uV0.js → blocks_switch-CRs6hqoN.js} +1 -1
  26. package/admin/assets/{blocks_system-CWkKMHLd.js → blocks_system-ImR4v_sW.js} +1 -1
  27. package/admin/assets/{blocks_text-CunCNUrR.js → blocks_text-BATVRS4q.js} +1 -1
  28. package/admin/assets/{blocks_time-B_Duc9-g.js → blocks_time-BhxMTQmg.js} +1 -1
  29. package/admin/assets/{blocks_timeout-B5PA_0Xv.js → blocks_timeout-BZ2hzRJk.js} +1 -1
  30. package/admin/assets/{blocks_trigger-BePNP-VV.js → blocks_trigger-bkOJ_uVI.js} +1 -1
  31. package/admin/assets/cronHoverProvider-DYMf8M44.js +2 -0
  32. package/admin/assets/{dist-BF-PlO2i.js → dist-D4uJqRBO.js} +1 -1
  33. package/admin/assets/field_cron-B-SF-uZM.js +1 -0
  34. package/admin/assets/field_oid-fYE12Bhj.js +1 -0
  35. package/admin/assets/field_script-aZs3j-vG.js +1 -0
  36. package/admin/assets/{helpers-Cbd0K4kn.js → helpers-DIT6UgRN.js} +1 -1
  37. package/admin/assets/{hostInit-PWanFl0v.js → hostInit-CzvCZFy5.js} +1 -1
  38. package/admin/assets/index-DwTLl2xB.js +871 -0
  39. package/admin/assets/inlineChatWidget-n7ufGLov.js +2 -0
  40. package/admin/assets/{inlineDiffController-CauFSimb.js → inlineDiffController-5u3tIcIH.js} +1 -1
  41. package/admin/assets/{mf-entry-bootstrap-0-66751765.js → mf-entry-bootstrap-0-bde4e47a.js} +14 -2
  42. package/admin/assets/pendingShares-C6DqQuMX.js +1 -0
  43. package/admin/assets/stateHoverProvider-C0OUV2Nh.js +9 -0
  44. package/admin/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__iobroker_javascript__remoteEntry_js-BvxK85AS.js +1 -0
  45. package/admin/assets/{vite-preload-helper-B7qeedMF.js → vite-preload-helper-CaC3yEL3.js} +1 -1
  46. package/admin/custom/assets/Components-qR8oYG5T.js +1 -0
  47. package/admin/custom/assets/_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1-CB5V_0nT.js +1 -0
  48. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__32150414352696__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-Cc7MmJgr.js +1 -0
  49. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__32150414352696__loadShare___mf_0_emotion_mf_1_styled__loadShare__.js-CFSZkPFK.js +1 -0
  50. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__32150414352696__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-o8Mkax3s.js +1217 -0
  51. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__32150414352696__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-DLa2mE8b.js +1 -0
  52. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__32150414352696__loadShare___mf_0_mui_mf_1_x_mf_2_date_mf_2_pickers__loadShare__.js-CZc6K9E9.js +1 -0
  53. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__32150414352696__loadShare__date_mf_2_fns__loadShare__.js-Bx5h7ISf.js +1 -0
  54. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__32150414352696__loadShare__leaflet__loadShare__.js-im3edKNs.js +1 -0
  55. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__32150414352696__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-Ca3AhTHn.js +1 -0
  56. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__32150414352696__prebuild___mf_0_iobroker_mf_1_json_mf_2_config__prebuild__-bDecxMAs.js +124 -0
  57. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__32150414352696__prebuild__leaflet__prebuild__-CAKlcuIS.js +1 -0
  58. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__32150414352696__prebuild__react_mf_1_jsx_mf_2_runtime__prebuild__-Byvr2uOb.js +1 -0
  59. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__32150414352696__prebuild__react_mf_2_dom_mf_1_client__prebuild__-Thbi9Vo9.js +9 -0
  60. package/admin/custom/assets/dist-D4uJqRBO.js +4 -0
  61. package/admin/custom/assets/{hostInit-CxnK2NMF.js → hostInit-B0Qa8jfJ.js} +1 -1
  62. package/admin/custom/assets/index-DADYLUN0.js +1 -0
  63. package/admin/custom/assets/{lib-D4Fc4r7w.js → lib-BDVPOOMD.js} +2 -2
  64. package/admin/custom/assets/{mf-entry-bootstrap-0-16561517.js → mf-entry-bootstrap-0-b41e47ad.js} +14 -2
  65. package/admin/custom/assets/pendingShares-Gn0OX49v.js +1 -0
  66. package/admin/custom/assets/virtualExposes-DjwWqUOb.js +1 -0
  67. package/admin/custom/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-CHOLf9xJ.js +1 -0
  68. package/admin/custom/assets/{virtual_mf-exposes___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-PH1CCUgS.js → virtual_mf-exposes___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-C0XlV8T_.js} +2 -2
  69. package/admin/custom/assets/{vite-preload-helper-B7qeedMF.js → vite-preload-helper-CaC3yEL3.js} +1 -1
  70. package/admin/custom/customComponents.js +2 -2
  71. package/admin/i18n/de.json +8 -2
  72. package/admin/i18n/en.json +8 -2
  73. package/admin/i18n/es.json +8 -2
  74. package/admin/i18n/fr.json +8 -2
  75. package/admin/i18n/it.json +8 -2
  76. package/admin/i18n/nl.json +8 -2
  77. package/admin/i18n/pl.json +8 -2
  78. package/admin/i18n/pt.json +8 -2
  79. package/admin/i18n/ru.json +8 -2
  80. package/admin/i18n/uk.json +8 -2
  81. package/admin/i18n/zh-cn.json +8 -2
  82. package/admin/jsonConfig.json +54 -1
  83. package/admin/mf-manifest.json +1 -1
  84. package/admin/mf-stats.json +1 -1
  85. package/admin/remoteEntry.js +2 -2
  86. package/admin/tab.html +5 -5
  87. package/build/lib/aiProviderResolver.js +40 -7
  88. package/build/lib/aiProviderResolver.js.map +1 -1
  89. package/build/lib/lazyTsServer.js +177 -0
  90. package/build/lib/lazyTsServer.js.map +1 -0
  91. package/build/main.js +202 -24
  92. package/build/main.js.map +1 -1
  93. package/build/types.d.ts +13 -0
  94. package/io-package.json +31 -28
  95. package/package.json +7 -8
  96. package/admin/assets/AiChatPanel-rQsCR89v.js +0 -242
  97. package/admin/assets/AiDiffView-BoglEOaq.js +0 -1
  98. package/admin/assets/AiInlineProvider-CaHd2G2Q.js +0 -5
  99. package/admin/assets/Debugger-Bj4PsKNm.js +0 -15
  100. package/admin/assets/Error-RANTMuGx.js +0 -1
  101. package/admin/assets/Import-CJgQwwNY.js +0 -1
  102. package/admin/assets/RulesEditor-BcGsf9n4.css +0 -1
  103. package/admin/assets/RulesEditor-PYpUIg7N.js +0 -1
  104. package/admin/assets/ScriptEditor-C6ekGK_v.js +0 -2
  105. package/admin/assets/ScriptEditorVanillaMonaco-BzazJaUa.js +0 -3
  106. package/admin/assets/_virtual_mf-localSharedImportMap___mfe_internal__iobroker_javascript__mf_owner__1-CL_S1FIh.js +0 -1
  107. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-BAOcdAz5.js +0 -1243
  108. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-DdX5BXjB.js +0 -9
  109. package/admin/assets/aiPromptBuilder-a2bvj40X.js +0 -1
  110. package/admin/assets/cronHoverProvider-COaB74MF.js +0 -2
  111. package/admin/assets/field_cron-BkiRQvy7.js +0 -1
  112. package/admin/assets/field_oid-pEOMkwS7.js +0 -1
  113. package/admin/assets/field_script-D8TaeXTc.js +0 -1
  114. package/admin/assets/index-4M2aGX3M.js +0 -871
  115. package/admin/assets/inlineChatWidget-CmSJN0Rv.js +0 -2
  116. package/admin/assets/stateHoverProvider-g3dqXZ8K.js +0 -9
  117. package/admin/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__iobroker_javascript__remoteEntry_js-Dc9L2TVn.js +0 -1
  118. package/admin/custom/assets/Components-uxORfFYU.js +0 -1
  119. package/admin/custom/assets/_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1-Bd9Y-jyc.js +0 -1
  120. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-BGJv4zZP.js +0 -1
  121. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_emotion_mf_1_styled__loadShare__.js-B4E6MFJ4.js +0 -1
  122. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DMefPDeL.js +0 -1243
  123. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-D81YCXgE.js +0 -1494
  124. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare__leaflet__loadShare__.js-n2zIPi0L.js +0 -1
  125. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-CxkJmLDG.js +0 -9
  126. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__prebuild__date_mf_2_fns__prebuild__-BNLW3sTg.js +0 -1
  127. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__prebuild__leaflet__prebuild__-BeF0jEWM.js +0 -1
  128. package/admin/custom/assets/index-CHg-uG3r.js +0 -1
  129. package/admin/custom/assets/setYear-Dhce8K9j.js +0 -1
  130. package/admin/custom/assets/virtualExposes-DUFP2Erj.js +0 -1
  131. package/admin/custom/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-jnBHXUID.js +0 -1
package/build/types.d.ts CHANGED
@@ -48,6 +48,11 @@ export interface JavaScriptAdapterConfig {
48
48
  gptKey: string;
49
49
  gptBaseUrl: string;
50
50
  gptBaseUrlKey: string;
51
+ /**
52
+ * `reasoning_effort` for the OpenAI-compatible providers. Empty means the parameter is not sent
53
+ * at all and the endpoint decides - which is what a reasoning model behind a proxy wants.
54
+ */
55
+ aiReasoningEffort?: '' | 'none' | 'minimal' | 'low' | 'medium' | 'high';
51
56
  claudeKey: string;
52
57
  geminiKey: string;
53
58
  deepseekKey: string;
@@ -59,6 +64,14 @@ export interface JavaScriptAdapterConfig {
59
64
  credentialIdDeepseekKey?: string;
60
65
  credentialIdGptBaseUrlKey?: string;
61
66
 
67
+ /**
68
+ * Whether the type definitions of Node.js, ioBroker and the configured libraries are read at
69
+ * start. They are only needed for the autocompletion of the built-in editor and to type-check
70
+ * TypeScript scripts - an instance that runs plain JavaScript and is edited elsewhere can do
71
+ * without them. Missing (older configuration) means "load them".
72
+ */
73
+ loadTypings?: boolean;
74
+
62
75
  // TypeScript compiler options for the user scripts
63
76
  tsTarget?: TsTarget;
64
77
  tsStrict?: boolean;
package/io-package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "javascript",
4
- "version": "10.1.3",
4
+ "version": "10.2.0",
5
5
  "blockedVersions": [
6
6
  "8.0.0",
7
7
  "8.0.1"
@@ -40,6 +40,32 @@
40
40
  "Matthias Kleine <info@haus-automatisierung.com>"
41
41
  ],
42
42
  "news": {
43
+ "10.2.0": {
44
+ "en": "Rules: an empty \"and\" band folds down to its heading. A rule without conditions runs its actions on every trigger, but that band was still the tallest thing in the rule - a drop area with a 64px floor, the \"just check\" selector and an \"or\" row per group, 292px for nothing. It is 41px now and says \"without condition\", clicking the heading opens it again, dragging a condition over it opens it by itself, and a band that has conditions in it never folds\nRules: the block palette takes half the room it did. An entry carried 24px of padding around a 30px icon, which left 66px of sidebar for one line of text - so four blocks filled the whole height and everything else was behind a scrollbar. Entries are 31px apart now, the icon-only tabs above them no longer reserve the height of a label they do not have, and the sidebar is 168px instead of 200px wide. A name too long for that gets the full text as its tooltip. The button that folds the palette away also sits on the palette's line now instead of one pixel to the left of it, where it hung over the edge of the window once the palette was folded away\nRules: picking the state of a trigger took the editor down with \"n.replace is not a function\" when a condition on a string state had no value entered yet. Choosing a state compiles the whole rule again, and the empty value arrived at the comparison as the boolean `false`. A condition without a value now compares against an empty text, and a number entered for a state that is a string is used as its text\nThe script editor now tells the adapter every 10 seconds that it is open, and the adapter keeps the type definitions and the compiler hot while that is the case, so saving a script does not wait for them to be built again. 30 seconds after the last sign of life the GUI counts as gone and everything is given back - about 100 MB. A tab in the background does not count as open, so a forgotten browser tab cannot keep the memory alive for days (#2373)\nThe type definitions of Node.js, ioBroker and the configured libraries were read at every start, whether anything wanted them or not. Only two things do - compiling a TypeScript script and the built-in editor - and they add about 90 MB to the compiler, so they are now read when one of those actually asks. An instance that runs plain JavaScript and is edited elsewhere (mirror directory, external editor) never reads them; the declarations of global JavaScripts are generated without them and come out the same. They can also be switched off for good (\"Load type definitions\", TypeScript tab) - the editor then loses its autocompletion and TypeScript scripts no longer compile, which the adapter warns about in the log (#2373)\nEvery instance kept two TypeScript language services alive whether it needed them or not, and each one held on to about 95 MB once it had compiled anything. They are now built on the first compilation only, and the declarations of global JavaScripts are stored on the script object the same way compiled TypeScript sources already were - so a restart no longer regenerates them. What a language service does end up building is released again a minute after the last compilation and rebuilt on demand. On a test system this took an instance from 241 MB to 127 MB heap (352 MB to 233 MB RSS) (#2373)\nThe helpers that the script editor draws on its own - the \"Explain / Refactor / Test\" row above every function, the tooltips for object IDs and CRON expressions, and the inline code suggestions - can be switched off. The instance setting \"Show AI helpers in the script editor\" (AI settings) does it; it is on by default, so nothing changes for anyone who is happy with them. `Alt+I` still shows the value of the object ID under the cursor when they are off\nThe reasoning of an OpenAI-compatible endpoint was switched off unconditionally: `reasoning_effort: \"none\"` went out with every request as soon as a custom base URL was configured. That is right for a small local model and wrong for everything else - behind a proxy it turns off the reasoning of the very model one is paying for, or is rejected. It is a setting now (\"Reasoning effort\"), and the default leaves the parameter out and lets the endpoint decide\nThe AI editor told the adapter how long it was willing to wait, and the adapter never read it: a stuck inline completion held its slot for the full ten minutes instead of the fifteen seconds it asked for\nThe inline completion took the model chosen in the AI chat but picked the provider itself, so a model of one provider could be requested with the credentials and at the endpoint of another. Model and provider are now remembered and used together\nWhen two providers offer a model of the same name - a proxy and the vendor behind it, for instance - which of them served it was decided by whichever answered first, and could change from one reload to the next. The provider configured first wins now, so the direct route is preferred over a proxy",
45
+ "de": "Regeln: Ein leeres „Und“ -Band klappt nach unten. Eine Regel ohne Bedingungen führt ihre Aktionen bei jedem Auslöser aus, aber das Band war immer noch am höchsten — ein Drop-Bereich mit 64 Pixeln, „Just check“ -Selektor und „oder“ -Reihe pro Gruppe, 292 px umsonst. Es ist jetzt 41 Pixel groß und sagt „ohne Bedingung“. Ein Klick auf die Überschrift öffnet sie erneut, und ein Band mit Bedingungen klappt nie.\nRegeln: Die Blockpalette nimmt halb so viel Platz ein. Ein Eintrag war 24 px rund um ein 30-Pix-Symbol, sodass 66 px Seitenleiste für eine Textzeile übrig waren — vier Blöcke füllten die ganze Höhe und alles andere war hinter einer Scrollleiste. Die Einträge sind jetzt 31 Pixel auseinander, die Tabs über ihnen haben keine Labelhöhe mehr und die Seitenleiste ist 168 Pixel statt 200 Pixel breit. Ein zu langer Name hat den Volltext als Tooltip. Die Schaltfläche zum Einklappen der Palette befindet sich jetzt auch auf der Linie der Palette und nicht ein Pixel links davon, wo sie nach dem Zusammenklappen über dem Fensterrand hing\nRegeln: Wenn der Status eines Triggers noch kein Wert eingegeben wurde, sagte der Editor „n.replace ist keine Funktion“. Wenn Sie ein Bundesland wählen, wird die Regel erneut kompiliert, und der leere Wert ergab den booleschen Wert Eine Bedingung ohne Wert wird nun mit leerem Text verglichen, und als Text wird eine Zahl für ein Bundesland verwendet\nDer Skripteditor teilt dem Adapter nun alle 10 Sekunden mit, dass er geöffnet ist, und hält dabei die Typdefinitionen und den Compiler heiß. Das Speichern eines Skripts wartet nicht, bis es neu erstellt wird. 30 Sekunden nach dem letzten Lebenszeichen gilt die GUI als weg und alles wird zurückgegeben — etwa 100 MB. Ein Tab im Hintergrund gilt nicht als geöffnet, ein vergessener Browser-Tab hält ihn tagelang fest (#2373)\nDie Typdefinitionen von Node.js, ioBroker und die konfigurierten Bibliotheken wurden bei jedem Start gelesen. Nur zwei Dinge tun das — ein TypeScript-Skript und der eingebaute Editor — und sie erhöhen den Compiler um 90 MB, sodass sie gelesen werden, wenn einer fragt. Eine Instanz, die reines JavaScript ausführt und woanders bearbeitet wird (Spiegelverzeichnis, externer Editor), liest sie nie. Die Deklarationen globaler JavaScripts werden ohne sie generiert. Sie sind auch endgültig abschaltbar („Load Type Definitions“, Tab TypeScript) — dann verliert der Editor seine Autokomplettierung und TypeScript-Skripte kompilieren nicht mehr, wovor der Adapter warnt (#2373)\nJede Instanz hielt zwei TypeScript-Sprachdienste am Leben, ob nötig oder nicht, und jede hielt etwa 95 MB, nachdem sie etwas kompiliert hatte. Sie basieren jetzt nur auf der ersten Compilierung und globale JavaScript-Deklarationen werden im Skriptobjekt gespeichert, so dass sie bei einem Neustart nicht mehr neu generiert werden. Was ein Sprachdienst baut, wird eine Minute nach der letzten Compilation erneut veröffentlicht. Auf einem Testsystem waren es 241 MB auf 127 MB Heap (352 MB bis 233 MB RSS) (#2373)\nDie vom Skripteditor selbst erstellten Helfer — die Zeile „Explain/Refactor/Test“ über jeder Funktion, Tooltips für Objekt-IDs und CRON-Ausdrücke und Inline-Codevorschläge — können abgeschaltet werden. Die Instanzeinstellung „Zeige KI-Helfer im Skripteditor“ (AI-Einstellungen) tut das. Sie ist standardmäßig aktiviert, also ändert sich nichts. `Alt+I` zeigt auch bei ausgeschaltetem Cursor den Wert der Objekt-ID\nDie Logik eines OpenAI-fähigen Endpunkts wurde bedingungslos abgeschaltet: `reasoning_effort: „none\"` ging bei jeder Anfrage raus, sobald eine benutzerdefinierte Basis-URL konfiguriert war. Das stimmt für ein kleines Lokalmodell und falsch für alles andere. Hinter einem Proxy steht das Modell, für das man bezahlt, oder es wird abgelehnt. Es ist jetzt eine Einstellung („Argumentationsaufwand“), ohne Parameter und der Endpunkt entscheidet\nDer KI-Editor teilte dem Adapter mit, wie lange er bereit war zu warten, und der Adapter las ihn nie: Ein hängengebliebener Inline-Slot hielt die vollen zehn Minuten statt 15 Sekunden\nBeim Inline-Abschluss wurde das im KI-Chat gewählte Modell, aber der Anbieter selbst ausgewählt, sodass ein Modell mit den Zugangsdaten und am Ende eines anderen angefragt werden konnte. Modell und Anbieter werden nun gespeichert und genutzt\nWenn zwei Anbieter ein Modell mit dem gleichen Namen anbieten, z. B. einen Proxy und den Anbieter dahinter, entscheidet, wer zuerst antwortet, und kann von einem Reload zum nächsten wechseln. Der erste Anbieter gewinnt jetzt, der direkte Weg wird einem Proxy vorgezogen",
46
+ "ru": "Правила: пустая полоса «и» сворачивается к заголовку. Правило без условий срабатывает при каждом триггере, но эта полоса всё равно оставалась самой высокой в правиле — зона выпадения с полом размером 64 пикселя, селектор «просто галочка» и строка «или» на группу, 292 пикселя даром. Теперь оно составляет 41 пиксель и написано «без условий», при нажатии на заголовок оно снова открывается, при перетаскивании условия оно открывается само по себе, а полоса, в которой есть условия, никогда не сворачивается\nПравила: блочная палитра занимает вдвое меньше места, чем раньше. Значок размером 30 пикселей составлял 24 пикселя, в результате чего на одной строке текста оставалось 66 пикселей боковой панели. Таким образом, четыре блока заполнили всю высоту, а все остальное — за полосой прокрутки. Теперь расстояние между записями составляет 31 пиксель, а расположенные над ними вкладки, содержащие только значки, больше не сохраняют высоту метки, которой у них нет, а ширина боковой панели составляет 168 пикселей вместо 200 пикселей. При слишком длинном названии в виде всплывающей подсказки отображается полный текст. Кнопка, откидывающая палитру, теперь также находится на линии палитры, а не на одном пикселе слева от нее. Как только палитра была сложена, она висела над краем окна\nПравила: при выборе состояния триггера редактор выводил сообщение «n.replace is not a function», когда условие в строковом состоянии еще не было введено ни одного значения. При выборе состояния все правило снова компилируется, а пустое значение при сравнении выводится как логическое значение «false». Условие без значения теперь сравнивается с пустым текстом, а в качестве текста используется число, введенное для состояния, представляющего собой строку\nТеперь редактор сценариев сообщает адаптеру каждые 10 секунд о том, что он открыт, а определения типов и компилятор остаются в рабочем состоянии, поэтому сохранение скрипта не дожидается его повторной сборки. Через 30 секунд после появления последних признаков жизни графический интерфейс считается исчерпанным и все возвращено обратно — около 100 МБ. Вкладка в фоновом режиме не считается открытой, поэтому забытая вкладка браузера не сможет сохранить память в течение нескольких дней (#2373)\nОпределения типов Node.js, IOBroker и настроенных библиотек считывались при каждом запуске, независимо от того, хотели они того или нет. Только две вещи — компиляция сценария TypeScript и встроенного редактора — и они добавляют компилятору около 90 МБ, поэтому теперь они читаются, когда кто-то из них действительно запрашивает. Экземпляр, работающий под управлением обычного JavaScript и редактируемый в другом месте (зеркальный каталог, внешний редактор), никогда не читает их; объявления глобальных JavaScripts генерируются без них и получаются одинаковыми. Их также можно навсегда отключить («Загрузить определения типов», вкладка TypeScript) — в этом случае редактор теряет автозаполнение, а скрипты TypeScript перестают компилироваться, о чем адаптер предупреждает в журнале (#2373)\nВ каждом экземпляре две языковые службы TypeScript работали независимо от того, были ли они нужны или нет, и каждая из них после компиляции занимала около 95 МБ. Теперь они основаны только на первой компиляции, а объявления глобальных JavaScript хранятся в объекте сценария так же, как и скомпилированные исходники TypeScript, поэтому при перезапуске они больше не восстанавливаются. То, что в конечном итоге создает языковой сервис, снова публикуется через минуту после последней компиляции и перестраивается по запросу. В тестовой системе объем кучи в экземпляре составлял от 241 МБ до 127 МБ (с 352 МБ до 233 МБ в формате RSS) (#2373)\nПомощники, которые редактор сценариев использует самостоятельно — строку «Explain/Refactor/Test» над каждой функцией, всплывающие подсказки для идентификаторов объектов и выражений CRON, а также встроенные рекомендации по коду — можно отключить. Параметр экземпляра «Показать помощников искусственного интеллекта в редакторе сценариев» (настройки ИИ) работает; по умолчанию он включен, поэтому для всех, кому они нравятся, ничего не меняется. В выключенном режиме «Alt+I» по-прежнему отображается значение идентификатора объекта под курсором\nОбоснование наличия конечной точки, совместимой с OpenAI, было безоговорочно опровергнуто: `reasoning_effort: «none\"` отправлялось с каждым запросом, как только был настроен собственный базовый URL-адрес. Это верно для небольшой локальной модели и неправильно для всего остального: прокси-сервер отключает аргументы в пользу той самой модели, за которую вы платите, или отклоняется. Теперь это настройка («Усилия по обоснованию»), но по умолчанию этот параметр не используется, а решение остаётся за конечной точкой\nРедактор искусственного интеллекта сообщил адаптеру, сколько он готов ждать, но адаптер так и не прочитал его: из-за зависания в строке ввода слот удерживался целых десять минут, а не пятнадцать секунд, как того требовалось\nПри заполнении в интерактивном режиме использовалась модель, выбранная в чате с искусственным интеллектом, но выбирался сам поставщик, поэтому можно было запросить модель одного поставщика с учетными данными и на конечной точке другого. Теперь модель и провайдер запоминаются и используются вместе\nКогда два провайдера предлагают модель с одинаковым названием (например, прокси-сервер и поставщик, стоящий за ним), выбор того, кто из них обслужил, решал тот, кто ответил первым, и может меняться от одной перезагрузки к следующей. Теперь выигрывает тот провайдер, который настроил первым, поэтому предпочтение отдается прямому маршруту, а не прокси-серверу",
47
+ "pt": "Regras: uma faixa “e” vazia se dobra até o título. Uma regra sem condições executa suas ações em cada gatilho, mas essa faixa ainda era a mais alta: uma área de 64 px, o seletor “just check” e uma linha “ou” por grupo, 292 px à toa. Agora tem 41px e diz “sem condição”, clicar no título a abre novamente, arrastar uma condição sobre ela a abre sozinha, e uma faixa com condições nunca se dobra\nRegras: a paleta de blocos ocupa metade. Uma entrada tinha 24px de espaço em torno de um ícone de 30px, deixando 66px de barra lateral para uma linha de texto — então quatro blocos ocupavam toda a altura e rolavam. As entradas estão separadas por 31 px, as abas com ícones não têm mais a altura de um rótulo que não têm e a barra lateral tem 168 px em vez de 200 px. Um nome longo demais tem o texto completo como dica. O botão que dobra a paleta também fica na linha da paleta agora, em vez de um pixel à esquerda, onde ficava na borda da janela quando a paleta era dobrada.\nRegras: escolher o estado de um gatilho dizia “n.replace is not a function” quando uma condição em uma string ainda não tinha valor inserido. A escolha de um estado compila toda a regra e o valor vazio chegou à comparação como booleano `false`. Uma condição sem valor agora se compara a um texto vazio e um número inserido em uma string é usado como texto\nO editor de scripts agora informa ao adaptador a cada 10 segundos que ele está aberto, e o adaptador mantém as definições de tipo e o compilador ativos. Salvar um script não espera que ele seja reconstruído. 30 segundos após o último sinal de vida, a GUI é considerada perdida e tudo é devolvido - cerca de 100 MB. Uma aba no fundo não conta como aberta, então uma aba esquecida não mantém a memória viva por dias (#2373)\nAs definições de tipo de Node.js, IOBroker e das bibliotecas configuradas foram lidas sempre, querendo ou não. Apenas duas coisas — compilar um script TypeScript e um editor embutido — adicionam cerca de 90 MB ao compilador e agora são lidos quando alguém pede. Uma instância que executa JavaScript puro e é editada em outro lugar (diretório espelho, editor externo) nunca os lê; as declarações de JavaScripts globais são geradas sem elas e saem iguais. Eles também podem ser desativados para sempre (“Definições de tipo de carga”, guia TypeScript) - o editor perde o preenchimento automático e os scripts não são mais compilados, o que o adaptador avisa no log (#2373)\nCada instância mantinha dois serviços da linguagem TypeScript ativos, precisando ou não, e cada um tinha cerca de 95 MB após compilar algo. Agora, elas se baseiam apenas na primeira compilação e as declarações globais de JavaScript são armazenadas no objeto de script da mesma forma que as fontes compiladas do TypeScript. O que um serviço de linguagem cria é lançado um minuto após a última compilação e reconstruído sob demanda. Em um sistema de teste, isso levou de 241 MB a 127 MB de heap (352 MB a 233 MB RSS) (#2373)\nOs auxiliares que o editor de script usa sozinho — a linha “Explain/Refactor /Test” acima de cada função, as dicas para IDs de objetos e expressões CRON e as sugestões de código — podem ser desativados. A configuração de instância “Mostrar ajudantes de IA no editor de scripts” faz isso; ela está ativada por padrão, então nada muda para quem gosta deles. `Alt+I` ainda mostra o valor do ID do objeto sob o cursor quando desligado\nO raciocínio de um endpoint compatível com OpenAI era incondicional: `reasoning_effort: “none\"` saía com cada solicitação assim que um URL base customizado era configurado. Isso é certo para um modelo local pequeno e errado para todo o resto: por trás de um proxy, ele desativa o raciocínio do modelo pelo qual se paga ou é rejeitado. Agora é uma configuração (“Reasoning effort”), e o padrão exclui o parâmetro e deixa o endpoint decidir\nO editor de IA disse ao adaptador quanto tempo ele estava disposto a esperar e ele nunca o leu: um preenchimento em linha travado manteve o slot por dez minutos, em vez dos quinze segundos necessários\nO preenchimento em linha usou o modelo escolhido no chat de IA, mas escolheu o provedor em si, para solicitar o modelo de um provedor com as credenciais e no terminal de outro. Modelo e provedor agora são lembrados e usados juntos\nQuando dois provedores oferecem um modelo com o mesmo nome — um proxy e o fornecedor por trás dele — qual deles atendia, quem respondia primeiro e pode mudar de uma recarga para outra. O primeiro provedor vence agora, então a rota direta é preferida a um proxy",
48
+ "nl": "Regels: een lege „en” band kan naar beneden worden gevouwen tot aan de kop. Een regel zonder voorwaarden voert op elke trigger zijn acties uit, maar die band was nog steeds het grootste punt in de regel: een dropzone met een vloer van 64 px, de selector „even checken” en een rij „of” per groep, 292 px voor niets. Het is nu 41 px en er staat „zonder voorwaarde”. Als u op de kop klikt, wordt de toestand weer geopend, als u een voorwaarde eroverheen sleept, wordt deze vanzelf geopend, en een band met voorwaarden wordt nooit gevouwen\nRegels: het blokpalet neemt de helft van de ruimte in beslag. Een item bevatte 24 px opvulling rond een pictogram van 30 px, waardoor er 66 px aan zijbalk overbleef voor één regel tekst - dus vier blokken vulden de hele hoogte en al het andere zat achter een schuifbalk. De items staan nu 31 pixels uit elkaar, op de tabbladen met alleen pictogrammen erboven is niet langer de hoogte gereserveerd van een label dat ze niet hebben, en de zijbalk is 168 px in plaats van 200 px breed. Een naam die te lang is daarvoor, krijgt de volledige tekst als tooltip. De knop waarmee het palet wordt weggevouwen, bevindt zich nu ook op de lijn van het palet, in plaats van één pixel links ervan, waar hij boven de rand van het venster hing toen het palet was weggevouwen\nRegels: door de status van een trigger te kiezen, werd de editor uitgeschakeld met „n.replace is geen functie” toen er nog geen waarde was ingevoerd voor een voorwaarde op basis van een tekenreeks. Als u een staat kiest, wordt de hele regel opnieuw gecompileerd, en de lege waarde kwam tot de vergelijking als de booleaanse waarde `false`. Een voorwaarde zonder waarde wordt nu vergeleken met een lege tekst, en een getal dat is ingevoerd voor een staat, dat een tekenreeks is, wordt als tekst gebruikt\nDe scripteditor laat de adapter nu elke 10 seconden weten dat deze open is, en de adapter houdt de typedefinities en de compiler actief terwijl dat het geval is, dus als u een script opslaat, hoeft u niet te wachten tot ze opnieuw worden gebouwd. 30 seconden na het laatste teken van leven telt de GUI als verdwenen en wordt alles teruggegeven - ongeveer 100 MB. Een tabblad op de achtergrond telt niet als geopend, dus een vergeten browsertabblad kan de herinnering niet dagenlang levend houden (#2373)\nDe typedefinities van Node.js, IOBroker en de geconfigureerde bibliotheken werden bij elke start gelezen, of iemand ze nu wilde of niet. U kunt maar twee dingen doen: een TypeScript-script compileren en de ingebouwde editor, en ze voegen ongeveer 90 MB toe aan de compiler, zodat ze nu worden gelezen wanneer een van hen dat daadwerkelijk vraagt. In een exemplaar dat gewoon JavaScript draait en elders wordt bewerkt (mirror directory, externe editor) worden ze nooit gelezen; de declaraties van globale JavaScripts worden zonder JavaScript gegenereerd en komen op dezelfde manier uit. Ze kunnen ook voorgoed worden uitgeschakeld („Typedefinities laden”, tabblad TypeScript) - de editor wordt dan niet meer automatisch aangevuld en TypeScript-scripts worden niet meer gecompileerd, waarvoor de adapter waarschuwt in het logboek (#2373)\nElke instantie hield twee TypeScript-taaldiensten in leven, of ze nu nodig waren of niet, en elke service had een capaciteit van ongeveer 95 MB toen er iets was gecompileerd. Ze zijn nu alleen gebaseerd op de eerste compilatie, en de declaraties van wereldwijde JavaScripts worden op het scriptobject opgeslagen op dezelfde manier als de gecompileerde TypeScript-bronnen dat al deden, zodat ze na een herstart niet langer opnieuw worden gegenereerd. Wat een taaldienst uiteindelijk bouwt, wordt een minuut na de laatste compilatie opnieuw uitgebracht en op aanvraag opnieuw opgebouwd. Op een testsysteem duurde dit een heap van 241 MB naar 127 MB (352 MB tot 233 MB RSS) (#2373)\nDe helpers die de scripteditor zelf tekent - de rij „Explain/Refactor/Test” boven elke functie, de tooltips voor object-ID's en CRON-expressies, en de suggesties voor inline-code - kunnen worden uitgeschakeld. De instantie-instelling „AI-helpers weergeven in de scripteditor” (AI-instellingen) doet dit; de instelling is standaard ingeschakeld, dus er verandert niets voor iedereen die er tevreden mee is. In `Alt+I` wordt nog steeds de waarde van de object-ID onder de cursor weergegeven als ze uitgeschakeld zijn\nDe redenering van een OpenAI-compatibel eindpunt werd onvoorwaardelijk uitgeschakeld: `reasoning_effort: „none\"` werd bij elk verzoek verzonden zodra een aangepaste basis-URL was geconfigureerd. Dat is goed voor een klein lokaal model en verkeerd voor al het andere - achter een proxy wordt de redenering uitgeschakeld van het model waarvoor men betaalt, of dat wordt afgewezen. Het is nu een instelling („Reasoning effort”), en de standaardinstelling laat de parameter weg en laat het eindpunt beslissen\nDe AI-redacteur vertelde de adapter hoelang hij bereid was te wachten, en de adapter heeft hem nooit gelezen: een vastzittende inline-voltooiing hield de volledige tien minuten vast in plaats van de vijftien seconden waar hij om vroeg\nVoor de inline-voltooiing werd het model gebruikt dat werd gekozen in de AI-chat, maar de provider zelf, zodat een model van de ene provider kon worden aangevraagd met de inloggegevens en op het eindpunt van een andere provider. Model en provider worden nu onthouden en samen gebruikt\nAls twee providers een model met dezelfde naam aanbieden, bijvoorbeeld een proxy en de leverancier die erachter zit, werd besloten wie van hen bediende, door de persoon die het eerst werd geantwoord, en kon van de ene herlaadbeurt naar de andere worden overgeschakeld. De provider die als eerste is geconfigureerd wint nu, dus de directe route heeft de voorkeur boven een proxy",
49
+ "fr": "Règles : un bandeau vide se replie jusqu'au titre. Une règle sans conditions agit sur chaque déclencheur, mais cette bande était la plus haute de la règle : une zone de dépôt avec un sol de 64 pixels, le sélecteur « juste cocher » et une ligne « ou » par groupe, 292 pixels pour rien. Il fait 41 pixels maintenant et dit « sans condition ». Cliquez sur le titre pour l'ouvrir à nouveau, le faire glisser dessus l'ouvre tout seul, et une bande contenant des conditions ne se plie jamais\nRègles : la palette de blocs occupe la moitié de la place. Une entrée comportait 24 pixels de marge autour d'une icône de 30 pixels, soit 66 pixels de barre latérale pour une ligne de texte. Quatre blocs occupaient toute la hauteur et le reste était placé derrière une barre de défilement. Les entrées sont espacées de 31 pixels, les icônes situées au-dessus n'ont plus la même hauteur que les étiquettes, et la barre latérale mesure 168 pixels au lieu de 200 pixels. Un nom trop long affiche le texte intégral en infobulle. Le bouton qui replie la palette se trouve également sur la ligne de la palette, au lieu d'un pixel sur la gauche, où il pendait au-dessus du bord de la fenêtre une fois la palette pliée\nRègles : choisir l'état d'un déclencheur renvoyait l'éditeur avec « n.replace is not a function » alors qu'aucune valeur n'avait encore été saisie. Le choix d'un état recompile la règle complète, et la valeur vide est arrivée à la comparaison sous la forme booléenne « false ». Une condition sans valeur est désormais comparée à un texte vide, et un chiffre saisi pour un état qui est une chaîne est utilisé comme texte\nL'éditeur de script indique désormais à l'adaptateur toutes les 10 secondes qu'il est ouvert, et l'adaptateur garde les définitions de type et le compilateur à chaud. Enregistrer un script ne nécessite donc pas qu'il soit reconstruit. 30 secondes après le dernier signe de vie, l'interface graphique est considérée comme perdue et tout est rendu, soit environ 100 Mo. Un onglet en arrière-plan n'est pas considéré comme ouvert, donc un onglet oublié ne peut pas le garder en mémoire (#2373)\nLes définitions de type de Node.js, IObroker et des bibliothèques configurées étaient lues à chaque démarrage, que cela soit voulu ou non. Il n'y a que deux choses à faire : compiler un script TypeScript et l'éditeur intégré. Ils ajoutent environ 90 Mo au compilateur. Ils sont donc lus dès que l'un d'eux le demande. Une instance qui exécute du JavaScript et qui est modifiée ailleurs (répertoire miroir, éditeur externe) ne les lit jamais ; les déclarations des JavaScript globaux sont générées sans elles et sortent identiques. Ils peuvent aussi être définitivement désactivés (« Charger les définitions de type », onglet TypeScript). L'éditeur perd alors son autocomplétion et les scripts TypeScript ne sont plus compilés, comme l'adaptateur le signale dans le log (#2373)\nChaque instance maintenait deux services linguistiques TypeScript actifs, qu'elle en ait besoin ou non, et chacune conservait environ 95 Mo une fois compilé. Ils ne sont créés que sur la première compilation, et les déclarations des scripts globaux sont stockées dans l'objet de script, de la même manière que les sources TypeScript compilées. Un redémarrage ne les régénère plus. What a language service does end up est réédité une minute après la dernière compilation et reconstruit à la demande. Sur un système de test, il a passé de 241 Mo à 127 Mo (352 Mo à 233 Mo de RSS) (#2373)\nLes aides créées par l'éditeur de script lui-même (la ligne « Expliquer/Refactor/Test » au-dessus de chaque fonction, les info-bulles pour les ID d'objets et les expressions CRON et les suggestions de code en ligne) peuvent être désactivées. Le paramètre d'instance « Afficher les assistants IA dans l'éditeur de script » (paramètres d'IA) le fait ; il est activé par défaut, donc rien ne change pour les satisfaits. `Alt+I` affiche toujours la valeur de l'ID de l'objet sous le curseur éteint\nLe raisonnement d'un point de terminaison compatible avec OpenAI a été désactivé : « reasoning_effort : « none » est envoyé à chaque demande dès qu'une URL de base personnalisée a été configurée. C'est bien pour un petit modèle local et c'est faux pour tout le reste. Un proxy désactive le raisonnement du modèle même pour lequel on paie, ou il est rejeté. C'est un réglage maintenant (« Effort de raisonnement »), et par défaut, c'est le point final qui décide\nL'éditeur d'IA a indiqué à l'adaptateur combien de temps il était prêt à attendre, mais celui-ci ne l'a jamais lu : une page bloquée a tenu sa place pendant dix minutes au lieu des quinze secondes demandées\nLa saisie en ligne a pris le modèle choisi dans le chat IA, mais le fournisseur lui-même. Ainsi, le modèle d'un fournisseur pouvait être demandé avec les informations d'identification et un autre. Le modèle et le fournisseur sont désormais mémorisés\nLorsque deux fournisseurs proposent un modèle du même nom, un proxy et le fournisseur qui le propose, par exemple, celui qui le proposait était décidé en premier, et pouvait changer d'un rechargement à l'autre. Le fournisseur configuré First gagne, donc la route directe est préférée à un proxy",
50
+ "it": "Regole: una banda «e» vuota si piega fino al titolo. Una regola senza condizioni agisce su ogni trigger, ma quella banda era comunque la più alta della regola: un'area di caduta con 64 px, selettore «just check» e una riga «o» per gruppo, 292 px. Ora è di 41 px e dice «senza condizioni», facendo clic sul titolo si apre di nuovo, trascinando una condizione si apre da sola e una banda con condizioni non si piega mai\nRegole: la palette occupa metà dello spazio. Una voce aveva 24 px di padding su un'icona di 30 px, con 66 px di barra laterale per una riga di testo, quattro blocchi e tutto il resto dietro una barra di scorrimento. Le voci ora distano 31 px, le schede con sole icone non hanno più l'altezza di un'etichetta che non hanno e la barra laterale è larga 168 px invece di 200 px. Un nome troppo lungo per avere il testo completo. Il pulsante che ripiega la palette ora si trova anche sulla linea della palette invece di un pixel a sinistra, dove era appeso sul bordo della finestra\nRegole: selezionando lo stato di un trigger, l'editor ha digitato «n.replace is not a function» se una condizione in una stringa non era ancora valida. La scelta di uno stato ricompila l'intera regola e il valore vuoto è booleano `false`. Una condizione senza valore ora si confronta con un testo vuoto e come testo si usa un numero immesso per uno stato che è una stringa\nL'editor di script ora dice all'adattatore ogni 10 secondi che è aperto e mantiene le definizioni dei tipi e il compilatore attivi finché è così, quindi salvare uno script non aspetta che vengano ricreati. 30 secondi dopo l'ultimo segno di vita la GUI conta come sparita e tutto viene restituito: circa 100 MB. Una scheda in background non è aperta, quindi una scheda dimenticata non può durare giorni (#2373)\nLe definizioni dei tipi di Node.js, IOBroker e le librerie configurate venivano lette ad ogni avvio, che lo volesse o no. Solo due cose, compilare uno script TypeScript e l'editor integrato, aggiungono circa 90 MB al compilatore, quindi ora vengono letti quando uno lo chiede. Un'istanza in JavaScript semplice e modificata altrove (mirror directory, editor esterno) non li legge mai; le dichiarazioni di JavaScript globali sono generate senza di esse e sono uguali. Possono anche essere disattivati per sempre («Load type definition», scheda TypeScript): l'editor perde l'autocompletamento e gli script TypeScript non vengono più compilati, cosa che l'adattatore avvisa nel log (#2373)\nOgni istanza manteneva attivi due servizi TypeScript, che ne avesse bisogno o meno, e ognuno conteneva circa 95 MB dopo aver compilato qualcosa. Ora si basano solo sulla prima compilazione e le dichiarazioni dei JavaScript globali sono archiviate nell'oggetto script come già i sorgenti TypeScript compilati, quindi un riavvio non li rigenera più. Ciò che un servizio linguistico crea viene rilasciato un minuto dopo l'ultima compilazione e ricostruito su richiesta. Su un sistema di test ci sono voluti da 241 MB a 127 MB heap (da 352 MB a 233 MB RSS) (#2373)\nGli helper che l'editor di script utilizza da solo, la riga «Explan/Refactor/Test» sopra ogni funzione, i tooltip per ID oggetto ed espressioni CRON e il codice in linea, possono essere disattivati. L'impostazione «Mostra aiutanti AI nell'editor di script» (impostazioni AI) lo fa; è attiva di default, quindi non cambia nulla per chi ne è soddisfatto. `Alt+I` mostra ancora il valore dell'ID oggetto quando sono spenti\nLa logica di un endpoint compatibile con OpenAI è stata disattivata incondizionatamente: «none» è uscito con ogni richiesta non appena è stato configurato un URL di base personalizzato. È giusto per un piccolo modello locale e sbagliato per tutto il resto: dietro un proxy spegne il ragionamento del modello per cui si paga o viene rifiutato. Ora è un'impostazione («Reasoning effort») e di default omette il parametro e decide l'endpoint\nL'editor AI ha detto all'adattatore quanto era disposto ad aspettare e l'adattatore non l'ha mai letto: un completamento in linea bloccato è durato dieci minuti invece dei quindici richiesti\nIl completamento in linea ha utilizzato il modello scelto nella chat AI ma il provider stesso, quindi richiederne uno con le credenziali e l'endpoint di un altro. Modello e fornitore sono ora ricordati e usati insieme\nQuando due provider offrono un modello con lo stesso nome, un proxy e il fornitore dietro, ad esempio, chi lo ha fornito è deciso per primo e può passare da una ricarica all'altra. Il provider configurato per primo vince ora, quindi preferisce il proxy",
51
+ "es": "Reglas: una banda vacía con «y» se dobla hasta su título. Una regla sin condiciones ejecuta sus acciones en cada activación, pero esa banda seguía siendo la más alta de la regla: un área desplegable con un suelo de 64 píxeles, el selector de «solo comprobar» y una fila «o» por grupo, 292 píxeles para nada. Ahora mide 41 píxeles y dice «sin condiciones». Al hacer clic en el encabezado, se abre de nuevo, al arrastrar una condición, se abre sola y una banda con condiciones nunca se dobla\nReglas: la paleta de bloques ocupa la mitad. Una entrada tenía 24 píxeles de relleno alrededor de un icono de 30 píxeles, lo que dejaba 66 píxeles en la barra lateral para una línea de texto. Cuatro bloques llenaban toda la altura y todo lo demás detrás de una barra de desplazamiento. Las entradas están separadas por 31 píxeles, las pestañas de solo iconos ya no tienen el alto de una etiqueta que no tienen y la barra lateral mide 168 píxeles en lugar de 200 píxeles. Un nombre demasiado largo para eso tiene el texto completo. El botón que dobla la paleta también está ahora en la línea de la paleta, en lugar de un píxel a la izquierda, donde colgaba del borde de la ventana una vez doblada la paleta\nReglas: al elegir el estado de un disparador, el editor decía «n.replace no es una función» cuando una condición del estado de la cadena aún no tenía ningún valor. Al elegir un estado, se vuelve a compilar toda la regla y el valor vacío llegó a la comparación como el booleano «falso». Una condición sin valor ahora se compara con un texto vacío y se utiliza como texto un número introducido para un estado, es decir, una cadena\nEl editor de guiones ahora le dice al adaptador cada 10 segundos que está abierto y mantiene las definiciones de tipos y el compilador activos, por lo que guardar un guion no espera a que se vuelva a crear. 30 segundos después de la última señal de vida, la GUI cuenta como agotada y todo se devuelve, unos 100 MB. Una pestaña en segundo plano no cuenta como abierta, por lo que olvidar no puede mantener la memoria viva durante días (#2373)\nLas definiciones de tipos de Node.js, IOBroker y las bibliotecas configuradas se leían al principio, tanto si algo las quería como si no. Solo hay dos cosas, compilar un guion de TypeScript y el editor integrado, y añaden unos 90 MB al compilador, por lo que ahora se leen cuando uno de esos pregunta. Una instancia que ejecuta JavaScript simple y se edita en otro lugar (directorio espejo, editor externo) nunca los lee; las declaraciones de los JavaScript globales se generan sin ellos y salen igual. También se pueden desactivar definitivamente («Cargar definiciones de tipos», pestaña TypeScript). El editor pierde su autocompletado y los guiones de TypeScript ya no se compilan, lo que el adaptador avisa en el registro (#2373)\nCada instancia mantuvo activos dos servicios lingüísticos de TypeScript, los necesitara o no, y cada uno conservó unos 95 MB una vez compilado algo. Ahora se basan únicamente en la primera compilación y las declaraciones de los JavaScript globales se almacenan en el objeto de script de la misma manera que ya lo hacían las fuentes de TypeScript compiladas, por lo que al reiniciarlas ya no las regenera. Lo que un servicio lingüístico acaba creando se publica de nuevo un minuto después del último recopilatorio y se reconstruye a pedido. En un sistema de prueba, una instancia pasó de 241 MB a 127 MB (352 MB a 233 MB RSS) (#2373)\nLos ayudantes que el editor de guiones dibuja por sí solo (la fila «Explicar/Refactor/Probar» sobre cada función, la información de los ID de objetos y las expresiones CRON y las sugerencias de código en línea) se pueden desactivar. El ajuste de instancia «Mostrar ayudantes de IA en el editor de guiones» (ajustes de IA) lo hace; está activado por defecto, así que nada cambia para quien esté contento con ellos. `Alt+I` sigue mostrando el valor del ID del objeto bajo el cursor cuando está desactivado\nEl razonamiento de un punto final compatible con OpenAI se desactivó incondicionalmente: `reasoning_effort: «ninguna» en cada solicitud tan pronto como se configuró una URL base personalizada. Eso es correcto para un modelo local pequeño e incorrecto para todo lo demás. Detrás de un poder se desactiva el razonamiento del mismo modelo por el que se paga o se rechaza. Ahora es un ajuste («Esfuerzo de razonamiento») y por defecto omite el parámetro y deja que el punto final decida\nEl editor de IA le dijo al adaptador cuánto tiempo estaba dispuesto a esperar y el adaptador nunca lo leyó: un atasco al completar en línea mantuvo su espacio durante diez minutos en lugar de los quince segundos que pedía\nLa finalización en línea tomó el modelo elegido en el chat de IA, pero eligió el propio proveedor, por lo que se pudo solicitar el modelo de un proveedor con las credenciales y en el extremo de otro. El modelo y el proveedor ahora se recuerdan y se usan juntos\nCuando dos proveedores ofrecen un modelo con el mismo nombre (un proxy y el proveedor detrás, por ejemplo) cuál de ellos sirve, lo decide el que responde primero y puede cambiar de una recarga a otra. El proveedor configurado primero gana ahora, por lo que se prefiere la ruta directa a un proxy",
52
+ "pl": "Zasady: pusty pasek „i” składa się do nagłówka. Reguła bez warunków uruchamia swoje działania na każdym wyzwalaczu, ale to pasmo nadal było najwyższym elementem reguły - obszar upuszczania z podłogą 64px, selektorem „po prostu sprawdź” i wierszem „lub” na grupę, 292 pikseli za darmo. Ma teraz 41 pikseli i mówi „bez warunku”, kliknięcie nagłówka otwiera go ponownie, przeciągnięcie warunku otwiera go samoistnie, a pasmo, które ma w sobie warunki, nigdy się nie składa\nZasady: paleta bloków zajmuje połowę miejsca, które zrobiła. Wpis zawierał 24px wypełnienia wokół ikony 30 pikseli, która pozostawiła 66 pikseli paska bocznego dla jednej linii tekstu - więc cztery bloki wypełniały całą wysokość, a wszystko inne znajdowało się za paskiem przewijania. Wpisy są teraz oddalone od siebie o 31 pikseli, zakładki tylko ikony nad nimi nie zastrzegają już wysokości etykiety, której nie mają, a pasek boczny ma szerokość 168 pikseli zamiast 200 pikseli. Nazwa zbyt długa na to otrzymuje pełny tekst jako podpowiedź. Przycisk, który składa paletę, znajduje się teraz na linii palety zamiast jednego piksela po lewej stronie, gdzie wisiał nad krawędzią okna po złożeniu palety\nReguły: wybranie stanu wyzwalacza spowodowało usunięcie edytora z „n.replace is not a function”, gdy warunek stanu łańcucha nie miał jeszcze wprowadzonej wartości. Wybór stanu ponownie kompiluje całą regułę, a pusta wartość dotarła do porównania jako logiczna „fałsz”. Warunek bez wartości porównuje się teraz z pustym tekstem, a liczba wprowadzona dla stanu będącego ciągiem jest używana jako jego tekst\nEdytor skryptów informuje teraz adapterowi co 10 sekund, że jest otwarty, a adapter zachowuje definicje typów i kompilator na gorąco, podczas gdy tak jest, więc zapisanie skryptu nie czeka na ich ponowne zbudowanie. 30 sekund po ostatnim znaku życia GUI liczy się jako zniknął i wszystko jest oddane - około 100 MB. Karta w tle nie jest liczona jako otwarta, więc zapomniana karta przeglądarki nie może utrzymać pamięci przy życiu przez wiele dni (#2373)\nDefinicje typów Node.js, ioBroker i skonfigurowanych bibliotek były odczytywane na każdym początku, niezależnie od tego, czy cokolwiek ich chciało, czy nie. Robią się tylko dwie rzeczy - skompilowanie skryptu TypeScript i wbudowany edytor - i dodają około 90 MB do kompilatora, więc są teraz odczytywane, gdy jeden z nich faktycznie poprosi. Instancja, która uruchamia zwykły JavaScript i jest edytowana gdzie indziej (katalog lustrzany, edytor zewnętrzny) nigdy ich nie czyta; deklaracje globalnych JavaScript są generowane bez nich i wychodzą tak samo. Można je również wyłączyć na dobre („Definicje typów obciążenia”, karta TypeScript) - edytor traci wtedy automatyczne uzupełnianie i skrypty TypeScript przestają się kompilować, o czym adapter ostrzega w dzienniku (#2373)\nKażda instancja utrzymywała przy życiu dwie usługi językowe TypeScript, niezależnie od tego, czy ich potrzebowała, czy nie, a każda z nich utrzymywała około 95 MB po skompilowaniu czegokolwiek. Są one teraz zbudowane tylko na pierwszej kompilacji, a deklaracje globalnych skryptów JavaScript są przechowywane w obiekcie skryptu w taki sam sposób, w jaki były już skompilowane źródła TypeScript - więc ponowne uruchomienie ich nie regeneruje. To, co tworzy usługa językowa, zostaje ponownie wydana minutę po ostatniej kompilacji i odbudowana na żądanie. W systemie testowym zajęło to instancję od 241 MB do 127 MB sterty (352 MB do 233 MB RSS) (#2373)\nPomocnicy, których edytor skryptów rysuje samodzielnie - wiersz „Wyjaśnij/ Refactor/Test” nad każdą funkcją, podpowiedzi dla identyfikatorów obiektów i wyrażeń CRON oraz sugestie kodu wbudowanego - można wyłączyć. Ustawienie instancji „Pokaż pomocników AI w edytorze skryptów” (ustawienia AI) robi to; jest domyślnie włączone, więc nic się nie zmienia dla każdego, kto jest z nich zadowolony. `Alt+I` nadal pokazuje wartość identyfikatora obiektu pod kursorem, gdy są wyłączone\nRozumowanie punktu końcowego zgodnego z OpenAI zostało wyłączone bezwarunkowo: `rationing_esforç: „none\"` wychodziło z każdym żądaniem, gdy tylko skonfigurowano niestandardowy bazowy adres URL. Jest to właściwe dla małego modelu lokalnego i złe dla wszystkiego innego - za proxy wyłącza rozumowanie samego modelu, za który się płaci lub jest odrzucony. Jest to ustawienie teraz („Wysiłek rozumowania”), a domyślny parametr pozostawia poza nim i pozwala punktowi końcowi decydować\nEdytor AI powiedział adapterowi, jak długo chce czekać, a adapter nigdy go nie odczytał: zablokowane ukończenie w linii utrzymywało jego gniazdo przez pełne dziesięć minut zamiast piętnaście sekund, o które prosił\nUkończenie wbudowane obejmowało model wybrany na czacie AI, ale wybrało samego dostawcę, więc model jednego dostawcy można było zażądać z poświadczeniami i w punkcie końcowym innego. Model i dostawca są teraz zapamiętywane i używane razem\nKiedy dwóch dostawców oferuje model o tej samej nazwie - na przykład proxy i sprzedawca, który za nim stoi - który z nich obsługiwał, decyduje kto z nich odpowiedział jako pierwszy i może zmienić się z jednego przeładowania na następne. Dostawca skonfigurowany jako pierwszy wygrywa teraz, więc bezpośrednia trasa jest preferowana niż proxy",
53
+ "uk": "Правила: порожня смуга «і» складається до свого заголовка. Правило без умов виконує свої дії на кожному тригері, але ця смуга все ще була найвищою річчю в правилі - область падіння з підлогою 64 пікселів, селектор «просто перевірити» та рядок «або» на групу, 292px даремно. Зараз він 41 піксель і говорить «без умови», натискання заголовка знову відкриває його, перетягування умови відкриває його сама, а смуга, яка має умови, ніколи не згортається\nПравила: блокова палітра займає половину кімнати, яку вона зробила. Запис містив 24 пікселі підкладки навколо піктограми 30 пікселів, яка залишила 66 пікселів бічної панелі для одного рядка тексту - тому чотири блоки заповнювали всю висоту, а все інше було за смугою прокрутки. Тепер записи знаходяться на відстані 31 пікселів один від одного, вкладки, що містять лише піктограми над ними, більше не резервують висоту мітки, яку вони не мають, а бічна панель має ширину 168 пікселів замість 200 пікселів. Назва, занадто довга для цього, отримує повний текст як підказку. Кнопка, яка складається палітру, також знаходиться на лінії палітри тепер замість одного пікселя зліва від неї, де вона висіла над краєм вікна, коли палітра була складена\nПравила: вибір стану тригера знизив редактор з «n.replace не є функцією», коли умова стану рядка ще не ввела значення. Вибір стану повторно компілює все правило, і порожнє значення прийшло до порівняння як булеве `false`. Умова без значення тепер порівнюється з порожнім текстом, а число, введене для стану, який є рядком, використовується як його текст\nТепер редактор сценаріїв повідомляє адаптеру кожні 10 секунд, що він відкритий, а адаптер зберігає визначення типів та компілятор гарячими, поки це так, тому збереження сценарію не чекає їх повторного створення. Через 30 секунд після останньої ознаки життя графічний інтерфейс вважається минулим, і все повертається - близько 100 Мб. Вкладка у фоновому режимі не вважається відкритою, тому забута вкладка браузера не може зберегти пам'ять живою протягом кількох днів (#2373)\nВизначення типів Node.js, IObroker та налаштованих бібліотек читалися при кожному запуску, незалежно від того, хотілося б щось їх чи ні. Виконуються лише дві речі - компіляція сценарію TypeScript та вбудований редактор - і вони додають близько 90 Мб до компілятора, тому тепер вони читаються, коли хтось із них насправді запитає. Екземпляр, який виконує простий JavaScript і редагується в іншому місці (дзеркальний каталог, зовнішній редактор), ніколи не читає їх; оголошення глобальних JavaScript генеруються без них і виходять однаковими. Їх також можна вимкнути назавжди («Визначення типів завантаження», вкладка TypeScript) - редактор потім втрачає автодоповнення, і сценарії TypeScript більше не компілюються, про що адаптер попереджає в журналі (#2373)\nКожен екземпляр підтримував дві мовні служби TypeScript живими незалежно від того, потрібні вони їм чи ні, і кожна з них зберігала близько 95 МБ після того, як вона щось зібрав. Тепер вони побудовані лише на першій компіляції, а оголошення глобальних JavaScripts зберігаються на об'єкті сценарію так само, як вже були скомпільовані джерела TypeScript - тому перезапуск більше не відновлює їх. Те, що в кінцевому підсумку створює мовна служба, знову випускається через хвилину після останньої компіляції та перебудовується на вимогу. У тестовій системі це зайняло екземпляр від 241 МБ до 127 МБ купи (352 МБ до 233 МБ RSS) (#2373)\nДопомічники, які редактор сценаріїв малює самостійно - рядок «Explicate/Refactor/Test» над кожною функцією, підказки для ідентифікаторів об'єктів та виразів CRON та вбудовані пропозиції коду - можна вимкнути. Налаштування екземпляра «Показати помічників AI в редакторі сценаріїв» (налаштування AI) робить це; він увімкнений за замовчуванням, тому нічого не змінюється для тих, хто задоволений ними. `Alt+I` все ще показує значення ідентифікатора об'єкта під курсором, коли вони вимкнені\nМіркування кінцевої точки, сумісної з OpenAI, було вимкнено беззастережно: `ing_efort: «none\"` виходило з кожним запитом, як тільки було налаштовано спеціальну базову URL-адресу. Це правильно для невеликої локальної моделі і неправильно для всього іншого - за проксі він відключає міркування тієї самої моделі, за яку платить, або відхиляється. Зараз це налаштування («Зусилля міркування»), і за замовчуванням залишає параметр поза увагою і дозволяє кінцевій точці вирішити\nРедактор AI розповів адаптеру, як довго він готовий чекати, і адаптер ніколи не читав його: застрягла вбудована комплектація тримала свій слот протягом цілих десяти хвилин замість п'ятнадцяти секунд, які він просив\nВбудоване завершення взяло модель, обрану в чаті AI, але вибрало самого провайдера, тому модель одного постачальника можна було запросити з обліковими даними та в кінцевій точці іншого. Модель та постачальник тепер запам'ятовуються та використовуються разом\nКоли два постачальники пропонують однойменну модель - наприклад, проксі та постачальник, який стоїть за нею, - хто з них обслуговував, це вирішувалось тим, хто відповідав першим, і він може змінюватися від одного перезавантаження до іншого. Постачальник, налаштований першим, виграє зараз, тому прямий маршрут є кращим перед проксі-сервером",
54
+ "zh-cn": "规则:空的 “和” 波段向下折叠到其标题。没有条件的规则会在每个触发器上运行,但是该波段仍然是规则中最高的东西——下拉区域的下限为 64 像素,“只需勾选” 选择器以及每组一个 “或” 行,292px 一无所获。现在是 41px,上面写着 “无条件”,点击标题再次将其打开,将条件拖到标题上方会自行打开,其中有条件的波段永远不会折叠\n规则:方块调色板占用的空间是其空间的一半。一个条目在 30 像素的图标周围有 24 像素的边距,为一行文本留下 66 像素的侧边栏——因此四个方块占据了整个高度,其他所有内容都在滚动条后面。现在,条目相隔 31 像素,上方的纯图标选项卡不再保留它们没有的标签的高度,侧边栏的宽度是 168 像素,而不是 200 像素。如果名称太长,则以全文作为其工具提示。折叠调色板的按钮现在也位于调色板的线条上,而不是调色板左边的一个像素,调色板折叠后它就会悬挂在窗口边缘\n规则:当字符串状态的条件尚未输入任何值时,选择触发器的状态会使编辑器关闭,并显示 “n.replace 不是函数”。选择状态会再次编译整个规则,空值作为布尔值 “false” 得出。现在,没有值的条件与空文本进行比较,并且将为状态输入的字符串数字用作其文本\n现在,脚本编辑器每 10 秒告诉适配器它已打开,在这种情况下,适配器会保持类型定义和编译器处于高温状态,因此保存脚本不会等待它们再次构建。在最后一个生命迹象 30 秒后,GUI 算作消失,所有内容都返还了——大约 100 MB。后台的选项卡不算作已打开,因此被遗忘的浏览器选项卡无法使内存存活数天 (#2373)\n无论是否需要它们,每次启动时都会读取 Node.js、IOBroker 和配置库的类型定义。只有两件事能做——编译 TypeScript 脚本和内置编辑器——它们会为编译器增加大约 90 MB,所以现在当其中一个实际提出要求时,它们就会被读取。运行纯 JavaScript 并在其他地方(镜像目录、外部编辑器)编辑的实例永远不会读取它们;全局 JavaScript 的声明是在没有它们的情况下生成的,输出结果相同。它们也可以永久关闭(“加载类型定义”,TypeScript 选项卡)-然后编辑器会丢失自动完成功能,TypeScript 脚本将无法编译,适配器会在日志中警告这一点 (#2373)\n无论是否需要,每个实例都使两个 TypeScript 语言服务处于活动状态,并且每个实例在编译完任何内容后都会保持大约 95 MB 的容量。它们现在仅建立在第一次编译的基础上,并且全局 JavaScript 的声明存储在脚本对象上,就像编译的 TypeScript 源代码一样,因此重启不会再重新生成它们。语言服务最终构建的内容会在上次编译一分钟后再次发布,并按需重建。在测试系统上,这需要一个从 241 MB 到 127 MB 堆的实例(352 MB 到 233 MB RSS)(#2373)\n脚本编辑器自行绘制的帮助程序——每个函数上方的 “解释/重构/测试” 行、对象 ID 和 CRON 表达式的工具提示以及行内代码建议——可以关闭。实例设置 “在脚本编辑器中显示 AI 助手”(AI 设置)可以做到这一点;它默认处于启用状态,因此任何对它们感到满意的人都不会发生任何变化。当光标关闭时,`Alt+I`仍然在光标下方显示对象 ID 的值\n与OpenAI兼容的终端节点的理由被无条件地关闭了:配置了自定义基础网址后,`reasoning_effort: “无” `即取消了每个请求。这对于小型本地模型来说是对的,对其他所有模式来说都是错误的——在代理服务器的背后,它会掩盖人们为之付出代价的理由,或者被拒绝。现在它是一个设置(“推理工作”),默认设置将参数排除在外,让端点决定\nAI 编辑告诉适配器愿意等待多长时间,但适配器从未读过它:嵌入式完成卡住了整整十分钟,而不是要求的十五秒\n内联完成采用了在 AI 聊天中选择的模型,但选择了提供商本身,因此可以使用证书在另一个提供商的端点请求一个提供商的模型。模型和提供商现已被记住并一起使用\n当两个提供商提供同名模型时(例如代理及其背后的供应商),则由最先回答的人决定,并且可以从一次重新加载更改为下一次重新加载。首先配置的提供商现在获胜,因此直接路由优先于代理"
55
+ },
56
+ "10.1.4": {
57
+ "en": "Rules: the text of an action can round the trigger value with `%.1s` - any number of digits after the decimal point, also `%.2old` for the old value - formatted with the decimal separator of the system, so `Kühlschrank zu warm (%.1s°C)` gives `29,4°C` where `%s` gave `29.400000000000002°C`\nCorrected the function block in blockly\nA custom OpenAI-compatible AI endpoint answered \"Invalid API key\" in the inline completion and while loading the model list, although the test button in the settings said \"ok\": both asked the adapter for the provider `openai`, and the adapter picks the key by that name, so they used the \"OpenAI API key\" instead of the \"Custom API key\". The custom endpoint is now addressed as what it is, everywhere (#2369)\nA configured \"Custom API Base URL\" also redirected every request meant for OpenAI itself to that address - with the OpenAI key attached and no way to switch it off. The base URL now belongs to the custom endpoint alone, so both can be used side by side. If the key of your custom endpoint is in the \"OpenAI API key\" field, move it to the \"Custom API key\" field; the adapter writes a warning in the log if it finds such a setup (#2369)",
58
+ "de": "Regeln: Der Text einer Aktion kann den Triggerwert mit `%.1s` runden — beliebig viele Nachkommastellen, auch `%.2old` für den alten Wert — formatiert mit dem Dezimaltrennzeichen des Systems, also `Kühlschrank zu warm (%.1s°C) `ergibt `29,4°C`, während `%s` `29.400000000000002°C` ergibt\nFunktionsblock in Blockly korrigiert\nEin benutzerdefinierter OpenAI-kompatibler KI-Endpunkt antwortete beim Laden der Modellliste mit „Ungültiger API-Schlüssel“, obwohl der Testbutton in den Einstellungen „ok“ sagte: Beide fragten den Adapter nach dem Anbieter `openai`, und der Adapter wählt den Schlüssel mit diesem Namen aus, also nutzten sie den „OpenAI API Key“ statt des „Custom API Key“. Der benutzerdefinierte Endpunkt wird jetzt überall behandelt (#2369)\nEine konfigurierte „Custom API Base URL“ leitete auch jede Anfrage für OpenAI an diese Adresse um — mit OpenAI-Key und ohne Abschaltmöglichkeit. Die Basis-URL gehört nun nur zum Endpunkt, also beide nebeneinander. Wenn der Schlüssel Ihres Endpunkts im Feld „OpenAI API Key“ steht, schreibt der Adapter eine Warnung in das Log (#2369)",
59
+ "ru": "Правила: в тексте действия можно округлить значение триггера до «%.1s» — любое количество цифр после десятичной точки, а также «%.2old» для старого значения — отформатированное с использованием десятичного разделителя системы, поэтому `Kühlschrank zu warm (%.1s°C) `дает значение `29,4°C`, где `%s` даёт `29,400000000000002°C`\nИсправлен функциональный блок в blockly\nСпециальная конечная точка искусственного интеллекта, совместимая с OpenAI, ответила «Неверный ключ API» при встраиваемом заполнении и загрузке списка моделей, хотя на кнопке тестирования в настройках было написано «ОК»: обе команды запросили у адаптера поставщика `openai`, и адаптер выбирает ключ под этим именем, поэтому вместо «Custom API key» они использовали «ключ OpenAI API». Настраиваемая конечная точка теперь везде рассматривается как есть (#2369)\nНастроенный «Custom API Base URL» также перенаправлял каждый запрос, предназначенный для самого OpenAI, на этот адрес — при этом ключ OpenAI был прикреплен, и его нельзя было отключить. Теперь базовый URL-адрес принадлежит только настраиваемой конечной точке, поэтому их можно использовать одновременно. Если ключ вашей пользовательской конечной точки находится в поле «Ключ OpenAI API», переместите его в поле «Custom API key»; если адаптер обнаружит такую настройку, в журнал запишет предупреждение (#2369)",
60
+ "pt": "Regras: o texto de uma ação pode arredondar o valor do gatilho com `%.1s` - qualquer número de dígitos após o ponto decimal, também `%.2old` para o valor antigo - formatado com o separador decimal do sistema. 2°C”\nCorrigiu o bloco de função em bloco\nUm endpoint de IA compatível com OpenAI respondeu “chave de API inválida” no preenchimento em linha e ao carregar a lista de modelos, embora o botão de teste nas configurações dissesse “ok”: ambos pediram ao adaptador o provedor `openai` e o adaptador escolheu a chave com esse nome, então eles usaram a “chave de API OpenAI” em vez da “chave de API personalizada”. O endpoint personalizado agora é o que é, em todo lugar (#2369)\nUm “URL base de API personalizado” também redirecionava cada solicitação do OpenAI para esse endereço — com a chave OpenAI anexada e sem como desligá-la. O URL base agora pertence ao endpoint personalizado e pode ser usado lado a lado. Se a chave do seu endpoint estiver no campo “Chave de API OpenAI”, mova-a para “Chave de API personalizada”; o adaptador grava um aviso no log (#2369)",
61
+ "nl": "Regels: de tekst van een actie kan de triggerwaarde afronden met `%.1s` - een willekeurig aantal cijfers achter de komma, ook `%.2oud` voor de oude waarde - opgemaakt met het decimale scheidingsteken van het systeem, zodat `Kühlschrank zu warm (%.1s°C) `geeft `29,4°C` waarbij `%s` `29.4000002°C` gaf\nHet functieblok in blockly gecorrigeerd\nEen aangepast AI-eindpunt dat compatibel is met OpenAI antwoordde „Ongeldige API-sleutel” in de inline-aanvulling en tijdens het laden van de modellenlijst, hoewel op de testknop in de instellingen „OK” stond: beiden vroegen de adapter naar de provider `openai`, en de adapter kiest de sleutel met die naam, dus gebruikten ze de „OpenAI API-sleutel” in plaats van de „Aangepaste API-sleutel”. Het aangepaste eindpunt wordt nu overal weergegeven zoals het is (#2369)\nEen geconfigureerde „Custom API Base URL” heeft ook elk verzoek dat voor OpenAI zelf was bedoeld, omgeleid naar dat adres - met de OpenAI-sleutel eraan gekoppeld en zonder mogelijkheid om het uit te schakelen. De basis-URL behoort nu alleen tot het aangepaste eindpunt, dus beide kunnen naast elkaar worden gebruikt. Als de sleutel van uw aangepaste eindpunt zich in het veld „OpenAI API-sleutel” bevindt, verplaats deze dan naar het veld „Aangepaste API-sleutel”; de adapter schrijft een waarschuwing in het logboek als er een dergelijke instelling wordt gevonden (#2369)",
62
+ "fr": "Règles : le texte d'une action peut arrondir la valeur de déclenchement par « %.1s », un nombre quelconque de chiffres après la virgule, et « %.2old » pour l'ancienne valeur, formaté avec le séparateur décimal du système, donc « Kühlschrank zu warm (%.1s°C) » donne « 29,4°C » où « %s` a donné 29,400000000000002°C »\nCorrection du bloc de fonctions dans Blockly\nUn terminal IA personnalisé compatible avec OpenAI a répondu « Clé API non valide » en ligne et en chargeant la liste des modèles, mais le bouton de test des paramètres indiquait « OK » : les deux ont demandé à l'adaptateur le fournisseur « openai », et l'adaptateur a choisi la clé portant ce nom. Ils ont donc utilisé la « clé API OpenAI » au lieu de la « clé API personnalisée ». Le point de terminaison personnalisé est désormais traité tel quel, partout (#2369)\nUne « URL de base API personnalisée » configurée redirigeait toutes les requêtes destinées à OpenAI vers cette adresse, avec la clé OpenAI attachée, sans moyen de la désactiver. L'URL de base n'appartient qu'au point de terminaison personnalisé, donc côte à côte. Si la clé de votre terminal personnalisé se trouve dans le champ « Clé API OpenAI », l'adaptateur écrit un avertissement dans le journal s'il détecte une telle configuration (#2369)",
63
+ "it": "Regole: il testo di un'azione può arrotondare il valore del trigger con «%.1s» - qualsiasi numero di cifre dopo la virgola, anche «%.2old» per il vecchio valore - con il separatore decimale del sistema, quindi «Kühlschrank zu warm (%.1s°C)» dà «29,4°C» dove «%s» dà «29.40000000000000000\" 02 °C»\nCorretto il blocco funzione in blocco\nUn endpoint AI personalizzato compatibile con OpenAI ha risposto «Chiave API non valida» nel completamento in linea e durante il caricamento dell'elenco dei modelli, anche se il pulsante di test diceva «ok»: entrambi hanno chiesto al provider «openai» e l'adattatore ha scelto la chiave con quel nome. L'endpoint personalizzato ora è così, ovunque (#2369)\nUn «Custom API Base URL» reindirizzava anche tutte le richieste di OpenAI a quell'indirizzo, con la chiave OpenAI allegata e senza modo di spegnerla. L'URL di base ora appartiene solo all'endpoint personalizzato. Se la chiave del suo endpoint è nel campo «OpenAI API key», la sposti nel campo «Custom API key»; l'adattatore scrive un avviso nel log se trova tale setup (#2369)",
64
+ "es": "Reglas: el texto de una acción puede redondear el valor de activación con `%.1s` (cualquier número de dígitos después de la coma decimal, también `%.2old» para el valor anterior, formateado con el separador decimal del sistema, por lo que `Kühlschrank zu warm (%.1s°C) `da 29,4°C`, donde `%s` daba 29,40000000002°C\nSe corrigió el bloque de funciones en blockly\nUn punto final de IA personalizado compatible con OpenAI respondió «Clave de API no válida» al terminar en línea y al cargar la lista de modelos, aunque el botón de prueba de la configuración decía «vale»: ambos pidieron al adaptador el proveedor `openai` y el adaptador escogió la clave con ese nombre, por lo que usaron la «clave de API de OpenAI» en lugar de la «clave de API personalizada». El punto final personalizado ahora se dirige como es, en todas partes (#2369)\nUna «URL base de API personalizada» configurada también redirigía todas las solicitudes de OpenAI a esa dirección, con la clave de OpenAI adjunta y sin forma de desactivarla. La URL base ahora pertenece solo al punto final personalizado, por lo que pueden usarse. Si la clave de su punto final personalizado está en el campo «Clave API OpenAI», muévala al campo «Clave API personalizada»; el adaptador escribe un aviso en el registro si encuentra esa configuración (#2369)",
65
+ "pl": "Reguły: tekst akcji może zaokrąglić wartość wyzwalającą o `%.1s` - dowolną liczbę cyfr po przecinku, także `%.2old` dla starej wartości - sformatowaną za pomocą separatora dziesiętnego systemu, więc `Kühlschrank zu warm (%.1s°C) `daje `29,4°C` gdzie `%s` dało `29.400000000000002°C`\nPoprawiono blok funkcji w bloku\nNiestandardowy punkt końcowy AI zgodny z OpenAI odpowiedział na „Nieprawidłowy klucz API” podczas uzupełniania linii i podczas ładowania listy modeli, chociaż przycisk testowy w ustawieniach powiedział „ok”: obaj poprosili adapter o dostawcę `openai`, a adapter wybiera klucz pod tą nazwą, więc użyli „klucza API OpenAI” zamiast „Custom API key”. Niestandardowy punkt końcowy jest teraz adresowany tak, jak jest, wszędzie (#2369)\nSkonfigurowany „Custom API Base URL” przekierował również każde żądanie przeznaczone dla samego OpenAI na ten adres - z dołączonym kluczem OpenAI i bez możliwości jego wyłączenia. Podstawowy adres URL należy teraz do samego niestandardowego punktu końcowego, więc oba mogą być używane obok siebie. Jeśli klucz niestandardowego punktu końcowego znajduje się w polu „Klucz API OpenAI”, przenieś go do pola „Custom API key”; adapter zapisuje ostrzeżenie w dzienniku, jeśli znajdzie taką konfigurację (#2369)",
66
+ "uk": "Правила: текст дії може округлити значення тригера з `%.1s `- будь-якою кількістю цифр після десяткової коми, також `%.2old` для старого значення - відформатоване десятковим роздільником системи, тому `Kühlschrank zu warm (%.1s°C)` дає `29,4°C`, де `%s` дав `29.400000000000002°C`\nВиправлено функціональний блок в blockly\nСпеціальна кінцева точка AI, сумісна з OpenAI, відповіла «Недійсний ключ API» у вбудованому доповненні та під час завантаження списку моделей, хоча на кнопці тестування в налаштуваннях було написано «ok»: обидва запитали у адаптера постачальника `openai`, а адаптер вибирає ключ під цим ім'ям, тому вони використовували «ключ API OpenAI» замість «Custom API key». Користувацьку кінцеву точку тепер адресовано як те, що вона є, скрізь (#2369)\nНалаштована «Custom API Base URL» також перенаправляла кожен запит, призначений для самої OpenAI, на цю адресу - з прикріпленим ключем OpenAI і без можливості його вимкнути. Базова URL-адреса тепер належить лише користувацькій кінцевій точці, тому обидві можуть бути використані поруч. Якщо ключ вашої користувацької кінцевої точки знаходиться в полі «OpenAI API key», перемістіть його в поле «Custom API key»; адаптер записує попередження в журнал, якщо знайде таку настройку (#2369)",
67
+ "zh-cn": "规则:动作文本可以用 `%.1s` 对触发值进行四舍五入——小数点后的任意位数,旧值也是 `%.2old` ——使用系统的十进制分隔符进行格式化,因此 `Kühlschrank zu warm (%.1s°C) `给出 `29,4°C`,其中 `%s` 给出 `29.4000000000002°C`\n方块更正了功能块\n一个兼容 OpenAI 的自定义 AI 端点在行内完成和加载模型列表时回答 “无效 API 密钥”,尽管设置中的测试按钮显示 “确定”:两者都要求适配器提供提供商 “openai”,而适配器按该名称选择密钥,因此他们使用 “OpenAI API 密钥” 而不是 “自定义 API 密钥”。现在,自定义终端节点随处可见 (#2369)\n配置的 “自定义API基础网址” 还将所有发送给OpenAI本身的请求重定向到该地址——附加了OpenAI密钥,无法将其关闭。基本 URL 现在仅属于自定义端点,因此两者可以并排使用。如果您的自定义终端节点的密钥位于 “OpenAI API 密钥” 字段中,请将其移至 “自定义 API 密钥” 字段;如果适配器发现此类设置,则会在日志中写入警告 (#2369)"
68
+ },
43
69
  "10.1.3": {
44
70
  "en": "The plain text export named its files after the script ID instead of the script name, so every dot of a name came out as an underscore - `HK-Balkontuer_v0.1` was exported as `HK-Balkontuer_v0_1.js`, and importing it back renamed the script to that. The files are now named after the script (#2364)\nImporting a plain text export treated a dot inside a file name as a folder level, so `PW-TV-Control_v0.6.js` created a folder `PW-TV-Control_v0` containing a script named `6`. Only the directories of the ZIP are folders now (#2364)\nThe folder icons in the script tree were drawn at less than half the size of the script icons next to them: they spaced themselves with a padding, and since `CssBaseline` sets `box-sizing: border-box` that padding was subtracted from their 20px instead of being added to them. They use a margin now, like the script icons always did (#2360)\nThe log below the editor could not be resized while a script was open: the editor area guessed its height from the height the tabs and the toolbar were expected to have, hung over the bottom edge of its pane and covered the 8px splitter with the horizontal scrollbar of the editor, which swallowed the mouse click. The three parts now share the height as a flex column (#2351)\nThe script list cut off long names, although there was still free space next to them: the space for the buttons at the end of a row was a fixed 185px, which is more than the three buttons occupy, and it did not account for the icon column\nFixed the Blockly comment block: the text was written in white on the yellow block and could not be read, the editor opened somewhere else on the page instead of over the block, and on a smartphone or tablet it did not open at all and left the whole workspace unusable until the page was reloaded (#2348)\nFixed the script mirror for folder names containing regular expression characters: a folder called e.g. `Lampen (Flur` aborted the synchronization with a `SyntaxError`, a folder called e.g. `[ab]` silently synchronized the scripts of another folder (#2239)\nThe Blockly block \"http (POST)\" got a \"content type\" selector, so an API that insists on `Content-Type: application/json` no longer needs an `exec` block. \"automatic\" is the default and behaves exactly as before, \"own\" allows any other type (#1983)\n`getSchedules()` returned the schedules of the time wizard of **all** scripts, even without the argument `true`. Now only the schedules of the own script are returned (#2164)\n`clearSchedule()` did not accept the objects that `getSchedules()` returns for schedules of the time wizard, so such a schedule stayed in the script and in the schedule counter (#2164)\n`clearSchedule()` can now clear the CRON jobs of other scripts too, as documented for `getSchedules(true)` (#2164)\n`getSchedules()` no longer lists the already canceled schedules of the own script in an `onStop` callback (#2164)",
45
71
  "de": "Beim Export im Klartext wurden die Dateien nach der Skript-ID anstatt nach dem Skriptnamen benannt. Dadurch wurde jeder Punkt im Namen als Unterstrich dargestellt – beispielsweise wurde `HK-Balkontuer_v0.1` als `HK-Balkontuer_v0_1.js` exportiert, und beim erneuten Import wurde das Skript entsprechend umbenannt. Die Dateien sind nun nach dem Skript benannt (#2364).\nBeim Importieren eines Klartextexports wurde ein Punkt im Dateinamen als Ordnerebene interpretiert, sodass `PW-TV-Control_v0.6.js` einen Ordner `PW-TV-Control_v0` mit einem Skript namens `6` erstellte. Nur die Verzeichnisse der ZIP-Datei sind jetzt Ordner (#2364).\nDie Ordnersymbole im Skriptbaum wurden mit weniger als der halben Größe der daneben liegenden Skriptsymbole dargestellt: Sie hatten einen Innenabstand (Padding), und da `CssBaseline` `box-sizing: border-box` festlegt, wurde dieser Innenabstand von ihren 20 Pixeln abgezogen, anstatt addiert zu werden. Sie verwenden nun einen Außenabstand (Margin), wie es bei den Skriptsymbolen immer der Fall war (#2360).\nDer Bereich unterhalb des Editors konnte nicht in der Größe angepasst werden, solange ein Skript geöffnet war: Der Editorbereich berechnete seine Höhe anhand der erwarteten Höhe der Tabs und der Symbolleiste, ragte über den unteren Rand des Fensters hinaus und verdeckte den 8-Pixel-Trennstreifen mit der horizontalen Scrollleiste des Editors, wodurch der Mausklick blockiert wurde. Die drei Bereiche teilen sich nun die Höhe als Flexbox-Spalte (#2351).\nDie Skriptliste schnitt lange Namen ab, obwohl daneben noch Platz war: Der Platz für die Schaltflächen am Ende einer Zeile betrug feste 185 Pixel, was mehr ist, als die drei Schaltflächen einnehmen, und die Spalte für die Symbole nicht berücksichtigte.\nDer Blockly-Kommentarblock wurde korrigiert: Der Text wurde in Weiß auf dem gelben Block geschrieben und war unlesbar, der Editor öffnete sich an einer anderen Stelle auf der Seite anstatt über dem Block, und auf einem Smartphone oder Tablet öffnete er sich überhaupt nicht und der gesamte Arbeitsbereich war unbrauchbar, bis die Seite neu geladen wurde (#2348).\nDas Problem mit der Skriptspiegelung für Ordnernamen, die reguläre Ausdrücke enthalten, wurde behoben: Ein Ordner namens z. B. `Lampen (Flur` brach die Synchronisierung mit einem `SyntaxError` ab, ein Ordner namens z. B. `[ab]` synchronisierte stillschweigend die Skripte eines anderen Ordners (#2239).\nDer Blockly-Block „http (POST)“ hat einen „Content-Type“-Selektor erhalten, sodass eine API, die auf `Content-Type: application/json` besteht, keinen `exec`-Block mehr benötigt. „automatic“ ist die Standardeinstellung und verhält sich wie zuvor, „own“ erlaubt jeden anderen Typ (#1983).\n`getSchedules()` gab die Zeitpläne des Zeitassistenten **aller** Skripte zurück, selbst ohne das Argument `true`. Jetzt werden nur noch die Zeitpläne des eigenen Skripts zurückgegeben (#2164).\n`clearSchedule()` akzeptierte die Objekte nicht, die `getSchedules()` für Zeitpläne des Zeitassistenten zurückgibt, sodass ein solcher Zeitplan im Skript und im Zeitplanzähler verblieb (#2164).\n`clearSchedule()` kann nun auch die CRON-Jobs anderer Skripte löschen, wie für `getSchedules(true)` dokumentiert (#2164).\n`getSchedules()` listet die bereits abgebrochenen Zeitpläne des eigenen Skripts nicht mehr in einem `onStop`-Callback auf (#2164).",
@@ -104,32 +130,6 @@
104
130
  "pl": "Obsługa TypeScript 6\nInterfejs graficzny użytkownika został przeniesiony do React 19 i MUI 9\nWyświetlono nazwę hosta w oknie dialogowym wyboru instancji",
105
131
  "uk": "Підтримка Typescript 6\nГрафічний інтерфейс перенесено на React 19 та MUI 9\nІм'я хоста відображалося в діалоговому вікні вибору екземпляра",
106
132
  "zh-cn": "支持 TypeScript 6\nGUI 已迁移至 React 19 和 MUI 9。\n在实例选择对话框中显示主机名"
107
- },
108
- "9.3.1": {
109
- "en": "Added the possibility to execute one-way scripts without saving it",
110
- "de": "Es wurde die Möglichkeit hinzugefügt, Einwegskripte auszuführen, ohne sie zu speichern.",
111
- "ru": "Добавлена возможность выполнения односторонних скриптов без их сохранения.",
112
- "pt": "Adicionada a possibilidade de executar scripts unidirecionais sem salvá-los.",
113
- "nl": "De mogelijkheid toegevoegd om scripts die slechts in één richting hoeven te worden uitgevoerd, zonder ze op te slaan.",
114
- "fr": "Ajout de la possibilité d'exécuter des scripts unidirectionnels sans les enregistrer.",
115
- "it": "Aggiunta la possibilità di eseguire script unidirezionali senza salvarli",
116
- "es": "Se agregó la posibilidad de ejecutar scripts unidireccionales sin guardarlos.",
117
- "pl": "Dodano możliwość wykonywania skryptów jednokierunkowych bez zapisywania ich",
118
- "uk": "Додана можливість виконання односторонніх скриптів без їх збереження.",
119
- "zh-cn": "新增了执行单向脚本而不保存的功能。"
120
- },
121
- "9.3.0": {
122
- "en": "Implemented the support for credentials manager in the configuration\nAdded the possiblilty to execute scripts from AI agent",
123
- "de": "Die Unterstützung für den Anmeldeinformationsmanager wurde in der Konfiguration implementiert.\nEs wurde die Möglichkeit hinzugefügt, Skripte vom KI-Agenten auszuführen.",
124
- "ru": "В конфигурацию добавлена поддержка менеджера учетных данных.\nДобавлена возможность выполнения скриптов из ИИ-агента.",
125
- "pt": "Implementei o suporte para o gerenciador de credenciais na configuração.\nAdicionada a possibilidade de executar scripts a partir de um agente de IA.",
126
- "nl": "De ondersteuning voor de referentiebeheerder is geïmplementeerd in de configuratie.\nDe mogelijkheid om scripts uit te voeren via een AI-agent is toegevoegd.",
127
- "fr": "La prise en charge du gestionnaire d'identifiants a été implémentée dans la configuration.\nAjout de la possibilité d'exécuter des scripts depuis un agent d'IA",
128
- "it": "Implementato il supporto per il gestore delle credenziali nella configurazione\nAggiunta la possibilità di eseguire script dall'agente IA",
129
- "es": "Se implementó la compatibilidad con el administrador de credenciales en la configuración.\nSe agregó la posibilidad de ejecutar scripts desde el agente de IA.",
130
- "pl": "Wprowadzono obsługę menedżera poświadczeń w konfiguracji\nDodano możliwość wykonywania skryptów z poziomu agenta AI",
131
- "uk": "Реалізовано підтримку менеджера облікових даних у конфігурації\nДодано можливість виконання скриптів з агента штучного інтелекту",
132
- "zh-cn": "在配置中实现了对凭据管理器的支持\n增加了从 AI 代理执行脚本的功能。"
133
133
  }
134
134
  },
135
135
  "platform": "Javascript/Node.js",
@@ -186,7 +186,7 @@
186
186
  },
187
187
  "dependencies": [
188
188
  {
189
- "js-controller": ">=6.0.11"
189
+ "js-controller": ">=7.2.2"
190
190
  }
191
191
  ],
192
192
  "globalDependencies": [
@@ -547,6 +547,8 @@
547
547
  "gptKey": "",
548
548
  "gptBaseUrl": "",
549
549
  "gptBaseUrlKey": "",
550
+ "aiReasoningEffort": "",
551
+ "aiEditorHelpers": true,
550
552
  "claudeKey": "",
551
553
  "geminiKey": "",
552
554
  "deepseekKey": "",
@@ -556,6 +558,7 @@
556
558
  "credentialIdGeminiKey": "",
557
559
  "credentialIdDeepseekKey": "",
558
560
  "credentialIdGptBaseUrlKey": "",
561
+ "loadTypings": true,
559
562
  "tsTarget": "es2022",
560
563
  "tsStrict": false,
561
564
  "tsNoImplicitAny": "",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.javascript",
3
- "version": "10.1.3",
3
+ "version": "10.2.0",
4
4
  "description": "Rules Engine for ioBroker",
5
5
  "author": "bluefox <dogafox@gmail.com>",
6
6
  "contributors": [
@@ -35,7 +35,7 @@
35
35
  "url": "https://github.com/ioBroker/ioBroker.javascript"
36
36
  },
37
37
  "engines": {
38
- "node": ">=22"
38
+ "node": ">=22.19.0"
39
39
  },
40
40
  "depsComment": {
41
41
  "@types/node": "should match the lowest MAJOR version of Node.js we support."
@@ -43,15 +43,14 @@
43
43
  "dependencies": {
44
44
  "@iobroker/adapter-core": "^3.4.3",
45
45
  "@iobroker/types": "^7.2.2",
46
- "@types/node": "^22.20.1",
46
+ "@types/node": "^22.20.2",
47
47
  "axios": "^1.20.0",
48
48
  "jsonata": "^2.2.2",
49
- "jszip": "^3.10.1",
49
+ "jszip": "^3.10.2",
50
50
  "node-inspect": "^2.0.0",
51
51
  "node-schedule": "2.1.1",
52
- "nodemailer": "^9.0.6",
52
+ "nodemailer": "^10.0.3",
53
53
  "prettier": "^3.9.6",
54
- "promisify-child-process": "^5.0.1",
55
54
  "semver": "^7.8.5",
56
55
  "suncalc2": "^1.8.1",
57
56
  "typescript": "~6.0.3",
@@ -63,10 +62,10 @@
63
62
  "@alcalzone/release-script-plugin-iobroker": "^5.2.0",
64
63
  "@alcalzone/release-script-plugin-license": "^5.2.2",
65
64
  "@iobroker/adapter-dev": "^1.5.0",
66
- "@iobroker/build-tools": "^3.0.1",
65
+ "@iobroker/build-tools": "^3.0.3",
67
66
  "@iobroker/eslint-config": "^2.3.4",
68
67
  "@iobroker/plugin-sentry": "^3.2.0",
69
- "@iobroker/testing": "^5.3.0",
68
+ "@iobroker/testing": "^6.2.1",
70
69
  "@tsconfig/node22": "^22.0.6",
71
70
  "@types/node-schedule": "^2.1.8",
72
71
  "@types/nodemailer": "^8.0.1",