iobroker.javascript 10.1.0 → 10.1.2

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 (140) hide show
  1. package/README.md +14 -9
  2. package/admin/assets/AiChatPanel-D3eFcu56.js +242 -0
  3. package/admin/assets/AiDiffView-DtbcD6Yx.js +1 -0
  4. package/admin/assets/{Debugger-DCMWjeGm.js → Debugger-DsoSdux9.js} +4 -4
  5. package/admin/assets/Error-1oeF0cix.js +1 -0
  6. package/admin/assets/Import-BH2X_ziv.js +1 -0
  7. package/admin/assets/RulesEditor-BcGsf9n4.css +1 -0
  8. package/admin/assets/RulesEditor-CJ9TvZtR.js +1 -0
  9. package/admin/assets/{ScriptEditor-CMYUt5S4.js → ScriptEditor-DNcGhbcU.js} +2 -2
  10. package/admin/assets/ScriptEditorVanillaMonaco-BBoOLFln.js +3 -0
  11. package/admin/assets/{_virtual_mf-localSharedImportMap___mfe_internal__iobroker_javascript__mf_owner__1-7EPUlgCk.js → _virtual_mf-localSharedImportMap___mfe_internal__iobroker_javascript__mf_owner__1-BK6m6sZx.js} +1 -1
  12. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DezK0U6r.js +1243 -0
  13. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-_q6w9ugW.js +9 -0
  14. package/admin/assets/aiPromptBuilder-DSYziAVr.js +1 -0
  15. package/admin/assets/{blockly-C4zJerWL.js → blockly-DBw-ytY1.js} +11 -11
  16. package/admin/assets/{blocks_action-CvnOHXwt.js → blocks_action-Bpe-Zvqj.js} +1 -1
  17. package/admin/assets/{blocks_convert-BZlKcd02.js → blocks_convert-DS1wCMO_.js} +3 -3
  18. package/admin/assets/blocks_logic-DQaroQTu.js +1 -0
  19. package/admin/assets/blocks_number-C998FOz6.js +1 -0
  20. package/admin/assets/{blocks_object-B64vSfel.js → blocks_object-BGYvC_4Y.js} +1 -1
  21. package/admin/assets/blocks_procedures-BZFhrnZ3.js +3 -0
  22. package/admin/assets/blocks_sendto-BoOZkX-e.js +5 -0
  23. package/admin/assets/{blocks_switch-DViYCmQd.js → blocks_switch-CfjY75wV.js} +2 -2
  24. package/admin/assets/blocks_system-C69gZMAz.js +1 -0
  25. package/admin/assets/{blocks_text-BOvtHN2r.js → blocks_text-Dp6RaJ_p.js} +1 -1
  26. package/admin/assets/{blocks_time-BH2F-ylT.js → blocks_time-CmECitUh.js} +1 -1
  27. package/admin/assets/blocks_timeout-BI8OyiNa.js +1 -0
  28. package/admin/assets/blocks_trigger-X7O3INGz.js +2 -0
  29. package/admin/assets/blocks_words-BhHIf_1o.js +1 -0
  30. package/admin/assets/{cronHoverProvider-DjY3jLvQ.js → cronHoverProvider-BhX-SvkB.js} +1 -1
  31. package/admin/assets/{dist-D6o4h8Pd.js → dist-CaOsN0XW.js} +1 -1
  32. package/admin/assets/{field_cron-BMQWPb61.js → field_cron-BJLkgNzf.js} +1 -1
  33. package/admin/assets/{field_oid-BGIMv9gw.js → field_oid-CJZIeruf.js} +1 -1
  34. package/admin/assets/{field_script-CdzYBCe6.js → field_script-4IGidWJ7.js} +1 -1
  35. package/admin/assets/helpers-DaSC8t53.js +1 -0
  36. package/admin/assets/{hostInit-DBlZi_Kt.js → hostInit-B3IjMQKW.js} +1 -1
  37. package/admin/assets/index-DKhQ45Yn.js +871 -0
  38. package/admin/assets/index-Z8Hkv58g.css +1 -0
  39. package/admin/assets/{inlineChatWidget-SDoyVtOR.js → inlineChatWidget-CBVgT6FZ.js} +1 -1
  40. package/admin/assets/{inlineDiffController-CnHE3Rwd.js → inlineDiffController-DianrKl1.js} +1 -1
  41. package/admin/assets/{mf-entry-bootstrap-0-a03ecebd.js → mf-entry-bootstrap-0-a65094d3.js} +3 -2
  42. package/admin/assets/stateHoverProvider-CIFNrLee.js +9 -0
  43. package/admin/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__iobroker_javascript__remoteEntry_js-BO-WKj5V.js +1 -0
  44. package/admin/custom/assets/Components-BCQTjBgm.js +1 -0
  45. package/admin/custom/assets/{_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1-DljJyQQg.js → _virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1-BuAc8OyX.js} +1 -1
  46. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-BGJv4zZP.js +1 -0
  47. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_emotion_mf_1_styled__loadShare__.js-BD2OkSge.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_emotion_mf_1_styled__loadShare__.js-B4E6MFJ4.js} +1 -1
  48. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-pM642JFd.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-aRlxyEhq.js} +86 -86
  49. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-DQwzYx75.js +1494 -0
  50. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare__leaflet__loadShare__.js-h-rCw3iz.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare__leaflet__loadShare__.js-n2zIPi0L.js} +1 -1
  51. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-xxszBNje.js +9 -0
  52. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__prebuild__date_mf_2_fns__prebuild__-D5hqXJXI.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__prebuild__date_mf_2_fns__prebuild__-Tq7tesSS.js} +1 -1
  53. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__prebuild__leaflet__prebuild__-DARUoA03.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__prebuild__leaflet__prebuild__-BeF0jEWM.js} +1 -1
  54. package/admin/custom/assets/{hostInit-0DGPuZTB.js → hostInit-CHwrowP4.js} +1 -1
  55. package/admin/custom/assets/{index-DcFI5r-g.js → index-Cm6xl9K4.js} +1 -1
  56. package/admin/custom/assets/{lib-BlUjuGH7.js → lib-bhrFL6jR.js} +1 -1
  57. package/admin/custom/assets/{mf-entry-bootstrap-0-efd847a6.js → mf-entry-bootstrap-0-f08941e2.js} +3 -2
  58. package/admin/custom/assets/{setYear-BaCcPbbI.js → setYear-DzTZ2h9A.js} +1 -1
  59. package/admin/custom/assets/virtualExposes-B5LJmnfO.js +1 -0
  60. package/admin/custom/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-ML-chjs6.js +1 -0
  61. package/admin/custom/assets/{virtual_mf-exposes___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-DPck7zEs.js → virtual_mf-exposes___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-C3ImybiM.js} +2 -2
  62. package/admin/custom/customComponents.js +12 -1
  63. package/admin/custom/i18n/de.json +11 -1
  64. package/admin/custom/i18n/en.json +11 -1
  65. package/admin/custom/i18n/es.json +11 -1
  66. package/admin/custom/i18n/fr.json +11 -1
  67. package/admin/custom/i18n/it.json +11 -1
  68. package/admin/custom/i18n/nl.json +11 -1
  69. package/admin/custom/i18n/pl.json +11 -1
  70. package/admin/custom/i18n/pt.json +11 -1
  71. package/admin/custom/i18n/ru.json +11 -1
  72. package/admin/custom/i18n/uk.json +11 -1
  73. package/admin/custom/i18n/zh-cn.json +11 -1
  74. package/admin/i18n/de.json +3 -0
  75. package/admin/i18n/en.json +3 -0
  76. package/admin/i18n/es.json +3 -0
  77. package/admin/i18n/fr.json +3 -0
  78. package/admin/i18n/it.json +3 -0
  79. package/admin/i18n/nl.json +3 -0
  80. package/admin/i18n/pl.json +3 -0
  81. package/admin/i18n/pt.json +3 -0
  82. package/admin/i18n/ru.json +3 -0
  83. package/admin/i18n/uk.json +3 -0
  84. package/admin/i18n/zh-cn.json +3 -0
  85. package/admin/jsonConfig.json +31 -0
  86. package/admin/mf-manifest.json +1 -1
  87. package/admin/mf-stats.json +1 -1
  88. package/admin/remoteEntry.js +12 -1
  89. package/admin/tab.html +6 -15
  90. package/build/lib/javascript.d.ts +48 -0
  91. package/build/lib/sandbox.js +2 -0
  92. package/build/lib/sandbox.js.map +1 -1
  93. package/build/lib/secrets.js +220 -0
  94. package/build/lib/secrets.js.map +1 -0
  95. package/build/main.js +51 -0
  96. package/build/main.js.map +1 -1
  97. package/build/types.d.ts +7 -0
  98. package/docs/en/blockly.md +29 -0
  99. package/docs/en/javascript.md +56 -0
  100. package/io-package.json +28 -27
  101. package/package.json +2 -2
  102. package/admin/assets/AiChatPanel-C4kuqP2U.js +0 -237
  103. package/admin/assets/AiDiffView-zJTEnv05.js +0 -1
  104. package/admin/assets/AiScriptAnalyzer--BHML2rN.js +0 -9
  105. package/admin/assets/BlocklyEditor-BB77aFJI.js +0 -84
  106. package/admin/assets/ContextWrapper-C2yvd2Tn.css +0 -1
  107. package/admin/assets/ContextWrapper-W2H0z6zD.js +0 -136
  108. package/admin/assets/Error-CBC2oZzb.js +0 -1
  109. package/admin/assets/Import-B-F9IhZ-.js +0 -1
  110. package/admin/assets/RulesEditor-ByjgEaVo.js +0 -1
  111. package/admin/assets/RulesEditor-k-DMHotH.css +0 -1
  112. package/admin/assets/ScriptEditorVanillaMonaco-v12-gORS.js +0 -3
  113. package/admin/assets/Send-CChqR5Oy.js +0 -1
  114. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DuplUOZN.js +0 -1243
  115. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-JkwfVf8d.js +0 -9
  116. package/admin/assets/aiCodeLensProvider-BGvIu6hH.js +0 -4
  117. package/admin/assets/aiPromptBuilder-Bs27qOHT.js +0 -7
  118. package/admin/assets/back-CXiqI7Po.jpg +0 -0
  119. package/admin/assets/blocklyDarkTheme-DEiAX5DT.js +0 -1
  120. package/admin/assets/blocks_logic-B33Pypxr.js +0 -1
  121. package/admin/assets/blocks_number-k2IjE7OH.js +0 -1
  122. package/admin/assets/blocks_procedures-BpvNI5dO.js +0 -3
  123. package/admin/assets/blocks_sendto-pwZchfe0.js +0 -5
  124. package/admin/assets/blocks_system-BZZcGqTJ.js +0 -1
  125. package/admin/assets/blocks_timeout-C3BoW4XJ.js +0 -1
  126. package/admin/assets/blocks_trigger-gwXvuAHV.js +0 -2
  127. package/admin/assets/blocks_words-D8PL_nSE.js +0 -1
  128. package/admin/assets/helpers-Crmcgphg.js +0 -1
  129. package/admin/assets/index-BHhhebRG.css +0 -1
  130. package/admin/assets/index-BvPVHv3P.js +0 -192
  131. package/admin/assets/javascript-DVIhlTDr.js +0 -218
  132. package/admin/assets/mjs-Bh7xFIpd.js +0 -90
  133. package/admin/assets/stateHoverProvider-D0iXo6YF.js +0 -9
  134. package/admin/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__iobroker_javascript__remoteEntry_js-DYEYnOkt.js +0 -1
  135. package/admin/custom/assets/Components-CuFt9lAY.js +0 -1
  136. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-D0M1SjIE.js +0 -1
  137. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-BLelmJ7Y.js +0 -1494
  138. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-BGiB1l5e.js +0 -9
  139. package/admin/custom/assets/virtualExposes-DGxNcyb6.js +0 -1
  140. package/admin/custom/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-DVNwFcUr.js +0 -1
