iobroker.javascript 9.2.0 → 9.2.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 (47) hide show
  1. package/README.md +23 -13
  2. package/admin/assets/AiChatPanel-Bbux7LP7.js +315 -0
  3. package/admin/assets/AiInlineProvider-DkgjVSFQ.js +7 -0
  4. package/admin/assets/ScriptEditor-DKljeYQN.js +2 -0
  5. package/admin/assets/ScriptEditorVanillaMonaco-CaFyKuJ2.js +3 -0
  6. package/admin/assets/applyCodeEdit-BdRnbz2g.js +1 -0
  7. package/admin/assets/index-CexrwGGC.js +986 -0
  8. package/admin/assets/{index-DW5CwIma.js → index-DSvAO584.js} +132 -121
  9. package/admin/assets/{index-BI3JsAz_.js → index-DgE6XhUM.js} +1 -1
  10. package/admin/assets/{index-DAkyON1r.js → index-_BUuZlI0.js} +1 -1
  11. package/admin/assets/inlineChatWidget-Cu6rb4Ar.js +2 -0
  12. package/admin/assets/inlineDiffController-DBLpPOe2.js +16 -0
  13. package/admin/assets/{localSharedImportMap-CqvxvyGG.js → localSharedImportMap-BCwqnmn4.js} +1 -1
  14. package/admin/assets/stateHoverProvider-CGChzV5W.js +3 -0
  15. package/admin/assets/{virtual_mf-REMOTE_ENTRY_ID_iobroker_javascript__remoteEntry_js-BJ03G6Pu.js → virtual_mf-REMOTE_ENTRY_ID_iobroker_javascript__remoteEntry_js-DNrEsMrg.js} +2 -2
  16. package/admin/custom/assets/{index-BVwMgafs.js → index-DNKzDki_.js} +152 -152
  17. package/admin/custom/assets/{index-DsIn9jH_.js → index-NItS-TWp.js} +1 -1
  18. package/admin/{assets/index-hwplVCgv.js → custom/assets/index-sozs10Ij.js} +45 -71
  19. package/admin/custom/assets/{localSharedImportMap-C4qXtGUd.js → localSharedImportMap-BxT0VwTO.js} +1 -1
  20. package/admin/custom/assets/{virtual_mf-REMOTE_ENTRY_ID_ConfigCustomJavascriptSet__customComponents_js-DFSXB0v2.js → virtual_mf-REMOTE_ENTRY_ID_ConfigCustomJavascriptSet__customComponents_js-Br3IlnqO.js} +2 -2
  21. package/admin/custom/customComponents.js +1 -1
  22. package/admin/google-blockly/own/blocks_system.js +34 -0
  23. package/admin/google-blockly/own/blocks_words.js +4 -0
  24. package/admin/jsonConfig.json +9 -9
  25. package/admin/mf-manifest.json +1 -1
  26. package/admin/remoteEntry.js +1 -1
  27. package/admin/tab.html +2 -2
  28. package/build/lib/aiProviderResolver.js +80 -0
  29. package/build/lib/aiProviderResolver.js.map +1 -0
  30. package/build/lib/anthropicAdapter.js +175 -0
  31. package/build/lib/anthropicAdapter.js.map +1 -0
  32. package/build/lib/sandbox.js +7 -2
  33. package/build/lib/sandbox.js.map +1 -1
  34. package/build/main.js +141 -107
  35. package/build/main.js.map +1 -1
  36. package/build/types.d.ts +1 -0
  37. package/docs/de/README.md +64 -4
  38. package/docs/de/blockly.md +669 -8
  39. package/docs/en/README.md +62 -4
  40. package/docs/en/blockly.md +33 -0
  41. package/io-package.json +81 -1
  42. package/package.json +1 -1
  43. package/admin/assets/AiChatPanel-sgt697A2.js +0 -296
  44. package/admin/assets/AiInlineProvider-Dd7eKxk4.js +0 -7
  45. package/admin/assets/ScriptEditor-CH4qJzqq.js +0 -2
  46. package/admin/assets/ScriptEditorVanillaMonaco-cB_90T0P.js +0 -1
  47. package/admin/custom/assets/index-CVIpIckw.js +0 -960
package/docs/en/README.md CHANGED
@@ -73,18 +73,76 @@ In the adapter settings under "AI settings", you will find API key fields for ea
73
73
  | **Custom API Base URL** | Base URL for custom providers (e.g. `http://localhost:11434/v1` for Ollama) |
