pygpt-net 2.6.57__py3-none-any.whl → 2.6.59__py3-none-any.whl

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. pygpt_net/CHANGELOG.txt +10 -0
  2. pygpt_net/__init__.py +3 -3
  3. pygpt_net/app.py +30 -25
  4. pygpt_net/controller/debug/debug.py +3 -3
  5. pygpt_net/controller/dialogs/info.py +6 -2
  6. pygpt_net/controller/ui/tabs.py +17 -0
  7. pygpt_net/core/agents/runners/llama_workflow.py +0 -0
  8. pygpt_net/core/filesystem/parser.py +37 -24
  9. pygpt_net/core/filesystem/url.py +5 -2
  10. pygpt_net/data/config/config.json +4 -3
  11. pygpt_net/data/config/models.json +3 -3
  12. pygpt_net/data/config/settings.json +41 -2
  13. pygpt_net/data/js/app/ui.js +1 -1
  14. pygpt_net/data/js/app.min.js +2 -2
  15. pygpt_net/data/locale/locale.de.ini +5 -1
  16. pygpt_net/data/locale/locale.en.ini +5 -1
  17. pygpt_net/data/locale/locale.es.ini +5 -1
  18. pygpt_net/data/locale/locale.fr.ini +5 -1
  19. pygpt_net/data/locale/locale.it.ini +5 -1
  20. pygpt_net/data/locale/locale.pl.ini +5 -1
  21. pygpt_net/data/locale/locale.uk.ini +5 -1
  22. pygpt_net/data/locale/locale.zh.ini +5 -1
  23. pygpt_net/data/locale/plugin.cmd_system.en.ini +68 -0
  24. pygpt_net/js_rc.py +5 -5
  25. pygpt_net/plugin/base/plugin.py +3 -5
  26. pygpt_net/plugin/cmd_system/config.py +377 -1
  27. pygpt_net/plugin/cmd_system/plugin.py +52 -8
  28. pygpt_net/plugin/cmd_system/runner.py +508 -32
  29. pygpt_net/plugin/cmd_system/winapi.py +481 -0
  30. pygpt_net/plugin/cmd_system/worker.py +88 -15
  31. pygpt_net/provider/agents/llama_index/workflow/supervisor.py +0 -0
  32. pygpt_net/provider/core/config/patch.py +8 -1
  33. pygpt_net/provider/llms/openai.py +6 -4
  34. pygpt_net/tools/code_interpreter/ui/html.py +2 -1
  35. pygpt_net/tools/html_canvas/ui/widgets.py +19 -18
  36. pygpt_net/tools/web_browser/__init__.py +12 -0
  37. pygpt_net/tools/web_browser/tool.py +232 -0
  38. pygpt_net/tools/web_browser/ui/__init__.py +0 -0
  39. pygpt_net/tools/web_browser/ui/dialogs.py +123 -0
  40. pygpt_net/tools/web_browser/ui/widgets.py +351 -0
  41. pygpt_net/ui/widget/textarea/html.py +172 -24
  42. pygpt_net/ui/widget/textarea/web.py +1 -1
  43. {pygpt_net-2.6.57.dist-info → pygpt_net-2.6.59.dist-info}/METADATA +81 -61
  44. {pygpt_net-2.6.57.dist-info → pygpt_net-2.6.59.dist-info}/RECORD +45 -39
  45. {pygpt_net-2.6.57.dist-info → pygpt_net-2.6.59.dist-info}/LICENSE +0 -0
  46. {pygpt_net-2.6.57.dist-info → pygpt_net-2.6.59.dist-info}/WHEEL +0 -0
  47. {pygpt_net-2.6.57.dist-info → pygpt_net-2.6.59.dist-info}/entry_points.txt +0 -0
pygpt_net/CHANGELOG.txt CHANGED
@@ -1,3 +1,13 @@
1
+ 2.6.59 (2025-09-23)
2
+
3
+ - LlamaIndex has been upgraded to v0.13.6.
4
+ - The Responses API is disabled by default in Agents (LlamaIndex) for compatibility.
5
+ - Added WinAPI support to the System (OS) plugin.
6
+
7
+ 2.6.58 (2025-09-22)
8
+
9
+ - Added: internal Web Browser tool.
10
+
1
11
  2.6.57 (2025-09-22)
2
12
 
3
13
  - Changed: The web search icon has been moved to the input area.
pygpt_net/__init__.py CHANGED
@@ -6,15 +6,15 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2025.09.22 00:00:00 #
9
+ # Updated Date: 2025.09.23 00:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  __author__ = "Marcin Szczygliński"
13
13
  __copyright__ = "Copyright 2025, Marcin Szczygliński"
14
14
  __credits__ = ["Marcin Szczygliński"]
15
15
  __license__ = "MIT"
16
- __version__ = "2.6.57"
17
- __build__ = "2025-09-22"
16
+ __version__ = "2.6.59"
17
+ __build__ = "2025-09-23"
18
18
  __maintainer__ = "Marcin Szczygliński"
19
19
  __github__ = "https://github.com/szczyglis-dev/py-gpt"
20
20
  __report__ = "https://github.com/szczyglis-dev/py-gpt/issues"
pygpt_net/app.py CHANGED
@@ -6,7 +6,7 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2025.09.22 09:00:00 #
9
+ # Updated Date: 2025.09.22 19:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import os
@@ -203,13 +203,14 @@ from pygpt_net.tools.media_player import MediaPlayer as MediaPlayerTool
203
203
  from pygpt_net.tools.text_editor import TextEditor as TextEditorTool