package/build/types.d.ts CHANGED
@@ -7,6 +7,7 @@ import type { Scheduler, SchedulerRule } from './lib/scheduler';
7
7
  import type { EventObj } from './lib/eventObj';
8
8
  import type { PatternEventCompareFunction } from './lib/patternCompareFunctions';
9
9
  import type { AstroEvent } from './lib/consts';
10
+ import type { Secrets } from './lib/secrets';
10
11
 
11
12
  /** ECMAScript version the user scripts are compiled for */
12
13
  export type TsTarget = 'es2018' | 'es2019' | 'es2020' | 'es2021' | 'es2022' | 'es2023' | 'es2024' | 'es2025' | 'esnext';
@@ -23,6 +24,8 @@ export interface JavaScriptAdapterConfig {
23
24
  enableSetObject: boolean;
24
25
  enableSendToHost: boolean;
25
26
  enableExec: boolean;
27
+ /** Scripts may read the central ioBroker credential store via the global `SECRETS` object */
28
+ enableSecrets?: boolean;
26
29
  libraries: string;
27
30
  libraryTypings: string;
28
31
  subscribe: boolean;
@@ -206,6 +209,8 @@ export type SandboxType = {
206
209
  scriptName: string;
207
210
  instance: number;
208
211
  defaultDataDir: string;
212
+ /** Decrypted credentials of the central ioBroker credential store, e.g. `SECRETS.CameraPassword.key` */
213
+ SECRETS: Secrets;
209
214
  verbose: boolean | undefined;
210
215
  exports: Record<string, any>;
211
216
  require: (md: string) => any;
@@ -799,4 +804,6 @@ export interface JavascriptContext {
799
804
  logWithLineInfo: (message: string) => void;
800
805
  schedules?: string[];
801
806
  allowSelfSignedCerts: boolean;
807
+ /** Decrypted credentials of the central ioBroker credential store, exposed to the scripts as `SECRETS` */
808
+ secrets: Secrets;
802
809
  }
@@ -16,6 +16,8 @@
16
16
  - [Create state](#create-state)
17
17
  - [Get value of state](#get-value-of-state)
18
18
  - [Get Object ID](#get-object-id)
19
+ - [State exists](#state-exists)
20
+ - [Credential](#credential)
19
21
  - [Actions Blocks](#actions-blocks)
20
22
  - [Exec - execute](#exec---execute)
21
23
  - [request URL](#request-url)
@@ -793,6 +795,33 @@ if ((await existsStateAsync('zigbee.0.187a3efffee9e4e8.load_power'))) {
793
795
 
794
796
  **Note:** With the adapter setting *"Do not subscribe to all states on start"* enabled, `existsState` cannot be evaluated synchronously. The block emits the async form (`await existsStateAsync(...)`), so it works correctly in both modes.
795
797
 
798
+ ### Credential
799
+
800
+ Reads one field of the central credential storage, which is managed in the admin under
801
+ **Basic settings** -> **Credentials**. The secret fields are stored encrypted; the block hands the
802
+ decrypted value to the script, so a password never has to be written into a script.
803
+
804
+ The first dropdown lists the credentials that exist, the second one the fields of the selected
805
+ credential — a credential has either a single **key** (API keys, passwords) or a **login** and a
806
+ **password**. If the instance is not running while the editor is open, the credential list is
807
+ unknown and the name is typed in instead.
808
+
809
+ ```
810
+ Send to telegram [credential [CameraPassword] field [key]]
811
+ ```
812
+
813
+ The generated JavaScript is:
814
+
815
+ ```javascript
816
+ sendTo('telegram.0', SECRETS['CameraPassword']?.key);
817
+ ```
818
+
819
+ The value is always current — editing a credential in the admin takes effect immediately, without
820
+ restarting the script. A credential that was deleted yields `undefined` instead of an error.
821
+
822
+ **Note:** The instance setting *"Allow scripts to read the credentials"* switches this off. `SECRETS`
823
+ is then empty and the block returns `undefined`.
824
+
796
825
  ## Actions Blocks
797
826
 
798
827
  ### Exec - execute
@@ -75,6 +75,7 @@
75
75
  - [isScriptActive](#isscriptactive)
76
76
  - [name](#scriptName)
77
77
  - [instance](#instance)
78
+ - [SECRETS](#secrets)
78
79
  - [messageTo](#messageto)
79
80
  - [messageToAsync](#messagetoasync)
80
81
  - [onMessage](#onmessage)
@@ -2080,6 +2081,61 @@ if (verbose) {
2080
2081
  }
2081
2082
  ```
2082
2083
 
2084
+ ### SECRETS
2085
+ `SECRETS` - The credentials of the central ioBroker credential storage.
2086
+
2087
+ The credentials are managed in the admin UI under **Basic settings** -> **Credentials**. Every credential
2088
+ has an ID (like `CameraPassword`) and holds either a single **key** (e.g. an API key or a password) or a
2089
+ **login**/**password** pair. The secret fields are stored encrypted with the system secret and are handed
2090
+ to the scripts already decrypted:
2091
+
2092
+ ```js
2093
+ // credential of the type "key"
2094
+ httpGet(`http://camera.local/snapshot?password=${SECRETS.CameraPassword.key}`, (err, result) => {
2095
+ // ...
2096
+ });
2097
+
2098
+ // credential of the type "login"
2099
+ log(`Mail account: ${SECRETS.MyMailAccount.login} / ${SECRETS.MyMailAccount.password}`);
2100
+
2101
+ // credential IDs that are no valid variable names
2102
+ log(SECRETS['My camera'].key);
2103
+ ```
2104
+
2105
+ `SECRETS` is read-only and always up to date: if a credential is added, changed or deleted in the admin UI,
2106
+ the new value is used immediately - neither the adapter nor the script must be restarted.
2107
+
2108
+ If a credential does not exist, `undefined` is returned:
2109
+
2110
+ ```js
2111
+ if (SECRETS.CameraPassword) {
2112
+ log('The camera password is defined');
2113
+ }
2114
+ ```
2115
+
2116
+ #### Which fields does a credential have?
2117
+
2118
+ Every credential has either a single `key` or a `login`/`password` pair. Three ways to find out which:
2119
+
2120
+ - In the instance settings of the JavaScript adapter, the section **Available credentials** lists every
2121
+ credential with its fields and the ready-to-copy expression.
2122
+ - In the editor, the auto-completion after `SECRETS.` offers the credentials that exist, and after the
2123
+ next dot exactly the fields that credential has.
2124
+ - In a script:
2125
+
2126
+ ```js
2127
+ log(JSON.stringify(Object.keys(SECRETS.CameraPassword))); // ["key"]
2128
+ log(JSON.stringify(Object.keys(SECRETS.MyMailAccount))); // ["login","password"]
2129
+ ```
2130
+
2131
+ Blockly has a **credential** block for the same purpose - see the
2132
+ [Blockly documentation](blockly.md#credential).
2133
+
2134
+ The access can be switched off with the instance option **Allow scripts to read the credentials**.
2135
+ `SECRETS` is then empty and a warning is written to the log.
2136
+
2137
+ **Note:** this requires js-controller 7.2 or newer.
2138
+
2083
2139
  ## Option - "Do not subscribe all states on start"
2084
2140
  There are two modes of subscribing to states:
2085
2141
 
package/io-package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "javascript",
4
- "version": "10.1.0",
4
+ "version": "10.1.2",
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.1.2": {
44
+ "en": "Added new rule blocks\nFixed saving of Blockly scripts under Blockly 13: a script containing a named timeout, interval or schedule could not be saved anymore - the save button did not appear (#2349)\nFixed saving of Blockly scripts containing a function with a return value and no statements (#1958)\nThe Blockly regression tests now also cover saving: every block is serialized the way the editor does it and reloaded to the same code\nWhen a block fails while the script is regenerated after a change, the editor now shows the error instead of silently never offering the save button; a failing export shows its error too",
45
+ "de": "Neue Regelblöcke hinzugefügt\nProblem beim Speichern von Blockly-Skripten unter Blockly 13 behoben: Ein Skript, das ein benanntes Timeout, Intervall oder einen Zeitplan enthielt, konnte nicht mehr gespeichert werden – die Schaltfläche „Speichern“ wurde nicht angezeigt (#2349).\nProblem beim Speichern von Blockly-Skripten behoben, die eine Funktion mit Rückgabewert, aber keine Anweisungen enthalten (#1958)\nDie Blockly-Regressionstests umfassen nun auch das Speichern: Jeder Block wird auf die gleiche Weise wie vom Editor serialisiert und in denselben Code wieder geladen.\nWenn ein Block beim Neugenerieren des Skripts nach einer Änderung fehlschlägt, zeigt der Editor nun den Fehler an, anstatt die Schaltfläche „Speichern“ stillschweigend nicht anzubieten; auch ein fehlgeschlagener Export zeigt seinen Fehler an.",
46
+ "ru": "Добавлены новые блоки правил.\nИсправлена ошибка сохранения скриптов Blockly в Blockly 13: скрипт, содержащий именованный таймаут, интервал или расписание, больше нельзя было сохранить — кнопка сохранения не отображалась (#2349)\nИсправлена ошибка сохранения скриптов Blockly, содержащих функцию с возвращаемым значением и без операторов (#1958)\nВ тестах регрессии Blockly теперь также проверяется сохранение: каждый блок сериализуется так же, как это делает редактор, и загружается в тот же самый код.\nТеперь, если при перегенерации скрипта после внесения изменений блок кода завершается с ошибкой, редактор отображает сообщение об ошибке, вместо того чтобы молча предлагать кнопку сохранения; при неудачном экспорте также отображается сообщение об ошибке.",
47
+ "pt": "Adicionados novos blocos de regras\nCorreção no salvamento de scripts Blockly no Blockly 13: um script contendo um tempo limite, intervalo ou agendamento nomeado não podia mais ser salvo - o botão de salvar não aparecia (#2349)\nCorreção no salvamento de scripts Blockly contendo uma função com um valor de retorno e nenhuma instrução (#1958)\nOs testes de regressão do Blockly agora também abrangem o salvamento: cada bloco é serializado da mesma forma que o editor faz e recarregado com o mesmo código.\nQuando um bloco falha durante a regeneração do script após uma alteração, o editor agora exibe o erro em vez de simplesmente não oferecer o botão de salvar; uma exportação com falha também exibe o erro.",
48
+ "nl": "Nieuwe regelblokken toegevoegd\nOpgelost probleem met het opslaan van Blockly-scripts onder Blockly 13: een script met een benoemde time-out, interval of schema kon niet meer worden opgeslagen - de knop 'Opslaan' verscheen niet (#2349)\nHet opslaan van Blockly-scripts met een functie met een retourwaarde en zonder instructies is nu opgelost (#1958).\nDe regressietests van Blockly omvatten nu ook het opslaan: elk blok wordt geserialiseerd zoals de editor dat doet en opnieuw geladen met dezelfde code.\nAls een codeblok mislukt tijdens het opnieuw genereren van het script na een wijziging, toont de editor nu de foutmelding in plaats van de knop 'Opslaan' stilzwijgend te negeren; een mislukte export toont ook de bijbehorende foutmelding.",
49
+ "fr": "Ajout de nouveaux blocs de règles\nCorrection de l'enregistrement des scripts Blockly sous Blockly 13 : un script contenant un délai d'expiration, un intervalle ou une planification nommés ne pouvait plus être enregistré - le bouton d'enregistrement n'apparaissait pas (#2349)\nCorrection de l'enregistrement des scripts Blockly contenant une fonction avec une valeur de retour et aucune instruction (#1958)\nLes tests de régression de Blockly couvrent désormais également la sauvegarde : chaque bloc est sérialisé de la même manière que l’éditeur et rechargé avec le même code.\nLorsqu'un bloc échoue pendant la régénération du script après une modification, l'éditeur affiche désormais l'erreur au lieu de ne jamais proposer le bouton Enregistrer ; une exportation ayant échoué affiche également son erreur.",
50
+ "it": "Sono stati aggiunti nuovi blocchi di regole.\nRisolto il problema di salvataggio degli script di Blockly in Blockly 13: uno script contenente un timeout, un intervallo o una pianificazione con nome non poteva più essere salvato - il pulsante di salvataggio non veniva visualizzato (#2349)\nRisolto il problema di salvataggio degli script Blockly contenenti una funzione con un valore di ritorno e senza istruzioni (#1958)\nI test di regressione di Blockly ora coprono anche il salvataggio: ogni blocco viene serializzato nello stesso modo in cui lo fa l'editor e ricaricato nello stesso codice\nQuando un blocco fallisce durante la rigenerazione dello script dopo una modifica, l'editor ora mostra l'errore invece di non offrire mai silenziosamente il pulsante di salvataggio; anche un'esportazione non riuscita mostra il relativo errore.",
51
+ "es": "Se agregaron nuevos bloques de reglas\nSe corrigió el guardado de scripts de Blockly en Blockly 13: un script que contenía un tiempo de espera, intervalo o programación con nombre ya no se podía guardar; el botón de guardar no aparecía (#2349).\nSe corrigió el guardado de scripts de Blockly que contienen una función con un valor de retorno y sin instrucciones (#1958).\nLas pruebas de regresión de Blockly ahora también cubren el guardado: cada bloque se serializa de la forma en que lo hace el editor y se vuelve a cargar en el mismo código.\nCuando un bloque falla mientras el script se regenera después de un cambio, el editor ahora muestra el error en lugar de no ofrecer nunca el botón de guardar; una exportación fallida también muestra su error.",
52
+ "pl": "Dodano nowe bloki reguł\nNaprawiono zapisywanie skryptów Blockly w Blockly 13: skryptu zawierającego nazwany limit czasu, interwał lub harmonogram nie można było już zapisać — przycisk zapisu nie pojawiał się (#2349)\nNaprawiono zapisywanie skryptów Blockly zawierających funkcję z wartością zwracaną i bez instrukcji (#1958)\nTesty regresji Blockly obejmują teraz również zapisywanie: każdy blok jest serializowany w taki sam sposób, w jaki robi to edytor, a następnie ładowany ponownie do tego samego kodu\nGdy blok ulegnie awarii podczas ponownego generowania skryptu po zmianie, edytor teraz wyświetla błąd zamiast nie wyświetlać przycisku zapisu; nieudany eksport również wyświetla swój błąd",
53
+ "uk": "Додано нові блоки правил\nВиправлено збереження скриптів Blockly у Blockly 13: скрипт, що містить іменований тайм-аут, інтервал або розклад, більше не міг бути збережений - кнопка збереження не відображалася (#2349)\nВиправлено збереження блокових скриптів, що містять функцію з поверненим значенням та без операторів (#1958).\nРегресійні тести Blockly тепер також охоплюють збереження: кожен блок серіалізується так само, як це робить редактор, і перезавантажується в той самий код.\nКоли блок завершується невдачею під час перегенерації скрипта після зміни, редактор тепер показує помилку, а не мовчки ніколи не пропонував кнопку збереження; невдалий експорт також показує свою помилку.",
54
+ "zh-cn": "新增规则块\n修复了 Blockly 13 下 Blockly 脚本的保存问题:包含命名超时、间隔或计划的脚本无法再保存 - 保存按钮不显示 (#2349)\n修复了保存包含带返回值但没有语句的函数的 Blockly 脚本的问题 (#1958)\nBlockly 的回归测试现在也涵盖了保存操作:每个代码块都会按照编辑器的方式进行序列化,并重新加载到相同的代码中。\n如果脚本在修改后重新生成时某个代码块执行失败,编辑器现在会显示错误信息,而不是像以前那样默默地不提供保存按钮;导出失败也会显示错误信息。"
55
+ },
56
+ "10.1.1": {
57
+ "en": "The credentials of the central storage (Basic settings -> Credentials) are available in the scripts as `SECRETS`, e.g. `SECRETS.CameraPassword.key`. The values are decrypted, read-only and are updated live when a credential is edited in the admin UI\nThe editor knows the credentials that exist: after `SECRETS.` it offers their names, and after the next dot exactly the fields the selected credential has\nAdded the Blockly block \"credential\", which reads one field of the central credential storage\nThe instance settings list the available credentials with their fields and the expression a script uses for them",
58
+ "de": "Die Zugangsdaten für den zentralen Speicher (Grundeinstellungen → Zugangsdaten) sind in den Skripten als `SECRETS` verfügbar, z. B. `SECRETS.CameraPassword.key`. Die Werte sind entschlüsselt, schreibgeschützt und werden live aktualisiert, sobald ein Zugangsdatum in der Admin-Oberfläche bearbeitet wird.\nDer Editor kennt die vorhandenen Zugangsdaten: Nach `SECRETS.` werden deren Namen angezeigt, und nach dem nächsten Punkt genau die Felder, die die ausgewählten Zugangsdaten enthalten.\nDer Blockly-Block „credential“ wurde hinzugefügt, der ein Feld des zentralen Anmeldeinformationsspeichers ausliest.\nDie Instanzeinstellungen listen die verfügbaren Anmeldeinformationen mit ihren Feldern und dem Ausdruck auf, den ein Skript dafür verwendet.",
59
+ "ru": "Учетные данные центрального хранилища (Основные настройки -> Учетные данные) доступны в скриптах как `SECRETS`, например, `SECRETS.CameraPassword.key`. Значения расшифрованы, доступны только для чтения и обновляются в режиме реального времени при редактировании учетных данных в административном интерфейсе.\nРедактор знает существующие учетные данные: после `SECRETS.` он отображает их названия, а после следующей точки — точное описание полей, которыми обладают выбранные учетные данные.\nДобавлен блок Blockly \"учетные данные\", который считывает одно поле из центрального хранилища учетных данных.\nВ параметрах экземпляра отображаются доступные учетные данные с указанием их полей и выражения, используемого скриптом для их обработки.",
60
+ "pt": "As credenciais do armazenamento central (Configurações básicas -> Credenciais) estão disponíveis nos scripts como `SECRETS`, por exemplo, `SECRETS.CameraPassword.key`. Os valores são descriptografados, somente leitura e atualizados em tempo real quando uma credencial é editada na interface administrativa.\nO editor conhece as credenciais existentes: após `SECRETS.`, ele exibe os nomes delas e, após o ponto seguinte, exatamente os campos que a credencial selecionada possui.\nAdicionado o bloco Blockly \"credential\", que lê um campo do armazenamento central de credenciais.\nAs configurações da instância listam as credenciais disponíveis com seus respectivos campos e a expressão que um script utiliza para elas.",
61
+ "nl": "De inloggegevens voor de centrale opslag (Basisinstellingen -> Inloggegevens) zijn beschikbaar in de scripts als `SECRETS`, bijvoorbeeld `SECRETS.CameraPassword.key`. De waarden zijn onversleuteld, alleen-lezen en worden live bijgewerkt wanneer een inloggegeven wordt bewerkt in de beheerdersinterface.\nDe editor kent de bestaande inloggegevens: na `SECRETS.` worden de namen weergegeven, en na de volgende punt worden precies de velden vermeld die de geselecteerde inloggegevens bevatten.\nHet Blockly-blok \"credential\" is toegevoegd, dat één veld uit de centrale opslag voor inloggegevens leest.\nDe instantie-instellingen tonen de beschikbare referenties met hun velden en de expressie die een script hiervoor gebruikt.",
62
+ "fr": "Les identifiants du stockage central (Paramètres de base -> Identifiants) sont disponibles dans les scripts sous le nom `SECRETS`, par exemple `SECRETS.CameraPassword.key`. Ces valeurs sont déchiffrées, en lecture seule et mises à jour en temps réel lorsqu'un identifiant est modifié dans l'interface d'administration.\nL'éditeur connaît les identifiants existants : après `SECRETS.`, il affiche leurs noms, et après le point suivant, les champs exacts de l'identifiant sélectionné.\nAjout du bloc Blockly « credential », qui lit un champ du stockage central des identifiants.\nLes paramètres de l'instance listent les informations d'identification disponibles, leurs champs et l'expression utilisée par un script pour celles-ci.",
63
+ "it": "Le credenziali dell'archivio centrale (Impostazioni di base -> Credenziali) sono disponibili negli script come `SECRETS`, ad esempio `SECRETS.CameraPassword.key`. I valori sono decrittografati, di sola lettura e vengono aggiornati in tempo reale quando una credenziale viene modificata nell'interfaccia di amministrazione.\nL'editor conosce le credenziali esistenti: dopo `SECRETS.` ne mostra i nomi e dopo il punto successivo esattamente i campi che la credenziale selezionata ha\nAggiunto il blocco Blockly \"credential\", che legge un campo dell'archivio centrale delle credenziali.\nLe impostazioni dell'istanza elencano le credenziali disponibili con i relativi campi e l'espressione che uno script utilizza per esse.",
64
+ "es": "Las credenciales del almacenamiento central (Configuración básica -> Credenciales) están disponibles en los scripts como `SECRETS`, por ejemplo, `SECRETS.CameraPassword.key`. Los valores están descifrados, son de solo lectura y se actualizan en tiempo real cuando se edita una credencial en la interfaz de administración.\nEl editor conoce las credenciales existentes: después de `SECRETS.` ofrece sus nombres, y después del siguiente punto exactamente los campos que tiene la credencial seleccionada.\nSe agregó el bloque Blockly \"credential\", que lee un campo del almacenamiento central de credenciales.\nLa configuración de la instancia enumera las credenciales disponibles con sus campos y la expresión que un script utiliza para ellas.",
65
+ "pl": "Dane uwierzytelniające centralnego magazynu (Ustawienia podstawowe -> Dane uwierzytelniające) są dostępne w skryptach jako `SECRETS`, np. `SECRETS.CameraPassword.key`. Wartości są odszyfrowywane, tylko do odczytu i aktualizowane na bieżąco podczas edycji danych uwierzytelniających w interfejsie administratora.\nEdytor zna istniejące dane uwierzytelniające: po poleceniu „SECRETS.” podaje ich nazwy, a po kolejnej kropce dokładnie pola, w których znajdują się wybrane dane uwierzytelniające.\nDodano blok Blockly „poświadczenia”, który odczytuje jedno pole centralnego magazynu poświadczeń\nUstawienia instancji zawierają listę dostępnych poświadczeń wraz z ich polami i wyrażeniem używanym przez skrypt w ich przypadku",
66
+ "uk": "Облікові дані центрального сховища (Основні налаштування -> Облікові дані) доступні у скриптах як `SECRETS`, наприклад, `SECRETS.CameraPassword.key`. Значення розшифровуються, доступні лише для читання та оновлюються в режимі реального часу під час редагування облікових даних в інтерфейсі адміністратора.\nРедактор знає наявні облікові дані: після `SECRETS.` він пропонує їхні імена, а після наступної крапки точно поля, які мають вибрані облікові дані.\nДодано блок Blockly \"credential\", який зчитує одне поле центрального сховища облікових даних.\nУ налаштуваннях екземпляра перелічено доступні облікові дані з їхніми полями та виразом, який використовує для них скрипт.",
67
+ "zh-cn": "中央存储的凭据(基本设置 -> 凭据)在脚本中以 `SECRETS` 的形式提供,例如 `SECRETS.CameraPassword.key`。这些值已解密,为只读,并在管理员界面编辑凭据时实时更新。\n编辑器知道存在的凭据:在“SECRETS.”之后,它会显示凭据的名称;在下一个点之后,它会显示所选凭据包含的具体字段。\n新增了 Blockly 代码块“credential”,该代码块读取中央凭证存储中的一个字段。\n实例设置列出了可用的凭据及其字段,以及脚本用于这些凭据的表达式。"
68
+ },
43
69
  "10.1.0": {
44
70
  "en": "Turned `strict` off again for the scripts, as TypeScript 6 enables it by default\nAdded the tab \"TypeScript\" to the settings, where the compiler options for the scripts can be configured\nAdded snapshot tests for the Blockly code generation (`npm run test:blockly`)\nRemoved two leftover `.only` markers that had disabled almost the whole test suite\nPinned the line endings of transformed TypeScript sources to LF, so a compiler update cannot rewrite every script\nMoved the micro benchmarks into `npm run test:performance`, as they measure relative speed against timeouts and cannot block a build\nUpdated Blockly from 11.1.1 to 13.2.1. The generated code is unchanged\n`updateBlockly.js` now copies from the installed npm package instead of cloning the git master branch, so the shipped Blockly version is reproducible\nBlockly is now bundled from the npm package instead of being loaded as vendored script tags. Custom blocks of other adapters keep working unchanged\nRemoved 828 kB of vendored Blockly code from the repository\nConverted all block definitions from JavaScript to TypeScript. The generated code is unchanged\nFixed the object blocks under Blockly 13: the attribute rows were no longer right-aligned, and editing the attributes of an \"object\" block threw\nDropped the dead field editor code of the CRON and script fields, which had been written against Blockly 1.x\nFixed the multi-and/multi-or blocks under Blockly 13, which threw when their conditions were edited\nRemoved a phantom block type \"Convert\" that a stray assignment in the conversion blocks had registered\nAdded `BLOCKLY_TS.md` for adapter developers: what Blockly 13 changed for custom blocks and how to write them in TypeScript\nMoved the Blockly translations into `words.json` and typed the lookup helpers\nRedesign of Rules\nAdded a wizard to the rule editor that builds a rule step by step - trigger, condition and action are configured in place, and the last step shows the finished rule\nThe wizard opens by itself for a newly created rule - once, and not for a duplicated one. Afterwards it stays available in the block palette\nFixed the type declarations of 3rd party libraries: they were placed under the name the library has on disk while their `package.json` went to the name the scripts import, so TypeScript never connected the two and everything imported from such a library was `any` (#2341)\nStopped wrapping a library's declarations in `declare module`, which cut a barrel file off from what it re-exports. Declarations that are not a module themselves are still wrapped\nFixed following the imports inside a declaration file: only the first import of a file was followed, and only if it was on the first line. For rxjs 6 that loaded 6 of its ~800 declaration files\nSide effect imports (`import \"./x\";`) inside a declaration file are now followed as well. `@iobroker/types` consists of nothing else, so the `ioBroker.*` types were missing in scripts and in the editor\nA definition file that cannot be read no longer discards all type declarations of its package\nAdded regression tests for the type declarations of 3rd party libraries, which compile against them and insist that wrong code is rejected\n`createState` now stringifies `common.def` of an object, json or array state, as js-controller expects it and as `setState` already does with the value. Creating such a state with an initial value no longer warns \"Default value has to be stringified\" (#2307)\nDocumented that an object in the second position of `createState` is always the `common`, and how to give a state a non-primitive initial value\nRestored the check of the mirror path in the instance configuration. It was lost when the admin configuration moved to `jsonConfig.json`, so a forbidden path was accepted without a word and only refused later in the log (#2296)\nThe mirror path field now explains what the directory has to be, and suggests one\nScripts are no longer deleted from the database when the mirror directory as a whole becomes unreachable, e.g. because a share is not mounted\nLibraries that name their declarations through an `exports` map are typed now. Their legacy `types` field is often a stub pointing at a file that does not exist - rxjs 7 is one - which left everything imported from them as `any` (#928)\nThe declarations of a library are laid out around its entry point, so `moduleResolution: node10` finds it even when they live in a subdirectory\nThe manifest handed to TypeScript describes that layout instead of the one on disk. An `exports` map pointing at paths that do not exist there made TypeScript refuse the library altogether\nThe package.json of a library is read from disk instead of through Node, which refuses it when the library does not export it\nFixed the mirror tests on macOS. They asserted on the first event a watcher reported, while `fs.watch` there works at directory granularity and sends an event for the watched directory before the one for the file. They now wait for the change they are about, and say what arrived instead if it never comes\nMade the mirror tests independent of how long a watch takes to arm. The change under test is repeated while waiting, so it cannot be made before the watcher is listening - the same commit produced a green and a red macOS job over that",
45
71
  "de": "Ich habe `strict` für die Skripte wieder deaktiviert, da TypeScript 6 es standardmäßig aktiviert.\nDen Einstellungen wurde der Tab „TypeScript“ hinzugefügt, über den die Compileroptionen für die Skripte konfiguriert werden können.\nSnapshot-Tests für die Blockly-Codegenerierung hinzugefügt (`npm run test:blockly`)\nZwei überflüssige `.only`-Markierungen wurden entfernt, die fast die gesamte Testsuite deaktiviert hatten.\nDie Zeilenumbrüche der transformierten TypeScript-Quelltexte wurden auf LF fixiert, sodass ein Compiler-Update nicht jedes Skript überschreiben kann.\nDie Mikro-Benchmarks wurden in `npm run test:performance` verschoben, da sie die relative Geschwindigkeit im Vergleich zu Timeouts messen und einen Build nicht blockieren können.\nBlockly wurde von Version 11.1.1 auf 13.2.1 aktualisiert. Der generierte Code ist unverändert.\n`updateBlockly.js` kopiert nun vom installierten npm-Paket, anstatt den Git-Master-Branch zu klonen, sodass die ausgelieferte Blockly-Version reproduzierbar ist.\nBlockly ist jetzt im npm-Paket enthalten und wird nicht mehr als Skript-Tag geladen. Benutzerdefinierte Blöcke anderer Adapter funktionieren weiterhin unverändert.\n828 kB an mitgeliefertem Blockly-Code wurden aus dem Repository entfernt.\nAlle Blockdefinitionen wurden von JavaScript nach TypeScript konvertiert. Der generierte Code ist unverändert.\nDie Objektblöcke unter Blockly 13 wurden korrigiert: Die Attributzeilen waren nicht mehr rechtsbündig, und das Bearbeiten der Attribute eines „Objekt“-Blocks führte zu einem Fehler.\nDer veraltete Code des Feldeditors für die CRON- und Skriptfelder, der für Blockly 1.x geschrieben worden war, wurde entfernt.\nDie Fehler in den Mehrfach-UND-/Mehrfach-ODER-Blöcken unter Blockly 13, die beim Bearbeiten ihrer Bedingungen zu Problemen führten, wurden behoben.\nEin Phantomblock vom Typ „Konvertieren“, der durch eine fehlerhafte Zuweisung in den Konvertierungsblöcken registriert worden war, wurde entfernt.\nDie Datei `BLOCKLY_TS.md` wurde für Adapterentwickler hinzugefügt: Sie beschreibt die Änderungen in Blockly 13 für benutzerdefinierte Blöcke und wie diese in TypeScript geschrieben werden.\nDie Blockly-Übersetzungen wurden in `words.json` verschoben und die Suchhilfen eingegeben.\nNeugestaltung der Regeln\nDem Regeleditor wurde ein Assistent hinzugefügt, der eine Regel Schritt für Schritt erstellt – Auslöser, Bedingung und Aktion werden direkt konfiguriert, und der letzte Schritt zeigt die fertige Regel an.\nDer Assistent öffnet sich automatisch für eine neu erstellte Regel – einmalig, nicht jedoch für eine duplizierte. Anschließend bleibt er in der Blockpalette verfügbar.\nDie Typdeklarationen von Drittanbieterbibliotheken wurden korrigiert: Sie wurden unter dem Namen abgelegt, den die Bibliothek auf der Festplatte hat, während ihre `package.json` den Namen trug, den die Skripte importieren. Daher konnte TypeScript die beiden nie miteinander verknüpfen, und alles, was aus einer solchen Bibliothek importiert wurde, war `any` (#2341).\nDie Deklarationen einer Bibliothek werden nicht mehr in `declare module` eingeschlossen, wodurch eine Barrel-Datei von ihren Exporten abgeschnitten wurde. Deklarationen, die selbst kein Modul sind, werden weiterhin eingeschlossen.\nDas Problem mit den Importen innerhalb einer Deklarationsdatei wurde behoben: Es wurde nur der erste Import einer Datei berücksichtigt, und zwar nur dann, wenn er in der ersten Zeile stand. Dies betraf rxjs 6, das 6 seiner ca. 800 Deklarationsdateien lud.\nImporte mit Seiteneffekten (`import \"./x\";`) innerhalb einer Deklarationsdatei werden nun ebenfalls berücksichtigt. `@iobroker/types` enthält nichts anderes, daher fehlten die `ioBroker.*`-Typen in Skripten und im Editor.\nEine nicht lesbare Definitionsdatei verwirft nicht mehr alle Typdeklarationen ihres Pakets.\nEs wurden Regressionstests für die Typdeklarationen von Drittanbieterbibliotheken hinzugefügt, die gegen diese kompilieren und darauf bestehen, dass fehlerhafter Code zurückgewiesen wird.\n`createState` wandelt nun den `common.def`-Wert eines Objekts, JSON- oder Array-Zustands in einen String um, wie es js-controller erwartet und wie `setState` es bereits mit dem Wert tut. Das Erstellen eines solchen Zustands mit einem Anfangswert führt nicht mehr zu der Warnung „Standardwert muss in einen String umgewandelt werden“ (#2307).\nEs wurde dokumentiert, dass ein Objekt an der zweiten Position von `createState` immer das `common` ist, und wie man einem Zustand einen nicht-primitiven Anfangswert zuweist.\nDie Überprüfung des Spiegelpfads in der Instanzkonfiguration wurde wiederhergestellt. Sie war verloren gegangen, als die Administratorkonfiguration in die Datei `jsonConfig.json` verschoben wurde, sodass ein verbotener Pfad zunächst ohne Fehlermeldung akzeptiert und erst später im Protokoll als ungültig gemeldet wurde (#2296).\nDas Feld „Spiegelpfad“ erklärt nun, welches Verzeichnis verwendet werden muss, und schlägt eines vor.\nSkripte werden nicht mehr aus der Datenbank gelöscht, wenn das gesamte Spiegelverzeichnis nicht mehr erreichbar ist, z. B. weil eine Freigabe nicht eingebunden ist.\nBibliotheken, die ihre Deklarationen über eine `exports`-Map benennen, sind jetzt typisiert. Ihr veraltetes `types`-Feld ist oft ein Platzhalter, der auf eine nicht existierende Datei verweist – rxjs 7 ist ein Beispiel dafür –, wodurch alles, was von ihnen importiert wird, als `any` (#928) zurückbleibt.\nDie Deklarationen einer Bibliothek sind um ihren Einstiegspunkt herum angeordnet, sodass `moduleResolution: node10` sie auch dann findet, wenn sie sich in einem Unterverzeichnis befinden.\nDas an TypeScript übergebene Manifest beschreibt dieses Layout anstelle des auf der Festplatte befindlichen. Eine `exports`-Map, die auf nicht existierende Pfade verweist, führte dazu, dass TypeScript die Bibliothek vollständig ablehnte.\nDie package.json einer Bibliothek wird von der Festplatte gelesen, anstatt über Node.js, das sie ablehnt, wenn die Bibliothek sie nicht exportiert.\nDie Spiegeltests unter macOS wurden korrigiert. Sie prüften das erste vom Watcher gemeldete Ereignis, während `fs.watch` dort auf Verzeichnisebene arbeitet und ein Ereignis für das überwachte Verzeichnis vor dem für die Datei sendet. Sie warten nun auf die betreffende Änderung und geben das Ergebnis aus, falls diese nicht eintritt.\nDie Spiegeltests wurden unabhängig von der Aktivierungszeit der Watch durchgeführt. Die zu testende Änderung wird während des Wartens wiederholt und kann daher erst erfolgen, nachdem die Watch aktiv ist – derselbe Commit erzeugte sowohl einen grünen als auch einen roten macOS-Job.",
@@ -104,32 +130,6 @@
104
130
  "pl": "Optymalizacja wydajności część 2\nnaprawić filtr w skryptach kart\nNaprawiono przeciek subskrypcji przy zatrzymaniu skryptu dla idów łańcuchowych RegExp- notation (wskaźnik wysyłkowy)\n'extendObject' nie wrzuca się już do skryptu, gdy obiekt zawiera wartości niemodne (np. funkcje)",
105
131
  "uk": "Оптимізація продуктивності частини 2\nвиправити фільтр в скриптах вкладок\nВиправлено протікання підписки на сценарій зупинки для рядкових полів RegExp-notation (диспетчерський індекс)\n`extendObject` не завантажується в скрипт, коли об’єкт містить неклоновані значення (наприклад, функції)",
106
132
  "zh-cn": "业绩优化第2部分\n在标签脚本中修正过滤器\n修复 RegExp Notation 字符串 IDs( 发送索引) 的脚本站订阅漏洞\n当对象包含不可克隆值(例如函数)时,`extend Object'不再丢入脚本"
107
- },
108
- "9.2.3": {
109
- "en": "Performance optimizations done\nAdded on mouse over the value of the state",
110
- "de": "Leistungsoptimierungen durchgeführt\nAuf der Maus über den Wert des Zustands hinzugefügt",
111
- "ru": "Оптимизация производительности\nДобавлено на мыши над стоимостью государства",
112
- "pt": "Otimizações de desempenho feitas\nAdicionado no mouse sobre o valor do estado",
113
- "nl": "Prestatieoptimalisaties uitgevoerd\nToegevoegd aan muis boven de waarde van de status",
114
- "fr": "Optimisations des performances effectuées\nAjouté sur la souris sur la valeur de l'état",
115
- "it": "Ottimizzazione delle prestazioni\nAggiunto sul mouse sopra il valore dello stato",
116
- "es": "Optimizaciones de rendimiento realizadas\nAñadido en el ratón sobre el valor del estado",
117
- "pl": "Optymalizacja wykonania\nDodano na myszce nad wartością stanu",
118
- "uk": "Оптимізація продуктивності\nДодано на мишу над значенням держави",
119
- "zh-cn": "业绩优化\n在鼠标上大于状态值"
120
- },
121
- "9.2.2": {
122
- "en": "Fix: AI chat mode tooltip no longer covers the dropdown options (issue #2201) — moved tooltip to the left of the selector\nClarified the AI chat mode descriptions in the tooltip: Agent is for larger models with tool support and handles both analysis and script creation, Code is for smaller models without tool support (uses two-step plan-then-code) — translations updated in all 11 languages\nAdded the \"is state exists\" block to blockly",
123
- "de": "Fix: AI-Chat-Modus-Tooltip nicht mehr deckt die Dropdown-Optionen (Ausgabe #2201) - verschoben Tooltip auf die linke Seite des Selektors\nKI-Chat-Modus Beschreibungen im Tooltip: Agent ist für größere Modelle mit Werkzeugunterstützung und behandelt sowohl Analyse als auch Skript-Erstellung, Code ist für kleinere Modelle ohne Werkzeugunterstützung (verwendet zweistufigen Plan-then-Code) — Übersetzungen aktualisiert in allen 11 Sprachen\nDer \"is state exist\" Block wurde blockweise hinzugefügt",
124
- "ru": "Исправление: инструментарий режима чата AI больше не покрывает выпадающие опции (выпуск #2201) — перемещаемый инструментарий слева от селектора\nУточнено описание режима чата ИИ в подсказке: Агент предназначен для более крупных моделей с поддержкой инструментов и обрабатывает как анализ, так и создание сценариев, Код предназначен для более мелких моделей без поддержки инструментов (использует двухэтапный план-тогда-код) — переводы обновлены на всех 11 языках\nДобавлен блок «существует государство» для блокировки",
125
- "pt": "Corrigir: A dica do modo de bate-papo de IA não cobre mais as opções suspensas (questão # 2201) — moveu a dica para a esquerda do seletor\nClarified the AI chat mode descriptions in the tooltip: Agent is for major models with tool support and hands both analysis and script creation, Code is for minor models without toool support (uses two-step plan-then-code) — translations updated in all 11 languages\nAdicionado o bloco \"is state existe\" para bloquear",
126
- "nl": "Fix: AI chat mode tooltip heeft geen betrekking meer op de dropdown opties (issue #2201)\nVerduidelijkt de AI chat mode beschrijvingen in de tooltip: Agent is voor grotere modellen met hulpmiddel ondersteuning en behandelt zowel analyse als script creatie, Code is voor kleinere modellen zonder hulpmiddel ondersteuning (gebruikt twee-stap plan-dan-code) Vertalingen bijgewerkt in alle 11 talen\nToegevoegd de \"is status bestaat\" blok te blokkeren",
127
- "fr": "Correction : l'outil en mode chat AI ne couvre plus les options déroulantes (numéro #2201) — l'outil déplacé à gauche du sélecteur\nClarifié les descriptions des modes de chat AI dans l'infobulle : Agent est pour les modèles plus grands avec support d'outil et gère à la fois l'analyse et la création de script, Code est pour les modèles plus petits sans support d'outil (utilise le plan en deux étapes - puis-code) — traductions mises à jour dans les 11 langues\nAjout du bloc « is state exists » pour bloquer",
128
- "it": "Fix: AI chat mode tooltip non copre più le opzioni di discesa (problema #2201) — spostato tooltip a sinistra del selettore\nClarified le descrizioni della modalità di chat AI nel tooltip: L'agente è per i modelli più grandi con supporto degli strumenti e gestisce sia l'analisi che la creazione di script, il codice è per i modelli più piccoli senza supporto degli strumenti (utilizza il codice a due passi) — le traduzioni aggiornate in tutte le 11 lingue\nAggiunto il blocco \"è stato esiste\" per bloccare",
129
- "es": "Fijación: El uso de herramientas de modo de chat AI ya no cubre las opciones desplegables (sue #2201) — mover la punta de la herramienta a la izquierda del selector\nClarified the AI chat mode descriptions in the tooltip: Agent is for larger models with tool support and handles both analysis and script creation, Code is for smaller models without tool support (uses two-step plan-then-code) — translations updated in all 11 languages\nAñadido el bloque \"es estado existe\" para bloquear",
130
- "pl": "Fix: AI chat mode tooltip już nie obejmuje opcji Dropdown (issue # 2201) - przesunięty podpowiedź po lewej stronie selektora\nWyjaśnienie opisów trybu rozmowy AI w podpowiedzi: Agent jest dla większych modeli z obsługą narzędzi i obsługuje zarówno analizy i tworzenia skryptów, Kod jest dla mniejszych modeli bez obsługi narzędzia (używa dwustopniowej plan- theen- code) - tłumaczenia zaktualizowane we wszystkich 11 językach\nDodano blokadę \"is state istnieje\"",
131
- "uk": "Виправлення: Інструментарій режимів AI не більше охоплює параметри випадання (видання #2201) — пересувний інструмент для ліворуч від selector\nНаведено описи режиму AI чату в інструменті: Агент призначений для збільшення моделей з підтримкою інструментів і ручками як аналізу, так і для створення сценаріїв, Код є для менших моделей без підтримки інструменту ( використовує двокроковий план-фін-код) — переклади, оновлено у всіх 11 мовах\nДодано блок-блок \"is State існує\"",
132
- "zh-cn": "固定:AI聊天模式工具提示不再覆盖下拉选项(问题#2201)——移动工具提示到选择器左侧\n整理工具提示中的 AI 聊天模式描述 : Agent 用于具有工具支持的较大模型,并同时处理分析和脚本创建, Code 用于没有工具支持的较小模型(使用双步计划-当时的代码)——所有11种语言的翻译更新\n添加“ 状态存在” 块以阻断"
133
133
  }
134
134
  },
135
135
  "platform": "Javascript/Node.js",
@@ -525,6 +525,7 @@
525
525
  "enableSetObject": false,
526
526
  "enableSendToHost": false,
527
527
  "enableExec": false,
528
+ "enableSecrets": true,
528
529
  "libraries": "",
529
530
  "libraryTypings": "",
530
531
  "subscribe": false,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.javascript",
3
- "version": "10.1.0",
3
+ "version": "10.1.2",
4
4
  "description": "Rules Engine for ioBroker",
5
5
  "author": "bluefox <dogafox@gmail.com>",
6
6
  "contributors": [
@@ -67,7 +67,7 @@
67
67
  "@iobroker/eslint-config": "^2.3.4",
68
68
  "@iobroker/plugin-sentry": "^3.2.0",
69
69
  "@iobroker/testing": "^5.3.0",
70
- "@tsconfig/node22": "^22.0.5",
70
+ "@tsconfig/node22": "^22.0.6",
71
71
  "@types/node-schedule": "^2.1.8",
72
72
  "@types/nodemailer": "^8.0.1",
73
73
  "@types/request": "^2.48.13",