pygpt-net 2.4.37__py3-none-any.whl → 2.4.42__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 (340) hide show
  1. CHANGELOG.md +37 -0
  2. README.md +176 -182
  3. pygpt_net/CHANGELOG.txt +37 -0
  4. pygpt_net/__init__.py +3 -3
  5. pygpt_net/app.py +3 -1
  6. pygpt_net/controller/__init__.py +7 -3
  7. pygpt_net/controller/access/control.py +1 -1
  8. pygpt_net/controller/access/voice.py +11 -5
  9. pygpt_net/controller/agent/experts.py +11 -6
  10. pygpt_net/controller/agent/legacy.py +8 -6
  11. pygpt_net/controller/agent/llama.py +4 -2
  12. pygpt_net/controller/assistant/__init__.py +9 -4
  13. pygpt_net/controller/assistant/batch.py +38 -21
  14. pygpt_net/controller/assistant/editor.py +7 -6
  15. pygpt_net/controller/assistant/files.py +23 -7
  16. pygpt_net/controller/assistant/store.py +20 -7
  17. pygpt_net/controller/assistant/threads.py +34 -8
  18. pygpt_net/controller/attachment.py +29 -10
  19. pygpt_net/controller/audio/__init__.py +26 -5
  20. pygpt_net/controller/calendar/__init__.py +23 -4
  21. pygpt_net/controller/calendar/note.py +57 -11
  22. pygpt_net/controller/camera.py +4 -12
  23. pygpt_net/controller/chat/__init__.py +5 -3
  24. pygpt_net/controller/chat/attachment.py +34 -7
  25. pygpt_net/controller/chat/audio.py +2 -2
  26. pygpt_net/controller/chat/command.py +4 -2
  27. pygpt_net/controller/chat/common.py +11 -4
  28. pygpt_net/controller/chat/files.py +10 -3
  29. pygpt_net/controller/chat/image.py +17 -5
  30. pygpt_net/controller/chat/input.py +10 -7
  31. pygpt_net/controller/chat/output.py +21 -6
  32. pygpt_net/controller/chat/render.py +100 -21
  33. pygpt_net/controller/chat/response.py +34 -7
  34. pygpt_net/controller/chat/stream.py +4 -2
  35. pygpt_net/controller/chat/text.py +6 -4
  36. pygpt_net/controller/command.py +11 -3
  37. pygpt_net/controller/config/__init__.py +34 -6
  38. pygpt_net/controller/config/field/checkbox.py +7 -4
  39. pygpt_net/controller/config/field/cmd.py +7 -5
  40. pygpt_net/controller/config/field/combo.py +14 -6
  41. pygpt_net/controller/config/field/dictionary.py +14 -11
  42. pygpt_net/controller/config/field/input.py +9 -6
  43. pygpt_net/controller/config/field/slider.py +11 -8
  44. pygpt_net/controller/config/field/textarea.py +8 -5
  45. pygpt_net/controller/config/placeholder.py +66 -21
  46. pygpt_net/controller/ctx/__init__.py +138 -49
  47. pygpt_net/controller/ctx/common.py +15 -4
  48. pygpt_net/controller/ctx/extra.py +11 -3
  49. pygpt_net/controller/ctx/summarizer.py +24 -5
  50. pygpt_net/controller/debug/__init__.py +27 -6
  51. pygpt_net/controller/dialogs/confirm.py +34 -7
  52. pygpt_net/controller/dialogs/debug.py +4 -2
  53. pygpt_net/controller/dialogs/info.py +7 -2
  54. pygpt_net/controller/files.py +48 -10
  55. pygpt_net/controller/finder.py +11 -5
  56. pygpt_net/controller/idx/__init__.py +10 -3
  57. pygpt_net/controller/idx/common.py +4 -2
  58. pygpt_net/controller/idx/indexer.py +25 -17
  59. pygpt_net/controller/idx/settings.py +9 -3
  60. pygpt_net/controller/kernel/__init__.py +34 -8
  61. pygpt_net/controller/kernel/reply.py +12 -3
  62. pygpt_net/controller/kernel/stack.py +5 -3
  63. pygpt_net/controller/lang/custom.py +2 -7
  64. pygpt_net/controller/lang/mapping.py +5 -3
  65. pygpt_net/controller/layout.py +2 -2
  66. pygpt_net/controller/mode.py +16 -4
  67. pygpt_net/controller/model/__init__.py +14 -3
  68. pygpt_net/controller/model/editor.py +8 -3
  69. pygpt_net/controller/notepad.py +26 -12
  70. pygpt_net/controller/painter/capture.py +23 -4
  71. pygpt_net/controller/painter/common.py +9 -7
  72. pygpt_net/controller/plugins/__init__.py +19 -5
  73. pygpt_net/controller/plugins/presets.py +15 -6
  74. pygpt_net/controller/plugins/settings.py +9 -3
  75. pygpt_net/controller/presets/__init__.py +55 -16
  76. pygpt_net/controller/presets/editor.py +26 -10
  77. pygpt_net/controller/settings/__init__.py +3 -2
  78. pygpt_net/controller/settings/editor.py +29 -7
  79. pygpt_net/controller/settings/profile.py +22 -5
  80. pygpt_net/controller/theme/__init__.py +54 -12
  81. pygpt_net/controller/theme/common.py +24 -2
  82. pygpt_net/controller/theme/markdown.py +32 -16
  83. pygpt_net/controller/theme/menu.py +26 -5
  84. pygpt_net/controller/theme/nodes.py +2 -5
  85. pygpt_net/controller/tools/__init__.py +40 -2
  86. pygpt_net/controller/ui/__init__.py +4 -6
  87. pygpt_net/controller/ui/mode.py +16 -21
  88. pygpt_net/controller/ui/tabs.py +363 -65
  89. pygpt_net/core/access/actions.py +6 -4
  90. pygpt_net/core/access/shortcuts.py +4 -3
  91. pygpt_net/core/access/voice.py +6 -5
  92. pygpt_net/core/agents/legacy.py +4 -2
  93. pygpt_net/core/agents/memory.py +7 -2
  94. pygpt_net/core/agents/observer/evaluation.py +15 -7
  95. pygpt_net/core/agents/provider.py +9 -4
  96. pygpt_net/core/agents/runner.py +61 -15
  97. pygpt_net/core/agents/tools.py +23 -5
  98. pygpt_net/core/assistants/__init__.py +6 -4
  99. pygpt_net/core/assistants/files.py +35 -12
  100. pygpt_net/core/assistants/store.py +20 -10
  101. pygpt_net/core/attachments/__init__.py +54 -15
  102. pygpt_net/core/attachments/context.py +92 -29
  103. pygpt_net/core/audio/__init__.py +74 -3
  104. pygpt_net/core/audio/context.py +7 -2
  105. pygpt_net/core/audio/whisper.py +37 -0
  106. pygpt_net/core/bridge/__init__.py +22 -6
  107. pygpt_net/core/bridge/context.py +5 -3
  108. pygpt_net/core/bridge/worker.py +2 -2
  109. pygpt_net/core/calendar/__init__.py +57 -11
  110. pygpt_net/core/chain/__init__.py +8 -2
  111. pygpt_net/core/chain/chat.py +10 -8
  112. pygpt_net/core/chain/completion.py +10 -7
  113. pygpt_net/core/command.py +62 -17
  114. pygpt_net/core/ctx/__init__.py +260 -58
  115. pygpt_net/core/ctx/bag.py +25 -4
  116. pygpt_net/core/ctx/container.py +28 -17
  117. pygpt_net/core/ctx/idx.py +45 -8
  118. pygpt_net/core/ctx/output.py +95 -74
  119. pygpt_net/core/ctx/reply.py +5 -2
  120. pygpt_net/core/db/__init__.py +8 -7
  121. pygpt_net/core/db/viewer.py +17 -11
  122. pygpt_net/core/debug/__init__.py +10 -9
  123. pygpt_net/core/debug/events.py +22 -10
  124. pygpt_net/core/debug/tabs.py +9 -3
  125. pygpt_net/core/docker/__init__.py +11 -5
  126. pygpt_net/core/docker/builder.py +11 -3
  127. pygpt_net/core/events/app.py +5 -3
  128. pygpt_net/core/events/base.py +11 -5
  129. pygpt_net/core/events/control.py +5 -3
  130. pygpt_net/core/events/event.py +17 -7
  131. pygpt_net/core/events/kernel.py +5 -3
  132. pygpt_net/core/events/render.py +5 -3
  133. pygpt_net/core/experts/__init__.py +5 -4
  134. pygpt_net/core/filesystem/__init__.py +52 -34
  135. pygpt_net/core/filesystem/actions.py +8 -5
  136. pygpt_net/core/filesystem/editor.py +13 -3
  137. pygpt_net/core/filesystem/types.py +12 -7
  138. pygpt_net/core/filesystem/url.py +7 -3
  139. pygpt_net/core/history.py +3 -2
  140. pygpt_net/core/idx/__init__.py +48 -27
  141. pygpt_net/core/idx/chat.py +51 -17
  142. pygpt_net/core/idx/context.py +6 -2
  143. pygpt_net/core/idx/indexing.py +107 -42
  144. pygpt_net/core/idx/llm.py +11 -3
  145. pygpt_net/core/idx/metadata.py +13 -3
  146. pygpt_net/core/idx/types/ctx.py +32 -6
  147. pygpt_net/core/idx/types/external.py +41 -7
  148. pygpt_net/core/idx/types/files.py +31 -6
  149. pygpt_net/core/image.py +15 -4
  150. pygpt_net/core/installer.py +2 -4
  151. pygpt_net/core/llm/__init__.py +13 -3
  152. pygpt_net/core/locale.py +34 -8
  153. pygpt_net/core/models.py +63 -17
  154. pygpt_net/core/modes.py +11 -13
  155. pygpt_net/core/notepad.py +10 -5
  156. pygpt_net/core/plugins.py +31 -19
  157. pygpt_net/core/presets.py +37 -17
  158. pygpt_net/core/profile.py +21 -7
  159. pygpt_net/core/prompt/__init__.py +10 -3
  160. pygpt_net/core/prompt/custom.py +7 -6
  161. pygpt_net/core/prompt/template.py +9 -3
  162. pygpt_net/core/render/base.py +117 -22
  163. pygpt_net/core/render/markdown/body.py +27 -7
  164. pygpt_net/core/render/markdown/renderer.py +119 -22
  165. pygpt_net/core/render/plain/body.py +22 -5
  166. pygpt_net/core/render/plain/renderer.py +97 -21
  167. pygpt_net/core/render/web/body.py +75 -25
  168. pygpt_net/core/render/web/parser.py +3 -1
  169. pygpt_net/core/render/web/renderer.py +313 -63
  170. pygpt_net/core/settings.py +10 -5
  171. pygpt_net/core/tabs/__init__.py +290 -103
  172. pygpt_net/core/tabs/tab.py +26 -5
  173. pygpt_net/core/tokens.py +47 -12
  174. pygpt_net/core/updater/__init__.py +20 -7
  175. pygpt_net/core/vision/analyzer.py +29 -6
  176. pygpt_net/core/{web.py → web/__init__.py} +29 -7
  177. pygpt_net/core/web/helpers.py +237 -0
  178. pygpt_net/data/config/config.json +15 -4
  179. pygpt_net/data/config/models.json +3 -3
  180. pygpt_net/data/config/modes.json +3 -3
  181. pygpt_net/data/config/settings.json +55 -10
  182. pygpt_net/data/config/settings_section.json +3 -0
  183. pygpt_net/data/css/style.light.css +1 -0
  184. pygpt_net/data/css/{web.css → web-blocks.css} +162 -133
  185. pygpt_net/data/css/{web.light.css → web-blocks.light.css} +7 -0
  186. pygpt_net/data/css/web-chatgpt.css +350 -0
  187. pygpt_net/data/css/web-chatgpt.dark.css +64 -0
  188. pygpt_net/data/css/web-chatgpt.light.css +75 -0
  189. pygpt_net/data/css/web-chatgpt_wide.css +350 -0
  190. pygpt_net/data/css/web-chatgpt_wide.dark.css +64 -0
  191. pygpt_net/data/css/web-chatgpt_wide.light.css +75 -0
  192. pygpt_net/data/icons/split_screen.svg +1 -0
  193. pygpt_net/data/locale/locale.de.ini +12 -0
  194. pygpt_net/data/locale/locale.en.ini +18 -2
  195. pygpt_net/data/locale/locale.es.ini +12 -0
  196. pygpt_net/data/locale/locale.fr.ini +12 -0
  197. pygpt_net/data/locale/locale.it.ini +12 -0
  198. pygpt_net/data/locale/locale.pl.ini +12 -0
  199. pygpt_net/data/locale/locale.uk.ini +12 -0
  200. pygpt_net/data/locale/locale.zh.ini +12 -0
  201. pygpt_net/data/locale/plugin.cmd_web.de.ini +2 -0
  202. pygpt_net/data/locale/plugin.cmd_web.en.ini +22 -10
  203. pygpt_net/data/locale/plugin.cmd_web.es.ini +2 -0
  204. pygpt_net/data/locale/plugin.cmd_web.fr.ini +2 -0
  205. pygpt_net/data/locale/plugin.cmd_web.it.ini +2 -0
  206. pygpt_net/data/locale/plugin.cmd_web.pl.ini +2 -0
  207. pygpt_net/data/locale/plugin.cmd_web.uk.ini +2 -0
  208. pygpt_net/data/locale/plugin.cmd_web.zh.ini +2 -0
  209. pygpt_net/data/locale/plugin.mailer.en.ini +21 -0
  210. pygpt_net/icons.qrc +1 -0
  211. pygpt_net/icons_rc.py +165 -136
  212. pygpt_net/item/ctx.py +58 -25
  213. pygpt_net/plugin/agent/__init__.py +7 -2
  214. pygpt_net/plugin/audio_input/simple.py +21 -5
  215. pygpt_net/plugin/audio_output/__init__.py +9 -1
  216. pygpt_net/plugin/base/config.py +4 -2
  217. pygpt_net/plugin/base/plugin.py +75 -23
  218. pygpt_net/plugin/base/worker.py +42 -11
  219. pygpt_net/plugin/cmd_code_interpreter/__init__.py +39 -37
  220. pygpt_net/plugin/cmd_code_interpreter/runner.py +25 -12
  221. pygpt_net/plugin/cmd_history/config.py +2 -2
  222. pygpt_net/plugin/cmd_web/__init__.py +48 -9
  223. pygpt_net/plugin/cmd_web/config.py +135 -41
  224. pygpt_net/plugin/cmd_web/websearch.py +74 -33
  225. pygpt_net/plugin/cmd_web/worker.py +142 -13
  226. pygpt_net/plugin/idx_llama_index/config.py +3 -3
  227. pygpt_net/plugin/mailer/__init__.py +123 -0
  228. pygpt_net/plugin/mailer/config.py +149 -0
  229. pygpt_net/plugin/mailer/runner.py +285 -0
  230. pygpt_net/plugin/mailer/worker.py +123 -0
  231. pygpt_net/provider/agents/base.py +5 -2
  232. pygpt_net/provider/agents/openai.py +4 -2
  233. pygpt_net/provider/agents/openai_assistant.py +4 -2
  234. pygpt_net/provider/agents/planner.py +4 -2
  235. pygpt_net/provider/agents/react.py +4 -2
  236. pygpt_net/provider/audio_output/openai_tts.py +5 -11
  237. pygpt_net/provider/core/assistant/base.py +5 -3
  238. pygpt_net/provider/core/assistant/json_file.py +8 -5
  239. pygpt_net/provider/core/assistant_file/base.py +4 -3
  240. pygpt_net/provider/core/assistant_file/db_sqlite/__init__.py +4 -3
  241. pygpt_net/provider/core/assistant_file/db_sqlite/storage.py +3 -2
  242. pygpt_net/provider/core/assistant_store/base.py +6 -4
  243. pygpt_net/provider/core/assistant_store/db_sqlite/__init__.py +5 -4
  244. pygpt_net/provider/core/assistant_store/db_sqlite/storage.py +5 -3
  245. pygpt_net/provider/core/attachment/base.py +5 -3
  246. pygpt_net/provider/core/attachment/json_file.py +4 -3
  247. pygpt_net/provider/core/calendar/base.py +5 -3
  248. pygpt_net/provider/core/calendar/db_sqlite/__init__.py +6 -5
  249. pygpt_net/provider/core/calendar/db_sqlite/storage.py +5 -4
  250. pygpt_net/provider/core/config/base.py +8 -6
  251. pygpt_net/provider/core/config/json_file.py +9 -7
  252. pygpt_net/provider/core/config/patch.py +43 -1
  253. pygpt_net/provider/core/ctx/base.py +30 -25
  254. pygpt_net/provider/core/ctx/db_sqlite/__init__.py +59 -34
  255. pygpt_net/provider/core/ctx/db_sqlite/storage.py +62 -30
  256. pygpt_net/provider/core/ctx/db_sqlite/utils.py +11 -9
  257. pygpt_net/provider/core/index/base.py +129 -23
  258. pygpt_net/provider/core/index/db_sqlite/__init__.py +130 -23
  259. pygpt_net/provider/core/index/db_sqlite/storage.py +130 -23
  260. pygpt_net/provider/core/index/db_sqlite/utils.py +4 -2
  261. pygpt_net/provider/core/mode/base.py +5 -3
  262. pygpt_net/provider/core/mode/json_file.py +7 -6
  263. pygpt_net/provider/core/model/base.py +6 -4
  264. pygpt_net/provider/core/model/json_file.py +9 -7
  265. pygpt_net/provider/core/notepad/base.py +5 -3
  266. pygpt_net/provider/core/notepad/db_sqlite/__init__.py +5 -4
  267. pygpt_net/provider/core/notepad/db_sqlite/storage.py +4 -3
  268. pygpt_net/provider/core/plugin_preset/base.py +4 -2
  269. pygpt_net/provider/core/plugin_preset/json_file.py +5 -3
  270. pygpt_net/provider/core/preset/base.py +6 -4
  271. pygpt_net/provider/core/preset/json_file.py +9 -9
  272. pygpt_net/provider/core/prompt/base.py +6 -3
  273. pygpt_net/provider/core/prompt/json_file.py +11 -6
  274. pygpt_net/provider/gpt/assistants.py +21 -11
  275. pygpt_net/provider/gpt/audio.py +6 -5
  276. pygpt_net/provider/gpt/chat.py +10 -7
  277. pygpt_net/provider/gpt/completion.py +11 -5
  278. pygpt_net/provider/gpt/image.py +9 -2
  279. pygpt_net/provider/gpt/store.py +53 -18
  280. pygpt_net/provider/gpt/vision.py +17 -11
  281. pygpt_net/provider/llms/anthropic.py +7 -2
  282. pygpt_net/provider/llms/azure_openai.py +26 -5
  283. pygpt_net/provider/llms/base.py +47 -9
  284. pygpt_net/provider/llms/google.py +7 -2
  285. pygpt_net/provider/llms/hugging_face.py +13 -3
  286. pygpt_net/provider/llms/hugging_face_api.py +18 -4
  287. pygpt_net/provider/llms/local.py +7 -2
  288. pygpt_net/provider/llms/ollama.py +30 -6
  289. pygpt_net/provider/llms/openai.py +32 -6
  290. pygpt_net/provider/vector_stores/__init__.py +45 -14
  291. pygpt_net/provider/vector_stores/base.py +35 -8
  292. pygpt_net/provider/vector_stores/chroma.py +13 -3
  293. pygpt_net/provider/vector_stores/ctx_attachment.py +31 -12
  294. pygpt_net/provider/vector_stores/elasticsearch.py +12 -3
  295. pygpt_net/provider/vector_stores/pinecode.py +12 -3
  296. pygpt_net/provider/vector_stores/redis.py +12 -3
  297. pygpt_net/provider/vector_stores/simple.py +12 -3
  298. pygpt_net/provider/vector_stores/temp.py +16 -4
  299. pygpt_net/provider/web/base.py +10 -3
  300. pygpt_net/provider/web/google_custom_search.py +9 -3
  301. pygpt_net/provider/web/microsoft_bing.py +9 -3
  302. pygpt_net/tools/__init__.py +20 -4
  303. pygpt_net/tools/audio_transcriber/__init__.py +4 -3
  304. pygpt_net/tools/base.py +28 -7
  305. pygpt_net/tools/code_interpreter/__init__.py +177 -77
  306. pygpt_net/tools/code_interpreter/ui/dialogs.py +21 -103
  307. pygpt_net/tools/code_interpreter/ui/widgets.py +284 -9
  308. pygpt_net/tools/html_canvas/__init__.py +81 -25
  309. pygpt_net/tools/html_canvas/ui/dialogs.py +46 -62
  310. pygpt_net/tools/html_canvas/ui/widgets.py +96 -3
  311. pygpt_net/tools/image_viewer/__init__.py +10 -4
  312. pygpt_net/tools/indexer/__init__.py +8 -7
  313. pygpt_net/tools/media_player/__init__.py +4 -3
  314. pygpt_net/tools/text_editor/__init__.py +36 -10
  315. pygpt_net/ui/base/context_menu.py +2 -2
  316. pygpt_net/ui/layout/chat/input.py +10 -18
  317. pygpt_net/ui/layout/chat/output.py +27 -45
  318. pygpt_net/ui/layout/ctx/ctx_list.py +13 -4
  319. pygpt_net/ui/layout/toolbox/footer.py +18 -2
  320. pygpt_net/ui/main.py +2 -2
  321. pygpt_net/ui/menu/audio.py +12 -1
  322. pygpt_net/ui/menu/config.py +7 -11
  323. pygpt_net/ui/menu/debug.py +11 -1
  324. pygpt_net/ui/menu/theme.py +9 -2
  325. pygpt_net/ui/widget/filesystem/explorer.py +2 -2
  326. pygpt_net/ui/widget/lists/context.py +27 -5
  327. pygpt_net/ui/widget/tabs/Input.py +2 -2
  328. pygpt_net/ui/widget/tabs/body.py +2 -1
  329. pygpt_net/ui/widget/tabs/layout.py +195 -0
  330. pygpt_net/ui/widget/tabs/output.py +218 -55
  331. pygpt_net/ui/widget/textarea/html.py +11 -1
  332. pygpt_net/ui/widget/textarea/output.py +10 -1
  333. pygpt_net/ui/widget/textarea/search_input.py +4 -1
  334. pygpt_net/ui/widget/textarea/web.py +49 -9
  335. {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.42.dist-info}/METADATA +177 -183
  336. {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.42.dist-info}/RECORD +340 -325
  337. /pygpt_net/data/css/{web.dark.css → web-blocks.dark.css} +0 -0
  338. {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.42.dist-info}/LICENSE +0 -0
  339. {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.42.dist-info}/WHEEL +0 -0
  340. {pygpt_net-2.4.37.dist-info → pygpt_net-2.4.42.dist-info}/entry_points.txt +0 -0
