dulus 0.2.10__tar.gz → 0.2.12__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-0.2.10/dulus.egg-info → dulus-0.2.12}/PKG-INFO +12 -6
- {dulus-0.2.10 → dulus-0.2.12}/README.md +4 -3
- {dulus-0.2.10 → dulus-0.2.12/dulus.egg-info}/PKG-INFO +12 -6
- {dulus-0.2.10 → dulus-0.2.12}/dulus.egg-info/requires.txt +10 -2
- {dulus-0.2.10 → dulus-0.2.12}/pyproject.toml +12 -7
- {dulus-0.2.10 → dulus-0.2.12}/LICENSE +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/MANIFEST.in +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/agent.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/backend/__init__.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/backend/compressor.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/backend/context.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/backend/githook.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/backend/marketplace.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/backend/mempalace_bridge.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/backend/personas.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/backend/plugins.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/backend/server.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/backend/tasks.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/batch_api.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/checkpoint/__init__.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/checkpoint/hooks.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/checkpoint/store.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/checkpoint/types.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/claude_code_watcher.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/clipboard_utils.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/cloudsave.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/common.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/compaction.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/config.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/context.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/data/__init__.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/data/active_persona.json +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/data/context.json +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/data/marketplace.json +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/data/personas.json +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/data/tasks.json +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/README.md +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/__init__.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/api.html +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/architecture.md +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/azure-speech-template.json +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/dashboard/index.html +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/divider.svg +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/generate.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/hero.svg +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/index.html +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/news.md +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/nvidia-models.svg +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/particle-playground.html +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/personas/index.html +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/preview.html +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/sec-agents.svg +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/sec-brainstorm.svg +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/sec-bridges.svg +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/sec-features.svg +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/sec-freetier.svg +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/sec-memory.svg +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/sec-models.svg +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/sec-perms.svg +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/sec-plugins.svg +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/sec-quickstart.svg +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/sec-ssj.svg +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/spinners.svg +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/split-pane.svg +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/terminal-boot.svg +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/docs/uploads/particle-playground.html +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/dulus.egg-info/SOURCES.txt +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/dulus.egg-info/dependency_links.txt +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/dulus.egg-info/entry_points.txt +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/dulus.egg-info/top_level.txt +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/dulus.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/dulus_gui.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/dulus_mcp/__init__.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/dulus_mcp/client.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/dulus_mcp/config.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/dulus_mcp/tools.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/dulus_mcp/types.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/gui/__init__.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/gui/agent_bridge.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/gui/chat_widget.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/gui/main_window.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/gui/personas.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/gui/session_utils.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/gui/settings_dialog.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/gui/sidebar.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/gui/tasks_view.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/gui/themes.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/gui/tool_panel.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/input.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/license_manager.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/memory/__init__.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/memory/audit.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/memory/consolidator.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/memory/context.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/memory/offload.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/memory/palace.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/memory/scan.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/memory/sessions.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/memory/store.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/memory/tools.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/memory/types.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/memory/vector_search.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/multi_agent/__init__.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/multi_agent/subagent.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/multi_agent/tools.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/offload_helper.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/plugin/__init__.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/plugin/autoadapter.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/plugin/loader.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/plugin/recommend.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/plugin/store.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/plugin/types.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/providers.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/setup.cfg +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/skill/__init__.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/skill/builtin.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/skill/clawhub.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/skill/executor.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/skill/loader.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/skill/tools.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/skills.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/spinner.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/string_utils.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/subagent.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/task/__init__.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/task/store.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/task/tools.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/task/types.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/tests/test_checkpoint.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/tests/test_compaction.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/tests/test_diff_view.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/tests/test_injection_fix.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/tests/test_license.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/tests/test_mcp.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/tests/test_memory.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/tests/test_plugin.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/tests/test_skills.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/tests/test_subagent.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/tests/test_task.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/tests/test_telegram_buffer.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/tests/test_tool_registry.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/tests/test_voice.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/tmux_offloader.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/tmux_tools.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/tool_registry.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/tools.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/ui/__init__.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/ui/input.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/ui/render.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/voice/__init__.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/voice/keyterms.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/voice/recorder.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/voice/stt.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/voice/tts.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/webchat.py +0 -0
- {dulus-0.2.10 → dulus-0.2.12}/webchat_server.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dulus
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.12
|
|
4
4
|
Summary: Spanish-first multi-provider AI CLI — 14 NVIDIA models free, Mesa Redonda, voice, TTS, RTK token reducer, MemPalace
|
|
5
5
|
Author: KevRojo
|
|
6
6
|
License: GPL-3.0
|
|
@@ -29,13 +29,18 @@ Requires-Dist: httpx>=0.27.0
|
|
|
29
29
|
Requires-Dist: requests>=2.31.0
|
|
30
30
|
Requires-Dist: rich>=13.0.0
|
|
31
31
|
Requires-Dist: prompt_toolkit>=3.0.0
|
|
32
|
-
Requires-Dist: mempalace>=3.3.4
|
|
33
32
|
Requires-Dist: Flask>=3.1.3
|
|
34
33
|
Requires-Dist: bubblewrap-cli>=1.0.0
|
|
35
|
-
Requires-Dist: sounddevice
|
|
36
34
|
Requires-Dist: customtkinter>=5.2.0
|
|
37
35
|
Requires-Dist: Pillow>=10.0.0
|
|
38
36
|
Requires-Dist: typing-extensions>=4.10.0
|
|
37
|
+
Provides-Extra: memory
|
|
38
|
+
Requires-Dist: mempalace>=3.3.4; extra == "memory"
|
|
39
|
+
Provides-Extra: voice
|
|
40
|
+
Requires-Dist: sounddevice; extra == "voice"
|
|
41
|
+
Provides-Extra: full
|
|
42
|
+
Requires-Dist: mempalace>=3.3.4; extra == "full"
|
|
43
|
+
Requires-Dist: sounddevice; extra == "full"
|
|
39
44
|
Dynamic: license-file
|
|
40
45
|
|
|
41
46
|
# ▲ DULUS
|
|
@@ -85,7 +90,7 @@ SET /sticky_input ON since the first run for the best experience!
|
|
|
85
90
|
|
|
86
91
|
Dulus is a **lightweight Python reimplementation of Claude Code** that isn't locked to Claude. It ships the whole loop — REPL, tool dispatch, streaming, context compaction, checkpoints, sub-agents, voice, Telegram bridge, MCP, plugins — in roughly **12K lines you can actually read**. Fork it. Bend it. Run it offline against Qwen on your M2.
|
|
87
92
|
|
|
88
|
-
> **v0.2.
|
|
93
|
+
> **v0.2.12 — May 8, 2026** — `sounddevice` also moved to `[voice]` extra (it pulls `cffi`, which needs `libffi-dev` to compile and breaks termux installs). Core `pip install dulus` is now zero-compile. Opt in to extras: `[memory]` for MemPalace, `[voice]` for mic input, `[full]` for both.
|
|
89
94
|
> Type `/news` to see what changed.
|
|
90
95
|
|
|
91
96
|
---
|
|
@@ -121,10 +126,11 @@ Dulus is the first one meeting multiple models at the same time working for the
|
|
|
121
126
|
### One-liner
|
|
122
127
|
|
|
123
128
|
```bash
|
|
124
|
-
pip install dulus && dulus
|
|
129
|
+
pip install dulus && dulus # core CLI — fast, no compile, works on termux
|
|
130
|
+
pip install "dulus[memory]" && dulus # +MemPalace per-turn memory (pulls chromadb)
|
|
125
131
|
```
|
|
126
132
|
|
|
127
|
-
That's it. Dulus prompts you for a key on first run.
|
|
133
|
+
That's it. Dulus prompts you for a key on first run. The `[memory]` extra pulls in `mempalace` and its `chromadb` chain — skip it on Android/termux or anywhere wheels for `numpy`/`onnxruntime` aren't available; the CLI still boots and chats fine without it.
|
|
128
134
|
|
|
129
135
|
### From source (hacking on Dulus itself)
|
|
130
136
|
|
|
@@ -45,7 +45,7 @@ SET /sticky_input ON since the first run for the best experience!
|
|
|
45
45
|
|
|
46
46
|
Dulus is a **lightweight Python reimplementation of Claude Code** that isn't locked to Claude. It ships the whole loop — REPL, tool dispatch, streaming, context compaction, checkpoints, sub-agents, voice, Telegram bridge, MCP, plugins — in roughly **12K lines you can actually read**. Fork it. Bend it. Run it offline against Qwen on your M2.
|
|
47
47
|
|
|
48
|
-
> **v0.2.
|
|
48
|
+
> **v0.2.12 — May 8, 2026** — `sounddevice` also moved to `[voice]` extra (it pulls `cffi`, which needs `libffi-dev` to compile and breaks termux installs). Core `pip install dulus` is now zero-compile. Opt in to extras: `[memory]` for MemPalace, `[voice]` for mic input, `[full]` for both.
|
|
49
49
|
> Type `/news` to see what changed.
|
|
50
50
|
|
|
51
51
|
---
|
|
@@ -81,10 +81,11 @@ Dulus is the first one meeting multiple models at the same time working for the
|
|
|
81
81
|
### One-liner
|
|
82
82
|
|
|
83
83
|
```bash
|
|
84
|
-
pip install dulus && dulus
|
|
84
|
+
pip install dulus && dulus # core CLI — fast, no compile, works on termux
|
|
85
|
+
pip install "dulus[memory]" && dulus # +MemPalace per-turn memory (pulls chromadb)
|
|
85
86
|
```
|
|
86
87
|
|
|
87
|
-
That's it. Dulus prompts you for a key on first run.
|
|
88
|
+
That's it. Dulus prompts you for a key on first run. The `[memory]` extra pulls in `mempalace` and its `chromadb` chain — skip it on Android/termux or anywhere wheels for `numpy`/`onnxruntime` aren't available; the CLI still boots and chats fine without it.
|
|
88
89
|
|
|
89
90
|
### From source (hacking on Dulus itself)
|
|
90
91
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dulus
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.12
|
|
4
4
|
Summary: Spanish-first multi-provider AI CLI — 14 NVIDIA models free, Mesa Redonda, voice, TTS, RTK token reducer, MemPalace
|
|
5
5
|
Author: KevRojo
|
|
6
6
|
License: GPL-3.0
|
|
@@ -29,13 +29,18 @@ Requires-Dist: httpx>=0.27.0
|
|
|
29
29
|
Requires-Dist: requests>=2.31.0
|
|
30
30
|
Requires-Dist: rich>=13.0.0
|
|
31
31
|
Requires-Dist: prompt_toolkit>=3.0.0
|
|
32
|
-
Requires-Dist: mempalace>=3.3.4
|
|
33
32
|
Requires-Dist: Flask>=3.1.3
|
|
34
33
|
Requires-Dist: bubblewrap-cli>=1.0.0
|
|
35
|
-
Requires-Dist: sounddevice
|
|
36
34
|
Requires-Dist: customtkinter>=5.2.0
|
|
37
35
|
Requires-Dist: Pillow>=10.0.0
|
|
38
36
|
Requires-Dist: typing-extensions>=4.10.0
|
|
37
|
+
Provides-Extra: memory
|
|
38
|
+
Requires-Dist: mempalace>=3.3.4; extra == "memory"
|
|
39
|
+
Provides-Extra: voice
|
|
40
|
+
Requires-Dist: sounddevice; extra == "voice"
|
|
41
|
+
Provides-Extra: full
|
|
42
|
+
Requires-Dist: mempalace>=3.3.4; extra == "full"
|
|
43
|
+
Requires-Dist: sounddevice; extra == "full"
|
|
39
44
|
Dynamic: license-file
|
|
40
45
|
|
|
41
46
|
# ▲ DULUS
|
|
@@ -85,7 +90,7 @@ SET /sticky_input ON since the first run for the best experience!
|
|
|
85
90
|
|
|
86
91
|
Dulus is a **lightweight Python reimplementation of Claude Code** that isn't locked to Claude. It ships the whole loop — REPL, tool dispatch, streaming, context compaction, checkpoints, sub-agents, voice, Telegram bridge, MCP, plugins — in roughly **12K lines you can actually read**. Fork it. Bend it. Run it offline against Qwen on your M2.
|
|
87
92
|
|
|
88
|
-
> **v0.2.
|
|
93
|
+
> **v0.2.12 — May 8, 2026** — `sounddevice` also moved to `[voice]` extra (it pulls `cffi`, which needs `libffi-dev` to compile and breaks termux installs). Core `pip install dulus` is now zero-compile. Opt in to extras: `[memory]` for MemPalace, `[voice]` for mic input, `[full]` for both.
|
|
89
94
|
> Type `/news` to see what changed.
|
|
90
95
|
|
|
91
96
|
---
|
|
@@ -121,10 +126,11 @@ Dulus is the first one meeting multiple models at the same time working for the
|
|
|
121
126
|
### One-liner
|
|
122
127
|
|
|
123
128
|
```bash
|
|
124
|
-
pip install dulus && dulus
|
|
129
|
+
pip install dulus && dulus # core CLI — fast, no compile, works on termux
|
|
130
|
+
pip install "dulus[memory]" && dulus # +MemPalace per-turn memory (pulls chromadb)
|
|
125
131
|
```
|
|
126
132
|
|
|
127
|
-
That's it. Dulus prompts you for a key on first run.
|
|
133
|
+
That's it. Dulus prompts you for a key on first run. The `[memory]` extra pulls in `mempalace` and its `chromadb` chain — skip it on Android/termux or anywhere wheels for `numpy`/`onnxruntime` aren't available; the CLI still boots and chats fine without it.
|
|
128
134
|
|
|
129
135
|
### From source (hacking on Dulus itself)
|
|
130
136
|
|
|
@@ -4,10 +4,18 @@ httpx>=0.27.0
|
|
|
4
4
|
requests>=2.31.0
|
|
5
5
|
rich>=13.0.0
|
|
6
6
|
prompt_toolkit>=3.0.0
|
|
7
|
-
mempalace>=3.3.4
|
|
8
7
|
Flask>=3.1.3
|
|
9
8
|
bubblewrap-cli>=1.0.0
|
|
10
|
-
sounddevice
|
|
11
9
|
customtkinter>=5.2.0
|
|
12
10
|
Pillow>=10.0.0
|
|
13
11
|
typing-extensions>=4.10.0
|
|
12
|
+
|
|
13
|
+
[full]
|
|
14
|
+
mempalace>=3.3.4
|
|
15
|
+
sounddevice
|
|
16
|
+
|
|
17
|
+
[memory]
|
|
18
|
+
mempalace>=3.3.4
|
|
19
|
+
|
|
20
|
+
[voice]
|
|
21
|
+
sounddevice
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "dulus"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.12"
|
|
8
8
|
description = "Spanish-first multi-provider AI CLI — 14 NVIDIA models free, Mesa Redonda, voice, TTS, RTK token reducer, MemPalace"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -34,19 +34,24 @@ dependencies = [
|
|
|
34
34
|
"requests>=2.31.0",
|
|
35
35
|
"rich>=13.0.0",
|
|
36
36
|
"prompt_toolkit>=3.0.0",
|
|
37
|
-
"mempalace>=3.3.4",
|
|
38
37
|
"Flask>=3.1.3",
|
|
39
38
|
"bubblewrap-cli>=1.0.0",
|
|
40
|
-
"sounddevice",
|
|
41
39
|
"customtkinter>=5.2.0",
|
|
42
40
|
"Pillow>=10.0.0",
|
|
43
|
-
# Pin typing-extensions floor: anthropic, openai, pydantic, chromadb (via
|
|
44
|
-
# mempalace) each pull it with different lower bounds — without an explicit
|
|
45
|
-
# floor here pip's resolver explodes with "dependency resolution exceeded
|
|
46
|
-
# maximum depth" trying to reconcile them.
|
|
47
41
|
"typing-extensions>=4.10.0",
|
|
48
42
|
]
|
|
49
43
|
|
|
44
|
+
# mempalace pulls chromadb (26 transitive deps incl. numpy + onnxruntime),
|
|
45
|
+
# which on termux/aarch64 has no wheels and on regular installs sends pip's
|
|
46
|
+
# resolver into a backtracking loop trying to reconcile typing-extensions /
|
|
47
|
+
# pydantic / httpx ranges. Keeping it optional lets `pip install dulus` succeed
|
|
48
|
+
# in seconds everywhere; power users opt in with `pip install dulus[memory]`
|
|
49
|
+
# (or `dulus[full]`) when they want MemPalace per-turn injection.
|
|
50
|
+
[project.optional-dependencies]
|
|
51
|
+
memory = ["mempalace>=3.3.4"]
|
|
52
|
+
voice = ["sounddevice"]
|
|
53
|
+
full = ["mempalace>=3.3.4", "sounddevice"]
|
|
54
|
+
|
|
50
55
|
[project.scripts]
|
|
51
56
|
dulus = "dulus:main"
|
|
52
57
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|