iobroker.javascript 10.2.5 → 10.4.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 (205) hide show
  1. package/README.md +26 -23
  2. package/admin/assets/AiChatPanel-BjRIKaXG.js +27 -0
  3. package/admin/assets/{AiChatService-BOL3J2Jd.js → AiChatService-DP1EmVk2.js} +3 -3
  4. package/admin/assets/AiDiffView-DeynDw7L.js +1 -0
  5. package/admin/assets/{AiInlineProvider-BIlcrTkS.js → AiInlineProvider-jkEIJJJ-.js} +1 -1
  6. package/admin/assets/BlocklyEditor-DhwThchX.js +301 -0
  7. package/admin/assets/Compile-B0uHjrBE.css +1 -0
  8. package/admin/assets/Compile-e8N5zI-J.js +165 -0
  9. package/admin/assets/Debugger-BDQUKM1K.js +15 -0
  10. package/admin/assets/Diff--plofAtP.js +1 -0
  11. package/admin/assets/{Documentation-Bc0RmoEF.js → Documentation-D3E0U4AK.js} +4 -4
  12. package/admin/assets/ExpandMore-Dio4GeHC.js +1 -0
  13. package/admin/assets/FbEditor-B8S-mCvc.css +1 -0
  14. package/admin/assets/FbEditor-BjLPNzpK.js +15 -0
  15. package/admin/assets/History-Ewi5YEEn.js +1 -0
  16. package/admin/assets/Import-6Mm2vrM2.js +1 -0
  17. package/admin/assets/MonacoDiff-BYvG7IqB.js +1 -0
  18. package/admin/assets/NotificationsActive-CuNfWVJM.js +1 -0
  19. package/admin/assets/RulesEditor--YX6ETsU.js +1 -0
  20. package/admin/assets/{ScriptEditor-CEHpEFp7.js → ScriptEditor-BadPC8Mf.js} +2 -2
  21. package/admin/assets/ScriptEditorVanillaMonaco-BnAmy59d.js +3 -0
  22. package/admin/assets/Send-Pz1eveU5.js +1 -0
  23. package/admin/assets/_virtual_mf-localSharedImportMap___mfe_internal__iobroker_javascript__mf_owner__1-Ceh8EDcF.js +1 -0
  24. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__234968779812303__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-BRdHvuuG.js +1217 -0
  25. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__234968779812303__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-DLWT3PGo.js +9 -0
  26. package/admin/assets/aiPromptBuilder-Co6AqZwx.js +1 -0
  27. package/admin/assets/{blockly-fcfyKYzp.js → blockly-B0t_IRJQ.js} +1 -1
  28. package/admin/assets/blocklyTheme-iZoge1S9.js +1 -0
  29. package/admin/assets/blocks_action-Ctn5A1AU.js +1 -0
  30. package/admin/assets/{blocks_convert-BP2RjhQH.js → blocks_convert-BI0lf0sf.js} +1 -1
  31. package/admin/assets/blocks_logic-o49klUX_.js +1 -0
  32. package/admin/assets/blocks_number-DZtyWFyR.js +1 -0
  33. package/admin/assets/blocks_object-BuzGCxVr.js +1 -0
  34. package/admin/assets/blocks_procedures-jn9sIYmR.js +3 -0
  35. package/admin/assets/blocks_sendto-Coui8w1H.js +5 -0
  36. package/admin/assets/blocks_switch-CeRZizTM.js +2 -0
  37. package/admin/assets/blocks_system-CaBPIC40.js +1 -0
  38. package/admin/assets/blocks_text-DeDtPYWf.js +1 -0
  39. package/admin/assets/blocks_time-CTXQH3Lm.js +1 -0
  40. package/admin/assets/blocks_timeout-D8IOKOb-.js +1 -0
  41. package/admin/assets/{blocks_trigger-CnmXLCUE.js → blocks_trigger-zuuXJbhb.js} +2 -2
  42. package/admin/assets/{cronHoverProvider-CcIFAhVy.js → cronHoverProvider-Curcjz4m.js} +1 -1
  43. package/admin/assets/dist-CzitsFi7.js +1 -0
  44. package/admin/assets/field_cron-RgLY53_S.js +1 -0
  45. package/admin/assets/field_oid-rBhotXJe.js +1 -0
  46. package/admin/assets/field_script-CU7g3-oB.js +1 -0
  47. package/admin/assets/helpers-BZgjFQNf.js +1 -0
  48. package/admin/assets/helpers-BwllSRzJ.js +1 -0
  49. package/admin/assets/hostInit-CrHjJGJJ.js +1 -0
  50. package/admin/assets/index-BHhhebRG.css +1 -0
  51. package/admin/assets/index-Bmmscq2G.js +157 -0
  52. package/admin/assets/{inlineChatWidget-N8xIkvxX.js → inlineChatWidget-ChchJD9a.js} +2 -2
  53. package/admin/assets/{inlineDiffController-BuqYsKKq.js → inlineDiffController-ly6qX4jk.js} +2 -2
  54. package/admin/assets/loadBlocks-BcFtthDb.js +117 -0
  55. package/admin/assets/loadMonaco-BVOEahNw.js +1 -0
  56. package/admin/assets/{mf-entry-bootstrap-0-a5a39621.js → mf-entry-bootstrap-0-6db6c4fc.js} +3 -3
  57. package/admin/assets/pendingShares-mBGPbRwZ.js +2 -0
  58. package/admin/assets/reactour.esm-Dk3aGxKn.js +137 -0
  59. package/admin/assets/{stateHoverProvider-BYAbe1Ay.js → stateHoverProvider-wAsP-THx.js} +1 -1
  60. package/admin/assets/tileFbd-CWAy7R7m.svg +85 -0
  61. package/admin/assets/utils-DUKzLJUz.js +4 -0
  62. package/admin/assets/vite-preload-helper-DjNwdemH.js +1 -0
  63. package/admin/custom/assets/Components-fDcxCyN4.js +1 -0
  64. package/admin/custom/assets/_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1-BraOrMSu.js +1 -0
  65. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__198282747311932__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-DbKT6Hsb.js +1 -0
  66. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__198282747311932__loadShare___mf_0_emotion_mf_1_styled__loadShare__.js-CVvbIPAy.js +1 -0
  67. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__37453319418803__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DVb0ZZ1Q.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__198282747311932__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-BhZYie9-.js} +89 -89
  68. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__198282747311932__loadShare___mf_0_mui_mf_1_x_mf_2_date_mf_2_pickers__loadShare__.js-CV50dgj4.js +1 -0
  69. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__198282747311932__loadShare__date_mf_2_fns__loadShare__.js-Djg9OMcQ.js +1 -0
  70. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__198282747311932__loadShare__leaflet__loadShare__.js-D9EyCd42.js +1 -0
  71. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__198282747311932__loadShare__shared-Hb6V6BnJ.js +2 -0
  72. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__198282747311932__prebuild___mf_0_iobroker_mf_1_json_mf_2_config__prebuild__-BrY-nF2a.js +122 -0
  73. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__198282747311932__prebuild__leaflet__prebuild__-CHjWtrkp.js +1 -0
  74. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__198282747311932__prebuild__react_mf_2_dom_mf_1_client__prebuild__-DOkC-g0X.js +9 -0
  75. package/admin/custom/assets/dist-CzitsFi7.js +1 -0
  76. package/admin/custom/assets/helpers-BZgjFQNf.js +1 -0
  77. package/admin/custom/assets/hostInit-akwaQLq8.js +1 -0
  78. package/admin/custom/assets/index-BkItz-nL.js +1 -0
  79. package/admin/custom/assets/{lib-BmDlTzq2.js → lib-CADOx2YN.js} +1 -1
  80. package/admin/custom/assets/{mf-entry-bootstrap-0-ad1cd7d0.js → mf-entry-bootstrap-0-3c4565e0.js} +3 -3
  81. package/admin/custom/assets/pendingShares-TCMDgBLn.js +2 -0
  82. package/admin/custom/assets/utils-DUKzLJUz.js +4 -0
  83. package/admin/custom/assets/vite-preload-helper-DjNwdemH.js +1 -0
  84. package/admin/custom/customComponents.js +2 -2
  85. package/admin/custom/i18n/de.json +19 -1
  86. package/admin/custom/i18n/en.json +19 -1
  87. package/admin/custom/i18n/es.json +19 -1
  88. package/admin/custom/i18n/fr.json +19 -1
  89. package/admin/custom/i18n/it.json +19 -1
  90. package/admin/custom/i18n/nl.json +19 -1
  91. package/admin/custom/i18n/pl.json +19 -1
  92. package/admin/custom/i18n/pt.json +19 -1
  93. package/admin/custom/i18n/ru.json +19 -1
  94. package/admin/custom/i18n/uk.json +19 -1
  95. package/admin/custom/i18n/zh-cn.json +19 -1
  96. package/admin/i18n/de.json +13 -1
  97. package/admin/i18n/en.json +13 -1
  98. package/admin/i18n/es.json +13 -1
  99. package/admin/i18n/fr.json +13 -1
  100. package/admin/i18n/it.json +13 -1
  101. package/admin/i18n/nl.json +13 -1
  102. package/admin/i18n/pl.json +13 -1
  103. package/admin/i18n/pt.json +13 -1
  104. package/admin/i18n/ru.json +13 -1
  105. package/admin/i18n/uk.json +13 -1
  106. package/admin/i18n/zh-cn.json +13 -1
  107. package/admin/jsonConfig.json +274 -86
  108. package/admin/mf-manifest.json +1 -1
  109. package/admin/mf-stats.json +1 -1
  110. package/admin/remoteEntry.js +2 -2
  111. package/admin/tab.html +3 -7
  112. package/build/lib/aiProviderResolver.js +145 -25
  113. package/build/lib/aiProviderResolver.js.map +1 -1
  114. package/build/lib/anthropicAdapter.js +37 -0
  115. package/build/lib/anthropicAdapter.js.map +1 -1
  116. package/build/lib/fb/analyze.js +288 -0
  117. package/build/lib/fb/analyze.js.map +1 -0
  118. package/build/lib/fb/blocks.js +605 -0
  119. package/build/lib/fb/blocks.js.map +1 -0
  120. package/build/lib/fb/generate.js +326 -0
  121. package/build/lib/fb/generate.js.map +1 -0
  122. package/build/lib/fb/graph.js +240 -0
  123. package/build/lib/fb/graph.js.map +1 -0
  124. package/build/lib/fb/index.js +57 -0
  125. package/build/lib/fb/index.js.map +1 -0
  126. package/build/lib/fb/js.js +33 -0
  127. package/build/lib/fb/js.js.map +1 -0
  128. package/build/lib/fb/layout.js +205 -0
  129. package/build/lib/fb/layout.js.map +1 -0
  130. package/build/lib/fb/library.js +657 -0
  131. package/build/lib/fb/library.js.map +1 -0
  132. package/build/lib/fb/runtime.js +793 -0
  133. package/build/lib/fb/runtime.js.map +1 -0
  134. package/build/lib/fb/time.js +76 -0
  135. package/build/lib/fb/time.js.map +1 -0
  136. package/build/lib/fb/types.js +19 -0
  137. package/build/lib/fb/types.js.map +1 -0
  138. package/build/lib/fb/user.js +78 -0
  139. package/build/lib/fb/user.js.map +1 -0
  140. package/build/lib/inspect.js +66 -10
  141. package/build/lib/inspect.js.map +1 -1
  142. package/build/lib/javascript.d.ts +1 -1
  143. package/build/lib/mirror.js +28 -23
  144. package/build/lib/mirror.js.map +1 -1
  145. package/build/lib/sandbox.js +44 -0
  146. package/build/lib/sandbox.js.map +1 -1
  147. package/build/lib/scriptHistory.js +245 -0
  148. package/build/lib/scriptHistory.js.map +1 -0
  149. package/build/main.js +641 -32
  150. package/build/main.js.map +1 -1
  151. package/build/types.d.ts +20 -1
  152. package/docs/de/fbd.md +274 -0
  153. package/docs/en/fbd.md +260 -0
  154. package/io-package.json +55 -29
  155. package/package.json +7 -7
  156. package/admin/assets/AiChatPanel-oBeXbUFv.js +0 -27
  157. package/admin/assets/AiDiffView-C-KKjnJD.js +0 -1
  158. package/admin/assets/Debugger-DwHHsh9O.js +0 -15
  159. package/admin/assets/Error-DZ4vCykD.js +0 -1
  160. package/admin/assets/Import-Cu02ceLW.js +0 -1
  161. package/admin/assets/RulesEditor-QCbi1lV_.js +0 -1
  162. package/admin/assets/ScriptEditorVanillaMonaco-ChQmnk0p.js +0 -3
  163. package/admin/assets/_virtual_mf-localSharedImportMap___mfe_internal__iobroker_javascript__mf_owner__1-CM95r358.js +0 -1
  164. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__180366418666083__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-BEpNZh4U.js +0 -1217
  165. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__180366418666083__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-FeM77flT.js +0 -9
  166. package/admin/assets/aiPromptBuilder-DKler0UK.js +0 -1
  167. package/admin/assets/blocks_action-DywZVfRY.js +0 -1
  168. package/admin/assets/blocks_logic-CdTl5YZw.js +0 -1
  169. package/admin/assets/blocks_number-DXFd9Rva.js +0 -1
  170. package/admin/assets/blocks_object-by1uBDHi.js +0 -1
  171. package/admin/assets/blocks_procedures-BcJ7N70D.js +0 -3
  172. package/admin/assets/blocks_sendto-qIKzOAcV.js +0 -5
  173. package/admin/assets/blocks_switch-dLF6hSJl.js +0 -2
  174. package/admin/assets/blocks_system-DmX-SBy8.js +0 -1
  175. package/admin/assets/blocks_text-BI4zNU3o.js +0 -1
  176. package/admin/assets/blocks_time-BgYA4Y_4.js +0 -1
  177. package/admin/assets/blocks_timeout-DUzgMyAu.js +0 -1
  178. package/admin/assets/dist-D4uJqRBO.js +0 -4
  179. package/admin/assets/field_cron-Ba46q8Qc.js +0 -1
  180. package/admin/assets/field_oid-lWCjOzuq.js +0 -1
  181. package/admin/assets/field_script-BCWZHhnW.js +0 -1
  182. package/admin/assets/helpers-CnEjYAup.js +0 -1
  183. package/admin/assets/hostInit-CVybS7BB.js +0 -1
  184. package/admin/assets/index-B3s0zmWC.js +0 -871
  185. package/admin/assets/index-CXaeqPRy.css +0 -1
  186. package/admin/assets/pendingShares-DOAkyFMS.js +0 -1
  187. package/admin/assets/vite-preload-helper-CaC3yEL3.js +0 -1
  188. package/admin/custom/assets/Components-FkGDIlId.js +0 -1
  189. package/admin/custom/assets/_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1-Cs88NUCd.js +0 -1
  190. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__37453319418803__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-P-8ffWXw.js +0 -1
  191. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__37453319418803__loadShare___mf_0_emotion_mf_1_styled__loadShare__.js-ZVuRAEo5.js +0 -1
  192. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__37453319418803__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-Dna3WF04.js +0 -1
  193. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__37453319418803__loadShare___mf_0_mui_mf_1_x_mf_2_date_mf_2_pickers__loadShare__.js-DcjdCGAx.js +0 -1
  194. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__37453319418803__loadShare__date_mf_2_fns__loadShare__.js-CnhNjamd.js +0 -1
  195. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__37453319418803__loadShare__leaflet__loadShare__.js-Dz7BFJqH.js +0 -1
  196. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__37453319418803__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-B0olko2J.js +0 -1
  197. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__37453319418803__prebuild___mf_0_iobroker_mf_1_json_mf_2_config__prebuild__-CzN4reh_.js +0 -122
  198. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__37453319418803__prebuild__leaflet__prebuild__-xPcBaiTQ.js +0 -1
  199. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__37453319418803__prebuild__react_mf_2_dom_mf_1_client__prebuild__-DuFBE5fh.js +0 -9
  200. package/admin/custom/assets/dist-D4uJqRBO.js +0 -4
  201. package/admin/custom/assets/hostInit-6oh4UY2k.js +0 -1
  202. package/admin/custom/assets/index-BrlyEy6J.js +0 -1
  203. package/admin/custom/assets/pendingShares-kV2kwejX.js +0 -1
  204. package/admin/custom/assets/vite-preload-helper-CaC3yEL3.js +0 -1
  205. /package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__37453319418803__prebuild__react_mf_1_jsx_mf_2_runtime__prebuild__-CXpyx8Vy.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__198282747311932__prebuild__react_mf_1_jsx_mf_2_runtime__prebuild__-CXpyx8Vy.js} +0 -0