@@ -6,14 +6,14 @@
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.11.23 21:00:00 #
9
+ # Updated Date: 2024.12.14 08:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import os
13
13
  import shutil
14
14
 
15
- from datetime import datetime
16
15
  from pathlib import PurePath
16
+ from typing import Tuple, Any, Union, List
17
17
  from uuid import uuid4
18
18
 
19
19
  from PySide6.QtCore import QUrl
@@ -38,18 +38,6 @@ class Filesystem:
38
38
  self.types = Types(window)
39
39
  self.url = Url(window)
40
40
  self.workdir_placeholder = "%workdir%"
41
- self.styles = [
42
- "style.css",
43
- "style.dark.css",
44
- "style.light.css",
45
- "markdown.css",
46
- "markdown.dark.css",
47
- "markdown.light.css",
48
- "web.css",
49
- "web.dark.css",
50
- "web.light.css",
51
- "fix_windows.css",
52
- ]
53
41
 
54
42
  def install(self):
55
43
  """Install provider data"""
@@ -77,9 +65,9 @@ class Filesystem:
77
65
 
78
66
  src_dir = os.path.join(self.window.core.config.get_app_path(), 'data', 'css')
79
67
  dst_dir = os.path.join(self.window.core.config.path, 'css')
80
-
68
+ app_styles = os.listdir(src_dir)
81
69
  try:
82
- for style in self.styles:
70
+ for style in app_styles:
83
71
  src = os.path.join(src_dir, style)
84
72
  dst = os.path.join(dst_dir, style)
85
73
  if (not os.path.exists(dst) or force) and os.path.exists(src):
@@ -91,7 +79,8 @@ class Filesystem:
91
79
  """Backup user custom css styles"""
92
80
  css_dir = os.path.join(self.window.core.config.path, 'css')
93
81
  backup_file_extension = '.backup'
94
- for style in self.styles:
82
+ user_styles = os.listdir(css_dir)
83
+ for style in user_styles:
95
84
  src = os.path.join(css_dir, style)
96
85
  dst = os.path.join(css_dir, style + backup_file_extension)
97
86
  if os.path.exists(src):
@@ -118,7 +107,7 @@ class Filesystem:
118
107
  """
119
108
  return [self.make_local(path) for path in paths]
120
109
 
121
- def make_local_list_img(self, paths: list) -> list:
110
+ def make_local_list_img(self, paths: List[str]) -> List[str]:
122
111
  """
123
112
  Make local placeholder paths for images
124
113
 
@@ -132,7 +121,7 @@ class Filesystem:
132
121
  result.append(self.make_local(path))
133
122
  return result
134
123
 
135
- def get_url(self, url) -> QUrl:
124
+ def get_url(self, url: str) -> QUrl:
136
125
  """
137
126
  Make current OS-specific URL to open file or directory
138
127
 
@@ -146,7 +135,7 @@ class Filesystem:
146
135
  else:
147
136
  return QUrl.fromLocalFile(url)
148
137
 
149
- def get_path(self, path) -> str:
138
+ def get_path(self, path: str) -> str:
150
139
  """
