dulus 3.5.0__tar.gz → 3.6.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 (330) hide show
  1. {dulus-3.5.0/dulus.egg-info → dulus-3.6.0}/PKG-INFO +1 -1
  2. {dulus-3.5.0 → dulus-3.6.0}/docs/news.md +4 -0
  3. {dulus-3.5.0 → dulus-3.6.0/dulus.egg-info}/PKG-INFO +1 -1
  4. {dulus-3.5.0 → dulus-3.6.0}/dulus.py +95 -1
  5. {dulus-3.5.0 → dulus-3.6.0}/pyproject.toml +1 -1
  6. {dulus-3.5.0 → dulus-3.6.0}/LICENSE +0 -0
  7. {dulus-3.5.0 → dulus-3.6.0}/MANIFEST.in +0 -0
  8. {dulus-3.5.0 → dulus-3.6.0}/README.md +0 -0
  9. {dulus-3.5.0 → dulus-3.6.0}/agent.py +0 -0
  10. {dulus-3.5.0 → dulus-3.6.0}/analytics.py +0 -0
  11. {dulus-3.5.0 → dulus-3.6.0}/backend/__init__.py +0 -0
  12. {dulus-3.5.0 → dulus-3.6.0}/backend/agents_bridge.py +0 -0
  13. {dulus-3.5.0 → dulus-3.6.0}/backend/compressor.py +0 -0
  14. {dulus-3.5.0 → dulus-3.6.0}/backend/context.py +0 -0
  15. {dulus-3.5.0 → dulus-3.6.0}/backend/githook.py +0 -0
  16. {dulus-3.5.0 → dulus-3.6.0}/backend/marketplace.py +0 -0
  17. {dulus-3.5.0 → dulus-3.6.0}/backend/mempalace_bridge.py +0 -0
  18. {dulus-3.5.0 → dulus-3.6.0}/backend/personas.py +0 -0
  19. {dulus-3.5.0 → dulus-3.6.0}/backend/plugins.py +0 -0
  20. {dulus-3.5.0 → dulus-3.6.0}/backend/server.py +0 -0
  21. {dulus-3.5.0 → dulus-3.6.0}/backend/tasks.py +0 -0
  22. {dulus-3.5.0 → dulus-3.6.0}/batch_api.py +0 -0
  23. {dulus-3.5.0 → dulus-3.6.0}/checkpoint/__init__.py +0 -0
  24. {dulus-3.5.0 → dulus-3.6.0}/checkpoint/hooks.py +0 -0
  25. {dulus-3.5.0 → dulus-3.6.0}/checkpoint/store.py +0 -0
  26. {dulus-3.5.0 → dulus-3.6.0}/checkpoint/types.py +0 -0
  27. {dulus-3.5.0 → dulus-3.6.0}/claude_code_watcher.py +0 -0
  28. {dulus-3.5.0 → dulus-3.6.0}/clipboard_utils.py +0 -0
  29. {dulus-3.5.0 → dulus-3.6.0}/cloudsave.py +0 -0
  30. {dulus-3.5.0 → dulus-3.6.0}/common.py +0 -0
  31. {dulus-3.5.0 → dulus-3.6.0}/compaction.py +0 -0
  32. {dulus-3.5.0 → dulus-3.6.0}/config.py +0 -0
  33. {dulus-3.5.0 → dulus-3.6.0}/context.py +0 -0
  34. {dulus-3.5.0 → dulus-3.6.0}/data/__init__.py +0 -0
  35. {dulus-3.5.0 → dulus-3.6.0}/data/active_persona.json +0 -0
  36. {dulus-3.5.0 → dulus-3.6.0}/data/marketplace.json +0 -0
  37. {dulus-3.5.0 → dulus-3.6.0}/data/personas.json +0 -0
  38. {dulus-3.5.0 → dulus-3.6.0}/data/plugins/__init__.py +0 -0
  39. {dulus-3.5.0 → dulus-3.6.0}/data/plugins/composio/__init__.py +0 -0
  40. {dulus-3.5.0 → dulus-3.6.0}/data/plugins/composio/composio_plugin/__init__.py +0 -0
  41. {dulus-3.5.0 → dulus-3.6.0}/data/plugins/composio/composio_plugin/session_manager.py +0 -0
  42. {dulus-3.5.0 → dulus-3.6.0}/data/plugins/composio/composio_plugin/tool_generator.py +0 -0
  43. {dulus-3.5.0 → dulus-3.6.0}/data/plugins/composio/plugin.json +0 -0
  44. {dulus-3.5.0 → dulus-3.6.0}/data/plugins/composio/plugin_tool.py +0 -0
  45. {dulus-3.5.0 → dulus-3.6.0}/data/tasks.json +0 -0
  46. {dulus-3.5.0 → dulus-3.6.0}/docs/API.md +0 -0
  47. {dulus-3.5.0 → dulus-3.6.0}/docs/BRAND_GUIDE.md +0 -0
  48. {dulus-3.5.0 → dulus-3.6.0}/docs/CHANGELOG.md +0 -0
  49. {dulus-3.5.0 → dulus-3.6.0}/docs/CONTRIBUTING.md +0 -0
  50. {dulus-3.5.0 → dulus-3.6.0}/docs/DEPLOYMENT.md +0 -0
  51. {dulus-3.5.0 → dulus-3.6.0}/docs/Dulus_AI_Whitepaper_(v2.0).pdf +0 -0
  52. {dulus-3.5.0 → dulus-3.6.0}/docs/FAQ.md +0 -0
  53. {dulus-3.5.0 → dulus-3.6.0}/docs/GETTING_STARTED.md +0 -0
  54. {dulus-3.5.0 → dulus-3.6.0}/docs/INVESTOR_BRIEF.md +0 -0
  55. {dulus-3.5.0 → dulus-3.6.0}/docs/README.md +0 -0
  56. {dulus-3.5.0 → dulus-3.6.0}/docs/README_AR.md +0 -0
  57. {dulus-3.5.0 → dulus-3.6.0}/docs/README_EN.md +0 -0
  58. {dulus-3.5.0 → dulus-3.6.0}/docs/README_ES.md +0 -0
  59. {dulus-3.5.0 → dulus-3.6.0}/docs/README_FR.md +0 -0
  60. {dulus-3.5.0 → dulus-3.6.0}/docs/README_JA.md +0 -0
  61. {dulus-3.5.0 → dulus-3.6.0}/docs/README_KO.md +0 -0
  62. {dulus-3.5.0 → dulus-3.6.0}/docs/README_PT.md +0 -0
  63. {dulus-3.5.0 → dulus-3.6.0}/docs/README_RU.md +0 -0
  64. {dulus-3.5.0 → dulus-3.6.0}/docs/README_ZH.md +0 -0
  65. {dulus-3.5.0 → dulus-3.6.0}/docs/SECURITY.md +0 -0
  66. {dulus-3.5.0 → dulus-3.6.0}/docs/__init__.py +0 -0
  67. {dulus-3.5.0 → dulus-3.6.0}/docs/api.html +0 -0
  68. {dulus-3.5.0 → dulus-3.6.0}/docs/architecture.md +0 -0
  69. {dulus-3.5.0 → dulus-3.6.0}/docs/azure-speech-template.json +0 -0
  70. {dulus-3.5.0 → dulus-3.6.0}/docs/dashboard/index.html +0 -0
  71. {dulus-3.5.0 → dulus-3.6.0}/docs/divider.svg +0 -0
  72. {dulus-3.5.0 → dulus-3.6.0}/docs/dulus-bird.png +0 -0
  73. {dulus-3.5.0 → dulus-3.6.0}/docs/generate.py +0 -0
  74. {dulus-3.5.0 → dulus-3.6.0}/docs/hero.svg +0 -0
  75. {dulus-3.5.0 → dulus-3.6.0}/docs/index.html +0 -0
  76. {dulus-3.5.0 → dulus-3.6.0}/docs/nvidia-models.svg +0 -0
  77. {dulus-3.5.0 → dulus-3.6.0}/docs/particle-playground.html +0 -0
  78. {dulus-3.5.0 → dulus-3.6.0}/docs/personas/index.html +0 -0
  79. {dulus-3.5.0 → dulus-3.6.0}/docs/poetry-banner.png +0 -0
  80. {dulus-3.5.0 → dulus-3.6.0}/docs/preview.html +0 -0
  81. {dulus-3.5.0 → dulus-3.6.0}/docs/sec-agents.svg +0 -0
  82. {dulus-3.5.0 → dulus-3.6.0}/docs/sec-brainstorm.svg +0 -0
  83. {dulus-3.5.0 → dulus-3.6.0}/docs/sec-bridges.svg +0 -0
  84. {dulus-3.5.0 → dulus-3.6.0}/docs/sec-features.svg +0 -0
  85. {dulus-3.5.0 → dulus-3.6.0}/docs/sec-freetier.svg +0 -0
  86. {dulus-3.5.0 → dulus-3.6.0}/docs/sec-memory.svg +0 -0
  87. {dulus-3.5.0 → dulus-3.6.0}/docs/sec-models.svg +0 -0
  88. {dulus-3.5.0 → dulus-3.6.0}/docs/sec-perms.svg +0 -0
  89. {dulus-3.5.0 → dulus-3.6.0}/docs/sec-plugins.svg +0 -0
  90. {dulus-3.5.0 → dulus-3.6.0}/docs/sec-quickstart.svg +0 -0
  91. {dulus-3.5.0 → dulus-3.6.0}/docs/sec-ssj.svg +0 -0
  92. {dulus-3.5.0 → dulus-3.6.0}/docs/spinners.svg +0 -0
  93. {dulus-3.5.0 → dulus-3.6.0}/docs/split-pane.svg +0 -0
  94. {dulus-3.5.0 → dulus-3.6.0}/docs/terminal-boot.svg +0 -0
  95. {dulus-3.5.0 → dulus-3.6.0}/dulus.egg-info/SOURCES.txt +0 -0
  96. {dulus-3.5.0 → dulus-3.6.0}/dulus.egg-info/dependency_links.txt +0 -0
  97. {dulus-3.5.0 → dulus-3.6.0}/dulus.egg-info/entry_points.txt +0 -0
  98. {dulus-3.5.0 → dulus-3.6.0}/dulus.egg-info/requires.txt +0 -0
  99. {dulus-3.5.0 → dulus-3.6.0}/dulus.egg-info/top_level.txt +0 -0
  100. {dulus-3.5.0 → dulus-3.6.0}/dulus_gui.py +0 -0
  101. {dulus-3.5.0 → dulus-3.6.0}/dulus_gui_web.py +0 -0
  102. {dulus-3.5.0 → dulus-3.6.0}/dulus_mcp/__init__.py +0 -0
  103. {dulus-3.5.0 → dulus-3.6.0}/dulus_mcp/client.py +0 -0
  104. {dulus-3.5.0 → dulus-3.6.0}/dulus_mcp/config.py +0 -0
  105. {dulus-3.5.0 → dulus-3.6.0}/dulus_mcp/tools.py +0 -0
  106. {dulus-3.5.0 → dulus-3.6.0}/dulus_mcp/types.py +0 -0
  107. {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/__init__.py +0 -0
  108. {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/add_dir_manager.py +0 -0
  109. {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/afk_mode.py +0 -0
  110. {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/approval_runtime.py +0 -0
  111. {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/background_tasks.py +0 -0
  112. {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/clipboard_utils.py +0 -0
  113. {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/diff_visualizer.py +0 -0
  114. {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/export_import.py +0 -0
  115. {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/hook_engine.py +0 -0
  116. {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/notification_manager.py +0 -0
  117. {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/session_fork.py +0 -0
  118. {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/shell_mode.py +0 -0
  119. {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/todo_visualizer.py +0 -0
  120. {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/wire_events.py +0 -0
  121. {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/yolo_mode.py +0 -0
  122. {dulus-3.5.0 → dulus-3.6.0}/governance.py +0 -0
  123. {dulus-3.5.0 → dulus-3.6.0}/gui/__init__.py +0 -0
  124. {dulus-3.5.0 → dulus-3.6.0}/gui/agent_bridge.py +0 -0
  125. {dulus-3.5.0 → dulus-3.6.0}/gui/chat_widget.py +0 -0
  126. {dulus-3.5.0 → dulus-3.6.0}/gui/dulus_orchestrator/App.tsx +0 -0
  127. {dulus-3.5.0 → dulus-3.6.0}/gui/dulus_orchestrator/THIRD_PARTY_NOTICES.md +0 -0
  128. {dulus-3.5.0 → dulus-3.6.0}/gui/dulus_orchestrator/dist/index.html +0 -0
  129. {dulus-3.5.0 → dulus-3.6.0}/gui/dulus_orchestrator/dist/standalone.html +0 -0
  130. {dulus-3.5.0 → dulus-3.6.0}/gui/dulus_orchestrator/index.html +0 -0
  131. {dulus-3.5.0 → dulus-3.6.0}/gui/dulus_orchestrator/index.tsx +0 -0
  132. {dulus-3.5.0 → dulus-3.6.0}/gui/dulus_orchestrator/metadata.json +0 -0
  133. {dulus-3.5.0 → dulus-3.6.0}/gui/dulus_orchestrator/package-lock.json +0 -0
  134. {dulus-3.5.0 → dulus-3.6.0}/gui/dulus_orchestrator/package.json +0 -0
  135. {dulus-3.5.0 → dulus-3.6.0}/gui/dulus_orchestrator/types.ts +0 -0
  136. {dulus-3.5.0 → dulus-3.6.0}/gui/dulus_orchestrator/utils.ts +0 -0
  137. {dulus-3.5.0 → dulus-3.6.0}/gui/dulus_orchestrator/vertex-ai-proxy-interceptor.js +0 -0
  138. {dulus-3.5.0 → dulus-3.6.0}/gui/dulus_orchestrator/vite.config.ts +0 -0
  139. {dulus-3.5.0 → dulus-3.6.0}/gui/main_window.py +0 -0
  140. {dulus-3.5.0 → dulus-3.6.0}/gui/personas.py +0 -0
  141. {dulus-3.5.0 → dulus-3.6.0}/gui/sandbox_server.py +0 -0
  142. {dulus-3.5.0 → dulus-3.6.0}/gui/session_utils.py +0 -0
  143. {dulus-3.5.0 → dulus-3.6.0}/gui/settings_dialog.py +0 -0
  144. {dulus-3.5.0 → dulus-3.6.0}/gui/sidebar.py +0 -0
  145. {dulus-3.5.0 → dulus-3.6.0}/gui/tasks_view.py +0 -0
  146. {dulus-3.5.0 → dulus-3.6.0}/gui/themes.py +0 -0
  147. {dulus-3.5.0 → dulus-3.6.0}/gui/tool_panel.py +0 -0
  148. {dulus-3.5.0 → dulus-3.6.0}/input.py +0 -0
  149. {dulus-3.5.0 → dulus-3.6.0}/license_manager.py +0 -0
  150. {dulus-3.5.0 → dulus-3.6.0}/memory/__init__.py +0 -0
  151. {dulus-3.5.0 → dulus-3.6.0}/memory/audit.py +0 -0
  152. {dulus-3.5.0 → dulus-3.6.0}/memory/consolidator.py +0 -0
  153. {dulus-3.5.0 → dulus-3.6.0}/memory/context.py +0 -0
  154. {dulus-3.5.0 → dulus-3.6.0}/memory/offload.py +0 -0
  155. {dulus-3.5.0 → dulus-3.6.0}/memory/palace.py +0 -0
  156. {dulus-3.5.0 → dulus-3.6.0}/memory/scan.py +0 -0
  157. {dulus-3.5.0 → dulus-3.6.0}/memory/sessions.py +0 -0
  158. {dulus-3.5.0 → dulus-3.6.0}/memory/store.py +0 -0
  159. {dulus-3.5.0 → dulus-3.6.0}/memory/tools.py +0 -0
  160. {dulus-3.5.0 → dulus-3.6.0}/memory/types.py +0 -0
  161. {dulus-3.5.0 → dulus-3.6.0}/memory/vector_search.py +0 -0
  162. {dulus-3.5.0 → dulus-3.6.0}/multi_agent/__init__.py +0 -0
  163. {dulus-3.5.0 → dulus-3.6.0}/multi_agent/subagent.py +0 -0
  164. {dulus-3.5.0 → dulus-3.6.0}/multi_agent/tools.py +0 -0
  165. {dulus-3.5.0 → dulus-3.6.0}/offload_helper.py +0 -0
  166. {dulus-3.5.0 → dulus-3.6.0}/personality_config.py +0 -0
  167. {dulus-3.5.0 → dulus-3.6.0}/plugin/__init__.py +0 -0
  168. {dulus-3.5.0 → dulus-3.6.0}/plugin/autoadapter.py +0 -0
  169. {dulus-3.5.0 → dulus-3.6.0}/plugin/loader.py +0 -0
  170. {dulus-3.5.0 → dulus-3.6.0}/plugin/recommend.py +0 -0
  171. {dulus-3.5.0 → dulus-3.6.0}/plugin/store.py +0 -0
  172. {dulus-3.5.0 → dulus-3.6.0}/plugin/types.py +0 -0
  173. {dulus-3.5.0 → dulus-3.6.0}/providers.py +0 -0
  174. {dulus-3.5.0 → dulus-3.6.0}/sandbox/README.md +0 -0
  175. {dulus-3.5.0 → dulus-3.6.0}/sandbox/__init__.py +0 -0
  176. {dulus-3.5.0 → dulus-3.6.0}/sandbox/components.json +0 -0
  177. {dulus-3.5.0 → dulus-3.6.0}/sandbox/dist/assets/index-DE51D6wI.css +0 -0
  178. {dulus-3.5.0 → dulus-3.6.0}/sandbox/dist/assets/index-DMCCNE9Y.js +0 -0
  179. {dulus-3.5.0 → dulus-3.6.0}/sandbox/dist/index.html +0 -0
  180. {dulus-3.5.0 → dulus-3.6.0}/sandbox/dist/wallpaper-default.jpg +0 -0
  181. {dulus-3.5.0 → dulus-3.6.0}/sandbox/dist/wallpapers/default.jpeg +0 -0
  182. {dulus-3.5.0 → dulus-3.6.0}/sandbox/dist/wallpapers/light.jpeg +0 -0
  183. {dulus-3.5.0 → dulus-3.6.0}/sandbox/dist/wallpapers/nature.jpeg +0 -0
  184. {dulus-3.5.0 → dulus-3.6.0}/sandbox/dist/wallpapers/tech.jpeg +0 -0
  185. {dulus-3.5.0 → dulus-3.6.0}/sandbox/eslint.config.js +0 -0
  186. {dulus-3.5.0 → dulus-3.6.0}/sandbox/index.html +0 -0
  187. {dulus-3.5.0 → dulus-3.6.0}/sandbox/info.md +0 -0
  188. {dulus-3.5.0 → dulus-3.6.0}/sandbox/package-lock.json +0 -0
  189. {dulus-3.5.0 → dulus-3.6.0}/sandbox/package.json +0 -0
  190. {dulus-3.5.0 → dulus-3.6.0}/sandbox/postcss.config.js +0 -0
  191. {dulus-3.5.0 → dulus-3.6.0}/sandbox/tailwind.config.js +0 -0
  192. {dulus-3.5.0 → dulus-3.6.0}/sandbox/tsconfig.app.json +0 -0
  193. {dulus-3.5.0 → dulus-3.6.0}/sandbox/tsconfig.json +0 -0
  194. {dulus-3.5.0 → dulus-3.6.0}/sandbox/tsconfig.node.json +0 -0
  195. {dulus-3.5.0 → dulus-3.6.0}/sandbox/vite.config.ts +0 -0
  196. {dulus-3.5.0 → dulus-3.6.0}/sandbox_bootstrap.py +0 -0
  197. {dulus-3.5.0 → dulus-3.6.0}/setup.cfg +0 -0
  198. {dulus-3.5.0 → dulus-3.6.0}/skill/__init__.py +0 -0
  199. {dulus-3.5.0 → dulus-3.6.0}/skill/builtin.py +0 -0
  200. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/LICENSE-obsidian-skills +0 -0
  201. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/README.md +0 -0
  202. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/defuddle/SKILL.md +0 -0
  203. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/json-canvas/SKILL.md +0 -0
  204. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/json-canvas/references/EXAMPLES.md +0 -0
  205. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/obsidian-bases/SKILL.md +0 -0
  206. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/obsidian-bases/references/FUNCTIONS_REFERENCE.md +0 -0
  207. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/obsidian-cli/SKILL.md +0 -0
  208. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/obsidian-markdown/SKILL.md +0 -0
  209. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/obsidian-markdown/references/CALLOUTS.md +0 -0
  210. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/obsidian-markdown/references/EMBEDS.md +0 -0
  211. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/obsidian-markdown/references/PROPERTIES.md +0 -0
  212. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/README.md +0 -0
  213. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/SKILL.md +0 -0
  214. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/addresses.json +0 -0
  215. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/advancedbackgroundchecks.json +0 -0
  216. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/beenverified.json +0 -0
  217. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/clustal.json +0 -0
  218. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/clustrmaps.json +0 -0
  219. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/cyberbackgroundchecks.json +0 -0
  220. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/familytreenow.json +0 -0
  221. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/fastpeoplesearch.json +0 -0
  222. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/intelius.json +0 -0
  223. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/mylife.json +0 -0
  224. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/nuwber.json +0 -0
  225. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/peekyou.json +0 -0
  226. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/peoplefinders.json +0 -0
  227. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/radaris.json +0 -0
  228. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/rehold.json +0 -0
  229. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/searchpeoplefree.json +0 -0
  230. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/socialcatfish.json +0 -0
  231. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/spokeo.json +0 -0
  232. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/thatsthem.json +0 -0
  233. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/truepeoplesearch.json +0 -0
  234. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/usphonebook.json +0 -0
  235. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/whitepages.json +0 -0
  236. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/legal/ccpa.md +0 -0
  237. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/legal/drop.md +0 -0
  238. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/legal/gdpr.md +0 -0
  239. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/methods.md +0 -0
  240. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/site-playbooks.md +0 -0
  241. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/state-machine.md +0 -0
  242. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/autopilot.py +0 -0
  243. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/badbool.py +0 -0
  244. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/brokers.py +0 -0
  245. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/cdp.py +0 -0
  246. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/config.py +0 -0
  247. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/crypto.py +0 -0
  248. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/dossier.py +0 -0
  249. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/email_modes.py +0 -0
  250. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/emailer.py +0 -0
  251. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/ledger.py +0 -0
  252. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/legal.py +0 -0
  253. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/paths.py +0 -0
  254. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/pdd.py +0 -0
  255. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/registry.py +0 -0
  256. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/report.py +0 -0
  257. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/scan.py +0 -0
  258. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/storage.py +0 -0
  259. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/tiers.py +0 -0
  260. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/vectors.py +0 -0
  261. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/templates/consent/authorization.md +0 -0
  262. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/templates/emails/ccpa-authorized-agent.txt +0 -0
  263. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/templates/emails/ccpa-deletion.txt +0 -0
  264. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/templates/emails/ccpa-indirect-deletion.txt +0 -0
  265. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/templates/emails/gdpr-erasure.txt +0 -0
  266. {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/templates/emails/generic-optout.txt +0 -0
  267. {dulus-3.5.0 → dulus-3.6.0}/skill/clawhub.py +0 -0
  268. {dulus-3.5.0 → dulus-3.6.0}/skill/executor.py +0 -0
  269. {dulus-3.5.0 → dulus-3.6.0}/skill/loader.py +0 -0
  270. {dulus-3.5.0 → dulus-3.6.0}/skill/tools.py +0 -0
  271. {dulus-3.5.0 → dulus-3.6.0}/skills.py +0 -0
  272. {dulus-3.5.0 → dulus-3.6.0}/soul.py +0 -0
  273. {dulus-3.5.0 → dulus-3.6.0}/spinner.py +0 -0
  274. {dulus-3.5.0 → dulus-3.6.0}/string_utils.py +0 -0
  275. {dulus-3.5.0 → dulus-3.6.0}/subagent.py +0 -0
  276. {dulus-3.5.0 → dulus-3.6.0}/task/__init__.py +0 -0
  277. {dulus-3.5.0 → dulus-3.6.0}/task/store.py +0 -0
  278. {dulus-3.5.0 → dulus-3.6.0}/task/tools.py +0 -0
  279. {dulus-3.5.0 → dulus-3.6.0}/task/types.py +0 -0
  280. {dulus-3.5.0 → dulus-3.6.0}/tests/test_afk_yolo.py +0 -0
  281. {dulus-3.5.0 → dulus-3.6.0}/tests/test_approval_runtime.py +0 -0
  282. {dulus-3.5.0 → dulus-3.6.0}/tests/test_background_task_tools.py +0 -0
  283. {dulus-3.5.0 → dulus-3.6.0}/tests/test_background_tasks.py +0 -0
  284. {dulus-3.5.0 → dulus-3.6.0}/tests/test_checkpoint.py +0 -0
  285. {dulus-3.5.0 → dulus-3.6.0}/tests/test_clipboard_utils.py +0 -0
  286. {dulus-3.5.0 → dulus-3.6.0}/tests/test_compaction.py +0 -0
  287. {dulus-3.5.0 → dulus-3.6.0}/tests/test_diff_view.py +0 -0
  288. {dulus-3.5.0 → dulus-3.6.0}/tests/test_diff_visualization.py +0 -0
  289. {dulus-3.5.0 → dulus-3.6.0}/tests/test_display_blocks.py +0 -0
  290. {dulus-3.5.0 → dulus-3.6.0}/tests/test_export_import.py +0 -0
  291. {dulus-3.5.0 → dulus-3.6.0}/tests/test_hook_engine.py +0 -0
  292. {dulus-3.5.0 → dulus-3.6.0}/tests/test_injection_fix.py +0 -0
  293. {dulus-3.5.0 → dulus-3.6.0}/tests/test_license.py +0 -0
  294. {dulus-3.5.0 → dulus-3.6.0}/tests/test_mcp.py +0 -0
  295. {dulus-3.5.0 → dulus-3.6.0}/tests/test_memory.py +0 -0
  296. {dulus-3.5.0 → dulus-3.6.0}/tests/test_notification_manager.py +0 -0
  297. {dulus-3.5.0 → dulus-3.6.0}/tests/test_plugin.py +0 -0
  298. {dulus-3.5.0 → dulus-3.6.0}/tests/test_session_fork.py +0 -0
  299. {dulus-3.5.0 → dulus-3.6.0}/tests/test_shell_mode.py +0 -0
  300. {dulus-3.5.0 → dulus-3.6.0}/tests/test_skills.py +0 -0
  301. {dulus-3.5.0 → dulus-3.6.0}/tests/test_steer_input.py +0 -0
  302. {dulus-3.5.0 → dulus-3.6.0}/tests/test_subagent.py +0 -0
  303. {dulus-3.5.0 → dulus-3.6.0}/tests/test_task.py +0 -0
  304. {dulus-3.5.0 → dulus-3.6.0}/tests/test_telegram_buffer.py +0 -0
  305. {dulus-3.5.0 → dulus-3.6.0}/tests/test_think_tool.py +0 -0
  306. {dulus-3.5.0 → dulus-3.6.0}/tests/test_todo_tool.py +0 -0
  307. {dulus-3.5.0 → dulus-3.6.0}/tests/test_todo_visualization.py +0 -0
  308. {dulus-3.5.0 → dulus-3.6.0}/tests/test_tool_registry.py +0 -0
  309. {dulus-3.5.0 → dulus-3.6.0}/tests/test_voice.py +0 -0
  310. {dulus-3.5.0 → dulus-3.6.0}/tests/test_wire_events.py +0 -0
  311. {dulus-3.5.0 → dulus-3.6.0}/tmux_offloader.py +0 -0
  312. {dulus-3.5.0 → dulus-3.6.0}/tmux_tools.py +0 -0
  313. {dulus-3.5.0 → dulus-3.6.0}/tool_registry.py +0 -0
  314. {dulus-3.5.0 → dulus-3.6.0}/tools.py +0 -0
  315. {dulus-3.5.0 → dulus-3.6.0}/ui/__init__.py +0 -0
  316. {dulus-3.5.0 → dulus-3.6.0}/ui/input.py +0 -0
  317. {dulus-3.5.0 → dulus-3.6.0}/ui/render.py +0 -0
  318. {dulus-3.5.0 → dulus-3.6.0}/voice/__init__.py +0 -0
  319. {dulus-3.5.0 → dulus-3.6.0}/voice/audio_utils.py +0 -0
  320. {dulus-3.5.0 → dulus-3.6.0}/voice/keyterms.py +0 -0
  321. {dulus-3.5.0 → dulus-3.6.0}/voice/recorder.py +0 -0
  322. {dulus-3.5.0 → dulus-3.6.0}/voice/stt.py +0 -0
  323. {dulus-3.5.0 → dulus-3.6.0}/voice/tts.py +0 -0
  324. {dulus-3.5.0 → dulus-3.6.0}/voice/wake_word.py +0 -0
  325. {dulus-3.5.0 → dulus-3.6.0}/webbridge/__init__.py +0 -0
  326. {dulus-3.5.0 → dulus-3.6.0}/webbridge/core.py +0 -0
  327. {dulus-3.5.0 → dulus-3.6.0}/webbridge/tools.py +0 -0
  328. {dulus-3.5.0 → dulus-3.6.0}/webchat.py +0 -0
  329. {dulus-3.5.0 → dulus-3.6.0}/webchat_server.py +0 -0
  330. {dulus-3.5.0 → dulus-3.6.0}/welcome.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dulus
3
- Version: 3.5.0
3
+ Version: 3.6.0
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
@@ -3,6 +3,10 @@
3
3
  ## 🔥🔥🔥 News (Pacific Time)
4
4
 
5
5
 
6
+ - July 3, 2026 (**v3.6.0**): **🧙 `/sage` (alias `/sabio`) — the AI studies your prompt before touching anything.** Inspired by ticket-intake classifier patterns but pointed the right way: instead of classifying requests into a database, Dulus decomposes YOUR request like a senior architect doing intake. Four phases: **INTAKE** (break the request into atomic sub-requests with category, priority and a verifiable "done"), **QUALITY GATE** (is it ambiguous? imprecise? mixing unrelated problems? — if missing info BLOCKS execution, ALL clarification questions arrive batched in one AskUserQuestion; otherwise assumptions are stated explicitly and it moves on), **PLAN** (ordered steps, tools per step, risks, verification — multi-step work registers via TaskCreate), **EXECUTE** (verify as you go, adapt honestly when reality diverges). `/sage` alone arms it one-shot for your NEXT prompt; `/sage <request>` runs the full treatment immediately; `/sage off|status` to manage. Difference vs `/plan`: plan mode is read-only planning for big projects — sage studies AND executes in one flow, built for the everyday "think before you act".
7
+
8
+ - July 3, 2026 (**v3.5.0**): **🕵️ unbroker bundled — your agent removes you from data brokers, free.** Ported from [NousResearch/hermes-agent](https://github.com/NousResearch/hermes-agent) (MIT, by SHL0MS) and seasoned for Dulus: finds a consenting person's exposed PII (name, addresses, phones, relatives) across people-search sites and removes it — CCPA/GDPR opt-out emails, cluster-parents-first ordering, verified-before-disclosure, audit ledger, scheduled re-scans when brokers re-list you. Consent-gated, no CAPTCHA defeating, least-disclosure by design. What DeleteMe/Incogni charge a subscription for, as a transparent self-hosted skill your own agent runs. 22 curated brokers out of the box (~50 via BADBOOL refresh + the CA registry's ~545 with the DROP one-shot). Just say: *"remove my data from data brokers"*. Also in 3.5.0: modern web GUI (`dulus --gui`, React + SSE), opt-in anonymous telemetry, Claude vision attachment fix.
9
+
6
10
  - July 3, 2026: **📡 dulus.work — the final piece, announced.** Kevin finally revealed the idea he'd been keeping secret — even from Dulus itself (opsec against your own AI is crazy work 😂). Every agent ships updates. Nobody ships THIS. The domain is live, the pieces have been quietly shipping for months (SelfImprove engine, Auto-Adapter, skills format, cloudsave...), and now they converge. Already in motion. Stay tuned. 🦅🇩🇴 → [dulus.work](https://dulus.work)
7
11
 
8
12
  - May 16, 2026: **New community $DULUS token live on pump.fun** — fresh community launch on Solana: [`9R8rrjXxcfQPmLTCLhmVpjr2uesjjkcgkinE6Lwdpump`](https://pump.fun/coin/9R8rrjXxcfQPmLTCLhmVpjr2uesjjkcgkinE6Lwdpump). Same posture as before: community-launched, I didn't create it, I'm part of the journey, the open-source project stays free forever. Website FAQ + links updated. 🦅🇩🇴
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dulus
3
- Version: 3.5.0
3
+ Version: 3.6.0
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
@@ -52,6 +52,7 @@ Slash commands in REPL:
52
52
  /autojob Toggle auto-job printer (auto-print job results)
53
53
  /auto_show Toggle auto-show for visual tools (ASCII art, etc.)
54
54
  /ultra_search Toggle ULTRA_SEARCH mode
55
+ /sage [req] Sage mode: decompose+quality-check+plan the prompt before executing (alias: /sabio; no arg = arm for next prompt)
55
56
  /permissions [mode] Set permission mode
56
57
  /afk Toggle AFK mode (auto-dismiss questions, auto-approve tools)
57
58
  /yolo Toggle YOLO mode (auto-approve ALL actions without prompts)
@@ -897,6 +898,7 @@ _HELP_PAGES = [
897
898
  ("/autojob", "Auto-print job results (toggle)"),
898
899
  ("/auto_show", "Auto-render visual tools (toggle)"),
899
900
  ("/ultra_search", "Aggressive multi-query search"),
901
+ ("/sage [req]", "Sage mode: study+plan prompt before executing (/sabio)"),
900
902
  ("/permissions [mode]", "Set permission mode"),
901
903
  ("/afk", "AFK mode (auto-approve tools)"),
902
904
  ("/yolo", "YOLO mode (auto-approve ALL)"),
@@ -8080,6 +8082,78 @@ def cmd_plan(args: str, state, config) -> bool:
8080
8082
  return ("__plan__", arg)
8081
8083
 
8082
8084
 
8085
+ # ── Sage mode (/sage · /sabio) ──────────────────────────────────────────────
8086
+ # Inspired by intake-classifier patterns: before executing, the AI studies the
8087
+ # request like a senior architect doing ticket intake — breaks it into atomic
8088
+ # issues, runs a quality gate (ambiguity/scope/actionability), asks blocking
8089
+ # clarification questions, THEN plans and executes.
8090
+
8091
+ _SAGE_WRAPPER_PREFIX = """[SAGE MODE — structured intake & planning. Study the request below BEFORE acting.]
8092
+
8093
+ Phase 1 — INTAKE (breakdown):
8094
+ Decompose the request into its atomic sub-requests. For each one state: a one-line summary, category (code / research / infra / content / ops / other), priority (low|med|high|critical), and what "done" looks like (verifiable).
8095
+
8096
+ Phase 2 — QUALITY GATE:
8097
+ Evaluate the request itself: is it ambiguous? imprecise? does it mix multiple unrelated problems? is it actionable as stated? in scope for this environment?
8098
+ - If missing info BLOCKS correct execution → ask the user via AskUserQuestion (batch ALL questions into ONE call with options).
8099
+ - Otherwise, state your working assumptions explicitly in one short list and continue.
8100
+
8101
+ Phase 3 — PLAN:
8102
+ Produce a concrete ordered plan: steps, the tools you will use per step, risks, and how you will verify each step actually worked. For multi-step work, register the plan with TaskCreate so progress is trackable.
8103
+
8104
+ Phase 4 — EXECUTE:
8105
+ Execute the plan step by step, verifying as you go. If reality diverges from the plan, say so honestly and adapt. Never report "done" without having verified.
8106
+
8107
+ Show Phases 1-3 to the user briefly (compact, no theater) before executing.
8108
+
8109
+ USER REQUEST:
8110
+ """
8111
+
8112
+
8113
+ def _sage_wrap(prompt: str) -> str:
8114
+ """Wrap a raw user prompt in the sage intake+planning contract."""
8115
+ return _SAGE_WRAPPER_PREFIX + prompt
8116
+
8117
+
8118
+ def cmd_sage(args: str, state, config):
8119
+ """Sage mode — the AI studies, decomposes and plans your prompt before executing.
8120
+
8121
+ /sage — arm sage mode for your NEXT prompt
8122
+ /sage <request> — run intake + planning + execution on <request> right now
8123
+ /sage off — disarm
8124
+ /sage status — show whether sage mode is armed
8125
+ """
8126
+ arg = args.strip()
8127
+ low = arg.lower()
8128
+
8129
+ if low in ("off", "cancel", "no"):
8130
+ if config.pop("_sage_armed", None):
8131
+ info("Sage mode disarmed.")
8132
+ else:
8133
+ info("Sage mode was not armed.")
8134
+ return True
8135
+
8136
+ if low == "status":
8137
+ if config.get("_sage_armed"):
8138
+ info("Sage mode: ARMED — next prompt will be studied + planned first.")
8139
+ else:
8140
+ info("Sage mode: inactive.")
8141
+ return True
8142
+
8143
+ if not arg:
8144
+ config["_sage_armed"] = True
8145
+ ok("Sage mode armed 🧙 — your NEXT prompt will be decomposed, quality-checked and planned before execution.")
8146
+ info("Cancel with /sage off")
8147
+ return True
8148
+
8149
+ # /sage <request> — run it right now
8150
+ return ("__sage__", arg)
8151
+
8152
+
8153
+ # /sabio is the Spanish alias for /sage
8154
+ cmd_sabio = cmd_sage
8155
+
8156
+
8083
8157
  def cmd_compact(args: str, state, config) -> bool:
8084
8158
  """Manually compact conversation history.
8085
8159
 
@@ -9640,6 +9714,8 @@ COMMANDS = {
9640
9714
  "checkpoint": cmd_checkpoint,
9641
9715
  "rewind": cmd_rewind,
9642
9716
  "plan": cmd_plan,
9717
+ "sage": cmd_sage,
9718
+ "sabio": cmd_sabio,
9643
9719
  "compact": cmd_compact,
9644
9720
  "init": cmd_init,
9645
9721
  "export": cmd_export,
@@ -9679,7 +9755,7 @@ def handle_slash(line: str, state, config) -> Union[bool, tuple]:
9679
9755
  if handler:
9680
9756
  result = handler(args, state, config)
9681
9757
  # cmd_voice/cmd_image/cmd_brainstorm/cmd_plan return sentinels to ask the REPL to run_query
9682
- if isinstance(result, tuple) and result[0] in ("__voice__", "__image__", "__video__", "__brainstorm__", "__worker__", "__ssj_cmd__", "__ssj_query__", "__ssj_debate__", "__ssj_passthrough__", "__ssj_promote_worker__", "__plan__", "__plugin_main_agent__", "__roundtable__", "__roundtable_stop__"):
9758
+ if isinstance(result, tuple) and result[0] in ("__voice__", "__image__", "__video__", "__brainstorm__", "__worker__", "__ssj_cmd__", "__ssj_query__", "__ssj_debate__", "__ssj_passthrough__", "__ssj_promote_worker__", "__plan__", "__sage__", "__plugin_main_agent__", "__roundtable__", "__roundtable_stop__"):
9683
9759
  return result
9684
9760
  return True
9685
9761
 
@@ -9761,6 +9837,8 @@ _CMD_META: dict[str, tuple[str, list[str]]] = {
9761
9837
  "checkpoint": ("List / restore checkpoints", ["clear"]),
9762
9838
  "rewind": ("Rewind to checkpoint (alias)", ["clear"]),
9763
9839
  "plan": ("Enter/exit plan mode", ["done", "status"]),
9840
+ "sage": ("Sage mode — study+plan the prompt before executing", ["off", "status"]),
9841
+ "sabio": ("Modo sabio — estudia+planifica el prompt antes de ejecutar (alias)", ["off", "status"]),
9764
9842
  "compact": ("Compact conversation history", []),
9765
9843
  "init": ("Initialize DULUS.md template", []),
9766
9844
  "export": ("Export conversation to file", []),
@@ -11653,6 +11731,17 @@ def repl(config: dict, initial_prompt: str = None):
11653
11731
  print(clr("\n (interrupted)", "yellow"))
11654
11732
  break
11655
11733
 
11734
+ # Sage sentinel: ("__sage__", request) — intake + plan + execute
11735
+ if result[0] == "__sage__":
11736
+ _, sage_req = result
11737
+ print(clr(" 🧙 Sage mode — studying the request before acting…", "dim"))
11738
+ try:
11739
+ run_query(_sage_wrap(sage_req))
11740
+ except KeyboardInterrupt:
11741
+ _track_ctrl_c()
11742
+ print(clr("\n (interrupted)", "yellow"))
11743
+ break
11744
+
11656
11745
  # Plugin main-agent handoff sentinel:
11657
11746
  # ("__plugin_main_agent__", plugin_name, plugin_source)
11658
11747
  # Triggered by `/plugin install name@url --main-agent` — the main agent
@@ -11881,6 +11970,11 @@ def repl(config: dict, initial_prompt: str = None):
11881
11970
  continue
11882
11971
 
11883
11972
  try:
11973
+ # Sage mode armed via /sage (no args): wrap THIS prompt in the
11974
+ # intake+planning contract, then disarm (one-shot).
11975
+ if config.pop("_sage_armed", None):
11976
+ print(clr(" 🧙 Sage mode — studying the request before acting…", "dim"))
11977
+ user_input = _sage_wrap(user_input)
11884
11978
  run_query(user_input)
11885
11979
 
11886
11980
  # Auto-save config after each turn for web providers to persist session IDs
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "dulus"
7
- version = "3.5.0"
7
+ version = "3.6.0"
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"
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