204
204
  from pygpt_net.tools.html_canvas import HtmlCanvas as HtmlCanvasTool
205
205
  from pygpt_net.tools.translator import Translator as TranslatorTool
206
+ from pygpt_net.tools.web_browser import WebBrowser as WebBrowserTool
206
207
  # from pygpt_net.tools.agent_builder import AgentBuilder as AgentBuilderTool
207
208
 
208
209
  def run(**kwargs):
209
210
  """
210
- PyGPT launcher.
211
+ PyGPT Launcher
211
212
 
212
- :param kwargs: keyword arguments for launcher
213
+ :param kwargs: Keyword arguments for the launcher.
213
214
 
214
215
  PyGPT can be extended with:
215
216
 
@@ -223,46 +224,48 @@ def run(**kwargs):
223
224
  - Custom tools
224
225
  - Custom agents
225
226
 
226
- - You can pass custom plugin instances, LLM wrappers, vector store providers and more to the launcher.
227
- - This is useful if you want to extend PyGPT with your own plugins, vector storage, LLMs, or other data providers.
227
+ You can provide custom plugin instances, LLM wrappers, vector store providers, and more to the launcher.
228
+ This is useful for extending PyGPT with your own plugins, vector storage, LLMs, or other data providers.
228
229
 
229
- First, create a custom launcher file, for example, "custom_launcher.py," and register your extensions in it.
230
+ --- HOW TO REGISTER CUSTOM EXTENSIONS ---
230
231
 
231
- To register a custom plugin - create the custom launcher, e.g. "custom_launcher.py" and:
232
+ 1. First, create a custom launcher file, such as "custom_launcher.py," and register your extensions in it.
232
233
 
233
- - Pass a list with the plugin instances as the 'plugins' keyword argument.
234
+ To register a custom plugin, create the custom launcher (e.g., "custom_launcher.py") and:
235
+
236
+ - Pass a list containing the plugin instances as the `plugins` keyword argument.
234
237
 
235
238
  To register a custom LLM wrapper:
236
239
 
237
- - Pass a list with the LLM wrapper instances as the 'llms' keyword argument.
240
+ - Pass a list containing the LLM wrapper instances as the `llms` keyword argument.
238
241
 
239
242
  To register a custom vector store provider:
240
243
 
241
- - Pass a list with the vector store provider instances as the 'vector_stores' keyword argument.
244
+ - Pass a list containing the vector store provider instances as the `vector_stores` keyword argument.
242
245
 
243
246
  To register a custom data loader:
244
247
 
245
- - Pass a list with the data loader instances as the 'loaders' keyword argument.
248
+ - Pass a list containing the data loader instances as the `loaders` keyword argument.
246
249
 
247
250
  To register a custom audio input provider:
248
251
 
249
- - Pass a list with the audio input provider instances as the 'audio_input' keyword argument.
252
+ - Pass a list containing the audio input provider instances as the `audio_input` keyword argument.
250
253
 
251
254
  To register a custom audio output provider:
252
255
 
253
- - Pass a list with the audio output provider instances as the 'audio_output' keyword argument.
256
+ - Pass a list containing the audio output provider instances as the `audio_output` keyword argument.
254
257
 
255
258
  To register a custom web provider:
256
259
 
257
- - Pass a list with the web provider instances as the 'web' keyword argument.
260
+ - Pass a list containing the web provider instances as the `web` keyword argument.
258
261
 
259
262
  To register a custom agent:
260
263
 
261
- - Pass a list with the agent instances as the 'agents' keyword argument.
264
+ - Pass a list containing the agent instances as the `agents` keyword argument.
262
265
 
263
266
  To register a custom tool:
264
267
 
265
- - Pass a list with the tool instances as the 'tools' keyword argument.
268
+ - Pass a list containing the tool instances as the `tools` keyword argument.
266
269
 
267
270
  Example:
268
271
  --------
@@ -271,15 +274,16 @@ def run(**kwargs):
271
274
  # custom_launcher.py
272
275
 
273
276
  from pygpt_net.app import run
274
- from plugins import CustomPlugin, OtherCustomPlugin
275
- from llms import CustomLLM
276
- from vector_stores import CustomVectorStore
277
- from loaders import CustomLoader
278
- from audio_input import CustomAudioInput
279
- from audio_output import CustomAudioOutput
280
- from web import CustomWebSearch
281
- from tools import CustomTool
282
- from agents import CustomAgent
277
+
278
+ from .my_plugins import CustomPlugin, OtherCustomPlugin
279
+ from .my_llms import CustomLLM
280
+ from .my_vector_stores import CustomVectorStore
281
+ from .my_loaders import CustomLoader
282
+ from .my_audio_input import CustomAudioInput
283
+ from .my_audio_output import CustomAudioOutput
284
+ from .my_web import CustomWebSearch
285
+ from .my_tools import CustomTool
286
+ from .my_agents import CustomAgent
283
287
 
284
288
  plugins = [
285
289
  CustomPlugin(),
@@ -511,6 +515,7 @@ def run(**kwargs):
511
515
  launcher.add_tool(CodeInterpreterTool())
512
516
  launcher.add_tool(HtmlCanvasTool())
513
517
  launcher.add_tool(TranslatorTool())
518
+ launcher.add_tool(WebBrowserTool())
514
519
  # launcher.add_tool(AgentBuilderTool())
515
520
 
516
521
  # register custom tools
@@ -6,7 +6,7 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2025.09.14 20:00:00 #
9
+ # Updated Date: 2025.09.22 19:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from datetime import datetime
@@ -74,8 +74,8 @@ class Debug(QObject):
74
74
 
75
75
  :param url: debug URL
76
76
  """
