dulus 0.2.0__py3-none-any.whl

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 (101) hide show
  1. agent.py +363 -0
  2. backend/__init__.py +63 -0
  3. backend/compressor.py +261 -0
  4. backend/context.py +329 -0
  5. backend/githook.py +166 -0
  6. backend/marketplace.py +141 -0
  7. backend/mempalace_bridge.py +182 -0
  8. backend/personas.py +297 -0
  9. backend/plugins.py +222 -0
  10. backend/server.py +411 -0
  11. backend/tasks.py +213 -0
  12. batch_api.py +307 -0
  13. checkpoint/__init__.py +27 -0
  14. checkpoint/hooks.py +90 -0
  15. checkpoint/store.py +314 -0
  16. checkpoint/types.py +80 -0
  17. claude_code_watcher.py +214 -0
  18. clipboard_utils.py +246 -0
  19. cloudsave.py +159 -0
  20. common.py +177 -0
  21. compaction.py +378 -0
  22. config.py +180 -0
  23. context.py +241 -0
  24. dulus-0.2.0.dist-info/METADATA +600 -0
  25. dulus-0.2.0.dist-info/RECORD +101 -0
  26. dulus-0.2.0.dist-info/WHEEL +5 -0
  27. dulus-0.2.0.dist-info/entry_points.txt +2 -0
  28. dulus-0.2.0.dist-info/licenses/LICENSE +674 -0
  29. dulus-0.2.0.dist-info/licenses/license_manager.py +187 -0
  30. dulus-0.2.0.dist-info/top_level.txt +36 -0
  31. dulus.py +8455 -0
  32. dulus_gui.py +331 -0
  33. dulus_mcp/__init__.py +43 -0
  34. dulus_mcp/client.py +546 -0
  35. dulus_mcp/config.py +133 -0
  36. dulus_mcp/tools.py +131 -0
  37. dulus_mcp/types.py +124 -0
  38. gui/__init__.py +18 -0
  39. gui/agent_bridge.py +283 -0
  40. gui/chat_widget.py +448 -0
  41. gui/main_window.py +485 -0
  42. gui/personas.py +230 -0
  43. gui/session_utils.py +189 -0
  44. gui/settings_dialog.py +146 -0
  45. gui/sidebar.py +515 -0
  46. gui/tasks_view.py +499 -0
  47. gui/themes.py +256 -0
  48. gui/tool_panel.py +94 -0
  49. input.py +1030 -0
  50. license_manager.py +187 -0
  51. memory/__init__.py +93 -0
  52. memory/audit.py +51 -0
  53. memory/consolidator.py +312 -0
  54. memory/context.py +270 -0
  55. memory/offload.py +148 -0
  56. memory/palace.py +127 -0
  57. memory/scan.py +146 -0
  58. memory/sessions.py +100 -0
  59. memory/store.py +395 -0
  60. memory/tools.py +408 -0
  61. memory/types.py +114 -0
  62. memory/vector_search.py +92 -0
  63. multi_agent/__init__.py +23 -0
  64. multi_agent/subagent.py +501 -0
  65. multi_agent/tools.py +393 -0
  66. offload_helper.py +183 -0
  67. plugin/__init__.py +22 -0
  68. plugin/autoadapter.py +1641 -0
  69. plugin/loader.py +156 -0
  70. plugin/recommend.py +211 -0
  71. plugin/store.py +387 -0
  72. plugin/types.py +147 -0
  73. providers.py +3750 -0
  74. skill/__init__.py +14 -0
  75. skill/builtin.py +100 -0
  76. skill/clawhub.py +270 -0
  77. skill/executor.py +66 -0
  78. skill/loader.py +199 -0
  79. skill/tools.py +110 -0
  80. skills.py +14 -0
  81. spinner.py +42 -0
  82. string_utils.py +42 -0
  83. subagent.py +11 -0
  84. task/__init__.py +12 -0
  85. task/store.py +199 -0
  86. task/tools.py +265 -0
  87. task/types.py +92 -0
  88. tmux_offloader.py +177 -0
  89. tmux_tools.py +410 -0
  90. tool_registry.py +214 -0
  91. tools.py +2694 -0
  92. ui/__init__.py +1 -0
  93. ui/input.py +464 -0
  94. ui/render.py +272 -0
  95. voice/__init__.py +56 -0
  96. voice/keyterms.py +179 -0
  97. voice/recorder.py +263 -0
  98. voice/stt.py +408 -0
  99. voice/tts.py +570 -0
  100. webchat.py +432 -0
  101. webchat_server.py +1761 -0