74
74
  | **Custom API key** | Optional API key for custom providers (Ollama doesn't need one) |
75
75
 
76
- Only enter the keys for providers you want to use. Each provider has its own **Test** button.
76
+ All API key fields are rendered as password inputs (masked), and only the keys of providers you actually want to use need to be entered. Each provider has its own **Test** button.
77
+
78
+ ### API Key Security
79
+
80
+ API keys are handled with two layers of protection provided by the ioBroker platform:
81
+
82
+ 1. **`encryptedNative`** — Keys are automatically encrypted using the system secret before being written to the object database. Database dumps or object backups no longer expose the raw keys.
83
+ 2. **`protectedNative`** — Keys are never transmitted to admin web UIs or foreign adapters. Only the `javascript` adapter instance itself can read them via `this.config` (where the ioBroker runtime delivers them transparently decrypted).
84
+
85
+ Because of this, the AI Chat Panel, the inline completion provider, and any other frontend component **no longer access the keys directly**. Instead, they request AI services via a `sendTo` call and let the backend resolve the correct key:
86
+
87
+ ```
88
+ Frontend Backend (this.config, decrypted)
89
+ ──────── ───────────────────────────────
90
+ sendTo('chatCompletion', { → looks up provider → picks gptKey/claudeKey/…
91
+ provider: 'openai', → performs HTTP request to provider
92
+ model: 'gpt-4o', → streams response back
93
+ messages: [...]
94
+ })
95
+ ```
96
+
97
+ A dedicated `sendTo` command is available for discovery:
98
+
99
+ | Command | Payload | Response |
100
+ |---------|---------|----------|
101
+ | `getAvailableAiProviders` | `{}` | `{ providers: [{ provider: 'openai' }, { provider: 'custom', baseUrl: '…' }, …] }` |
102
+
103
+ The response lists only which providers have credentials configured — it never includes the keys themselves. This allows the UI to show the correct provider icons and populate the model dropdown without pulling secrets into the browser.
104
+
105
+ **Upgrade note:** After upgrading from an earlier version, the existing (unencrypted) keys will remain working until the first time you save the adapter settings. When you save, the runtime re-encrypts them. If a key appears blank after the upgrade, re-enter it once in the settings dialog and save.
77
106
 
78
107
  ### Test API Connection
79
108
 
80
- Each provider has a dedicated **Test** button next to its API key field. The test will:
109
+ Each provider has a dedicated **Test** button next to its API key field. Two cases are handled:
110
+
111
+ 1. **Form-value test** — Immediately after entering or editing a key in the settings dialog, the `Test` button uses the current form value (which is still in the browser before saving). This lets you verify a new key before persisting it.
112
+ 2. **Stored-key test** — When the button is invoked from contexts where no form value is available (e.g. the script editor during model discovery), the backend resolves the key from `this.config` based on the selected provider.
113
+
114
+ The test will:
81
115
  - Connect to the provider's API endpoint
82
116
  - Validate the API key
83
- - Return the number of available models
117
+ - Return the number of available chat models
118
+
119
+ The test-button icons are embedded as inline SVG data URIs with `fill="currentColor"`, so their color automatically follows the active theme (light/dark mode).
84
120
 
85
121
  ### Dynamic Model Loading
86
122
 
87
- When opening the AI code generator dialog in the script editor, the available models are automatically fetched from the configured API endpoint. The model dropdown is populated dynamically — no hardcoded model list is used.
123
+ When opening the AI code generator dialog in the script editor, the available models are automatically fetched from each configured provider. The model dropdown is populated dynamically — no hardcoded model list is used.
124
+
125
+ #### Non-chat model filter
126
+
127
+ The provider model lists returned by OpenAI, Anthropic, Gemini, DeepSeek, and custom (Ollama/LM Studio/OpenRouter) endpoints contain many models that cannot be used for chat completion. The adapter filters these automatically so that the dropdown only shows models suitable for ioBroker script generation.
128
+
129
+ The following categories are excluded:
130
+
131
+ | Category | Keyword examples |
132
+ |----------|------------------|
133
+ | Embeddings | `embedding`, `text-embedding`, `embeddinggemma`, `bge-`, `nomic-embed`, `mxbai-embed`, `arctic-embed`, `all-minilm`, `voyage-`, `gecko`, `paraphrase-multilingual` |
134
+ | Image generation / editing | `dall-e`, `gpt-image`, `image-edit`, `-image-preview`, `-image-latest`, `flash-image`, `nano-banana`, `stable-diffusion`, `sdxl`, `midjourney`, `flux-`, `imagen` |
135
+ | Video generation | `sora`, `veo-`, `cogvideo`, `runway-`, `lumiere` |
136
+ | Music generation | `lyria` |
137
+ | Audio / speech / transcribe / realtime | `whisper`, `tts-`, `-tts`, `speech-`, `audio-preview`, `-transcribe`, `native-audio`, `flash-live`, `gpt-audio`, `realtime`, `bark-`, `xtts`, `voicebox` |
138
+ | Moderation / safety | `moderation`, `omni-moderation`, `llama-guard`, `shieldgemma`, `prompt-guard`, `-guardian`, `safeguard` |
139
+ | Rerankers | `rerank`, `reranker` |
140
+ | Legacy completion (OpenAI GPT-3 era) | `babbage-`, `davinci-`, `curie-`, `text-davinci`, `instructgpt`, `code-davinci`, `code-cushman`, `-turbo-instruct` |
141
+ | Web search / browsing endpoints | `-search-preview`, `-search-api` |
142
+ | Legacy search / similarity | `code-search`, `text-search`, `similarity-` |
143
+ | Specialty / single-task | `computer-use-preview`, `deep-research`, `robotics`, `aqa`, `reader-lm` (HTML→Markdown), `-nsql` (text-to-SQL), `minicheck` (fact-check), `claude-1`, `claude-instant` |
144
+
145
+ The filter uses case-insensitive substring matching. If a provider adds a new non-chat model family in the future, the list can be extended in `src-editor/src/AiChat/AiChatService.ts` (see `NON_CHAT_KEYWORDS`).
88
146
 
89
147
  ### Error Handling
90
148
 
@@ -760,6 +760,39 @@ Typical usage:
760
760
  </xml>
761
761
  ```
762
762
 
763
+ ### State exists
764
+
765
+ This block returns a boolean (`true` / `false`) indicating whether the given state currently has a value record in the state DB. The OID is supplied via a value input, so it can come from the OID selector block (`Object ID`), a string variable, or any other block that produces a state ID.
766
+
767
+ **Why is this useful?** ioBroker stores objects (metadata) and states (values) separately. An adapter can create a state's *object* — so the object ID appears in the OID picker — without ever writing a *value*. In that case, calling `getState(...)` will log a warning:
768
+
769
+ ```
770
+ warn getState "zigbee.0.187a3efffee9e4e8.load_power" not found (3)
771
+ ```
772
+
773
+ Even a check like `value of Object ID … != null` will trigger that warning, because the warning happens *during* the `getState` call itself — before the comparison is evaluated.
774
+
775
+ The **State exists** block uses `existsStateAsync(...)` under the hood, which checks the cache silently and never logs a warning when the state is missing. This is the correct way to guard a `getState` call for adapters that pre-create data points lazily (e.g. zigbee, Tuya).
776
+
777
+ Typical usage — guard a value read against missing state records:
778
+
779
+ ```
780
+ if [State exists [Object ID "zigbee.0.…load_power"]]
781
+ set [power] to [Value of Object ID "zigbee.0.…load_power"]
782
+ log [power]
783
+ ```
784
+
785
+ The generated JavaScript is:
786
+
787
+ ```javascript
788
+ if ((await existsStateAsync('zigbee.0.187a3efffee9e4e8.load_power'))) {
789
+ let power = getState('zigbee.0.187a3efffee9e4e8.load_power').val;
790
+ console.log(power);
791
+ }
792
+ ```
793
+
794
+ **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
+
763
796
  ## Actions Blocks
764
797
 
765
798
  ### Exec - execute
package/io-package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "javascript",
4
- "version": "9.2.0",
4
+ "version": "9.2.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
+ "9.2.2": {
44
+ "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",
45
+ "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",
46
+ "ru": "Исправление: инструментарий режима чата AI больше не покрывает выпадающие опции (выпуск #2201) — перемещаемый инструментарий слева от селектора\nУточнено описание режима чата ИИ в подсказке: Агент предназначен для более крупных моделей с поддержкой инструментов и обрабатывает как анализ, так и создание сценариев, Код предназначен для более мелких моделей без поддержки инструментов (использует двухэтапный план-тогда-код) — переводы обновлены на всех 11 языках\nДобавлен блок «существует государство» для блокировки",
47
+ "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",
48
+ "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",
49
+ "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",
50
+ "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",
51
+ "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",
52
+ "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\"",
53
+ "uk": "Виправлення: Інструментарій режимів AI не більше охоплює параметри випадання (видання #2201) — пересувний інструмент для ліворуч від selector\nНаведено описи режиму AI чату в інструменті: Агент призначений для збільшення моделей з підтримкою інструментів і ручками як аналізу, так і для створення сценаріїв, Код є для менших моделей без підтримки інструменту ( використовує двокроковий план-фін-код) — переклади, оновлено у всіх 11 мовах\nДодано блок-блок \"is State існує\"",
54
+ "zh-cn": "固定:AI聊天模式工具提示不再覆盖下拉选项(问题#2201)——移动工具提示到选择器左侧\n整理工具提示中的 AI 聊天模式描述 : Agent 用于具有工具支持的较大模型,并同时处理分析和脚本创建, Code 用于没有工具支持的较小模型(使用双步计划-当时的代码)——所有11种语言的翻译更新\n添加“ 状态存在” 块以阻断"
55
+ },
56
+ "9.2.1": {
57
+ "en": "See previous changelog entries",
58
+ "de": "Siehe frühere Changelog-Einträge",
59
+ "ru": "См. предыдущие Changelog",
60
+ "pt": "Ver entradas anteriores do changelog",
61
+ "nl": "Zie vorige wijzigingenlog items",
62
+ "fr": "Voir les entrées précédentes du journal des modifications",
63
+ "it": "Vedere le precedenti voci di changelog",
64
+ "es": "Ver entradas de cambio anteriores",
65
+ "pl": "Zob. poprzednie wpisy dotyczące zmiennych",
66
+ "uk": "Переглянути попередні записи змін",
67
+ "zh-cn": "参见上一个更改日志条目"
68
+ },
43
69
  "9.2.0": {
44
70
  "en": "AI Chat panel with multi-provider support, tool calling, inline completions, and smart-apply\nFix: prevent duplicate 'Stopping script' log when script is not running\nFix: only restart scripts on the instance that owns them\nAdded OID display mode toggle for Blockly editor: 4 display modes (Name, Name path, State ID, Full ID) with toolbar dropdown, context menu, optional object icons, and translations in 11 languages\nNode 25 compatibility: replaced deprecated rmdirSync with rmSync in build tasks\nAdded support for plain import/export\nCorrecting error in configuration\ndisallow writing into node_modules folder by scripts\nCorrecting start of the script more than one time if restart is triggered\nAll delayed writings are stopped by the script stop\nAdded check if a script has been modified by another user/window\nMake the instance number more prominent",
45
71
  "de": "AI Chat-Panel mit Multi-Provider-Unterstützung, Werkzeuganruf, Inline-Vervollständigungen und intelligent-apply\nFix: verhindern Sie doppeltes 'Stopping script'-Log, wenn Skript nicht läuft\nFix: nur Skripte auf der Instanz neu starten, die sie besitzt\nOID-Anzeigemodus für Blockly Editor hinzugefügt: 4 Anzeigemodi (Name, Name Pfad, State ID, Full ID) mit Symbolleiste Dropdown, Kontextmenü, optionale Objektsymbole und Übersetzungen in 11 Sprachen\nNode 25 Kompatibilität: ersetzt deprecated rmdirSync mit rmSync in Build Aufgaben\nUnterstützung für den einfachen Import/Export\nFehler in der Konfiguration korrigieren\ndeaktivieren sie das schreiben in node modules ordner durch skripte\nKorrektur des Starts des Skripts mehr als ein Mal, wenn der Neustart ausgelöst wird\nAlle verzögerten Schriften werden durch den Skriptstop gestoppt\nCheck hinzugefügt, wenn ein Skript von einem anderen Benutzer/Fenster geändert wurde\nMachen Sie die Instanz Nummer prominenter",
@@ -341,6 +367,45 @@
341
367
  "agree",
342
368
  "cancel"
343
369
  ]
370
+ },
371
+ {
372
+ "condition": {
373
+ "operand": "and",
374
+ "rules": [
375
+ "oldVersion<=9.2.0",
376
+ "newVersion>9.2.0"
377
+ ]
378
+ },
379
+ "title": {
380
+ "en": "AI API keys must be re-entered",
381
+ "de": "AI-API-Schlüssel müssen erneut eingegeben werden",
382
+ "ru": "Ключи AI API необходимо ввести заново",
383
+ "pt": "As chaves da API de IA devem ser reinseridas",
384
+ "nl": "AI API-sleutels moeten opnieuw worden ingevoerd",
385
+ "fr": "Les clés API IA doivent être saisies à nouveau",
386
+ "it": "Le chiavi API AI devono essere reinserite",
387
+ "es": "Las claves de API de IA deben volver a introducirse",
388
+ "pl": "Klucze API AI muszą zostać ponownie wprowadzone",
389
+ "uk": "Ключі AI API необхідно ввести повторно",
390
+ "zh-cn": "AI API 密钥必须重新输入"
391
+ },
392
+ "text": {
393
+ "en": "The AI API keys (OpenAI, Anthropic, Gemini, DeepSeek) are now stored encrypted. If you had previously configured any AI API keys, you must re-enter them in the adapter settings under the \"AI settings\" tab.",
394
+ "de": "Die AI-API-Schlüssel (OpenAI, Anthropic, Gemini, DeepSeek) werden jetzt verschlüsselt gespeichert. Wenn Sie zuvor AI-API-Schlüssel konfiguriert haben, müssen Sie diese in den Adaptereinstellungen unter dem Tab \"AI-Einstellungen\" erneut eingeben.",
395
+ "ru": "Ключи AI API (OpenAI, Anthropic, Gemini, DeepSeek) теперь хранятся в зашифрованном виде. Если вы ранее настроили ключи AI API, вам необходимо повторно ввести их в настройках адаптера на вкладке \"Настройки AI\".",
396
+ "pt": "As chaves da API de IA (OpenAI, Anthropic, Gemini, DeepSeek) agora são armazenadas criptografadas. Se você configurou anteriormente chaves de API de IA, deve reinseri-las nas configurações do adaptador na aba \"Configurações de IA\".",
397
+ "nl": "De AI API-sleutels (OpenAI, Anthropic, Gemini, DeepSeek) worden nu versleuteld opgeslagen. Als u eerder AI API-sleutels heeft geconfigureerd, moet u deze opnieuw invoeren in de adapterinstellingen onder het tabblad \"AI-instellingen\".",
398
+ "fr": "Les clés API IA (OpenAI, Anthropic, Gemini, DeepSeek) sont désormais stockées de manière chiffrée. Si vous aviez précédemment configuré des clés API IA, vous devez les saisir à nouveau dans les paramètres de l'adaptateur sous l'onglet \"Paramètres IA\".",
399
+ "it": "Le chiavi API AI (OpenAI, Anthropic, Gemini, DeepSeek) sono ora memorizzate in modo crittografato. Se in precedenza erano state configurate chiavi API AI, è necessario reinserirle nelle impostazioni dell'adattatore nella scheda \"Impostazioni AI\".",
400
+ "es": "Las claves de API de IA (OpenAI, Anthropic, Gemini, DeepSeek) ahora se almacenan cifradas. Si previamente había configurado claves de API de IA, debe volver a introducirlas en la configuración del adaptador en la pestaña \"Configuración de IA\".",
401
+ "pl": "Klucze API AI (OpenAI, Anthropic, Gemini, DeepSeek) są teraz przechowywane w formie zaszyfrowanej. Jeśli wcześniej skonfigurowano klucze API AI, należy je ponownie wprowadzić w ustawieniach adaptera w zakładce \"Ustawienia AI\".",
402
+ "uk": "Ключі AI API (OpenAI, Anthropic, Gemini, DeepSeek) тепер зберігаються у зашифрованому вигляді. Якщо ви раніше налаштували ключі AI API, вам необхідно повторно ввести їх у налаштуваннях адаптера на вкладці \"Налаштування AI\".",
403
+ "zh-cn": "AI API 密钥(OpenAI、Anthropic、Gemini、DeepSeek)现在以加密方式存储。如果您之前配置了 AI API 密钥,则必须在适配器设置的\"AI 设置\"选项卡中重新输入。"
404
+ },
405
+ "level": "warn",
406
+ "buttons": [
407
+ "ok"
408
+ ]
344
409
  }
345
410
  ]
346
411
  },
@@ -467,10 +532,25 @@
467
532
  "maxTriggersPerScript": 100,
468
533
  "gptKey": "",
469
534
  "gptBaseUrl": "",
535
+ "gptBaseUrlKey": "",
470
536
  "claudeKey": "",
471
537
  "geminiKey": "",
472
538
  "deepseekKey": ""
473
539
  },
540
+ "encryptedNative": [
541
+ "gptKey",
542
+ "claudeKey",
543
+ "geminiKey",
544
+ "deepseekKey",
545
+ "gptBaseUrlKey"
546
+ ],
547
+ "protectedNative": [
548
+ "gptKey",
549
+ "claudeKey",
550
+ "geminiKey",
551
+ "deepseekKey",
552
+ "gptBaseUrlKey"
553
+ ],
474
554
  "objects": [
475
555
  {
476
556
  "_id": "_design/script",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.javascript",
3
- "version": "9.2.0",
3
+ "version": "9.2.2",
4
4
  "description": "Rules Engine for ioBroker",
5
5
  "author": "bluefox <dogafox@gmail.com>",
6
6
  "contributors": [