151
140
  Prepare current OS-specific path from given path
152
141
 
@@ -155,10 +144,10 @@ class Filesystem:
155
144
  """
156
145
  parts = PurePath(path).parts
157
146
  if len(parts) > 1:
158
- return os.path.join(*parts) # rebuild OS directory separators
147
+ return str(os.path.join(*parts)) # rebuild OS directory separators
159
148
  return path
160
149
 
161
- def to_workdir(self, path) -> str:
150
+ def to_workdir(self, path: str) -> str:
162
151
  """
163
152
  Replace user path with current workdir
164
153
 
@@ -189,7 +178,7 @@ class Filesystem:
189
178
  parts = path[dir_index:]
190
179
  return os.path.join(work_dir, parts)
191
180
 
192
- def extract_local_url(self, path) -> (str, str):
181
+ def extract_local_url(self, path: str) -> Tuple[str, str]:
193
182
  """
194
183
  Extract local url and path from url
195
184
 
@@ -250,7 +239,7 @@ class Filesystem:
250
239
  shutil.copyfile(path, upload_path)
251
240
  return upload_path
252
241
 
253
- def remove_upload(self, path: str) -> None:
242
+ def remove_upload(self, path: str):
254
243
  """
255
244
  Delete uploaded file
256
245
 
@@ -270,7 +259,7 @@ class Filesystem:
270
259
  """
271
260
  return path.startswith('file://') or path.startswith('http://') or path.startswith('https://')
272
261
 
273
- def sizeof_fmt(self, num, suffix='B'):
262
+ def sizeof_fmt(self, num: Any, suffix: str = 'B'):
274
263
  """
