dulus 3.4.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.
- {dulus-3.4.0 → dulus-3.6.0}/MANIFEST.in +3 -0
- {dulus-3.4.0/dulus.egg-info → dulus-3.6.0}/PKG-INFO +106 -1
- {dulus-3.4.0 → dulus-3.6.0}/README.md +105 -0
- dulus-3.6.0/analytics.py +144 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/index.html +30 -9
- {dulus-3.4.0 → dulus-3.6.0}/docs/news.md +6 -0
- {dulus-3.4.0 → dulus-3.6.0/dulus.egg-info}/PKG-INFO +106 -1
- {dulus-3.4.0 → dulus-3.6.0}/dulus.egg-info/SOURCES.txt +70 -0
- {dulus-3.4.0 → dulus-3.6.0}/dulus.egg-info/top_level.txt +3 -0
- {dulus-3.4.0 → dulus-3.6.0}/dulus.py +12318 -12175
- dulus-3.6.0/dulus_gui_web.py +825 -0
- dulus-3.6.0/gui/dulus_orchestrator/App.tsx +197 -0
- dulus-3.6.0/gui/dulus_orchestrator/THIRD_PARTY_NOTICES.md +10 -0
- dulus-3.6.0/gui/dulus_orchestrator/dist/index.html +189 -0
- dulus-3.6.0/gui/dulus_orchestrator/dist/standalone.html +189 -0
- dulus-3.6.0/gui/dulus_orchestrator/index.html +121 -0
- dulus-3.6.0/gui/dulus_orchestrator/index.tsx +17 -0
- dulus-3.6.0/gui/dulus_orchestrator/metadata.json +7 -0
- dulus-3.6.0/gui/dulus_orchestrator/package-lock.json +3143 -0
- dulus-3.6.0/gui/dulus_orchestrator/package.json +30 -0
- dulus-3.6.0/gui/dulus_orchestrator/types.ts +169 -0
- dulus-3.6.0/gui/dulus_orchestrator/utils.ts +75 -0
- dulus-3.6.0/gui/dulus_orchestrator/vertex-ai-proxy-interceptor.js +155 -0
- dulus-3.6.0/gui/dulus_orchestrator/vite.config.ts +44 -0
- {dulus-3.4.0 → dulus-3.6.0}/providers.py +5513 -5453
- {dulus-3.4.0 → dulus-3.6.0}/pyproject.toml +10 -1
- {dulus-3.4.0 → dulus-3.6.0}/skill/bundled/README.md +16 -0
- dulus-3.6.0/skill/bundled/unbroker/README.md +168 -0
- dulus-3.6.0/skill/bundled/unbroker/SKILL.md +317 -0
- dulus-3.6.0/skill/bundled/unbroker/references/brokers/addresses.json +52 -0
- dulus-3.6.0/skill/bundled/unbroker/references/brokers/advancedbackgroundchecks.json +50 -0
- dulus-3.6.0/skill/bundled/unbroker/references/brokers/beenverified.json +56 -0
- dulus-3.6.0/skill/bundled/unbroker/references/brokers/clustal.json +47 -0
- dulus-3.6.0/skill/bundled/unbroker/references/brokers/clustrmaps.json +52 -0
- dulus-3.6.0/skill/bundled/unbroker/references/brokers/cyberbackgroundchecks.json +53 -0
- dulus-3.6.0/skill/bundled/unbroker/references/brokers/familytreenow.json +50 -0
- dulus-3.6.0/skill/bundled/unbroker/references/brokers/fastpeoplesearch.json +44 -0
- dulus-3.6.0/skill/bundled/unbroker/references/brokers/intelius.json +99 -0
- dulus-3.6.0/skill/bundled/unbroker/references/brokers/mylife.json +35 -0
- dulus-3.6.0/skill/bundled/unbroker/references/brokers/nuwber.json +52 -0
- dulus-3.6.0/skill/bundled/unbroker/references/brokers/peekyou.json +53 -0
- dulus-3.6.0/skill/bundled/unbroker/references/brokers/peoplefinders.json +53 -0
- dulus-3.6.0/skill/bundled/unbroker/references/brokers/radaris.json +58 -0
- dulus-3.6.0/skill/bundled/unbroker/references/brokers/rehold.json +48 -0
- dulus-3.6.0/skill/bundled/unbroker/references/brokers/searchpeoplefree.json +53 -0
- dulus-3.6.0/skill/bundled/unbroker/references/brokers/socialcatfish.json +52 -0
- dulus-3.6.0/skill/bundled/unbroker/references/brokers/spokeo.json +56 -0
- dulus-3.6.0/skill/bundled/unbroker/references/brokers/thatsthem.json +46 -0
- dulus-3.6.0/skill/bundled/unbroker/references/brokers/truepeoplesearch.json +44 -0
- dulus-3.6.0/skill/bundled/unbroker/references/brokers/usphonebook.json +53 -0
- dulus-3.6.0/skill/bundled/unbroker/references/brokers/whitepages.json +57 -0
- dulus-3.6.0/skill/bundled/unbroker/references/legal/ccpa.md +27 -0
- dulus-3.6.0/skill/bundled/unbroker/references/legal/drop.md +34 -0
- dulus-3.6.0/skill/bundled/unbroker/references/legal/gdpr.md +20 -0
- dulus-3.6.0/skill/bundled/unbroker/references/methods.md +361 -0
- dulus-3.6.0/skill/bundled/unbroker/references/site-playbooks.md +56 -0
- dulus-3.6.0/skill/bundled/unbroker/references/state-machine.md +56 -0
- dulus-3.6.0/skill/bundled/unbroker/scripts/autopilot.py +417 -0
- dulus-3.6.0/skill/bundled/unbroker/scripts/badbool.py +177 -0
- dulus-3.6.0/skill/bundled/unbroker/scripts/brokers.py +77 -0
- dulus-3.6.0/skill/bundled/unbroker/scripts/cdp.py +159 -0
- dulus-3.6.0/skill/bundled/unbroker/scripts/config.py +144 -0
- dulus-3.6.0/skill/bundled/unbroker/scripts/crypto.py +88 -0
- dulus-3.6.0/skill/bundled/unbroker/scripts/dossier.py +135 -0
- dulus-3.6.0/skill/bundled/unbroker/scripts/email_modes.py +76 -0
- dulus-3.6.0/skill/bundled/unbroker/scripts/emailer.py +342 -0
- dulus-3.6.0/skill/bundled/unbroker/scripts/ledger.py +170 -0
- dulus-3.6.0/skill/bundled/unbroker/scripts/legal.py +63 -0
- dulus-3.6.0/skill/bundled/unbroker/scripts/paths.py +84 -0
- dulus-3.6.0/skill/bundled/unbroker/scripts/pdd.py +914 -0
- dulus-3.6.0/skill/bundled/unbroker/scripts/registry.py +293 -0
- dulus-3.6.0/skill/bundled/unbroker/scripts/report.py +161 -0
- dulus-3.6.0/skill/bundled/unbroker/scripts/scan.py +32 -0
- dulus-3.6.0/skill/bundled/unbroker/scripts/storage.py +138 -0
- dulus-3.6.0/skill/bundled/unbroker/scripts/tiers.py +283 -0
- dulus-3.6.0/skill/bundled/unbroker/scripts/vectors.py +53 -0
- dulus-3.6.0/skill/bundled/unbroker/templates/consent/authorization.md +15 -0
- dulus-3.6.0/skill/bundled/unbroker/templates/emails/ccpa-authorized-agent.txt +24 -0
- dulus-3.6.0/skill/bundled/unbroker/templates/emails/ccpa-deletion.txt +22 -0
- dulus-3.6.0/skill/bundled/unbroker/templates/emails/ccpa-indirect-deletion.txt +30 -0
- dulus-3.6.0/skill/bundled/unbroker/templates/emails/gdpr-erasure.txt +19 -0
- dulus-3.6.0/skill/bundled/unbroker/templates/emails/generic-optout.txt +15 -0
- {dulus-3.4.0 → dulus-3.6.0}/webchat_server.py +59 -0
- {dulus-3.4.0 → dulus-3.6.0}/LICENSE +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/agent.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/backend/__init__.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/backend/agents_bridge.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/backend/compressor.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/backend/context.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/backend/githook.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/backend/marketplace.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/backend/mempalace_bridge.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/backend/personas.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/backend/plugins.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/backend/server.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/backend/tasks.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/batch_api.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/checkpoint/__init__.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/checkpoint/hooks.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/checkpoint/store.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/checkpoint/types.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/claude_code_watcher.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/clipboard_utils.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/cloudsave.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/common.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/compaction.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/config.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/context.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/data/__init__.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/data/active_persona.json +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/data/marketplace.json +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/data/personas.json +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/data/plugins/__init__.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/data/plugins/composio/__init__.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/data/plugins/composio/composio_plugin/__init__.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/data/plugins/composio/composio_plugin/session_manager.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/data/plugins/composio/composio_plugin/tool_generator.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/data/plugins/composio/plugin.json +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/data/plugins/composio/plugin_tool.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/data/tasks.json +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/API.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/BRAND_GUIDE.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/CHANGELOG.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/CONTRIBUTING.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/DEPLOYMENT.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/Dulus_AI_Whitepaper_(v2.0).pdf +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/FAQ.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/GETTING_STARTED.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/INVESTOR_BRIEF.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/README.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/README_AR.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/README_EN.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/README_ES.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/README_FR.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/README_JA.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/README_KO.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/README_PT.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/README_RU.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/README_ZH.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/SECURITY.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/__init__.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/api.html +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/architecture.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/azure-speech-template.json +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/dashboard/index.html +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/divider.svg +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/dulus-bird.png +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/generate.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/hero.svg +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/nvidia-models.svg +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/particle-playground.html +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/personas/index.html +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/poetry-banner.png +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/preview.html +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/sec-agents.svg +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/sec-brainstorm.svg +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/sec-bridges.svg +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/sec-features.svg +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/sec-freetier.svg +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/sec-memory.svg +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/sec-models.svg +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/sec-perms.svg +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/sec-plugins.svg +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/sec-quickstart.svg +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/sec-ssj.svg +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/spinners.svg +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/split-pane.svg +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/docs/terminal-boot.svg +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/dulus.egg-info/dependency_links.txt +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/dulus.egg-info/entry_points.txt +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/dulus.egg-info/requires.txt +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/dulus_gui.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/dulus_mcp/__init__.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/dulus_mcp/client.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/dulus_mcp/config.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/dulus_mcp/tools.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/dulus_mcp/types.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/dulus_tools/__init__.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/dulus_tools/add_dir_manager.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/dulus_tools/afk_mode.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/dulus_tools/approval_runtime.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/dulus_tools/background_tasks.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/dulus_tools/clipboard_utils.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/dulus_tools/diff_visualizer.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/dulus_tools/export_import.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/dulus_tools/hook_engine.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/dulus_tools/notification_manager.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/dulus_tools/session_fork.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/dulus_tools/shell_mode.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/dulus_tools/todo_visualizer.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/dulus_tools/wire_events.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/dulus_tools/yolo_mode.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/governance.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/gui/__init__.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/gui/agent_bridge.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/gui/chat_widget.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/gui/main_window.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/gui/personas.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/gui/sandbox_server.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/gui/session_utils.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/gui/settings_dialog.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/gui/sidebar.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/gui/tasks_view.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/gui/themes.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/gui/tool_panel.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/input.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/license_manager.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/memory/__init__.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/memory/audit.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/memory/consolidator.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/memory/context.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/memory/offload.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/memory/palace.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/memory/scan.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/memory/sessions.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/memory/store.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/memory/tools.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/memory/types.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/memory/vector_search.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/multi_agent/__init__.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/multi_agent/subagent.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/multi_agent/tools.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/offload_helper.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/personality_config.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/plugin/__init__.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/plugin/autoadapter.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/plugin/loader.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/plugin/recommend.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/plugin/store.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/plugin/types.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/sandbox/README.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/sandbox/__init__.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/sandbox/components.json +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/sandbox/dist/assets/index-DE51D6wI.css +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/sandbox/dist/assets/index-DMCCNE9Y.js +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/sandbox/dist/index.html +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/sandbox/dist/wallpaper-default.jpg +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/sandbox/dist/wallpapers/default.jpeg +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/sandbox/dist/wallpapers/light.jpeg +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/sandbox/dist/wallpapers/nature.jpeg +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/sandbox/dist/wallpapers/tech.jpeg +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/sandbox/eslint.config.js +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/sandbox/index.html +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/sandbox/info.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/sandbox/package-lock.json +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/sandbox/package.json +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/sandbox/postcss.config.js +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/sandbox/tailwind.config.js +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/sandbox/tsconfig.app.json +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/sandbox/tsconfig.json +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/sandbox/tsconfig.node.json +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/sandbox/vite.config.ts +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/sandbox_bootstrap.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/setup.cfg +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/skill/__init__.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/skill/builtin.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/skill/bundled/LICENSE-obsidian-skills +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/skill/bundled/defuddle/SKILL.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/skill/bundled/json-canvas/SKILL.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/skill/bundled/json-canvas/references/EXAMPLES.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/skill/bundled/obsidian-bases/SKILL.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/skill/bundled/obsidian-bases/references/FUNCTIONS_REFERENCE.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/skill/bundled/obsidian-cli/SKILL.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/skill/bundled/obsidian-markdown/SKILL.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/skill/bundled/obsidian-markdown/references/CALLOUTS.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/skill/bundled/obsidian-markdown/references/EMBEDS.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/skill/bundled/obsidian-markdown/references/PROPERTIES.md +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/skill/clawhub.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/skill/executor.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/skill/loader.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/skill/tools.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/skills.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/soul.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/spinner.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/string_utils.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/subagent.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/task/__init__.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/task/store.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/task/tools.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/task/types.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_afk_yolo.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_approval_runtime.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_background_task_tools.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_background_tasks.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_checkpoint.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_clipboard_utils.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_compaction.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_diff_view.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_diff_visualization.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_display_blocks.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_export_import.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_hook_engine.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_injection_fix.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_license.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_mcp.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_memory.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_notification_manager.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_plugin.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_session_fork.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_shell_mode.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_skills.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_steer_input.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_subagent.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_task.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_telegram_buffer.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_think_tool.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_todo_tool.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_todo_visualization.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_tool_registry.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_voice.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tests/test_wire_events.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tmux_offloader.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tmux_tools.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tool_registry.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/tools.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/ui/__init__.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/ui/input.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/ui/render.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/voice/__init__.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/voice/audio_utils.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/voice/keyterms.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/voice/recorder.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/voice/stt.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/voice/tts.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/voice/wake_word.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/webbridge/__init__.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/webbridge/core.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/webbridge/tools.py +0 -0
- {dulus-3.4.0 → dulus-3.6.0}/webchat.py +0 -0
- {dulus-3.4.0 → dulus-3.6.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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dulus
|
|
3
|
-
Version: 3.
|
|
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
|
|
@@ -133,6 +133,8 @@ SET /sticky_input ON since the first run for the best experience!
|
|
|
133
133
|
|
|
134
134
|
> Full changelog: [`docs/news.md`](docs/news.md) · Inside the REPL: `/news`
|
|
135
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
|
+
|
|
136
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. 🦅🇩🇴
|
|
137
139
|
|
|
138
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.
|
|
@@ -165,3 +167,106 @@ dulus get the prices of NVDA, TSLA, SP500:
|
|
|
165
167
|
Be creative!!!
|
|
166
168
|
|
|
167
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
|
+
```
|
|
@@ -68,6 +68,8 @@ SET /sticky_input ON since the first run for the best experience!
|
|
|
68
68
|
|
|
69
69
|
> Full changelog: [`docs/news.md`](docs/news.md) · Inside the REPL: `/news`
|
|
70
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
|
+
|
|
71
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. 🦅🇩🇴
|
|
72
74
|
|
|
73
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.
|
|
@@ -100,3 +102,106 @@ dulus get the prices of NVDA, TSLA, SP500:
|
|
|
100
102
|
Be creative!!!
|
|
101
103
|
|
|
102
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
|
+
```
|
dulus-3.6.0/analytics.py
ADDED
|
@@ -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
|
+
})
|
|
@@ -693,7 +693,7 @@ footer{
|
|
|
693
693
|
<a href="#quickstart">Quickstart</a>
|
|
694
694
|
<a href="#faq">FAQ</a>
|
|
695
695
|
</div>
|
|
696
|
-
<span class="nav-version dim">
|
|
696
|
+
<span class="nav-version dim">v3.4.0</span>
|
|
697
697
|
<a href="#quickstart" class="nav-cta">Install</a>
|
|
698
698
|
</nav>
|
|
699
699
|
|
|
@@ -715,7 +715,7 @@ footer{
|
|
|
715
715
|
</div>
|
|
716
716
|
<span class="hero-slash">// hunt. patch. ship.</span>
|
|
717
717
|
<p class="hero-sub">
|
|
718
|
-
~
|
|
718
|
+
~36K lines of readable Python. <strong>Any model</strong> — Claude, GPT, Gemini, DeepSeek, Kimi, Qwen, and 14 free models via NVIDIA NIM.
|
|
719
719
|
No build step. No gatekeeping.
|
|
720
720
|
</p>
|
|
721
721
|
<div class="hero-actions">
|
|
@@ -752,11 +752,24 @@ footer{
|
|
|
752
752
|
⬢ $DULUS
|
|
753
753
|
</span>
|
|
754
754
|
</a>
|
|
755
|
+
<a class="hb" href="https://dulus.ai" target="_blank" rel="noopener">
|
|
756
|
+
<span class="hb-label">cloud</span>
|
|
757
|
+
<span class="hb-val" style="color:#ff7a1a">
|
|
758
|
+
☁ dulus.ai
|
|
759
|
+
</span>
|
|
760
|
+
</a>
|
|
761
|
+
</div>
|
|
762
|
+
|
|
763
|
+
<!-- Product Hunt launch badge -->
|
|
764
|
+
<div style="margin-top:14px">
|
|
765
|
+
<a href="https://www.producthunt.com/posts/dulus-ai" target="_blank" rel="noopener">
|
|
766
|
+
<img src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=dulus-ai&theme=dark" alt="Dulus Ai - AI agents | Product Hunt" style="width:220px;height:48px" width="220" height="48" loading="lazy" />
|
|
767
|
+
</a>
|
|
755
768
|
</div>
|
|
756
769
|
|
|
757
770
|
<div class="hero-stats">
|
|
758
771
|
<div class="hero-stat">
|
|
759
|
-
<div class="val">
|
|
772
|
+
<div class="val">31</div>
|
|
760
773
|
<div class="lbl">Built-in tools</div>
|
|
761
774
|
</div>
|
|
762
775
|
<div class="hero-stat">
|
|
@@ -764,7 +777,7 @@ footer{
|
|
|
764
777
|
<div class="lbl">Providers</div>
|
|
765
778
|
</div>
|
|
766
779
|
<div class="hero-stat">
|
|
767
|
-
<div class="val">
|
|
780
|
+
<div class="val">774+</div>
|
|
768
781
|
<div class="lbl">Unit tests</div>
|
|
769
782
|
</div>
|
|
770
783
|
</div>
|
|
@@ -781,7 +794,7 @@ footer{
|
|
|
781
794
|
<div class="t-title">dulus — interactive session</div>
|
|
782
795
|
</div>
|
|
783
796
|
<div class="t-body" id="term-body">
|
|
784
|
-
<span class="t-line"><span style="color:var(--accent);font-weight:700">▲ DULUS</span> <span class="dim">
|
|
797
|
+
<span class="t-line"><span style="color:var(--accent);font-weight:700">▲ DULUS</span> <span class="dim">v3.4.0 · ready</span></span>
|
|
785
798
|
<span class="t-line"> </span>
|
|
786
799
|
<span id="term-content"></span>
|
|
787
800
|
<span class="t-cursor" id="t-cursor"></span>
|
|
@@ -808,12 +821,12 @@ footer{
|
|
|
808
821
|
<div class="sub dim">11 providers</div>
|
|
809
822
|
</div>
|
|
810
823
|
<div class="metric reveal reveal-delay-2">
|
|
811
|
-
<div class="val"><span class="counter" data-target="
|
|
824
|
+
<div class="val"><span class="counter" data-target="774">0</span><span class="unit">+</span></div>
|
|
812
825
|
<div class="lbl">Unit tests</div>
|
|
813
826
|
<div class="sub dim">all green</div>
|
|
814
827
|
</div>
|
|
815
828
|
<div class="metric reveal reveal-delay-3">
|
|
816
|
-
<div class="val"><span class="counter" data-target="
|
|
829
|
+
<div class="val"><span class="counter" data-target="36">0</span><span class="unit">K</span></div>
|
|
817
830
|
<div class="lbl">Lines of Python</div>
|
|
818
831
|
<div class="sub dim">readable. forgiving.</div>
|
|
819
832
|
</div>
|
|
@@ -837,7 +850,7 @@ footer{
|
|
|
837
850
|
<div class="feature reveal reveal-delay-1">
|
|
838
851
|
<div class="f-icon">🔧</div>
|
|
839
852
|
<span class="f-num">02</span>
|
|
840
|
-
<h3>
|
|
853
|
+
<h3>31 Built-in Tools</h3>
|
|
841
854
|
<p>Read, Write, Edit, Bash, Glob, Grep, WebFetch, WebSearch, NotebookEdit, GetDiagnostics, Memory, Tasks, Agents, Skills, and more. Everything the agent needs.</p>
|
|
842
855
|
</div>
|
|
843
856
|
<div class="feature reveal reveal-delay-2">
|
|
@@ -4672,7 +4685,7 @@ document.querySelectorAll('.reveal:not(.visible)').forEach(el=>revealObs3.observ
|
|
|
4672
4685
|
<li><a href="#quickstart">Installation</a></li>
|
|
4673
4686
|
<li><a href="#models">Models</a></li>
|
|
4674
4687
|
<li><a href="#features">Features</a></li>
|
|
4675
|
-
<li><a href="
|
|
4688
|
+
<li><a href="https://www.producthunt.com/posts/dulus-ai" target="_blank" rel="noopener">Product Hunt ↗</a></li>
|
|
4676
4689
|
</ul>
|
|
4677
4690
|
</div>
|
|
4678
4691
|
<div class="footer-col">
|
|
@@ -4693,6 +4706,14 @@ document.querySelectorAll('.reveal:not(.visible)').forEach(el=>revealObs3.observ
|
|
|
4693
4706
|
<li><a href="#local-models">Ollama (local)</a></li>
|
|
4694
4707
|
</ul>
|
|
4695
4708
|
</div>
|
|
4709
|
+
<div class="footer-col">
|
|
4710
|
+
<h4>Ecosystem</h4>
|
|
4711
|
+
<ul>
|
|
4712
|
+
<li><a href="https://dulus.ai" target="_blank" rel="noopener">☁ dulus.ai — cloud OS ↗</a></li>
|
|
4713
|
+
<li><a href="https://dulus.work" target="_blank" rel="noopener">📡 dulus.work — the hub ↗</a></li>
|
|
4714
|
+
<li><a href="https://www.producthunt.com/posts/dulus-ai" target="_blank" rel="noopener">▲ Product Hunt ↗</a></li>
|
|
4715
|
+
</ul>
|
|
4716
|
+
</div>
|
|
4696
4717
|
</div>
|
|
4697
4718
|
<div class="footer-bottom">
|
|
4698
4719
|
<p>Commercial license · Built by <a href="https://github.com/KevRojo" style="color:var(--accent)">KevRojo</a> · Named after the bird, not the rocket · 2026</p>
|
|
@@ -3,6 +3,12 @@
|
|
|
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
|
+
|
|
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)
|
|
11
|
+
|
|
6
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. 🦅🇩🇴
|
|
7
13
|
|
|
8
14
|
- May 16, 2026 (**v0.2.93**): **IA without an API key, first-run flow** — Dulus's actual differentiator finally got promoted out of the slash-command obscurity it lived in. The welcome wizard now leads with a single question: *"¿Probamos AHORA con Gemini gratis (sin login)? [gemini]"*. Press Enter → on the next REPL boot, after `/doctor` finishes, Dulus auto-fires `/harvest-gemini`. Playwright opens `gemini.google.com`, the user types `hola` once in the GUEST session (no Google account needed), Dulus captures the session token, and the REPL is now talking to real Gemini through the web UI. From `pip install dulus` to working IA in 30 seconds, zero accounts created, $0 spent. Same flow works for Claude.ai / Kimi.com / Qwen / DeepSeek if the user has those accounts. Also: a soft yellow tip resurfaces on every REPL start for returning users who never harvested AND have no cloud API key configured — the feature stops being invisible. Plus: PyPI/wheel description rewritten to lead with "Use frontier IA as an agent — no API key, no subscription, \$0" instead of the old "Spanish-first" line that gated the door for the 90% of the planet who doesn't read Spanish.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dulus
|
|
3
|
-
Version: 3.
|
|
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
|
|
@@ -133,6 +133,8 @@ SET /sticky_input ON since the first run for the best experience!
|
|
|
133
133
|
|
|
134
134
|
> Full changelog: [`docs/news.md`](docs/news.md) · Inside the REPL: `/news`
|
|
135
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
|
+
|
|
136
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. 🦅🇩🇴
|
|
137
139
|
|
|
138
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.
|
|
@@ -165,3 +167,106 @@ dulus get the prices of NVDA, TSLA, SP500:
|
|
|
165
167
|
Be creative!!!
|
|
166
168
|
|
|
167
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
|
+
```
|