77
- self.window.tools.get("html_canvas").set_url(url)
78
- self.window.tools.get("html_canvas").auto_open(load=False)
77
+ self.window.tools.get("web_browser").set_url(url)
78
+ self.window.tools.get("web_browser").auto_open(load=False)
79
79
 
80
80
  def open_dev_tools(self) -> None:
81
81
  """
@@ -6,7 +6,7 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2025.08.03 14:00:00 #
9
+ # Updated Date: 2025.09.22 19:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from PySide6.QtCore import QUrl
@@ -69,7 +69,11 @@ class Info:
69
69
  :param url: URL to open
70
70
  """
71
71
  if url:
72
- QDesktopServices.openUrl(QUrl(url))
72
+ if self.window.core.config.get("ctx.urls.internal", False):
73
+ self.window.tools.get("web_browser").set_url(url)
74
+ self.window.tools.get("web_browser").auto_open(load=False)
75
+ else:
76
+ QDesktopServices.openUrl(QUrl(url))
73
77
 
74
78
  def goto_website(self):
75
79
  """Open project website"""
@@ -688,6 +688,23 @@ class Tabs:
688
688
  self.window.core.tabs.update_title(idx, title, tooltip)
689
689
  self.debug()
690
690
 
691
+ def update_title_by_tab(self, tab: Tab, title: str):
692
+ """
693
+ Update tab title by Tab instance
694
+
695
+ :param tab: Tab instance
696
+ :param title: new title
697
+ """
698
+ if tab is None:
699
+ return
700
+ tabs = self.window.ui.layout.get_tabs_by_idx(tab.column_idx)
701
+ tooltip = title
702
+ tabs.setTabToolTip(tab.idx, tooltip)
703
+ if len(title) > self.TAB_CHAT_MAX_CHARS:
704
+ title = title[:self.TAB_CHAT_MAX_CHARS] + '...'
705
+ tabs.setTabText(tab.idx, title)
706
+ self.debug()
707
+
691
708
  def update_title_current(self, title: str):
692
709
  """
693
710
  Update current tab title
File without changes
@@ -26,28 +26,44 @@ class Parser:
26
26
 
27
27
  def extract_data_paths(self, text: str) -> list:
28
28
  """
29
- Extract file paths from text that contain 'data' segment.
30
-
31
- :param text: input text
32
- :return: list of file paths containing 'data' segment
29
+ Extract file paths from text that contain 'data' segment (case-insensitive).
30
+ Supports quoted and unquoted paths, POSIX/Windows, and ignores URLs.
33
31
  """
34
- if text is None:
32
+ if not text:
35
33
  return []
36
- path_pattern = r"(?:[A-Za-z]:)?(?:[\\/][^\s'\";]+)+"
37
- candidates = re.findall(path_pattern, text)
38
- filtered = [
39
- p for p in candidates
40
- if re.search(r"(?:^|[\\/])data(?:[\\/]|$)", p)
41
- ]
42
- return filtered
43
-
44
- def extract_data_files(self, ctx: CtxItem, response: str) -> list:
34
+
35
+ def is_data_path(p: str) -> bool:
36
+ # 'data' (case-insensitive)
37
+ return re.search(r"(?i)(?:^|[\\/])data(?:[\\/]|$)", p) is not None
38
+
39
+ def is_url(p: str) -> bool:
40
+ return re.match(r"^[a-z][a-z0-9+.-]*://", p, re.I) is not None
41
+
42
+ results = []
43
+
44
+ quoted_pat = re.compile(r"(?P<q>['\"])(?P<p>(?:[A-Za-z]:)?[\\/](?:(?!\1).)+?)\1")
45
+ for m in quoted_pat.finditer(text):
46
+ p = m.group("p").strip()
47
+ if not is_url(p) and is_data_path(p):
48
+ results.append(p)
49
+
50
+ unquoted_pat = re.compile(r"(?P<p>(?:[A-Za-z]:)?(?:[\\/][^\s'\"),;]+)+)")
51
+ for m in unquoted_pat.finditer(text):
52
+ p = m.group("p").strip()
53
+ if not is_url(p) and is_data_path(p):
54
+ results.append(p)
55
+
56
+ seen = set()
57
+ out = []
58
+ for p in results:
59
+ if p not in seen:
60
+ seen.add(p)
61
+ out.append(p)
62
+ return out
63
+
64
+ def extract_data_files(self, ctx: "CtxItem", response: str) -> list:
45
65
  """
46
66
  Extract files from tool outputs and return list of file paths.
47
-
48
- :param ctx: CtxItem
49
- :param response: response text containing file paths
50
- :return: list of file paths
51
67
  """
52
68
  if response is None:
53
69
  return []
@@ -58,14 +74,11 @@ class Parser:
58
74
  def replace_with_local(path):
59
75
  """
60
76
  Replace the path with local data directory path.
