dulus 3.9.3__tar.gz → 3.9.5__tar.gz

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 (335) hide show
  1. {dulus-3.9.3/dulus.egg-info → dulus-3.9.5}/PKG-INFO +1 -1
  2. {dulus-3.9.3 → dulus-3.9.5}/config.py +28 -2
  3. {dulus-3.9.3 → dulus-3.9.5/dulus.egg-info}/PKG-INFO +1 -1
  4. {dulus-3.9.3 → dulus-3.9.5}/pyproject.toml +1 -1
  5. {dulus-3.9.3 → dulus-3.9.5}/voice/tts.py +30 -1
  6. {dulus-3.9.3 → dulus-3.9.5}/LICENSE +0 -0
  7. {dulus-3.9.3 → dulus-3.9.5}/MANIFEST.in +0 -0
  8. {dulus-3.9.3 → dulus-3.9.5}/README.md +0 -0
  9. {dulus-3.9.3 → dulus-3.9.5}/agent.py +0 -0
  10. {dulus-3.9.3 → dulus-3.9.5}/analytics.py +0 -0
  11. {dulus-3.9.3 → dulus-3.9.5}/backend/__init__.py +0 -0
  12. {dulus-3.9.3 → dulus-3.9.5}/backend/agents_bridge.py +0 -0
  13. {dulus-3.9.3 → dulus-3.9.5}/backend/compressor.py +0 -0
  14. {dulus-3.9.3 → dulus-3.9.5}/backend/context.py +0 -0
  15. {dulus-3.9.3 → dulus-3.9.5}/backend/githook.py +0 -0
  16. {dulus-3.9.3 → dulus-3.9.5}/backend/marketplace.py +0 -0
  17. {dulus-3.9.3 → dulus-3.9.5}/backend/mempalace_bridge.py +0 -0
  18. {dulus-3.9.3 → dulus-3.9.5}/backend/personas.py +0 -0
  19. {dulus-3.9.3 → dulus-3.9.5}/backend/plugins.py +0 -0
  20. {dulus-3.9.3 → dulus-3.9.5}/backend/server.py +0 -0
  21. {dulus-3.9.3 → dulus-3.9.5}/backend/tasks.py +0 -0
  22. {dulus-3.9.3 → dulus-3.9.5}/batch_api.py +0 -0
  23. {dulus-3.9.3 → dulus-3.9.5}/checkpoint/__init__.py +0 -0
  24. {dulus-3.9.3 → dulus-3.9.5}/checkpoint/hooks.py +0 -0
  25. {dulus-3.9.3 → dulus-3.9.5}/checkpoint/store.py +0 -0
  26. {dulus-3.9.3 → dulus-3.9.5}/checkpoint/types.py +0 -0
  27. {dulus-3.9.3 → dulus-3.9.5}/claude_code_watcher.py +0 -0
  28. {dulus-3.9.3 → dulus-3.9.5}/clipboard_utils.py +0 -0
  29. {dulus-3.9.3 → dulus-3.9.5}/cloudsave.py +0 -0
  30. {dulus-3.9.3 → dulus-3.9.5}/common.py +0 -0
  31. {dulus-3.9.3 → dulus-3.9.5}/compaction.py +0 -0
  32. {dulus-3.9.3 → dulus-3.9.5}/context.py +0 -0
  33. {dulus-3.9.3 → dulus-3.9.5}/data/__init__.py +0 -0
  34. {dulus-3.9.3 → dulus-3.9.5}/data/active_persona.json +0 -0
  35. {dulus-3.9.3 → dulus-3.9.5}/data/marketplace.json +0 -0
  36. {dulus-3.9.3 → dulus-3.9.5}/data/personas.json +0 -0
  37. {dulus-3.9.3 → dulus-3.9.5}/data/plugins/__init__.py +0 -0
  38. {dulus-3.9.3 → dulus-3.9.5}/data/plugins/composio/__init__.py +0 -0
  39. {dulus-3.9.3 → dulus-3.9.5}/data/plugins/composio/composio_plugin/__init__.py +0 -0
  40. {dulus-3.9.3 → dulus-3.9.5}/data/plugins/composio/composio_plugin/session_manager.py +0 -0
  41. {dulus-3.9.3 → dulus-3.9.5}/data/plugins/composio/composio_plugin/tool_generator.py +0 -0
  42. {dulus-3.9.3 → dulus-3.9.5}/data/plugins/composio/plugin.json +0 -0
  43. {dulus-3.9.3 → dulus-3.9.5}/data/plugins/composio/plugin_tool.py +0 -0
  44. {dulus-3.9.3 → dulus-3.9.5}/data/tasks.json +0 -0
  45. {dulus-3.9.3 → dulus-3.9.5}/docs/API.md +0 -0
  46. {dulus-3.9.3 → dulus-3.9.5}/docs/BRAND_GUIDE.md +0 -0
  47. {dulus-3.9.3 → dulus-3.9.5}/docs/CHANGELOG.md +0 -0
  48. {dulus-3.9.3 → dulus-3.9.5}/docs/CONTRIBUTING.md +0 -0
  49. {dulus-3.9.3 → dulus-3.9.5}/docs/DEPLOYMENT.md +0 -0
  50. {dulus-3.9.3 → dulus-3.9.5}/docs/Dulus_AI_Whitepaper_(v2.0).pdf +0 -0
  51. {dulus-3.9.3 → dulus-3.9.5}/docs/FAQ.md +0 -0
  52. {dulus-3.9.3 → dulus-3.9.5}/docs/GETTING_STARTED.md +0 -0
  53. {dulus-3.9.3 → dulus-3.9.5}/docs/INVESTOR_BRIEF.md +0 -0
  54. {dulus-3.9.3 → dulus-3.9.5}/docs/README.md +0 -0
  55. {dulus-3.9.3 → dulus-3.9.5}/docs/README_AR.md +0 -0
  56. {dulus-3.9.3 → dulus-3.9.5}/docs/README_EN.md +0 -0
  57. {dulus-3.9.3 → dulus-3.9.5}/docs/README_ES.md +0 -0
  58. {dulus-3.9.3 → dulus-3.9.5}/docs/README_FR.md +0 -0
  59. {dulus-3.9.3 → dulus-3.9.5}/docs/README_JA.md +0 -0
  60. {dulus-3.9.3 → dulus-3.9.5}/docs/README_KO.md +0 -0
  61. {dulus-3.9.3 → dulus-3.9.5}/docs/README_PT.md +0 -0
  62. {dulus-3.9.3 → dulus-3.9.5}/docs/README_RU.md +0 -0
  63. {dulus-3.9.3 → dulus-3.9.5}/docs/README_ZH.md +0 -0
  64. {dulus-3.9.3 → dulus-3.9.5}/docs/SECURITY.md +0 -0
  65. {dulus-3.9.3 → dulus-3.9.5}/docs/__init__.py +0 -0
  66. {dulus-3.9.3 → dulus-3.9.5}/docs/api.html +0 -0
  67. {dulus-3.9.3 → dulus-3.9.5}/docs/architecture.md +0 -0
  68. {dulus-3.9.3 → dulus-3.9.5}/docs/azure-speech-template.json +0 -0
  69. {dulus-3.9.3 → dulus-3.9.5}/docs/dashboard/index.html +0 -0
  70. {dulus-3.9.3 → dulus-3.9.5}/docs/divider.svg +0 -0
  71. {dulus-3.9.3 → dulus-3.9.5}/docs/dulus-bird.png +0 -0
  72. {dulus-3.9.3 → dulus-3.9.5}/docs/generate.py +0 -0
  73. {dulus-3.9.3 → dulus-3.9.5}/docs/hero.svg +0 -0
  74. {dulus-3.9.3 → dulus-3.9.5}/docs/index.html +0 -0
  75. {dulus-3.9.3 → dulus-3.9.5}/docs/news.md +0 -0
  76. {dulus-3.9.3 → dulus-3.9.5}/docs/nvidia-models.svg +0 -0
  77. {dulus-3.9.3 → dulus-3.9.5}/docs/particle-playground.html +0 -0
  78. {dulus-3.9.3 → dulus-3.9.5}/docs/personas/index.html +0 -0
  79. {dulus-3.9.3 → dulus-3.9.5}/docs/poetry-banner.png +0 -0
  80. {dulus-3.9.3 → dulus-3.9.5}/docs/preview.html +0 -0
  81. {dulus-3.9.3 → dulus-3.9.5}/docs/sec-agents.svg +0 -0
  82. {dulus-3.9.3 → dulus-3.9.5}/docs/sec-brainstorm.svg +0 -0
  83. {dulus-3.9.3 → dulus-3.9.5}/docs/sec-bridges.svg +0 -0
  84. {dulus-3.9.3 → dulus-3.9.5}/docs/sec-features.svg +0 -0
  85. {dulus-3.9.3 → dulus-3.9.5}/docs/sec-freetier.svg +0 -0
  86. {dulus-3.9.3 → dulus-3.9.5}/docs/sec-memory.svg +0 -0
  87. {dulus-3.9.3 → dulus-3.9.5}/docs/sec-models.svg +0 -0
  88. {dulus-3.9.3 → dulus-3.9.5}/docs/sec-perms.svg +0 -0
  89. {dulus-3.9.3 → dulus-3.9.5}/docs/sec-plugins.svg +0 -0
  90. {dulus-3.9.3 → dulus-3.9.5}/docs/sec-quickstart.svg +0 -0
  91. {dulus-3.9.3 → dulus-3.9.5}/docs/sec-ssj.svg +0 -0
  92. {dulus-3.9.3 → dulus-3.9.5}/docs/spinners.svg +0 -0
  93. {dulus-3.9.3 → dulus-3.9.5}/docs/split-pane.svg +0 -0
  94. {dulus-3.9.3 → dulus-3.9.5}/docs/terminal-boot.svg +0 -0
  95. {dulus-3.9.3 → dulus-3.9.5}/dulus.egg-info/SOURCES.txt +0 -0
  96. {dulus-3.9.3 → dulus-3.9.5}/dulus.egg-info/dependency_links.txt +0 -0
  97. {dulus-3.9.3 → dulus-3.9.5}/dulus.egg-info/entry_points.txt +0 -0
  98. {dulus-3.9.3 → dulus-3.9.5}/dulus.egg-info/requires.txt +0 -0
  99. {dulus-3.9.3 → dulus-3.9.5}/dulus.egg-info/top_level.txt +0 -0
  100. {dulus-3.9.3 → dulus-3.9.5}/dulus.py +0 -0
  101. {dulus-3.9.3 → dulus-3.9.5}/dulus_gui.py +0 -0
  102. {dulus-3.9.3 → dulus-3.9.5}/dulus_gui_web.py +0 -0
  103. {dulus-3.9.3 → dulus-3.9.5}/dulus_mcp/__init__.py +0 -0
  104. {dulus-3.9.3 → dulus-3.9.5}/dulus_mcp/client.py +0 -0
  105. {dulus-3.9.3 → dulus-3.9.5}/dulus_mcp/commands.py +0 -0
  106. {dulus-3.9.3 → dulus-3.9.5}/dulus_mcp/config.py +0 -0
  107. {dulus-3.9.3 → dulus-3.9.5}/dulus_mcp/hub.py +0 -0
  108. {dulus-3.9.3 → dulus-3.9.5}/dulus_mcp/tools.py +0 -0
  109. {dulus-3.9.3 → dulus-3.9.5}/dulus_mcp/types.py +0 -0
  110. {dulus-3.9.3 → dulus-3.9.5}/dulus_tools/__init__.py +0 -0
  111. {dulus-3.9.3 → dulus-3.9.5}/dulus_tools/add_dir_manager.py +0 -0
  112. {dulus-3.9.3 → dulus-3.9.5}/dulus_tools/afk_mode.py +0 -0
  113. {dulus-3.9.3 → dulus-3.9.5}/dulus_tools/approval_runtime.py +0 -0
  114. {dulus-3.9.3 → dulus-3.9.5}/dulus_tools/background_tasks.py +0 -0
  115. {dulus-3.9.3 → dulus-3.9.5}/dulus_tools/clipboard_utils.py +0 -0
  116. {dulus-3.9.3 → dulus-3.9.5}/dulus_tools/diff_visualizer.py +0 -0
  117. {dulus-3.9.3 → dulus-3.9.5}/dulus_tools/export_import.py +0 -0
  118. {dulus-3.9.3 → dulus-3.9.5}/dulus_tools/hook_engine.py +0 -0
  119. {dulus-3.9.3 → dulus-3.9.5}/dulus_tools/notification_manager.py +0 -0
  120. {dulus-3.9.3 → dulus-3.9.5}/dulus_tools/session_fork.py +0 -0
  121. {dulus-3.9.3 → dulus-3.9.5}/dulus_tools/shell_mode.py +0 -0
  122. {dulus-3.9.3 → dulus-3.9.5}/dulus_tools/todo_visualizer.py +0 -0
  123. {dulus-3.9.3 → dulus-3.9.5}/dulus_tools/tree_ls.py +0 -0
  124. {dulus-3.9.3 → dulus-3.9.5}/dulus_tools/wire_events.py +0 -0
  125. {dulus-3.9.3 → dulus-3.9.5}/dulus_tools/yolo_mode.py +0 -0
  126. {dulus-3.9.3 → dulus-3.9.5}/governance.py +0 -0
  127. {dulus-3.9.3 → dulus-3.9.5}/gui/__init__.py +0 -0
  128. {dulus-3.9.3 → dulus-3.9.5}/gui/agent_bridge.py +0 -0
  129. {dulus-3.9.3 → dulus-3.9.5}/gui/chat_widget.py +0 -0
  130. {dulus-3.9.3 → dulus-3.9.5}/gui/dulus_orchestrator/App.tsx +0 -0
  131. {dulus-3.9.3 → dulus-3.9.5}/gui/dulus_orchestrator/THIRD_PARTY_NOTICES.md +0 -0
  132. {dulus-3.9.3 → dulus-3.9.5}/gui/dulus_orchestrator/dist/index.html +0 -0
  133. {dulus-3.9.3 → dulus-3.9.5}/gui/dulus_orchestrator/dist/standalone.html +0 -0
  134. {dulus-3.9.3 → dulus-3.9.5}/gui/dulus_orchestrator/index.html +0 -0
  135. {dulus-3.9.3 → dulus-3.9.5}/gui/dulus_orchestrator/index.tsx +0 -0
  136. {dulus-3.9.3 → dulus-3.9.5}/gui/dulus_orchestrator/metadata.json +0 -0
  137. {dulus-3.9.3 → dulus-3.9.5}/gui/dulus_orchestrator/package-lock.json +0 -0
  138. {dulus-3.9.3 → dulus-3.9.5}/gui/dulus_orchestrator/package.json +0 -0
  139. {dulus-3.9.3 → dulus-3.9.5}/gui/dulus_orchestrator/types.ts +0 -0
  140. {dulus-3.9.3 → dulus-3.9.5}/gui/dulus_orchestrator/utils.ts +0 -0
  141. {dulus-3.9.3 → dulus-3.9.5}/gui/dulus_orchestrator/vertex-ai-proxy-interceptor.js +0 -0
  142. {dulus-3.9.3 → dulus-3.9.5}/gui/dulus_orchestrator/vite.config.ts +0 -0
  143. {dulus-3.9.3 → dulus-3.9.5}/gui/main_window.py +0 -0
  144. {dulus-3.9.3 → dulus-3.9.5}/gui/personas.py +0 -0
  145. {dulus-3.9.3 → dulus-3.9.5}/gui/sandbox_server.py +0 -0
  146. {dulus-3.9.3 → dulus-3.9.5}/gui/session_utils.py +0 -0
  147. {dulus-3.9.3 → dulus-3.9.5}/gui/settings_dialog.py +0 -0
  148. {dulus-3.9.3 → dulus-3.9.5}/gui/sidebar.py +0 -0
  149. {dulus-3.9.3 → dulus-3.9.5}/gui/tasks_view.py +0 -0
  150. {dulus-3.9.3 → dulus-3.9.5}/gui/themes.py +0 -0
  151. {dulus-3.9.3 → dulus-3.9.5}/gui/tool_panel.py +0 -0
  152. {dulus-3.9.3 → dulus-3.9.5}/input.py +0 -0
  153. {dulus-3.9.3 → dulus-3.9.5}/license_manager.py +0 -0
  154. {dulus-3.9.3 → dulus-3.9.5}/memory/__init__.py +0 -0
  155. {dulus-3.9.3 → dulus-3.9.5}/memory/audit.py +0 -0
  156. {dulus-3.9.3 → dulus-3.9.5}/memory/consolidator.py +0 -0
  157. {dulus-3.9.3 → dulus-3.9.5}/memory/context.py +0 -0
  158. {dulus-3.9.3 → dulus-3.9.5}/memory/offload.py +0 -0
  159. {dulus-3.9.3 → dulus-3.9.5}/memory/palace.py +0 -0
  160. {dulus-3.9.3 → dulus-3.9.5}/memory/scan.py +0 -0
  161. {dulus-3.9.3 → dulus-3.9.5}/memory/sessions.py +0 -0
  162. {dulus-3.9.3 → dulus-3.9.5}/memory/store.py +0 -0
  163. {dulus-3.9.3 → dulus-3.9.5}/memory/tools.py +0 -0
  164. {dulus-3.9.3 → dulus-3.9.5}/memory/types.py +0 -0
  165. {dulus-3.9.3 → dulus-3.9.5}/memory/vector_search.py +0 -0
  166. {dulus-3.9.3 → dulus-3.9.5}/multi_agent/__init__.py +0 -0
  167. {dulus-3.9.3 → dulus-3.9.5}/multi_agent/subagent.py +0 -0
  168. {dulus-3.9.3 → dulus-3.9.5}/multi_agent/tools.py +0 -0
  169. {dulus-3.9.3 → dulus-3.9.5}/offload_helper.py +0 -0
  170. {dulus-3.9.3 → dulus-3.9.5}/personality_config.py +0 -0
  171. {dulus-3.9.3 → dulus-3.9.5}/plugin/__init__.py +0 -0
  172. {dulus-3.9.3 → dulus-3.9.5}/plugin/autoadapter.py +0 -0
  173. {dulus-3.9.3 → dulus-3.9.5}/plugin/loader.py +0 -0
  174. {dulus-3.9.3 → dulus-3.9.5}/plugin/recommend.py +0 -0
  175. {dulus-3.9.3 → dulus-3.9.5}/plugin/store.py +0 -0
  176. {dulus-3.9.3 → dulus-3.9.5}/plugin/types.py +0 -0
  177. {dulus-3.9.3 → dulus-3.9.5}/providers.py +0 -0
  178. {dulus-3.9.3 → dulus-3.9.5}/sandbox/README.md +0 -0
  179. {dulus-3.9.3 → dulus-3.9.5}/sandbox/__init__.py +0 -0
  180. {dulus-3.9.3 → dulus-3.9.5}/sandbox/components.json +0 -0
  181. {dulus-3.9.3 → dulus-3.9.5}/sandbox/dist/assets/index-DE51D6wI.css +0 -0
  182. {dulus-3.9.3 → dulus-3.9.5}/sandbox/dist/assets/index-DMCCNE9Y.js +0 -0
  183. {dulus-3.9.3 → dulus-3.9.5}/sandbox/dist/index.html +0 -0
  184. {dulus-3.9.3 → dulus-3.9.5}/sandbox/dist/wallpaper-default.jpg +0 -0
  185. {dulus-3.9.3 → dulus-3.9.5}/sandbox/dist/wallpapers/default.jpeg +0 -0
  186. {dulus-3.9.3 → dulus-3.9.5}/sandbox/dist/wallpapers/light.jpeg +0 -0
  187. {dulus-3.9.3 → dulus-3.9.5}/sandbox/dist/wallpapers/nature.jpeg +0 -0
  188. {dulus-3.9.3 → dulus-3.9.5}/sandbox/dist/wallpapers/tech.jpeg +0 -0
  189. {dulus-3.9.3 → dulus-3.9.5}/sandbox/eslint.config.js +0 -0
  190. {dulus-3.9.3 → dulus-3.9.5}/sandbox/index.html +0 -0
  191. {dulus-3.9.3 → dulus-3.9.5}/sandbox/info.md +0 -0
  192. {dulus-3.9.3 → dulus-3.9.5}/sandbox/package-lock.json +0 -0
  193. {dulus-3.9.3 → dulus-3.9.5}/sandbox/package.json +0 -0
  194. {dulus-3.9.3 → dulus-3.9.5}/sandbox/postcss.config.js +0 -0
  195. {dulus-3.9.3 → dulus-3.9.5}/sandbox/tailwind.config.js +0 -0
  196. {dulus-3.9.3 → dulus-3.9.5}/sandbox/tsconfig.app.json +0 -0
  197. {dulus-3.9.3 → dulus-3.9.5}/sandbox/tsconfig.json +0 -0
  198. {dulus-3.9.3 → dulus-3.9.5}/sandbox/tsconfig.node.json +0 -0
  199. {dulus-3.9.3 → dulus-3.9.5}/sandbox/vite.config.ts +0 -0
  200. {dulus-3.9.3 → dulus-3.9.5}/sandbox_bootstrap.py +0 -0
  201. {dulus-3.9.3 → dulus-3.9.5}/setup.cfg +0 -0
  202. {dulus-3.9.3 → dulus-3.9.5}/skill/__init__.py +0 -0
  203. {dulus-3.9.3 → dulus-3.9.5}/skill/builtin.py +0 -0
  204. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/LICENSE-obsidian-skills +0 -0
  205. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/README.md +0 -0
  206. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/defuddle/SKILL.md +0 -0
  207. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/json-canvas/SKILL.md +0 -0
  208. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/json-canvas/references/EXAMPLES.md +0 -0
  209. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/obsidian-bases/SKILL.md +0 -0
  210. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/obsidian-bases/references/FUNCTIONS_REFERENCE.md +0 -0
  211. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/obsidian-cli/SKILL.md +0 -0
  212. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/obsidian-markdown/SKILL.md +0 -0
  213. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/obsidian-markdown/references/CALLOUTS.md +0 -0
  214. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/obsidian-markdown/references/EMBEDS.md +0 -0
  215. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/obsidian-markdown/references/PROPERTIES.md +0 -0
  216. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/README.md +0 -0
  217. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/SKILL.md +0 -0
  218. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/brokers/addresses.json +0 -0
  219. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/brokers/advancedbackgroundchecks.json +0 -0
  220. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/brokers/beenverified.json +0 -0
  221. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/brokers/clustal.json +0 -0
  222. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/brokers/clustrmaps.json +0 -0
  223. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/brokers/cyberbackgroundchecks.json +0 -0
  224. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/brokers/familytreenow.json +0 -0
  225. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/brokers/fastpeoplesearch.json +0 -0
  226. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/brokers/intelius.json +0 -0
  227. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/brokers/mylife.json +0 -0
  228. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/brokers/nuwber.json +0 -0
  229. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/brokers/peekyou.json +0 -0
  230. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/brokers/peoplefinders.json +0 -0
  231. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/brokers/radaris.json +0 -0
  232. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/brokers/rehold.json +0 -0
  233. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/brokers/searchpeoplefree.json +0 -0
  234. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/brokers/socialcatfish.json +0 -0
  235. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/brokers/spokeo.json +0 -0
  236. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/brokers/thatsthem.json +0 -0
  237. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/brokers/truepeoplesearch.json +0 -0
  238. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/brokers/usphonebook.json +0 -0
  239. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/brokers/whitepages.json +0 -0
  240. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/legal/ccpa.md +0 -0
  241. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/legal/drop.md +0 -0
  242. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/legal/gdpr.md +0 -0
  243. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/methods.md +0 -0
  244. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/site-playbooks.md +0 -0
  245. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/references/state-machine.md +0 -0
  246. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/scripts/autopilot.py +0 -0
  247. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/scripts/badbool.py +0 -0
  248. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/scripts/brokers.py +0 -0
  249. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/scripts/cdp.py +0 -0
  250. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/scripts/config.py +0 -0
  251. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/scripts/crypto.py +0 -0
  252. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/scripts/dossier.py +0 -0
  253. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/scripts/email_modes.py +0 -0
  254. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/scripts/emailer.py +0 -0
  255. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/scripts/ledger.py +0 -0
  256. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/scripts/legal.py +0 -0
  257. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/scripts/paths.py +0 -0
  258. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/scripts/pdd.py +0 -0
  259. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/scripts/registry.py +0 -0
  260. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/scripts/report.py +0 -0
  261. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/scripts/scan.py +0 -0
  262. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/scripts/storage.py +0 -0
  263. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/scripts/tiers.py +0 -0
  264. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/scripts/vectors.py +0 -0
  265. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/templates/consent/authorization.md +0 -0
  266. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/templates/emails/ccpa-authorized-agent.txt +0 -0
  267. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/templates/emails/ccpa-deletion.txt +0 -0
  268. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/templates/emails/ccpa-indirect-deletion.txt +0 -0
  269. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/templates/emails/gdpr-erasure.txt +0 -0
  270. {dulus-3.9.3 → dulus-3.9.5}/skill/bundled/unbroker/templates/emails/generic-optout.txt +0 -0
  271. {dulus-3.9.3 → dulus-3.9.5}/skill/clawhub.py +0 -0
  272. {dulus-3.9.3 → dulus-3.9.5}/skill/executor.py +0 -0
  273. {dulus-3.9.3 → dulus-3.9.5}/skill/loader.py +0 -0
  274. {dulus-3.9.3 → dulus-3.9.5}/skill/tools.py +0 -0
  275. {dulus-3.9.3 → dulus-3.9.5}/skills.py +0 -0
  276. {dulus-3.9.3 → dulus-3.9.5}/soul.py +0 -0
  277. {dulus-3.9.3 → dulus-3.9.5}/spinner.py +0 -0
  278. {dulus-3.9.3 → dulus-3.9.5}/string_utils.py +0 -0
  279. {dulus-3.9.3 → dulus-3.9.5}/subagent.py +0 -0
  280. {dulus-3.9.3 → dulus-3.9.5}/task/__init__.py +0 -0
  281. {dulus-3.9.3 → dulus-3.9.5}/task/store.py +0 -0
  282. {dulus-3.9.3 → dulus-3.9.5}/task/tools.py +0 -0
  283. {dulus-3.9.3 → dulus-3.9.5}/task/types.py +0 -0
  284. {dulus-3.9.3 → dulus-3.9.5}/tests/test_afk_yolo.py +0 -0
  285. {dulus-3.9.3 → dulus-3.9.5}/tests/test_approval_runtime.py +0 -0
  286. {dulus-3.9.3 → dulus-3.9.5}/tests/test_background_task_tools.py +0 -0
  287. {dulus-3.9.3 → dulus-3.9.5}/tests/test_background_tasks.py +0 -0
  288. {dulus-3.9.3 → dulus-3.9.5}/tests/test_checkpoint.py +0 -0
  289. {dulus-3.9.3 → dulus-3.9.5}/tests/test_clipboard_utils.py +0 -0
  290. {dulus-3.9.3 → dulus-3.9.5}/tests/test_compaction.py +0 -0
  291. {dulus-3.9.3 → dulus-3.9.5}/tests/test_diff_view.py +0 -0
  292. {dulus-3.9.3 → dulus-3.9.5}/tests/test_diff_visualization.py +0 -0
  293. {dulus-3.9.3 → dulus-3.9.5}/tests/test_display_blocks.py +0 -0
  294. {dulus-3.9.3 → dulus-3.9.5}/tests/test_export_import.py +0 -0
  295. {dulus-3.9.3 → dulus-3.9.5}/tests/test_hook_engine.py +0 -0
  296. {dulus-3.9.3 → dulus-3.9.5}/tests/test_injection_fix.py +0 -0
  297. {dulus-3.9.3 → dulus-3.9.5}/tests/test_license.py +0 -0
  298. {dulus-3.9.3 → dulus-3.9.5}/tests/test_mcp.py +0 -0
  299. {dulus-3.9.3 → dulus-3.9.5}/tests/test_memory.py +0 -0
  300. {dulus-3.9.3 → dulus-3.9.5}/tests/test_notification_manager.py +0 -0
  301. {dulus-3.9.3 → dulus-3.9.5}/tests/test_plugin.py +0 -0
  302. {dulus-3.9.3 → dulus-3.9.5}/tests/test_session_fork.py +0 -0
  303. {dulus-3.9.3 → dulus-3.9.5}/tests/test_shell_mode.py +0 -0
  304. {dulus-3.9.3 → dulus-3.9.5}/tests/test_skills.py +0 -0
  305. {dulus-3.9.3 → dulus-3.9.5}/tests/test_steer_input.py +0 -0
  306. {dulus-3.9.3 → dulus-3.9.5}/tests/test_subagent.py +0 -0
  307. {dulus-3.9.3 → dulus-3.9.5}/tests/test_task.py +0 -0
  308. {dulus-3.9.3 → dulus-3.9.5}/tests/test_telegram_buffer.py +0 -0
  309. {dulus-3.9.3 → dulus-3.9.5}/tests/test_think_tool.py +0 -0
  310. {dulus-3.9.3 → dulus-3.9.5}/tests/test_todo_tool.py +0 -0
  311. {dulus-3.9.3 → dulus-3.9.5}/tests/test_todo_visualization.py +0 -0
  312. {dulus-3.9.3 → dulus-3.9.5}/tests/test_tool_registry.py +0 -0
  313. {dulus-3.9.3 → dulus-3.9.5}/tests/test_tree_ls.py +0 -0
  314. {dulus-3.9.3 → dulus-3.9.5}/tests/test_voice.py +0 -0
  315. {dulus-3.9.3 → dulus-3.9.5}/tests/test_wire_events.py +0 -0
  316. {dulus-3.9.3 → dulus-3.9.5}/tmux_offloader.py +0 -0
  317. {dulus-3.9.3 → dulus-3.9.5}/tmux_tools.py +0 -0
  318. {dulus-3.9.3 → dulus-3.9.5}/tool_registry.py +0 -0
  319. {dulus-3.9.3 → dulus-3.9.5}/tools.py +0 -0
  320. {dulus-3.9.3 → dulus-3.9.5}/ui/__init__.py +0 -0
  321. {dulus-3.9.3 → dulus-3.9.5}/ui/input.py +0 -0
  322. {dulus-3.9.3 → dulus-3.9.5}/ui/render.py +0 -0
  323. {dulus-3.9.3 → dulus-3.9.5}/updater.py +0 -0
  324. {dulus-3.9.3 → dulus-3.9.5}/voice/__init__.py +0 -0
  325. {dulus-3.9.3 → dulus-3.9.5}/voice/audio_utils.py +0 -0
  326. {dulus-3.9.3 → dulus-3.9.5}/voice/keyterms.py +0 -0
  327. {dulus-3.9.3 → dulus-3.9.5}/voice/recorder.py +0 -0
  328. {dulus-3.9.3 → dulus-3.9.5}/voice/stt.py +0 -0
  329. {dulus-3.9.3 → dulus-3.9.5}/voice/wake_word.py +0 -0
  330. {dulus-3.9.3 → dulus-3.9.5}/webbridge/__init__.py +0 -0
  331. {dulus-3.9.3 → dulus-3.9.5}/webbridge/core.py +0 -0
  332. {dulus-3.9.3 → dulus-3.9.5}/webbridge/tools.py +0 -0
  333. {dulus-3.9.3 → dulus-3.9.5}/webchat.py +0 -0
  334. {dulus-3.9.3 → dulus-3.9.5}/webchat_server.py +0 -0
  335. {dulus-3.9.3 → dulus-3.9.5}/welcome.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dulus
