iobroker.javascript 9.1.0 → 9.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -8
- package/admin/assets/AiChatPanel-sgt697A2.js +296 -0
- package/admin/assets/AiDatapointProvider-B0i3I5Fm.js +2 -0
- package/admin/assets/AiDiffView-RPozjjHf.js +1 -0
- package/admin/assets/AiInlineProvider-Dd7eKxk4.js +7 -0
- package/admin/assets/{Save-Cld9qv9i.js → Save-CkuNSiWL.js} +1 -1
- package/admin/assets/{ScriptEditor-BVaX7Hcs.js → ScriptEditor-CH4qJzqq.js} +2 -2
- package/admin/assets/ScriptEditorVanillaMonaco-cB_90T0P.js +1 -0
- package/admin/assets/{createSvgIcon-DPvF8xqu.js → createSvgIcon-DYs_tNrE.js} +1 -1
- package/admin/assets/docs-compact-CKNGiYh2.js +336 -0
- package/admin/assets/index-BI3JsAz_.js +1 -0
- package/admin/assets/{index-D8iYqogF.js → index-DAkyON1r.js} +5 -5
- package/admin/assets/index-DW5CwIma.js +1256 -0
- package/admin/assets/index-SHs7_wDh.js +1 -0
- package/admin/assets/{index-DlDUIfpA.js → index-dN73sbyQ.js} +1 -1
- package/admin/assets/index-hwplVCgv.js +986 -0
- package/admin/assets/index-wHNMOf-c.js +5 -0
- package/admin/assets/inheritsLoose-CIXm_zPk.js +29 -0
- package/admin/assets/{iobroker_javascript__loadShare___mf_0_mui_mf_1_material__loadShare__.mjs-QWG5Arqe.js → iobroker_javascript__loadShare___mf_0_mui_mf_1_material__loadShare__.mjs-CV1_X-Lf.js} +1 -1
- package/admin/assets/{localSharedImportMap-AxgBkrOR.js → localSharedImportMap-CqvxvyGG.js} +1 -1
- package/admin/assets/useTheme-DuTJsNQ-.js +1 -0
- package/admin/assets/{virtual_mf-REMOTE_ENTRY_ID_iobroker_javascript__remoteEntry_js-C9suQF96.js → virtual_mf-REMOTE_ENTRY_ID_iobroker_javascript__remoteEntry_js-BJ03G6Pu.js} +2 -2
- package/admin/custom/assets/{Components-FfVbavBM.js → Components-B9ZyjeRI.js} +1 -1
- package/admin/custom/assets/{index-Be7j5wvd.js → index-BVwMgafs.js} +1 -1
- package/admin/custom/assets/index-CVIpIckw.js +960 -0
- package/admin/custom/assets/{index-DNdWk-cT.js → index-DsIn9jH_.js} +1 -1
- package/admin/custom/assets/{localSharedImportMap-BRxFonIn.js → localSharedImportMap-C4qXtGUd.js} +1 -1
- package/admin/custom/assets/{virtualExposes-DyedJotb.js → virtualExposes-jSvr-kK3.js} +1 -1
- package/admin/custom/assets/{virtual_mf-REMOTE_ENTRY_ID_ConfigCustomJavascriptSet__customComponents_js-BtJxKB87.js → virtual_mf-REMOTE_ENTRY_ID_ConfigCustomJavascriptSet__customComponents_js-DFSXB0v2.js} +2 -2
- package/admin/custom/customComponents.js +1 -1
- package/admin/google-blockly/own/blocks_words.js +7 -0
- package/admin/google-blockly/own/field_oid.js +311 -37
- package/admin/i18n/de.json +8 -0
- package/admin/i18n/en.json +8 -0
- package/admin/i18n/es.json +8 -0
- package/admin/i18n/flat.txt +427 -0
- package/admin/i18n/fr.json +8 -0
- package/admin/i18n/it.json +8 -0
- package/admin/i18n/nl.json +8 -0
- package/admin/i18n/pl.json +8 -0
- package/admin/i18n/pt.json +8 -0
- package/admin/i18n/ru.json +8 -0
- package/admin/i18n/uk.json +8 -0
- package/admin/i18n/zh-cn.json +8 -0
- package/admin/img/anthropic.svg +1 -0
- package/admin/img/custom.svg +1 -0
- package/admin/img/deepseek.svg +1 -0
- package/admin/img/gemini.svg +1 -0
- package/admin/img/openai.svg +1 -0
- package/admin/jsonConfig.json +76 -14
- package/admin/mf-manifest.json +1 -1
- package/admin/remoteEntry.js +1 -1
- package/admin/tab.html +6 -6
- package/build/lib/debugger.js +2 -2
- package/build/lib/debugger.js.map +1 -1
- package/build/lib/inspect.js.map +1 -1
- package/build/lib/nodeModulesManagement.js +2 -2
- package/build/lib/nodeModulesManagement.js.map +1 -1
- package/build/lib/protectFs.js +5 -0
- package/build/lib/protectFs.js.map +1 -1
- package/build/lib/sandbox.js +2 -2
- package/build/lib/sandbox.js.map +1 -1
- package/build/main.js +72 -17
- package/build/main.js.map +1 -1
- package/build/types.d.ts +2 -0
- package/docs/de/README.md +21 -8
- package/docs/de/blockly.md +34 -0
- package/docs/en/README.md +21 -8
- package/docs/en/blockly.md +34 -0
- package/install/installTypings.js +1 -1
- package/io-package.json +27 -66
- package/package.json +7 -6
- package/admin/assets/OpenAiDialog-Dx-XNET0.js +0 -13
- package/admin/assets/ScriptEditorVanillaMonaco-yq11eIYC.js +0 -1
- package/admin/assets/docs-BrInh2Pn.js +0 -2036
- package/admin/assets/index-CLJ6-h9Q.js +0 -1
- package/admin/assets/index-COZhHfBn.js +0 -1230
- package/admin/assets/index-Cu-TydZj.js +0 -5
- package/admin/assets/index-Dnbw7_L3.js +0 -986
- package/admin/assets/index-gIA8x-8f.js +0 -1
- package/admin/assets/inheritsLoose-B0Ba5G9z.js +0 -29
- package/admin/assets/useTheme-hy6f3gra.js +0 -1
- package/admin/custom/assets/index-CYc31Gwg.js +0 -960
package/build/types.d.ts
CHANGED
|
@@ -32,6 +32,7 @@ export interface JavaScriptAdapterConfig {
|
|
|
32
32
|
createAstroStates: boolean;
|
|
33
33
|
maxSetStatePerMinute: number;
|
|
34
34
|
maxTriggersPerScript: number;
|
|
35
|
+
sortGlobalScriptsAlphabetically: boolean;
|
|
35
36
|
gptKey: string;
|
|
36
37
|
gptBaseUrl: string;
|
|
37
38
|
claudeKey: string;
|
|
@@ -61,6 +62,7 @@ export type JavascriptTimer = {
|
|
|
61
62
|
delay: number;
|
|
62
63
|
val: ioBroker.StateValue;
|
|
63
64
|
ack?: boolean;
|
|
65
|
+
scriptName: string;
|
|
64
66
|
};
|
|
65
67
|
|
|
66
68
|
export type ScriptType = 'TypeScript/ts' | 'Blockly' | 'Rules' | 'Javascript/js';
|
package/docs/de/README.md
CHANGED
|
@@ -45,26 +45,39 @@ DeepSeek bietet hervorragende Code-Generierung zu sehr niedrigen Kosten (~0,001
|
|
|
45
45
|
|
|
46
46
|
#### Lokale Modelle (Ollama / LM Studio)
|
|
47
47
|
|
|
48
|
-
Lokale Modelle laufen auf eigener Hardware ohne Internet.
|
|
48
|
+
Lokale Modelle laufen auf eigener Hardware ohne Internet.
|
|
49
49
|
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
**Mindestanforderung: 14B-Parameter-Modelle** (z.B. `qwen2.5-coder:14b`). Kleinere Modelle (7B/9B) erzeugen unzuverlässigen Code mit falschen API-Aufrufen. Eine GPU mit mindestens 12GB VRAM (z.B. RTX 3060) wird für 14B-Modelle empfohlen.
|
|
51
|
+
|
|
52
|
+
Getestete und empfohlene Modelle:
|
|
53
|
+
- `qwen2.5-coder:14b` - Gute Codequalität, läuft auf 12GB VRAM
|
|
54
|
+
- `qwen2.5-coder:32b` - Bessere Qualität, erfordert 24GB+ VRAM
|
|
55
|
+
|
|
56
|
+
Einrichtung:
|
|
57
|
+
- **Ollama**: **Base-URL** auf `http://localhost:11434/v1` setzen, API-Key leer lassen
|
|
58
|
+
- **LM Studio**: **Base-URL** auf `http://localhost:1234/v1` setzen, API-Key leer lassen
|
|
52
59
|
|
|
53
60
|
**Hinweis:** Die kostenlose Version der OpenAI-API (ChatGPT) bietet keinen API-Zugang mehr für Code-Generierung. Google Gemini (kostenlos) oder DeepSeek (sehr günstig) sind empfohlene Alternativen.
|
|
54
61
|
|
|
55
62
|
### Konfiguration
|
|
56
63
|
|
|
57
|
-
In den Adapter-Einstellungen unter "
|
|
64
|
+
In den Adapter-Einstellungen unter "KI-Einstellungen" befinden sich API-Key-Felder für jeden Anbieter:
|
|
58
65
|
|
|
59
66
|
| Einstellung | Beschreibung |
|
|
60
67
|
|-------------|-------------|
|
|
61
|
-
| **ChatGPT API-Schlüssel** |
|
|
62
|
-
| **
|
|
68
|
+
| **ChatGPT API-Schlüssel** | API-Key für OpenAI (platform.openai.com) |
|
|
69
|
+
| **Anthropic API-Schlüssel** | API-Key für Claude (console.anthropic.com) |
|
|
70
|
+
| **Gemini API-Schlüssel** | API-Key für Google Gemini (aistudio.google.com) |
|
|
71
|
+
| **DeepSeek API-Schlüssel** | API-Key für DeepSeek (platform.deepseek.com) |
|
|
72
|
+
| **Eigene API Base-URL** | Base-URL für eigene Anbieter (z.B. `http://localhost:11434/v1` für Ollama) |
|
|
73
|
+
| **Eigener API-Schlüssel** | Optionaler API-Key für eigene Anbieter (Ollama benötigt keinen) |
|
|
74
|
+
|
|
75
|
+
Es müssen nur die Keys der gewünschten Anbieter eingetragen werden. Jeder Anbieter hat einen eigenen **Test**-Button.
|
|
63
76
|
|
|
64
77
|
### API-Verbindung testen
|
|
65
78
|
|
|
66
|
-
|
|
67
|
-
- Verbindet sich mit dem
|
|
79
|
+
Jeder Anbieter hat einen eigenen **Test**-Button neben seinem API-Key-Feld. Der Test:
|
|
80
|
+
- Verbindet sich mit dem API-Endpunkt des Anbieters
|
|
68
81
|
- Validiert den API-Schlüssel
|
|
69
82
|
- Gibt die Anzahl der verfügbaren Modelle zurück
|
|
70
83
|
|
package/docs/de/blockly.md
CHANGED
|
@@ -2346,3 +2346,37 @@ Inside these blocks variable "value" yet exist, but anyway to read their values
|
|
|
2346
2346
|
### Create custom function with return value
|
|
2347
2347
|
|
|
2348
2348
|
### Call function
|
|
2349
|
+
|
|
2350
|
+
## AI Chat für Blockly
|
|
2351
|
+
|
|
2352
|
+
Das AI-Chat-Panel ist jetzt auch für Blockly-Scripts verfügbar. Klicke auf den AI-Button (Zauberstab-Symbol) in der Toolbar, um das Chat-Panel neben dem Blockly-Editor zu öffnen.
|
|
2353
|
+
|
|
2354
|
+
### Funktionen
|
|
2355
|
+
|
|
2356
|
+
- **Chat-Modus**: Stelle Fragen zu deinem Blockly-Script. Die KI sieht den generierten JavaScript-Code als Kontext.
|
|
2357
|
+
- **Code-Modus**: Beschreibe eine Automatisierungsaufgabe und die KI generiert Blockly-XML-Blöcke in einem Zwei-Schritt-Prozess (Plan, dann Blöcke).
|
|
2358
|
+
- **Visuelle Vorschau**: KI-generierte Blöcke werden als grafische Blockly-Vorschau direkt im Chat dargestellt statt als rohes XML.
|
|
2359
|
+
- **Blöcke einfügen**: Klicke auf "Blöcke einfügen", um die KI-generierten Blöcke in deinen Blockly-Workspace einzufügen.
|
|
2360
|
+
- **Diff-Ansicht**: Klicke auf "Als Diff anzeigen" für einen Side-by-Side-Vergleich deiner aktuellen Blöcke mit den KI-vorgeschlagenen Blöcken, mit Akzeptieren/Ablehnen-Buttons.
|
|
2361
|
+
|
|
2362
|
+
### Unterstützte Block-Typen
|
|
2363
|
+
|
|
2364
|
+
Die KI kann folgende ioBroker-Blockly-Blocktypen generieren:
|
|
2365
|
+
|
|
2366
|
+
- **on_ext** – Trigger (auf Zustandsänderungen reagieren)
|
|
2367
|
+
- **schedule** – Cron-basierte Zeitpläne
|
|
2368
|
+
- **control** – Zustand setzen (setState)
|
|
2369
|
+
- **get_value** – Zustandswert lesen (getState)
|
|
2370
|
+
- **debug** – Log-Ausgabe
|
|
2371
|
+
- **sendto_custom** – Nachrichten senden (z.B. Telegram)
|
|
2372
|
+
- **timeouts_settimeout** – Verzögerte Aktionen
|
|
2373
|
+
- **controls_if** – Wenn/Dann-Bedingungen
|
|
2374
|
+
- **logic_compare** – Vergleiche (EQ, NEQ, LT, GT, etc.)
|
|
2375
|
+
- **math_number**, **text**, **logic_boolean** – Wert-Blöcke
|
|
2376
|
+
|
|
2377
|
+
### Tipps
|
|
2378
|
+
|
|
2379
|
+
- Verwende den **Code-Modus** zum Generieren neuer Blöcke aus einer Aufgabenbeschreibung.
|
|
2380
|
+
- Verwende den **Chat-Modus** (oder Agent-Modus) für Fragen zu bestehenden Blöcken.
|
|
2381
|
+
- Die KI funktioniert am besten, wenn du deine Automatisierung in einfacher Sprache beschreibst, z.B. "Schalte das Wohnzimmerlicht ein, wenn der Bewegungssensor auslöst".
|
|
2382
|
+
- Du kannst `@geräte` verwenden, um deine Smart-Home-Geräte in den Kontext einzubeziehen.
|
package/docs/en/README.md
CHANGED
|
@@ -46,26 +46,39 @@ DeepSeek offers excellent code generation at very low cost (~$0.001 per request)
|
|
|
46
46
|
|
|
47
47
|
#### Local models (Ollama / LM Studio)
|
|
48
48
|
|
|
49
|
-
Local models run on your own hardware without internet.
|
|
49
|
+
Local models run on your own hardware without internet.
|
|
50
50
|
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
**Minimum requirement: 14B parameter models** (e.g. `qwen2.5-coder:14b`). Smaller models (7B/9B) produce unreliable code with incorrect API calls. A GPU with at least 12GB VRAM (e.g. RTX 3060) is recommended for 14B models.
|
|
52
|
+
|
|
53
|
+
Tested and recommended models:
|
|
54
|
+
- `qwen2.5-coder:14b` - Good code quality, runs on 12GB VRAM
|
|
55
|
+
- `qwen2.5-coder:32b` - Better quality, requires 24GB+ VRAM
|
|
56
|
+
|
|
57
|
+
Setup:
|
|
58
|
+
- **Ollama**: Set **Base URL** to `http://localhost:11434/v1`, leave API key empty
|
|
59
|
+
- **LM Studio**: Set **Base URL** to `http://localhost:1234/v1`, leave API key empty
|
|
53
60
|
|
|
54
61
|
**Note:** The free tier of the OpenAI API (ChatGPT) no longer provides API access for code generation. Consider using Google Gemini (free) or DeepSeek (very affordable) as alternatives.
|
|
55
62
|
|
|
56
63
|
### Configuration
|
|
57
64
|
|
|
58
|
-
In the adapter settings under "
|
|
65
|
+
In the adapter settings under "AI settings", you will find API key fields for each provider:
|
|
59
66
|
|
|
60
67
|
| Setting | Description |
|
|
61
68
|
|---------|-------------|
|
|
62
|
-
| **ChatGPT API key** |
|
|
63
|
-
| **
|
|
69
|
+
| **ChatGPT API key** | API key for OpenAI (platform.openai.com) |
|
|
70
|
+
| **Anthropic API key** | API key for Claude (console.anthropic.com) |
|
|
71
|
+
| **Gemini API key** | API key for Google Gemini (aistudio.google.com) |
|
|
72
|
+
| **DeepSeek API key** | API key for DeepSeek (platform.deepseek.com) |
|
|
73
|
+
| **Custom API Base URL** | Base URL for custom providers (e.g. `http://localhost:11434/v1` for Ollama) |
|
|
74
|
+
| **Custom API key** | Optional API key for custom providers (Ollama doesn't need one) |
|
|
75
|
+
|
|
76
|
+
Only enter the keys for providers you want to use. Each provider has its own **Test** button.
|
|
64
77
|
|
|
65
78
|
### Test API Connection
|
|
66
79
|
|
|
67
|
-
|
|
68
|
-
- Connect to the
|
|
80
|
+
Each provider has a dedicated **Test** button next to its API key field. The test will:
|
|
81
|
+
- Connect to the provider's API endpoint
|
|
69
82
|
- Validate the API key
|
|
70
83
|
- Return the number of available models
|
|
71
84
|
|
package/docs/en/blockly.md
CHANGED
|
@@ -2752,3 +2752,37 @@ For every created function in the menu appears additional block with the name of
|
|
|
2752
2752
|
|
|
2753
2753
|
You can use it like normal blocks in you scripts.
|
|
2754
2754
|
|
|
2755
|
+
## AI Chat for Blockly
|
|
2756
|
+
|
|
2757
|
+
The AI Chat panel is now available for Blockly scripts. Click the AI button (magic wand icon) in the toolbar to open the chat panel alongside the Blockly editor.
|
|
2758
|
+
|
|
2759
|
+
### Features
|
|
2760
|
+
|
|
2761
|
+
- **Chat mode**: Ask questions about your Blockly script. The AI sees the generated JavaScript code as context.
|
|
2762
|
+
- **Code mode**: Describe an automation task and the AI generates Blockly XML blocks in a two-step process (plan, then blocks).
|
|
2763
|
+
- **Visual preview**: AI-generated blocks are rendered as a visual Blockly preview directly in the chat instead of showing raw XML.
|
|
2764
|
+
- **Insert blocks**: Click "Insert blocks" to append the AI-generated blocks into your Blockly workspace.
|
|
2765
|
+
- **Diff view**: Click "Show as diff" to see a side-by-side comparison of your current blocks vs. the AI-suggested blocks, with Accept/Reject buttons.
|
|
2766
|
+
|
|
2767
|
+
### Supported Block Types
|
|
2768
|
+
|
|
2769
|
+
The AI can generate the following ioBroker Blockly block types:
|
|
2770
|
+
|
|
2771
|
+
- **on_ext** – Trigger (react to state changes)
|
|
2772
|
+
- **schedule** – Cron-based schedules
|
|
2773
|
+
- **control** – Set state (setState)
|
|
2774
|
+
- **get_value** – Get state value (getState)
|
|
2775
|
+
- **debug** – Log output
|
|
2776
|
+
- **sendto_custom** – Send messages (e.g. Telegram)
|
|
2777
|
+
- **timeouts_settimeout** – Delayed actions
|
|
2778
|
+
- **controls_if** – If/else conditions
|
|
2779
|
+
- **logic_compare** – Comparisons (EQ, NEQ, LT, GT, etc.)
|
|
2780
|
+
- **math_number**, **text**, **logic_boolean** – Value blocks
|
|
2781
|
+
|
|
2782
|
+
### Tips
|
|
2783
|
+
|
|
2784
|
+
- Use **Code mode** for generating new blocks from a task description.
|
|
2785
|
+
- Use **Chat mode** (or Agent mode) for asking questions about existing blocks.
|
|
2786
|
+
- The AI works best when you describe your automation in plain language, e.g. "Turn on the living room light when the motion sensor triggers".
|
|
2787
|
+
- You can use `@devices` to include your smart home devices in the context.
|
|
2788
|
+
|
|
@@ -53,7 +53,7 @@ function npmCommand(command, npmArgs, options) {
|
|
|
53
53
|
if (npmArgs == null) npmArgs = [];
|
|
54
54
|
|
|
55
55
|
const npmBinary = /^win/.test(process.platform) ? 'npm.cmd' : 'npm';
|
|
56
|
-
/** @type {import("child_process").SpawnOptions} */
|
|
56
|
+
/** @type {import("node:child_process").SpawnOptions} */
|
|
57
57
|
const spawnOptions = {
|
|
58
58
|
stdio: [options.stdin || process.stdin, options.stdout || process.stdout, options.stderr || process.stderr],
|
|
59
59
|
// @ts-ignore This option exists starting with NodeJS 8
|
package/io-package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "javascript",
|
|
4
|
-
"version": "9.
|
|
4
|
+
"version": "9.2.0",
|
|
5
5
|
"blockedVersions": [
|
|
6
6
|
"8.0.0",
|
|
7
7
|
"8.0.1"
|
|
@@ -40,18 +40,31 @@
|
|
|
40
40
|
"Matthias Kleine <info@haus-automatisierung.com>"
|
|
41
41
|
],
|
|
42
42
|
"news": {
|
|
43
|
-
"9.
|
|
44
|
-
"en": "
|
|
45
|
-
"de": "Unterstützung
|
|
46
|
-
"ru": "
|
|
47
|
-
"pt": "
|
|
48
|
-
"nl": "
|
|
49
|
-
"fr": "
|
|
50
|
-
"it": "
|
|
51
|
-
"es": "
|
|
52
|
-
"pl": "
|
|
53
|
-
"uk": "
|
|
54
|
-
"zh-cn": "
|
|
43
|
+
"9.2.0": {
|
|
44
|
+
"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
|
+
"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",
|
|
46
|
+
"ru": "Панель AI Chat с поддержкой нескольких провайдеров, вызовом инструментов, встроенными завершениями и интеллектуальным приложением\nИсправление: предотвращение дублирования журнала «Stopping script», когда сценарий не работает\nИсправление: перезагружайте сценарии только на том экземпляре, которым они принадлежат\nДобавлено переключение режима отображения OID для редактора Blockly: 4 режима отображения (имя, путь имени, идентификатор состояния, полный идентификатор) с выпадением панели инструментов, контекстным меню, дополнительными значками объектов и переводами на 11 языков\nСовместимость Node 25: замена устаревшего rmdirSync на rmSync в задачах сборки\nДобавлена поддержка простого импорта/экспорта\nИсправление ошибок в конфигурации\nзапретить запись в папку node modules по скриптам\nКорректировка начала сценария более одного раза при запуске перезапуска\nВсе задержки в написании остановлены остановкой сценария\nДобавлена проверка, был ли скрипт изменен другим пользователем/окном\nСделайте число экземпляров более заметным",
|
|
47
|
+
"pt": "Painel de bate-papo IA com suporte multifornecedor, chamada de ferramentas, completações em linha e aplicação inteligente\nCorrigir: evitar o registo duplicado do 'Script de paragem' quando o programa não estiver em execução\nCorrigir: apenas reiniciar scripts na instância que os possui\nAdicionado modo de exibição OID para o editor Blockly: 4 modos de exibição (nome, localização do nome, ID de estado, ID completo) com dropdown da barra de ferramentas, menu de contexto, ícones de objetos opcionais e traduções em 11 idiomas\nCompatibilidade node 25: substituiu rmdirSync desactualizado com rmSync em tarefas de compilação\nAdicionado apoio à importação/exportação simples\nCorrigindo erro na configuração\nnão permitir a escrita na pasta nó módulo por scripts\nCorrigindo o início do script mais de uma vez se o reinício for acionado\nTodos os escritos atrasados são parados pelo script stop\nAdicionado verificar se um script foi modificado por outro usuário/janela\nTornar o número da instância mais proeminente",
|
|
48
|
+
"nl": "AI Chat paneel met multi-provider ondersteuning, tool calling, inline voltooiingen, en slimme toepassing\nFix: voorkomt dupliceren 'Stopping script' log wanneer script niet draait\nFix: herstart alleen scripts op de instantie die ze bezit\nOID-displaymodus toegevoegd aan de Blockly-editor: 4 weergavemodi (Naam, Naam pad, Staat ID, Volledige ID) met werkbalk dropdown, contextmenu, optionele objectpictogrammen, en vertalingen in 11 talen\nNode 25 compatibiliteit: vervangen van verouderde rmdirSync met rmSync in bouwtaken\nToegevoegde steun voor gewone import/export\nFout in configuratie corrigeren\nschrijven in node modules map door scripts niet toestaan\nCorrigeren van de start van het script meer dan één keer als herstart wordt gestart\nAlle vertraagde geschriften worden gestopt door het script stop\nToegevoegd controleren of een script is gewijzigd door een andere gebruiker/venster\nMaak het instantienummer prominenter",
|
|
49
|
+
"fr": "Panneau de discussion AI avec support multi-fournisseurs, appels d'outils, finitions en ligne, et application intelligente\nCorrection: empêcher le log 'Stopping script' lorsque le script ne fonctionne pas\nCorrection : redémarrer uniquement les scripts sur l'instance qui les possède\nAjout du mode d'affichage OID pour l'éditeur Blockly : 4 modes d'affichage (nom, chemin de nom, identifiant d'État, identifiant complet) avec la barre d'outils déroulante, le menu contextuel, les icônes d'objets optionnels et les traductions en 11 langues\nCompatibilité Node 25: remplacé rmdirSync déprécié par rmSync dans les tâches de construction\nAjout d'un soutien pour les importations/exportations simples\nCorrection d'une erreur de configuration\ninterdire l'écriture dans le dossier node modules par scripts\nCorrection du début du script plus d'une fois si le redémarrage est déclenché\nToutes les écritures retardées sont arrêtées par le script stop\nVérifiez si un script a été modifié par un autre utilisateur/fenêtre\nRendre le numéro d'instance plus visible",
|
|
50
|
+
"it": "Pannello di chat AI con supporto multiprovider, chiamata degli strumenti, completamento in linea e applicazione intelligente\nFix: impedire il registro duplicato 'Stopping script' quando lo script non è in esecuzione\nFix: riavviare solo gli script sull'istanza che li possiede\nAggiunta la modalità di visualizzazione OID per l'editor Blockly: 4 modalità di visualizzazione (nome, percorso del nome, ID di stato, ID completo) con menu della barra degli strumenti, menu di contesto, icone degli oggetti opzionali e traduzioni in 11 lingue\nCompatibilità nodo 25: sostituito rmdirSync deprecato con rmSync in attività di costruzione\nAggiunto supporto per l'importazione/esportazione normale\nCorreggere l'errore nella configurazione\ndisallow la scrittura nella cartella node modules da script\nCorreggere l'inizio dello script più di una volta se il riavvio viene attivato\nTutti gli scritti ritardati sono fermati dalla fermata dello script\nAggiunto verificare se uno script è stato modificato da un altro utente/finestra\nRendere il numero di istanza più prominente",
|
|
51
|
+
"es": "Panel de chat AI con soporte multiprovidente, llamada de herramientas, finalizaciones en línea y aplicación inteligente\nFijación: previene el registro duplicado de 'Stopping script' cuando el script no se ejecuta\nFijar: sólo reiniciar scripts en el caso que los posee\nModo de visualización OID añadido para editor Bloquely: 4 modos de visualización (Nombre, Camino de Nombre, ID de Estado, ID completo) con barra de herramientas desplegable, menú contextual, iconos de objetos opcionales, y traducciones en 11 idiomas\nNodo 25 compatibilidad: reemplazado rmdirSync deprecated con rmSync en tareas de construcción\nApoyo añadido a la importación/exportación simples\nError de corrección en la configuración\nnode modules carpeta por scripts\nComienzo correcto del script más de una vez si se activa el reinicio\nTodos los escritos retrasados se detienen por la parada del script\nVerificación agregada si un script ha sido modificado por otro usuario/ventana\nHacer el número de instancia más prominente",
|
|
52
|
+
"pl": "Panel AI Chat z obsługą wielu dostawców, wywołaniem narzędzi, zakończeniami inline i smart- aplikacji\nFix: zapobiec duplikatowi 'Stopling script' log, gdy skrypt nie jest uruchomiony\nFix: restart skryptów tylko na instancji, która jest ich właścicielem\nDodano tryb wyświetlania OID dla edytora Blockly: 4 tryby wyświetlania (nazwa, ścieżka nazw, identyfikator państwa, pełny ID) z rozwijanym paskiem narzędzi, menu kontekstowe, opcjonalne ikony obiektów i tłumaczenia w 11 językach\nKompatybilność węzła 25: zastąpiono przestarzały rmdirSync rmSync w zadaniach budowlanych\nDodano wsparcie dla zwykłego importu / eksportu\nKorekta błędu w konfiguracji\nwyłączenie zapisu do folderu node _ modules przez skrypty\nKorekta początku skryptu więcej niż jeden raz, jeśli zostanie uruchomiony restart\nWszystkie opóźnione pisma są zatrzymane przez skrypt stop\nDodano sprawdzenie, czy skrypt został zmodyfikowany przez innego użytkownika / okno\nUwydatnić numer instancji",
|
|
53
|
+
"uk": "AI чат панелі з багатопрофільною підтримкою, викликом інструментів, вбудованими завершеннями та смарт-додатком\nВиправлення: запобігання дублікатів журналу \"Стопування\", коли скрипт не працює\nВиправлення: тільки перезавантажити скрипти на екземплярі, які володіють ними\nДодано OID відображення режиму для Blockly Editor: 4 режими відображення (Ім'я, шлях імен, державний ідентифікатор, повний ідентифікатор) з випаданням панелі інструментів, контекстне меню, додаткові іконки об'єкта та переклади на 11 мовах\nNode 25 сумісність: заміщена депресована rmdirSync з rmSync в задачах збирання\nДодано підтримку простого імпорту/експорту\nВиправлення помилки в конфігурації\ndisallow написання в папку node modules за скриптами\nВиправлення запуску скрипта більше одного разу, якщо запускається перезапуск\nВсі затримані письмові записи зупиняються на скрипті зупинки\nДодано перевірку, якщо скрипт був модифікований іншим користувачем/window\nЗробіть номер екземпляра більш видатним",
|
|
54
|
+
"zh-cn": "AI Chat 面板,包含多提供者支持,工具调用,内置完成,以及智能应用\n修正: 当脚本未运行时, 防止复制“ 停止脚本” 日志\n修补: 只重新启动拥有脚本的实例\n为 Blockly 编辑器添加了 OID 显示模式切换: 4 个显示模式( Name, Name, Name path, State ID, Full ID) 工具栏下拉, 上下文菜单, 可选对象图标, 以及 11 种语言的翻译\n节点 25 兼容性: 在构建任务中用 rmSync 替换已贬值的 rmdirSync\n添加对纯导入/导出的支持\n正在更正配置错误\n不允许按脚本写入节点模块文件夹\n如果重新启动, 更正脚本的起始时间不止一次\n脚本停止了所有延迟的写作\n添加检查一个脚本是否已被另一个用户/窗口修改\n让实例数字更加突出"
|
|
55
|
+
},
|
|
56
|
+
"9.1.1": {
|
|
57
|
+
"en": "Small GUI optimizations\nAdded support for custom OpenAI-compatible API endpoints (e.g. Ollama, LM Studio, Google Gemini, DeepSeek, OpenRouter)\nAdded configurable base URL in adapter settings\nModels are now fetched dynamically from the configured API endpoint\nAdded the \"Test API connection\" button in adapter settings\nAdded error handling with user-friendly messages for unreachable providers\nAdded retry functionality for failed model loading\nAll API calls (models + chat) are proxied server-side to avoid CORS issues with local providers\nStrip LLM thinking artifacts from responses (for local models like Ollama)",
|
|
58
|
+
"de": "Kleine GUI Optimierungen\nUnterstützung für benutzerdefinierte OpenAI-kompatible API-Endpunkte (z.B. Ollama, LM Studio, Google Gemini, DeepSeek, OpenRouter)\nKonfigurierbare Basis-URL in Adaptereinstellungen hinzugefügt\nModelle werden nun dynamisch vom konfigurierten API-Endpunkt abgeholt\nHinzufügen der Schaltfläche \"Test API-Verbindung\" in Adaptereinstellungen\nHinzugefügt Fehlerbehandlung mit benutzerfreundlichen Nachrichten für unerreichbare Anbieter\nZusätzliche Retry-Funktionalität für gescheiterte Modellbeladung\nAlle API-Anrufe (Modelle + Chat) sind serverseitig proxied, um CORS Probleme mit lokalen Anbietern zu vermeiden\nStrip LLM denkende Artefakte aus Antworten (für lokale Modelle wie Ollama)",
|
|
59
|
+
"ru": "Небольшая оптимизация GUI\nДобавлена поддержка пользовательских OpenAI-совместимых конечных точек API (например, Ollama, LM Studio, Google Gemini, DeepSeek, OpenRouter)\nДобавлен настраиваемый базовый URL в настройках адаптера\nМодели теперь динамически извлекаются из конфигурированной конечной точки API\nДобавлена кнопка «Test API connection» в настройках адаптера\nДобавлена обработка ошибок с помощью удобных сообщений для недостижимых поставщиков\nДобавлена функция retry для неудавшейся загрузки модели\nВсе вызовы API (модели + чат) проходят на стороне сервера, чтобы избежать проблем с CORS с местными провайдерами\nСтриптиз LLM мыслящие артефакты из ответов (для местных моделей, таких как Ollama)",
|
|
60
|
+
"pt": "Otimizações de GUI pequenas\nAdicionado suporte para endpoints personalizados compatíveis com OpenAI API (por exemplo, Ollama, LM Studio, Google Gemini, DeepSeek, OpenRouter)\nAdicionado URL base configurável nas configurações do adaptador\nOs modelos agora são obtidos dinamicamente do endpoint da API configurado\nAdicionado o botão \"Teste conexão API\" nas configurações do adaptador\nTratamento de erros adicionado com mensagens amigáveis para provedores inalcançáveis\nAdicionada funcionalidade de repetição para carregamento do modelo falhou\nTodas as chamadas de API (modelos + chat) são proxied servidor-lado para evitar problemas CORS com fornecedores locais\nRetire artefatos de pensamento LLM de respostas (para modelos locais como Ollama)",
|
|
61
|
+
"nl": "Kleine GUI optimalisaties\nExtra ondersteuning voor aangepaste OpenAI-compatibele API-eindpunten (bijv. Ollama, LM Studio, Google Gemini, DeepSeek, OpenRouter)\nConfigureerbare basis-URL in adapterinstellingen toegevoegd\nModellen worden nu dynamisch opgehaald uit het geconfigureerde API-eindpunt\nToegevoegd de \"Test API connection\" knop in adapter instellingen\nToegevoegd foutafhandeling met gebruiksvriendelijke berichten voor onbereikbare providers\nName\nAlle API-gesprekken (modellen + chat) zijn aangeprezen server-kant om CORS problemen met lokale aanbieders te voorkomen\nStrip LLM denken artefacten uit reacties (voor lokale modellen zoals Ollama)",
|
|
62
|
+
"fr": "Petites optimisations GUI\nAjout de la prise en charge des paramètres d'API compatibles OpenAI personnalisés (par exemple Ollama, LM Studio, Google Gemini, DeepSeek, OpenRouter)\nAjout de l'URL de base configurable dans les paramètres de l'adaptateur\nLes modèles sont maintenant récupérés dynamiquement à partir du paramètre API configuré\nAjout du bouton \"Tester la connexion API\" dans les paramètres de l'adaptateur\nAjout du traitement des erreurs avec des messages conviviaux pour les fournisseurs inaccessibles\nAjout de la fonctionnalité de réessayer pour le chargement du modèle échoué\nTous les appels API (modèles + chat) sont proxiés côté serveur pour éviter les problèmes CORS avec les fournisseurs locaux\nStrip LLM artefacts de réflexion des réponses (pour les modèles locaux comme Ollama)",
|
|
63
|
+
"it": "Piccole ottimizzazioni GUI\nAggiunto il supporto per i endpoint API personalizzati compatibili con OpenAI (ad esempio Ollama, LM Studio, Google Gemini, DeepSeek, OpenRouter)\nAggiunto URL di base configurabile nelle impostazioni dell'adattatore\nI modelli sono ora recuperati dinamicamente dal endpoint API configurato\nAggiunto il pulsante \"Test API Connection\" nelle impostazioni dell'adattatore\nGestione degli errori aggiunti con messaggi intuitivi per fornitori irraggiungibili\nAggiunta funzionalità retry per il caricamento del modello fallito\nTutte le chiamate API (modelli + chat) sono proxied server-side per evitare problemi CORS con i fornitori locali\nStrip LLM pensa artefatti da risposte (per modelli locali come Ollama)",
|
|
64
|
+
"es": "Optimizaciones pequeñas de GUI\nAñadido soporte para terminales API compatibles con OpenAI (por ejemplo Ollama, LM Studio, Google Gemini, DeepSeek, OpenRouter)\nURL de base configurable en la configuración del adaptador\nLos modelos ahora se recogen dinámicamente desde el punto final de API configurado\nSe agregó el botón \"Test API connection\" en la configuración del adaptador\nManejo de error añadido con mensajes fáciles de usar para proveedores no accesibles\nFunción de retry adicional para la carga del modelo fallido\nTodas las llamadas de API (models + chat) son proxied servidor-side para evitar problemas de CORS con proveedores locales\nStrip LLM piensa artefactos de respuestas (para modelos locales como Ollama)",
|
|
65
|
+
"pl": "Małe optymalizacje GUI\nDodano obsługę własnych punktów końcowych kompatybilnych z OpenAI (np. Ollama, LM Studio, Google Gemini, DeepSeek, OpenRouter)\nDodano konfigurowalny podstawowy adres URL w ustawieniach adaptera\nModele są teraz odbierane dynamicznie z skonfigurowanego punktu końcowego API\nDodano przycisk \"Test API connection\" w ustawieniach adaptera\nDodano obsługę błędów z komunikatami przyjaznymi dla użytkownika dla nieosiągalnych dostawców\nDodano funkcję ponownego testowania dla nieudanego obciążenia modelu\nWszystkie połączenia API (modele + czat) są proxied server- side, aby uniknąć problemów CORS z lokalnymi dostawcami\nStrip LLM myśli artefakty z odpowiedzi (dla lokalnych modeli takich jak Ollama)",
|
|
66
|
+
"uk": "Малі оптимізації інтерфейсу\nДодано підтримку користувацького OpenAI-сумісного API endpoints (наприклад, Ollama, LM Studio, Google Gemini, DeepSeek, OpenRouter)\nДодано налаштування URL-адреси бази в налаштуваннях адаптера\nМоделі тепер динамічно від налаштованої точки API\nДодано кнопку \"Test API підключення\" в налаштуваннях адаптера\nДодана обробка помилок з зручними повідомленнями для ненадійних постачальників\nДодано функцію трейдингу для завантаження моделі\nУсі виклики API (модельи + чат) проксіовані сервери, щоб уникнути проблем з локальними постачальниками\nСмуга LLM мислення артефакти відповідей (для місцевих моделей, таких як Ollama)",
|
|
67
|
+
"zh-cn": "小图形界面优化\n添加自定义的 OpenAI 兼容 API 端点支持( 如 Ollama, LM Studio, Google 双子座, DeepSeek, OpenRouter)\n在适配器设置中添加可配置的基础 URL\n现在从配置的 API 端点动态获取模型\n在适配器设置中添加“ 测试 API 连接” 按钮\n为无法访问的提供者处理方便用户的信件时添加错误处理\n为失败的模型加载添加了重试功能\n所有 API 呼叫( 模式 + 聊天) 均为代理服务器侧面, 以避免 CORS 与本地供应商发生问题\n从回应中脱去LLM思考文物(为奥拉马等本地模型)"
|
|
55
68
|
},
|
|
56
69
|
"9.0.18": {
|
|
57
70
|
"en": "Corrected error message with `lastSync`\nCorrected JavaScript filter",
|
|
@@ -78,58 +91,6 @@
|
|
|
78
91
|
"pl": "Dodano możliwość szyfrowania skryptów hasłem (tylko dla sprzedawców)",
|
|
79
92
|
"uk": "Додана можливість шифрування сценаріїв з паролем (тільки для постачальників)",
|
|
80
93
|
"zh-cn": "添加使用密码加密脚本的可能性( 只针对供应商)"
|
|
81
|
-
},
|
|
82
|
-
"9.0.16": {
|
|
83
|
-
"en": "Added possibility to encrypt scripts with password (only for vendors)",
|
|
84
|
-
"de": "Zusätzliche Möglichkeit, Skripte mit Passwort zu verschlüsseln (nur für Hersteller)",
|
|
85
|
-
"ru": "Добавлена возможность шифрования скриптов с помощью пароля (только для продавцов)",
|
|
86
|
-
"pt": "Adicionada possibilidade de criptografar scripts com senha (somente para fornecedores)",
|
|
87
|
-
"nl": "Toegevoegd mogelijkheid om scripts te versleutelen met wachtwoord (alleen voor leveranciers)",
|
|
88
|
-
"fr": "Ajout de la possibilité de chiffrer les scripts avec le mot de passe (seulement pour les fournisseurs)",
|
|
89
|
-
"it": "Aggiunta possibilità di crittografare gli script con password (solo per i fornitori)",
|
|
90
|
-
"es": "Añadido posibilidad de cifrar scripts con contraseña (sólo para proveedores)",
|
|
91
|
-
"pl": "Dodano możliwość szyfrowania skryptów hasłem (tylko dla sprzedawców)",
|
|
92
|
-
"uk": "Додана можливість шифрування сценаріїв з паролем (тільки для постачальників)",
|
|
93
|
-
"zh-cn": "添加使用密码加密脚本的可能性( 只针对供应商)"
|
|
94
|
-
},
|
|
95
|
-
"9.0.15": {
|
|
96
|
-
"en": "Added possibility to encrypt scripts with password (only for vendors)",
|
|
97
|
-
"de": "Zusätzliche Möglichkeit, Skripte mit Passwort zu verschlüsseln (nur für Hersteller)",
|
|
98
|
-
"ru": "Добавлена возможность шифрования скриптов с помощью пароля (только для продавцов)",
|
|
99
|
-
"pt": "Adicionada possibilidade de criptografar scripts com senha (somente para fornecedores)",
|
|
100
|
-
"nl": "Toegevoegd mogelijkheid om scripts te versleutelen met wachtwoord (alleen voor leveranciers)",
|
|
101
|
-
"fr": "Ajout de la possibilité de chiffrer les scripts avec le mot de passe (seulement pour les fournisseurs)",
|
|
102
|
-
"it": "Aggiunta possibilità di crittografare gli script con password (solo per i fornitori)",
|
|
103
|
-
"es": "Añadido posibilidad de cifrar scripts con contraseña (sólo para proveedores)",
|
|
104
|
-
"pl": "Dodano możliwość szyfrowania skryptów hasłem (tylko dla sprzedawców)",
|
|
105
|
-
"uk": "Додана можливість шифрування сценаріїв з паролем (тільки для постачальників)",
|
|
106
|
-
"zh-cn": "添加使用密码加密脚本的可能性( 只针对供应商)"
|
|
107
|
-
},
|
|
108
|
-
"9.0.14": {
|
|
109
|
-
"en": "Added possibility to encrypt scripts with password (only for vendors)",
|
|
110
|
-
"de": "Zusätzliche Möglichkeit, Skripte mit Passwort zu verschlüsseln (nur für Hersteller)",
|
|
111
|
-
"ru": "Добавлена возможность шифрования скриптов с помощью пароля (только для продавцов)",
|
|
112
|
-
"pt": "Adicionada possibilidade de criptografar scripts com senha (somente para fornecedores)",
|
|
113
|
-
"nl": "Toegevoegd mogelijkheid om scripts te versleutelen met wachtwoord (alleen voor leveranciers)",
|
|
114
|
-
"fr": "Ajout de la possibilité de chiffrer les scripts avec le mot de passe (seulement pour les fournisseurs)",
|
|
115
|
-
"it": "Aggiunta possibilità di crittografare gli script con password (solo per i fornitori)",
|
|
116
|
-
"es": "Añadido posibilidad de cifrar scripts con contraseña (sólo para proveedores)",
|
|
117
|
-
"pl": "Dodano możliwość szyfrowania skryptów hasłem (tylko dla sprzedawców)",
|
|
118
|
-
"uk": "Додана можливість шифрування сценаріїв з паролем (тільки для постачальників)",
|
|
119
|
-
"zh-cn": "添加使用密码加密脚本的可能性( 只针对供应商)"
|
|
120
|
-
},
|
|
121
|
-
"9.0.13": {
|
|
122
|
-
"en": "Added possibility to encrypt scripts with password (only for vendors)",
|
|
123
|
-
"de": "Zusätzliche Möglichkeit, Skripte mit Passwort zu verschlüsseln (nur für Hersteller)",
|
|
124
|
-
"ru": "Добавлена возможность шифрования скриптов с помощью пароля (только для продавцов)",
|
|
125
|
-
"pt": "Adicionada possibilidade de criptografar scripts com senha (somente para fornecedores)",
|
|
126
|
-
"nl": "Toegevoegd mogelijkheid om scripts te versleutelen met wachtwoord (alleen voor leveranciers)",
|
|
127
|
-
"fr": "Ajout de la possibilité de chiffrer les scripts avec le mot de passe (seulement pour les fournisseurs)",
|
|
128
|
-
"it": "Aggiunta possibilità di crittografare gli script con password (solo per i fornitori)",
|
|
129
|
-
"es": "Añadido posibilidad de cifrar scripts con contraseña (sólo para proveedores)",
|
|
130
|
-
"pl": "Dodano możliwość szyfrowania skryptów hasłem (tylko dla sprzedawców)",
|
|
131
|
-
"uk": "Додана можливість шифрування сценаріїв з паролем (тільки для постачальників)",
|
|
132
|
-
"zh-cn": "添加使用密码加密脚本的可能性( 只针对供应商)"
|
|
133
94
|
}
|
|
134
95
|
},
|
|
135
96
|
"platform": "Javascript/Node.js",
|
|
@@ -186,7 +147,7 @@
|
|
|
186
147
|
},
|
|
187
148
|
"dependencies": [
|
|
188
149
|
{
|
|
189
|
-
"js-controller": ">=
|
|
150
|
+
"js-controller": ">=6.0.11"
|
|
190
151
|
}
|
|
191
152
|
],
|
|
192
153
|
"globalDependencies": [
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.javascript",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.2.0",
|
|
4
4
|
"description": "Rules Engine for ioBroker",
|
|
5
5
|
"author": "bluefox <dogafox@gmail.com>",
|
|
6
6
|
"contributors": [
|
|
@@ -42,18 +42,19 @@
|
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@iobroker/adapter-core": "^3.3.2",
|
|
45
|
-
"@iobroker/types": "^7.1.
|
|
46
|
-
"@types/node": "^25.
|
|
47
|
-
"axios": "^1.
|
|
45
|
+
"@iobroker/types": "^7.1.1",
|
|
46
|
+
"@types/node": "^25.6.0",
|
|
47
|
+
"axios": "^1.15.0",
|
|
48
48
|
"jsonata": "^2.1.0",
|
|
49
49
|
"jszip": "^3.10.1",
|
|
50
50
|
"node-inspect": "^2.0.0",
|
|
51
51
|
"node-schedule": "2.1.1",
|
|
52
|
-
"
|
|
52
|
+
"nodemailer": "^8.0.5",
|
|
53
|
+
"prettier": "^3.8.2",
|
|
53
54
|
"promisify-child-process": "^5.0.1",
|
|
54
55
|
"semver": "^7.7.4",
|
|
55
56
|
"suncalc2": "^1.8.1",
|
|
56
|
-
"typescript": "
|
|
57
|
+
"typescript": "5.9.3",
|
|
57
58
|
"virtual-tsc": "^0.6.2",
|
|
58
59
|
"wake_on_lan": "^1.0.0"
|
|
59
60
|
},
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import{c as ie,j as n}from"./createSvgIcon-DPvF8xqu.js";import{j as S,b as H,k as J,c as re}from"./iobroker_javascript__loadShare__react__loadShare__.mjs-CTZOFJS2.js";import{_ as F,a as Q,b as Z,i as $,h as X,c as oe,$ as ae,d as ce,e as le,f as de,g as ee}from"./iobroker_javascript__loadShare___mf_0_mui_mf_1_material__loadShare__.mjs-QWG5Arqe.js";import{_ as l}from"./iobroker_javascript__loadShare___mf_0_iobroker_mf_1_adapter_mf_2_react_mf_2_v5__loadShare__.mjs-DkBjPSMw.js";import{_ as me}from"./preload-helper-BDBacUwf.js";import{C as he,b as ue,R as fe}from"./index-gIA8x-8f.js";import pe from"./ScriptEditorVanillaMonaco-yq11eIYC.js";import{c as te,I as ge}from"./index-Cu-TydZj.js";import{h as ye}from"./index-COZhHfBn.js";import"./iobroker_javascript__loadShare__react__loadShare__.mjs_commonjs-proxy-CE9lvhW8.js";import"./iobroker_javascript__loadShare__prop_mf_2_types__loadShare__.mjs-BCtSFofY.js";import"./virtual_mf-REMOTE_ENTRY_ID_iobroker_javascript__remoteEntry_js-C9suQF96.js";import"./iobroker_javascript__loadShare__react_mf_2_dom__loadShare__.mjs_commonjs-proxy-RQRRZMX5.js";import"./iobroker_javascript__loadShare__react_mf_2_dom__loadShare__.mjs-DeVAS-oa.js";import"./inheritsLoose-B0Ba5G9z.js";const ve=ie(n.jsx("path",{d:"M11.07 12.85c.77-1.39 2.25-2.21 3.11-3.44.91-1.29.4-3.7-2.18-3.7-1.69 0-2.52 1.28-2.87 2.34L6.54 6.96C7.25 4.83 9.18 3 11.99 3c2.35 0 3.96 1.07 4.78 2.41.7 1.15 1.11 3.3.03 4.9-1.2 1.77-2.35 2.31-2.97 3.45-.25.46-.35.76-.35 2.24h-2.89c-.01-.78-.13-2.05.48-3.15M14 20c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2"}),"QuestionMark"),je=me(()=>import("./docs-BrInh2Pn.js"),[],import.meta.url);let G=null;async function xe(s){if(G)return G;const f=await s.getObjectViewSystem("state","","香"),r=await s.getObjectViewSystem("channel","","香"),v=await s.getObjectViewSystem("device","","香"),d=await s.getObjectViewSystem("folder","","香"),k=await s.getObjectViewSystem("enum","","香");return G=Object.assign(f,r,v,d,k),G}function V(s,f){return s&&typeof s=="object"?s[f]||s.en:s||""}async function Ie(s){var P,N,L,K;const f=l.I18n.getLanguage(),r=await xe(s),v=Object.keys(r).sort(),d=new he,k=[],A=["UNREACH_STICKY"],W=[ue.Types.info],_=[],b=[],R=[],D=[];v.forEach(m=>{var a,h,c;((a=r[m])==null?void 0:a.type)==="enum"?_.push(m):(c=(h=r[m])==null?void 0:h.common)!=null&&c.smartName&&D.push(m)}),_.forEach(m=>{m.startsWith("enum.rooms.")?b.push(m):m.startsWith("enum.functions.")&&R.push(m);const a=r[m].common.members;a!=null&&a.length&&a.forEach(h=>{r[h]&&(D.includes(h)||D.push(h))})});const M={id:"",objects:r,_keysOptional:v,_usedIdsOptional:k,ignoreIndicators:A,excludedTypes:W},E=[];D.forEach(m=>{M.id=m;const a=d.detect(M);a&&a.forEach(h=>{var w;const c=(w=h.states.find(i=>i.id))==null?void 0:w.id;if(!c||E.find(i=>i.id===c))return;const j=r[c],z={id:c,name:V(j.common.name,f),type:j.type,deviceType:h.type,states:h.states.filter(i=>i.id).map(i=>({id:i.id,name:i.name,role:i.defaultRole,type:r[i.id].common.type,unit:r[i.id].common.unit,read:r[i.id].common.read===void 0?!0:r[i.id].common.read,write:r[i.id].common.write===void 0?!0:r[i.id].common.write}))},T=c.split(".");let e,o;(j.type==="channel"||j.type==="state")&&(T.pop(),e=T.join("."),r[e]&&(r[e].type==="channel"||r[e].type==="folder")?(T.pop(),o=T.join("."),(!r[o]||r[o].type!=="device"&&r[e].type!=="folder")&&(o=void 0)):e=void 0);const I=b.find(i=>{var x,p,t;return(x=r[i].common.members)!=null&&x.includes(c)||e&&((p=r[i].common.members)!=null&&p.includes(e))?!0:o&&((t=r[i].common.members)==null?void 0:t.includes(o))});I&&(z.room=V(r[I].common.name,f));const g=R.find(i=>{var x,p,t;return(x=r[i].common.members)!=null&&x.includes(c)||e&&((p=r[i].common.members)!=null&&p.includes(e))?!0:o&&((t=r[i].common.members)==null?void 0:t.includes(o))});g&&(z.function=V(r[g].common.name,f)),E.push(z)})});for(let m=0;m<E.length;m++){const a=E[m];if(a.type==="state"||a.type==="channel"){const h=a.id.split(".");h.pop();const c=r[h.join(".")];if(c&&(c.type==="channel"||c.type==="device"||c.type==="folder")){a.name=V(((P=c.common)==null?void 0:P.name)||a.name,f),h.pop();const j=r[h.join(".")];(j==null?void 0:j.type)==="device"&&((N=j.common)!=null&&N.icon)&&(a.name=V(((L=j.common)==null?void 0:L.name)||a.name,f))}else a.name=V(((K=c==null?void 0:c.common)==null?void 0:K.name)||a.name,f)}}return E}const _e=async()=>(await je).default,we={ru:"Russian",en:"English",de:"German",es:"Spanish",fr:"French",it:"Italian",pl:"Polish",nl:"Dutch",pt:"Portuguese",uk:"Ukrainian","zh-cn":"Chinese"},Y={flexShrink:0,opacity:.7},ne={openai:n.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor",style:Y,children:n.jsx("path",{d:"M22.282 9.821a5.985 5.985 0 0 0-.516-4.91 6.046 6.046 0 0 0-6.51-2.9A6.065 6.065 0 0 0 4.981 4.18a5.985 5.985 0 0 0-3.998 2.9 6.046 6.046 0 0 0 .743 7.097 5.98 5.98 0 0 0 .51 4.911 6.051 6.051 0 0 0 6.515 2.9A5.985 5.985 0 0 0 13.26 24a6.056 6.056 0 0 0 5.772-4.206 5.99 5.99 0 0 0 3.997-2.9 6.056 6.056 0 0 0-.747-7.073zM13.26 22.43a4.476 4.476 0 0 1-2.876-1.04l.141-.081 4.779-2.758a.795.795 0 0 0 .392-.681v-6.737l2.02 1.168a.071.071 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.494 4.494zM3.6 18.304a4.47 4.47 0 0 1-.535-3.014l.142.085 4.783 2.759a.771.771 0 0 0 .78 0l5.843-3.369v2.332a.08.08 0 0 1-.033.062L9.74 19.95a4.5 4.5 0 0 1-6.14-1.646zM2.34 7.896a4.485 4.485 0 0 1 2.366-1.973V11.6a.766.766 0 0 0 .388.676l5.815 3.355-2.02 1.168a.076.076 0 0 1-.071 0l-4.83-2.786A4.504 4.504 0 0 1 2.34 7.872zm16.597 3.855-5.833-3.387L15.119 7.2a.076.076 0 0 1 .071 0l4.83 2.791a4.494 4.494 0 0 1-.676 8.105v-5.678a.79.79 0 0 0-.407-.667zm2.01-3.023-.141-.085-4.774-2.782a.776.776 0 0 0-.785 0L9.409 9.23V6.897a.066.066 0 0 1 .028-.061l4.83-2.787a4.5 4.5 0 0 1 6.68 4.66zm-12.64 4.135-2.02-1.164a.08.08 0 0 1-.038-.057V6.075a4.5 4.5 0 0 1 7.375-3.453l-.142.08L8.704 5.46a.795.795 0 0 0-.393.681zm1.097-2.365 2.602-1.5 2.607 1.5v2.999l-2.597 1.5-2.607-1.5z"})}),anthropic:n.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor",style:Y,children:n.jsx("path",{d:"M17.304 3.54h-3.604L7.128 20.46h3.604l1.345-3.462h6.932l1.345 3.462H24L17.304 3.54zm-3.45 10.696 2.647-6.812 2.647 6.812h-5.295zM6.696 3.54H3.092L0 20.46h3.604L6.696 3.54z"})}),gemini:n.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor",style:Y,children:n.jsx("path",{d:"M12 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0z"})}),deepseek:n.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor",style:Y,children:n.jsx("path",{d:"M5 3h6a9 9 0 0 1 0 18H5V3zm4 14V7h2a5 5 0 0 1 0 10H9z"})})};async function se(s,f){const r=Object.keys(f);for(let v=0;v<r.length;v++){const d=await s.getObject(r[v]),k=((d==null?void 0:d.native.gptKey)||"").trim(),A=((d==null?void 0:d.native.claudeKey)||"").trim(),W=((d==null?void 0:d.native.geminiKey)||"").trim(),_=((d==null?void 0:d.native.deepseekKey)||"").trim(),b=((d==null?void 0:d.native.gptBaseUrl)||"").trim()||void 0;if(k||A||W||_||b)return{gptKey:k,claudeKey:A,geminiKey:W,deepseekKey:_,gptBaseUrl:b}}return null}const De=s=>{const[f,r]=S(window.localStorage.getItem("openai-question")||""),[v,d]=S(""),[k,A]=S(!1),[W,_]=S(!1),[b,R]=S(window.localStorage.getItem("openai-model")||""),[D,M]=S(!1),[E,P]=S([]),[N,L]=S(!0),[K,m]=S(null),a=H(null),h=H(null),c=H({}),j=H(null),z=J(async e=>{L(!0),m(null);try{const o=await se(s.socket,s.runningInstances);if(e!=null&&e.current)return;if(!o){L(!1);return}h.current=o;const I=Object.keys(s.runningInstances)[0];if(!I){m(l.I18n.t("No running javascript instance found")),L(!1);return}const g=[],w={},i=[],x=[],p=(t,B)=>{for(const O of t){const C=O.toLowerCase();C.includes("embedding")||C.includes("moderation")||C.startsWith("dall-e")||C.startsWith("tts-")||C.startsWith("whisper")||C.startsWith("babbage")||C.startsWith("davinci")||C.startsWith("sora")||C.startsWith("omni-moderation")||w[O]||(g.push(O),w[O]=B)}};if((o.gptKey||o.gptBaseUrl)&&x.push(s.socket.sendTo(I,"testApiConnection",{apiKey:o.gptKey,baseUrl:o.gptBaseUrl||"",provider:"openai"}).then(t=>{t.models?p(t.models,"openai"):t.error&&i.push(`OpenAI: ${t.error}`)}).catch(t=>{i.push(`OpenAI: ${String(t)}`)})),o.claudeKey&&x.push(s.socket.sendTo(I,"testApiConnection",{apiKey:o.claudeKey,provider:"anthropic"}).then(t=>{t.models?p(t.models,"anthropic"):t.error&&i.push(`Anthropic: ${t.error}`)}).catch(t=>{i.push(`Anthropic: ${String(t)}`)})),o.geminiKey&&x.push(s.socket.sendTo(I,"testApiConnection",{apiKey:o.geminiKey,provider:"gemini"}).then(t=>{t.models?p(t.models,"gemini"):t.error&&i.push(`Gemini: ${t.error}`)}).catch(t=>{i.push(`Gemini: ${String(t)}`)})),o.deepseekKey&&x.push(s.socket.sendTo(I,"testApiConnection",{apiKey:o.deepseekKey,provider:"deepseek"}).then(t=>{t.models?p(t.models,"deepseek"):t.error&&i.push(`DeepSeek: ${t.error}`)}).catch(t=>{i.push(`DeepSeek: ${String(t)}`)})),await Promise.all(x),e!=null&&e.current)return;if(c.current=w,g.length>0){g.sort(),P(g);const t=window.localStorage.getItem("openai-model");t&&g.includes(t)?R(t):R(g[0])}i.length>0&&m(i.join("; "))}catch(o){console.error("Failed to fetch models:",o),e!=null&&e.current||m(l.I18n.t("Request failed: %s",String(o)))}e!=null&&e.current||L(!1)},[s.socket,s.runningInstances]);re(()=>{const e={current:!1};return z(e),()=>{e.current=!0}},[z]);const T=J(async()=>{let e;a.current?e=a.current:(e=await Ie(s.socket),a.current=e,console.log(`devices: ${JSON.stringify(e,null,2)}`));let o=h.current;o||(o=await se(s.socket,s.runningInstances),h.current=o);let I;if(j.current?I=j.current:(I=await _e(),j.current=I),!o){M(!0);return}const g=c.current[b];if(!g){_(l.I18n.t("Please select a valid model"));return}let w,i;g==="anthropic"?(w=o.claudeKey,i=""):g==="gemini"?(w=o.geminiKey,i=""):g==="deepseek"?(w=o.deepseekKey,i=""):(w=o.gptKey,i=o.gptBaseUrl||"");const x=Object.keys(s.runningInstances)[0];if(!x){_(l.I18n.t("No running javascript instance found"));return}A(!0),_(!1);try{const p=await s.socket.sendTo(x,"chatCompletion",{apiKey:w,baseUrl:i,model:b,provider:g,messages:[{role:"system",content:`You are programmer. Here is a documentation:
|
|
2
|
-
|
|
3
|
-
${I}`},{role:"system",content:`Here is list of devices:
|
|
4
|
-
|
|
5
|
-
${JSON.stringify(e,null,2)}`},{role:"user",content:`Write JavaScript code that does:
|
|
6
|
-
|
|
7
|
-
${f}
|
|
8
|
-
Return only code.
|
|
9
|
-
Write comments in ${we[l.I18n.getLanguage()]||"English"}.
|
|
10
|
-
You can call async function directly in the code without encapsulate them in async function as this code will be already executed in async function.
|
|
11
|
-
Do not import any libraries as all functions are already imported.`}]});if(p.error)_(p.error);else{let t=p.content||"";t=t.replace(/<think>[\s\S]*?<\/think>/gi,""),t=t.replace(/<\|endoftext\|>/g,""),t=t.replace(/<\|im_start\|>[\s\S]*?<\|im_end\|>/g,""),t=t.replace(/<\|im_start\|>[\s\S]*/g,"");const B=t.match(/```(?:javascript|js|typescript)?\n?([\s\S]*?)```/m);let O;if(B)O=B[1].trim();else{const C=t.split(`
|
|
12
|
-
`),U=[];let q=!1;for(const y of C){const u=y.trim();!q&&u===""||(!q&&(u.startsWith("//")||u.startsWith("const ")||u.startsWith("let ")||u.startsWith("var ")||u.startsWith("function ")||u.startsWith("async ")||u.startsWith("await ")||u.startsWith("if ")||u.startsWith("for ")||u.startsWith("on(")||u.startsWith("schedule(")||u.startsWith("setState")||u.startsWith("getState")||u.startsWith("createState")||u.startsWith("$")||u.startsWith("'use strict'")||u.startsWith('"use strict"'))&&(q=!0),q&&U.push(y))}for(;U.length>0;){const y=U[U.length-1].trim();if(y===""||y.length>0&&!y.startsWith("//")&&!y.startsWith("*")&&!y.startsWith("}")&&!y.startsWith(");")&&!y.endsWith(";")&&!y.endsWith("}")&&!y.endsWith(")")&&!y.endsWith(",")&&!y.endsWith("{")&&/^[A-Z]/.test(y))U.pop();else break}O=U.join(`
|
|
13
|
-
`).trim()}d(O||"")}}catch(p){console.error("Chat request failed:",p),_(l.I18n.t("Request failed: %s",String(p)))}A(!1)},[f,b,s.runningInstances,s.socket]);return n.jsxs(F,{maxWidth:"lg",sx:{"& .MuiDialog-paper":{height:"calc(100% - 100px)"}},open:!0,onClose:()=>s.onClose(),fullWidth:!0,children:[D&&n.jsxs(F,{maxWidth:"lg",open:!0,onClose:()=>M(!1),fullWidth:!0,children:[n.jsx(Q,{children:l.I18n.t("No API key found")}),n.jsxs(Z,{style:{display:"flex",flexDirection:"column",gap:8},children:[n.jsx("div",{children:l.I18n.t("You have to enter at least one API key in the configuration of javascript adapter.")}),n.jsx($,{variant:"contained",onClick:()=>{const e=Object.keys(s.runningInstances);window.open(`../../#tab-instances/config/${e[0]||"system.adapter.javascript.0"}`,"_blank"),M(!1)},children:l.I18n.t("Open configuration")})]}),n.jsx(X,{children:n.jsx($,{variant:"contained",startIcon:n.jsx(te,{}),onClick:()=>M(!1),children:l.I18n.t("Close")})})]}),n.jsx(Q,{children:l.I18n.t("AI code generator")}),n.jsxs(Z,{style:{display:"flex",flexDirection:"column",gap:8,height:"100%"},children:[n.jsx("div",{children:n.jsx(oe,{variant:"standard",multiline:!0,autoFocus:!0,disabled:k,fullWidth:!0,onKeyUp:e=>{e.key==="Enter"&&e.ctrlKey&&T()},label:l.I18n.t("Enter your question"),helperText:l.I18n.t("Press Ctrl+Enter to get the answer"),value:f,onChange:e=>{window.localStorage.setItem("openai-question",e.target.value),r(e.target.value)}})}),n.jsxs("div",{style:{display:"flex",alignItems:"baseline"},children:[n.jsx($,{variant:"contained",disabled:k||!f||!b,startIcon:n.jsx(ve,{}),onClick:async()=>T(),children:k?n.jsx(ae,{size:24}):l.I18n.t("Ask")}),n.jsxs(ce,{style:{width:300,marginLeft:20},disabled:k,variant:"standard",error:!!K,children:[n.jsx(le,{children:l.I18n.t("Model")}),n.jsxs(de,{variant:"standard",value:b,disabled:N||!!K,renderValue:e=>n.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:8},children:[ne[c.current[e]],e]}),onChange:e=>{window.localStorage.setItem("openai-model",e.target.value),W&&_(!1),R(e.target.value)},children:[N&&n.jsx(ee,{value:"",disabled:!0,children:l.I18n.t("Loading models...")}),E.map(e=>n.jsx(ee,{value:e,children:n.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:8},children:[ne[c.current[e]],e]})},e))]})]}),K&&n.jsx($,{style:{marginLeft:10},variant:"outlined",color:"error",startIcon:n.jsx(fe,{}),onClick:()=>{z()},children:l.I18n.t("Retry")})]}),K&&n.jsx("div",{style:{color:s.themeType==="dark"?"#984242":"#bb0000"},children:K}),n.jsx("div",{children:l.I18n.t("Result")}),n.jsx("div",{style:{height:"calc(100% - 155px)"},children:W?n.jsx("div",{style:{color:s.themeType==="dark"?"#984242":"#bb0000"},children:W}):n.jsx(pe,{triggerPrettier:1,adapterName:s.adapterName,runningInstances:s.runningInstances,style:{height:"100%",width:"100%",resize:"none"},name:"ai",socket:s.socket,readOnly:!0,checkJs:!0,code:v,isDark:s.themeType==="dark",language:s.language||"javascript"})})]}),n.jsxs(X,{children:[n.jsx($,{color:"grey",variant:"outlined",disabled:!v,startIcon:n.jsx(ye,{}),onClick:()=>{l.Utils.copyToClipboard(v),window.alert(l.I18n.t("Copied"))},children:l.I18n.t("Copy to clipboard")}),n.jsx($,{color:"primary",variant:"contained",disabled:!v||!!W,startIcon:n.jsx(ge,{}),onClick:()=>{s.onAddCode(v),s.onClose()},children:l.I18n.t("Use generated code")}),n.jsx($,{color:"grey",variant:"contained",startIcon:n.jsx(te,{}),onClick:()=>s.onClose(),children:l.I18n.t("Close")})]})]})};export{De as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{j as n}from"./createSvgIcon-DPvF8xqu.js";import{a as k}from"./iobroker_javascript__loadShare__react__loadShare__.mjs-CTZOFJS2.js";import{_ as S,a as C,b,h as E,i as w,Q as O,o as v,a0 as T}from"./iobroker_javascript__loadShare___mf_0_mui_mf_1_material__loadShare__.mjs-QWG5Arqe.js";import{n as D,W as N}from"./index-Cu-TydZj.js";import{_ as g}from"./iobroker_javascript__loadShare___mf_0_iobroker_mf_1_adapter_mf_2_react_mf_2_v5__loadShare__.mjs-DkBjPSMw.js";import"./iobroker_javascript__loadShare__react__loadShare__.mjs_commonjs-proxy-CE9lvhW8.js";import"./iobroker_javascript__loadShare__prop_mf_2_types__loadShare__.mjs-BCtSFofY.js";function L(y){return/^script\.js\.global\./.test(y)}let I=0;function j(y){const t=/\x1b\[[0-9;]*m/g;return y.replace(t,"")}class F extends k.Component{monacoDiv=null;editor=null;monaco=window.monaco;insert="";originalCode;runningInstancesStr;monacoCounter=0;location;breakpoints;lastSearch="";typings={};decorations=[];triggerPrettier;constructor(t){super(t),this.state={name:"current",isDark:t.isDark||!1,language:t.language||"javascript",readOnly:t.readOnly||!1,alive:!0,check:!1,searchText:this.props.searchText||"",typingsLoaded:!1,showError:null},this.triggerPrettier=t.triggerPrettier,this.runningInstancesStr=JSON.stringify(this.props.runningInstances),this.originalCode=t.code||"",this.monacoDiv=k.createRef()}waitForMonaco(t){var e,s,o,r,h,a;let i=!!((o=(s=(e=this.monaco)==null?void 0:e.typescript)==null?void 0:s.typescriptDefaults)!=null&&o.getCompilerOptions);if(!i||!this.props.runningInstances){if(this.monaco=window.monaco,i=!!((a=(h=(r=this.monaco)==null?void 0:r.typescript)==null?void 0:h.typescriptDefaults)!=null&&a.getCompilerOptions),this.monacoCounter++,!i&&this.monacoCounter<20){console.log("wait for monaco loaded"),setTimeout(()=>this.waitForMonaco(t),200);return}this.monacoCounter>=20&&console.error("Cannot load monaco!")}else t&&t()}loadTypings(t){if(!this.editor)return;t||=this.props.runningInstances;const i=t&&Object.keys(t).find(e=>t==null?void 0:t[e]);i&&this.props.socket.sendTo(i.replace("system.adapter.",""),"loadTypings",null).then(e=>{this.setState({alive:!0,check:!0,typingsLoaded:!0}),this.setTypeCheck(!0),e.typings?(this.typings=e.typings,this.setEditorTypings(this.state.name)):console.error(`failed to load typings: ${e.error}`)})}componentDidMount(){var e,s,o,r,h,a,d,f,l,p;let t=!!((o=(s=(e=this.monaco)==null?void 0:e.typescript)==null?void 0:s.typescriptDefaults)!=null&&o.getCompilerOptions);if((!t||!this.props.runningInstances)&&(this.monaco=window.monaco,t=!!((a=(h=(r=this.monaco)==null?void 0:r.typescript)==null?void 0:h.typescriptDefaults)!=null&&a.getCompilerOptions),!t)){console.log("wait for monaco loaded..."),this.waitForMonaco(()=>this.componentDidMount());return}if(!this.editor&&t&&this.monaco){console.log("Init editor"),(f=(d=this.props).onRegisterSelect)==null||f.call(d,()=>{var u;if(this.editor){const m=this.editor.getSelection();if(m)return(u=this.editor.getModel())==null?void 0:u.getValueInRange(m)}});const c=this.monaco.typescript.typescriptDefaults.getCompilerOptions();c.allowJs=!0,c.checkJs=this.props.checkJs!==!1,c.noLib=!0,c.lib=[],c.useUnknownInCatchVariables=!1,c.moduleResolution=this.monaco.typescript.ModuleResolutionKind.NodeJs,c.target=this.monaco.typescript.ScriptTarget.ESNext,c.module=this.monaco.typescript.ModuleKind.ESNext,c.allowNonTsExtensions=!0,this.monaco.typescript.typescriptDefaults.setCompilerOptions(c),this.setTypeCheck(!1),(l=this.monacoDiv)!=null&&l.current&&(this.editor=this.monaco.editor.create((p=this.monacoDiv)==null?void 0:p.current,{lineNumbers:"on",scrollBeyondLastLine:!1,automaticLayout:!0,glyphMargin:!!this.props.breakpoints,colorDecorators:!0}),this.editor.onDidChangeModelContent(()=>this.onChange()),this.loadTypings(),this.props.onForceSave&&this.editor.addCommand(this.monaco.KeyMod.CtrlCmd|this.monaco.KeyCode.KeyS,()=>this.props.onForceSave&&this.props.onForceSave()),setTimeout(()=>{this.highlightText(this.state.searchText),this.location=this.props.location||void 0,this.breakpoints=this.props.breakpoints,this.showDecorators()}))}const i={selectOnLineNumbers:!0,scrollBeyondLastLine:!1,automaticLayout:!0,readOnly:this.state.readOnly,language:this.state.language,isDark:this.state.isDark};this.setEditorOptions(i),this.editor&&(this.editor.focus(),this.editor.setValue(this.originalCode),this.props.onToggleBreakpoint?this.editor.onMouseDown(c=>{var m;const u=c.target;this.props.onToggleBreakpoint&&((m=u.detail)==null?void 0:m.glyphMarginLeft)!==void 0&&u.position&&this.props.onToggleBreakpoint(u.position.lineNumber-1)}):this.editor.onMouseDown(()=>{}))}setEditorOptions(t){var i;t&&(t.language&&this.setEditorLanguage(t.language),this.editor&&(t.readOnly!==void 0&&this.editor.updateOptions({readOnly:t.readOnly}),t.lineWrap!==void 0&&this.editor.updateOptions({wordWrap:t.lineWrap?"on":"off"})),t.typeCheck!==void 0&&this.setTypeCheck(t.typeCheck),t.isDark!==void 0&&((i=this.monaco)==null||i.editor.setTheme(t.isDark?"vs-dark":"vs")))}componentWillUnmount(){var t,i;this.editor&&((i=(t=this.props).onRegisterSelect)==null||i.call(t,null),this.editor.dispose(),this.editor=null)}async doPrettier(){var e,s,o,r;const t=this.props.runningInstances&&Object.keys(this.props.runningInstances).find(h=>{var a;return(a=this.props.runningInstances)==null?void 0:a[h]});if(!t){window.alert(g.I18n.t("No script adapter instance found to format the code"));return}const i=await this.props.socket.sendTo(t.replace("system.adapter.",""),"prettier",{code:(e=this.editor)==null?void 0:e.getValue(),type:this.state.language});i.error?this.setState({showError:{title:g.I18n.t("Error formatting code"),message:j(i.error)}}):i.code&&((s=this.editor)==null||s.setValue(i.code),(r=(o=this.props).onChange)==null||r.call(o,i.code),this.showDecorators())}setEditorLanguage(t){var e;if(!this.editor)return;const i=this.editor.getModel();if(i){const s=i.getValue(),o=i.uri.path,r=typeof o=="string"&&o.includes(".")?o.substring(0,o.lastIndexOf(".")):"index",h=t==="javascript"?"js":t==="typescript"?"ts":t;i.dispose();const a=t==="javascript"||t==="typescript"?"typescript":t,d=(e=this.monaco)==null?void 0:e.editor.createModel(s,a,this.monaco.Uri.from({scheme:window.location.protocol.replace(":",""),path:`${r}${I++}.${h}`}));d&&this.editor.setModel(d)}}setTypeCheck(t){var e,s;const i={noSemanticValidation:!this.state.alive||!t,noSyntaxValidation:!this.state.alive};(e=this.monaco)==null||e.typescript.typescriptDefaults.setDiagnosticsOptions(i),(s=this.monaco)==null||s.typescript.javascriptDefaults.setDiagnosticsOptions({noSemanticValidation:!this.state.alive||!t,noSyntaxValidation:!this.state.alive})}setEditorTypings(t=""){var o,r,h,a,d,f;const i=L(t),e=`${t}.d.ts`,s=[];for(const l of Object.keys(this.typings))i&&(l==="global.d.ts"||l.startsWith("script.js.global")&&l!==e)||s.push({filePath:l,content:this.typings[l]});if((h=(r=(o=this.monaco)==null?void 0:o.typescript)==null?void 0:r.typescriptDefaults)!=null&&h.setExtraLibs)this.monaco.typescript.typescriptDefaults.setExtraLibs(s);else if((f=(d=(a=this.monaco)==null?void 0:a.typescript)==null?void 0:d.typescriptDefaults)!=null&&f.addExtraLib){const l=this.monaco.typescript.typescriptDefaults.getExtraLibs();s.forEach(p=>{!l[p.filePath]&&this.monaco&&this.monaco.typescript.typescriptDefaults.addExtraLib(p.content,p.filePath)})}}insertTextIntoEditor(t){if(!this.editor||!this.monaco)return;const i=this.editor.getSelection();if(i){const e=new this.monaco.Range(i.startLineNumber,i.startColumn,i.endLineNumber,i.endColumn);this.editor.executeEdits("",[{range:e,text:t,forceMoveMarkers:!0}])}this.editor.focus()}highlightText(t){var e;if(!this.editor||!this.monaco)return;const i=t?(e=this.editor.getModel())==null?void 0:e.findMatches(t,!0,!1,!1,null,!0):void 0;if(i!=null&&i.length)i.forEach(s=>{var o;return(o=this.editor)==null?void 0:o.setSelection(s.range)}),this.editor.revealLine(i[0].range.startLineNumber);else{const s=this.editor.getPosition();if(s){const o=s.lineNumber,r=s.column;this.editor.setSelection(new this.monaco.Range(o,r,o,r))}}}showDecorators(){var i;const t=[];if(this.location&&this.monaco&&(t.push({range:new this.monaco.Range(this.location.lineNumber+1,(this.location.columnNumber||0)+1,this.location.lineNumber+1,1e3),options:{isWholeLine:!1,className:this.props.isDark?"monacoCurrentLineDark":"monacoCurrentLine"}}),t.push({range:new this.monaco.Range(this.location.lineNumber+1,0,this.location.lineNumber+1,0),options:{isWholeLine:!0,className:this.props.isDark?"monacoCurrentFullLineDark":"monacoCurrentFullLine"}})),(i=this.breakpoints)==null||i.forEach(e=>{this.monaco&&t.push({range:new this.monaco.Range(e.location.lineNumber+1,0,e.location.lineNumber+1,100),options:{isWholeLine:!0,glyphMarginClassName:this.props.isDark?"monacoBreakPointDark":"monacoBreakPoint"}})}),this.editor){const e=this.editor.getModel();e&&(this.decorations=e.deltaDecorations(this.decorations,t))}}initNewScript(t,i){var e;this.setState({name:t}),this.originalCode=i||"",(e=this.editor)==null||e.setValue(i||""),this.highlightText(this.lastSearch),this.showDecorators(),this.setEditorTypings(t)}scrollToLineIfNeeded(t){if(this.editor){const i=this.editor.getVisibleRanges();(!i||!i[0]||i[0].startLineNumber>t||t>i[0].endLineNumber)&&this.editor.revealLineInCenter(t)}}UNSAFE_componentWillReceiveProps(t){const i={};this.state.name!==t.name&&this.initNewScript(t.name,t.code),JSON.stringify(t.runningInstances)!==this.runningInstancesStr&&(this.runningInstancesStr=JSON.stringify(t.runningInstances),this.state.typingsLoaded||this.loadTypings(t.runningInstances)),this.editor&&!t.changed&&(t.code!==this.originalCode||t.code!==this.editor.getValue())&&(this.originalCode=t.code||"",this.editor.setValue(this.originalCode),this.showDecorators(),this.location&&this.scrollToLineIfNeeded(this.location.lineNumber+1)),t.searchText!==this.lastSearch&&(this.lastSearch=t.searchText||"",this.highlightText(this.lastSearch)),JSON.stringify(t.location)!==JSON.stringify(this.location)&&JSON.stringify(t.breakpoints)!==JSON.stringify(this.breakpoints)?(this.location=t.location||void 0,this.breakpoints=t.breakpoints,this.showDecorators(),this.editor&&this.location&&this.scrollToLineIfNeeded(this.location.lineNumber+1)):JSON.stringify(t.breakpoints)!==JSON.stringify(this.breakpoints)?(this.breakpoints=t.breakpoints,this.showDecorators()):JSON.stringify(t.location)!==JSON.stringify(this.location)&&(this.location=t.location||void 0,this.showDecorators(),this.editor&&this.location&&this.scrollToLineIfNeeded(this.location.lineNumber+1)),this.state.language!==(t.language||"javascript")?(this.setState({language:t.language||"javascript"}),i.language=t.language||"javascript"):this.state.readOnly!==(t.readOnly||!1)?(this.setState({readOnly:t.readOnly||!1}),i.readOnly=t.readOnly):this.state.isDark!==(t.isDark||!1)&&(this.setState({isDark:t.isDark||!1}),i.isDark=t.isDark),this.setEditorOptions(i),this.insert!==t.insert&&(this.insert=t.insert||"",this.insert&&(console.log(`Insert text: ${this.insert}`),setTimeout(e=>{this.insertTextIntoEditor(e),setTimeout(()=>this.props.onInserted&&this.props.onInserted(),100)},100,this.insert)))}onChange(){var t,i;!this.props.readOnly&&this.editor&&((i=(t=this.props).onChange)==null||i.call(t,this.editor.getValue()))}renderErrorDialog(){return this.state.showError?this.state.showError.full?n.jsxs(S,{open:!0,maxWidth:"md",onClose:()=>this.setState({showError:null}),children:[n.jsx(C,{children:this.state.showError.title||g.I18n.t("Error")}),n.jsx(b,{children:n.jsx("pre",{children:n.jsx("code",{children:this.state.showError.message})})}),n.jsx(E,{children:n.jsxs(w,{variant:"contained",startIcon:n.jsx(D,{}),onClick:()=>this.setState({showError:null}),children:[g.I18n.t("Close")," "]})})]}):n.jsx(O,{open:!0,autoHideDuration:5e3,onClose:()=>this.setState({showError:null}),message:this.state.showError.title,action:n.jsxs(k.Fragment,{children:[n.jsx(w,{color:"secondary",size:"small",onClick:()=>this.setState({showError:{...this.state.showError,full:!0}}),children:g.I18n.t("More")}),n.jsx(v,{size:"small","aria-label":"close",color:"inherit",onClick:()=>this.setState({showError:null}),children:n.jsx(D,{fontSize:"small"})})]})}):null}render(){var t,i;return!((i=(t=this.monaco)==null?void 0:t.typescript)!=null&&i.typescriptDefaults)||!this.props.runningInstances?(setTimeout(()=>{this.monaco=window.monaco,this.forceUpdate()},200),null):(this.props.triggerPrettier!==this.triggerPrettier&&(this.triggerPrettier=this.props.triggerPrettier,setTimeout(()=>this.doPrettier().catch(e=>console.error("Error formatting code:",e)),50)),n.jsxs("div",{ref:this.monacoDiv,style:{...this.props.style,width:"100%",height:"100%",overflow:"hidden",position:"relative"},children:[this.renderErrorDialog(),!this.state.check&&n.jsx(T,{size:"small",title:g.I18n.t("Check is not active, because javascript adapter is disabled"),style:{bottom:10,right:10,opacity:.5,position:"absolute",zIndex:1,background:"red",color:"white"},color:"secondary",children:n.jsx(N,{})})]}))}}export{F as default};
|