61
-
62
- :param path: original path
63
- :return: modified path
64
77
  """
65
78
  segments = re.split(r"[\\/]+", path)
66
- try:
67
- data_index = segments.index("data")
68
- except ValueError:
79
+ # case-insensitive find of 'data'
80
+ data_index = next((i for i, s in enumerate(segments) if s.lower() == "data"), None)
81
+ if data_index is None:
69
82
  return path
70
83
  tail = segments[data_index + 1:]
71
84
  new_path = os.path.join(local_data_dir, *tail) if tail else local_data_dir
@@ -6,7 +6,7 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2024.12.09 03:00:00 #
9
+ # Updated Date: 2025.09.22 19:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from PySide6.QtCore import QUrl
@@ -85,7 +85,10 @@ class Url:
85
85
  elif url.scheme() == 'extra-code-copy': # copy code block
86
86
  id = url.toString().split(':')[1]
87
87
  self.window.controller.ctx.extra.copy_code_block(int(id))
88
-
89
88
  else:
90
89
  # external link
90
+ if url.scheme().startswith('http'):
91
+ self.window.controller.dialogs.info.open_url(url.toString())
92
+ return
93
+
91
94
  QDesktopServices.openUrl(url)
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "__meta__": {
3
- "version": "2.6.57",
4
- "app.version": "2.6.57",
5
- "updated_at": "2025-09-22T00:00:00"
3
+ "version": "2.6.59",
4
+ "app.version": "2.6.59",
5
+ "updated_at": "2025-09-23T00:00:00"
6
6
  },
7
7
  "access.audio.event.speech": false,
8
8
  "access.audio.event.speech.disabled": [],
@@ -164,6 +164,7 @@
164
164
  "ctx.search_content": true,
165
165
  "ctx.search.string": "",
166
166
  "ctx.sources": true,
167
+ "ctx.urls.internal": false,
167
168
  "ctx.use_extra": true,
168
169
  "current_model": {
169
170
  "assistant": "gpt-4o",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "__meta__": {
3
- "version": "2.6.57",
4
- "app.version": "2.6.57",
5
- "updated_at": "2025-09-22T00:00:00"
3
+ "version": "2.6.59",
4
+ "app.version": "2.6.59",
5
+ "updated_at": "2025-09-23T00:00:00"
6
6
  },
7
7
  "items": {
8
8
  "SpeakLeash/bielik-11b-v2.3-instruct:Q4_K_M": {
@@ -14,7 +14,7 @@
14
14
  "bold": true
15
15
  },
16
16
  "urls": {
17
- "OpenAI API Keys": "https://platform.openai.com/account/api-keys"
17
+ "API Keys": "https://platform.openai.com/account/api-keys"
18
18
  },
19
19
  "secret": true,
20
20
  "persist": true,
@@ -98,6 +98,9 @@
98
98
  "extra": {
99
99
  "bold": true
100
100
  },
101
+ "urls": {
102
+ "API Keys": "https://aistudio.google.com/app/apikey"
103
+ },
101
104
  "secret": true,
102
105
  "persist": true,
103
106
  "advanced": false,
@@ -207,6 +210,9 @@
207
210
  "extra": {
208
211
  "bold": true
209
212
  },
213
+ "urls": {
214
+ "API Keys": "https://platform.claude.com/settings/keys"
215
+ },
210
216
  "secret": true,
211
217
  "persist": true,
212
218
  "advanced": false,
@@ -256,6 +262,9 @@
256
262
  "extra": {
257
263
  "bold": true
258
264
  },
265
+ "urls": {
266
+ "API Keys": "https://huggingface.co/settings/tokens"
267
+ },
259
268
  "secret": true,
260
269
  "persist": true,
261
270
  "advanced": false,
@@ -290,6 +299,9 @@
290
299
  "extra": {
291
300
  "bold": true
292
301
  },
302
+ "urls": {
303
+ "API Keys": "https://platform.deepseek.com/api_keys"
304
+ },
293
305
  "secret": true,
294
306
  "persist": true,
295
307
  "advanced": false,
@@ -324,6 +336,9 @@
324
336
  "extra": {
325
337
  "bold": true
326
338
  },
339
+ "urls": {
340
+ "API Keys": "https://console.x.ai"
341
+ },
327
342
  "secret": true,
328
343
  "persist": true,
329
344
  "advanced": false,
@@ -405,6 +420,9 @@
405
420
  "extra": {
406
421
  "bold": true
407
422
  },
423
+ "urls": {
424
+ "API Keys": "https://www.perplexity.ai/account/api/keys"
425
+ },
408
426
  "secret": true,
409
427
  "persist": true,
410
428
  "advanced": false,
@@ -439,6 +457,9 @@
439
457
  "extra": {
440
458
  "bold": true
441
459
  },
460
+ "urls": {
461
+ "API Keys": "https://admin.mistral.ai/organization/api-keys"
462
+ },
442
463
  "secret": true,
443
464
  "persist": true,
444
465
  "advanced": false,
@@ -473,6 +494,9 @@
473
494
  "extra": {
474
495
  "bold": true
475
496
  },
497
+ "urls": {
498
+ "API Keys": "https://dashboard.voyageai.com/organization/api-keys"
499
+ },
476
500
  "secret": true,
477
501
  "persist": true,
478
502
  "advanced": false,
@@ -492,6 +516,9 @@
492
516
  "extra": {
493
517
  "bold": true
494
518
  },
519
+ "urls": {
520
+ "API Keys": "https://openrouter.ai/settings/keys"
521
+ },
495
522
  "secret": true,
496
523
  "persist": true,
497
524
  "advanced": false,
@@ -1139,7 +1166,19 @@
1139
1166
  "step": null,
1140
1167
  "advanced": false
1141
1168
  },
1142
-
1169
+ "ctx.urls.internal": {
1170
+ "section": "ctx",
1171
+ "type": "bool",
1172
+ "slider": false,
1173
+ "label": "settings.ctx.urls.internal",
1174
+ "description": "settings.ctx.urls.internal.desc",
1175
+ "value": true,
1176
+ "min": null,
1177
+ "max": null,
1178
+ "multiplier": null,
1179
+ "step": null,
1180
+ "secret": false
1181
+ },
1143
1182
  "ctx.convert_lists": {
1144
1183
  "section": "ctx",
1145
1184
  "type": "bool",
@@ -46,7 +46,7 @@ class UIManager {
46
46
  '.msg-box.msg-user .msg .msg-copy-btn { position: absolute; top: 2px; right: 0px; z-index: 3;',
47
47
  ' opacity: 0; pointer-events: none; transition: opacity .15s ease, transform .15s ease, background-color .15s ease, border-color .15s ease;',
48
48
  ' border-radius: 6px; padding: 4px; line-height: 0; border: 1px solid transparent; background: transparent; }',
49
- '.msg-box.msg-user:hover .msg .msg-copy-btn, .msg-box.msg-user .msg:focus-within .msg-copy-btn { opacity: 1; pointer-events: auto; }',
49
+ '.msg-box.msg-user .msg:hover .msg-copy-btn, .msg-box.msg-user .msg:focus-within .msg-copy-btn { opacity: 1; pointer-events: auto; }',
50
50
  '.msg-box.msg-user .msg .msg-copy-btn:hover { transform: scale(1.06); background: var(--copy-btn-bg-hover, rgba(0,0,0,.86)); border-color: var(--copy-btn-border, rgba(0,0,0,.08)); }',
51
51
  '.msg-box.msg-user .msg .msg-copy-btn.copied { background: var(--copy-btn-bg-copied, rgba(150,150,150,.12)); border-color: var(--copy-btn-border-copied, rgba(150,150,150,.35)); animation: msg-copy-pop .25s ease; }',
52
52
  '.msg-box.msg-user .msg .msg-copy-btn img { display: block; width: 18px; height: 18px; }',
@@ -1,4 +1,4 @@
1
- /* app.min.js — generated on 2025-09-22 09:05:08 by bin/minify_js.py using rjsmin */
1
+ /* app.min.js — generated on 2025-09-22 22:18:13 by bin/minify_js.py using rjsmin */
2
2
 
3
3
  /* data/js/app/async.js */
4
4
  class AsyncRunner{constructor(cfg,raf){this.cfg=cfg||{};this.raf=raf||null;const A=this.cfg.ASYNC||{};this.SLICE_MS=Utils.g('ASYNC_SLICE_MS',A.SLICE_MS??12);this.SLICE_HIDDEN_MS=Utils.g('ASYNC_SLICE_HIDDEN_MS',A.SLICE_HIDDEN_MS??Math.min(this.SLICE_MS,6));this.MIN_YIELD_MS=Utils.g('ASYNC_MIN_YIELD_MS',A.MIN_YIELD_MS??0);this._opGen=new Map();}
@@ -803,7 +803,7 @@ toggle(id){const el=document.getElementById('msg-bot-'+id);if(!el)return;const o
803
803
  /* data/js/app/ui.js */
804
804
  class UIManager{updateCSS(styles){let style=document.getElementById('app-style');if(!style){style=document.createElement('style');style.id='app-style';document.head.appendChild(style);}
805
805
  style.textContent=styles;}
806
- ensureStickyHeaderStyle(){let style=document.getElementById('code-sticky-style');if(style)return;style=document.createElement('style');style.id='code-sticky-style';style.textContent=['.code-wrapper { position: relative; }','.code-wrapper .code-header-wrapper { position: sticky; top: var(--code-header-sticky-top, -2px); z-index: 2; box-shadow: 0 1px 0 rgba(0,0,0,.06); }','.code-wrapper pre { overflow: visible; margin-top: 0; }','.code-wrapper pre code { display: block; white-space: pre; max-height: 100dvh; overflow: auto;',' overscroll-behavior: contain; -webkit-overflow-scrolling: touch; overflow-anchor: none; scrollbar-gutter: stable both-edges; scroll-behavior: auto; }','#_loader_.hidden { display: none !important; visibility: hidden !important; }','#_loader_.visible { display: block; visibility: visible; }','.msg-box.msg-user .msg { position: relative; }','.msg-box.msg-user .msg > .uc-content { display: block; overflow: visible; }','.msg-box.msg-user .msg > .uc-content.uc-collapsed { max-height: 1000px; overflow: hidden; }','.msg-box.msg-user .msg > .uc-toggle { display: none; margin-top: 8px; text-align: center; cursor: pointer; user-select: none; }','.msg-box.msg-user .msg > .uc-toggle.visible { display: block; }','.msg-box.msg-user .msg > .uc-toggle img { width: var(--uc-toggle-icon-size, 26px); height: var(--uc-toggle-icon-size, 26px); opacity: .8; }','.msg-box.msg-user .msg > .uc-toggle:hover img { opacity: 1; }','.msg-box.msg-user .msg .msg-copy-btn { position: absolute; top: 2px; right: 0px; z-index: 3;',' opacity: 0; pointer-events: none; transition: opacity .15s ease, transform .15s ease, background-color .15s ease, border-color .15s ease;',' border-radius: 6px; padding: 4px; line-height: 0; border: 1px solid transparent; background: transparent; }','.msg-box.msg-user:hover .msg .msg-copy-btn, .msg-box.msg-user .msg:focus-within .msg-copy-btn { opacity: 1; pointer-events: auto; }','.msg-box.msg-user .msg .msg-copy-btn:hover { transform: scale(1.06); background: var(--copy-btn-bg-hover, rgba(0,0,0,.86)); border-color: var(--copy-btn-border, rgba(0,0,0,.08)); }','.msg-box.msg-user .msg .msg-copy-btn.copied { background: var(--copy-btn-bg-copied, rgba(150,150,150,.12)); border-color: var(--copy-btn-border-copied, rgba(150,150,150,.35)); animation: msg-copy-pop .25s ease; }','.msg-box.msg-user .msg .msg-copy-btn img { display: block; width: 18px; height: 18px; }','.code-wrapper .code-header-action.code-header-copy,','.code-wrapper .code-header-action.code-header-collapse { display: inline-flex; align-items: center; border-radius: 6px; padding: 2px; line-height: 0; border: 1px solid transparent; transition: transform .15s ease, background-color .15s ease, border-color .15s ease; }','.code-wrapper .code-header-action.code-header-copy:hover,','.code-wrapper .code-header-action.code-header-collapse:hover { transform: scale(1.06); background: var(--copy-btn-bg-hover, rgba(0,0,0,.76)); border-color: var(--copy-btn-border, rgba(0,0,0,.08)); }','.code-wrapper .code-header-action.copied { background: var(--copy-btn-bg-copied, rgba(150,150,150,.12)); border-color: var(--copy-btn-border-copied, rgba(150,150,150,.35)); animation: msg-copy-pop .25s ease; }','@keyframes msg-copy-pop { 0%{ transform: scale(1); } 60%{ transform: scale(1.1); } 100%{ transform: scale(1); } }'].join('\n');document.head.appendChild(style);}
806
+ ensureStickyHeaderStyle(){let style=document.getElementById('code-sticky-style');if(style)return;style=document.createElement('style');style.id='code-sticky-style';style.textContent=['.code-wrapper { position: relative; }','.code-wrapper .code-header-wrapper { position: sticky; top: var(--code-header-sticky-top, -2px); z-index: 2; box-shadow: 0 1px 0 rgba(0,0,0,.06); }','.code-wrapper pre { overflow: visible; margin-top: 0; }','.code-wrapper pre code { display: block; white-space: pre; max-height: 100dvh; overflow: auto;',' overscroll-behavior: contain; -webkit-overflow-scrolling: touch; overflow-anchor: none; scrollbar-gutter: stable both-edges; scroll-behavior: auto; }','#_loader_.hidden { display: none !important; visibility: hidden !important; }','#_loader_.visible { display: block; visibility: visible; }','.msg-box.msg-user .msg { position: relative; }','.msg-box.msg-user .msg > .uc-content { display: block; overflow: visible; }','.msg-box.msg-user .msg > .uc-content.uc-collapsed { max-height: 1000px; overflow: hidden; }','.msg-box.msg-user .msg > .uc-toggle { display: none; margin-top: 8px; text-align: center; cursor: pointer; user-select: none; }','.msg-box.msg-user .msg > .uc-toggle.visible { display: block; }','.msg-box.msg-user .msg > .uc-toggle img { width: var(--uc-toggle-icon-size, 26px); height: var(--uc-toggle-icon-size, 26px); opacity: .8; }','.msg-box.msg-user .msg > .uc-toggle:hover img { opacity: 1; }','.msg-box.msg-user .msg .msg-copy-btn { position: absolute; top: 2px; right: 0px; z-index: 3;',' opacity: 0; pointer-events: none; transition: opacity .15s ease, transform .15s ease, background-color .15s ease, border-color .15s ease;',' border-radius: 6px; padding: 4px; line-height: 0; border: 1px solid transparent; background: transparent; }','.msg-box.msg-user .msg:hover .msg-copy-btn, .msg-box.msg-user .msg:focus-within .msg-copy-btn { opacity: 1; pointer-events: auto; }','.msg-box.msg-user .msg .msg-copy-btn:hover { transform: scale(1.06); background: var(--copy-btn-bg-hover, rgba(0,0,0,.86)); border-color: var(--copy-btn-border, rgba(0,0,0,.08)); }','.msg-box.msg-user .msg .msg-copy-btn.copied { background: var(--copy-btn-bg-copied, rgba(150,150,150,.12)); border-color: var(--copy-btn-border-copied, rgba(150,150,150,.35)); animation: msg-copy-pop .25s ease; }','.msg-box.msg-user .msg .msg-copy-btn img { display: block; width: 18px; height: 18px; }','.code-wrapper .code-header-action.code-header-copy,','.code-wrapper .code-header-action.code-header-collapse { display: inline-flex; align-items: center; border-radius: 6px; padding: 2px; line-height: 0; border: 1px solid transparent; transition: transform .15s ease, background-color .15s ease, border-color .15s ease; }','.code-wrapper .code-header-action.code-header-copy:hover,','.code-wrapper .code-header-action.code-header-collapse:hover { transform: scale(1.06); background: var(--copy-btn-bg-hover, rgba(0,0,0,.76)); border-color: var(--copy-btn-border, rgba(0,0,0,.08)); }','.code-wrapper .code-header-action.copied { background: var(--copy-btn-bg-copied, rgba(150,150,150,.12)); border-color: var(--copy-btn-border-copied, rgba(150,150,150,.35)); animation: msg-copy-pop .25s ease; }','@keyframes msg-copy-pop { 0%{ transform: scale(1); } 60%{ transform: scale(1.1); } 100%{ transform: scale(1); } }'].join('\n');document.head.appendChild(style);}
807
807
  enableEditIcons(){document.body&&document.body.classList.add('display-edit-icons');}
808
808
  disableEditIcons(){document.body&&document.body.classList.remove('display-edit-icons');}
809
809
  enableTimestamp(){document.body&&document.body.classList.add('display-timestamp');}
@@ -833,6 +833,7 @@ menu.tools.interpreter = Python-Code-Interpreter
833
833
  menu.tools.media.player = Mediaplayer
834
834
  menu.tools.text.editor = Texteditor
835
835
  menu.tools.translator = Übersetzer
836
+ menu.tools.web_browser = Webbrowser (Chromium)
836
837
  menu.tray.notepad = Notepad öffnen...
837
838
  menu.tray.scheduled = Geplante Aufträge
838
839
  menu.tray.screenshot = Fragen mit Screenshot...
@@ -1107,8 +1108,8 @@ settings.api_key.perplexity.desc = Erforderlich für die Perplexity API.
1107
1108
  settings.api_key.xai = xAI API-SCHLÜSSEL
1108
1109
  settings.api_key.xai.desc = Erforderlich für die xAI API und Grok-Modelle.
1109
1110
  settings.api_proxy = Proxy verwenden
1110
- settings.api_proxy.enabled = Proxy-Adresse
1111
1111
  settings.api_proxy.desc = Optional, Proxy für API SDK, z.B. http://proxy.example.com oder socks5://user:pass@host:port
1112
+ settings.api_proxy.enabled = Proxy-Adresse
1112
1113
  settings.api_proxy.enabled.desc = Aktivieren Sie diese Option, um einen Proxy für Verbindungen zu APIs zu verwenden
1113
1114
  settings.api_use_responses = Verwenden Sie die Responses API im Chat-Modus
1114
1115
  settings.api_use_responses.desc = Verwenden Sie die Responses API anstelle der ChatCompletions API im Chat-Modus
@@ -1182,6 +1183,8 @@ settings.ctx.search_content = Suche auch im Inhalt der Gespräche, nicht nur in
1182
1183
  settings.ctx.search.desc = Aktiviere die Suche auch im Inhalt der Kontextelemente
1183
1184
  settings.ctx.sources = Zeige Llama-Indexquellen
1184
1185
  settings.ctx.sources.desc = Falls aktiviert, werden die genutzten Quellen in der Antwort angezeigt (falls verfügbar, funktioniert nicht im gestreamten Chat)
1186
+ settings.ctx.urls.internal = Öffne URLs im integrierten Browser
1187
+ settings.ctx.urls.internal.desc = Aktivieren Sie diese Option, um alle URLs im integrierten Browser (Chromium) und nicht in einem externen Browser zu öffnen.
1185
1188
  settings.ctx.use_extra = Verwenden Sie zusätzlichen Kontextoutput
1186
1189
  settings.ctx.use_extra.desc = Wenn aktiviert, wird die einfache Textausgabe (falls verfügbar) aus den Befehlsausgaben zusätzlich zur JSON-Ausgabe angezeigt.
1187
1190
  settings.debug.show_menu = Debug-Menü anzeigen
@@ -1546,6 +1549,7 @@ tool.indexer.tab.web.loader = Datenlader
1546
1549
  tool.indexer.tab.web.source = Datenquelle
1547
1550
  tool.indexer.tab.web.tip = Wählen Sie einen Datenlader aus und definieren Sie die Laderparameter, um externe Daten aus dem Web einzubetten.
1548
1551
  tool.indexer.title = Indexierer
1552
+ tool.web_browser.security.footer = SICHERHEITSHINWEIS: Zu Ihrem Schutz vermeiden Sie die Verwendung des integrierten Browsers für sensible oder kritische Aufgaben. Er ist nur für grundlegende Nutzung gedacht.
1549
1553
  translator.btn.left = Übersetzen >>
1550
1554
  translator.btn.right = << Übersetzen
1551
1555
  translator.clear.confirm = Übersetzerausgabe löschen (beide Spalten)?
@@ -843,6 +843,7 @@ menu.tools.interpreter = Python Code Interpreter
843
843
  menu.tools.media.player = Media Player
844
844
  menu.tools.text.editor = Text Editor
845
845
  menu.tools.translator = Translator
846
+ menu.tools.web_browser = Web Browser (Chromium)
846
847
  menu.tray.notepad = Open Notepad...
847
848
  menu.tray.scheduled = Scheduled tasks
848
849
  menu.tray.screenshot = Ask with screenshot...
@@ -1149,8 +1150,8 @@ settings.api_native_google.use_vertex.desc = Enable to use VertexAI in Google Ge
1149
1150
  settings.api_native_xai = Use native API SDK
1150
1151
  settings.api_native_xai.desc = Use native xAI SDK instead of compatible OpenAI client
1151
1152
  settings.api_proxy = Proxy address
1152
- settings.api_proxy.enabled = Use proxy
1153
1153
  settings.api_proxy.desc = Optional, proxy for API SDKs, e.g. http://proxy.example.com or socks5://user:pass@host:port
1154
+ settings.api_proxy.enabled = Use proxy
1154
1155
  settings.api_proxy.enabled.desc = Enable this option to use a proxy for connections to APIs
1155
1156
  settings.api_use_responses = Use Responses API in Chat mode
1156
1157
  settings.api_use_responses.desc = Use Responses API instead of ChatCompletions API in Chat mode
@@ -1224,6 +1225,8 @@ settings.ctx.search_content = Search also in conversation content, not only in t
1224
1225
  settings.ctx.search.desc = Enable search also in context items' content
1225
1226
  settings.ctx.sources = Show LlamaIndex sources
1226
1227
  settings.ctx.sources.desc = If enabled, sources used will be displayed in the response (if available, it will not work in streamed chat)
1228
+ settings.ctx.urls.internal = Open URLs in built-in browser
1229
+ settings.ctx.urls.internal.desc = Enable this option to open all URLs in the built-in browser (Chromium) instead of an external browser.
1227
1230
  settings.ctx.use_extra = Use extra context output
1228
1231
  settings.ctx.use_extra.desc = If enabled, plain text output (if available) from command results will be displayed alongside the JSON output.
1229
1232
  settings.debug.show_menu = Show debug menu
@@ -1622,6 +1625,7 @@ tool.indexer.tab.web.loader = Data type
1622
1625
  tool.indexer.tab.web.source = Data source
1623
1626
  tool.indexer.tab.web.tip = Select a data loader and define the loader parameters to embed external data from the web.
1624
1627
  tool.indexer.title = Indexer
1628
+ tool.web_browser.security.footer = SECURITY NOTICE: For your protection, avoid using the built-in browser for sensitive or critical tasks. It is intended for basic usage only.
1625
1629
  translator.btn.left = Translate >>
1626
1630
  translator.btn.right = << Translate
1627
1631
  translator.clear.confirm = Clear translator output (both columns)?
@@ -834,6 +834,7 @@ menu.tools.interpreter = Intérprete de código Python
834
834
  menu.tools.media.player = Reproductor de medios
835
835
  menu.tools.text.editor = Editor de texto
836
836
  menu.tools.translator = Traductor
837
+ menu.tools.web_browser = Navegador Web (Chromium)
837
838
  menu.tray.notepad = Abrir Bloc de notas...
838
839
  menu.tray.scheduled = Trabajos programados
839
840
  menu.tray.screenshot = Preguntar con captura de pantalla...
@@ -1108,8 +1109,8 @@ settings.api_key.perplexity.desc = Requerido para la API Perplexity.
1108
1109
  settings.api_key.xai = CLAVE API xAI
1109
1110
  settings.api_key.xai.desc = Requerido para la API xAI y modelos Grok.
1110
1111
  settings.api_proxy = Dirección proxy
1111
- settings.api_proxy.enabled = Usar proxy
1112
1112
  settings.api_proxy.desc = Opcional, proxy para API SDK, por ej. http://proxy.example.com o socks5://user:pass@host:port
1113
+ settings.api_proxy.enabled = Usar proxy
1113
1114
  settings.api_proxy.enabled.desc = Habilita esta opción para usar un proxy para las conexiones a las API
1114
1115
  settings.api_use_responses = Usar API de Respuestas en modo Chat
1115
1116
  settings.api_use_responses.desc = Usar API de Respuestas en lugar de ChatCompletions API en modo Chat
@@ -1183,6 +1184,8 @@ settings.ctx.search_content = Buscar también en el contenido de las conversacio
1183
1184
  settings.ctx.search.desc = Habilitar la búsqueda también en el contenido de los elementos de contexto
1184
1185
  settings.ctx.sources = Mostrar fuentes del índice Llama
1185
1186
  settings.ctx.sources.desc = Si está habilitado, las fuentes utilizadas se mostrarán en la respuesta (si están disponibles, no funcionará en el chat en vivo)
1187
+ settings.ctx.urls.internal = Abrir las URL en el navegador integrado
1188
+ settings.ctx.urls.internal.desc = Active esta opción para abrir todas las URL en el navegador integrado (Chromium) en lugar de un navegador externo.
1186
1189
  settings.ctx.use_extra = Usar salida de contexto extra
1187
1190
  settings.ctx.use_extra.desc = Si está habilitado, la salida de texto sin formato (si está disponible) de los resultados de los comandos se mostrará junto con la salida JSON.
1188
1191
  settings.debug.show_menu = Mostrar menú de depuración
@@ -1547,6 +1550,7 @@ tool.indexer.tab.web.loader = Cargador
1547
1550
  tool.indexer.tab.web.source = Fuente de datos
1548
1551
  tool.indexer.tab.web.tip = Seleccione un cargador de datos y defina los parámetros del cargador para incrustar datos externos de la web.
1549
1552
  tool.indexer.title = Indexador
1553
+ tool.web_browser.security.footer = AVISO DE SEGURIDAD: Para su protección, evite usar el navegador integrado para tareas sensibles o críticas. Está diseñado solo para uso básico.
1550
1554
  translator.btn.left = Traducir >>
1551
1555
  translator.btn.right = << Traducir
1552
1556
  translator.clear.confirm = Borrar salida del traductor (ambas columnas)?