3
- Version: 3.9.3
3
+ Version: 3.9.5
4
4
  Summary: Use IA as an agent without an API key. $0. Harvest your browser session for Gemini (guest, no login), Claude.ai, Claude Code, Kimi.com, Qwen, DeepSeek — drive them like an API, no per-token billing. Plus LiteLLM (100+ paid providers), local models via Ollama, /lang in 34 languages, Mesa Redonda, voice, OCR, MemPalace, embedded sandbox OS.
5
5
  Author: KevRojo
6
6
  License: GPL-3.0
@@ -198,8 +198,34 @@ def load_config() -> dict:
198
198
 
199
199
  def save_config(cfg: dict):
200
200
  CONFIG_DIR.mkdir(exist_ok=True)
201
- # Strip internal runtime keys (e.g. _run_query_callback) before saving
202
- data = {k: v for k, v in cfg.items() if not k.startswith("_")}
201
+ # Build a complete config from defaults + whatever is already on disk, THEN
202
+ # apply the runtime changes on top. This prevents catastrophic resets: if a
203
+ # caller passes a thin `cfg` (e.g. only {"lang", "user_name"} at early
204
+ # startup or from a command that rebuilt a minimal dict), we must NOT drop
205
+ # every other key the user had. Previously we wrote `cfg` verbatim, so a
206
+ # thin dict wiped the entire config down to those few keys — exactly the
207
+ # "config shrank to lang+user_name" bug. Mirror the private repo's logic.
208
+ data = dict(DEFAULTS)
209
+ if CONFIG_FILE.exists():
210
+ try:
211
+ existing = json.loads(CONFIG_FILE.read_text(encoding="utf-8"))
212
+ if isinstance(existing, dict):
213
+ data.update(existing)
214
+ except Exception:
215
+ # Corrupt on-disk config: fall back to the last-known-good backup so
216
+ # we still don't lose the user's keys on this save.
217
+ try:
218
+ backup = CONFIG_FILE.with_suffix(".json.bak")
219
+ if backup.exists():
220
+ bdata = json.loads(backup.read_text(encoding="utf-8"))
221
+ if isinstance(bdata, dict):
222
+ data.update(bdata)
223
+ except Exception:
224
+ pass
225
+ # Strip internal runtime keys (e.g. _run_query_callback), then apply the
226
+ # caller's runtime changes on top of the merged base.
227
+ runtime = {k: v for k, v in cfg.items() if not k.startswith("_")}
228
+ data.update(runtime)
203
229
  # Encrypt API keys before saving