package/io-package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "javascript",
4
- "version": "10.2.5",
4
+ "version": "10.4.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.4.0": {
44
+ "en": "The endpoint of an AI request comes out of the configuration and no longer out of the request. An address in the message used to win over the stored one, which was the comfortable way to put a proxy in front of OpenAI - and at the same time the way to have this instance carry the stored key, as the `Authorization` of that request, to an address of somebody else's choosing. Whoever may send a message to this instance could do that. A proxy belongs in the configuration now, where it is entered once by whoever may configure the adapter. The editor never sent an address, so nothing changes for it; the Test buttons of the settings dialog keep trying what stands in the form, with one limit: an address out of the form counts only together with a key out of the form - one's own key to one's own endpoint gives nothing away. In the credential-store mode the saved address is used, so an endpoint of one's own has to be saved before it can be tested there\nOnly an entry that was stored as an AI credential is read from the central credential store. The store holds the secrets of the whole system - a database password, the login of a camera - and a request for \"the key of this provider\" could name any one of them\nThe `execute` message - which runs a script here, with the whole ioBroker API behind it - checks who asked for it. A message never said on whose behalf it came, so there was nothing to check, and everyone who may send one to this instance could have code executed. Where the js-controller names the user (7.2.5 and newer, which put the user of a socket connection into the message), that user needs the right that a command on the host needs. Where it does not name one - an older controller, a script, an adapter - nothing changes\nThe question before a debug session (\"The script will be stopped and must be activated manually after debugging\") started the debugging even when it was answered with \"Cancel\" (#2382)\nStopping a debug session could end the debugged process with \"uncaught exception: write EPIPE\": the inspector process exited at once, although the process it debugs writes its whole log through its pipes and was still shutting down. The inspector now stops that process first and waits till it is really gone, a broken pipe cannot end a debugged script anymore, and the reset of the connection to the debugged process is not reported as an internal error of the inspector (#2382)\nThe AI chat stayed empty when a request took longer than 30 seconds: the answer is pushed as an instance message now instead of waiting for the socket callback\nAn AI answer without content now says why (stop reason, token counts) instead of leaving an empty chat bubble, and every failed request is logged\nAn answer cut off at the output limit is marked as incomplete\nSorted the scripts in the `@` list of the AI chat by their path\nThe AI chat can be maximized to the whole editor area (#2389)\nThe AI chat shows a spinner for the whole request, not only until the first tool call\nFixed an accepted AI suggestion not reaching the visible editor\nFixed the splitters jumping back to their previous width while being dragged\nBlockly: fixed a parameter of a \"JavaScript function\" with its default name making the script unsavable\nAdded a script history: saved versions can be listed, compared and restored in the editor. \"Saved versions per script\" (30 by default, 0 switches it off)\nAdded a \"Script history\" tab with the used storage per script and buttons to delete single, orphaned or all histories\nMoved the credentials table to its own tab\nMirror: a changed file no longer resets `enabled` and `engine` of the script (#2396)",
45
+ "de": "Der Endpunkt einer KI-Anfrage kommt aus der Konfiguration und nicht mehr aus der Anfrage. Eine Adresse in der Nachricht überwog die gespeicherte, was die bequeme Art war, einen Proxy vor OpenAI zu platzieren und gleichzeitig den gespeicherten Schlüssel als `Autorisierung` der Anfrage an eine andere Adresse weiterzuleiten. Wer dieser Instanz eine Nachricht sendet, kann das tun. Ein Proxy gehört jetzt in die Konfiguration. Jeder, der den Adapter konfiguriert, gibt ihn ein. Der Editor hat nie eine Adresse gesendet, also ändert sich daran nichts. Die Testschaltflächen im Einstellungsdialog versuchen immer, was im Formular steht, mit einem Limit: Eine Adresse aus dem Formular zählt nur zusammen — der eigene Schlüssel zum eigenen Endpunkt verrät nichts. Im Credential-Store-Modus wird die Adresse verwendet, also muss ein eigener Endpunkt gespeichert werden\nNur ein KI-Eintrag wird aus dem zentralen Anmeldespeicher gelesen. Der Laden hat das ganze System — Datenbank-Passwort, Kamera-Login — und eine Anfrage nach dem Providerschlüssel könnte jeden nennen\nDie `execute`-Meldung, die hier ein Skript mit der ganzen ioBroker-API ausführt, prüft, wer danach gefragt hat. Eine Nachricht sagte nie, in wessen Namen sie kam, also gab es nichts zu prüfen, und jeder, der eine an diese Instanz sendet, konnte Code ausführen. Wenn der JS-Controller den Benutzer benennt (7.2.5 und neuer, was den Socket-Benutzer in die Nachricht einfügt), benötigt er das Recht, das ein Befehl auf dem Host benötigt. Wo es keinen nennt — ein älterer Controller, ein Script, ein Adapter — ändert sich nichts\nDie Frage vor einer Debug-Sitzung („Das Script wird gestoppt und muss danach manuell aktiviert werden“) begann das Debuggen, auch wenn es mit „Abbrechen“ beantwortet wurde (#2382)\nDas Beenden einer Debug-Sitzung könnte den Debugvorgang mit „uncaught exception: write EPIPE“ beenden: Der Inspector-Prozess wurde sofort beendet, obwohl er sein ganzes Log durchläuft und trotzdem heruntergefahren wird. Der Inspector stoppt den Prozess jetzt zuerst und wartet, bis er wirklich weg ist. Eine kaputte Leitung kann ein Debug-Skript nicht mehr beenden und das Zurücksetzen der Verbindung wird nicht als interner Fehler gemeldet (#2382)\nDer KI-Chat blieb leer, wenn eine Anfrage länger als 30 Sekunden dauerte: Die Antwort wird als Instanznachricht gesendet, statt auf den Socket-Rückruf zu warten\nEine KI-Antwort ohne Inhalt sagt nun warum (Grund, Token zählen), statt eine leere Chatblase, und jede Anfrage wird geloggt\nEine Antwort am Ausgabelimit gilt als unvollständig\nSortierte die Skripte in der `@`-Liste des KI-Chats\nDer KI-Chat ist auf den ganzen Editor maximierbar (#2389)\nDer KI-Chat zeigt die gesamte Anfrage an, nicht nur bis zum ersten Tool-Aufruf\nEin AI-Vorschlag kam nicht im sichtbaren Editor an\nFehler behoben, bei dem die Splitter beim Ziehen wieder breit wurden\nBlockly: Der Standardname einer JavaScript-Funktion machte das Skript unspeicherbar\nSkriptverlauf hinzugefügt: Gespeicherte Versionen im Editor anzeigen „Gespeicherte Versionen pro Skript“ (30, 0 schaltet ab)\nReiter „Skriptverlauf“ mit Speicherplatz pro Script und Buttons zum Löschen einzelner oder aller Historien hinzugefügt\nDie Anmeldeinformationen in ein eigenes Tab verschoben\nMirror: Eine geänderte Datei setzt „Enabled“ und „Engine“ nicht mehr zurück (#2396)",
46
+ "ru": "Конечная точка запроса AI выходит из конфигурации и больше не входит в запрос. Раньше адрес, указанный в сообщении, выигрывал над сохраненным, что было удобнее поставить прокси-сервер перед OpenAI, и в то же время этот экземпляр передавал сохраненный ключ в виде «Авторизации» этого запроса на чужой адрес. Это мог сделать тот, кто может отправить сообщение в этот инстанс. Теперь в конфигурацию входит прокси-сервер, в который каждый, кто может настроить адаптер, вводится один раз. Редактор так и не прислал адрес, поэтому ничего не изменилось. Кнопки «Тестирование» в диалоговом окне настроек продолжают пересматривать то, что написано в форме, но только одно: адрес, не указанный в форме, засчитывается только вместе с ключом, вышедшим из формы, — собственный ключ к конечной точке ничего не даст. В режиме хранилища учетных данных используется сохраненный адрес, поэтому перед тестированием необходимо сохранить собственную конечную точку\nИз центрального хранилища учетных данных считывается только запись, которая была сохранена в качестве учетных данных AI. В хранилище хранятся секреты всей системы — пароль к базе данных, логин камеры — и любой из них может быть назван запрос на получение «ключа этого провайдера»\nСообщение `execute`, которое запускает здесь скрипт, за которым стоит весь API IOBroker, проверяет, кто его запросил. В сообщении так и не было указано, от чьего имени оно пришло, поэтому проверять было нечего, и каждый, кто отправит сообщение в этот экземпляр, мог выполнить код. Если js-controller вводит имя пользователя (версия 7.2.5 и более поздняя версия, в которой в сообщении указано имя пользователя, подключенного к сокету), этому пользователю нужны права, необходимые команде на хосте. Там, где имя не указано — старый контроллер, скрипт, адаптер — ничего не меняется\nВопрос перед сеансом отладки («Скрипт будет остановлен и должен быть активирован вручную после отладки») запустил отладку, даже если на него был дан ответ «Отмена» (#2382)\nОстановка сеанса отладки может привести к завершению отлаженного процесса с появлением «необнаруженного исключения: запись EPIPE»: процесс инспектора сразу же завершился, хотя отлаживаемый процесс записывает весь журнал по каналам и все равно завершается. Теперь инспектор сначала останавливает этот процесс и дожидается его полного завершения, сломанный канал больше не может завершить отлаженный скрипт, а сброс соединения с отлаженным процессом не считается внутренней ошибкой инспектора (#2382)\nЧат с искусственным интеллектом оставался пустым, если запрос длился более 30 секунд: теперь ответ отправляется в виде сообщения экземпляра, а не в ожидании обратного вызова сокета\nТеперь ответ на запрос с помощью искусственного интеллекта, не содержащий информации (причина остановки, количество токенов), вместо того чтобы оставлять пустое окно чата, и каждый неудачный запрос регистрируется в журнале\nОтвет, вырезанный по выходному пределу, помечается как неполный\nСкрипты в списке «@» чата с искусственным интеллектом отсортированы по пути\nЧат с искусственным интеллектом можно максимально использовать для всей области редактора (#2389)\nЧат с искусственным интеллектом показывает, как обрабатывается весь запрос, а не только до первого вызова инструмента\nИсправлено, что принятое предложение об искусственном интеллекте не попадало в видимый редактор\nИсправлена ошибка, из-за которой разделители возвращались к прежней ширине при перетаскивании\nBlockly: исправлен параметр «функции JavaScript» с именем по умолчанию, делающий скрипт недоступным для сохранения\nДобавлена история сценариев: сохраненные версии можно перечислять, сравнивать и восстанавливать в редакторе. «Сохраненные версии для каждого скрипта» (по умолчанию 30, 0 отключает)\nДобавлена вкладка «История сценариев» с объемом используемого хранилища для каждого скрипта и кнопками для удаления отдельных, потерянных или всех историй\nПереместил таблицу учетных данных на отдельную вкладку\nЗеркало: измененный файл больше не перезагружает `enabled` и `engine` скрипта (#2396)",
47
+ "pt": "O endpoint de uma solicitação de IA sai da configuração e não mais da solicitação. Um endereço na mensagem era usado para vencer o armazenado, que era a forma cômoda de colocar um proxy na frente do OpenAI — e de fazer com que essa instância levasse a chave armazenada, como a “Autorização” do pedido, para um endereço escolhido por outra pessoa. Quem mandar uma mensagem a essa instância pode. Um proxy pertence à configuração agora, onde é inserido uma vez por quem configura o adaptador. O editor nunca enviou um endereço, então nada muda; os botões de teste da caixa de diálogo de configurações testam o que está no formulário, com um limite: um endereço fora do formulário só conta junto com uma chave fora do formulário. No modo de armazenamento de credenciais, o endereço salvo é usado, então um endpoint próprio deve ser salvo antes de testá-lo.\nSomente uma entrada armazenada como credencial de IA é lida no repositório central. A loja guarda os segredos de todo o sistema - senha do banco de dados, login da câmera - e um pedido de “chave desse provedor” pode citar qualquer um deles\nA mensagem `execute` - que executa um script aqui, com toda a API IOBroker - verifica quem a pediu. A mensagem nunca dizia de quem veio, então não havia nada a verificar e todo mundo que enviasse uma para essa instância poderia executar o código. Quando o js-controller nomeia o usuário (7.2.5 e versões mais recentes, que incluem uma conexão de soquete na mensagem), ele precisa dos direitos de um comando no host. Onde não se cita um - um controle antigo, um script, um adaptador - nada muda\nA pergunta antes da sessão de depuração (“O script será interrompido e deve ser ativado manualmente após a depuração”) iniciava a depuração mesmo com “Cancelar” (#2382)\nInterromper uma sessão de depuração pode encerrar o processo depurado com “exceção não detectada: escreva EPIPE”: o processo do inspetor saiu de uma vez, embora ele grave todo o log e continue sendo encerrado. O inspetor agora interrompe o processo primeiro e espera até que ele acabe. Um cano quebrado não pode mais encerrar um script depurado e a reinicialização da conexão não é relatada como um erro interno do inspetor (#2382)\nO chat de IA ficava vazio quando uma solicitação demorava mais de 30 segundos: a resposta agora é enviada em vez de esperar pelo soquete\nUma resposta de IA sem conteúdo agora diz o porquê (motivo, token conta) em vez de deixar um balão vazio, e cada falha é registrada\nUma resposta cortada no limite de saída é incompleta\nOrdenou os scripts na lista `@` do chat de IA por caminho\nO chat de IA pode ser usado em todo o editor (#2389)\nO chat de IA mostra toda a solicitação, não só até a primeira chamada\nCorrigimos uma sugestão de IA aceita que não chegava ao editor\nCorrigido o retorno dos divisores à largura anterior ao ser arrastado\nBlockly: corrigiu o parâmetro de uma “função JavaScript” com o nome padrão e o script não salvo\nHistórico do script: versões salvas podem ser listadas, comparadas e restauradas no editor. “Versões salvas por script” (30 por padrão, 0 desliga)\nFoi adicionada a aba “Histórico de scripts” com botões para excluir histórias únicas, órfãs ou todas\nMudou a tabela de credenciais para sua aba\nMirror: um arquivo alterado não reinicia mais o script (#2396)",
48
+ "nl": "Het eindpunt van een AI-verzoek komt voort uit de configuratie en niet meer uit de aanvraag. Een adres in het bericht dat werd gebruikt om het opgeslagen adres te winnen, wat de comfortabele manier was om een proxy voor OpenAI te zetten - en tegelijkertijd de manier om deze instantie de opgeslagen sleutel, als 'autorisatie' van dat verzoek, naar een adres van iemand anders te laten dragen. Wie een bericht naar deze instantie kan sturen, zou dat kunnen doen. Een proxy hoort nu thuis in de configuratie, waar hij één keer wordt ingevoerd door degene die de adapter mag configureren. De redacteur heeft nooit een adres gestuurd, dus er verandert niets; de testknoppen van het instellingenvenster blijven proberen wat er in het formulier staat, met één limiet: een adres buiten het formulier telt alleen mee met een sleutel uit het formulier - de eigen sleutel tot het eigen eindpunt verraadt niets. In de modus voor het opslaan van inloggegevens wordt het opgeslagen adres gebruikt, dus er moet een eigen eindpunt worden opgeslagen voordat het daar kan worden getest.\nAlleen een item dat is opgeslagen als AI-inloggegevens, wordt gelezen uit de centrale opslag voor inloggegevens. De winkel bevat de geheimen van het hele systeem - een wachtwoord voor de database, de login van een camera - en een verzoek om „de sleutel van deze provider” zou elk van hen kunnen noemen\nHet `execute` bericht - dat hier een script uitvoert, met de hele IOBroker API erachter - checkt wie erom heeft gevraagd. In een bericht werd nooit gezegd namens wie het kwam, dus er was niets om te controleren, en iedereen die een bericht naar dit exemplaar zou sturen, kon code laten uitvoeren. Als de js-controller de gebruiker een naam geeft (7.2.5 en nieuwer, waardoor de gebruiker van een socketverbinding in het bericht wordt geplaatst), heeft die gebruiker het recht nodig heeft dat een commando op de host nodig heeft. Waar er geen naam wordt genoemd - een oudere controller, een script, een adapter - verandert er niets\nDe vraag vóór een foutopsporingssessie („Het script wordt gestopt en moet na de foutopsporing handmatig worden geactiveerd”) startte de foutopsporing, zelfs toen deze werd beantwoord met „Annuleren” (#2382)\nAls u een foutopsporingssessie stopt, kan het foutopsporingsproces worden beëindigd met „uncaught exception: write EPIPE”: het inspectieproces werd meteen afgesloten, hoewel het proces dat wordt gedebugd het hele logboek door de leidingen schrijft en nog steeds werd afgesloten. De inspecteur stopt nu eerst dat proces en wacht tot het echt weg is. Een kapotte pipe kan een script met foutopsporing niet meer beëindigen, en het opnieuw instellen van de verbinding met het foutopsporingsproces wordt niet gerapporteerd als een interne fout van de inspecteur (#2382)\nDe AI-chat bleef leeg wanneer een verzoek langer dan 30 seconden duurde: het antwoord wordt nu als een instantiebericht verzonden in plaats van te wachten tot het contact wordt teruggebeld\nEen AI-antwoord zonder inhoud zegt nu waarom (stop reden, token telt) in plaats van een lege chatballon achter te laten, en elk mislukt verzoek wordt geregistreerd\nEen antwoord dat bij de uitvoerlimiet wordt onderbroken, wordt als onvolledig gemarkeerd.\nDe scripts in de `@` lijst van de AI-chat gesorteerd op hun pad\nDe AI-chat kan worden gemaximaliseerd naar het hele redactiegebied (#2389)\nDe AI-chat toont een spinner voor het hele verzoek, niet alleen tot de eerste oproep tot de tool\nEen geaccepteerde AI-suggestie heeft de zichtbare editor niet bereikt\nProbleem opgelost dat de splitters terugsprongen naar hun vorige breedte terwijl ze werden gesleept\nBlockly: een parameter van een „JavaScript-functie” opgelost met de standaardnaam, waardoor het script niet kon worden opgeslagen\nScriptgeschiedenis toegevoegd: opgeslagen versies kunnen worden weergegeven, vergeleken en hersteld in de editor. „Opgeslagen versies per script” (standaard 30, 0 schakelt dit uit)\nEen tabblad „Scriptgeschiedenis” toegevoegd met de gebruikte opslag per script en knoppen om enkele, verweesde of alle geschiedenissen te verwijderen\nDe tabel met inloggegevens is verplaatst naar een eigen tabblad\nSpiegel: in een gewijzigd bestand worden niet langer de `enabled` en `engine` van het script gereset (#2396)",
49
+ "fr": "Le point final d'une demande d'IA provient de la configuration et non plus de la demande. Une adresse dans le message l'emportait sur celle enregistrée, ce qui était le moyen le plus simple de placer un proxy devant OpenAI, et en même temps de faire en sorte que cette instance transmette la clé stockée, en tant qu' « autorisation » de cette demande, à une adresse choisie par quelqu'un d'autre. Celui qui enverra un message à cette instance peut le faire. Un proxy a sa place maintenant, où il est saisi une seule fois par le configurateur de l'adaptateur. L'éditeur n'a jamais envoyé d'adresse, donc rien ne change ; les boutons Test de la boîte de dialogue des paramètres permettent d'essayer le contenu du formulaire, avec une limite : une adresse ne compte qu'avec une clé de formulaire. La clé de connexion de chacun à son propre point de terminaison ne donne rien. En mode Credential-Store, l'adresse enregistrée est utilisée, donc votre propre terminal doit être enregistré avant d'y être testé\nSeule une entrée enregistrée sous forme d'IA est lue dans la banque d'informations centrale. La boutique détient les secrets du système (mot de passe de base de données, identifiant d'une caméra) et une demande de « clé de ce fournisseur » pourrait nommer n'importe lequel\nLe message « Execute », qui lance un script ici, avec l'API complète d'IObroker, vérifie qui l'a demandé. Aucun message ne disait de qui il provenait, il n'y avait donc rien à vérifier, et tous ceux qui en envoyaient un à cette instance pouvaient exécuter du code. Lorsque le contrôleur JS donne un nom à l'utilisateur (version 7.2.5 et versions ultérieures, qui met l'utilisateur d'une connexion socket dans le message), il doit saisir une commande sur l'hôte. Là où il n'y en a pas, une ancienne manette, un script, un adaptateur, rien ne change\nLa question posée avant une session de débogage (« Le script sera arrêté et doit être activé manuellement après le débogage ») lançait le débogage même avec la réponse « Annuler » (#2382)\nL'arrêt d'une session de débogage pouvait mettre fin au processus avec « exception non détectée : écrivez EPIPE » : le processus d'inspection s'arrête immédiatement, alors que le processus écrit tout son journal et était toujours en train de s'arrêter. L'inspecteur arrête d'abord ce processus et attend qu'il soit vraiment terminé. Un tuyau cassé ne peut plus arrêter un script, et la réinitialisation de la connexion au processus n'est pas signalée comme une erreur interne de l'inspecteur (#2382)\nLe chat IA restait vide lorsqu'une demande durait plus de 30 secondes : la réponse est envoyée sous forme de message d'instance au lieu d'attendre le rappel\nUne réponse IA sans contenu explique pourquoi (raison de l'arrêt, compte) au lieu de laisser une bulle de discussion vide, et chaque échec est enregistré\nUne réponse coupée à la limite de sortie est marquée comme incomplète\nA trié les scripts de la liste « @ » du chat IA par chemin\nLe chat IA peut être étendu à l'ensemble de l'éditeur (#2389)\nLe chat IA affiche une liste complète de la requête, pas seulement avant le premier outil\nCorrection d'une suggestion d'IA acceptée qui n'atteignait pas l'éditeur\nCorrection des séparateurs qui revenaient à leur largeur d'origine\nBlockly : le nom par défaut d'une « fonction JavaScript » a été corrigé, rendant le script impossible à enregistrer\nAjout d'un historique des scripts : l'éditeur peut lister, comparer et restaurer les versions. « Versions enregistrées par script » (30 par défaut, 0 désactive)\nAjout d'un onglet « Historique des scripts » avec des boutons pour supprimer un historique, orphelin ou complet\nA déplacé le tableau des codes vers son propre onglet\nMiroir : un fichier modifié ne réinitialise plus « activé » et « moteur » du script (#2396)",
50
+ "it": "L'endpoint di una richiesta AI deriva dalla configurazione e non più dalla richiesta. Un indirizzo nel messaggio prevaleva su quello memorizzato, che era il modo più comodo per mettere un proxy davanti a OpenAI e per far sì che questa istanza portasse la chiave memorizzata, come «Autorizzazione» della richiesta, a un indirizzo scelto da qualcun altro. Chiunque invii un messaggio a questo caso può farlo. Il proxy fa parte della configurazione ora, e chi configura l'adattatore lo inserisce una volta. L'editor non ha mai inviato un indirizzo, quindi non cambia nulla; i pulsanti Test delle impostazioni continuano a provare ciò che è nel modulo, con un limite: un indirizzo fuori dal modulo conta solo insieme a una chiave. In modalità credenziali si usa l'indirizzo salvato, quindi è necessario salvare un endpoint prima di testarlo\nSolo una voce archiviata come credenziale AI viene letta dall'archivio centrale. Il negozio contiene i segreti del sistema: password del database, login di una telecamera, e richiedendo «la chiave di questo provider»\nIl messaggio `execute`, che esegue uno script con l'intera API IOBroker, verifica chi lo ha richiesto. Un messaggio non diceva da chi provenisse, quindi non c'era nulla da controllare e chiunque ne inviasse uno poteva far eseguire il codice. Se il js-controller nomina l'utente (7.2.5 e successivi, inserendo nel messaggio l'utente di una connessione socket), a quell'utente serve il diritto di comando sull'host. Se non ne nomina uno, un vecchio controller, uno script, non cambia nulla\nLa domanda prima di una sessione di debug («Lo script verrà interrotto e deve essere attivato manualmente dopo il debug») anche se ha risposto con «Annulla» (#2382)\nL'interruzione di una sessione di debug potrebbe terminare con «uncatch exception: write EPIPE»: il processo di ispezione è terminato subito, anche se il processo di debug scrive l'intero log nelle pipe e si sta ancora chiudendo. L'ispettore ora interrompe prima il processo e aspetta che finisca davvero, una pipe rotta non può più terminare uno script di debug e il ripristino della connessione non viene segnalato come errore interno (#2382)\nLa chat AI è rimasta vuota quando una richiesta richiedeva più di 30 secondi: ora la risposta viene inviata come istanza invece di\nUna risposta AI senza contenuto ora spiega perché (stop reason, token counts) invece di lasciare una chat vuota e ogni richiesta fallita\nUna risposta al limite di uscita è incompleta\nHa ordinato gli script della chat AI `@` in base al percorso\nLa chat AI può essere estesa a tutto l'editor (#2389)\nLa chat AI mostra l'intera richiesta, non solo fino al primo tool\nRisolto un problema AI accettato che non arrivava all'editor\nRisolto il problema con gli splitter che tornavano alla larghezza precedente\nBlockly: corretto un parametro di «funzione JavaScript» che rendeva lo script non salvabile\nCronologia script aggiunta: le versioni salvate sono confrontate e ripristinate «Versioni salvate per script» (30 di default, 0 lo spegne)\nAggiunta una scheda «Cronologia script» con spazio per script e pulsanti per eliminare singole o orfane\nHa spostato la tabella credenziali\nMirror: un file modificato non resetta più «enabled» e «engine» (#2396)",
51
+ "es": "El punto final de una solicitud de IA sale de la configuración y ya no de la solicitud. Una dirección en el mensaje solía ganarse a la almacenada, que era la forma más cómoda de poner un proxy delante de OpenAI y, al mismo tiempo, hacer que esta instancia llevara la clave almacenada, como «Autorización» de esa solicitud, a la dirección que eligiera otra persona. Quienquiera que envíe un mensaje a esta instancia puede hacerlo. El proxy pertenece a la configuración ahora, donde lo introduce una vez quien configure el adaptador. El editor nunca envió una dirección, así que no cambia nada; los botones de prueba del cuadro de diálogo de ajustes siguen intentando lo que hay en el formulario, con un límite: una dirección fuera del formulario solo cuenta junto con una clave fuera del formulario; la propia clave del punto final no revela nada. En el modo almacén de credenciales se usa la dirección guardada, por lo que hay que guardar un punto final propio antes de poder probarlo allí\nEn la tienda central de credenciales solo se lee una entrada guardada como credencial de IA. La tienda guarda los secretos de todo el sistema (la contraseña de una base de datos, el inicio de sesión de una cámara) y solicitar «la clave de este proveedor» podría nombrar a cualquiera de ellos\nEl mensaje «ejecutar», que ejecuta un guion aquí, con toda la API de IOBroker detrás, comprueba quién lo pidió. Un mensaje nunca decía en nombre de quién venía, así que no había nada que comprobar y cualquiera que enviara uno a esta instancia podría ejecutar código. Cuando el controlador js nombra al usuario (7.2.5 y posterior, que pone al usuario de una conexión de socket en el mensaje), ese usuario necesita el derecho que necesita un comando del host. Cuando no nombra uno (un mando, un guion, un adaptador antiguo), nada cambia\nLa pregunta antes de una sesión de depuración («El guion se detendrá y se activará manualmente tras la depuración») inició la depuración incluso cuando se respondió con «Cancelar» (#2382)\nDetener una sesión de depuración podría terminar el proceso con una «excepción no detectada: escriba EPIPE»: el proceso del inspector salió de una vez, aunque el proceso que depura escribe todo su registro y seguía cerrándose. El inspector ahora detiene primero el proceso y espera a que termine, una tubería rota ya no puede terminar un guion depurado y el restablecimiento de la conexión al proceso depurado no se informa como error interno del inspector (#2382)\nEl chat de IA permaneció vacío cuando una solicitud tardó más de 30 segundos: la respuesta se envía como mensaje de instancia en lugar de esperar a la llamada del socket\nUna respuesta de IA sin contenido ahora dice por qué (detener motivo, cuenta fichas) en lugar de dejar una burbuja de chat vacía, y cada solicitud fallida se registra\nUna respuesta cortada en el límite de salida está incompleta\nOrdenó los guiones de la lista `@ del chat de IA por ruta\nEl chat de IA se puede maximizar en toda el área de edición (#2389)\nEl chat de IA muestra una ruleta para toda la solicitud, no solo hasta la primera llamada\nSe corrigió una sugerencia de IA aceptada que no llegaba al editor visible\nSe ha corregido que los divisores volvieran a su ancho anterior al arrastrarlos\nBlockly: se ha corregido un parámetro de una «función de JavaScript» con su nombre por defecto que no se podía guardar\nAñadió un historial de guiones: las versiones guardadas se muestran, comparan y restauran en el editor. «Versiones guardadas por guion» (30 por defecto, 0 lo desactiva)\nSe ha añadido una pestaña de «Historial de guiones» con el almacenamiento de cada guion y botones para borrar un solo historial, huérfano o todo\nMovió la tabla de credenciales a su pestaña\nEspejo: un archivo cambiado ya no restablece «activado» y «motor» del guion (#2396)",
52
+ "pl": "Punkt końcowy żądania AI wychodzi z konfiguracji i nie jest już poza żądaniem. Adres w wiadomości używany do zdobycia zapisanego adresu, co było wygodnym sposobem umieszczenia proxy przed OpenAI - a jednocześnie sposobem, aby ta instancja przenosiła przechowywany klucz, jako „Autoryzacja” tego żądania, na adres wybrany przez kogoś innego. Ktokolwiek może wysłać wiadomość do tej instancji, może to zrobić. Serwer proxy należy teraz do konfiguracji, gdzie jest wprowadzany raz przez każdego, kto może skonfigurować adapter. Edytor nigdy nie wysłał adresu, więc nic się nie zmienia; przyciski Test w oknie dialogowym ustawień wciąż próbują tego, co znajduje się w formularzu, z jednym limitem: adres poza formularzem liczy się tylko razem z kluczem z formularza - własny klucz do własnego punktu końcowego nic nie daje. W trybie przechowywania poświadczeń używany jest zapisany adres, więc własny punkt końcowy musi zostać zapisany, zanim będzie można go tam przetestować\nTylko wpis, który został zapisany jako dane uwierzytelniające AI, jest odczytywany z centralnego magazynu poświadczeń. Sklep przechowuje tajemnice całego systemu - hasło do bazy danych, login kamery - a prośba o „klucz tego dostawcy” może wymienić dowolny z nich\nKomunikat `execute` - który uruchamia tutaj skrypt, za którym znajduje się cały interfejs API ioBroker - sprawdza, kto o to poprosił. Wiadomość nigdy nie powiedziała, w czyim imieniu przyszła, więc nie było nic do sprawdzenia, a każdy, kto może wysłać ją do tej instancji, mógł wykonać kod. Tam, gdzie kontroler js nazywa użytkownika (7.2.5 i nowszy, który umieszcza użytkownika połączenia gniazda w wiadomości), ten użytkownik potrzebuje prawa, którego potrzebuje polecenie na hoście. Gdzie nie nazywa jednego - starszy kontroler, skrypt, adapter - nic się nie zmienia\nPytanie przed sesją debugowania („Skrypt zostanie zatrzymany i musi zostać aktywowany ręcznie po debugowaniu”) rozpoczęło debugowanie nawet wtedy, gdy odpowiedziano na nie „Anuluj” (#2382)\nZatrzymanie sesji debugowania może zakończyć proces debugowania „niewychwytywany wyjątek: napisz EPIPE”: proces inspektora zakończył się natychmiast, chociaż proces, który debuguje, zapisuje cały dziennik przez swoje rury i nadal się zamykał. Inspektor najpierw zatrzymuje ten proces i czeka, aż naprawdę zniknie, zepsuta rura nie może już zakończyć debugowanego skryptu, a zresetowanie połączenia z debugowanym procesem nie jest zgłaszane jako wewnętrzny błąd inspektora (#2382)\nCzat AI pozostał pusty, gdy żądanie trwało dłużej niż 30 sekund: odpowiedź jest teraz przesyłana jako wiadomość instancji zamiast czekać na wywołanie zwrotne gniazda\nOdpowiedź AI bez treści mówi teraz, dlaczego (powód zatrzymania, liczenie tokenów) zamiast pozostawiać pustą bańkę czatu, a każde nieudane żądanie jest rejestrowane\nOdpowiedź odcięta na granicy wyjściowej jest oznaczona jako niekompletna\nPosortowane skrypty na liście `@` czatu AI według ich ścieżki\nCzat AI można zmaksymalizować do całego obszaru edytora (#2389)\nCzat AI pokazuje spinner dla całego żądania, nie tylko do pierwszego wywołania narzędzia\nNaprawiono zaakceptowaną sugestię AI, która nie dotarła do widocznego edytora\nNaprawiono rozgałęźniki przeskakujące z powrotem do poprzedniej szerokości podczas przeciągania\nBlockly: naprawiono parametr „funkcji JavaScript” z jej domyślną nazwą, co uniemożliwia zapisanie skryptu\nDodano historię skryptów: zapisane wersje można wyświetlać, porównywać i przywrócić w edytorze. „Zapisane wersje na skrypt” (domyślnie 30, 0 wyłącza go)\nDodano zakładkę „Historia skryptów” z używaną pamięcią na skrypt i przyciskami do usuwania pojedynczych, osieroconych lub wszystkich historii\nPrzeniesiono tabelę poświadczeń na własną kartę\nMirror: zmieniony plik nie resetuje już „włączonego” i „silnika” skryptu (#2396)",
53
+ "uk": "Кінцева точка запиту AI виходить із конфігурації, а більше не із запиту. Адреса в повідомленні використовувалася для перемоги над збереженим, що було зручним способом поставити проксі перед OpenAI - і в той же час спосіб, щоб цей екземпляр переносив збережений ключ, як «Авторизація» цього запиту, на адресу, яку хтось вибрав. Той, хто може надіслати повідомлення цій інстанції, може це зробити. Проксі-сервер зараз належить до конфігурації, де його вводить один раз той, хто може налаштувати адаптер. Редактор ніколи не надсилав адресу, тому для неї нічого не змінюється; кнопки «Тест» діалогового вікна налаштувань продовжують пробувати те, що стоїть у формі, з одним обмеженням: адреса поза формою враховується лише разом із ключем поза формою - власний ключ до власної кінцевої точки нічого не дає. У режимі сховища облікових даних використовується збережена адреса, тому перед тим, як її можна буде перевірити там, потрібно зберегти власну кінцеву точку\nЛише запис, який був збережений як обліковий запис AI, читається з центрального сховища облікових даних. У магазині зберігаються секрети всієї системи - пароль бази даних, логін камери - і запит на «ключ цього провайдера» міг назвати будь-який з них\nПовідомлення `execute` - яке запускає тут скрипт, з усім API IObroker за ним - перевіряє, хто його запитав. У повідомленні ніколи не було сказано, від чиго імені воно прийшло, тому перевіряти нічого, і кожен, хто може надіслати його на цей екземпляр, міг виконати код. Якщо js-контролер називає користувача (7.2.5 і новіших версій, які поміщають користувача підключення до сокета в повідомлення), цьому користувачеві потрібно право, яке потрібно команді на хості. Де не називає одного - старий контролер, скрипт, адаптер - нічого не змінюється\nПитання перед сеансом налагодження («Скрипт буде зупинений і повинен бути активований вручну після налагодження») запустило налагодження навіть тоді, коли на нього відповіли «Скасувати» (#2382)\nЗупинення сеансу налагодження може завершити налагоджений процес із «незловленим винятком: запишіть EPIPE»: процес інспектора вийшов одразу, хоча процес, який він налагоджує, записує весь свій журнал через свої труби і все ще вимикався. Тепер інспектор спочатку зупиняє цей процес і чекає, поки він дійсно зникне, зламана труба більше не може закінчити налагоджений скрипт, а скидання з'єднання з налагодженим процесом не повідомляється як внутрішня помилка інспектора (#2382)\nЧат AI залишався порожнім, коли запит тривав більше 30 секунд: відповідь тепер передається як повідомлення про екземпляр замість того, щоб чекати зворотного виклику сокета\nВідповідь AI без вмісту тепер говорить чому (причина зупинки, кількість токенів) замість того, щоб залишати порожню бульбашку чату, і кожен невдалий запит реєструється\nВідповідь, відрізана на вихідній межі, позначається як неповна\nСортування скриптів у списку `@` чату AI за їх шляхом\nЧат AI може бути максимально розширений для всієї області редактора (#2389)\nЧат AI показує спіннер для всього запиту, не тільки до першого виклику інструменту\nВиправлено прийняту пропозицію AI, яка не потрапляє до видимого редактора\nВиправлено, коли спліттери повертаються до попередньої ширини під час перетягування\nBlockly: виправлено параметр «функції JavaScript» з її назвою за замовчуванням, що робить сценарій непридатним для збереження\nДодана історія скриптів: збережені версії можна перерахувати, порівнювати та відновлювати в редакторі. «Збережені версії для скрипту» (30 за замовчуванням, 0 вимикає його)\nДодана вкладка «Історія сценаріїв» з використовуваним сховищем для скрипта та кнопками для видалення одиничних, осиротілих або всіх історій\nПереміщено таблицю облікових даних на власну вкладку\nДзеркало: змінений файл більше не скидає `enabled` і `engine` скрипта (#2396)",
54
+ "zh-cn": "AI 请求的端点来自配置,不再来自请求。消息中的一个地址过去用来赢得存储的地址,这是在 OpenAI 面前放置代理的便捷方式,同时也是让该实例将存储的密钥(作为该请求的 “授权”)携带到他人选择的地址的方法。任何可以向该实例发送消息的人都可以这样做。代理现在属于配置中,任何可以配置适配器的人都只能输入一次代理。编辑器从未发送过地址,因此没有任何变化;设置对话框的测试按钮一直在尝试表单中的内容,但有一个限制:表单中的地址只能与表单中的密钥一起计算——一个人自己访问自己端点的密钥不会泄露任何东西。在凭证存储模式下,使用保存的地址,因此必须先保存自己的端点,然后才能在那里进行测试\n只有作为 AI 凭据存储的条目才能从中央凭证存储中读取。商店保存着整个系统的秘密——数据库密码、摄像机的登录名——而请求 “这个提供商的密钥” 可以说出其中任何一个的名字\n“执行” 消息——它在这里运行一个脚本,背后是整个 IOBroker API ——检查是谁要求的。一条消息从来没有说过是代表谁来的,所以没有什么可检查的,每个可能向这个实例发送一条消息的人都可以执行代码。其中 js-controller 命名用户(7.2.5 及更高版本,它将套接字连接的用户放入消息中),则该用户需要主机上命令所需的权限。它没有命名的地方 —— 较旧的控制器、脚本、适配器 —— 没有任何变化\n调试会话之前的问题(“脚本将停止,调试后必须手动激活”)启动了调试,即使回答 “取消” (#2382)\n停止调试会话可能会以 “未捕获的异常:写入 EPIPE” 结束调试进程:检查器进程立即退出,尽管它调试的进程通过管道写入了全部日志,并且仍在关闭。检查器现在会先停止该进程,然后等到它真正消失,管道损坏无法再结束已调试的脚本,并且重置与调试进程的连接不会被报告为检查器的内部错误 (#2382)\n当请求花费超过 30 秒时,AI 聊天将保持空白:答案现在作为实例消息推送,而不是等待套接字回调\n没有内容的 AI 答案现在会显示原因(停止原因、令牌数),而不是留下空的聊天气泡,并且每个失败的请求都会被记录下来\n输出限制处截止的答案被标记为不完整\n按路径对 AI 聊天的 `@` 列表中的脚本进行排序\nAI 聊天可以最大化到整个编辑器区域 (#2389)\nAI 聊天会显示整个请求的微调器,不仅仅是第一次工具调用\n修复了接受的 AI 建议无法到达可见编辑器的问题\n修复了分离器在被拖动时会跳回之前的宽度的问题\nBlockly:修复了使用默认名称的 “JavaScript 函数” 的参数使脚本无法保存的问题\n添加了脚本历史记录:可以在编辑器中列出、比较和恢复保存的版本。“每个脚本保存的版本”(默认为 30,0 将其关闭)\n添加了 “脚本历史记录” 选项卡,其中包含每个脚本使用的存储空间以及用于删除单个、孤立或所有历史记录的按钮\n已将凭据表移至其自己的选项卡\n镜像:更改后的文件不再重置脚本的 “已启用” 和 “引擎” (#2396)"
55
+ },
56
+ "10.3.0": {
57
+ "en": "The code editor (Monaco), Blockly and the Rules blocks are loaded only when a script of that kind is opened, so the editor starts faster\nAdded function block diagrams (FBD, in the style of CFC): timers, counters, flip-flops, edges, comparison, arithmetic, conversions, control, calendar (cron, sun events), log and messages, and a block with own JavaScript - wired to ioBroker states. See [the description](docs/en/fbd.md)",
58
+ "de": "Die Blöcke Code-Editor (Monaco), Blockly und Rules werden nur geladen, wenn ein Skript geöffnet wird.\nFunktionsblockdiagramme (FBD, im CFC-Stil) hinzugefügt: Timer, Zähler, Flipflops, Kanten, Vergleich, Arithmetik, Umrechnungen, Kalender (Cron, Sun), Log und Nachrichten und ein Block mit eigenem JavaScript — mit ioBroker-Status. Siehe [Beschreibung] (docs/en/fbd.md)",
59
+ "ru": "Редактор кода (Monaco), блоки Blockly и Rules загружаются только при открытии такого скрипта, поэтому редактор запускается быстрее\nДобавлены функциональные блок-схемы (FBD, в стиле CFC): таймеры, счетчики, триггеры, сравнение, арифметика, конверсии, управление, календарь (cron, sun events), журнал и сообщения, а также блок с собственным JavaScript, привязанный к состояниям IOBroker. См. [описание] (docs/en/fbd.md)",
60
+ "pt": "O editor de código (Monaco), o Blockly e o Rules só são carregados quando um script é aberto, então o editor começa mais rápido\nForam adicionados diagramas de blocos funcionais (FBD, no estilo CFC): temporizadores, contadores, flip-flops, bordas, comparação, aritmética, conversões, controle, calendário, log e mensagens e um bloco com JavaScript próprio, conectado aos estados do IOBroker. Veja a descrição (docs/en/fbd.md)",
61
+ "nl": "De blokken code-editor (Monaco), Blockly en de Rules worden alleen geladen als een dergelijk script wordt geopend, zodat de editor sneller start\nFunctieblokdiagrammen toegevoegd (FBD, in de stijl van CFC): timers, tellers, flip-flops, randen, vergelijking, rekenen, conversies, controle, kalender (cron, zonnegebeurtenissen), logboek en berichten, en een blok met eigen JavaScript - overgezet naar IOBroker-staten. Zie [de beschrijving] (docs/en/fbd.md)",
62
+ "fr": "L'éditeur de code (Monaco), Blockly et les blocs Rules ne sont chargés que lorsqu'un script de ce type est ouvert.\nAjout de diagrammes de blocs fonctionnels (FBD, style CFC) : chronomètres, compteurs, bascules, bords, comparaison, arithmétique, conversions, contrôle, calendrier (cron, sun events), journal et messages, et un bloc avec son propre JavaScript, connecté aux états d'IObroker. Voir [la description] (docs/en/fbd.md)",
63
+ "it": "I blocchi Code Editor (Monaco), Blockly e Rules si caricano solo all'apertura di quel tipo di script\nAggiunti diagrammi a blocchi funzionali (FBD, in stile CFC): timer, contatori, flip-flop, edge, confronto, aritmetica, conversioni, controllo, calendario (cron, sun events), log e messaggi e un blocco con JavaScript proprio, collegato agli stati IOBroker. Vedi [descrizione] (docs/en/fbd.md)",
64
+ "es": "El editor de código (Mónaco), los bloques Blockly y Rules solo se cargan cuando se abre un guion de ese tipo, por lo que el editor se inicia más rápido\nDiagramas de bloques de funciones (FBD, al estilo de CFC): temporizadores, contadores, chanclas, bordes, comparación, aritmética, conversiones, control, calendario (cron, sun events), registro y mensajes, y un bloque con su propio JavaScript, conectado a los estados de IOBroker. Vea [la descripción] (docs/en/fbd.md)",
65
+ "pl": "Edytor kodu (Monaco), Blockly i bloki Reguły są ładowane tylko po otwarciu tego rodzaju skryptu, więc edytor uruchamia się szybciej\nDodano diagramy blokowe funkcji (FBD, w stylu CFC): timery, liczniki, klapki, krawędzie, porównanie, arytmetyka, konwersje, sterowanie, kalendarz (cron, zdarzenia słoneczne), dzienniki i wiadomości oraz blok z własnym JavaScript - podłączony do stanów ioBroker. Patrz [opis] (docs/en/fbd.md)",
66
+ "uk": "Редактор коду (Монако), блоки Blockly та Rules завантажуються лише тоді, коли відкривається такий сценарій, тому редактор запускається швидше\nДодані функціональні блокові діаграми (FBD, в стилі CFC): таймери, лічильники, шльопанці, ребра, порівняння, арифметика, перетворення, управління, календар (cron, sun events), журнал і повідомлення, а також блок з власним JavaScript - підключений до станів IObroker. Див. [опис] (docs/uk/fbd.md)",
67
+ "zh-cn": "代码编辑器(摩纳哥)、Blockly 和 Rules 块仅在打开此类脚本时加载,因此编辑器启动速度更快\n添加了函数方框图(FBD,采用 CFC 风格):计时器、计数器、触发器、边缘、比较、算术、转换、控制、日历(cron、sun 事件)、日志和消息,以及带有自己的 JavaScript 的方块(连接到 IOBroker 状态)。参见 [描述](docs/en/fbd.md)"
68
+ },
43
69
  "10.2.5": {
44
70
  "en": "Added the functions help dialog in editor",
45
71
  "de": "Hilfedialog im Editor hinzugefügt",
@@ -104,32 +130,6 @@
104
130
  "pl": "Zasady: wybór stanu stałego",
105
131
  "uk": "Правила: вибір штату фіксований",
106
132
  "zh-cn": "规则:选州固定"
107
- },
108
- "10.2.0": {
109
- "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",
110
- "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",
111
- "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Когда два провайдера предлагают модель с одинаковым названием (например, прокси-сервер и поставщик, стоящий за ним), выбор того, кто из них обслужил, решал тот, кто ответил первым, и может меняться от одной перезагрузки к следующей. Теперь выигрывает тот провайдер, который настроил первым, поэтому предпочтение отдается прямому маршруту, а не прокси-серверу",
112
- "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",
113
- "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",
114
- "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",
115
- "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",
116
- "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",
117
- "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",
118
- "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Коли два постачальники пропонують однойменну модель - наприклад, проксі та постачальник, який стоїть за нею, - хто з них обслуговував, це вирішувалось тим, хто відповідав першим, і він може змінюватися від одного перезавантаження до іншого. Постачальник, налаштований першим, виграє зараз, тому прямий маршрут є кращим перед проксі-сервером",
119
- "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当两个提供商提供同名模型时(例如代理及其背后的供应商),则由最先回答的人决定,并且可以从一次重新加载更改为下一次重新加载。首先配置的提供商现在获胜,因此直接路由优先于代理"
120
- },
121
- "10.1.4": {
122
- "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)",
123
- "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)",
124
- "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)",
125
- "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)",
126
- "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)",
127
- "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)",
128
- "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)",
129
- "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)",
130
- "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)",
131
- "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)",
132
- "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)"
133
133
  }
