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.
- {dulus-3.5.0/dulus.egg-info → dulus-3.6.0}/PKG-INFO +1 -1
- {dulus-3.5.0 → dulus-3.6.0}/docs/news.md +4 -0
- {dulus-3.5.0 → dulus-3.6.0/dulus.egg-info}/PKG-INFO +1 -1
- {dulus-3.5.0 → dulus-3.6.0}/dulus.py +95 -1
- {dulus-3.5.0 → dulus-3.6.0}/pyproject.toml +1 -1
- {dulus-3.5.0 → dulus-3.6.0}/LICENSE +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/MANIFEST.in +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/README.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/agent.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/analytics.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/backend/__init__.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/backend/agents_bridge.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/backend/compressor.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/backend/context.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/backend/githook.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/backend/marketplace.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/backend/mempalace_bridge.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/backend/personas.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/backend/plugins.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/backend/server.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/backend/tasks.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/batch_api.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/checkpoint/__init__.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/checkpoint/hooks.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/checkpoint/store.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/checkpoint/types.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/claude_code_watcher.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/clipboard_utils.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/cloudsave.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/common.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/compaction.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/config.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/context.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/data/__init__.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/data/active_persona.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/data/marketplace.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/data/personas.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/data/plugins/__init__.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/data/plugins/composio/__init__.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/data/plugins/composio/composio_plugin/__init__.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/data/plugins/composio/composio_plugin/session_manager.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/data/plugins/composio/composio_plugin/tool_generator.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/data/plugins/composio/plugin.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/data/plugins/composio/plugin_tool.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/data/tasks.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/API.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/BRAND_GUIDE.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/CHANGELOG.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/CONTRIBUTING.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/DEPLOYMENT.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/Dulus_AI_Whitepaper_(v2.0).pdf +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/FAQ.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/GETTING_STARTED.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/INVESTOR_BRIEF.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/README.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/README_AR.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/README_EN.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/README_ES.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/README_FR.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/README_JA.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/README_KO.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/README_PT.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/README_RU.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/README_ZH.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/SECURITY.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/__init__.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/api.html +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/architecture.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/azure-speech-template.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/dashboard/index.html +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/divider.svg +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/dulus-bird.png +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/generate.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/hero.svg +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/index.html +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/nvidia-models.svg +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/particle-playground.html +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/personas/index.html +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/poetry-banner.png +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/preview.html +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/sec-agents.svg +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/sec-brainstorm.svg +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/sec-bridges.svg +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/sec-features.svg +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/sec-freetier.svg +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/sec-memory.svg +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/sec-models.svg +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/sec-perms.svg +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/sec-plugins.svg +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/sec-quickstart.svg +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/sec-ssj.svg +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/spinners.svg +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/split-pane.svg +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/docs/terminal-boot.svg +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus.egg-info/SOURCES.txt +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus.egg-info/dependency_links.txt +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus.egg-info/entry_points.txt +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus.egg-info/requires.txt +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus.egg-info/top_level.txt +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus_gui.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus_gui_web.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus_mcp/__init__.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus_mcp/client.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus_mcp/config.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus_mcp/tools.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus_mcp/types.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/__init__.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/add_dir_manager.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/afk_mode.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/approval_runtime.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/background_tasks.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/clipboard_utils.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/diff_visualizer.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/export_import.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/hook_engine.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/notification_manager.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/session_fork.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/shell_mode.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/todo_visualizer.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/wire_events.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/dulus_tools/yolo_mode.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/governance.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/gui/__init__.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/gui/agent_bridge.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/gui/chat_widget.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/gui/dulus_orchestrator/App.tsx +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/gui/dulus_orchestrator/THIRD_PARTY_NOTICES.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/gui/dulus_orchestrator/dist/index.html +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/gui/dulus_orchestrator/dist/standalone.html +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/gui/dulus_orchestrator/index.html +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/gui/dulus_orchestrator/index.tsx +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/gui/dulus_orchestrator/metadata.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/gui/dulus_orchestrator/package-lock.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/gui/dulus_orchestrator/package.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/gui/dulus_orchestrator/types.ts +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/gui/dulus_orchestrator/utils.ts +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/gui/dulus_orchestrator/vertex-ai-proxy-interceptor.js +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/gui/dulus_orchestrator/vite.config.ts +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/gui/main_window.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/gui/personas.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/gui/sandbox_server.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/gui/session_utils.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/gui/settings_dialog.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/gui/sidebar.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/gui/tasks_view.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/gui/themes.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/gui/tool_panel.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/input.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/license_manager.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/memory/__init__.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/memory/audit.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/memory/consolidator.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/memory/context.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/memory/offload.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/memory/palace.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/memory/scan.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/memory/sessions.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/memory/store.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/memory/tools.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/memory/types.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/memory/vector_search.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/multi_agent/__init__.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/multi_agent/subagent.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/multi_agent/tools.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/offload_helper.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/personality_config.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/plugin/__init__.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/plugin/autoadapter.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/plugin/loader.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/plugin/recommend.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/plugin/store.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/plugin/types.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/providers.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/sandbox/README.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/sandbox/__init__.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/sandbox/components.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/sandbox/dist/assets/index-DE51D6wI.css +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/sandbox/dist/assets/index-DMCCNE9Y.js +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/sandbox/dist/index.html +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/sandbox/dist/wallpaper-default.jpg +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/sandbox/dist/wallpapers/default.jpeg +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/sandbox/dist/wallpapers/light.jpeg +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/sandbox/dist/wallpapers/nature.jpeg +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/sandbox/dist/wallpapers/tech.jpeg +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/sandbox/eslint.config.js +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/sandbox/index.html +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/sandbox/info.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/sandbox/package-lock.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/sandbox/package.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/sandbox/postcss.config.js +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/sandbox/tailwind.config.js +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/sandbox/tsconfig.app.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/sandbox/tsconfig.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/sandbox/tsconfig.node.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/sandbox/vite.config.ts +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/sandbox_bootstrap.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/setup.cfg +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/__init__.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/builtin.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/LICENSE-obsidian-skills +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/README.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/defuddle/SKILL.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/json-canvas/SKILL.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/json-canvas/references/EXAMPLES.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/obsidian-bases/SKILL.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/obsidian-bases/references/FUNCTIONS_REFERENCE.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/obsidian-cli/SKILL.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/obsidian-markdown/SKILL.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/obsidian-markdown/references/CALLOUTS.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/obsidian-markdown/references/EMBEDS.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/obsidian-markdown/references/PROPERTIES.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/README.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/SKILL.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/addresses.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/advancedbackgroundchecks.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/beenverified.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/clustal.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/clustrmaps.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/cyberbackgroundchecks.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/familytreenow.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/fastpeoplesearch.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/intelius.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/mylife.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/nuwber.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/peekyou.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/peoplefinders.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/radaris.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/rehold.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/searchpeoplefree.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/socialcatfish.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/spokeo.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/thatsthem.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/truepeoplesearch.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/usphonebook.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/brokers/whitepages.json +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/legal/ccpa.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/legal/drop.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/legal/gdpr.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/methods.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/site-playbooks.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/references/state-machine.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/autopilot.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/badbool.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/brokers.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/cdp.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/config.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/crypto.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/dossier.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/email_modes.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/emailer.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/ledger.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/legal.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/paths.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/pdd.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/registry.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/report.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/scan.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/storage.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/tiers.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/scripts/vectors.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/templates/consent/authorization.md +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/templates/emails/ccpa-authorized-agent.txt +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/templates/emails/ccpa-deletion.txt +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/templates/emails/ccpa-indirect-deletion.txt +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/templates/emails/gdpr-erasure.txt +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/bundled/unbroker/templates/emails/generic-optout.txt +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/clawhub.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/executor.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/loader.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skill/tools.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/skills.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/soul.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/spinner.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/string_utils.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/subagent.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/task/__init__.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/task/store.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/task/tools.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/task/types.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_afk_yolo.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_approval_runtime.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_background_task_tools.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_background_tasks.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_checkpoint.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_clipboard_utils.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_compaction.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_diff_view.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_diff_visualization.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_display_blocks.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_export_import.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_hook_engine.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_injection_fix.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_license.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_mcp.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_memory.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_notification_manager.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_plugin.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_session_fork.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_shell_mode.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_skills.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_steer_input.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_subagent.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_task.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_telegram_buffer.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_think_tool.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_todo_tool.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_todo_visualization.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_tool_registry.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_voice.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tests/test_wire_events.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tmux_offloader.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tmux_tools.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tool_registry.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/tools.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/ui/__init__.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/ui/input.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/ui/render.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/voice/__init__.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/voice/audio_utils.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/voice/keyterms.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/voice/recorder.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/voice/stt.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/voice/tts.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/voice/wake_word.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/webbridge/__init__.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/webbridge/core.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/webbridge/tools.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/webchat.py +0 -0
- {dulus-3.5.0 → dulus-3.6.0}/webchat_server.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|