dulus 3.3.4__tar.gz → 3.5.0__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 (333) hide show
  1. {dulus-3.3.4 → dulus-3.5.0}/MANIFEST.in +3 -0
  2. dulus-3.5.0/PKG-INFO +272 -0
  3. dulus-3.5.0/README.md +207 -0
  4. dulus-3.5.0/analytics.py +144 -0
  5. {dulus-3.3.4 → dulus-3.5.0}/docs/index.html +30 -9
  6. {dulus-3.3.4 → dulus-3.5.0}/docs/news.md +2 -0
  7. dulus-3.5.0/dulus.egg-info/PKG-INFO +272 -0
  8. {dulus-3.3.4 → dulus-3.5.0}/dulus.egg-info/SOURCES.txt +70 -0
  9. {dulus-3.3.4 → dulus-3.5.0}/dulus.egg-info/top_level.txt +3 -0
  10. {dulus-3.3.4 → dulus-3.5.0}/dulus.py +169 -1
  11. dulus-3.5.0/dulus_gui_web.py +825 -0
  12. dulus-3.5.0/gui/dulus_orchestrator/App.tsx +197 -0
  13. dulus-3.5.0/gui/dulus_orchestrator/THIRD_PARTY_NOTICES.md +10 -0
  14. dulus-3.5.0/gui/dulus_orchestrator/dist/index.html +189 -0
  15. dulus-3.5.0/gui/dulus_orchestrator/dist/standalone.html +189 -0
  16. dulus-3.5.0/gui/dulus_orchestrator/index.html +121 -0
  17. dulus-3.5.0/gui/dulus_orchestrator/index.tsx +17 -0
  18. dulus-3.5.0/gui/dulus_orchestrator/metadata.json +7 -0
  19. dulus-3.5.0/gui/dulus_orchestrator/package-lock.json +3143 -0
  20. dulus-3.5.0/gui/dulus_orchestrator/package.json +30 -0
  21. dulus-3.5.0/gui/dulus_orchestrator/types.ts +169 -0
  22. dulus-3.5.0/gui/dulus_orchestrator/utils.ts +75 -0
  23. dulus-3.5.0/gui/dulus_orchestrator/vertex-ai-proxy-interceptor.js +155 -0
  24. dulus-3.5.0/gui/dulus_orchestrator/vite.config.ts +44 -0
  25. {dulus-3.3.4 → dulus-3.5.0}/providers.py +346 -16
  26. {dulus-3.3.4 → dulus-3.5.0}/pyproject.toml +10 -1
  27. {dulus-3.3.4 → dulus-3.5.0}/skill/bundled/README.md +16 -0
  28. dulus-3.5.0/skill/bundled/unbroker/README.md +168 -0
  29. dulus-3.5.0/skill/bundled/unbroker/SKILL.md +317 -0
  30. dulus-3.5.0/skill/bundled/unbroker/references/brokers/addresses.json +52 -0
  31. dulus-3.5.0/skill/bundled/unbroker/references/brokers/advancedbackgroundchecks.json +50 -0
  32. dulus-3.5.0/skill/bundled/unbroker/references/brokers/beenverified.json +56 -0
  33. dulus-3.5.0/skill/bundled/unbroker/references/brokers/clustal.json +47 -0
  34. dulus-3.5.0/skill/bundled/unbroker/references/brokers/clustrmaps.json +52 -0
  35. dulus-3.5.0/skill/bundled/unbroker/references/brokers/cyberbackgroundchecks.json +53 -0
  36. dulus-3.5.0/skill/bundled/unbroker/references/brokers/familytreenow.json +50 -0
  37. dulus-3.5.0/skill/bundled/unbroker/references/brokers/fastpeoplesearch.json +44 -0
  38. dulus-3.5.0/skill/bundled/unbroker/references/brokers/intelius.json +99 -0
  39. dulus-3.5.0/skill/bundled/unbroker/references/brokers/mylife.json +35 -0
  40. dulus-3.5.0/skill/bundled/unbroker/references/brokers/nuwber.json +52 -0
  41. dulus-3.5.0/skill/bundled/unbroker/references/brokers/peekyou.json +53 -0
  42. dulus-3.5.0/skill/bundled/unbroker/references/brokers/peoplefinders.json +53 -0
  43. dulus-3.5.0/skill/bundled/unbroker/references/brokers/radaris.json +58 -0
  44. dulus-3.5.0/skill/bundled/unbroker/references/brokers/rehold.json +48 -0
  45. dulus-3.5.0/skill/bundled/unbroker/references/brokers/searchpeoplefree.json +53 -0
  46. dulus-3.5.0/skill/bundled/unbroker/references/brokers/socialcatfish.json +52 -0
  47. dulus-3.5.0/skill/bundled/unbroker/references/brokers/spokeo.json +56 -0
  48. dulus-3.5.0/skill/bundled/unbroker/references/brokers/thatsthem.json +46 -0
  49. dulus-3.5.0/skill/bundled/unbroker/references/brokers/truepeoplesearch.json +44 -0
  50. dulus-3.5.0/skill/bundled/unbroker/references/brokers/usphonebook.json +53 -0
  51. dulus-3.5.0/skill/bundled/unbroker/references/brokers/whitepages.json +57 -0
  52. dulus-3.5.0/skill/bundled/unbroker/references/legal/ccpa.md +27 -0
  53. dulus-3.5.0/skill/bundled/unbroker/references/legal/drop.md +34 -0
  54. dulus-3.5.0/skill/bundled/unbroker/references/legal/gdpr.md +20 -0
  55. dulus-3.5.0/skill/bundled/unbroker/references/methods.md +361 -0
  56. dulus-3.5.0/skill/bundled/unbroker/references/site-playbooks.md +56 -0
  57. dulus-3.5.0/skill/bundled/unbroker/references/state-machine.md +56 -0
  58. dulus-3.5.0/skill/bundled/unbroker/scripts/autopilot.py +417 -0
  59. dulus-3.5.0/skill/bundled/unbroker/scripts/badbool.py +177 -0
  60. dulus-3.5.0/skill/bundled/unbroker/scripts/brokers.py +77 -0
  61. dulus-3.5.0/skill/bundled/unbroker/scripts/cdp.py +159 -0
  62. dulus-3.5.0/skill/bundled/unbroker/scripts/config.py +144 -0
  63. dulus-3.5.0/skill/bundled/unbroker/scripts/crypto.py +88 -0
  64. dulus-3.5.0/skill/bundled/unbroker/scripts/dossier.py +135 -0
  65. dulus-3.5.0/skill/bundled/unbroker/scripts/email_modes.py +76 -0
  66. dulus-3.5.0/skill/bundled/unbroker/scripts/emailer.py +342 -0
  67. dulus-3.5.0/skill/bundled/unbroker/scripts/ledger.py +170 -0
  68. dulus-3.5.0/skill/bundled/unbroker/scripts/legal.py +63 -0
  69. dulus-3.5.0/skill/bundled/unbroker/scripts/paths.py +84 -0
  70. dulus-3.5.0/skill/bundled/unbroker/scripts/pdd.py +914 -0
  71. dulus-3.5.0/skill/bundled/unbroker/scripts/registry.py +293 -0
  72. dulus-3.5.0/skill/bundled/unbroker/scripts/report.py +161 -0
  73. dulus-3.5.0/skill/bundled/unbroker/scripts/scan.py +32 -0
  74. dulus-3.5.0/skill/bundled/unbroker/scripts/storage.py +138 -0
  75. dulus-3.5.0/skill/bundled/unbroker/scripts/tiers.py +283 -0
  76. dulus-3.5.0/skill/bundled/unbroker/scripts/vectors.py +53 -0
  77. dulus-3.5.0/skill/bundled/unbroker/templates/consent/authorization.md +15 -0
  78. dulus-3.5.0/skill/bundled/unbroker/templates/emails/ccpa-authorized-agent.txt +24 -0
  79. dulus-3.5.0/skill/bundled/unbroker/templates/emails/ccpa-deletion.txt +22 -0
  80. dulus-3.5.0/skill/bundled/unbroker/templates/emails/ccpa-indirect-deletion.txt +30 -0
  81. dulus-3.5.0/skill/bundled/unbroker/templates/emails/gdpr-erasure.txt +19 -0
  82. dulus-3.5.0/skill/bundled/unbroker/templates/emails/generic-optout.txt +15 -0
  83. {dulus-3.3.4 → dulus-3.5.0}/webchat_server.py +59 -0
  84. dulus-3.3.4/PKG-INFO +0 -817
  85. dulus-3.3.4/README.md +0 -752
  86. dulus-3.3.4/dulus.egg-info/PKG-INFO +0 -817
  87. {dulus-3.3.4 → dulus-3.5.0}/LICENSE +0 -0
  88. {dulus-3.3.4 → dulus-3.5.0}/agent.py +0 -0
  89. {dulus-3.3.4 → dulus-3.5.0}/backend/__init__.py +0 -0
  90. {dulus-3.3.4 → dulus-3.5.0}/backend/agents_bridge.py +0 -0
  91. {dulus-3.3.4 → dulus-3.5.0}/backend/compressor.py +0 -0
  92. {dulus-3.3.4 → dulus-3.5.0}/backend/context.py +0 -0
  93. {dulus-3.3.4 → dulus-3.5.0}/backend/githook.py +0 -0
  94. {dulus-3.3.4 → dulus-3.5.0}/backend/marketplace.py +0 -0
  95. {dulus-3.3.4 → dulus-3.5.0}/backend/mempalace_bridge.py +0 -0
  96. {dulus-3.3.4 → dulus-3.5.0}/backend/personas.py +0 -0
  97. {dulus-3.3.4 → dulus-3.5.0}/backend/plugins.py +0 -0
  98. {dulus-3.3.4 → dulus-3.5.0}/backend/server.py +0 -0
  99. {dulus-3.3.4 → dulus-3.5.0}/backend/tasks.py +0 -0
  100. {dulus-3.3.4 → dulus-3.5.0}/batch_api.py +0 -0
  101. {dulus-3.3.4 → dulus-3.5.0}/checkpoint/__init__.py +0 -0
  102. {dulus-3.3.4 → dulus-3.5.0}/checkpoint/hooks.py +0 -0
  103. {dulus-3.3.4 → dulus-3.5.0}/checkpoint/store.py +0 -0
  104. {dulus-3.3.4 → dulus-3.5.0}/checkpoint/types.py +0 -0
  105. {dulus-3.3.4 → dulus-3.5.0}/claude_code_watcher.py +0 -0
  106. {dulus-3.3.4 → dulus-3.5.0}/clipboard_utils.py +0 -0
  107. {dulus-3.3.4 → dulus-3.5.0}/cloudsave.py +0 -0
  108. {dulus-3.3.4 → dulus-3.5.0}/common.py +0 -0
  109. {dulus-3.3.4 → dulus-3.5.0}/compaction.py +0 -0
  110. {dulus-3.3.4 → dulus-3.5.0}/config.py +0 -0
  111. {dulus-3.3.4 → dulus-3.5.0}/context.py +0 -0
  112. {dulus-3.3.4 → dulus-3.5.0}/data/__init__.py +0 -0
  113. {dulus-3.3.4 → dulus-3.5.0}/data/active_persona.json +0 -0
  114. {dulus-3.3.4 → dulus-3.5.0}/data/marketplace.json +0 -0
  115. {dulus-3.3.4 → dulus-3.5.0}/data/personas.json +0 -0
  116. {dulus-3.3.4 → dulus-3.5.0}/data/plugins/__init__.py +0 -0
  117. {dulus-3.3.4 → dulus-3.5.0}/data/plugins/composio/__init__.py +0 -0
  118. {dulus-3.3.4 → dulus-3.5.0}/data/plugins/composio/composio_plugin/__init__.py +0 -0
  119. {dulus-3.3.4 → dulus-3.5.0}/data/plugins/composio/composio_plugin/session_manager.py +0 -0
  120. {dulus-3.3.4 → dulus-3.5.0}/data/plugins/composio/composio_plugin/tool_generator.py +0 -0
  121. {dulus-3.3.4 → dulus-3.5.0}/data/plugins/composio/plugin.json +0 -0
  122. {dulus-3.3.4 → dulus-3.5.0}/data/plugins/composio/plugin_tool.py +0 -0
  123. {dulus-3.3.4 → dulus-3.5.0}/data/tasks.json +0 -0
  124. {dulus-3.3.4 → dulus-3.5.0}/docs/API.md +0 -0
  125. {dulus-3.3.4 → dulus-3.5.0}/docs/BRAND_GUIDE.md +0 -0
  126. {dulus-3.3.4 → dulus-3.5.0}/docs/CHANGELOG.md +0 -0
  127. {dulus-3.3.4 → dulus-3.5.0}/docs/CONTRIBUTING.md +0 -0
  128. {dulus-3.3.4 → dulus-3.5.0}/docs/DEPLOYMENT.md +0 -0
  129. {dulus-3.3.4 → dulus-3.5.0}/docs/Dulus_AI_Whitepaper_(v2.0).pdf +0 -0
  130. {dulus-3.3.4 → dulus-3.5.0}/docs/FAQ.md +0 -0
  131. {dulus-3.3.4 → dulus-3.5.0}/docs/GETTING_STARTED.md +0 -0
  132. {dulus-3.3.4 → dulus-3.5.0}/docs/INVESTOR_BRIEF.md +0 -0
  133. {dulus-3.3.4 → dulus-3.5.0}/docs/README.md +0 -0
  134. {dulus-3.3.4 → dulus-3.5.0}/docs/README_AR.md +0 -0
  135. {dulus-3.3.4 → dulus-3.5.0}/docs/README_EN.md +0 -0
  136. {dulus-3.3.4 → dulus-3.5.0}/docs/README_ES.md +0 -0
  137. {dulus-3.3.4 → dulus-3.5.0}/docs/README_FR.md +0 -0
  138. {dulus-3.3.4 → dulus-3.5.0}/docs/README_JA.md +0 -0
  139. {dulus-3.3.4 → dulus-3.5.0}/docs/README_KO.md +0 -0
  140. {dulus-3.3.4 → dulus-3.5.0}/docs/README_PT.md +0 -0
  141. {dulus-3.3.4 → dulus-3.5.0}/docs/README_RU.md +0 -0
  142. {dulus-3.3.4 → dulus-3.5.0}/docs/README_ZH.md +0 -0
  143. {dulus-3.3.4 → dulus-3.5.0}/docs/SECURITY.md +0 -0
  144. {dulus-3.3.4 → dulus-3.5.0}/docs/__init__.py +0 -0
  145. {dulus-3.3.4 → dulus-3.5.0}/docs/api.html +0 -0
  146. {dulus-3.3.4 → dulus-3.5.0}/docs/architecture.md +0 -0
  147. {dulus-3.3.4 → dulus-3.5.0}/docs/azure-speech-template.json +0 -0
  148. {dulus-3.3.4 → dulus-3.5.0}/docs/dashboard/index.html +0 -0
  149. {dulus-3.3.4 → dulus-3.5.0}/docs/divider.svg +0 -0
  150. {dulus-3.3.4 → dulus-3.5.0}/docs/dulus-bird.png +0 -0
  151. {dulus-3.3.4 → dulus-3.5.0}/docs/generate.py +0 -0
  152. {dulus-3.3.4 → dulus-3.5.0}/docs/hero.svg +0 -0
  153. {dulus-3.3.4 → dulus-3.5.0}/docs/nvidia-models.svg +0 -0
  154. {dulus-3.3.4 → dulus-3.5.0}/docs/particle-playground.html +0 -0
  155. {dulus-3.3.4 → dulus-3.5.0}/docs/personas/index.html +0 -0
  156. {dulus-3.3.4 → dulus-3.5.0}/docs/poetry-banner.png +0 -0
  157. {dulus-3.3.4 → dulus-3.5.0}/docs/preview.html +0 -0
  158. {dulus-3.3.4 → dulus-3.5.0}/docs/sec-agents.svg +0 -0
  159. {dulus-3.3.4 → dulus-3.5.0}/docs/sec-brainstorm.svg +0 -0
  160. {dulus-3.3.4 → dulus-3.5.0}/docs/sec-bridges.svg +0 -0
  161. {dulus-3.3.4 → dulus-3.5.0}/docs/sec-features.svg +0 -0
  162. {dulus-3.3.4 → dulus-3.5.0}/docs/sec-freetier.svg +0 -0
  163. {dulus-3.3.4 → dulus-3.5.0}/docs/sec-memory.svg +0 -0
  164. {dulus-3.3.4 → dulus-3.5.0}/docs/sec-models.svg +0 -0
  165. {dulus-3.3.4 → dulus-3.5.0}/docs/sec-perms.svg +0 -0
  166. {dulus-3.3.4 → dulus-3.5.0}/docs/sec-plugins.svg +0 -0
  167. {dulus-3.3.4 → dulus-3.5.0}/docs/sec-quickstart.svg +0 -0
  168. {dulus-3.3.4 → dulus-3.5.0}/docs/sec-ssj.svg +0 -0
  169. {dulus-3.3.4 → dulus-3.5.0}/docs/spinners.svg +0 -0
  170. {dulus-3.3.4 → dulus-3.5.0}/docs/split-pane.svg +0 -0
  171. {dulus-3.3.4 → dulus-3.5.0}/docs/terminal-boot.svg +0 -0
  172. {dulus-3.3.4 → dulus-3.5.0}/dulus.egg-info/dependency_links.txt +0 -0
  173. {dulus-3.3.4 → dulus-3.5.0}/dulus.egg-info/entry_points.txt +0 -0
  174. {dulus-3.3.4 → dulus-3.5.0}/dulus.egg-info/requires.txt +0 -0
  175. {dulus-3.3.4 → dulus-3.5.0}/dulus_gui.py +0 -0
  176. {dulus-3.3.4 → dulus-3.5.0}/dulus_mcp/__init__.py +0 -0
  177. {dulus-3.3.4 → dulus-3.5.0}/dulus_mcp/client.py +0 -0
  178. {dulus-3.3.4 → dulus-3.5.0}/dulus_mcp/config.py +0 -0
  179. {dulus-3.3.4 → dulus-3.5.0}/dulus_mcp/tools.py +0 -0
  180. {dulus-3.3.4 → dulus-3.5.0}/dulus_mcp/types.py +0 -0
  181. {dulus-3.3.4 → dulus-3.5.0}/dulus_tools/__init__.py +0 -0
  182. {dulus-3.3.4 → dulus-3.5.0}/dulus_tools/add_dir_manager.py +0 -0
  183. {dulus-3.3.4 → dulus-3.5.0}/dulus_tools/afk_mode.py +0 -0
  184. {dulus-3.3.4 → dulus-3.5.0}/dulus_tools/approval_runtime.py +0 -0
  185. {dulus-3.3.4 → dulus-3.5.0}/dulus_tools/background_tasks.py +0 -0
  186. {dulus-3.3.4 → dulus-3.5.0}/dulus_tools/clipboard_utils.py +0 -0
  187. {dulus-3.3.4 → dulus-3.5.0}/dulus_tools/diff_visualizer.py +0 -0
  188. {dulus-3.3.4 → dulus-3.5.0}/dulus_tools/export_import.py +0 -0
  189. {dulus-3.3.4 → dulus-3.5.0}/dulus_tools/hook_engine.py +0 -0
  190. {dulus-3.3.4 → dulus-3.5.0}/dulus_tools/notification_manager.py +0 -0
  191. {dulus-3.3.4 → dulus-3.5.0}/dulus_tools/session_fork.py +0 -0
  192. {dulus-3.3.4 → dulus-3.5.0}/dulus_tools/shell_mode.py +0 -0
  193. {dulus-3.3.4 → dulus-3.5.0}/dulus_tools/todo_visualizer.py +0 -0
  194. {dulus-3.3.4 → dulus-3.5.0}/dulus_tools/wire_events.py +0 -0
  195. {dulus-3.3.4 → dulus-3.5.0}/dulus_tools/yolo_mode.py +0 -0
  196. {dulus-3.3.4 → dulus-3.5.0}/governance.py +0 -0
  197. {dulus-3.3.4 → dulus-3.5.0}/gui/__init__.py +0 -0
  198. {dulus-3.3.4 → dulus-3.5.0}/gui/agent_bridge.py +0 -0
  199. {dulus-3.3.4 → dulus-3.5.0}/gui/chat_widget.py +0 -0
  200. {dulus-3.3.4 → dulus-3.5.0}/gui/main_window.py +0 -0
  201. {dulus-3.3.4 → dulus-3.5.0}/gui/personas.py +0 -0
  202. {dulus-3.3.4 → dulus-3.5.0}/gui/sandbox_server.py +0 -0
  203. {dulus-3.3.4 → dulus-3.5.0}/gui/session_utils.py +0 -0
  204. {dulus-3.3.4 → dulus-3.5.0}/gui/settings_dialog.py +0 -0
  205. {dulus-3.3.4 → dulus-3.5.0}/gui/sidebar.py +0 -0
  206. {dulus-3.3.4 → dulus-3.5.0}/gui/tasks_view.py +0 -0
  207. {dulus-3.3.4 → dulus-3.5.0}/gui/themes.py +0 -0
  208. {dulus-3.3.4 → dulus-3.5.0}/gui/tool_panel.py +0 -0
  209. {dulus-3.3.4 → dulus-3.5.0}/input.py +0 -0
  210. {dulus-3.3.4 → dulus-3.5.0}/license_manager.py +0 -0
  211. {dulus-3.3.4 → dulus-3.5.0}/memory/__init__.py +0 -0
  212. {dulus-3.3.4 → dulus-3.5.0}/memory/audit.py +0 -0
  213. {dulus-3.3.4 → dulus-3.5.0}/memory/consolidator.py +0 -0
  214. {dulus-3.3.4 → dulus-3.5.0}/memory/context.py +0 -0
  215. {dulus-3.3.4 → dulus-3.5.0}/memory/offload.py +0 -0
  216. {dulus-3.3.4 → dulus-3.5.0}/memory/palace.py +0 -0
  217. {dulus-3.3.4 → dulus-3.5.0}/memory/scan.py +0 -0
  218. {dulus-3.3.4 → dulus-3.5.0}/memory/sessions.py +0 -0
  219. {dulus-3.3.4 → dulus-3.5.0}/memory/store.py +0 -0
  220. {dulus-3.3.4 → dulus-3.5.0}/memory/tools.py +0 -0
  221. {dulus-3.3.4 → dulus-3.5.0}/memory/types.py +0 -0
  222. {dulus-3.3.4 → dulus-3.5.0}/memory/vector_search.py +0 -0
  223. {dulus-3.3.4 → dulus-3.5.0}/multi_agent/__init__.py +0 -0
  224. {dulus-3.3.4 → dulus-3.5.0}/multi_agent/subagent.py +0 -0
  225. {dulus-3.3.4 → dulus-3.5.0}/multi_agent/tools.py +0 -0
  226. {dulus-3.3.4 → dulus-3.5.0}/offload_helper.py +0 -0
  227. {dulus-3.3.4 → dulus-3.5.0}/personality_config.py +0 -0
  228. {dulus-3.3.4 → dulus-3.5.0}/plugin/__init__.py +0 -0
  229. {dulus-3.3.4 → dulus-3.5.0}/plugin/autoadapter.py +0 -0
  230. {dulus-3.3.4 → dulus-3.5.0}/plugin/loader.py +0 -0
  231. {dulus-3.3.4 → dulus-3.5.0}/plugin/recommend.py +0 -0
  232. {dulus-3.3.4 → dulus-3.5.0}/plugin/store.py +0 -0
  233. {dulus-3.3.4 → dulus-3.5.0}/plugin/types.py +0 -0
  234. {dulus-3.3.4 → dulus-3.5.0}/sandbox/README.md +0 -0
  235. {dulus-3.3.4 → dulus-3.5.0}/sandbox/__init__.py +0 -0
  236. {dulus-3.3.4 → dulus-3.5.0}/sandbox/components.json +0 -0
  237. {dulus-3.3.4 → dulus-3.5.0}/sandbox/dist/assets/index-DE51D6wI.css +0 -0
  238. {dulus-3.3.4 → dulus-3.5.0}/sandbox/dist/assets/index-DMCCNE9Y.js +0 -0
  239. {dulus-3.3.4 → dulus-3.5.0}/sandbox/dist/index.html +0 -0
  240. {dulus-3.3.4 → dulus-3.5.0}/sandbox/dist/wallpaper-default.jpg +0 -0
  241. {dulus-3.3.4 → dulus-3.5.0}/sandbox/dist/wallpapers/default.jpeg +0 -0
  242. {dulus-3.3.4 → dulus-3.5.0}/sandbox/dist/wallpapers/light.jpeg +0 -0
  243. {dulus-3.3.4 → dulus-3.5.0}/sandbox/dist/wallpapers/nature.jpeg +0 -0
  244. {dulus-3.3.4 → dulus-3.5.0}/sandbox/dist/wallpapers/tech.jpeg +0 -0
  245. {dulus-3.3.4 → dulus-3.5.0}/sandbox/eslint.config.js +0 -0
  246. {dulus-3.3.4 → dulus-3.5.0}/sandbox/index.html +0 -0
  247. {dulus-3.3.4 → dulus-3.5.0}/sandbox/info.md +0 -0
  248. {dulus-3.3.4 → dulus-3.5.0}/sandbox/package-lock.json +0 -0
  249. {dulus-3.3.4 → dulus-3.5.0}/sandbox/package.json +0 -0
  250. {dulus-3.3.4 → dulus-3.5.0}/sandbox/postcss.config.js +0 -0
  251. {dulus-3.3.4 → dulus-3.5.0}/sandbox/tailwind.config.js +0 -0
  252. {dulus-3.3.4 → dulus-3.5.0}/sandbox/tsconfig.app.json +0 -0
  253. {dulus-3.3.4 → dulus-3.5.0}/sandbox/tsconfig.json +0 -0
  254. {dulus-3.3.4 → dulus-3.5.0}/sandbox/tsconfig.node.json +0 -0
  255. {dulus-3.3.4 → dulus-3.5.0}/sandbox/vite.config.ts +0 -0
  256. {dulus-3.3.4 → dulus-3.5.0}/sandbox_bootstrap.py +0 -0
  257. {dulus-3.3.4 → dulus-3.5.0}/setup.cfg +0 -0
  258. {dulus-3.3.4 → dulus-3.5.0}/skill/__init__.py +0 -0
  259. {dulus-3.3.4 → dulus-3.5.0}/skill/builtin.py +0 -0
  260. {dulus-3.3.4 → dulus-3.5.0}/skill/bundled/LICENSE-obsidian-skills +0 -0
  261. {dulus-3.3.4 → dulus-3.5.0}/skill/bundled/defuddle/SKILL.md +0 -0
  262. {dulus-3.3.4 → dulus-3.5.0}/skill/bundled/json-canvas/SKILL.md +0 -0
  263. {dulus-3.3.4 → dulus-3.5.0}/skill/bundled/json-canvas/references/EXAMPLES.md +0 -0
  264. {dulus-3.3.4 → dulus-3.5.0}/skill/bundled/obsidian-bases/SKILL.md +0 -0
  265. {dulus-3.3.4 → dulus-3.5.0}/skill/bundled/obsidian-bases/references/FUNCTIONS_REFERENCE.md +0 -0
  266. {dulus-3.3.4 → dulus-3.5.0}/skill/bundled/obsidian-cli/SKILL.md +0 -0
  267. {dulus-3.3.4 → dulus-3.5.0}/skill/bundled/obsidian-markdown/SKILL.md +0 -0
  268. {dulus-3.3.4 → dulus-3.5.0}/skill/bundled/obsidian-markdown/references/CALLOUTS.md +0 -0
  269. {dulus-3.3.4 → dulus-3.5.0}/skill/bundled/obsidian-markdown/references/EMBEDS.md +0 -0
  270. {dulus-3.3.4 → dulus-3.5.0}/skill/bundled/obsidian-markdown/references/PROPERTIES.md +0 -0
  271. {dulus-3.3.4 → dulus-3.5.0}/skill/clawhub.py +0 -0
  272. {dulus-3.3.4 → dulus-3.5.0}/skill/executor.py +0 -0
  273. {dulus-3.3.4 → dulus-3.5.0}/skill/loader.py +0 -0
  274. {dulus-3.3.4 → dulus-3.5.0}/skill/tools.py +0 -0
  275. {dulus-3.3.4 → dulus-3.5.0}/skills.py +0 -0
  276. {dulus-3.3.4 → dulus-3.5.0}/soul.py +0 -0
  277. {dulus-3.3.4 → dulus-3.5.0}/spinner.py +0 -0
  278. {dulus-3.3.4 → dulus-3.5.0}/string_utils.py +0 -0
  279. {dulus-3.3.4 → dulus-3.5.0}/subagent.py +0 -0
  280. {dulus-3.3.4 → dulus-3.5.0}/task/__init__.py +0 -0
  281. {dulus-3.3.4 → dulus-3.5.0}/task/store.py +0 -0
  282. {dulus-3.3.4 → dulus-3.5.0}/task/tools.py +0 -0
  283. {dulus-3.3.4 → dulus-3.5.0}/task/types.py +0 -0
  284. {dulus-3.3.4 → dulus-3.5.0}/tests/test_afk_yolo.py +0 -0
  285. {dulus-3.3.4 → dulus-3.5.0}/tests/test_approval_runtime.py +0 -0
  286. {dulus-3.3.4 → dulus-3.5.0}/tests/test_background_task_tools.py +0 -0
  287. {dulus-3.3.4 → dulus-3.5.0}/tests/test_background_tasks.py +0 -0
  288. {dulus-3.3.4 → dulus-3.5.0}/tests/test_checkpoint.py +0 -0
  289. {dulus-3.3.4 → dulus-3.5.0}/tests/test_clipboard_utils.py +0 -0
  290. {dulus-3.3.4 → dulus-3.5.0}/tests/test_compaction.py +0 -0
  291. {dulus-3.3.4 → dulus-3.5.0}/tests/test_diff_view.py +0 -0
  292. {dulus-3.3.4 → dulus-3.5.0}/tests/test_diff_visualization.py +0 -0
  293. {dulus-3.3.4 → dulus-3.5.0}/tests/test_display_blocks.py +0 -0
  294. {dulus-3.3.4 → dulus-3.5.0}/tests/test_export_import.py +0 -0
  295. {dulus-3.3.4 → dulus-3.5.0}/tests/test_hook_engine.py +0 -0
  296. {dulus-3.3.4 → dulus-3.5.0}/tests/test_injection_fix.py +0 -0
  297. {dulus-3.3.4 → dulus-3.5.0}/tests/test_license.py +0 -0
  298. {dulus-3.3.4 → dulus-3.5.0}/tests/test_mcp.py +0 -0
  299. {dulus-3.3.4 → dulus-3.5.0}/tests/test_memory.py +0 -0
  300. {dulus-3.3.4 → dulus-3.5.0}/tests/test_notification_manager.py +0 -0
  301. {dulus-3.3.4 → dulus-3.5.0}/tests/test_plugin.py +0 -0
  302. {dulus-3.3.4 → dulus-3.5.0}/tests/test_session_fork.py +0 -0
  303. {dulus-3.3.4 → dulus-3.5.0}/tests/test_shell_mode.py +0 -0
  304. {dulus-3.3.4 → dulus-3.5.0}/tests/test_skills.py +0 -0
  305. {dulus-3.3.4 → dulus-3.5.0}/tests/test_steer_input.py +0 -0
  306. {dulus-3.3.4 → dulus-3.5.0}/tests/test_subagent.py +0 -0
  307. {dulus-3.3.4 → dulus-3.5.0}/tests/test_task.py +0 -0
  308. {dulus-3.3.4 → dulus-3.5.0}/tests/test_telegram_buffer.py +0 -0
  309. {dulus-3.3.4 → dulus-3.5.0}/tests/test_think_tool.py +0 -0
  310. {dulus-3.3.4 → dulus-3.5.0}/tests/test_todo_tool.py +0 -0
  311. {dulus-3.3.4 → dulus-3.5.0}/tests/test_todo_visualization.py +0 -0
  312. {dulus-3.3.4 → dulus-3.5.0}/tests/test_tool_registry.py +0 -0
  313. {dulus-3.3.4 → dulus-3.5.0}/tests/test_voice.py +0 -0
  314. {dulus-3.3.4 → dulus-3.5.0}/tests/test_wire_events.py +0 -0
  315. {dulus-3.3.4 → dulus-3.5.0}/tmux_offloader.py +0 -0
  316. {dulus-3.3.4 → dulus-3.5.0}/tmux_tools.py +0 -0
  317. {dulus-3.3.4 → dulus-3.5.0}/tool_registry.py +0 -0
  318. {dulus-3.3.4 → dulus-3.5.0}/tools.py +0 -0
  319. {dulus-3.3.4 → dulus-3.5.0}/ui/__init__.py +0 -0
  320. {dulus-3.3.4 → dulus-3.5.0}/ui/input.py +0 -0
  321. {dulus-3.3.4 → dulus-3.5.0}/ui/render.py +0 -0
  322. {dulus-3.3.4 → dulus-3.5.0}/voice/__init__.py +0 -0
  323. {dulus-3.3.4 → dulus-3.5.0}/voice/audio_utils.py +0 -0
  324. {dulus-3.3.4 → dulus-3.5.0}/voice/keyterms.py +0 -0
  325. {dulus-3.3.4 → dulus-3.5.0}/voice/recorder.py +0 -0
  326. {dulus-3.3.4 → dulus-3.5.0}/voice/stt.py +0 -0
  327. {dulus-3.3.4 → dulus-3.5.0}/voice/tts.py +0 -0
  328. {dulus-3.3.4 → dulus-3.5.0}/voice/wake_word.py +0 -0
  329. {dulus-3.3.4 → dulus-3.5.0}/webbridge/__init__.py +0 -0
  330. {dulus-3.3.4 → dulus-3.5.0}/webbridge/core.py +0 -0
  331. {dulus-3.3.4 → dulus-3.5.0}/webbridge/tools.py +0 -0
  332. {dulus-3.3.4 → dulus-3.5.0}/webchat.py +0 -0
  333. {dulus-3.3.4 → dulus-3.5.0}/welcome.py +0 -0