275
264
  Convert numbers to human-readable unit formats.
276
265
 
@@ -286,7 +275,11 @@ class Filesystem:
286
275
  num /= 1024.0
287
276
  return "{:.1f} {}{}".format(num, 'Yi', suffix).replace('.', ',')
288
277
 
289
- def get_directory_size(self, directory : str, human_readable: bool = True) -> str or int:
278
+ def get_directory_size(
279
+ self,
280
+ directory: str,
281
+ human_readable: bool = True
282
+ ) -> Union[str, int]:
290
283
  """
291
284
  Calculate the total size of the given directory
292
285
 
@@ -308,7 +301,11 @@ class Filesystem:
308
301
  return self.sizeof_fmt(total_size)
309
302
  return total_size
310
303
 
311
- def get_datadir_size(self, path: str, human_readable: bool = True) -> str or int:
304
+ def get_datadir_size(
305
+ self,
306
+ path: str,
307
+ human_readable: bool = True
308
+ ) -> Union[str, int]:
312
309
  """
313
310
  Calculate the total size of the given data directory
314
311
 
@@ -319,7 +316,11 @@ class Filesystem:
319
316
  data_dir = os.path.join(path, 'data')
320
317
  return self.get_directory_size(data_dir, human_readable)
321
318
 
322
- def get_db_size(self, path: str, human_readable: bool = True) -> str or int:
319
+ def get_db_size(
320
+ self,
321
+ path: str,
322
+ human_readable: bool = True
323
+ ) -> Union[str, int]:
323
324
  """
324
325
  Calculate the total size of the given database
325
326
 
@@ -337,7 +338,11 @@ class Filesystem:
337
338
  return self.sizeof_fmt(total_size)
338
339
  return total_size
339
340
 
340
- def get_free_disk_space(self, directory: str, human_readable: bool = True) -> str or int:
341
+ def get_free_disk_space(
342
+ self,
343
+ directory: str,
344
+ human_readable: bool = True
345
+ ) -> Union[str, int]:
341
346
  """