134
134
  },
135
135
  "platform": "Javascript/Node.js",
@@ -186,7 +186,7 @@
186
186
  },
187
187
  "dependencies": [
188
188
  {
189
- "js-controller": ">=7.2.2"
189
+ "js-controller": ">=7.2.5"
190
190
  }
191
191
  ],
192
192
  "globalDependencies": [
@@ -548,6 +548,8 @@
548
548
  "gptBaseUrl": "",
549
549
  "gptBaseUrlKey": "",
550
550
  "aiReasoningEffort": "",
551
+ "aiMaxTokens": 8192,
552
+ "historyVersions": 30,
551
553
  "aiEditorHelpers": true,
552
554
  "claudeKey": "",
553
555
  "geminiKey": "",
@@ -611,7 +613,7 @@
611
613
  "language": "javascript",
612
614
  "views": {
613
615
  "javascript": {
614
- "map": "function(doc) { if (doc.type === 'script' && doc.common.engineType.match(/^[jJ]ava[sS]cript|^[cC]offee[sS]cript|^[tT]ype[sS]cript|^Blockly|^Rules/)) emit(doc.common.name, doc); }"
616
+ "map": "function(doc) { if (doc.type === 'script' && doc.common.engineType.match(/^[jJ]ava[sS]cript|^[cC]offee[sS]cript|^[tT]ype[sS]cript|^Blockly|^Rules|^FBD/)) emit(doc.common.name, doc); }"
615
617
  }
616
618
  }
617
619
  },