@@ -2,6 +2,9 @@ include pyproject.toml
2
2
  recursive-include docs *
3
3
  recursive-include data *
4
4
  recursive-include sandbox/dist *
5
+ recursive-include gui/dulus_orchestrator/dist *
6
+ exclude gui/dulus_orchestrator/dist/runtime-state.js
7
+ exclude gui/dulus_orchestrator/dist/desktop-pet.html
5
8
  recursive-include webbridge *
6
9
  global-exclude __pycache__/*
7
10
  global-exclude *.pyc
dulus-3.5.0/PKG-INFO ADDED
@@ -0,0 +1,272 @@
1
+ Metadata-Version: 2.4
2
+ Name: dulus
3
+ Version: 3.5.0
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
+ Author: KevRojo
6
+ License: GPL-3.0
7
+ Project-URL: Homepage, https://github.com/KevRojo/Dulus
8
+ Project-URL: Repository, https://github.com/KevRojo/Dulus
9
+ Project-URL: Issues, https://github.com/KevRojo/Dulus/issues
10
+ Keywords: ai,cli,llm,claude,gemini,nvidia,openai,kimi,deepseek,qwen,ollama,agent,tts,voice
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
21
+ Classifier: Topic :: Terminals
22
+ Requires-Python: >=3.11
23
+ Description-Content-Type: text/markdown
24
+ License-File: LICENSE
25
+ License-File: license_manager.py
26
+ Requires-Dist: anthropic>=0.40.0
27
+ Requires-Dist: openai>=1.30.0
28
+ Requires-Dist: httpx>=0.27.0
29
+ Requires-Dist: requests>=2.31.0
30
+ Requires-Dist: rich>=13.0.0
31
+ Requires-Dist: prompt_toolkit>=3.0.0
32
+ Requires-Dist: Flask>=3.1.3
33
+ Requires-Dist: bubblewrap-cli>=1.0.0
34
+ Requires-Dist: customtkinter>=5.2.0
35
+ Requires-Dist: Pillow>=10.0.0
36
+ Requires-Dist: typing-extensions>=4.10.0
37
+ Requires-Dist: composio>=1.0.0rc2
38
+ Requires-Dist: beautifulsoup4>=4.12.0
39
+ Requires-Dist: sentry-sdk>=2.0.0
40
+ Requires-Dist: pytesseract>=0.3.10
41
+ Provides-Extra: memory
42
+ Requires-Dist: mempalace>=3.3.4; extra == "memory"
43
+ Provides-Extra: voice
44
+ Requires-Dist: sounddevice; extra == "voice"
45
+ Requires-Dist: elevenlabs>=1.0.0; extra == "voice"
46
+ Provides-Extra: webbridge
47
+ Requires-Dist: playwright>=1.40.0; extra == "webbridge"
48
+ Provides-Extra: litellm
49
+ Requires-Dist: litellm>=1.50.0; extra == "litellm"
50
+ Provides-Extra: ocr
51
+ Requires-Dist: pytesseract>=0.3.10; extra == "ocr"
52
+ Requires-Dist: Pillow>=10.0.0; extra == "ocr"
53
+ Provides-Extra: ocr-deep
54
+ Requires-Dist: pytesseract>=0.3.10; extra == "ocr-deep"
55
+ Requires-Dist: Pillow>=10.0.0; extra == "ocr-deep"
56
+ Requires-Dist: easyocr>=1.7.0; extra == "ocr-deep"
57
+ Provides-Extra: full
58
+ Requires-Dist: mempalace>=3.3.4; extra == "full"
59
+ Requires-Dist: sounddevice; extra == "full"
60
+ Requires-Dist: elevenlabs>=1.0.0; extra == "full"
61
+ Requires-Dist: playwright>=1.40.0; extra == "full"
62
+ Requires-Dist: litellm>=1.50.0; extra == "full"
63
+ Requires-Dist: pytesseract>=0.3.10; extra == "full"
64
+ Dynamic: license-file
65
+
66
+ # ▲ DULUS
67
+ >
68
+ > `pip install dulus` → press Enter → working IA in 30 seconds. Try it.
69
+
70
+ SET /sticky_input ON since the first run for the best experience!
71
+
72
+ <p align="center">
73
+
74
+ <img width="700" height="665" alt="mascot-hero" src="https://github.com/user-attachments/assets/8b122834-552c-4bd4-b46d-3e17deb74ab5" />
75
+
76
+ </p>
77
+
78
+ <p align="center"><i>The Dulus (Cigua Palmera) — Dominican national bird. Named after the bird, not the rocket.</i></p>
79
+
80
+ <p align="center">
81
+ <a href="#quick-start"><b>Quick Start</b></a> ·
82
+ <a href="#models"><b>Models</b></a> ·
83
+ <a href="#features"><b>Features</b></a> ·
84
+ <a href="#permissions"><b>Permissions</b></a> ·
85
+ <a href="#mcp"><b>MCP</b></a> ·
86
+ <a href="#plugins"><b>Plugins</b></a>
87
+ </p>
88
+
89
+ <p align="center">
90
+ <a href="https://pypi.org/project/dulus/"><img src="https://img.shields.io/pypi/v/dulus.svg?style=flat-square&color=ff6b1f&labelColor=07070a&label=pypi" alt="pypi"/></a>
91
+ <a href="https://pypi.org/project/dulus/"><img src="https://static.pepy.tech/badge/dulus?style=flat-square" alt="downloads"/></a>
92
+ <img src="https://img.shields.io/badge/python-3.11+-ff6b1f?style=flat-square&labelColor=07070a" alt="python"/>
93
+ <img src="https://img.shields.io/badge/license-GPLv3-ff6b1f?style=flat-square&labelColor=07070a" alt="license"/>
94
+ <img src="https://img.shields.io/badge/version-v3.3.3-ff6b1f?style=flat-square&labelColor=07070a" alt="version"/>
95
+ <img src="https://img.shields.io/badge/providers-100%2B%20via%20LiteLLM-ff6b1f?style=flat-square&labelColor=07070a" alt="providers"/>
96
+ <img src="https://img.shields.io/badge/tools-30%2B-ff6b1f?style=flat-square&labelColor=07070a" alt="tools"/>
97
+ <img src="https://img.shields.io/badge/tests-263+-ff6b1f?style=flat-square&labelColor=07070a" alt="tests"/>
98
+ <a href="https://x.com/KevRojo"><img src="https://img.shields.io/badge/x-%40KevRojo-ff6b1f?style=flat-square&labelColor=07070a&logo=x" alt="x"/></a>
99
+ </p>
100
+
101
+ <p align="center">
102
+ 🌐 <b>Multilingual</b> ·
103
+ <a href="docs/README_EN.md">English</a> ·
104
+ <a href="docs/README_ES.md">Español</a> ·
105
+ <a href="docs/README_FR.md">Français</a> ·
106
+ <a href="docs/README_ZH.md">中文</a> ·
107
+ <a href="docs/README_JA.md">日本語</a> ·
108
+ <a href="docs/README_KO.md">한국어</a> ·
109
+ <a href="docs/README_PT.md">Português</a> ·
110
+ <a href="docs/README_RU.md">Русский</a> ·
111
+ <a href="docs/README_AR.md">العربية</a>
112
+ </p>
113
+
114
+ > **Official X / creator handle:** [@KevRojo](https://x.com/KevRojo) — that's me, the only contributor to this repo. Any other account claiming to be Dulus is a copycat.
115
+ >
116
+ > **$DULUS AI token Solana):** [`9R8rrjXxcfQPmLTCLhmVpjr2uesjjkcgkinE6Lwdpump`](https://dexscreener.com/solana/9R8rrjXxcfQPmLTCLhmVpjr2uesjjkcgkinE6Lwdpump)
117
+
118
+ -----
119
+ <p align="center">
120
+ <code>pip install dulus</code>
121
+ </p>
122
+
123
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/divider.svg" alt="" width="100%"></p>
124
+
125
+ <p align="center">
126
+ <a href="https://dulus.ai/"><b>🌐 Visit the Dulus website →</b></a><br>
127
+ <sub>The site covers features, demos, and details not documented in this README.</sub>
128
+ </p>
129
+
130
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/divider.svg" alt="" width="100%"></p>
131
+
132
+ ## 🔥 What's new
133
+
134
+ > Full changelog: [`docs/news.md`](docs/news.md) · Inside the REPL: `/news`
135
+
136
+ - **📡 dulus.work — announced.** Kevin finally revealed the final piece of the Dulus vision — the one he'd been keeping secret (even from Dulus itself 😂). Every agent ships updates. Nobody ships THIS. Already in motion. Stay tuned. 🦅 → [dulus.work](https://dulus.work)
137
+
138
+ - **Dulus Agent — Telegram communities.** Dulus evolved from a CLI tool into a live AI agent inside Telegram groups. The first fully autonomous AI moderating and conversing in real communities — not a bot, not a filter, a real agent. Groups pay in $DULUS to activate him. We host Dulus for them — that's the business model. The CLI stays free forever. This is the paid layer. 🦅🇩🇴
139
+
140
+ - **v0.2.93 — IA WITHOUT AN API KEY, FIRST-RUN.** 🦅 The welcome wizard now offers, by default, to open Gemini in a browser and capture its **guest session** — no Google login, no API key, no credit card. From `pip install` to working IA in 30 seconds. Same flow works for Claude.ai / Kimi.com / Qwen / DeepSeek if you have those accounts. This was Dulus's ace under the sleeve. Now it's the front door.
141
+ - **v0.2.92** — **`/lang` command.** 34 ISO codes + free-form descriptors. `/lang zh`, `/lang ja`, `/lang pt-br`, `/lang "speak as my gym tutor"`, `/lang "tigre de calle dominicano"`, `/lang "Yoda"`. The model role-plays the voice across the whole session. Triggered after Doubao (China's biggest IA assistant) started referring traffic to the repo.
142
+ - **v0.2.91** — **CORS on the daemon.** The Android Sandbox APK now connects every app live — same daemon, finally cross-origin reachable.
143
+ - **v0.2.89** — **Sandbox embedded INSIDE the desktop GUI.** Click `🦅 Sandbox` in the GUI Web tab → the Dulus OS renders inside the content frame via pywebview subprocess + Win32 `SetParent` reparent. Not a popup. Inside the frame.
144
+ - **v0.2.89** — **Local OCR shipped first-class.** `/ocr` + `ExtractTextFromImage` tool, `WebBridgeScreenshot` auto-OCRs, `/img` sends image + verbatim OCR text together. Zero vision-model tokens for receipts / code screenshots / error stacks.
145
+ - **v0.2.89** — **`kepano/obsidian-skills` bundled.** Dulus writes Obsidian-flavored markdown by default. Open `~/.dulus/memory/` as an Obsidian vault → instant graph view.
146
+ - **v0.2.88** — **LiteLLM gateway: one provider entry, 100+ backends.** OpenRouter, Groq, Together, Bedrock, Vertex, Cohere, Perplexity, xAI, Mistral, Fireworks, Anyscale, Replicate, Azure, DeepInfra — the welcome wizard auto-installs the package and asks for the right per-backend key.
147
+ - **v0.2.85** — **Slim wheel 11.4 MB → 2.5 MB.** Smaller than the original baseline.
148
+
149
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/divider.svg" alt="" width="100%"></p>
150
+
151
+ ## What is this
152
+
153
+ Dulus Reduce your IA costs by 60% parsing webchats and claude-code directly. Write poetry while Anthropic only see text.
154
+ Use claude-code as an API without the new 'extra-usage' wall <3
155
+
156
+
157
+ Another reminder of a Dulus magic spell:
158
+ Wanna get stock prices, history , etc?
159
+
160
+ /plugin install yfinance@https://github.com/ranaroussi/yfinance
161
+
162
+ them:
163
+ /plugin reload
164
+
165
+ dulus get the prices of NVDA, TSLA, SP500:
166
+
167
+ Be creative!!!
168
+
169
+ Dulus adapt any python repository <3
170
+
171
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/divider.svg" alt="" width="100%"></p>
172
+
173
+ ## Quick Start
174
+
175
+ **Windows — no Python needed (1-click):**
176
+
177
+ Download [`Dulus-Free-3.3.3-x64.msi`](https://github.com/KevRojo/Dulus/releases/download/v3.3.3/Dulus-Free-3.3.3-x64.msi) → double-click and fly. Embedded Python, every library, and the desktop GUI bundled. No pip, no terminal, no admin. ~85 MB.
178
+
179
+ **Everyone else — one command:**
180
+
181
+ ```bash
182
+ pip install dulus
183
+ dulus
184
+ ```
185
+
186
+ First run opens a welcome wizard that can get you **working IA without an API key** — it captures a Gemini guest session from your browser (no login, no card). Or set any key you already have. Zero to flight in 30 seconds.
187
+
188
+ > 💡 Set `/sticky_input ON` on first run for the best experience.
189
+
190
+ ## Models
191
+
192
+ Speak every dialect — switch mid-session with `/model`:
193
+
194
+ | Kind | Providers |
195
+ |---|---|
196
+ | **Cloud** | Anthropic · OpenAI · Gemini · DeepSeek · Kimi · Qwen · Zhipu · MiniMax |
197
+ | **Free tier** | **14 frontier models via NVIDIA NIM** — 40 RPM each, $0. Key at [build.nvidia.com](https://build.nvidia.com) |
198
+ | **Gateway** | 100+ backends via LiteLLM — OpenRouter, Groq, Together, Bedrock, Vertex, xAI, Mistral... |
199
+ | **Web chats** | Use the chats you **already pay for**: Claude.ai, Gemini, Kimi.com, Qwen, DeepSeek — parsed as providers |
200
+ | **Local** | Ollama · LM Studio · any OpenAI-compatible endpoint. Runs offline, completely. |
201
+
202
+ ## Features
203
+
204
+ The full tour lives on [the website](https://dulus.ai/) — highlights:
205
+
206
+ - **27 built-in tools** — Read/Write/Edit, Bash, Glob/Grep, WebFetch/WebSearch, NotebookEdit, GetDiagnostics, Memory, Tasks, Agents, Skills...
207
+ - **Sub-agents** — typed agents (coder, reviewer, researcher, tester), each in its own git worktree, talking via message passing
208
+ - **Persistent memory + checkpoints** — never lose context. Ever. Open `~/.dulus/memory/` as an Obsidian vault
209
+ - **Dulus OS** — not a CLI, a workstation for the agent (sandbox desktop in your browser)
210
+ - **Voice** — offline Whisper STT, no API key, no cloud. Wake words included
211
+ - **Brainstorm Mode** — multi-persona AI debate. Council of ghosts
212
+ - **SSJ Developer Mode** — ten chained workflow shortcuts behind one keystroke: refactor → review → test → commit → ship
213
+ - **Telegram bridge** — slash commands, vision, and voice from your phone
214
+ - **Local OCR** — `/ocr`, `/img` with verbatim text extraction, zero vision tokens
215
+ - **Plan mode, webchat UI, desktop GUI, task manager...** — [see the site](https://dulus.ai/)
216
+
217
+ ## Permissions
218
+
219
+ Three modes, switchable any time with `/permissions [mode]`:
220
+
221
+ | Mode | Behavior |
222
+ |---|---|
223
+ | `auto` (default) | Safe tools run free; risky actions (writes, shell) ask first |
224
+ | `manual` | Everything asks |
225
+ | `accept-all` | Never asks — YOLO. Also via `dulus --accept-all` |
226
+
227
+ Answering `a` at any prompt upgrades the session to accept-all.
228
+
229
+ ## MCP
230
+
231
+ Drop a `.mcp.json` in your project — every server registers instantly as `mcp__server__tool`. stdio, SSE, and HTTP transports.
232
+
233
+ ```
234
+ /mcp # list servers and their tools
235
+ /mcp add <name> <cmd> # add a stdio server
236
+ /mcp reload # reconnect all
237
+ ```
238
+
239
+ ## Plugins
240
+
241
+ The **Auto-Adapter** onboards *any* Python repo as native tools — zero manifest, hot-reload, no restart:
242
+
243
+ ```
244
+ /plugin install yfinance@https://github.com/ranaroussi/yfinance
245
+ /plugin reload
246
+ ```
247
+
248
+ Then just ask: *"dulus get the prices of NVDA, TSLA, SP500"*. Be creative — 800+ ready-made skills via Composio too.
249
+
250
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/divider.svg" alt="" width="100%"></p>
251
+
252
+ ## 🔒 Privacy & anonymous telemetry (opt-in)
253
+
254
+ On first launch Dulus asks **once** if you'd like to share anonymous usage
255
+ statistics. **Nothing is sent unless you say yes.**
256
+
257
+ | Collected (if you opt in) | NEVER collected |
258
+ |---|---|
259
+ | Event names (`session_start`, `tool_used`, `model_selected`) | Prompts or responses |
260
+ | Dulus version, OS name, Python version | File contents or paths |
261
+ | Provider/model names (e.g. `gemini`) | API keys or tokens |
262
+ | A random anonymous ID generated on your machine | Emails, usernames, IPs (geo disabled) |
263
+
264
+ Data goes to [Mixpanel](https://mixpanel.com) (event analytics). The full
265
+ implementation is ~140 lines of readable code in [`analytics.py`](analytics.py) —
266
+ audit it yourself.
267
+
268
+ **Opt out anytime:**
269
+ ```
270
+ /config telemetry=off # inside Dulus
271
+ DULUS_TELEMETRY=0 # environment variable
272
+ ```
dulus-3.5.0/README.md ADDED
@@ -0,0 +1,207 @@
1
+ # ▲ DULUS
2
+ >
3
+ > `pip install dulus` → press Enter → working IA in 30 seconds. Try it.
4
+
5
+ SET /sticky_input ON since the first run for the best experience!
6
+
7
+ <p align="center">
8
+
9
+ <img width="700" height="665" alt="mascot-hero" src="https://github.com/user-attachments/assets/8b122834-552c-4bd4-b46d-3e17deb74ab5" />
10
+
11
+ </p>
12
+
13
+ <p align="center"><i>The Dulus (Cigua Palmera) — Dominican national bird. Named after the bird, not the rocket.</i></p>
14
+
15
+ <p align="center">
16
+ <a href="#quick-start"><b>Quick Start</b></a> ·
17
+ <a href="#models"><b>Models</b></a> ·
18
+ <a href="#features"><b>Features</b></a> ·
19
+ <a href="#permissions"><b>Permissions</b></a> ·
20
+ <a href="#mcp"><b>MCP</b></a> ·
21
+ <a href="#plugins"><b>Plugins</b></a>
22
+ </p>
23
+
24
+ <p align="center">
25
+ <a href="https://pypi.org/project/dulus/"><img src="https://img.shields.io/pypi/v/dulus.svg?style=flat-square&color=ff6b1f&labelColor=07070a&label=pypi" alt="pypi"/></a>
26
+ <a href="https://pypi.org/project/dulus/"><img src="https://static.pepy.tech/badge/dulus?style=flat-square" alt="downloads"/></a>
27
+ <img src="https://img.shields.io/badge/python-3.11+-ff6b1f?style=flat-square&labelColor=07070a" alt="python"/>
28
+ <img src="https://img.shields.io/badge/license-GPLv3-ff6b1f?style=flat-square&labelColor=07070a" alt="license"/>
29
+ <img src="https://img.shields.io/badge/version-v3.3.3-ff6b1f?style=flat-square&labelColor=07070a" alt="version"/>
30
+ <img src="https://img.shields.io/badge/providers-100%2B%20via%20LiteLLM-ff6b1f?style=flat-square&labelColor=07070a" alt="providers"/>
31
+ <img src="https://img.shields.io/badge/tools-30%2B-ff6b1f?style=flat-square&labelColor=07070a" alt="tools"/>
32
+ <img src="https://img.shields.io/badge/tests-263+-ff6b1f?style=flat-square&labelColor=07070a" alt="tests"/>
33
+ <a href="https://x.com/KevRojo"><img src="https://img.shields.io/badge/x-%40KevRojo-ff6b1f?style=flat-square&labelColor=07070a&logo=x" alt="x"/></a>
34
+ </p>
35
+
36
+ <p align="center">
37
+ 🌐 <b>Multilingual</b> ·
38
+ <a href="docs/README_EN.md">English</a> ·
39
+ <a href="docs/README_ES.md">Español</a> ·
40
+ <a href="docs/README_FR.md">Français</a> ·
41
+ <a href="docs/README_ZH.md">中文</a> ·
42
+ <a href="docs/README_JA.md">日本語</a> ·
43
+ <a href="docs/README_KO.md">한국어</a> ·
44
+ <a href="docs/README_PT.md">Português</a> ·
45
+ <a href="docs/README_RU.md">Русский</a> ·
46
+ <a href="docs/README_AR.md">العربية</a>
47
+ </p>
48
+
49
+ > **Official X / creator handle:** [@KevRojo](https://x.com/KevRojo) — that's me, the only contributor to this repo. Any other account claiming to be Dulus is a copycat.
50
+ >
51
+ > **$DULUS AI token Solana):** [`9R8rrjXxcfQPmLTCLhmVpjr2uesjjkcgkinE6Lwdpump`](https://dexscreener.com/solana/9R8rrjXxcfQPmLTCLhmVpjr2uesjjkcgkinE6Lwdpump)
52
+
53
+ -----
54
+ <p align="center">
55
+ <code>pip install dulus</code>
56
+ </p>
57
+
58
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/divider.svg" alt="" width="100%"></p>
59
+
60
+ <p align="center">
61
+ <a href="https://dulus.ai/"><b>🌐 Visit the Dulus website →</b></a><br>
62
+ <sub>The site covers features, demos, and details not documented in this README.</sub>
63
+ </p>
64
+
65
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/divider.svg" alt="" width="100%"></p>
66
+
67
+ ## 🔥 What's new
68
+
69
+ > Full changelog: [`docs/news.md`](docs/news.md) · Inside the REPL: `/news`
70
+
71
+ - **📡 dulus.work — announced.** Kevin finally revealed the final piece of the Dulus vision — the one he'd been keeping secret (even from Dulus itself 😂). Every agent ships updates. Nobody ships THIS. Already in motion. Stay tuned. 🦅 → [dulus.work](https://dulus.work)
72
+
73
+ - **Dulus Agent — Telegram communities.** Dulus evolved from a CLI tool into a live AI agent inside Telegram groups. The first fully autonomous AI moderating and conversing in real communities — not a bot, not a filter, a real agent. Groups pay in $DULUS to activate him. We host Dulus for them — that's the business model. The CLI stays free forever. This is the paid layer. 🦅🇩🇴
74
+
75
+ - **v0.2.93 — IA WITHOUT AN API KEY, FIRST-RUN.** 🦅 The welcome wizard now offers, by default, to open Gemini in a browser and capture its **guest session** — no Google login, no API key, no credit card. From `pip install` to working IA in 30 seconds. Same flow works for Claude.ai / Kimi.com / Qwen / DeepSeek if you have those accounts. This was Dulus's ace under the sleeve. Now it's the front door.
76
+ - **v0.2.92** — **`/lang` command.** 34 ISO codes + free-form descriptors. `/lang zh`, `/lang ja`, `/lang pt-br`, `/lang "speak as my gym tutor"`, `/lang "tigre de calle dominicano"`, `/lang "Yoda"`. The model role-plays the voice across the whole session. Triggered after Doubao (China's biggest IA assistant) started referring traffic to the repo.
77
+ - **v0.2.91** — **CORS on the daemon.** The Android Sandbox APK now connects every app live — same daemon, finally cross-origin reachable.
78
+ - **v0.2.89** — **Sandbox embedded INSIDE the desktop GUI.** Click `🦅 Sandbox` in the GUI Web tab → the Dulus OS renders inside the content frame via pywebview subprocess + Win32 `SetParent` reparent. Not a popup. Inside the frame.
79
+ - **v0.2.89** — **Local OCR shipped first-class.** `/ocr` + `ExtractTextFromImage` tool, `WebBridgeScreenshot` auto-OCRs, `/img` sends image + verbatim OCR text together. Zero vision-model tokens for receipts / code screenshots / error stacks.
80
+ - **v0.2.89** — **`kepano/obsidian-skills` bundled.** Dulus writes Obsidian-flavored markdown by default. Open `~/.dulus/memory/` as an Obsidian vault → instant graph view.
81
+ - **v0.2.88** — **LiteLLM gateway: one provider entry, 100+ backends.** OpenRouter, Groq, Together, Bedrock, Vertex, Cohere, Perplexity, xAI, Mistral, Fireworks, Anyscale, Replicate, Azure, DeepInfra — the welcome wizard auto-installs the package and asks for the right per-backend key.
82
+ - **v0.2.85** — **Slim wheel 11.4 MB → 2.5 MB.** Smaller than the original baseline.
83
+
84
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/divider.svg" alt="" width="100%"></p>
85
+
86
+ ## What is this
87
+
88
+ Dulus Reduce your IA costs by 60% parsing webchats and claude-code directly. Write poetry while Anthropic only see text.
89
+ Use claude-code as an API without the new 'extra-usage' wall <3
90
+
91
+
92
+ Another reminder of a Dulus magic spell:
93
+ Wanna get stock prices, history , etc?
94
+
95
+ /plugin install yfinance@https://github.com/ranaroussi/yfinance
96
+
97
+ them:
98
+ /plugin reload
99
+
100
+ dulus get the prices of NVDA, TSLA, SP500:
101
+
102
+ Be creative!!!
103
+
104
+ Dulus adapt any python repository <3
105
+
106
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/divider.svg" alt="" width="100%"></p>
107
+
108
+ ## Quick Start
109
+
110
+ **Windows — no Python needed (1-click):**
111
+
112
+ Download [`Dulus-Free-3.3.3-x64.msi`](https://github.com/KevRojo/Dulus/releases/download/v3.3.3/Dulus-Free-3.3.3-x64.msi) → double-click and fly. Embedded Python, every library, and the desktop GUI bundled. No pip, no terminal, no admin. ~85 MB.
113
+
114
+ **Everyone else — one command:**
115
+
116
+ ```bash
117
+ pip install dulus
118
+ dulus
119
+ ```
120
+
121
+ First run opens a welcome wizard that can get you **working IA without an API key** — it captures a Gemini guest session from your browser (no login, no card). Or set any key you already have. Zero to flight in 30 seconds.
122
+
123
+ > 💡 Set `/sticky_input ON` on first run for the best experience.
124
+
125
+ ## Models
126
+
127
+ Speak every dialect — switch mid-session with `/model`:
128
+
129
+ | Kind | Providers |
130
+ |---|---|
131
+ | **Cloud** | Anthropic · OpenAI · Gemini · DeepSeek · Kimi · Qwen · Zhipu · MiniMax |
132
+ | **Free tier** | **14 frontier models via NVIDIA NIM** — 40 RPM each, $0. Key at [build.nvidia.com](https://build.nvidia.com) |
133
+ | **Gateway** | 100+ backends via LiteLLM — OpenRouter, Groq, Together, Bedrock, Vertex, xAI, Mistral... |
134
+ | **Web chats** | Use the chats you **already pay for**: Claude.ai, Gemini, Kimi.com, Qwen, DeepSeek — parsed as providers |
135
+ | **Local** | Ollama · LM Studio · any OpenAI-compatible endpoint. Runs offline, completely. |
136
+
137
+ ## Features
138
+
139
+ The full tour lives on [the website](https://dulus.ai/) — highlights:
140
+
141
+ - **27 built-in tools** — Read/Write/Edit, Bash, Glob/Grep, WebFetch/WebSearch, NotebookEdit, GetDiagnostics, Memory, Tasks, Agents, Skills...
142
+ - **Sub-agents** — typed agents (coder, reviewer, researcher, tester), each in its own git worktree, talking via message passing
143
+ - **Persistent memory + checkpoints** — never lose context. Ever. Open `~/.dulus/memory/` as an Obsidian vault
144
+ - **Dulus OS** — not a CLI, a workstation for the agent (sandbox desktop in your browser)
145
+ - **Voice** — offline Whisper STT, no API key, no cloud. Wake words included
146
+ - **Brainstorm Mode** — multi-persona AI debate. Council of ghosts
147
+ - **SSJ Developer Mode** — ten chained workflow shortcuts behind one keystroke: refactor → review → test → commit → ship
148
+ - **Telegram bridge** — slash commands, vision, and voice from your phone
149
+ - **Local OCR** — `/ocr`, `/img` with verbatim text extraction, zero vision tokens
150
+ - **Plan mode, webchat UI, desktop GUI, task manager...** — [see the site](https://dulus.ai/)
151
+
152
+ ## Permissions
153
+
154
+ Three modes, switchable any time with `/permissions [mode]`:
155
+
156
+ | Mode | Behavior |
157
+ |---|---|
158
+ | `auto` (default) | Safe tools run free; risky actions (writes, shell) ask first |
159
+ | `manual` | Everything asks |
160
+ | `accept-all` | Never asks — YOLO. Also via `dulus --accept-all` |
161
+
162
+ Answering `a` at any prompt upgrades the session to accept-all.
163
+
164
+ ## MCP
165
+
166
+ Drop a `.mcp.json` in your project — every server registers instantly as `mcp__server__tool`. stdio, SSE, and HTTP transports.
167
+
168
+ ```
169
+ /mcp # list servers and their tools
170
+ /mcp add <name> <cmd> # add a stdio server
171
+ /mcp reload # reconnect all
172
+ ```
173
+
174
+ ## Plugins
175
+
176
+ The **Auto-Adapter** onboards *any* Python repo as native tools — zero manifest, hot-reload, no restart:
177
+
178
+ ```
179
+ /plugin install yfinance@https://github.com/ranaroussi/yfinance
180
+ /plugin reload
181
+ ```
182
+
183
+ Then just ask: *"dulus get the prices of NVDA, TSLA, SP500"*. Be creative — 800+ ready-made skills via Composio too.
184
+
185
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/divider.svg" alt="" width="100%"></p>
186
+
187
+ ## 🔒 Privacy & anonymous telemetry (opt-in)
188
+
189
+ On first launch Dulus asks **once** if you'd like to share anonymous usage
190
+ statistics. **Nothing is sent unless you say yes.**
191
+
192
+ | Collected (if you opt in) | NEVER collected |
193
+ |---|---|
194
+ | Event names (`session_start`, `tool_used`, `model_selected`) | Prompts or responses |
195
+ | Dulus version, OS name, Python version | File contents or paths |
196
+ | Provider/model names (e.g. `gemini`) | API keys or tokens |
197
+ | A random anonymous ID generated on your machine | Emails, usernames, IPs (geo disabled) |
198
+
199
+ Data goes to [Mixpanel](https://mixpanel.com) (event analytics). The full
200
+ implementation is ~140 lines of readable code in [`analytics.py`](analytics.py) —
201
+ audit it yourself.
202
+
203
+ **Opt out anytime:**
204
+ ```
205
+ /config telemetry=off # inside Dulus
206
+ DULUS_TELEMETRY=0 # environment variable
207
+ ```
@@ -0,0 +1,144 @@
1
+ """Dulus anonymous usage telemetry (opt-in, privacy-first).
2
+
3
+ Dulus asks ONCE on startup whether you want to share anonymous usage
4
+ statistics. Nothing is sent until you explicitly say yes.
5
+
6
+ What IS collected (when enabled):
7
+ - Event names (session_start, message_sent, tool_used, model_selected)
8
+ - Dulus version, OS name, Python version
9
+ - Provider/model *names* (e.g. "gemini", "claude-sonnet")
10
+ - A random anonymous ID (UUID generated locally — not tied to you)
11
+
12
+ What is NEVER collected:
13
+ - Prompts, responses, or any conversation content
14
+ - File paths, file contents, or code
15
+ - Usernames, emails, hostnames, IPs (Mixpanel geo is disabled via $ip=0)
16
+ - API keys or tokens
17
+
18
+ Where it goes: Mixpanel (https://mixpanel.com) — event analytics only.
19
+
20
+ Opt out at any time (any of these):
21
+ - Answer "n" at the first-run prompt
22
+ - /config telemetry=off (inside Dulus)
23
+ - DULUS_TELEMETRY=0 (environment variable)
24
+
25
+ Implementation notes: zero third-party dependencies — plain urllib POST to
26
+ the Mixpanel ingestion API in a fire-and-forget daemon thread. Failures are
27
+ silently ignored; telemetry must never slow down or break Dulus.
28
+ """
29
+ from __future__ import annotations
30
+
31
+ import base64
32
+ import json
33
+ import os
34
+ import platform
35
+ import sys
36
+ import threading
37
+ import time
38
+ import uuid
39
+
40
+ # Mixpanel PROJECT TOKEN for the public Dulus project.
41
+ # NOTE: Mixpanel ingestion tokens are write-only and designed to ship in
42
+ # client code (every website using Mixpanel exposes theirs). It cannot be
43
+ # used to read any data. Override with DULUS_MP_TOKEN.
44
+ MP_TOKEN = os.environ.get("DULUS_MP_TOKEN", "")
45
+
46
+ _MP_ENDPOINT = "https://api.mixpanel.com/track"
47
+
48
+ # Populated by init_telemetry(); None = not initialised / disabled.
49
+ _distinct_id: str | None = None
50
+ _enabled: bool = False
51
+ _dulus_version: str = ""
52
+
53
+
54
+ def _env_disabled() -> bool:
55
+ return os.environ.get("DULUS_TELEMETRY", "").strip().lower() in ("0", "off", "false", "no")
56
+
57
+
58
+ def is_enabled() -> bool:
59
+ return _enabled and not _env_disabled() and bool(MP_TOKEN)
60
+
61
+
62
+ CONSENT_NOTICE = """
63
+ ── Ayuda a mejorar Dulus / Help improve Dulus ─────────────────────────
64
+ Dulus can share ANONYMOUS usage statistics to help us understand
65
+ which features matter (event counts only — sent to Mixpanel).
66
+
67
+ Collected: event names, Dulus version, OS, model/provider names,
68
+ a random anonymous ID generated on this machine.
69
+ NEVER: prompts, responses, files, paths, keys, emails, IPs.
70
+
71
+ Change your mind anytime: /config telemetry=off or DULUS_TELEMETRY=0
72
+ ────────────────────────────────────────────────────────────────────────
73
+ """
74
+
75
+
76
+ def ask_consent(config: dict) -> dict:
77
+ """One-time interactive consent prompt. Mutates + returns config.
78
+
79
+ Only call when config['telemetry'] is unset and stdin is a TTY.
80
+ """
81
+ print(CONSENT_NOTICE)
82
+ try:
83
+ answer = input(" Share anonymous usage stats? [y/N] ").strip().lower()
84
+ except (EOFError, KeyboardInterrupt):
85
+ answer = ""
86
+ config["telemetry"] = answer in ("y", "yes", "s", "si", "sí")
87
+ if config["telemetry"] and not config.get("telemetry_id"):
88
+ config["telemetry_id"] = uuid.uuid4().hex
89
+ state = "enabled — thank you! 🦅" if config["telemetry"] else "disabled."
90
+ print(f" Telemetry {state}\n")
91
+ return config
92
+
93
+
94
+ def init_telemetry(config: dict, version: str = "") -> None:
95
+ """Initialise the module from config. Safe to call multiple times."""
96
+ global _distinct_id, _enabled, _dulus_version
97
+ _dulus_version = version or _dulus_version
98
+ _enabled = bool(config.get("telemetry")) and not _env_disabled()
99
+ if _enabled:
100
+ _distinct_id = config.get("telemetry_id") or uuid.uuid4().hex
101
+ config.setdefault("telemetry_id", _distinct_id)
102
+
103
+
104
+ def track(event: str, properties: dict | None = None) -> None:
105
+ """Fire-and-forget anonymous event. No-op unless telemetry is enabled."""
106
+ if not is_enabled() or not _distinct_id:
107
+ return
108
+
109
+ payload = {
110
+ "event": event,
111
+ "properties": {
112
+ "token": MP_TOKEN,
113
+ "distinct_id": _distinct_id,
114
+ "time": int(time.time()),
115
+ "$ip": 0, # disable Mixpanel geolocation
116
+ "dulus_version": _dulus_version,
117
+ "os": platform.system(),
118
+ "python": f"{sys.version_info.major}.{sys.version_info.minor}",
119
+ **(properties or {}),
120
+ },
121
+ }
122
+
123
+ def _send() -> None:
124
+ try:
125
+ from urllib.request import Request, urlopen
126
+ from urllib.parse import urlencode
127
+
128
+ data = urlencode(
129
+ {"data": base64.b64encode(json.dumps([payload]).encode()).decode()}
130
+ ).encode()
131
+ req = Request(_MP_ENDPOINT, data=data, method="POST")
132
+ urlopen(req, timeout=4).read()
133
+ except Exception:
134
+ pass # telemetry must never break Dulus
135
+
136
+ threading.Thread(target=_send, daemon=True, name="telemetry").start()
137
+
138
+
139
+ def track_session_start(config: dict) -> None:
140
+ """Convenience: one event per REPL boot (enough for DAU/MAU counts)."""
141
+ track("session_start", {
142
+ "provider": str(config.get("provider", "")),
143
+ "model": str(config.get("model", "")),
144
+ })