342
347
  Check free disk space in the given directory
343
348
 
@@ -350,7 +355,13 @@ class Filesystem:
350
355
  return self.sizeof_fmt(free)
351
356
  return free
352
357
 
353
- def copy_workdir(self, path: str, new_path: str, copy_db: bool = True, copy_datadir: bool = True) -> bool:
358
+ def copy_workdir(
359
+ self,
360
+ path: str,
361
+ new_path: str,
362
+ copy_db: bool = True,
363
+ copy_datadir: bool = True
364
+ ) -> bool:
354
365
  """
355
366
  Copy working directory
356
367
 
@@ -389,7 +400,12 @@ class Filesystem:
389
400
  os.remove(profile_file)
390
401
  return True
391
402
 
392
- def clear_workdir(self, path: str, remove_db: bool = True, remove_datadir: bool = True) -> bool:
403
+ def clear_workdir(
404
+ self,
405
+ path: str,
406
+ remove_db: bool = True,
407
+ remove_datadir: bool = True
408
+ ) -> bool:
393
409
  """
394
410
  Clear working directory
395
411
 
@@ -437,7 +453,11 @@ class Filesystem:
437
453
  """
438
454
  return len(os.listdir(path)) == 0
439
455
 
440
- def get_files_from_dir(self, path: str, recursive: bool = True) -> list:
456
+ def get_files_from_dir(
457
+ self,
458
+ path: str,
459
+ recursive: bool = True
460
+ ) -> list:
441
461
  """
442
462
  Get files from directory
443
463
 
@@ -457,5 +477,3 @@ class Filesystem:
457
477
  else:
458
478
  files = [os.path.join(path, f) for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))]
459
479
  return files
460
-
461
-
@@ -6,10 +6,11 @@
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.03.25 10:00:00 #
9
+ # Updated Date: 2024.12.14 08:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import os
13
+ from typing import List
13
14
 
14
15
  from PySide6.QtGui import QAction, QIcon
15
16
  from PySide6.QtWidgets import QWidget
@@ -45,9 +46,10 @@ class Actions:
45
46
  :param path: path to file
46
47
  :return: True if file has preview
47
48
  """
48
- return self.window.core.filesystem.types.is_image(path) or self.window.core.filesystem.types.is_video(path)
49
+ return (self.window.core.filesystem.types.is_image(path)
50
+ or self.window.core.filesystem.types.is_video(path))
49
51
 
50
- def get_preview(self, parent: QWidget, path: str) -> list:
52
+ def get_preview(self, parent: QWidget, path: str) -> List[QAction]:
51
53
  """
52
54
  Get preview actions for context menu
53
55
 
@@ -56,7 +58,8 @@ class Actions:
56
58
  :return: list of context menu actions
57
59
  """
58
60
  actions = []
59
- if self.window.core.filesystem.types.is_video(path) or self.window.core.filesystem.types.is_audio(path):
61
+ if (self.window.core.filesystem.types.is_video(path)
62
+ or self.window.core.filesystem.types.is_audio(path)):
60
63
  action = QAction(
61
64
  QIcon(":/icons/video.svg"),
62
65
  trans('action.video.play'),
@@ -100,7 +103,7 @@ class Actions:
100
103
  actions.append(action)
101
104
  return actions
102
105
 
103
- def get_use(self, parent: QWidget, path: str) -> list:
106
+ def get_use(self, parent: QWidget, path: str) -> List[QAction]:
104
107
  """
105
108
  Get use actions for context menu
106
109
 
@@ -6,13 +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: 2024.11.20 21:00:00 #
9
+ # Updated Date: 2024.12.14 08:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import copy
13
13
  import json
14
14
  import os
15
15
 
16
+ from typing import Optional
17
+
16
18
 
17
19
  class Editor:
18
20
  def __init__(self, window=None):
@@ -63,7 +65,11 @@ class Editor:
63
65
  """
64
66
  return self.window.ui.dialog[dialog_id].is_changed()
65
67
 
66
- def load(self, dialog_id: str, file: str = None):
68
+ def load(
69
+ self,
70
+ dialog_id: str,
71
+ file: Optional[str] = None
72
+ ):
67
73
  """
68
74
  Load file to editor
69
75
 
@@ -87,7 +93,11 @@ class Editor:
87
93
  self.window.core.debug.log(e)
88
94
  self.window.update_status("Error loading file: {}".format(e))
89
95
 
90
- def save(self, dialog_id: str, path: str = None):
96
+ def save(
97
+ self,
98
+ dialog_id: str,
99
+ path: Optional[str] = None
100
+ ):
91
101
  """
92
102
  Save file to disk
93
103
 
@@ -6,9 +6,12 @@
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.03.19 01:00:00 #
9
+ # Updated Date: 2024.12.14 08:00:00 #
10
10
  # ================================================== #
11
11
 
12
+ from typing import List
13
+
14
+
12
15
  class Types:
13
16
  def __init__(self, window=None):
14
17
  """
@@ -45,7 +48,7 @@ class Types:
45
48
  """
46
49
  return str(path).lower().endswith(tuple(self.get_audio_ext()))
47
50
 
48
- def get_img_ext(self) -> list:
51
+ def get_img_ext(self) -> List[str]:
49
52
  """
50
53
  Get image extensions
51
54
 
@@ -53,23 +56,25 @@ class Types:
53
56
  """
54
57
  return ['.png', '.jpg', '.jpeg', '.gif', '.bmp', '.tiff', '.webp']
55
58
 
56
- def get_video_ext(self) -> list:
59
+ def get_video_ext(self) -> List[str]:
57
60
  """
58
61
  Get video extensions
59
62
 
60
63
  :return: list with video extensions
61
64
  """
62
- return ['.mp4', '.avi', '.mkv', '.webm', '.mov', '.flv', '.wmv', '.3gp', '.ogg', '.ogv', '.mpg', '.mpeg', '.m4v']
65
+ return ['.mp4', '.avi', '.mkv', '.webm', '.mov', '.flv', '.wmv',
66
+ '.3gp', '.ogg', '.ogv', '.mpg', '.mpeg', '.m4v']
63
67
 
64
- def get_audio_ext(self) -> list:
68
+ def get_audio_ext(self) -> List[str]:
65
69
  """
66
70
  Get audio extensions
67
71
 
68
72
  :return: list with audio extensions
69
73
  """
70
- return ['.mp3', '.wav', '.flac', '.ogg', '.m4a', '.wma', '.aac', '.aiff', '.alac', '.dsd', '.pcm', '.mpc']
74
+ return ['.mp3', '.wav', '.flac', '.ogg', '.m4a', '.wma', '.aac',
75
+ '.aiff', '.alac', '.dsd', '.pcm', '.mpc']
71
76
 
72
- def get_excluded_extensions(self) -> list[str]:
77
+ def get_excluded_extensions(self) -> List[str]:
73
78
  """
74
79
  Get excluded extensions if no loader is available
75
80
 
@@ -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.11.08 06:00:00 #
9
+ # Updated Date: 2024.12.09 03:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from PySide6.QtCore import QUrl
@@ -38,14 +38,18 @@ class Url:
38
38
  ]
39
39
 
40
40
  # JS bridge
41
- if url.toString() == 'bridge://open_find':
42
- pid = self.window.controller.ui.tabs.get_current_pid()
41
+ if url.toString().startswith('bridge://open_find'):
42
+ pid = int(url.toString().split(':')[2])
43
43
  if pid in self.window.ui.nodes['output']:
44
44
  self.window.ui.nodes['output'][pid].find_open()
45
45
  return
46
46
  elif url.toString() == 'bridge://escape':
47
47
  self.window.controller.access.on_escape()
48
48
  return
49
+ elif url.toString() == 'bridge://focus':
50
+ pid = self.window.controller.ui.tabs.get_current_pid()
51
+ if pid in self.window.ui.nodes['output']:
52
+ self.window.ui.nodes['output'][pid].on_focus_js()
49
53
 
50
54
  # -------------
51
55
 
pygpt_net/core/history.py CHANGED
@@ -6,11 +6,12 @@
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.01.19 05:00:00 #
9
+ # Updated Date: 2024.12.14 22:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import datetime
13
13
  import os
14
+ from typing import List
14
15
 
15
16
  from pygpt_net.item.ctx import CtxItem
16
17
  from pygpt_net.provider.core.history.txt_file import TxtFileProvider
@@ -46,7 +47,7 @@ class History:
46
47
  # delete all txt history files from history dir
47
48
  self.provider.truncate()
48
49
 
49
- def remove_items(self, items: list):
50
+ def remove_items(self, items: List[CtxItem]):
50
51
  """
51
52
  Remove items from history (txt files)
52
53
 
@@ -6,10 +6,12 @@
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.04.17 01:00:00 #
9
+ # Updated Date: 2024.12.14 22:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import datetime
13
+ from typing import Optional, Tuple, List, Dict, Any
14
+
13
15
  from packaging.version import Version
14
16
 
15
17
  from pygpt_net.item.index import IndexItem
@@ -98,7 +100,11 @@ class Idx:
98
100
  """
99
101
  self.storage.store(idx)
100
102
 
101
- def remove_index(self, idx: str = "base", truncate: bool = False) -> bool:
103
+ def remove_index(
104
+ self,
105
+ idx: str = "base",
106
+ truncate: bool = False
107
+ ) -> bool:
102
108
  """
103
109
  Truncate index
104
110
 
@@ -125,10 +131,10 @@ class Idx:
125
131
  def index_files(
126
132
  self,
127
133
  idx: str = "base",
128
- path: str = None,
129
- replace: bool = None,
130
- recursive: bool = None,
131
- ) -> (dict, list):
134
+ path: Optional[str] = None,
135
+ replace: Optional[bool] = None,
136
+ recursive: Optional[bool] = None,
137
+ ) -> Tuple[Dict, List[str]]:
132
138
  """
133
139
  Index file or directory of files
134
140
 
@@ -165,7 +171,7 @@ class Idx:
165
171
  idx: str = "base",
166
172
  id: int = 0,
167
173
  from_ts: int = 0