@@ -907,6 +909,30 @@
907
909
  "write": false
908
910
  },
909
911
  "native": {}
912
+ },
913
+ {
914
+ "_id": "debug.fbd",
915
+ "type": "state",
916
+ "common": {
917
+ "name": {
918
+ "en": "Values of a function block diagram for the online view",
919
+ "de": "Werte eines Funktionsplans für die Onlineansicht",
920
+ "ru": "Значения функциональной блок-схемы для онлайн-просмотра",
921
+ "pt": "Valores de um diagrama de blocos funcionais para a vista online",
922
+ "nl": "Waarden van een functieblokdiagram voor de online weergave",
923
+ "fr": "Valeurs d'un diagramme de blocs fonctionnels pour la vue en ligne",
924
+ "it": "Valori di un diagramma a blocchi funzionali per la vista online",
925
+ "es": "Valores de un diagrama de bloques de funciones para la vista en línea",
926
+ "pl": "Wartości diagramu bloków funkcyjnych dla widoku online",
927
+ "uk": "Значення функціональної блок-схеми для онлайн-перегляду",
928
+ "zh-cn": "功能块图在线视图的数值"
929
+ },
930
+ "type": "string",
931
+ "role": "json",
932
+ "read": true,
933
+ "write": false
934
+ },
935
+ "native": {}
910
936
  }