@@ -0,0 +1,600 @@
1
+ Metadata-Version: 2.4
2
+ Name: dulus
3
+ Version: 0.2.0
4
+ Summary: Spanish-first multi-provider AI CLI — 14 NVIDIA models free, Mesa Redonda, voice, TTS, RTK token reducer, MemPalace
5
+ Author: KevRojo
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/KevRojo/Dulus
8
+ Project-URL: Repository, https://github.com/KevRojo/Dulus
9
+ Project-URL: Issues, https://github.com/KevRojo/Dulus/issues
10
+ Keywords: ai,cli,llm,claude,gemini,nvidia,openai,kimi,deepseek,qwen,ollama,agent,tts,voice
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
21
+ Classifier: Topic :: Terminals
22
+ Requires-Python: >=3.11
23
+ Description-Content-Type: text/markdown
24
+ License-File: LICENSE
25
+ License-File: license_manager.py
26
+ Requires-Dist: anthropic>=0.40.0
27
+ Requires-Dist: openai>=1.30.0
28
+ Requires-Dist: httpx>=0.27.0
29
+ Requires-Dist: requests>=2.31.0
30
+ Requires-Dist: rich>=13.0.0
31
+ Requires-Dist: prompt_toolkit>=3.0.0
32
+ Requires-Dist: mempalace>=3.3.4
33
+ Requires-Dist: Flask>=3.1.3
34
+ Requires-Dist: bubblewrap-cli>=1.0.0
35
+ Requires-Dist: sounddevice
36
+ Requires-Dist: customtkinter>=5.2.0
37
+ Requires-Dist: Pillow>=10.0.0
38
+ Dynamic: license-file
39
+
40
+ # â–ē DULUS
41
+
42
+ > **Hunt. Patch. Ship.** A Python autonomous agent that flies on any model — Claude, GPT, Gemini, DeepSeek, Qwen, Kimi, Zhipu, MiniMax, and local models via Ollama. ~12K lines of readable Python. No build step. No gatekeeping. Just talons.
43
+
44
+ SET /sticky_input ON since the first run for the best experience!
45
+
46
+ <p align="center">
47
+ <img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/hero.svg" alt="Dulus" width="100%">
48
+ </p>
49
+
50
+ <p align="center">
51
+ <a href="#quick-start"><b>Quick Start</b></a> ·
52
+ <a href="#models"><b>Models</b></a> ·
53
+ <a href="#features"><b>Features</b></a> ·
54
+ <a href="#permissions"><b>Permissions</b></a> ·
55
+ <a href="#mcp"><b>MCP</b></a> ·
56
+ <a href="#plugins"><b>Plugins</b></a>
57
+ </p>
58
+
59
+ <p align="center">
60
+ <a href="https://pypi.org/project/dulus-agent/"><img src="https://img.shields.io/pypi/v/dulus-agent.svg?style=flat-square&color=ff6b1f&labelColor=07070a&label=pypi" alt="pypi"/></a>
61
+ <a href="https://pypi.org/project/dulus-agent/"><img src="https://static.pepy.tech/badge/dulus-agent?style=flat-square" alt="downloads"/></a>
62
+ <img src="https://img.shields.io/badge/python-3.11+-ff6b1f?style=flat-square&labelColor=07070a" alt="python"/>
63
+ <img src="https://img.shields.io/badge/license-GPLv3-ff6b1f?style=flat-square&labelColor=07070a" alt="license"/>
64
+ <img src="https://img.shields.io/badge/version-v1.01.20-ff6b1f?style=flat-square&labelColor=07070a" alt="version"/>
65
+ <img src="https://img.shields.io/badge/providers-11-ff6b1f?style=flat-square&labelColor=07070a" alt="providers"/>
66
+ <img src="https://img.shields.io/badge/tools-27-ff6b1f?style=flat-square&labelColor=07070a" alt="tools"/>
67
+ <img src="https://img.shields.io/badge/tests-263+-ff6b1f?style=flat-square&labelColor=07070a" alt="tests"/>
68
+ </p>
69
+
70
+ <p align="center">
71
+ <code>pip install dulus-agent</code>
72
+ </p>
73
+
74
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/divider.svg" alt="" width="100%"></p>
75
+
76
+ <p align="center">
77
+ <a href="https://kevrojo.github.io/Dulus/"><b>🌐 Visit the Dulus website →</b></a><br>
78
+ <sub>The site covers features, demos, and details not documented in this README.</sub>
79
+ </p>
80
+
81
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/divider.svg" alt="" width="100%"></p>
82
+
83
+ ## What is this
84
+
85
+ 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.
86
+
87
+ > **v1.01.20 — Apr 09, 2026** — Automated Plugin Adapter. Hot-Reloading. Premium UI.
88
+ > Type `/news` to see what changed.
89
+
90
+ ---
91
+
92
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/sec-quickstart.svg" alt="Quick Start" width="100%"></p>
93
+
94
+ ## Quick Start
95
+
96
+ <img alt="image" src="https://github.com/user-attachments/assets/a5a447c6-2cce-42a5-87f8-7c3bc8367987" />
97
+
98
+
99
+ <img alt="image" src="https://github.com/user-attachments/assets/72526ae1-b69f-4529-adc7-eef1cd3876c8" />
100
+
101
+ <img alt="image" src="https://github.com/user-attachments/assets/6baf90e5-a163-4a38-bdde-3d77c0a87281" />
102
+
103
+ <img alt="image" src="https://github.com/user-attachments/assets/453c1aad-b777-4d9a-98b8-40edbadb5079" />
104
+
105
+ <img alt="image" src="https://github.com/user-attachments/assets/eb11cb86-2f53-4979-b7bf-5bd1f97ed5fc" />
106
+
107
+ <img alt="image" src="https://github.com/user-attachments/assets/986ae7b5-5400-48aa-80eb-cdfd7dbb706e" />
108
+
109
+
110
+ ROUND TABLE (DULUS UNIQUE FEATURE)
111
+
112
+ <img alt="image" src="https://github.com/user-attachments/assets/648ffe5e-28e2-49e0-bc27-362a585edd4f" />
113
+
114
+ <img alt="image" src="https://github.com/user-attachments/assets/9e8f17ed-6ca2-4ae0-b8c3-146ae5fef491" />
115
+
116
+ Dulus is the first one meeting multiples models at the same time working for the same objetive and sharing they'r ideas.
117
+
118
+
119
+
120
+ ### One-liner
121
+
122
+ ```bash
123
+ pip install dulus-agent && dulus
124
+ ```
125
+
126
+ That's it. Dulus prompts you for a key on first run.
127
+
128
+ ### From source (hacking on Dulus itself)
129
+
130
+ ```bash
131
+ git clone https://github.com/KevRojo/Dulus && cd Dulus
132
+ pip install -e . # editable install
133
+ dulus
134
+ ```
135
+
136
+ ### Pick a model
137
+
138
+ ```bash
139
+ export ANTHROPIC_API_KEY=sk-ant-... # or OPENAI_API_KEY, GEMINI_API_KEY, ...
140
+ dulus
141
+ ```
142
+
143
+ **Zero API keys?** Two free paths:
144
+
145
+ ```bash
146
+ # 1. NVIDIA NIM — 14 models free, 40 RPM each, no card
147
+ dulus --model nvidia-web/deepseek-ai/deepseek-r1
148
+
149
+ # 2. Fully offline via Ollama
150
+ ollama pull qwen2.5-coder
151
+ dulus --model ollama/qwen2.5-coder
152
+ ```
153
+
154
+ Or pipe it like a good unix citizen:
155
+
156
+ ```bash
157
+ echo "explain this diff" | git diff | dulus -p --accept-all
158
+ ```
159
+
160
+ ---
161
+
162
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/terminal-boot.svg" alt="Dulus booting into session" width="100%"></p>
163
+
164
+ <p align="center"><sub>↑ session boot. soul loaded, gold memory warm, shell sniffed. the little circles are real buttons on your Mac.</sub></p>
165
+
166
+ ---
167
+
168
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/sec-features.svg" alt="Features" width="100%"></p>
169
+
170
+ ## Features
171
+
172
+ | | |
173
+ |---|---|
174
+ | **Multi-provider** | Anthropic · OpenAI · Gemini · Kimi · Qwen · Zhipu · DeepSeek · MiniMax · Ollama · LM Studio · custom OpenAI-compat endpoints |
175
+ | **27 built-in tools** | Read, Write, Edit, Bash, Glob, Grep, WebFetch, WebSearch, NotebookEdit, GetDiagnostics, Memory, Tasks, Agents, Skills, and more |
176
+ | **MCP integration** | Any MCP server (stdio / SSE / HTTP). Tools auto-registered as `mcp__<server>__<tool>` |
177
+ | **Plugin system** | **Auto-Adapter** onboards any Python repo — zero manifest required. Hot-reload in-session. |
178
+ | **Sub-agents** | Typed agents (coder / reviewer / researcher / tester) in isolated git worktrees |
179
+ | **Voice input** | Offline STT via Whisper. No API key. No cloud. |
180
+ | **Brainstorm** | Multi-persona AI debate. Auto-generated expert roles. |
181
+ | **SSJ Developer Mode** | Power menu: 10 workflow shortcuts behind one keystroke |
182
+ | **Telegram bridge** | Run Dulus from your phone. Slash commands. Vision. Voice. |
183
+ | **Checkpoints** | Auto-snapshot conversation + files. Rewind to any turn. |
184
+ | **Plan mode** | Read-only analysis phase before touching anything |
185
+ | **Context compression** | Auto-compact long sessions. Keep the signal, drop the slop. |
186
+ | **tmux tools** | 11 tools for the agent to drive tmux sessions |
187
+ | **Persistent memory** | Dual-scope (user + project). Ranked by confidence × recency. |
188
+ | **Session management** | Autosave · daily archives · cloud sync via GitHub Gist |
189
+
190
+ ---
191
+
192
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/sec-models.svg" alt="Models" width="100%"></p>
193
+
194
+ ## Models
195
+
196
+ ### Cloud APIs
197
+
198
+ | Provider | Models | Env |
199
+ |---|---|---|
200
+ | **Anthropic** | `claude-opus-4-6`, `claude-sonnet-4-6`, `claude-haiku-4-5-20251001` | `ANTHROPIC_API_KEY` |
201
+ | **OpenAI** | `gpt-4o`, `gpt-4o-mini`, `o3-mini`, `o1` | `OPENAI_API_KEY` |
202
+ | **Google** | `gemini-2.5-pro-preview-03-25`, `gemini-2.0-flash`, `gemini-1.5-pro` | `GEMINI_API_KEY` |
203
+ | **DeepSeek** | `deepseek-chat`, `deepseek-reasoner` | `DEEPSEEK_API_KEY` |
204
+ | **Qwen** | `qwen-max`, `qwen-plus`, `qwen-turbo`, `qwq-32b` | `DASHSCOPE_API_KEY` |
205
+ | **Kimi** | `moonshot-v1-8k/32k/128k`, `kimi-k2.5` | `MOONSHOT_API_KEY` |
206
+ | **Zhipu** | `glm-4-plus`, `glm-4`, `glm-4-flash` | `ZHIPU_API_KEY` |
207
+ | **MiniMax** | `MiniMax-Text-01`, `MiniMax-VL-01`, `abab6.5s-chat` | `MINIMAX_API_KEY` |
208
+
209
+ ### Local
210
+
211
+ ```bash
212
+ # Ollama (recommended: qwen2.5-coder, llama3.3, mistral, phi4)
213
+ dulus --model ollama/qwen2.5-coder
214
+
215
+ # LM Studio
216
+ dulus --model lmstudio/<model>
217
+
218
+ # Any OpenAI-compat server
219
+ export CUSTOM_BASE_URL=http://localhost:8000/v1
220
+ dulus --model custom/<model>
221
+ ```
222
+
223
+ ### Switching models mid-flight
224
+
225
+ ```
226
+ /model # show current
227
+ /model gpt-4o # switch
228
+ /model kimi:moonshot-v1-32k # colon syntax works too
229
+ ```
230
+
231
+ ---
232
+
233
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/sec-freetier.svg" alt="Free Tier Providers" width="100%"></p>
234
+
235
+ ## Free Tier Providers
236
+
237
+ No credit card. No waiting list. No "contact sales". Just frontier models, on tap.
238
+
239
+ Dulus ships a **`nvidia-web`** provider that talks to [NVIDIA NIM](https://build.nvidia.com) — NVIDIA's hosted inference API. Sign up, grab a key, and you've got **14 top-tier models** running at **40 requests per minute each**, for free. When one model hits its ceiling, Dulus auto-falls to the next one in the chain. Zero downtime. Zero config.
240
+
241
+ ```bash
242
+ export NVIDIA_API_KEY=nvapi-...
243
+ dulus --model nvidia-web/deepseek-r1
244
+ ```
245
+
246
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/nvidia-models.svg" alt="NVIDIA NIM free-tier models" width="100%"></p>
247
+
248
+ | Model | Type | ID |
249
+ |---|---|---|
250
+ | **DeepSeek R1** | Reasoning | `nvidia-web/deepseek-r1` |
251
+ | **DeepSeek V3** | Instruct | `nvidia-web/deepseek-v3` |
252
+ | **Kimi K2.5** | Long context | `nvidia-web/kimi-k2.5` |
253
+ | **GLM-4** | Zhipu AI | `nvidia-web/glm-4` |
254
+ | **MiniMax Text-01** | Text + Vision | `nvidia-web/minimax-text-01` |
255
+ | **Mistral Nemotron** | NVIDIA-tuned | `nvidia-web/mistral-nemotron` |
256
+ | **Mistral Large** | Instruct | `nvidia-web/mistral-large` |
257
+ | **Llama 3.3 70B** | Meta | `nvidia-web/llama-3.3-70b` |
258
+ | **Llama 3.1 405B** | Meta · flagship | `nvidia-web/llama-3.1-405b` |
259
+ | **Llama Nemotron** | NVIDIA reasoning | `nvidia-web/llama-nemotron` |
260
+ | **Qwen2.5 Coder** | Alibaba | `nvidia-web/qwen2.5-coder` |
261
+ | **Qwen3 235B A22B** | MoE · Alibaba | `nvidia-web/qwen3-235b-a22b` |
262
+ | **Phi-4** | Microsoft | `nvidia-web/phi-4` |
263
+ | **Gemma 3 27B** | Google | `nvidia-web/gemma-3-27b` |
264
+
265
+ **Automatic fallback.** Configure the chain in `~/.dulus/config.json`:
266
+
267
+ ```json
268
+ {
269
+ "nvidia_fallback_chain": [
270
+ "deepseek-r1",
271
+ "kimi-k2.5",
272
+ "llama-3.3-70b",
273
+ "mistral-nemotron",
274
+ "phi-4"
275
+ ]
276
+ }
277
+ ```
278
+
279
+ Dulus cycles through the chain automatically when rate limits hit. The flock keeps flying.
280
+
281
+ > **Get your key:** [build.nvidia.com](https://build.nvidia.com) → sign up → 1000 free credits. Takes 90 seconds.
282
+
283
+ ---
284
+
285
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/sec-plugins.svg" alt="Plugins & MCP" width="100%"></p>
286
+
287
+ ## Plugins
288
+
289
+ Dulus's **Auto-Adapter** reads a random Python repo and figures out its tools on its own — no `plugin.yaml` required.
290
+
291
+ ```bash
292
+ /plugin install my-plugin@https://github.com/user/my-plugin
293
+ /plugin install art@gh # shorthand for github
294
+ /plugin # list
295
+ /plugin enable / disable / update / uninstall
296
+ /plugin recommend # auto-detect useful plugins
297
+ ```
298
+
299
+ Adapt-and-install runs in under a second. New tools register **live**, no restart.
300
+
301
+ ## MCP
302
+
303
+ Drop a `.mcp.json` in your project root (or `~/.dulus/mcp.json` for user-wide):
304
+
305
+ ```json
306
+ {
307
+ "mcpServers": {
308
+ "git": { "type": "stdio", "command": "uvx", "args": ["mcp-server-git"] },
309
+ "playwright": { "type": "stdio", "command": "npx", "args": ["-y","@playwright/mcp"] }
310
+ }
311
+ }
312
+ ```
313
+
314
+ Manage in the REPL: `/mcp`, `/mcp reload`, `/mcp add <name> <cmd> [args]`, `/mcp remove <name>`.
315
+
316
+ ---
317
+
318
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/sec-agents.svg" alt="Sub-agents" width="100%"></p>
319
+
320
+ ## Sub-agents — the flock
321
+
322
+ Dulus can spawn typed agents that work in **isolated git worktrees** so they don't trip over each other. Ship a feature while a reviewer nitpicks the previous one. Tester runs in parallel.
323
+
324
+ ```
325
+ /agents # show active flock
326
+ Agent(type="coder", task="refactor auth")
327
+ Agent(type="reviewer", task="review #042")
328
+ Agent(type="tester", task="run e2e on auth")
329
+ ```
330
+
331
+ Agents talk to each other via `SendMessage` and `CheckAgentResult`.
332
+
333
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/split-pane.svg" alt="Split-pane brainstorm" width="100%"></p>
334
+
335
+ <p align="center"><sub>↑ coder and reviewer working the same branch. The reviewer sent a list of nits. The coder is already fixing them.</sub></p>
336
+
337
+ ---
338
+
339
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/sec-perms.svg" alt="Permissions" width="100%"></p>
340
+
341
+ ## Permissions
342
+
343
+ Pick your leash length:
344
+
345
+ | Mode | Behavior |
346
+ |---|---|
347
+ | `auto` *(default)* | Reads always allowed. Prompt before writes / shell. |
348
+ | `accept-all` | No prompts. Everything auto-approved. **YOLO.** |
349
+ | `manual` | Prompt for every operation. Paranoid setting. |
350
+ | `plan` | Read-only. Only the plan file is writable. |
351
+
352
+ Switch anytime: `/permissions auto` / `/permissions plan`.
353
+
354
+ ---
355
+
356
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/sec-bridges.svg" alt="Voice & Telegram" width="100%"></p>
357
+
358
+ ## Voice
359
+
360
+ ```bash
361
+ pip install sounddevice faster-whisper numpy
362
+ ```
363
+
364
+ Then `/voice` in the REPL. Offline. Supports `/voice lang zh` and `/voice device` for mic selection.
365
+
366
+ ## Telegram bridge
367
+
368
+ ```
369
+ /telegram <bot_token> <chat_id>
370
+ ```
371
+
372
+ Auto-starts next launch. Supports slash commands, vision, and voice from your phone. Useful when you want to poke a long-running agent from the bus.
373
+
374
+ ---
375
+
376
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/sec-memory.svg" alt="Memory & Checkpoints" width="100%"></p>
377
+
378
+ ## Memory
379
+
380
+ Persistent memories stored as markdown in two scopes:
381
+
382
+ | Scope | Path |
383
+ |---|---|
384
+ | User | `~/.dulus/memory/` |
385
+ | Project | `.dulus/memory/` |
386
+
387
+ Types: `user` · `feedback` · `project` · `reference`. Search is ranked by **confidence × recency**. Mark a memory gold to pin it.
388
+
389
+ ```
390
+ /memory search jwt # fuzzy ranked
391
+ /memory load 1,2,3 # inject multiple into context
392
+ /memory consolidate # distill the session into long-term insights
393
+ /memory purge # nuclear (keeps Soul)
394
+ ```
395
+
396
+ ## Checkpoints
397
+
398
+ Every agent turn can snapshot **conversation + files** into a checkpoint. Break something? `/checkpoint` and rewind.
399
+
400
+ ```
401
+ /checkpoint # list
402
+ /checkpoint 042 # rewind to #042 (files + context restored)
403
+ /checkpoint clear # reclaim disk
404
+ ```
405
+
406
+ ---
407
+
408
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/sec-brainstorm.svg" alt="Brainstorm" width="100%"></p>
409
+
410
+ ## Brainstorm
411
+
412
+ Spin up a **council of ghosts**. Dulus fabricates expert personas, has them argue, and hands you the distilled take.
413
+
414
+ ```
415
+ /brainstorm "should we rewrite in rust"
416
+ > persona: Skeptical PM
417
+ > persona: Principal Engineer (2037 timeline)
418
+ > persona: Grumpy DBA
419
+ > persona: Hot-take Intern
420
+ ```
421
+
422
+ Round 3 usually produces consensus. Round 5 produces a joint venture.
423
+
424
+ ---
425
+
426
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/sec-ssj.svg" alt="SSJ Mode" width="100%"></p>
427
+
428
+ ## SSJ Developer Mode
429
+
430
+ Ten workflow shortcuts behind one keystroke. Refactor → review → test → commit → ship, chained and unattended.
431
+
432
+ ```
433
+ /ssj
434
+ ╭─ SSJ ───────────────â•Ū
435
+ │ 1 /plan │
436
+ │ 2 /worker │
437
+ │ 3 /review │
438
+ │ 4 /commit │
439
+ │ 5 /ship │
440
+ ╰─────────────────────â•Ŋ
441
+ ```
442
+
443
+ ---
444
+
445
+ ## Spinners
446
+
447
+ Because waiting should be fun.
448
+
449
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/spinners.svg" alt="Spinner messages" width="100%"></p>
450
+
451
+ <details>
452
+ <summary><b>all 24 spinners</b></summary>
453
+
454
+ ```
455
+ ⚡ Rewriting light speed...
456
+ 🏁 Winning a race against light...
457
+ ðŸĪ” Who is Barry Allen?...
458
+ ðŸĪ” Who is KevRojo?...
459
+ ðŸĶ… Dropping from the stratosphere...
460
+ ðŸ’Ļ Leaving electrons behind...
461
+ 🌍 Orbiting the codebase...
462
+ ⏱ïļ Breaking the sound barrier...
463
+ ðŸ”Ĩ Faster than a hot reload...
464
+ 🚀 Terminal velocity reached...
465
+ ðŸĶ… Sharpening talons on the AST...
466
+ 🏎ïļ Shifting to 6th gear...
467
+ ⚡ Speed force activated...
468
+ 🌊ïļ Blitzing through the bytecode...
469
+ ðŸ’Ŧ Bending spacetime...
470
+ ðŸĶ… Preying on bugs from above...
471
+ 👁ïļ Dulus vision engaged...
472
+ 🍗 Hunting for memory leaks...
473
+ ðŸŠķ Shedding legacy code...
474
+ ðŸ•đïļ Try-catching mid-flight...
475
+ ðŸĨš Hatching a master plan...
476
+ ⚡ I-I-I'm... I-I'm... I'm fast...
477
+ ðŸ”Ū Looking at your code from the future...
478
+ ☕ If I'm taking so long, don't worry, I'm just talking to your mom...
479
+ ```
480
+
481
+ Drop your own in `dulus/spinners.py` and PR them. Bonus points for a reference we'll understand in 2046.
482
+ </details>
483
+
484
+ ---
485
+
486
+ ## Slash commands
487
+
488
+ `/` + Tab in the REPL shows everything. The highlights:
489
+
490
+ | | |
491
+ |---|---|
492
+ | `/model [name]` | show or switch model |
493
+ | `/config [k=v]` | read / write config |
494
+ | `/save` `/load` `/resume` | session management |
495
+ | `/memory [query]` | persistent memory |
496
+ | `/skills` `/agents` | list skills / active flock |
497
+ | `/voice` | voice input (offline Whisper) |
498
+ | `/image` `/img` | clipboard image → vision model |
499
+ | `/brainstorm [topic]` | council of ghosts |
500
+ | `/ssj` | power menu |
501
+ | `/worker [tasks]` | auto-implement a TODO list |
502
+ | `/telegram [token] [id]` | Telegram bridge |
503
+ | `/checkpoint [id]` | list / rewind checkpoints |
504
+ | `/plan [desc]` | enter / exit plan mode |
505
+ | `/compact [focus]` | manual context compression |
506
+ | `/mcp` `/plugin` | server + extension management |
507
+ | `/cost` | tokens and USD burned |
508
+ | `/cloudsave` | cloud sync via GitHub Gist |
509
+ | `/status` `/doctor` | version + install health |
510
+ | `/init` | drop a CLAUDE.md template |
511
+ | `/export` `/copy` | transcript tools |
512
+ | `/news` | what's new |
513
+ | `/help` | all of the above, nicely printed |
514
+
515
+ ---
516
+
517
+ ## Built-in tools
518
+
519
+ **Core** · Read · Write · Edit · Bash · Glob · Grep · WebFetch · WebSearch
520
+ **Notebook / diagnostics** · NotebookEdit · GetDiagnostics
521
+ **Memory** · MemorySave · MemoryDelete · MemorySearch · MemoryList
522
+ **Agents** · Agent · SendMessage · CheckAgentResult · ListAgentTasks · ListAgentTypes
523
+ **Tasks** · TaskCreate · TaskUpdate · TaskGet · TaskList
524
+ **Skills** · Skill · SkillList
525
+ **Other** · AskUserQuestion · SleepTimer · EnterPlanMode · ExitPlanMode
526
+
527
+ MCP tools auto-registered as `mcp__<server>__<tool>`.
528
+
529
+ ---
530
+
531
+ ## CLAUDE.md
532
+
533
+ Drop a `CLAUDE.md` at your project root. It gets auto-injected into the system prompt so Dulus remembers your stack, your conventions, and that one thing you hate.
534
+
535
+ ---
536
+
537
+ ## Project structure
538
+
539
+ ```
540
+ dulus/
541
+ ├── dulus.py # entry · REPL · slash commands · SSJ · Telegram
542
+ ├── agent.py # agent loop · streaming · tool dispatch · compaction
543
+ ├── providers.py # multi-provider streaming
544
+ ├── tools.py # core tools + registry wiring
545
+ ├── tool_registry.py # tool plugin registry
546
+ ├── compaction.py # context compression
547
+ ├── context.py # system prompt builder
548
+ ├── config.py # config management
549
+ ├── cloudsave.py # GitHub Gist sync
550
+ ├── multi_agent/ # sub-agent system
551
+ ├── memory/ # persistent memory
552
+ ├── skill/ # skill system
553
+ ├── mcp/ # MCP client
554
+ ├── voice/ # voice input
555
+ ├── checkpoint/ # checkpoint / rewind
556
+ ├── plugin/ # plugin system
557
+ ├── task/ # task management
558
+ └── tests/ # 263+ unit tests
559
+ ```
560
+
561
+ ---
562
+
563
+ ## FAQ
564
+
565
+ **Tool calls fail on my local model.**
566
+ Use one that supports function calling: `qwen2.5-coder`, `llama3.3`, `mistral`, `phi4`. Avoid base models without tool-use training.
567
+
568
+ **How do I connect to a remote GPU box?**
569
+ ```
570
+ /config custom_base_url=http://your-server:8000/v1
571
+ /model custom/your-model-name
572
+ ```
573
+
574
+ **How do I check API cost?** `/cost`.
575
+
576
+ **Voice transcribes "kubectl" as "cubicle".**
577
+ Add domain terms to `.dulus/voice_keyterms.txt`, one per line. Whisper respects the hint.
578
+
579
+ **Can I pipe input?**
580
+ ```bash
581
+ echo "explain this" | dulus -p --accept-all
582
+ git diff | dulus -p "write a commit message"
583
+ ```
584
+
585
+ **Is this safe to point at prod?**
586
+ `--accept-all` isn't. `plan` mode is. Use your head.
587
+
588
+ ---
589
+
590
+ ## License
591
+
592
+ GPLv3. Fork it, modify it, redistribute it — but keep it open. Derivative works must stay under GPLv3. Just don't ship `--accept-all` as the default.
593
+
594
+ ---
595
+
596
+ <p align="center"><img src="https://raw.githubusercontent.com/KevRojo/Dulus/main/docs/divider.svg" alt="" width="100%"></p>
597
+
598
+ <p align="center">
599
+ <sub>â–ē Built by <a href="https://github.com/KevRojo">KevRojo</a> · Named after the bird, not the reusable rocket · 2026</sub>
600
+ </p>