168
- ) -> (int, list):
174
+ ) -> Tuple[int, List[str]]:
169
175
  """
170
176
  Index records from db by meta id
171
177
 
@@ -199,7 +205,7 @@ class Idx:
199
205
  self,
200
206
  idx: str = "base",
201
207
  from_ts: int = 0
202
- ) -> (int, list):
208
+ ) -> Tuple[int, List[str]]:
203
209
  """
204
210
  Index records from db by meta id
205
211
 
@@ -230,10 +236,10 @@ class Idx:
230
236
  def index_urls(
231
237
  self,
232
238
  idx: str = "base",
233
- urls: list = None,
239
+ urls: Optional[List[str]] = None,
234
240
  type: str = "webpage",
235
- extra_args: dict = None
236
- ) -> (dict, list):
241
+ extra_args: Optional[Dict[str, Any]] = None
242
+ ) -> Tuple[int, List[str]]:
237
243
  """
238
244
  Index URLs
239
245
 
@@ -269,10 +275,10 @@ class Idx:
269
275
  self,
270
276
  idx: str = "base",
271
277
  type: str = "webpage",
272
- params: dict = None,
273
- config: dict = None,
274
- replace: bool = None,
275
- ) -> (dict, list):
278
+ params: Optional[Dict[str, Any]] = None,
279
+ config: Optional[Dict[str, Any]] = None,
280
+ replace: Optional[bool] = None,
281
+ ) -> Tuple[int, list]:
276
282
  """
277
283
  Index URLs
278
284
 
@@ -310,7 +316,10 @@ class Idx:
310
316
  self.log("Error: " + str(errors))
311
317
  return n, errors
312
318
 
313
- def get_idx_data(self, idx: str = None) -> dict:
319
+ def get_idx_data(
320
+ self,
321
+ idx: Optional[str] = None
322
+ ) -> Dict[str, Dict]:
314
323
  """
315
324
  Get indexed files data
316
325
 
@@ -329,7 +338,7 @@ class Idx:
329
338
  indexes[idx] = self.items[store_id][idx].items
330
339
  return indexes
331
340
 
332
- def get_by_idx(self, idx: int) -> str:
341
+ def get_by_idx(self, idx: int) -> Optional[str]:
333
342
  """
334
343
  Return idx by list index
335
344
 
@@ -341,7 +350,7 @@ class Idx:
341
350
  if idx < len(items):
342
351
  return items[idx]['id']
343
352
 
344
- def get_idx_by_name(self, name: str) -> int:
353
+ def get_idx_by_name(self, name: str) -> Optional[int]:
345
354
  """
346
355
  Return idx on list by name
347
356
 
@@ -354,7 +363,7 @@ class Idx:
354
363
  if item['id'] == name:
355
364
  return idx
356
365
 
357
- def get_default_idx(self) -> str:
366
+ def get_default_idx(self) -> Optional[str]:
358
367
  """
359
368
  Return default idx
360
369
 
@@ -375,7 +384,7 @@ class Idx:
375
384
  return idx in self.items[store_id]
376
385
  return False
377
386
 
378
- def get(self, idx: str) -> IndexItem:
387
+ def get(self, idx: str) -> Optional[IndexItem]:
379
388
  """
380
389
  Return index data from current storage
381
390
 
@@ -386,7 +395,7 @@ class Idx:
386
395
  if store_id in self.items and idx in self.items[store_id]:
387
396
  return self.items[store_id][idx]
388
397
 
389
- def get_all(self) -> dict:
398
+ def get_all(self) -> Dict[str, IndexItem]:
390
399
  """
391
400
  Return all indexes in current store
392
401
 
@@ -397,12 +406,16 @@ class Idx:
397
406
  return self.items[store_id]
398
407
  return {}
399
408
 
400
- def append(self, idx: str, files: dict):
409
+ def append(
410
+ self,
411
+ idx: str,
412
+ files: Dict[str, str]
413
+ ):
401
414
  """
402
415
  Append indexed files to index
403
416
 
404
417
  :param idx: index name
405
- :param files: dict of indexed files
418
+ :param files: dict of indexed files (path -> doc_id)
406
419
  """
407
420
  # create store if not exists
408
421
  store_id = self.get_current_store()
@@ -445,7 +458,11 @@ class Idx:
445
458
  self.items[store_id][idx].items[file_id]["id"] = doc_id
446
459
  self.items[store_id][idx].items[file_id]["indexed_ts"] = ts
447
460
 
448
- def remove_doc(self, idx: str, doc_id: str):
461
+ def remove_doc(
462
+ self,
463
+ idx: str,
464
+ doc_id: str
465
+ ):
449
466
  """
450
467
  Remove document from index
451
468
 
@@ -456,7 +473,11 @@ class Idx:
456
473
  if self.storage.remove_document(idx, doc_id):
457
474
  self.log("Removed document from index: " + idx + " - " + doc_id)
458
475
 
459
- def remove_file(self, idx: str, file: str):
476
+ def remove_file(
477
+ self,
478
+ idx: str,
479
+ file: str
480
+ ):
460
481
  """
461
482
  Remove file from index
462
483
 
@@ -508,7 +529,7 @@ class Idx:
508
529
  self.items[store_id][idx].id = idx
509
530
  self.items[store_id][idx].name = idx
510
531
 
511
- def get_idx_ids(self) -> list:
532
+ def get_idx_ids(self) -> List[str]:
512
533
  """
513
534
  Get list of indexes
514
535
 
@@ -532,7 +553,7 @@ class Idx:
532
553
  self.items[store_id][idx].items = {}
533
554
  self.get_provider().truncate(store_id, idx)
534
555
 
535
- def get_counters(self, type: str) -> dict:
556
+ def get_counters(self, type: str) -> Dict[str, Dict[str, int]]:
536
557
  """
537
558
  Get counters (stats, count items by type [file, ctx, external])
538
559