911
937
  ]
912
938
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.javascript",
3
- "version": "10.2.5",
3
+ "version": "10.4.0",
4
4
  "description": "Rules Engine for ioBroker",
5
5
  "author": "bluefox <dogafox@gmail.com>",
6
6
  "contributors": [
@@ -42,15 +42,15 @@
42
42
  },
43
43
  "dependencies": {
44
44
  "@iobroker/adapter-core": "^3.4.3",
45
- "@iobroker/types": "^7.2.2",
46
- "@types/node": "^22.20.3",
45
+ "@iobroker/types": "^7.2.4",
46
+ "@types/node": "^22.20.5",
47
47
  "axios": "^1.20.0",
48
48
  "jsonata": "^2.2.2",
49
49
  "jszip": "^3.10.2",
50
50
  "node-inspect": "^2.0.0",
51
51
  "node-schedule": "2.1.1",
52
- "nodemailer": "^10.0.10",
53
- "prettier": "^3.9.7",
52
+ "nodemailer": "^10.0.14",
53
+ "prettier": "^3.9.9",
54
54
  "semver": "^7.8.5",
55
55
  "suncalc2": "^1.8.1",
56
56
  "typescript": "~6.0.3",
@@ -65,14 +65,14 @@
65
65
  "@iobroker/build-tools": "^3.0.3",
66
66
  "@iobroker/eslint-config": "^2.3.4",
67
67
  "@iobroker/plugin-sentry": "^3.2.1",
68
- "@iobroker/testing": "^6.2.2",
68
+ "@iobroker/testing": "^6.3.0",
69
69
  "@tsconfig/node22": "^22.0.6",
70
70
  "@types/node-schedule": "^2.1.8",
71
71
  "@types/nodemailer": "^8.0.2",
72
72
  "@types/request": "^2.48.13",
73
73
  "@types/suncalc": "^1.9.2",
74
74
  "alcalzone-shared": "^5.0.0",
75
- "jsdom": "^30.1.0",
75
+ "jsdom": "^30.1.1",
76
76
  "timekeeper": "^2.3.1"
77
77
  },
78
78
  "bugs": {