204
230
  data = _secure_keys(dict(data))
205
231
  payload = json.dumps(data, indent=2)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dulus
3
- Version: 3.9.3
3
+ Version: 3.9.5
4
4
  Summary: Use IA as an agent without an API key. $0. Harvest your browser session for Gemini (guest, no login), Claude.ai, Claude Code, Kimi.com, Qwen, DeepSeek — drive them like an API, no per-token billing. Plus LiteLLM (100+ paid providers), local models via Ollama, /lang in 34 languages, Mesa Redonda, voice, OCR, MemPalace, embedded sandbox OS.
5
5
  Author: KevRojo
6
6
  License: GPL-3.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "dulus"
7
- version = "3.9.3"
7
+ version = "3.9.5"
8
8
  description = "Use IA as an agent without an API key. $0. Harvest your browser session for Gemini (guest, no login), Claude.ai, Claude Code, Kimi.com, Qwen, DeepSeek — drive them like an API, no per-token billing. Plus LiteLLM (100+ paid providers), local models via Ollama, /lang in 34 languages, Mesa Redonda, voice, OCR, MemPalace, embedded sandbox OS."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -33,16 +33,45 @@ _stop_event = threading.Event()
33
33
  _say_lock = threading.Lock()
34
34
 
35
35
  def _watch_for_cancel() -> None:
36
- """Background thread: set _stop_event if user presses 'c'."""
36
+ """Background thread: set _stop_event if user presses 'c'.
37
+
38
+ Two detection paths, because one alone is unreliable:
39
+ 1. msvcrt.kbhit() — only sees keys when the raw console owns stdin.
40
+ When prompt_toolkit (the fancy REPL input) is active, IT consumes
41
+ the keystroke first and msvcrt never sees the 'c' — which is why
42
+ cancel "sometimes didn't work" and you had to wait out the audio.
43
+ 2. GetAsyncKeyState(VK 'C') — reads the PHYSICAL key state straight
44
+ from the OS, regardless of who owns stdin. Edge-detected (up→down)
45
+ so a held key doesn't retrigger.
46
+ Also sleeps 30ms per iteration — the old loop busy-spun at 100% CPU.
47
+ """
37
48
  try:
38
49
  import msvcrt
50
+ try:
51
+ import ctypes
52
+ _user32 = ctypes.windll.user32
53
+ except Exception:
54
+ _user32 = None
55
+ VK_C = 0x43
56
+ was_down = bool(_user32 and (_user32.GetAsyncKeyState(VK_C) & 0x8000))
39
57
  while not _stop_event.is_set():
58
+ # Path 1: classic console read (works when no prompt is active).
40
59
  if msvcrt.kbhit():
41
60
  ch = msvcrt.getwch()
42
61
  if ch.lower() == 'c':
43
62
  _stop_event.set()
44
63
  print("\n ⏹ TTS stopped.", flush=True)
45
64
  return
65
+ # Path 2: physical key state — catches the press even when
66
+ # prompt_toolkit swallowed the stdin byte.
67
+ if _user32 is not None:
68
+ is_down = bool(_user32.GetAsyncKeyState(VK_C) & 0x8000)
69
+ if is_down and not was_down:
70
+ _stop_event.set()
71
+ print("\n ⏹ TTS stopped.", flush=True)
72
+ return
73
+ was_down = is_down
74
+ time.sleep(0.03)
46
75
  except Exception:
47
76
  pass
48
77
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes