dulus 3.13.1__tar.gz → 3.13.2__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.13.1/dulus.egg-info → dulus-3.13.2}/PKG-INFO +168 -11
- {dulus-3.13.1 → dulus-3.13.2}/README.md +166 -10
- {dulus-3.13.1 → dulus-3.13.2}/docs/CHANGELOG.md +12 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/README.md +0 -1
- {dulus-3.13.1 → dulus-3.13.2}/docs/news.md +3 -0
- {dulus-3.13.1 → dulus-3.13.2/dulus.egg-info}/PKG-INFO +168 -11
- {dulus-3.13.1 → dulus-3.13.2}/dulus.egg-info/SOURCES.txt +0 -2
- {dulus-3.13.1 → dulus-3.13.2}/dulus.egg-info/requires.txt +1 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus.egg-info/top_level.txt +1 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus.py +56 -2
- {dulus-3.13.1 → dulus-3.13.2}/dulus_account.py +96 -0
- {dulus-3.13.1 → dulus-3.13.2}/pyproject.toml +3 -1
- dulus-3.13.1/docs/Dulus_AI_Whitepaper_(v2.0).pdf +0 -0
- dulus-3.13.1/docs/Dulus_YC_Company_Overview_Aug_2026.pdf +1 -504
- {dulus-3.13.1 → dulus-3.13.2}/LICENSE +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/MANIFEST.in +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/agent.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/algolia_search.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/analytics.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/backend/__init__.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/backend/agents_bridge.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/backend/compressor.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/backend/context.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/backend/githook.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/backend/marketplace.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/backend/mempalace_bridge.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/backend/paths.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/backend/personas.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/backend/plugins.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/backend/server.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/backend/tasks.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/banners/__init__.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/banners/banner_rotator.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/banners/banners_dulus_ai.txt +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/batch_api.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/checkpoint/__init__.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/checkpoint/hooks.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/checkpoint/store.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/checkpoint/types.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/cli_animations/__init__.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/cli_animations/__main__.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/cli_animations/ansi.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/cli_animations/assets/ascii/dulus_logo.txt +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/cli_animations/assets/ascii/eagle.txt +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/cli_animations/assets/ascii/terminal_art.txt +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/cli_animations/banners.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/cli_animations/demo.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/cli_animations/effects.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/cli_animations/effort_slider.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/cli_animations/progress.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/cli_animations/py.typed +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/cli_animations/spinners.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/cli_animations/status.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/clipboard_utils.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/cloudsave.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/common.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/compaction.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/config.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/context.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/data/__init__.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/data/active_persona.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/data/marketplace.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/data/personas.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/data/plugins/__init__.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/data/plugins/composio/__init__.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/data/plugins/composio/composio_plugin/__init__.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/data/plugins/composio/composio_plugin/session_manager.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/data/plugins/composio/composio_plugin/tool_generator.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/data/plugins/composio/plugin.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/data/plugins/composio/plugin_tool.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/data/tasks.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/display_blocks.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/API.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/BRAND_GUIDE.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/CONTRIBUTING.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/DEPLOYMENT.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/FAQ.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/GETTING_STARTED.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/README_AR.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/README_EN.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/README_ES.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/README_FR.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/README_JA.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/README_KO.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/README_PT.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/README_RU.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/README_ZH.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/SECURITY.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/__init__.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/api.html +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/architecture.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/azure-speech-template.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/dashboard/index.html +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/divider.svg +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/dulus-bird.png +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/generate.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/index.html +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/nvidia-models.svg +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/particle-playground.html +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/personas/index.html +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/poetry-banner.png +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/preview.html +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/python-console.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/readme/auto-adapter.png +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/readme/dulus-os.png +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/readme/hero.png +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/readme/lookback_two_windows.png +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/readme/pyc_heap.svg +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/readme/pyc_receipts.svg +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/readme/pyc_trap.svg +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/readme/roundtable.png +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/readme/task-board.png +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/readme/webchat.png +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/sec-agents.svg +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/sec-brainstorm.svg +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/sec-bridges.svg +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/sec-features.svg +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/sec-freetier.svg +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/sec-memory.svg +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/sec-models.svg +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/sec-perms.svg +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/sec-plugins.svg +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/sec-quickstart.svg +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/sec-ssj.svg +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/spinners.svg +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/split-pane.svg +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/terminal-boot.svg +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/docs/termux-edge.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus.egg-info/dependency_links.txt +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus.egg-info/entry_points.txt +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus_bar_client.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus_gui.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus_mcp/__init__.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus_mcp/client.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus_mcp/commands.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus_mcp/config.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus_mcp/hub.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus_mcp/tools.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus_mcp/types.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus_quick_menu.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus_tools/__init__.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus_tools/add_dir_manager.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus_tools/afk_mode.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus_tools/approval_runtime.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus_tools/background_tasks.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus_tools/clipboard_utils.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus_tools/diff_visualizer.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus_tools/export_import.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus_tools/hook_engine.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus_tools/notification_manager.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus_tools/session_fork.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus_tools/shell_mode.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus_tools/todo_visualizer.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus_tools/tree_ls.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus_tools/wire_events.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/dulus_tools/yolo_mode.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/file_filter.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/fs_compass.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/governance.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/gui/__init__.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/gui/agent_bridge.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/gui/chat_widget.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/gui/main_window.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/gui/personas.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/gui/sandbox_server.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/gui/session_utils.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/gui/settings_dialog.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/gui/sidebar.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/gui/tasks_view.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/gui/themes.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/gui/tool_panel.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/input.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/license_manager.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/lookback.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/__init__.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/audit.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/consolidator.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/context.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/mempalace_bridge.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/offload.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/palace.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/scan.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/seeds/insights/adaptation_guides.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/seeds/insights/askuserquestion_after_numbered_list.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/seeds/insights/background_jobs_no_extra_timers.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/seeds/insights/cleverness_over_resources.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/seeds/insights/corporate_tls_breaks_curl_cffi.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/seeds/insights/hardened_rules.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/seeds/insights/investigator_workflow_heuristic.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/seeds/insights/native_code_over_sketchy_plugins.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/seeds/insights/no_personal_info_in_code.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/seeds/insights/searches_include_modified_date.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/seeds/insights/tmux_send_keys_power_patterns.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/seeds/insights/token_optimization_technique.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/seeds/insights/tool_chaining_capability.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/seeds/insights/webbridge_evaluate_first_pattern.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/seeds/short_memory.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/sessions.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/store.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/tools.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/types.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/memory/vector_search.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/model_params.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/multi_agent/__init__.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/multi_agent/subagent.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/multi_agent/tools.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/paste_placeholders.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/personality_config.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/plugin/__init__.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/plugin/autoadapter.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/plugin/loader.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/plugin/recommend.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/plugin/store.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/plugin/types.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/profiles.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/providers.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/pyconsole.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/sandbox/README.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/sandbox/__init__.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/sandbox/dist/assets/index-DE51D6wI.css +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/sandbox/dist/assets/index-DMCCNE9Y.js +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/sandbox/dist/index.html +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/sandbox/dist/wallpaper-default.jpg +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/sandbox/dist/wallpapers/default.jpeg +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/sandbox/dist/wallpapers/light.jpeg +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/sandbox/dist/wallpapers/nature.jpeg +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/sandbox/dist/wallpapers/tech.jpeg +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/sandbox/info.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/sandbox_bootstrap.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/setup.cfg +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/__init__.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/builtin.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/LICENSE-obsidian-skills +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/README.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/defuddle/SKILL.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/json-canvas/SKILL.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/json-canvas/references/EXAMPLES.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/obsidian-bases/SKILL.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/obsidian-bases/references/FUNCTIONS_REFERENCE.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/obsidian-cli/SKILL.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/obsidian-markdown/SKILL.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/obsidian-markdown/references/CALLOUTS.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/obsidian-markdown/references/EMBEDS.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/obsidian-markdown/references/PROPERTIES.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/README.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/SKILL.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/brokers/addresses.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/brokers/advancedbackgroundchecks.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/brokers/beenverified.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/brokers/clustal.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/brokers/clustrmaps.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/brokers/cyberbackgroundchecks.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/brokers/familytreenow.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/brokers/fastpeoplesearch.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/brokers/intelius.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/brokers/mylife.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/brokers/nuwber.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/brokers/peekyou.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/brokers/peoplefinders.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/brokers/radaris.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/brokers/rehold.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/brokers/searchpeoplefree.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/brokers/socialcatfish.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/brokers/spokeo.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/brokers/thatsthem.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/brokers/truepeoplesearch.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/brokers/usphonebook.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/brokers/whitepages.json +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/legal/ccpa.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/legal/drop.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/legal/gdpr.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/methods.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/site-playbooks.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/references/state-machine.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/scripts/autopilot.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/scripts/badbool.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/scripts/brokers.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/scripts/cdp.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/scripts/config.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/scripts/crypto.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/scripts/dossier.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/scripts/email_modes.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/scripts/emailer.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/scripts/ledger.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/scripts/legal.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/scripts/paths.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/scripts/pdd.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/scripts/registry.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/scripts/report.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/scripts/scan.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/scripts/storage.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/scripts/tiers.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/scripts/vectors.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/templates/consent/authorization.md +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/templates/emails/ccpa-authorized-agent.txt +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/templates/emails/ccpa-deletion.txt +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/templates/emails/ccpa-indirect-deletion.txt +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/templates/emails/gdpr-erasure.txt +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/bundled/unbroker/templates/emails/generic-optout.txt +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/clawhub.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/executor.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/loader.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skill/tools.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/skills.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/soul.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/spinner.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/steer_input.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/subagent.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/task/__init__.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/task/store.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/task/tools.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/task/types.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_afk_yolo.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_approval_runtime.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_background_task_tools.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_background_tasks.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_chatgpt_oauth.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_checkpoint.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_cli_animations_integration.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_clipboard_utils.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_compaction.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_composio_tool_generator.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_diff_view.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_diff_visualization.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_display_blocks.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_dulus_account.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_export_import.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_grok_usage.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_hook_engine.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_injection_fix.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_json_protocol.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_license.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_lookback_cache.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_mcp.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_mcp_algolia.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_memory.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_memory_home_resolution.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_notification_manager.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_plugin.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_profile_isolation.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_profile_plugin_scope.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_provider_errors.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_session_fork.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_shell_detection.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_shell_mode.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_skills.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_skillssh_algolia.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_steer_input.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_subagent.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_task.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_telegram_buffer.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_think_tool.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_todo_tool.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_todo_visualization.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_tool_registry.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_tree_ls.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_voice.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_webbridge_tabs.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tests/test_wire_events.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tmux_tools.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tool_registry.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tools.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tools_background.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tools_think.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/tools_todo.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/ui/__init__.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/ui/input.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/ui/render.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/updater.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/voice/__init__.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/voice/audio_utils.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/voice/keyterms.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/voice/recorder.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/voice/stt.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/voice/tts.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/voice/wake_word.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/webbridge/__init__.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/webbridge/core.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/webbridge/tools.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/webchat.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/webchat_server.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/webchat_ui/__init__.py +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/webchat_ui/app.js +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/webchat_ui/index.html +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/webchat_ui/style.css +0 -0
- {dulus-3.13.1 → dulus-3.13.2}/welcome.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: dulus
|
|
3
|
-
Version: 3.13.
|
|
3
|
+
Version: 3.13.2
|
|
4
4
|
Summary: Provider-independent agent runtime for the terminal — cloud and local models, real tools, MCP, plugins, memory, sub-agents, and Dulus OS.
|
|
5
5
|
Author-email: KevRojo <dev@dulus.ai>
|
|
6
6
|
Maintainer-email: KevRojo <dev@dulus.ai>
|
|
@@ -56,6 +56,7 @@ Requires-Dist: typing-extensions>=4.10.0
|
|
|
56
56
|
Requires-Dist: pyttsx3
|
|
57
57
|
Requires-Dist: composio>=1.0.0rc2
|
|
58
58
|
Requires-Dist: beautifulsoup4>=4.12.0
|
|
59
|
+
Requires-Dist: segno>=1.6.0
|
|
59
60
|
Requires-Dist: sentry-sdk>=2.0.0
|
|
60
61
|
Requires-Dist: truststore>=0.9
|
|
61
62
|
Requires-Dist: pytesseract>=0.3.10
|
|
@@ -129,7 +130,63 @@ Requires-Dist: pytesseract>=0.3.10; extra == "full"
|
|
|
129
130
|
</p>
|
|
130
131
|
|
|
131
132
|
<p align="center">
|
|
132
|
-
<
|
|
133
|
+
<strong>🔑 Need an API key?</strong> Stop waiting on the website.<br>
|
|
134
|
+
It has been in <strong>dulus-public (pip)</strong> forever — mint it from the CLI:
|
|
135
|
+
</p>
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
pip install -U dulus
|
|
139
|
+
dulus
|
|
140
|
+
# inside the REPL:
|
|
141
|
+
/login dulus # sign in (OAuth — browser opens)
|
|
142
|
+
/login dulus key # mint a dulus_sk_* key (shown once)
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
# then point anything OpenAI-compatible at the router
|
|
147
|
+
export OPENAI_API_KEY='dulus_sk_...' # the key you just minted
|
|
148
|
+
export OPENAI_BASE_URL='https://control.dulus.ai/v1'
|
|
149
|
+
# or: openai.base_url = "https://control.dulus.ai/v1"
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
<p align="center">
|
|
153
|
+
<em>Damn brother… are you really waiting for the website update to get your API key?</em><br>
|
|
154
|
+
That’s on Dulus-public since years. Have fun. It was a surprise u,u — <strong>$DULUS</strong>
|
|
155
|
+
</p>
|
|
156
|
+
|
|
157
|
+
<p align="center">
|
|
158
|
+
<a href="#get-your-dulus-api-key-no-website-required"><strong>🔑 Get your API key from pip →</strong></a>
|
|
159
|
+
·
|
|
160
|
+
<a href="https://dulus.online"><strong>🚀 Platform → dulus.online</strong></a>
|
|
161
|
+
</p>
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
<p align="center">
|
|
165
|
+
<strong>⛽ $DULUS Fuel is LIVE in the CLI — <code>/fuel</code> is ready.</strong><br>
|
|
166
|
+
Sign in, get your <strong>reload wallet as a console QR</strong>, scan with Phantom / Solflare,<br>
|
|
167
|
+
send <strong>$DULUS</strong>, and Fuel credits hit your account. Utility coin that actually powers AI.
|
|
168
|
+
</p>
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
pip install -U dulus
|
|
172
|
+
dulus
|
|
173
|
+
# inside the REPL:
|
|
174
|
+
/login dulus # sign in
|
|
175
|
+
/fuel # balance + scannable reload-wallet QR
|
|
176
|
+
/fuel deposit # QR only
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
<p align="center">
|
|
180
|
+
<em>Tested. Reloaded. Fuel credited.</em> We’re not playing points — this is on-chain gas for inference.<br>
|
|
181
|
+
<strong>$DULUS</strong> · <code>control.dulus.ai/v1</code> · 12+ models · spent by the token 🦅
|
|
182
|
+
</p>
|
|
183
|
+
|
|
184
|
+
<p align="center">
|
|
185
|
+
<a href="#fuel--reload-wallet-qr-ready"><strong>⛽ /fuel walkthrough →</strong></a>
|
|
186
|
+
·
|
|
187
|
+
<a href="#get-your-dulus-api-key-no-website-required"><strong>🔑 API key from pip →</strong></a>
|
|
188
|
+
·
|
|
189
|
+
<a href="https://dulus.online"><strong>🚀 dulus.online</strong></a>
|
|
133
190
|
</p>
|
|
134
191
|
|
|
135
192
|
<p align="center">
|
|
@@ -147,12 +204,10 @@ Requires-Dist: pytesseract>=0.3.10; extra == "full"
|
|
|
147
204
|
<a href="LICENSE"><img src="https://img.shields.io/badge/license-GPLv3-ff6b1f?style=flat-square&labelColor=07070a" alt="GPLv3 license"></a>
|
|
148
205
|
</p>
|
|
149
206
|
|
|
150
|
-
<p align="center">
|
|
151
|
-
<a href="docs/Dulus_YC_Company_Overview_Aug_2026.pdf"><strong>📈 Investors — read the company overview (PDF) ↗</strong></a>
|
|
152
|
-
</p>
|
|
153
|
-
|
|
154
207
|
<p align="center">
|
|
155
208
|
<a href="#install-in-30-seconds"><strong>Install</strong></a> ·
|
|
209
|
+
<a href="#get-your-dulus-api-key-no-website-required"><strong>API key</strong></a> ·
|
|
210
|
+
<a href="#fuel--reload-wallet-qr-ready"><strong>Fuel / QR</strong></a> ·
|
|
156
211
|
<a href="#why-dulus"><strong>Why Dulus</strong></a> ·
|
|
157
212
|
<a href="#one-runtime-every-model"><strong>Models</strong></a> ·
|
|
158
213
|
<a href="#turn-any-python-repo-into-tools"><strong>Extensions</strong></a> ·
|
|
@@ -194,6 +249,98 @@ Rather use keys, local models, or your own endpoint? Dulus does that too — **3
|
|
|
194
249
|
|
|
195
250
|
---
|
|
196
251
|
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## Fuel + reload wallet QR (READY)
|
|
255
|
+
|
|
256
|
+
**`/fuel` is ready.** Top up AI compute with **$DULUS** — the utility token that *is* your credit.
|
|
257
|
+
|
|
258
|
+
```text
|
|
259
|
+
/login dulus # OAuth — browser opens
|
|
260
|
+
/fuel # ⛽ balance + console QR of YOUR reload wallet
|
|
261
|
+
/fuel deposit # address + QR only
|
|
262
|
+
/fuel balance # balance only
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
1. Run `/fuel` — Dulus prints your unique Solana deposit address **and a terminal QR** (segno, scannable).
|
|
266
|
+
2. Open **Phantom / Solflare** → scan the QR → send **$DULUS**.
|
|
267
|
+
3. Control plane credits **Fuel** to your account.
|
|
268
|
+
4. Burn it on `dulus-*` models via the CLI or `https://control.dulus.ai/v1`.
|
|
269
|
+
|
|
270
|
+
No website form. No waiting on a dashboard refresh to *see* the wallet. The QR is in your terminal the second you login.
|
|
271
|
+
|
|
272
|
+
```bash
|
|
273
|
+
pip install -U dulus # includes segno for console QR
|
|
274
|
+
dulus
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
| Command | What you get |
|
|
278
|
+
|---|---|
|
|
279
|
+
| `/login dulus` | Sign in + reload QR on success |
|
|
280
|
+
| `/fuel` | Balance + reload wallet QR |
|
|
281
|
+
| `/fuel deposit` | QR / address only |
|
|
282
|
+
| `/login dulus key` | Mint `dulus_sk_*` for OpenAI SDK → same Fuel pool |
|
|
283
|
+
|
|
284
|
+
**$DULUS** = on-chain gas for inference. Transferable. Spent by the token. Tested end-to-end — reload lands, Fuel credits. 🦅
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
## Get your Dulus API key (no website required)
|
|
289
|
+
|
|
290
|
+
Damn brother… are you really waiting for the website update to get your API key?
|
|
291
|
+
|
|
292
|
+
**You don’t need the website.** Minting a `dulus_sk_*` key has been in **dulus-public** (`pip install dulus`) for ages. The CLI talks straight to the control plane.
|
|
293
|
+
|
|
294
|
+
```bash
|
|
295
|
+
pip install -U dulus
|
|
296
|
+
dulus
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
Inside the REPL:
|
|
300
|
+
|
|
301
|
+
```text
|
|
302
|
+
/login dulus # sign in (OAuth PKCE — browser opens, no API key pasted by hand)
|
|
303
|
+
/login dulus key # mint a dulus_sk_* key for CI, SDKs, servers (shown once — copy it)
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
Then point **any** OpenAI-compatible client at the router and burn **$DULUS** fuel by the token:
|
|
307
|
+
|
|
308
|
+
```bash
|
|
309
|
+
export OPENAI_API_KEY='dulus_sk_...'
|
|
310
|
+
export OPENAI_BASE_URL='https://control.dulus.ai/v1'
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
```python
|
|
314
|
+
from openai import OpenAI
|
|
315
|
+
client = OpenAI(
|
|
316
|
+
api_key="dulus_sk_...", # from /login dulus key
|
|
317
|
+
base_url="https://control.dulus.ai/v1",
|
|
318
|
+
)
|
|
319
|
+
r = client.chat.completions.create(
|
|
320
|
+
model="dulus-a-9b", # or dulus-b-27b, dulus-x-397b, …
|
|
321
|
+
messages=[{"role": "user", "content": "hola desde el router"}],
|
|
322
|
+
)
|
|
323
|
+
print(r.choices[0].message.content)
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
Or stay inside Dulus and use the built-in provider (same login, Fuel-metered):
|
|
327
|
+
|
|
328
|
+
```text
|
|
329
|
+
/login dulus
|
|
330
|
+
/model dulus-a-9b
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
| Want | Do this |
|
|
334
|
+
|---|---|
|
|
335
|
+
| Interactive agent on Dulus models | `/login dulus` then `/model dulus-*` |
|
|
336
|
+
| API key for scripts / CI / other tools | `/login dulus key` → `dulus_sk_*` |
|
|
337
|
+
| OpenAI SDK / anything compatible | `base_url=https://control.dulus.ai/v1` + that key |
|
|
338
|
+
| Fuel (`$DULUS`) | Spent per token on the control plane — utility coin, not a wallpaper ticker |
|
|
339
|
+
|
|
340
|
+
It was a surprise u,u — have fun. 🦅 **$DULUS**
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
197
344
|
## New — Python console: a live heap that costs no tokens
|
|
198
345
|
|
|
199
346
|
> 🧪 Fresh out of the private build. Try it and tell me how it feels.
|
|
@@ -347,7 +494,13 @@ dulus
|
|
|
347
494
|
### Pick any brain
|
|
348
495
|
|
|
349
496
|
```bash
|
|
350
|
-
#
|
|
497
|
+
# Dulus router (Fuel / $DULUS) — no website key form
|
|
498
|
+
dulus
|
|
499
|
+
# /login dulus
|
|
500
|
+
# /login dulus key # mint dulus_sk_* for SDKs
|
|
501
|
+
# /model dulus-a-9b
|
|
502
|
+
|
|
503
|
+
# Cloud provider key
|
|
351
504
|
export ANTHROPIC_API_KEY=sk-ant-...
|
|
352
505
|
dulus --model claude-sonnet-4-6
|
|
353
506
|
|
|
@@ -359,7 +512,7 @@ dulus --model ollama/qwen2.5-coder
|
|
|
359
512
|
git diff | dulus -p "review this diff and find the dangerous parts"
|
|
360
513
|
```
|
|
361
514
|
|
|
362
|
-
No key yet?
|
|
515
|
+
No third-party key yet? Use **`/login dulus`** for the hosted router, start with Ollama, NVIDIA NIM's free tier, or a browser-backed provider from the welcome flow.
|
|
363
516
|
|
|
364
517
|
---
|
|
365
518
|
|
|
@@ -403,10 +556,15 @@ Dulus does not make model choice an architectural decision. Switch providers dur
|
|
|
403
556
|
| **Local** | Ollama · LM Studio · vLLM · any OpenAI-compatible endpoint |
|
|
404
557
|
| **Edge / on-device** | `edge/*` — small models on your phone or in Termux via llama.cpp / Ollama |
|
|
405
558
|
| **Browser-backed** | Supported authenticated sessions for Claude, Gemini, Kimi, Qwen, and DeepSeek |
|
|
559
|
+
| **Dulus router (`$DULUS` Fuel)** | `dulus-*` models on `https://control.dulus.ai/v1` — `/login dulus` or `dulus_sk_*` from `/login dulus key` |
|
|
406
560
|
| **Free tier** | 14 models through NVIDIA NIM with automatic fallback |
|
|
407
561
|
|
|
408
562
|
```text
|
|
409
563
|
/model
|
|
564
|
+
/login dulus
|
|
565
|
+
/model dulus-a-9b
|
|
566
|
+
/model dulus-b-27b
|
|
567
|
+
/model dulus-x-397b
|
|
410
568
|
/model claude-sonnet-4-6
|
|
411
569
|
/model nvidia-web/deepseek-r1
|
|
412
570
|
/model ollama/qwen2.5-coder
|
|
@@ -644,7 +802,8 @@ Type `/` and press Tab inside the REPL to explore the live command list.
|
|
|
644
802
|
|
|
645
803
|
| Area | Commands |
|
|
646
804
|
|---|---|
|
|
647
|
-
|
|
|
805
|
+
| Account / Fuel | `/login dulus` · `/login dulus key` (mint `dulus_sk_*`) |
|
|
806
|
+
| Models | `/model` · `/nvidia` · `/ollama` · `dulus-*` on the router |
|
|
648
807
|
| Sessions | `/save` · `/load` · `/resume` · `/compact` |
|
|
649
808
|
| Memory | `/remember` · `/memory` |
|
|
650
809
|
| Work | `/task` · `/agents` · `/worker` · `/checkpoint` |
|
|
@@ -773,8 +932,6 @@ Documentation:
|
|
|
773
932
|
- [Contributing](docs/CONTRIBUTING.md)
|
|
774
933
|
- [Security](docs/SECURITY.md)
|
|
775
934
|
- [Release notes](docs/news.md)
|
|
776
|
-
- [Whitepaper](docs/Dulus_AI_Whitepaper_%28v2.0%29.pdf)
|
|
777
|
-
|
|
778
935
|
---
|
|
779
936
|
|
|
780
937
|
## Shipping in public
|
|
@@ -32,7 +32,63 @@
|
|
|
32
32
|
</p>
|
|
33
33
|
|
|
34
34
|
<p align="center">
|
|
35
|
-
<
|
|
35
|
+
<strong>🔑 Need an API key?</strong> Stop waiting on the website.<br>
|
|
36
|
+
It has been in <strong>dulus-public (pip)</strong> forever — mint it from the CLI:
|
|
37
|
+
</p>
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
pip install -U dulus
|
|
41
|
+
dulus
|
|
42
|
+
# inside the REPL:
|
|
43
|
+
/login dulus # sign in (OAuth — browser opens)
|
|
44
|
+
/login dulus key # mint a dulus_sk_* key (shown once)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# then point anything OpenAI-compatible at the router
|
|
49
|
+
export OPENAI_API_KEY='dulus_sk_...' # the key you just minted
|
|
50
|
+
export OPENAI_BASE_URL='https://control.dulus.ai/v1'
|
|
51
|
+
# or: openai.base_url = "https://control.dulus.ai/v1"
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
<p align="center">
|
|
55
|
+
<em>Damn brother… are you really waiting for the website update to get your API key?</em><br>
|
|
56
|
+
That’s on Dulus-public since years. Have fun. It was a surprise u,u — <strong>$DULUS</strong>
|
|
57
|
+
</p>
|
|
58
|
+
|
|
59
|
+
<p align="center">
|
|
60
|
+
<a href="#get-your-dulus-api-key-no-website-required"><strong>🔑 Get your API key from pip →</strong></a>
|
|
61
|
+
·
|
|
62
|
+
<a href="https://dulus.online"><strong>🚀 Platform → dulus.online</strong></a>
|
|
63
|
+
</p>
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
<p align="center">
|
|
67
|
+
<strong>⛽ $DULUS Fuel is LIVE in the CLI — <code>/fuel</code> is ready.</strong><br>
|
|
68
|
+
Sign in, get your <strong>reload wallet as a console QR</strong>, scan with Phantom / Solflare,<br>
|
|
69
|
+
send <strong>$DULUS</strong>, and Fuel credits hit your account. Utility coin that actually powers AI.
|
|
70
|
+
</p>
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
pip install -U dulus
|
|
74
|
+
dulus
|
|
75
|
+
# inside the REPL:
|
|
76
|
+
/login dulus # sign in
|
|
77
|
+
/fuel # balance + scannable reload-wallet QR
|
|
78
|
+
/fuel deposit # QR only
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
<p align="center">
|
|
82
|
+
<em>Tested. Reloaded. Fuel credited.</em> We’re not playing points — this is on-chain gas for inference.<br>
|
|
83
|
+
<strong>$DULUS</strong> · <code>control.dulus.ai/v1</code> · 12+ models · spent by the token 🦅
|
|
84
|
+
</p>
|
|
85
|
+
|
|
86
|
+
<p align="center">
|
|
87
|
+
<a href="#fuel--reload-wallet-qr-ready"><strong>⛽ /fuel walkthrough →</strong></a>
|
|
88
|
+
·
|
|
89
|
+
<a href="#get-your-dulus-api-key-no-website-required"><strong>🔑 API key from pip →</strong></a>
|
|
90
|
+
·
|
|
91
|
+
<a href="https://dulus.online"><strong>🚀 dulus.online</strong></a>
|
|
36
92
|
</p>
|
|
37
93
|
|
|
38
94
|
<p align="center">
|
|
@@ -50,12 +106,10 @@
|
|
|
50
106
|
<a href="LICENSE"><img src="https://img.shields.io/badge/license-GPLv3-ff6b1f?style=flat-square&labelColor=07070a" alt="GPLv3 license"></a>
|
|
51
107
|
</p>
|
|
52
108
|
|
|
53
|
-
<p align="center">
|
|
54
|
-
<a href="docs/Dulus_YC_Company_Overview_Aug_2026.pdf"><strong>📈 Investors — read the company overview (PDF) ↗</strong></a>
|
|
55
|
-
</p>
|
|
56
|
-
|
|
57
109
|
<p align="center">
|
|
58
110
|
<a href="#install-in-30-seconds"><strong>Install</strong></a> ·
|
|
111
|
+
<a href="#get-your-dulus-api-key-no-website-required"><strong>API key</strong></a> ·
|
|
112
|
+
<a href="#fuel--reload-wallet-qr-ready"><strong>Fuel / QR</strong></a> ·
|
|
59
113
|
<a href="#why-dulus"><strong>Why Dulus</strong></a> ·
|
|
60
114
|
<a href="#one-runtime-every-model"><strong>Models</strong></a> ·
|
|
61
115
|
<a href="#turn-any-python-repo-into-tools"><strong>Extensions</strong></a> ·
|
|
@@ -97,6 +151,98 @@ Rather use keys, local models, or your own endpoint? Dulus does that too — **3
|
|
|
97
151
|
|
|
98
152
|
---
|
|
99
153
|
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Fuel + reload wallet QR (READY)
|
|
157
|
+
|
|
158
|
+
**`/fuel` is ready.** Top up AI compute with **$DULUS** — the utility token that *is* your credit.
|
|
159
|
+
|
|
160
|
+
```text
|
|
161
|
+
/login dulus # OAuth — browser opens
|
|
162
|
+
/fuel # ⛽ balance + console QR of YOUR reload wallet
|
|
163
|
+
/fuel deposit # address + QR only
|
|
164
|
+
/fuel balance # balance only
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
1. Run `/fuel` — Dulus prints your unique Solana deposit address **and a terminal QR** (segno, scannable).
|
|
168
|
+
2. Open **Phantom / Solflare** → scan the QR → send **$DULUS**.
|
|
169
|
+
3. Control plane credits **Fuel** to your account.
|
|
170
|
+
4. Burn it on `dulus-*` models via the CLI or `https://control.dulus.ai/v1`.
|
|
171
|
+
|
|
172
|
+
No website form. No waiting on a dashboard refresh to *see* the wallet. The QR is in your terminal the second you login.
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
pip install -U dulus # includes segno for console QR
|
|
176
|
+
dulus
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
| Command | What you get |
|
|
180
|
+
|---|---|
|
|
181
|
+
| `/login dulus` | Sign in + reload QR on success |
|
|
182
|
+
| `/fuel` | Balance + reload wallet QR |
|
|
183
|
+
| `/fuel deposit` | QR / address only |
|
|
184
|
+
| `/login dulus key` | Mint `dulus_sk_*` for OpenAI SDK → same Fuel pool |
|
|
185
|
+
|
|
186
|
+
**$DULUS** = on-chain gas for inference. Transferable. Spent by the token. Tested end-to-end — reload lands, Fuel credits. 🦅
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## Get your Dulus API key (no website required)
|
|
191
|
+
|
|
192
|
+
Damn brother… are you really waiting for the website update to get your API key?
|
|
193
|
+
|
|
194
|
+
**You don’t need the website.** Minting a `dulus_sk_*` key has been in **dulus-public** (`pip install dulus`) for ages. The CLI talks straight to the control plane.
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
pip install -U dulus
|
|
198
|
+
dulus
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
Inside the REPL:
|
|
202
|
+
|
|
203
|
+
```text
|
|
204
|
+
/login dulus # sign in (OAuth PKCE — browser opens, no API key pasted by hand)
|
|
205
|
+
/login dulus key # mint a dulus_sk_* key for CI, SDKs, servers (shown once — copy it)
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Then point **any** OpenAI-compatible client at the router and burn **$DULUS** fuel by the token:
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
export OPENAI_API_KEY='dulus_sk_...'
|
|
212
|
+
export OPENAI_BASE_URL='https://control.dulus.ai/v1'
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
```python
|
|
216
|
+
from openai import OpenAI
|
|
217
|
+
client = OpenAI(
|
|
218
|
+
api_key="dulus_sk_...", # from /login dulus key
|
|
219
|
+
base_url="https://control.dulus.ai/v1",
|
|
220
|
+
)
|
|
221
|
+
r = client.chat.completions.create(
|
|
222
|
+
model="dulus-a-9b", # or dulus-b-27b, dulus-x-397b, …
|
|
223
|
+
messages=[{"role": "user", "content": "hola desde el router"}],
|
|
224
|
+
)
|
|
225
|
+
print(r.choices[0].message.content)
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
Or stay inside Dulus and use the built-in provider (same login, Fuel-metered):
|
|
229
|
+
|
|
230
|
+
```text
|
|
231
|
+
/login dulus
|
|
232
|
+
/model dulus-a-9b
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
| Want | Do this |
|
|
236
|
+
|---|---|
|
|
237
|
+
| Interactive agent on Dulus models | `/login dulus` then `/model dulus-*` |
|
|
238
|
+
| API key for scripts / CI / other tools | `/login dulus key` → `dulus_sk_*` |
|
|
239
|
+
| OpenAI SDK / anything compatible | `base_url=https://control.dulus.ai/v1` + that key |
|
|
240
|
+
| Fuel (`$DULUS`) | Spent per token on the control plane — utility coin, not a wallpaper ticker |
|
|
241
|
+
|
|
242
|
+
It was a surprise u,u — have fun. 🦅 **$DULUS**
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
100
246
|
## New — Python console: a live heap that costs no tokens
|
|
101
247
|
|
|
102
248
|
> 🧪 Fresh out of the private build. Try it and tell me how it feels.
|
|
@@ -250,7 +396,13 @@ dulus
|
|
|
250
396
|
### Pick any brain
|
|
251
397
|
|
|
252
398
|
```bash
|
|
253
|
-
#
|
|
399
|
+
# Dulus router (Fuel / $DULUS) — no website key form
|
|
400
|
+
dulus
|
|
401
|
+
# /login dulus
|
|
402
|
+
# /login dulus key # mint dulus_sk_* for SDKs
|
|
403
|
+
# /model dulus-a-9b
|
|
404
|
+
|
|
405
|
+
# Cloud provider key
|
|
254
406
|
export ANTHROPIC_API_KEY=sk-ant-...
|
|
255
407
|
dulus --model claude-sonnet-4-6
|
|
256
408
|
|
|
@@ -262,7 +414,7 @@ dulus --model ollama/qwen2.5-coder
|
|
|
262
414
|
git diff | dulus -p "review this diff and find the dangerous parts"
|
|
263
415
|
```
|
|
264
416
|
|
|
265
|
-
No key yet?
|
|
417
|
+
No third-party key yet? Use **`/login dulus`** for the hosted router, start with Ollama, NVIDIA NIM's free tier, or a browser-backed provider from the welcome flow.
|
|
266
418
|
|
|
267
419
|
---
|
|
268
420
|
|
|
@@ -306,10 +458,15 @@ Dulus does not make model choice an architectural decision. Switch providers dur
|
|
|
306
458
|
| **Local** | Ollama · LM Studio · vLLM · any OpenAI-compatible endpoint |
|
|
307
459
|
| **Edge / on-device** | `edge/*` — small models on your phone or in Termux via llama.cpp / Ollama |
|
|
308
460
|
| **Browser-backed** | Supported authenticated sessions for Claude, Gemini, Kimi, Qwen, and DeepSeek |
|
|
461
|
+
| **Dulus router (`$DULUS` Fuel)** | `dulus-*` models on `https://control.dulus.ai/v1` — `/login dulus` or `dulus_sk_*` from `/login dulus key` |
|
|
309
462
|
| **Free tier** | 14 models through NVIDIA NIM with automatic fallback |
|
|
310
463
|
|
|
311
464
|
```text
|
|
312
465
|
/model
|
|
466
|
+
/login dulus
|
|
467
|
+
/model dulus-a-9b
|
|
468
|
+
/model dulus-b-27b
|
|
469
|
+
/model dulus-x-397b
|
|
313
470
|
/model claude-sonnet-4-6
|
|
314
471
|
/model nvidia-web/deepseek-r1
|
|
315
472
|
/model ollama/qwen2.5-coder
|
|
@@ -547,7 +704,8 @@ Type `/` and press Tab inside the REPL to explore the live command list.
|
|
|
547
704
|
|
|
548
705
|
| Area | Commands |
|
|
549
706
|
|---|---|
|
|
550
|
-
|
|
|
707
|
+
| Account / Fuel | `/login dulus` · `/login dulus key` (mint `dulus_sk_*`) |
|
|
708
|
+
| Models | `/model` · `/nvidia` · `/ollama` · `dulus-*` on the router |
|
|
551
709
|
| Sessions | `/save` · `/load` · `/resume` · `/compact` |
|
|
552
710
|
| Memory | `/remember` · `/memory` |
|
|
553
711
|
| Work | `/task` · `/agents` · `/worker` · `/checkpoint` |
|
|
@@ -676,8 +834,6 @@ Documentation:
|
|
|
676
834
|
- [Contributing](docs/CONTRIBUTING.md)
|
|
677
835
|
- [Security](docs/SECURITY.md)
|
|
678
836
|
- [Release notes](docs/news.md)
|
|
679
|
-
- [Whitepaper](docs/Dulus_AI_Whitepaper_%28v2.0%29.pdf)
|
|
680
|
-
|
|
681
837
|
---
|
|
682
838
|
|
|
683
839
|
## Shipping in public
|
|
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [3.13.2] - 2026-08-31
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **`/fuel`** — $DULUS Fuel balance + console-scannable reload wallet QR (`segno`)
|
|
14
|
+
- Post-`/login dulus` shows the deposit QR so you can top up from Phantom/Solflare immediately
|
|
15
|
+
- Aliases: `/reload`, `/deposit`; subcommands `deposit` / `balance`
|
|
16
|
+
- Dependency: `segno>=1.6.0` for terminal QR
|
|
17
|
+
|
|
18
|
+
### Verified
|
|
19
|
+
- End-to-end reload: send $DULUS → Fuel credited on control plane
|
|
20
|
+
|
|
21
|
+
|
|
10
22
|
## [3.13.1] - 2026-08-31
|
|
11
23
|
|
|
12
24
|
### Fixed
|
|
@@ -17,7 +17,6 @@ installation paths, screenshots, and feature tour, start with the
|
|
|
17
17
|
| Review the security and permission model | [Security](SECURITY.md) |
|
|
18
18
|
| Diagnose a common problem | [FAQ](FAQ.md) |
|
|
19
19
|
| See what shipped | [Release journal](news.md) and [changelog](CHANGELOG.md) |
|
|
20
|
-
| Read the longer product thesis | [Dulus AI whitepaper](Dulus_AI_Whitepaper_%28v2.0%29.pdf) |
|
|
21
20
|
|
|
22
21
|
## Runtime map
|
|
23
22
|
|
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
## 🔥🔥🔥 News (Pacific Time)
|
|
4
4
|
|
|
5
|
+
- August 31, 2026 (**v3.13.2**): **⛽ `/fuel` is READY — reload wallet as a console QR.** Sign in with `/login dulus`, run `/fuel`, scan the QR with Phantom/Solflare, send **$DULUS**, and Fuel credits hit your account. Real utility coin for real AI compute — not points, not a waitlist. `pip install -U dulus`. 🦅🇩🇴
|
|
6
|
+
|
|
7
|
+
|
|
5
8
|
- August 31, 2026 (**v3.13.1**): **📂 `/load` shows your real saves again.** The menu was only listing system auto-saves under `sessions/daily/`, so the sessions you kept with `/save` never appeared. Default `/load` (and the GUI session list) now reads the root of `sessions/` — your explicit saves. Auto-saves stay opt-in with `/load daily`. `pip install --upgrade dulus`. 🦅🇩🇴
|
|
6
9
|
|
|
7
10
|
|