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.
Files changed (156) hide show
  1. {dulus-0.2.10/dulus.egg-info → dulus-0.2.12}/PKG-INFO +12 -6
  2. {dulus-0.2.10 → dulus-0.2.12}/README.md +4 -3
  3. {dulus-0.2.10 → dulus-0.2.12/dulus.egg-info}/PKG-INFO +12 -6
  4. {dulus-0.2.10 → dulus-0.2.12}/dulus.egg-info/requires.txt +10 -2
  5. {dulus-0.2.10 → dulus-0.2.12}/pyproject.toml +12 -7
  6. {dulus-0.2.10 → dulus-0.2.12}/LICENSE +0 -0
  7. {dulus-0.2.10 → dulus-0.2.12}/MANIFEST.in +0 -0
  8. {dulus-0.2.10 → dulus-0.2.12}/agent.py +0 -0
  9. {dulus-0.2.10 → dulus-0.2.12}/backend/__init__.py +0 -0
  10. {dulus-0.2.10 → dulus-0.2.12}/backend/compressor.py +0 -0
  11. {dulus-0.2.10 → dulus-0.2.12}/backend/context.py +0 -0
  12. {dulus-0.2.10 → dulus-0.2.12}/backend/githook.py +0 -0
  13. {dulus-0.2.10 → dulus-0.2.12}/backend/marketplace.py +0 -0
  14. {dulus-0.2.10 → dulus-0.2.12}/backend/mempalace_bridge.py +0 -0
  15. {dulus-0.2.10 → dulus-0.2.12}/backend/personas.py +0 -0
  16. {dulus-0.2.10 → dulus-0.2.12}/backend/plugins.py +0 -0
  17. {dulus-0.2.10 → dulus-0.2.12}/backend/server.py +0 -0
  18. {dulus-0.2.10 → dulus-0.2.12}/backend/tasks.py +0 -0
  19. {dulus-0.2.10 → dulus-0.2.12}/batch_api.py +0 -0
  20. {dulus-0.2.10 → dulus-0.2.12}/checkpoint/__init__.py +0 -0
  21. {dulus-0.2.10 → dulus-0.2.12}/checkpoint/hooks.py +0 -0
  22. {dulus-0.2.10 → dulus-0.2.12}/checkpoint/store.py +0 -0
  23. {dulus-0.2.10 → dulus-0.2.12}/checkpoint/types.py +0 -0
  24. {dulus-0.2.10 → dulus-0.2.12}/claude_code_watcher.py +0 -0
  25. {dulus-0.2.10 → dulus-0.2.12}/clipboard_utils.py +0 -0
  26. {dulus-0.2.10 → dulus-0.2.12}/cloudsave.py +0 -0
  27. {dulus-0.2.10 → dulus-0.2.12}/common.py +0 -0
  28. {dulus-0.2.10 → dulus-0.2.12}/compaction.py +0 -0
  29. {dulus-0.2.10 → dulus-0.2.12}/config.py +0 -0
  30. {dulus-0.2.10 → dulus-0.2.12}/context.py +0 -0
  31. {dulus-0.2.10 → dulus-0.2.12}/data/__init__.py +0 -0
  32. {dulus-0.2.10 → dulus-0.2.12}/data/active_persona.json +0 -0
  33. {dulus-0.2.10 → dulus-0.2.12}/data/context.json +0 -0
  34. {dulus-0.2.10 → dulus-0.2.12}/data/marketplace.json +0 -0
  35. {dulus-0.2.10 → dulus-0.2.12}/data/personas.json +0 -0
  36. {dulus-0.2.10 → dulus-0.2.12}/data/tasks.json +0 -0
  37. {dulus-0.2.10 → dulus-0.2.12}/docs/README.md +0 -0
  38. {dulus-0.2.10 → dulus-0.2.12}/docs/__init__.py +0 -0
  39. {dulus-0.2.10 → dulus-0.2.12}/docs/api.html +0 -0
  40. {dulus-0.2.10 → dulus-0.2.12}/docs/architecture.md +0 -0
  41. {dulus-0.2.10 → dulus-0.2.12}/docs/azure-speech-template.json +0 -0
  42. {dulus-0.2.10 → dulus-0.2.12}/docs/dashboard/index.html +0 -0
  43. {dulus-0.2.10 → dulus-0.2.12}/docs/divider.svg +0 -0
  44. {dulus-0.2.10 → dulus-0.2.12}/docs/generate.py +0 -0
  45. {dulus-0.2.10 → dulus-0.2.12}/docs/hero.svg +0 -0
  46. {dulus-0.2.10 → dulus-0.2.12}/docs/index.html +0 -0
  47. {dulus-0.2.10 → dulus-0.2.12}/docs/news.md +0 -0
  48. {dulus-0.2.10 → dulus-0.2.12}/docs/nvidia-models.svg +0 -0
  49. {dulus-0.2.10 → dulus-0.2.12}/docs/particle-playground.html +0 -0
  50. {dulus-0.2.10 → dulus-0.2.12}/docs/personas/index.html +0 -0
  51. {dulus-0.2.10 → dulus-0.2.12}/docs/preview.html +0 -0
  52. {dulus-0.2.10 → dulus-0.2.12}/docs/sec-agents.svg +0 -0
  53. {dulus-0.2.10 → dulus-0.2.12}/docs/sec-brainstorm.svg +0 -0
  54. {dulus-0.2.10 → dulus-0.2.12}/docs/sec-bridges.svg +0 -0
  55. {dulus-0.2.10 → dulus-0.2.12}/docs/sec-features.svg +0 -0
  56. {dulus-0.2.10 → dulus-0.2.12}/docs/sec-freetier.svg +0 -0
  57. {dulus-0.2.10 → dulus-0.2.12}/docs/sec-memory.svg +0 -0
  58. {dulus-0.2.10 → dulus-0.2.12}/docs/sec-models.svg +0 -0
  59. {dulus-0.2.10 → dulus-0.2.12}/docs/sec-perms.svg +0 -0
  60. {dulus-0.2.10 → dulus-0.2.12}/docs/sec-plugins.svg +0 -0
  61. {dulus-0.2.10 → dulus-0.2.12}/docs/sec-quickstart.svg +0 -0
  62. {dulus-0.2.10 → dulus-0.2.12}/docs/sec-ssj.svg +0 -0
  63. {dulus-0.2.10 → dulus-0.2.12}/docs/spinners.svg +0 -0
  64. {dulus-0.2.10 → dulus-0.2.12}/docs/split-pane.svg +0 -0
  65. {dulus-0.2.10 → dulus-0.2.12}/docs/terminal-boot.svg +0 -0
  66. {dulus-0.2.10 → dulus-0.2.12}/docs/uploads/particle-playground.html +0 -0
  67. {dulus-0.2.10 → dulus-0.2.12}/dulus.egg-info/SOURCES.txt +0 -0
  68. {dulus-0.2.10 → dulus-0.2.12}/dulus.egg-info/dependency_links.txt +0 -0
  69. {dulus-0.2.10 → dulus-0.2.12}/dulus.egg-info/entry_points.txt +0 -0
  70. {dulus-0.2.10 → dulus-0.2.12}/dulus.egg-info/top_level.txt +0 -0
  71. {dulus-0.2.10 → dulus-0.2.12}/dulus.py +0 -0
  72. {dulus-0.2.10 → dulus-0.2.12}/dulus_gui.py +0 -0
  73. {dulus-0.2.10 → dulus-0.2.12}/dulus_mcp/__init__.py +0 -0
  74. {dulus-0.2.10 → dulus-0.2.12}/dulus_mcp/client.py +0 -0
  75. {dulus-0.2.10 → dulus-0.2.12}/dulus_mcp/config.py +0 -0
  76. {dulus-0.2.10 → dulus-0.2.12}/dulus_mcp/tools.py +0 -0
  77. {dulus-0.2.10 → dulus-0.2.12}/dulus_mcp/types.py +0 -0
  78. {dulus-0.2.10 → dulus-0.2.12}/gui/__init__.py +0 -0
  79. {dulus-0.2.10 → dulus-0.2.12}/gui/agent_bridge.py +0 -0
  80. {dulus-0.2.10 → dulus-0.2.12}/gui/chat_widget.py +0 -0
  81. {dulus-0.2.10 → dulus-0.2.12}/gui/main_window.py +0 -0
  82. {dulus-0.2.10 → dulus-0.2.12}/gui/personas.py +0 -0
  83. {dulus-0.2.10 → dulus-0.2.12}/gui/session_utils.py +0 -0
  84. {dulus-0.2.10 → dulus-0.2.12}/gui/settings_dialog.py +0 -0
  85. {dulus-0.2.10 → dulus-0.2.12}/gui/sidebar.py +0 -0
  86. {dulus-0.2.10 → dulus-0.2.12}/gui/tasks_view.py +0 -0
  87. {dulus-0.2.10 → dulus-0.2.12}/gui/themes.py +0 -0
  88. {dulus-0.2.10 → dulus-0.2.12}/gui/tool_panel.py +0 -0
  89. {dulus-0.2.10 → dulus-0.2.12}/input.py +0 -0
  90. {dulus-0.2.10 → dulus-0.2.12}/license_manager.py +0 -0
  91. {dulus-0.2.10 → dulus-0.2.12}/memory/__init__.py +0 -0
  92. {dulus-0.2.10 → dulus-0.2.12}/memory/audit.py +0 -0
  93. {dulus-0.2.10 → dulus-0.2.12}/memory/consolidator.py +0 -0
  94. {dulus-0.2.10 → dulus-0.2.12}/memory/context.py +0 -0
  95. {dulus-0.2.10 → dulus-0.2.12}/memory/offload.py +0 -0
  96. {dulus-0.2.10 → dulus-0.2.12}/memory/palace.py +0 -0
  97. {dulus-0.2.10 → dulus-0.2.12}/memory/scan.py +0 -0
  98. {dulus-0.2.10 → dulus-0.2.12}/memory/sessions.py +0 -0
  99. {dulus-0.2.10 → dulus-0.2.12}/memory/store.py +0 -0
  100. {dulus-0.2.10 → dulus-0.2.12}/memory/tools.py +0 -0
  101. {dulus-0.2.10 → dulus-0.2.12}/memory/types.py +0 -0
  102. {dulus-0.2.10 → dulus-0.2.12}/memory/vector_search.py +0 -0
  103. {dulus-0.2.10 → dulus-0.2.12}/multi_agent/__init__.py +0 -0
  104. {dulus-0.2.10 → dulus-0.2.12}/multi_agent/subagent.py +0 -0
  105. {dulus-0.2.10 → dulus-0.2.12}/multi_agent/tools.py +0 -0
  106. {dulus-0.2.10 → dulus-0.2.12}/offload_helper.py +0 -0
  107. {dulus-0.2.10 → dulus-0.2.12}/plugin/__init__.py +0 -0
  108. {dulus-0.2.10 → dulus-0.2.12}/plugin/autoadapter.py +0 -0
  109. {dulus-0.2.10 → dulus-0.2.12}/plugin/loader.py +0 -0
  110. {dulus-0.2.10 → dulus-0.2.12}/plugin/recommend.py +0 -0
  111. {dulus-0.2.10 → dulus-0.2.12}/plugin/store.py +0 -0
  112. {dulus-0.2.10 → dulus-0.2.12}/plugin/types.py +0 -0
  113. {dulus-0.2.10 → dulus-0.2.12}/providers.py +0 -0
  114. {dulus-0.2.10 → dulus-0.2.12}/setup.cfg +0 -0
  115. {dulus-0.2.10 → dulus-0.2.12}/skill/__init__.py +0 -0
  116. {dulus-0.2.10 → dulus-0.2.12}/skill/builtin.py +0 -0
  117. {dulus-0.2.10 → dulus-0.2.12}/skill/clawhub.py +0 -0
  118. {dulus-0.2.10 → dulus-0.2.12}/skill/executor.py +0 -0
  119. {dulus-0.2.10 → dulus-0.2.12}/skill/loader.py +0 -0
  120. {dulus-0.2.10 → dulus-0.2.12}/skill/tools.py +0 -0
  121. {dulus-0.2.10 → dulus-0.2.12}/skills.py +0 -0
  122. {dulus-0.2.10 → dulus-0.2.12}/spinner.py +0 -0
  123. {dulus-0.2.10 → dulus-0.2.12}/string_utils.py +0 -0
  124. {dulus-0.2.10 → dulus-0.2.12}/subagent.py +0 -0
  125. {dulus-0.2.10 → dulus-0.2.12}/task/__init__.py +0 -0
  126. {dulus-0.2.10 → dulus-0.2.12}/task/store.py +0 -0
  127. {dulus-0.2.10 → dulus-0.2.12}/task/tools.py +0 -0
  128. {dulus-0.2.10 → dulus-0.2.12}/task/types.py +0 -0
  129. {dulus-0.2.10 → dulus-0.2.12}/tests/test_checkpoint.py +0 -0
  130. {dulus-0.2.10 → dulus-0.2.12}/tests/test_compaction.py +0 -0
  131. {dulus-0.2.10 → dulus-0.2.12}/tests/test_diff_view.py +0 -0
  132. {dulus-0.2.10 → dulus-0.2.12}/tests/test_injection_fix.py +0 -0
  133. {dulus-0.2.10 → dulus-0.2.12}/tests/test_license.py +0 -0
  134. {dulus-0.2.10 → dulus-0.2.12}/tests/test_mcp.py +0 -0
  135. {dulus-0.2.10 → dulus-0.2.12}/tests/test_memory.py +0 -0
  136. {dulus-0.2.10 → dulus-0.2.12}/tests/test_plugin.py +0 -0
  137. {dulus-0.2.10 → dulus-0.2.12}/tests/test_skills.py +0 -0
  138. {dulus-0.2.10 → dulus-0.2.12}/tests/test_subagent.py +0 -0
  139. {dulus-0.2.10 → dulus-0.2.12}/tests/test_task.py +0 -0
  140. {dulus-0.2.10 → dulus-0.2.12}/tests/test_telegram_buffer.py +0 -0
  141. {dulus-0.2.10 → dulus-0.2.12}/tests/test_tool_registry.py +0 -0
  142. {dulus-0.2.10 → dulus-0.2.12}/tests/test_voice.py +0 -0
  143. {dulus-0.2.10 → dulus-0.2.12}/tmux_offloader.py +0 -0
  144. {dulus-0.2.10 → dulus-0.2.12}/tmux_tools.py +0 -0
  145. {dulus-0.2.10 → dulus-0.2.12}/tool_registry.py +0 -0
  146. {dulus-0.2.10 → dulus-0.2.12}/tools.py +0 -0
  147. {dulus-0.2.10 → dulus-0.2.12}/ui/__init__.py +0 -0
  148. {dulus-0.2.10 → dulus-0.2.12}/ui/input.py +0 -0
  149. {dulus-0.2.10 → dulus-0.2.12}/ui/render.py +0 -0
  150. {dulus-0.2.10 → dulus-0.2.12}/voice/__init__.py +0 -0
  151. {dulus-0.2.10 → dulus-0.2.12}/voice/keyterms.py +0 -0
  152. {dulus-0.2.10 → dulus-0.2.12}/voice/recorder.py +0 -0
  153. {dulus-0.2.10 → dulus-0.2.12}/voice/stt.py +0 -0
  154. {dulus-0.2.10 → dulus-0.2.12}/voice/tts.py +0 -0
  155. {dulus-0.2.10 → dulus-0.2.12}/webchat.py +0 -0
  156. {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.10
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.10 — May 8, 2026** — Pin `typing-extensions>=4.10` to keep pip's resolver from blowing up (`dependency resolution exceeded maximum depth`) when reconciling anthropic / openai / pydantic / chromadb floors. New Termux/Android section in the README with a `--no-deps` workaround for the NumPy build.
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.10 — May 8, 2026** — Pin `typing-extensions>=4.10` to keep pip's resolver from blowing up (`dependency resolution exceeded maximum depth`) when reconciling anthropic / openai / pydantic / chromadb floors. New Termux/Android section in the README with a `--no-deps` workaround for the NumPy build.
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.10
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.10 — May 8, 2026** — Pin `typing-extensions>=4.10` to keep pip's resolver from blowing up (`dependency resolution exceeded maximum depth`) when reconciling anthropic / openai / pydantic / chromadb floors. New Termux/Android section in the README with a `--no-deps` workaround for the NumPy build.
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.10"
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